ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MzdiOTgKLS0tIC9kZXYvbnVsbAorKysgYi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTAgQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gKioqIFRISVMgUEFDS0FHRSBIQVMgU1BFQ0lBTCBMSUNFTlNJTkcgQ09ORElUSU9OUy4gIFBMRUFTRQorLy8gICAgIENPTlNVTFQgVEhFIE9XTkVSUyBBTkQgb3BlbnNvdXJjZS1saWNlbnNpbmdAZ29vZ2xlLmNvbSBCRUZPUkUKKy8vICAgICBERVBFTkRJTkcgT04gSVQgSU4gWU9VUiBQUk9KRUNULiAqKioKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZSB0aGF0IHRvb2sgdGhlIGFwcHJvYWNoIG9mCisvLyAnYXBwbHkgZXZlcnkgbGljZW5zZSBmb3VuZCB0byBldmVyeSB0YXJnZXQnLiBXaGlsZSB0aGlzIG1ha2VzIHN1cmUgd2UgcmVzcGVjdAorLy8gZXZlcnkgbGljZW5zZSByZXN0cmljdGlvbiwgaXQgbWF5IG5vdCBiZSBlbnRpcmVseSBjb3JyZWN0LgorLy8KKy8vIGUuZy4gR1BMIGluIGFuIE1JVCBwcm9qZWN0IG1pZ2h0IG9ubHkgYXBwbHkgdG8gdGhlIGNvbnRyaWIvIGRpcmVjdG9yeS4KKy8vCisvLyBQbGVhc2UgY29uc2lkZXIgc3BsaXR0aW5nIHRoZSBzaW5nbGUgbGljZW5zZSBiZWxvdyBpbnRvIG11bHRpcGxlIGxpY2Vuc2VzLAorLy8gdGFraW5nIGNhcmUgbm90IHRvIGxvc2UgYW55IGxpY2Vuc2Vfa2luZCBpbmZvcm1hdGlvbiwgYW5kIG92ZXJyaWRpbmcgdGhlCisvLyBkZWZhdWx0IGxpY2Vuc2UgdXNpbmcgdGhlICdsaWNlbnNlczogWy4uLl0nIHByb3BlcnR5IG9uIHRhcmdldHMgYXMgbmVlZGVkLgorLy8KKy8vIEZvciB1bnVzZWQgZmlsZXMsIGNvbnNpZGVyIGNyZWF0aW5nIGEgJ2ZpbGVHcm91cCcgd2l0aCAiLy92aXNpYmlsaXR5OnByaXZhdGUiCisvLyB0byBhdHRhY2ggdGhlIGxpY2Vuc2UgdG8sIGFuZCBpbmNsdWRpbmcgYSBjb21tZW50IHdoZXRoZXIgdGhlIGZpbGVzIG1heSBiZQorLy8gdXNlZCBpbiB0aGUgY3VycmVudCBwcm9qZWN0LgorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1CU0QiLAorICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItTUlUIiwKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLVVuaWNvZGUtREZTIiwKKyAgICAgICAgImxlZ2FjeV9ieV9leGNlcHRpb25fb25seSIsIC8vIGJ5IGV4Y2VwdGlvbiBvbmx5CisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL01FVEFEQVRBIGIvTUVUQURBVEEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFiZGEzNgotLS0gL2Rldi9udWxsCisrKyBiL01FVEFEQVRBCkBAIC0wLDAgKzEsMjMgQEAKKyMgKioqIFRISVMgUEFDS0FHRSBIQVMgU1BFQ0lBTCBMSUNFTlNJTkcgQ09ORElUSU9OUy4gIFBMRUFTRQorIyAgICAgQ09OU1VMVCBUSEUgT1dORVJTIEFORCBvcGVuc291cmNlLWxpY2Vuc2luZ0Bnb29nbGUuY29tIEJFRk9SRQorIyAgICAgREVQRU5ESU5HIE9OIElUIElOIFlPVVIgUFJPSkVDVC4gKioqCit0aGlyZF9wYXJ0eSB7CisgICMgd291bGQgYmUgTk9USUNFIHNhdmUgZm9yIFdpZGV2aW5lIE1hc3RlciBMaWNlbnNlIEFncmVlbWVudCBpbjoKKyAgIyAgIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRGV2aWNlRmlsZXMuY3BwCisgICMgICBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwCisgICMgICBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRGV2aWNlRmlsZXMuaAorICAjICAgZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9wcm90b3MvRGV2aWNlRmlsZXMucHJvdG8KKyAgIyAgIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmgKKyAgIyBhbmQgcGF0ZW50IGRpc2NsYWltZXJzIGluOgorICAjICAgbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL3BhdGVudF9kaXNjbGFpbWVyLnR4dAorICAjICAgbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL3BhdGVudF9kaXNjbGFpbWVyLnR4dAorICAjICAgbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL3BhdGVudF9kaXNjbGFpbWVyLnR4dAorICAjICAgbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9wYXRlbnRfZGlzY2xhaW1lci50eHQKKyAgIyAgIG1lZGlhL2NvZGVjcy9hbXJuYi9wYXRlbnRfZGlzY2xhaW1lci50eHQKKyAgIyAgIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CisgICMgICBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3BhdGVudF9kaXNjbGFpbWVyLnR4dAorICAjICAgbWVkaWEvY29kZWNzL200dl9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dAorICAjICAgbWVkaWEvY29kZWNzL21wM2RlYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKKyAgIyAgIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CisgIGxpY2Vuc2VfdHlwZTogQllfRVhDRVBUSU9OX09OTFkKK30KZGlmZiAtLWdpdCBhL09XTkVSUyBiL09XTkVSUwppbmRleCA4ZjQwNWU5Li43ZjUyM2EyIDEwMDY0NAotLS0gYS9PV05FUlMKKysrIGIvT1dORVJTCkBAIC0xLDQgKzEsMTAgQEAKK2NoekBnb29nbGUuY29tCiBlbGF1cmVudEBnb29nbGUuY29tCiBldGFsdmFsYUBnb29nbGUuY29tCitoa3VhbmdAZ29vZ2xlLmNvbQogbGFqb3NAZ29vZ2xlLmNvbQogbWFyY29uZUBnb29nbGUuY29tCisKKyMgTE9OCitvbGx5QGdvb2dsZS5jb20KK2FuZHJld2xld2lzQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2FwZXgvQW5kcm9pZC5icCBiL2FwZXgvQW5kcm9pZC5icAppbmRleCBiZTYxODVlLi5kYWJmNGMyIDEwMDY0NAotLS0gYS9hcGV4L0FuZHJvaWQuYnAKKysrIGIvYXBleC9BbmRyb2lkLmJwCkBAIC0xMiw2ICsxMiwxNSBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogYXBleF9kZWZhdWx0cyB7CiAgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLWRlZmF1bHRzIiwKICAgICB1cGRhdGFibGU6IHRydWUsCkBAIC01NSwxMiArNjQsMjQgQEAKICAgICAvLyAtIGJ1aWxkIGFydGlmYWN0cyAobGliL2phdmFsaWIvYmluKSBhZ2FpbnN0IEFuZHJvaWQgMTAgU0RLCiAgICAgLy8gICBzbyB0aGF0IHRoZSBhcnRpZmFjdHMgY2FuIHJ1bi4KICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgLy8gSW5kaWNhdGVzIHRoYXQgcHJlLWluc3RhbGxlZCB2ZXJzaW9uIG9mIHRoaXMgYXBleCBjYW4gYmUgY29tcHJlc3NlZC4KKyAgICAvLyBXaGV0aGVyIGl0IGFjdHVhbGx5IHdpbGwgYmUgY29tcHJlc3NlZCBpcyBjb250cm9sbGVkIG9uIHBlci1kZXZpY2UgYmFzaXMuCisgICAgY29tcHJlc3NpYmxlOiB0cnVlLAogfQogCiBhcGV4IHsKICAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEiLAogICAgIG1hbmlmZXN0OiAibWFuaWZlc3QuanNvbiIsCiAgICAgZGVmYXVsdHM6IFsiY29tLmFuZHJvaWQubWVkaWEtZGVmYXVsdHMiXSwKKyAgICBwcmVidWlsdHM6IFsKKyAgICAgICAgIm1lZGlhLWxpbmtlci1jb25maWciLAorICAgIF0sCit9CisKK2xpbmtlcl9jb25maWcgeworICAgIG5hbWU6ICJtZWRpYS1saW5rZXItY29uZmlnIiwKKyAgICBzcmM6ICJsaW5rZXIuY29uZmlnLmpzb24iLAorICAgIGluc3RhbGxhYmxlOiBmYWxzZSwKIH0KIAogZmlsZWdyb3VwIHsKQEAgLTEwMiw2ICsxMjMsOSBAQAogICAgIC8vIC0gYnVpbGQgYXJ0aWZhY3RzIChsaWIvamF2YWxpYi9iaW4pIGFnYWluc3QgQW5kcm9pZCAxMCBTREsKICAgICAvLyAgIHNvIHRoYXQgdGhlIGFydGlmYWN0cyBjYW4gcnVuLgogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICAvLyBJbmRpY2F0ZXMgdGhhdCBwcmUtaW5zdGFsbGVkIHZlcnNpb24gb2YgdGhpcyBhcGV4IGNhbiBiZSBjb21wcmVzc2VkLgorICAgIC8vIFdoZXRoZXIgaXQgYWN0dWFsbHkgd2lsbCBiZSBjb21wcmVzc2VkIGlzIGNvbnRyb2xsZWQgb24gcGVyLWRldmljZSBiYXNpcy4KKyAgICBjb21wcmVzc2libGU6IHRydWUsCiB9CiAKIHByZWJ1aWx0X2V0YyB7CmRpZmYgLS1naXQgYS9hcGV4L2xpbmtlci5jb25maWcuanNvbiBiL2FwZXgvbGlua2VyLmNvbmZpZy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YzA3NmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L2xpbmtlci5jb25maWcuanNvbgpAQCAtMCwwICsxLDMgQEAKK3sKKyAgICAidmlzaWJsZSI6IHRydWUKK30KZGlmZiAtLWdpdCBhL2FwZXgvbWFuaWZlc3RfY29kZWMuanNvbiBiL2FwZXgvbWFuaWZlc3RfY29kZWMuanNvbgppbmRleCAyMzIwZmQ3Li4xZjA1ZDJlIDEwMDY0NAotLS0gYS9hcGV4L21hbmlmZXN0X2NvZGVjLmpzb24KKysrIGIvYXBleC9tYW5pZmVzdF9jb2RlYy5qc29uCkBAIC0xLDQgKzEsNyBAQAogewogICAibmFtZSI6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKLSAgInZlcnNpb24iOiAzMDAwMDAwMDAKKyAgInZlcnNpb24iOiAzMDAwMDAwMDAsCisgICJyZXF1aXJlTmF0aXZlTGlicyI6IFsKKyAgICAiOnNwaGFsIgorICBdCiB9CmRpZmYgLS1naXQgYS9hcGV4L3Rlc3RpbmcvQW5kcm9pZC5icCBiL2FwZXgvdGVzdGluZy9BbmRyb2lkLmJwCmluZGV4IGEwNGFiM2YuLjRmZjRkMDYgMTAwNjQ0Ci0tLSBhL2FwZXgvdGVzdGluZy9BbmRyb2lkLmJwCisrKyBiL2FwZXgvdGVzdGluZy9BbmRyb2lkLmJwCkBAIC0xMiwxMiArMTIsMjYgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLU1JVAorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItVW5pY29kZS1ERlMKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGFwZXhfdGVzdCB7CiAgICAgbmFtZTogInRlc3RfY29tLmFuZHJvaWQubWVkaWEiLAogICAgIG1hbmlmZXN0OiAidGVzdF9tYW5pZmVzdC5qc29uIiwKICAgICBmaWxlX2NvbnRleHRzOiAiOmNvbS5hbmRyb2lkLm1lZGlhLWZpbGVfY29udGV4dHMiLAogICAgIGRlZmF1bHRzOiBbImNvbS5hbmRyb2lkLm1lZGlhLWRlZmF1bHRzIl0sCi0gICAgcHJlYnVpbHRzOiBbInNka2luZm9fNDUiXSwKKyAgICBwcmVidWlsdHM6IFsKKyAgICAgICAgInNka2luZm9fNDUiLAorICAgICAgICAibWVkaWEtbGlua2VyLWNvbmZpZyIsCisgICAgXSwKICAgICBpbnN0YWxsYWJsZTogZmFsc2UsCiB9CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9BbmRyb2lkLmJwIGIvY2FtZXJhL0FuZHJvaWQuYnAKaW5kZXggZmEzNmJiMy4uOTNiYzY4ZCAxMDA2NDQKLS0tIGEvY2FtZXJhL0FuZHJvaWQuYnAKKysrIGIvY2FtZXJhL0FuZHJvaWQuYnAKQEAgLTEyLDYgKzEyLDM3IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfY2FtZXJhX2xpY2Vuc2UiXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZSB0aGF0IHRvb2sgdGhlIGFwcHJvYWNoIG9mCisvLyAnYXBwbHkgZXZlcnkgbGljZW5zZSBmb3VuZCB0byBldmVyeSB0YXJnZXQnLiBXaGlsZSB0aGlzIG1ha2VzIHN1cmUgd2UgcmVzcGVjdAorLy8gZXZlcnkgbGljZW5zZSByZXN0cmljdGlvbiwgaXQgbWF5IG5vdCBiZSBlbnRpcmVseSBjb3JyZWN0LgorLy8KKy8vIGUuZy4gR1BMIGluIGFuIE1JVCBwcm9qZWN0IG1pZ2h0IG9ubHkgYXBwbHkgdG8gdGhlIGNvbnRyaWIvIGRpcmVjdG9yeS4KKy8vCisvLyBQbGVhc2UgY29uc2lkZXIgc3BsaXR0aW5nIHRoZSBzaW5nbGUgbGljZW5zZSBiZWxvdyBpbnRvIG11bHRpcGxlIGxpY2Vuc2VzLAorLy8gdGFraW5nIGNhcmUgbm90IHRvIGxvc2UgYW55IGxpY2Vuc2Vfa2luZCBpbmZvcm1hdGlvbiwgYW5kIG92ZXJyaWRpbmcgdGhlCisvLyBkZWZhdWx0IGxpY2Vuc2UgdXNpbmcgdGhlICdsaWNlbnNlczogWy4uLl0nIHByb3BlcnR5IG9uIHRhcmdldHMgYXMgbmVlZGVkLgorLy8KKy8vIEZvciB1bnVzZWQgZmlsZXMsIGNvbnNpZGVyIGNyZWF0aW5nIGEgJ2ZpbGVHcm91cCcgd2l0aCAiLy92aXNpYmlsaXR5OnByaXZhdGUiCisvLyB0byBhdHRhY2ggdGhlIGxpY2Vuc2UgdG8sIGFuZCBpbmNsdWRpbmcgYSBjb21tZW50IHdoZXRoZXIgdGhlIGZpbGVzIG1heSBiZQorLy8gdXNlZCBpbiB0aGUgY3VycmVudCBwcm9qZWN0LgorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfY2FtZXJhX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItTUlUIiwKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLVVuaWNvZGUtREZTIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmNhbWVyYV9jbGllbnQiLAogCkBAIC01MCw2ICs4MSw3IEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLApkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCmluZGV4IDY4OTY5Y2YuLmU5NWM5MWMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcAorKysgYi9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzMi5jcHAgYi9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVyczIuY3BwCmluZGV4IGMyOTIzM2MuLmExY2YzNTUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzMi5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmNwcApAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFVdGlscy5jcHAgYi9jYW1lcmEvQ2FtZXJhVXRpbHMuY3BwCmluZGV4IGY5YjFiMzcuLmFmM2M0OTIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFVdGlscy5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYVV0aWxzLmNwcApAQCAtMjAsMTQgKzIwLDE2IEBACiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgogI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgogCi0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjb25zdCBjaGFyICprQ2FtZXJhU2VydmljZURpc2FibGVkUHJvcGVydHkgPSAiY29uZmlnLmRpc2FibGVfY2FtZXJhc2VydmljZSI7CisKIHN0YXR1c190IENhbWVyYVV0aWxzOjpnZXRSb3RhdGlvblRyYW5zZm9ybShjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbywKICAgICAgICAgICAgICAgICAvKm91dCovaW50MzJfdCogdHJhbnNmb3JtKSB7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKQEAgLTEyNCw5ICsxMjYsNyBAQAogfQogCiBib29sIENhbWVyYVV0aWxzOjppc0NhbWVyYVNlcnZpY2VEaXNhYmxlZCgpIHsKLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgcHJvcGVydHlfZ2V0KCJjb25maWcuZGlzYWJsZV9jYW1lcmFzZXJ2aWNlIiwgdmFsdWUsICIwIik7Ci0gICAgcmV0dXJuIChzdHJuY21wKHZhbHVlLCAiMCIsIDIpICE9IDAgJiYgc3RybmNhc2VjbXAodmFsdWUsICJmYWxzZSIsIDYpICE9IDApOworICAgIHJldHVybiBiYXNlOjpHZXRCb29sUHJvcGVydHkoa0NhbWVyYVNlcnZpY2VEaXNhYmxlZFByb3BlcnR5LCBmYWxzZSk7CiB9CiAKIH0gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcCBiL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcAppbmRleCAxODQzZWM0Li5lYmMwOWQ3IDEwMDY0NAotLS0gYS9jYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuY3BwCkBAIC05NCwxMiArOTQsMTIgQEAKICAgICAvLyBEbyBub3QgZGlzdGluZ3Vpc2ggbnVsbCBhcnJheXMgZnJvbSAwLXNpemVkIGFycmF5cy4KICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKICAgICAgICAgLy8gUGFyY2VsLndyaXRlUGFyY2VsYWJsZUFycmF5Ci0gICAgICAgIHNpemVfdCBsZW47Ci0gICAgICAgIGNvbnN0IGNoYXIxNl90KiBjbGFzc05hbWUgPSBwYXJjZWwtPnJlYWRTdHJpbmcxNklucGxhY2UoJmxlbik7CisgICAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IGNsYXNzTmFtZTsKKyAgICAgICAgcGFyY2VsLT5yZWFkVXRmOEZyb21VdGYxNigmY2xhc3NOYW1lKTsKICAgICAgICAgQUxPR1YoIiVzOiBSZWFkIHN1cmZhY2UgY2xhc3MgPSAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgY2xhc3NOYW1lICE9IE5VTEwgPyBTdHJpbmc4KGNsYXNzTmFtZSkuc3RyaW5nKCkgOiAiPG51bGw+Iik7CisgICAgICAgICAgICAgIGNsYXNzTmFtZS52YWx1ZV9vcigiPG51bGw+IikuY19zdHIoKSk7CiAKLSAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChjbGFzc05hbWUgPT0gc3RkOjpudWxsb3B0KSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAgYi9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAKaW5kZXggZGM3Zjg4YS4uZjU4ZjIwYyAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwCisrKyBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5icApAQCAtMTIsNiArMTIsMTUgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9jYW1lcmFfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfY2FtZXJhX2xpY2Vuc2UiXSwKK30KKwogY2NfYmluYXJ5IHsKICAgICBuYW1lOiAiY2FtZXJhc2VydmVyIiwKIApAQCAtMzcsNyArNDYsNyBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40IiwKICAgICBdLAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCisgICAgY29tcGlsZV9tdWx0aWxpYjogInByZWZlcjMyIiwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXh0cmEiLApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9BbmRyb2lkLmJwIGIvY2FtZXJhL25kay9BbmRyb2lkLmJwCmluZGV4IDdiYTgyYzEuLjI0ZWFiYTYgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvQW5kcm9pZC5icAorKysgYi9jYW1lcmEvbmRrL0FuZHJvaWQuYnAKQEAgLTE2LDYgKzE2LDM3IEBACiAvLyB0byByZWZlciB0byBoZWFkZXJzIGluIHBhcmVudCBkaXJlY3RvcmllcyBhbmQgdGhlIGhlYWRlcnMgbGl2ZSBpbgogLy8gZnJhbWV3b3Jrcy9hdi9pbmNsdWRlLgogCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9jYW1lcmFfbmRrX2xpY2Vuc2UiXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZSB0aGF0IHRvb2sgdGhlIGFwcHJvYWNoIG9mCisvLyAnYXBwbHkgZXZlcnkgbGljZW5zZSBmb3VuZCB0byBldmVyeSB0YXJnZXQnLiBXaGlsZSB0aGlzIG1ha2VzIHN1cmUgd2UgcmVzcGVjdAorLy8gZXZlcnkgbGljZW5zZSByZXN0cmljdGlvbiwgaXQgbWF5IG5vdCBiZSBlbnRpcmVseSBjb3JyZWN0LgorLy8KKy8vIGUuZy4gR1BMIGluIGFuIE1JVCBwcm9qZWN0IG1pZ2h0IG9ubHkgYXBwbHkgdG8gdGhlIGNvbnRyaWIvIGRpcmVjdG9yeS4KKy8vCisvLyBQbGVhc2UgY29uc2lkZXIgc3BsaXR0aW5nIHRoZSBzaW5nbGUgbGljZW5zZSBiZWxvdyBpbnRvIG11bHRpcGxlIGxpY2Vuc2VzLAorLy8gdGFraW5nIGNhcmUgbm90IHRvIGxvc2UgYW55IGxpY2Vuc2Vfa2luZCBpbmZvcm1hdGlvbiwgYW5kIG92ZXJyaWRpbmcgdGhlCisvLyBkZWZhdWx0IGxpY2Vuc2UgdXNpbmcgdGhlICdsaWNlbnNlczogWy4uLl0nIHByb3BlcnR5IG9uIHRhcmdldHMgYXMgbmVlZGVkLgorLy8KKy8vIEZvciB1bnVzZWQgZmlsZXMsIGNvbnNpZGVyIGNyZWF0aW5nIGEgJ2ZpbGVHcm91cCcgd2l0aCAiLy92aXNpYmlsaXR5OnByaXZhdGUiCisvLyB0byBhdHRhY2ggdGhlIGxpY2Vuc2UgdG8sIGFuZCBpbmNsdWRpbmcgYSBjb21tZW50IHdoZXRoZXIgdGhlIGZpbGVzIG1heSBiZQorLy8gdXNlZCBpbiB0aGUgY3VycmVudCBwcm9qZWN0LgorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfY2FtZXJhX25ka19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLU1JVCIsCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1Vbmljb2RlLURGUyIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogbmRrX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjYW1lcmEybmRrIiwKICAgICBzeW1ib2xfZmlsZTogImxpYmNhbWVyYTJuZGsubWFwLnR4dCIsCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcAppbmRleCAyY2JhNjY1Li43M2NhYmJmIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKQEAgLTczOCw3ICs3MzgsNyBAQAogICAgIC8vIE5vIHdheSB0byBnZXQgcGFja2FnZSBuYW1lIGZyb20gbmF0aXZlLgogICAgIC8vIFNlbmQgYSB6ZXJvIGxlbmd0aCBwYWNrYWdlIG5hbWUgYW5kIGxldCBjYW1lcmEgc2VydmljZSBmaWd1cmUgaXQgb3V0IGZyb20gVUlECiAgICAgYmluZGVyOjpTdGF0dXMgc2VydmljZVJldCA9IGNzLT5jb25uZWN0RGV2aWNlKAotICAgICAgICAgICAgY2FsbGJhY2tzLCBTdHJpbmcxNihjYW1lcmFJZCksIFN0cmluZzE2KCIiKSwgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PigpLAorICAgICAgICAgICAgY2FsbGJhY2tzLCBTdHJpbmcxNihjYW1lcmFJZCksIFN0cmluZzE2KCIiKSwge30sCiAgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCwgLypvdXQqLyZkZXZpY2VSZW1vdGUpOwogCiAgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSkgewpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCmluZGV4IDA3MTc2Y2YuLjZjMWNmMzMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmgKQEAgLTQ1LDggKzQ1LDYgQEAKIAogX19CRUdJTl9ERUNMUwogCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI0Ci0KIC8qKgogICogQUNhbWVyYUNhcHR1cmVTZXNzaW9uIGlzIGFuIG9wYXF1ZSB0eXBlIHRoYXQgbWFuYWdlcyBmcmFtZSBjYXB0dXJlcyBvZiBhIGNhbWVyYSBkZXZpY2UuCiAgKgpAQCAtNTkzLDEwICs1OTEsNiBAQAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9hYm9ydENhcHR1cmVzKEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbikKICAgICAgICAgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwotCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI4Ci0KIHR5cGVkZWYgc3RydWN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQ7CiAKIC8qKgpAQCAtNjQxLDkgKzYzNSw3IEBACiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fdXBkYXRlU2hhcmVkT3V0cHV0KEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyOCk7Ci0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCiAKLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKIC8qKgogICogVGhlIGRlZmluaXRpb24gb2YgZmluYWwgY2FwdHVyZSByZXN1bHQgY2FsbGJhY2sgd2l0aCBsb2dpY2FsIG11bHRpLWNhbWVyYSBzdXBwb3J0LgogICoKQEAgLTc4OCw4ICs3ODAsNiBAQAogICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAogICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSBfX0lOVFJPRFVDRURfSU4oMjkpOwogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI5ICovCi0KIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvKiBfTkRLX0NBTUVSQV9DQVBUVVJFX1NFU1NJT05fSCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmgKaW5kZXggMTUzN2JkZS4uZjcyZmU4ZCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYURldmljZS5oCkBAIC00NCw4ICs0NCw2IEBACiAKIF9fQkVHSU5fREVDTFMKIAotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyNAotCiAvKioKICAqIEFDYW1lcmFEZXZpY2UgaXMgb3BhcXVlIHR5cGUgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gYSBjYW1lcmEgZGV2aWNlLgogICoKQEAgLTY4NywxMCArNjg1LDYgQEAKICAgICAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFja3MsCiAgICAgICAgIC8qb3V0Ki9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKiBzZXNzaW9uKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI0ICovCi0KLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjgKLQogLyoqCiAgKiBDcmVhdGUgYSBzaGFyZWQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IG9iamVjdC4KICAqCkBAIC03ODIsMTAgKzc3Niw2IEBACiAgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAogICAgICAgICAvKm91dCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiogc2Vzc2lvbikgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwotCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI5Ci0KIC8qKgogICogQ3JlYXRlIGEgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IG9iamVjdCB1c2VkIGZvciBzdHJlYW1pbmcgZnJvbSBhIHBoeXNpY2FsCiAgKiBjYW1lcmEgYXMgcGFydCBvZiBhIGxvZ2ljYWwgY2FtZXJhIGRldmljZS4KQEAgLTg5MCw4ICs4ODAsNiBAQAogICAgICAgICBjb25zdCBBQ2FtZXJhRGV2aWNlKiBkZXZpY2UsCiAgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogc2Vzc2lvbk91dHB1dENvbnRhaW5lcikgX19JTlRST0RVQ0VEX0lOKDI5KTsKIAotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLwotCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLyogX05ES19DQU1FUkFfREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRXJyb3IuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRXJyb3IuaAppbmRleCBmYzYxOGVlLi45ZDc3ZWI0IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUVycm9yLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFFcnJvci5oCkBAIC00MCw4ICs0MCw2IEBACiAKIF9fQkVHSU5fREVDTFMKIAotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyNAotCiB0eXBlZGVmIGVudW0gewogICAgIEFDQU1FUkFfT0sgPSAwLAogCkBAIC0xMzgsOCArMTM2LDYgQEAKICAgICBBQ0FNRVJBX0VSUk9SX1VOU1VQUE9SVEVEX09QRVJBVElPTiA9IEFDQU1FUkFfRVJST1JfQkFTRSAtIDE0LAogfSBjYW1lcmFfc3RhdHVzX3Q7CiAKLSNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjQgKi8KLQogX19FTkRfREVDTFMKIAogI2VuZGlmIC8qIF9OREtfQ0FNRVJBX0VSUk9SX0ggKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmgKaW5kZXggMGEyZWU1Ny4uYmUzMmIxMSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmgKQEAgLTQ0LDggKzQ0LDYgQEAKIAogX19CRUdJTl9ERUNMUwogCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI0Ci0KIC8qKgogICogQUNhbWVyYU1hbmFnZXIgaXMgb3BhcXVlIHR5cGUgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gY2FtZXJhIHNlcnZpY2UuCiAgKgpAQCAtMjkzLDEwICsyOTEsNiBAQAogICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFjaywKICAgICAgICAgLypvdXQqL0FDYW1lcmFEZXZpY2UqKiBkZXZpY2UpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKLSNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjQgKi8KLQotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQotCiAvKioKICAqIERlZmluaXRpb24gb2YgY2FtZXJhIGFjY2VzcyBwZXJtaXNzaW9uIGNoYW5nZSBjYWxsYmFjay4KICAqCkBAIC00MTksOCArNDEzLDYgQEAKICAgICAgICAgX19JTlRST0RVQ0VEX0lOKDI5KTsKICNlbmRpZgogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI5ICovCi0KIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvKiBfTkRLX0NBTUVSQV9NQU5BR0VSX0ggKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGEuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGEuaAppbmRleCAwNzJiYjAyLi4wZDVlNmM0IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YS5oCkBAIC0zNiwxMyArMzYsMTIgQEAKICNpZm5kZWYgX05ES19DQU1FUkFfTUVUQURBVEFfSAogI2RlZmluZSBfTkRLX0NBTUVSQV9NRVRBREFUQV9ICiAKKyNpbmNsdWRlIDxzdGRib29sLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAKICNpZm5kZWYgX19BTkRST0lEX1ZOREtfXwotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAzMAogI2luY2x1ZGUgImpuaS5oIgotI2VuZGlmICAvKiBfX0FORFJPSURfQVBJX18gPj0gMzAgKi8KICNlbmRpZiAgLyogX19BTkRST0lEX1ZOREtfXyAqLwogCiAjaW5jbHVkZSAiTmRrQ2FtZXJhRXJyb3IuaCIKQEAgLTUwLDggKzQ5LDYgQEAKIAogX19CRUdJTl9ERUNMUwogCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI0Ci0KIC8qKgogICogQUNhbWVyYU1ldGFkYXRhIGlzIG9wYXF1ZSB0eXBlIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHJlYWQtb25seSBjYW1lcmEgbWV0YWRhdGEgbGlrZSBjYW1lcmEKICAqIGNoYXJhY3RlcmlzdGljcyAodmlhIHtAbGluayBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3N9KSBvciBjYXB0dXJlIHJlc3VsdHMgKHZpYQpAQCAtMjM3LDEwICsyMzQsNiBAQAogICovCiB2b2lkIEFDYW1lcmFNZXRhZGF0YV9mcmVlKEFDYW1lcmFNZXRhZGF0YSogbWV0YWRhdGEpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKLSNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjQgKi8KLQotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQotCiAvKioKICAqIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiBhIGNhbWVyYSBpcyBsb2dpY2FsIG11bHRpLWNhbWVyYS4KICAqCkBAIC0yNTksMTAgKzI1Miw3IEBACiAgICAgICAgIC8qb3V0Ki9zaXplX3QqIG51bVBoeXNpY2FsQ2FtZXJhcywgLypvdXQqL2NvbnN0IGNoYXIqIGNvbnN0KiogcGh5c2ljYWxDYW1lcmFJZHMpCiAgICAgICAgIF9fSU5UUk9EVUNFRF9JTigyOSk7CiAKLSNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KLQogI2lmbmRlZiBfX0FORFJPSURfVk5ES19fCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDMwCiAKIC8qKgogICogUmV0dXJuIGEge0BsaW5rIEFDYW1lcmFNZXRhZGF0YX0gdGhhdCByZWZlcmVuY2VzIHRoZSBzYW1lIGRhdGEgYXMKQEAgLTI4OSw3ICsyNzksNiBAQAogQUNhbWVyYU1ldGFkYXRhKiBBQ2FtZXJhTWV0YWRhdGFfZnJvbUNhbWVyYU1ldGFkYXRhKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbWVyYU1ldGFkYXRhKQogICAgICAgICBfX0lOVFJPRFVDRURfSU4oMzApOwogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDMwICovCiAjZW5kaWYgIC8qIF9fQU5EUk9JRF9WTkRLX18gKi8KIAogX19FTkRfREVDTFMKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oCmluZGV4IDU2MzQ5ODIuLmJjMzNkNmEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaApAQCAtNDAsOCArNDAsNiBAQAogCiBfX0JFR0lOX0RFQ0xTCiAKLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjQKLQogdHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfc2VjdGlvbiB7CiAgICAgQUNBTUVSQV9DT0xPUl9DT1JSRUNUSU9OLAogICAgIEFDQU1FUkFfQ09OVFJPTCwKQEAgLTg5OTgsOCArODk5Niw2IEBACiAKIAogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI0ICovCi0KIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvKiBfTkRLX0NBTUVSQV9NRVRBREFUQV9UQUdTX0ggKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FwdHVyZVJlcXVlc3QuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FwdHVyZVJlcXVlc3QuaAppbmRleCBkM2Y4ODI2Li5hNGRjMzc0IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhcHR1cmVSZXF1ZXN0LmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYXB0dXJlUmVxdWVzdC5oCkBAIC00NCw4ICs0NCw2IEBACiAKIF9fQkVHSU5fREVDTFMKIAotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyNAotCiAvLyBDb250YWluZXIgZm9yIG91dHB1dCB0YXJnZXRzCiB0eXBlZGVmIHN0cnVjdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0cyBBQ2FtZXJhT3V0cHV0VGFyZ2V0czsKIApAQCAtMzA0LDEwICszMDIsNiBAQAogICovCiB2b2lkIEFDYXB0dXJlUmVxdWVzdF9mcmVlKEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwotCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI4Ci0KIC8qKgogICogQXNzb2NpYXRlIGFuIGFyYml0cmFyeSB1c2VyIGNvbnRleHQgcG9pbnRlciB0byB0aGUge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0KICAqCkBAIC0zNTYsMTAgKzM1MCw2IEBACiAgKi8KIEFDYXB0dXJlUmVxdWVzdCogQUNhcHR1cmVSZXF1ZXN0X2NvcHkoY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzcmMpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKLSNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjggKi8KLQotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQotCiAvKioKICAqIEdldCBhIG1ldGFkYXRhIGVudHJ5IGZyb20gaW5wdXQge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0gZm9yCiAgKiBhIHBoeXNpY2FsIGNhbWVyYSBiYWNraW5nIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEgZGV2aWNlLgpAQCAtNTY5LDggKzU1OSw2IEBACiAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgY29uc3QgY2hhciogcGh5c2ljYWxJZCwgdWludDMyX3QgdGFnLAogICAgICAgICB1aW50MzJfdCBjb3VudCwgY29uc3QgQUNhbWVyYU1ldGFkYXRhX3JhdGlvbmFsKiBkYXRhKSBfX0lOVFJPRFVDRURfSU4oMjkpOwogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI5ICovCi0KIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvKiBfTkRLX0NBUFRVUkVfUkVRVUVTVF9IICovCmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvQW5kcm9pZC5tayBiL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IGU1YzE2MzEuLjdmODA3OGUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCkBAIC00Miw2ICs0Miw5IEBACiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yCiAKIExPQ0FMX01PRFVMRTo9IGNhbWVyYV9jbGllbnRfdGVzdAorTE9DQUxfTElDRU5TRV9LSU5EUzo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKK0xPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUzo9IG5vdGljZQorTE9DQUxfTk9USUNFX0ZJTEU6PSAkKExPQ0FMX1BBVEgpLy4uL05PVElDRQogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIAogaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcCBiL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKaW5kZXggOGNjZGVkMi4uZWVlMDVmZiAxMDA2NDQKLS0tIGEvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcAorKysgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCkBAIC0zNzgsNyArMzc4LDcgQEAKICAgICAgICAgc3A8VGVzdENhbWVyYURldmljZUNhbGxiYWNrcz4gY2FsbGJhY2tzKG5ldyBUZXN0Q2FtZXJhRGV2aWNlQ2FsbGJhY2tzKCkpOwogICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI+IGRldmljZTsKICAgICAgICAgcmVzID0gc2VydmljZS0+Y29ubmVjdERldmljZShjYWxsYmFja3MsIGNhbWVyYUlkLCBTdHJpbmcxNigibWVlZWVlZWVlZSEiKSwKLSAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+KCksIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6VVNFX0NBTExJTkdfVUlELAorICAgICAgICAgICAgICAgIHt9LCBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCwKICAgICAgICAgICAgICAgICAvKm91dCovJmRldmljZSk7CiAgICAgICAgIEVYUEVDVF9UUlVFKHJlcy5pc09rKCkpIDw8IHJlczsKICAgICAgICAgQVNTRVJUX05FKG51bGxwdHIsIGRldmljZS5nZXQoKSk7CkBAIC00MjEsNyArNDIxLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgU0NPUEVEX1RSQUNFKCJvcGVuTmV3RGV2aWNlIik7CiAgICAgICAgICAgICBiaW5kZXI6OlN0YXR1cyByZXMgPSBzZXJ2aWNlLT5jb25uZWN0RGV2aWNlKGNhbGxiYWNrcywgZGV2aWNlSWQsIFN0cmluZzE2KCJtZWVlZWVlZWVlISIpLAotICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+KCksIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6VVNFX0NBTExJTkdfVUlELAorICAgICAgICAgICAgICAgICAgICB7fSwgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpVU0VfQ0FMTElOR19VSUQsCiAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8mZGV2aWNlKTsKICAgICAgICAgICAgIEVYUEVDVF9UUlVFKHJlcy5pc09rKCkpIDw8IHJlczsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5yZWNvcmQvQW5kcm9pZC5icCBiL2NtZHMvc2NyZWVucmVjb3JkL0FuZHJvaWQuYnAKaW5kZXggZDdkOTA1Zi4uMzU5YTgzNSAxMDA2NDQKLS0tIGEvY21kcy9zY3JlZW5yZWNvcmQvQW5kcm9pZC5icAorKysgYi9jbWRzL3NjcmVlbnJlY29yZC9BbmRyb2lkLmJwCkBAIC0xMiw2ICsxMiwxNSBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfYmluYXJ5IHsKICAgICBuYW1lOiAic2NyZWVucmVjb3JkIiwKIApkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rIGIvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCmluZGV4IDY0NzBmYjEuLmVmNGM1NjggMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5taworKysgYi9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKQEAgLTI4LDYgKzI4LDkgQEAKIAogTE9DQUxfU1lTVEVNX0VYVF9NT0RVTEU6PSB0cnVlCiBMT0NBTF9NT0RVTEU6PSBzdGFnZWZyaWdodAorTE9DQUxfTElDRU5TRV9LSU5EUzo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKK0xPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUzo9IG5vdGljZQorTE9DQUxfTk9USUNFX0ZJTEU6PSAkKExPQ0FMX1BBVEgpL05PVElDRQogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIApAQCAtNTgsNiArNjEsOSBAQAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAogTE9DQUxfTU9EVUxFOj0gcmVjb3JkCitMT0NBTF9MSUNFTlNFX0tJTkRTOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorTE9DQUxfTElDRU5TRV9DT05ESVRJT05TOj0gbm90aWNlCitMT0NBTF9OT1RJQ0VfRklMRTo9ICQoTE9DQUxfUEFUSCkvTk9USUNFCiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCkBAIC04Niw2ICs5Miw5IEBACiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCiBMT0NBTF9NT0RVTEU6PSByZWNvcmR2aWRlbworTE9DQUxfTElDRU5TRV9LSU5EUzo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKK0xPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUzo9IG5vdGljZQorTE9DQUxfTk9USUNFX0ZJTEU6PSAkKExPQ0FMX1BBVEgpL05PVElDRQogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIApAQCAtMTE1LDYgKzEyNCw5IEBACiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCiBMT0NBTF9NT0RVTEU6PSBhdWRpb2xvb3AKK0xPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCitMT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKK0xPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCiAKQEAgLTE0MSw2ICsxNTMsOSBAQAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAogTE9DQUxfTU9EVUxFOj0gc3RyZWFtCitMT0NBTF9MSUNFTlNFX0tJTkRTOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorTE9DQUxfTElDRU5TRV9DT05ESVRJT05TOj0gbm90aWNlCitMT0NBTF9OT1RJQ0VfRklMRTo9ICQoTE9DQUxfUEFUSCkvTk9USUNFCiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCkBAIC0xNjksNiArMTg0LDkgQEAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKIExPQ0FMX01PRFVMRTo9IGNvZGVjCitMT0NBTF9MSUNFTlNFX0tJTkRTOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorTE9DQUxfTElDRU5TRV9DT05ESVRJT05TOj0gbm90aWNlCitMT0NBTF9OT1RJQ0VfRklMRTo9ICQoTE9DQUxfUEFUSCkvTk9USUNFCiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCkBAIC0yMTQsNiArMjMyLDkgQEAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKIExPQ0FMX01PRFVMRTo9IG1lZGlhZmlsdGVyCitMT0NBTF9MSUNFTlNFX0tJTkRTOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorTE9DQUxfTElDRU5TRV9DT05ESVRJT05TOj0gbm90aWNlCitMT0NBTF9OT1RJQ0VfRklMRTo9ICQoTE9DQUxfUEFUSCkvTk9USUNFCiAKIExPQ0FMX1NBTklUSVpFIDo9IGNmaQogCkBAIC0yNDIsNSArMjYzLDggQEAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKIExPQ0FMX01PRFVMRTo9IG11eGVyCitMT0NBTF9MSUNFTlNFX0tJTkRTOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorTE9DQUxfTElDRU5TRV9DT05ESVRJT05TOj0gbm90aWNlCitMT0NBTF9OT1RJQ0VfRklMRTo9ICQoTE9DQUxfUEFUSCkvTk9USUNFCiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcAppbmRleCBlYjc2OTUzLi41NTQyN2NhIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcApAQCAtMTM0LDE1ICsxMzQsMTggQEAKICAgICBzdWNjZXNzID0gZm9ybWF0LT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZtU2FtcGxlUmF0ZSk7CiAgICAgQ0hFQ0soc3VjY2Vzcyk7CiAKLSAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBjaGFubmVsTWFzazsKKyAgICBpbnQzMl90IG51bUNoYW5uZWxzOwogICAgIHN1Y2Nlc3MgPSBmb3JtYXQtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbnVtQ2hhbm5lbHMpOwogICAgIENIRUNLKHN1Y2Nlc3MpOwogCi0gICAgaWYoIWZvcm1hdC0+ZmluZEludDMyKGtLZXlDaGFubmVsTWFzaywgJmNoYW5uZWxNYXNrKSkgeworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrOworICAgIGlmIChpbnQzMl90IHJhd0NoYW5uZWxNYXNrOyAhZm9ybWF0LT5maW5kSW50MzIoa0tleUNoYW5uZWxNYXNrLCAmcmF3Q2hhbm5lbE1hc2spKSB7CiAgICAgICAgIC8vIGxvZyBvbmx5IHdoZW4gdGhlcmUncyBhIHJpc2sgb2YgYW1iaWd1aXR5IG9mIGNoYW5uZWwgbWFzayBzZWxlY3Rpb24KICAgICAgICAgQUxPR0lfSUYobnVtQ2hhbm5lbHMgPiAyLAogICAgICAgICAgICAgICAgICJzb3VyY2UgZm9ybWF0IGRpZG4ndCBzcGVjaWZ5IGNoYW5uZWwgbWFzaywgdXNpbmcgKCVkKSBjaGFubmVsIG9yZGVyIiwgbnVtQ2hhbm5lbHMpOwogICAgICAgICBjaGFubmVsTWFzayA9IENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUjsKKyAgICB9IGVsc2UgeworICAgICAgICBjaGFubmVsTWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihyYXdDaGFubmVsTWFzayk7CiAgICAgfQogCiAgICAgYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vQW5kcm9pZC5icCBiL2RybS9jb21tb24vQW5kcm9pZC5icAppbmRleCAyNDg1NzBlLi43NmVlMjJlIDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvZHJtL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwyMyBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAvLwogCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9kcm1fY29tbW9uX2xpY2Vuc2UiXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfZHJtX2NvbW1vbl9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliZHJtZnJhbWV3b3JrY29tbW9uIiwKIApkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaCBiL2RybS9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmgKaW5kZXggNzNmMTFhNC4uYzBhNWUzYiAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaAorKysgYi9kcm0vY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oCkBAIC0zMDksNyArMzA5LDcgQEAKIAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgYWxsIHRoZSByaWdodHMgaW5mb3JtYXRpb24gb2YgZWFjaCBwbHVnLWluIGFzc29jaWF0ZWQgd2l0aAotICAgICAqIERSTSBmcmFtZXdvcmsuIFdpbGwgYmUgdXNlZCBpbiBtYXN0ZXIgcmVzZXQKKyAgICAgKiBEUk0gZnJhbWV3b3JrLgogICAgICAqCiAgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCiAgICAgICogQHJldHVybiBzdGF0dXNfdApkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaCBiL2RybS9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmgKaW5kZXggMTgzN2ExMS4uYTU0NTk0MSAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaAorKysgYi9kcm0vY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oCkBAIC0yNTAsNyArMjUwLDcgQEAKIAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgYWxsIHRoZSByaWdodHMgaW5mb3JtYXRpb24gb2YgZWFjaCBwbHVnLWluIGFzc29jaWF0ZWQgd2l0aAotICAgICAqIERSTSBmcmFtZXdvcmsuIFdpbGwgYmUgdXNlZCBpbiBtYXN0ZXIgcmVzZXQKKyAgICAgKiBEUk0gZnJhbWV3b3JrLgogICAgICAqCiAgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCiAgICAgICogQHJldHVybiBzdGF0dXNfdApkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9BbmRyb2lkLmJwIGIvZHJtL2RybXNlcnZlci9BbmRyb2lkLmJwCmluZGV4IDE0MWZlNzAuLmRmM2E2YTIgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvQW5kcm9pZC5icAorKysgYi9kcm0vZHJtc2VydmVyL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDIzIEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2RybV9kcm1zZXJ2ZXJfbGljZW5zZSJdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9kcm1fZHJtc2VydmVyX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2JpbmFyeSB7CiAgICAgbmFtZTogImRybXNlcnZlciIsCiAKQEAgLTQyLDcgKzU5LDcgQEAKICAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCiAKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJwcmVmZXIzMiIsCiAKICAgICBpbml0X3JjOiBbImRybXNlcnZlci5yYyJdLAogfQpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcCBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKaW5kZXggOWEzMmNjNS4uNzRlMzIyMyAxMDA2NDQKLS0tIGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcAorKysgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCkBAIC05OSwxMyArOTksMTMgQEAKICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVygiVW5yZWNvZ25pemVkIG1lc3NhZ2UgdHlwZTogJXpkIiwgbXNnLT53aGF0KCkpOworICAgICAgICAgICAgQUxPR1coIlVucmVjb2duaXplZCBtZXNzYWdlIHR5cGU6ICV1IiwgbXNnLT53aGF0KCkpOwogICAgICAgICB9CiAgICAgfQogfQogCiBpbnQ2NF90IERybU1hbmFnZXI6OmdldE1ldHJpY3NGbHVzaFBlcmlvZFVzKCkgewotICAgIHJldHVybiAxMDAwICogMTAwMCAqIHN0ZDo6bWF4KDFsbCwgcHJvcGVydHlfZ2V0X2ludDY0KCJkcm1tYW5hZ2VyLm1ldHJpY3MucGVyaW9kIiwgODY0MDApKTsKKyAgICByZXR1cm4gMTAwMCAqIDEwMDAgKiBzdGQ6Om1heCgxbGwsIChsb25nIGxvbmcpcHJvcGVydHlfZ2V0X2ludDY0KCJkcm1tYW5hZ2VyLm1ldHJpY3MucGVyaW9kIiwgODY0MDApKTsKIH0KIAogdm9pZCBEcm1NYW5hZ2VyOjpyZWNvcmRFbmdpbmVNZXRyaWNzKApkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9BbmRyb2lkLmJwCmluZGV4IGI0YTdiMjUuLmRiY2U1ZWEgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvQW5kcm9pZC5icAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDIzIEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2RybV9saWJkcm1mcmFtZXdvcmtfbGljZW5zZSJdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9kcm1fbGliZHJtZnJhbWV3b3JrX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliZHJtZnJhbWV3b3JrIiwKIApAQCAtMzcsNCArNTQsMyBAQAogCiAgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKIH0KLQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJDbGllbnRJbXBsLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlckNsaWVudEltcGwuaAppbmRleCAzODU4Njc1Li44Yzg3ODNiIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlckNsaWVudEltcGwuaAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlckNsaWVudEltcGwuaApAQCAtMjMwLDcgKzIzMCw3IEBACiAKICAgICAvKioKICAgICAgKiBSZW1vdmVzIGFsbCB0aGUgcmlnaHRzIGluZm9ybWF0aW9uIG9mIGVhY2ggcGx1Zy1pbiBhc3NvY2lhdGVkIHdpdGgKLSAgICAgKiBEUk0gZnJhbWV3b3JrLiBXaWxsIGJlIHVzZWQgaW4gbWFzdGVyIHJlc2V0CisgICAgICogRFJNIGZyYW1ld29yay4KICAgICAgKgogICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL0FuZHJvaWQuYnAKaW5kZXggNzM3MmViNy4uYTQ3YjRhMSAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDI1IEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9kcm1fbGliZHJtZnJhbWV3b3JrX3BsdWdpbnNfY29tbW9uX3V0aWxfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfZHJtX2xpYmRybWZyYW1ld29ya19wbHVnaW5zX2NvbW1vbl91dGlsX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGliZHJtdXRpbGl0eSIsCiAKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL0FuZHJvaWQuYnAKaW5kZXggOWY1MmY3YS4uYmUyYjU0NiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDI1IEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9kcm1fbGliZHJtZnJhbWV3b3JrX3BsdWdpbnNfZm9yd2FyZC1sb2NrX0Z3ZExvY2tFbmdpbmVfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfZHJtX2xpYmRybWZyYW1ld29ya19wbHVnaW5zX2ZvcndhcmQtbG9ja19Gd2RMb2NrRW5naW5lX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliZndkbG9ja2VuZ2luZSIsCiAKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaAppbmRleCBiNjJkZGI5Li5lYjViMGY2IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmgKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZS5oCkBAIC0yNTIsOCArMjUyLDcgQEAKIAogLyoqCiAgKiBSZW1vdmVzIGFsbCB0aGUgcmlnaHRzIGluZm9ybWF0aW9uIG9mIGVhY2ggcGx1Zy1pbiBhc3NvY2lhdGVkIHdpdGgKLSAqIERSTSBmcmFtZXdvcmsuIFdpbGwgYmUgdXNlZCBpbiBtYXN0ZXIgcmVzZXQgYnV0IGRvZXMgbm90aGluZyBmb3IKLSAqIEZvcndhcmQgTG9jayBFbmdpbmUuCisgKiBEUk0gZnJhbWV3b3JrLiBEb2VzIG5vdGhpbmcgZm9yIEZvcndhcmQgTG9jayBFbmdpbmUuCiAgKgogICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KICAqIEByZXR1cm4gc3RhdHVzX3QKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0FuZHJvaWQuYnAKaW5kZXggM2JlMzI3YS4uMmU0MDcwYiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2RybV9saWJkcm1mcmFtZXdvcmtfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfZHJtX2xpYmRybWZyYW1ld29ya19saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGliZndkbG9jay1jb21tb24iLAogCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvQW5kcm9pZC5icCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9BbmRyb2lkLmJwCmluZGV4IGQ0ZTA0YjguLjUxYzc3OGYgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9BbmRyb2lkLmJwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwxNSBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAvLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9kcm1fbGliZHJtZnJhbWV3b3JrX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2RybV9saWJkcm1mcmFtZXdvcmtfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYmZ3ZGxvY2stY29udmVydGVyIiwKIApkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9BbmRyb2lkLmJwCmluZGV4IDBiZjI3MzcuLjY3NzNmZTEgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RlY29kZXIvQW5kcm9pZC5icAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2RybV9saWJkcm1mcmFtZXdvcmtfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfZHJtX2xpYmRybWZyYW1ld29ya19saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGliZndkbG9jay1kZWNvZGVyIiwKIApkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL0Z3ZExvY2suaHRtbCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9Gd2RMb2NrLmh0bWwKaW5kZXggOGY5NWNkMi4uYzFkNWIzZCAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL0Z3ZExvY2suaHRtbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvRndkTG9jay5odG1sCkBAIC00ODgsNyArNDg4LDcgQEAKIDxwIGNsYXNzPU1zb0JvZHlUZXh0PjxiPk5vdGU6PC9iPiBUaGUga2V5LWVuY3J5cHRpb24ga2V5IG11c3QgYmUgdW5pcXVlIHRvIGVhY2gKIGRldmljZTsgdGhpcyBpcyB3aGF0IG1ha2VzIHRoZSBmaWxlcyBmb3J3YXJkIGxvY2uWcHJvdGVjdGVkLiBJZGVhbGx5LCBpdCBzaG91bGQKIGJlIGRlcml2ZWQgZnJvbSBzZWNyZXQgaGFyZHdhcmUgcGFyYW1ldGVycywgYnV0IGF0IHRoZSB2ZXJ5IGxlYXN0IGl0IHNob3VsZCBiZQotcGVyc2lzdGVudCBmcm9tIG9uZSBtYXN0ZXIgcmVzZXQgdG8gdGhlIG5leHQuPC9wPgorcGVyc2lzdGVudCBmcm9tIG9uZSBmYWN0b3J5IHJlc2V0IHRvIHRoZSBuZXh0LjwvcD4KIAogPGRpdiBzdHlsZT0nbWFyZ2luLWJvdHRvbToyNC4wcHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7cGFkZGluZzoxLjBwdCA0LjBwdCAxLjBwdCA0LjBwdDsKIGJhY2tncm91bmQ6I0YyRjJGMic+CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvQW5kcm9pZC5icCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9BbmRyb2lkLmJwCmluZGV4IDgwNDU1ODYuLjZkZmZkNDkgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9BbmRyb2lkLmJwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwyNSBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAvLwogCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfZHJtX2xpYmRybWZyYW1ld29ya19wbHVnaW5zX3Bhc3N0aHJ1X2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X2RybV9saWJkcm1mcmFtZXdvcmtfcGx1Z2luc19wYXNzdGhydV9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmRybXBhc3N0aHJ1cGx1Z2luIiwKIApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAppbmRleCAxNzAwYTk1Li5hODJhNjFkIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAorKysgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icApAQCAtMiw2ICsyLDE1IEBACiAvLyBsaWJtZWRpYWRybQogLy8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X2hlYWRlcnMgewogICAgIG5hbWU6ICJsaWJtZWRpYWRybV9oZWFkZXJzIiwKIApAQCAtMTEsNyArMjAsNyBAQAogCiB9CiAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtZWRpYWRybSIsCiAKICAgICBzcmNzOiBbCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmNwcAppbmRleCA1MjkyNzA1Li5lMzEzOTVkIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5jcHAKQEAgLTY2LDcgKzY2LDcgQEAKICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CiAgICAgTWVkaWFSZXNvdXJjZVBhcmNlbCByZXNvdXJjZXsKICAgICAgICAgICAgIFR5cGU6OmtEcm1TZXNzaW9uLCBTdWJUeXBlOjprVW5zcGVjaWZpZWRTdWJUeXBlLAotICAgICAgICAgICAgdG9TdGRWZWM8aW50OF90PihzZXNzaW9uSWQpLCB2YWx1ZX07CisgICAgICAgICAgICB0b1N0ZFZlYzw+KHNlc3Npb25JZCksIHZhbHVlfTsKICAgICByZXNvdXJjZXMucHVzaF9iYWNrKHJlc291cmNlKTsKICAgICByZXR1cm4gcmVzb3VyY2VzOwogfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2Z1enplci9BbmRyb2lkLmJwIGIvZHJtL2xpYm1lZGlhZHJtL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMDQ3MDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIm1lZGlhZHJtX2Z1enplciIsCisgICAgc3JjczogWworICAgICAgICAibWVkaWFkcm1fZnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibWVkaWFkcm0iLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgInJlc291cmNlbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFkcm1faGVhZGVycyIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhZHJtbWV0cmljc19saXRlIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyMxIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMiIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjMiLAorICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICBdLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9mdXp6ZXIvUkVBRE1FLm1kIGIvZHJtL2xpYm1lZGlhZHJtL2Z1enplci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M5NWNkNwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJtZWRpYWRybS9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTYgQEAKKyMgRnV6emVyIGZvciBsaWJtZWRpYWRybQorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgbGlibWVkaWFkcm0gaXMgZGVzaWduZWQgYmFzZWQgb24gdGhlIHVuZGVyc3RhbmRpbmcgb2YgdGhlCitsaWJyYXJ5IGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK1RoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIG5vdCBoYXJkY29kZWQsIGJ1dCBpbnN0ZWFkIHNlbGVjdGVkIGJhc2VkIG9uCitpbmNvbWluZyBkYXRhLiBUaGlzIGVuc3VyZXMgbW9yZSBjb2RlIHBhdGhzIGFyZSByZWFjaGVkIGJ5IHRoZSBmdXp6ZXIuCisKK2xpYm1lZGlhZHJtIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKzEuIFNlY3VyaXR5IExldmVsIChwYXJhbWV0ZXIgbmFtZTogYHNlY3VyaXR5TGV2ZWxgKQorMi4gTWltZSBUeXBlIChwYXJhbWV0ZXIgbmFtZTogYG1pbWVUeXBlYCkKKzMuIEtleSBUeXBlIChwYXJhbWV0ZXIgbmFtZTogYGtleVR5cGVgKQorNC4gQ3J5cHRvIE1vZGUgKHBhcmFtZXRlciBuYW1lOiBgY3J5cHRvTW9kZWApCisKK3wgUGFyYW1ldGVyfCBWYWxpZCBWYWx1ZXN8IENvbmZpZ3VyZWQgVmFsdWV8Cit8LS0tLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLXwgLS0tLS0gfAorfCBgc2VjdXJpdHlMZXZlbGAgfCAwLmBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsVW5rbm93bmAgMS5gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbE1heGAgMi5gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFN3U2VjdXJlQ3J5cHRvYCAzLmBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsU3dTZWN1cmVEZWNvZGVgICA0LmBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVDcnlwdG9gIDUuYERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZURlY29kZWAgNi5gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlQWxsYHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgaW4gdGhlIHJhbmdlIDAgdG8gNnwKK3wgYG1pbWVUeXBlYCB8IDAuYHZpZGVvL21wNGAgMS5gdmlkZW8vbXBlZ2AgMi5gdmlkZW8veC1mbHZgIDMuYHZpZGVvL21qMmAgNC5gdmlkZW8vM2dwMmAgNS5gdmlkZW8vM2dwcGAgNi5gdmlkZW8vM2dwcDJgIDcuYGF1ZGlvL21wNGAgOC5gYXVkaW8vbXBlZ2AgOS5gYXVkaW8vYWFjYCAxMC5gYXVkaW8vM2dwMmAgMTEuYGF1ZGlvLzNncHBgIDEyLmBhdWRpby8zZ3BwMmAgMTMuYHZpZGVvL3Vua25vd25gfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciBpbiB0aGUgcmFuZ2UgMCB0byAxM3wKK3wgYGtleVR5cGVgIHwgMC5gRHJtUGx1Z2luOjprS2V5VHlwZV9PZmZsaW5lYCAxLmBEcm1QbHVnaW46OmtLZXlUeXBlX1N0cmVhbWluZ2AgMi5gRHJtUGx1Z2luOjprS2V5VHlwZV9SZWxlYXNlYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIGluIHRoZSByYW5nZSAwIHRvIDJ8Cit8IGBjcnlwdG9Nb2RlYCB8IDAuYENyeXB0b1BsdWdpbjo6a01vZGVfVW5lbmNyeXB0ZWRgIDEuYENyeXB0b1BsdWdpbjo6a01vZGVfQUVTX0NUUmAgMi5gQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfV1ZgIDMuYENyeXB0b1BsdWdpbjo6a01vZGVfQUVTX0NCQ2AgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciBpbiB0aGUgcmFuZ2UgMCB0byAzfAorCitUaGlzIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gaXMgYWx3YXlzIGRldGVybWluaXN0aWMgZm9yIGFueSBnaXZlbiBpbnB1dC4KKworIyMjIyMgTWF4aW1pemUgdXRpbGl6YXRpb24gb2YgaW5wdXQgZGF0YQorVGhlIHBsdWdpbiBmZWVkcyB0aGUgZW50aXJlIGlucHV0IGRhdGEgdG8gdGhlIGRybSBtb2R1bGUuCitUaGlzIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIHRvbGVyYXRlcyBhbnkga2luZCBvZiBpbnB1dCAoZW1wdHksIGh1Z2UsCittYWxmb3JtZWQsIGV0YykgYW5kIGRvZXNudCBgZXhpdCgpYCBvbiBhbnkgaW5wdXQgYW5kIHRoZXJlYnkgaW5jcmVhc2luZyB0aGUKK2NoYW5jZSBvZiBpZGVudGlmeWluZyB2dWxuZXJhYmlsaXRpZXMuCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG1lZGlhZHJtX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbWVkaWFkcm1fZnV6emVyCitgYGAKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUgorYGBgCisgICQgYWRiIHNoZWxsIG1rZGlyIENPUlBVU19ESVIKK2BgYAorVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6LyR7VEFSR0VUX0FSQ0h9L21lZGlhZHJtX2Z1enplci9tZWRpYWRybV9mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2Z1enplci9tZWRpYWRybV9mdXp6ZXIuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL2Z1enplci9tZWRpYWRybV9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZjA0NzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vZnV6emVyL21lZGlhZHJtX2Z1enplci5jcHAKQEAgLTAsMCArMSw0NTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPGhpZGxtZW1vcnkvRnJhbWV3b3JrVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9DcnlwdG9IYWwuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9Ecm1IYWwuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSAiZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oIgorCisjZGVmaW5lIEFFU19CTE9DS19TSVpFIDE2CisjZGVmaW5lIFVOVVNFRF9QQVJBTSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZnJvbUhlYXA7Cit1c2luZyA6OmFuZHJvaWQ6Om9zOjpQZXJzaXN0YWJsZUJ1bmRsZTsKK3VzaW5nIGRybTo6VjFfMDo6QnVmZmVyVHlwZTsKKworZW51bSB7CisgICAgSU5WQUxJRF9VVUlEID0gMCwKKyAgICBQU1NIX0JPWF9VVUlELAorICAgIENMRUFSS0VZX1VVSUQsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBrSW52YWxpZFVVSURbMTZdID0gezB4MTAsIDB4MjAsIDB4MzAsIDB4NDAsIDB4NTAsIDB4NjAsIDB4NzAsIDB4ODAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAsIDB4MjAsIDB4MzAsIDB4NDAsIDB4NTAsIDB4NjAsIDB4NzAsIDB4ODB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBrQ29tbW9uUHNzaEJveFVVSURbMTZdID0gezB4MTAsIDB4NzcsIDB4RUYsIDB4RUMsIDB4QzAsIDB4QjIsIDB4NEQsIDB4MDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QUMsIDB4RTMsIDB4M0MsIDB4MUUsIDB4NTIsIDB4RTIsIDB4RkIsIDB4NEJ9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBrQ2xlYXJLZXlVVUlEWzE2XSA9IHsweEUyLCAweDcxLCAweDlELCAweDU4LCAweEE5LCAweDg1LCAweEIzLCAweEM5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3OCwgMHgxQSwgMHhCMCwgMHgzMCwgMHhBRiwgMHg3OCwgMHhEMywgMHgwRX07CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrVVVJRFtdID0ge0lOVkFMSURfVVVJRCwgUFNTSF9CT1hfVVVJRCwgQ0xFQVJLRVlfVVVJRH07CisKK2NvbnN0IERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBrU2VjdXJpdHlMZXZlbFtdID0geworICAgIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxVbmtub3duLCAgICAgICAgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbE1heCwKKyAgICBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsU3dTZWN1cmVDcnlwdG8sIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZSwKKyAgICBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVDcnlwdG8sIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZURlY29kZSwKKyAgICBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVBbGx9OworCitjb25zdCBjaGFyICprTWltZVR5cGVbXSA9IHsidmlkZW8vbXA0IiwgICAidmlkZW8vbXBlZyIsICAgICJ2aWRlby94LWZsdiIsICAidmlkZW8vbWoyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlby8zZ3AyIiwgICJ2aWRlby8zZ3BwIiwgICAgInZpZGVvLzNncHAyIiwgICJhdWRpby9tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvL21wZWciLCAgImF1ZGlvL2FhYyIsICAgICAiYXVkaW8vM2dwMiIsICAgImF1ZGlvLzNncHAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvLzNncHAyIiwgInZpZGVvL3Vua25vd24iLCAiYXVkaW8vdW5rbm93biJ9OworCitjb25zdCBEcm1QbHVnaW46OktleVR5cGUga0tleVR5cGVbXSA9IHtEcm1QbHVnaW46OmtLZXlUeXBlX09mZmxpbmUsIERybVBsdWdpbjo6a0tleVR5cGVfU3RyZWFtaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjprS2V5VHlwZV9SZWxlYXNlfTsKKworY29uc3QgQ3J5cHRvUGx1Z2luOjpNb2RlIGtDcnlwdG9Nb2RlW10gPSB7Q3J5cHRvUGx1Z2luOjprTW9kZV9VbmVuY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6a01vZGVfQUVTX0NUUiwgQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfV1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DQkN9OworCitjb25zdCBjaGFyICprQ2lwaGVyQWxnb3JpdGhtW10gPSB7IkFFUy9DQkMvTm9QYWRkaW5nIiwgIiJ9OworY29uc3QgY2hhciAqa01hY0FsZ29yaXRobVtdID0geyJIbWFjU0hBMjU2IiwgIiJ9OworY29uc3QgY2hhciAqa1JTQUFsZ29yaXRobVtdID0geyJSU0FTU0EtUFNTLVNIQTEiLCAiIn07Citjb25zdCBzaXplX3Qga051bVNlY3VyaXR5TGV2ZWwgPSBzaXplKGtTZWN1cml0eUxldmVsKTsKK2NvbnN0IHNpemVfdCBrTnVtTWltZVR5cGUgPSBzaXplKGtNaW1lVHlwZSk7Citjb25zdCBzaXplX3Qga051bUtleVR5cGUgPSBzaXplKGtLZXlUeXBlKTsKK2NvbnN0IHNpemVfdCBrTnVtQ3J5cHRvTW9kZSA9IHNpemUoa0NyeXB0b01vZGUpOworY29uc3Qgc2l6ZV90IGtOdW1VVUlEID0gc2l6ZShrVVVJRCk7Citjb25zdCBzaXplX3Qga01heFN0cmluZ0xlbmd0aCA9IDEwMDsKK2NvbnN0IHNpemVfdCBrTWF4U3ViU2FtcGxlcyA9IDEwOworY29uc3Qgc2l6ZV90IGtNYXhOdW1CeXRlcyA9IDEwMDA7CisKK3N0cnVjdCBEcm1MaXN0ZW5lciA6IHZpcnR1YWwgcHVibGljIElEcm1DbGllbnQgeworICAgcHVibGljOgorICAgIHZvaWQgc2VuZEV2ZW50KERybVBsdWdpbjo6RXZlbnRUeXBlIGV2ZW50VHlwZSBVTlVTRURfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPHVpbnQ4X3Q+ICZzZXNzaW9uSWQgVU5VU0VEX1BBUkFNLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzx1aW50OF90PiAmZGF0YSBVTlVTRURfUEFSQU0pIG92ZXJyaWRlIHt9CisKKyAgICB2b2lkIHNlbmRFeHBpcmF0aW9uVXBkYXRlKGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzx1aW50OF90PiAmc2Vzc2lvbklkIFVOVVNFRF9QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZXhwaXJ5VGltZUluTVMgVU5VU0VEX1BBUkFNKSBvdmVycmlkZSB7fQorCisgICAgdm9pZCBzZW5kS2V5c0NoYW5nZShjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4gJnNlc3Npb25JZCBVTlVTRURfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxEcm1LZXlTdGF0dXM+ICZrZXlTdGF0dXNMaXN0IFVOVVNFRF9QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzTmV3VXNhYmxlS2V5IFVOVVNFRF9QQVJBTSkgb3ZlcnJpZGUge30KKworICAgIHZvaWQgc2VuZFNlc3Npb25Mb3N0U3RhdGUoY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPHVpbnQ4X3Q+ICYpIG92ZXJyaWRlIHt9CisgICAgRHJtTGlzdGVuZXIoKSB7fQorCisgICBwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERybUxpc3RlbmVyKTsKK307CisKK2NsYXNzIERybUZ1enplciB7CisgICBwdWJsaWM6CisgICAgdm9pZCBwcm9jZXNzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgcHJpdmF0ZToKKyAgICB2b2lkIGludm9rZURybShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgYm9vbCBpbml0RHJtKCk7CisgICAgdm9pZCBpbnZva2VEcm1DcmVhdGVQbHVnaW4oKTsKKyAgICB2b2lkIGludm9rZURybU9wZW5TZXNzaW9uKCk7CisgICAgdm9pZCBpbnZva2VEcm1TZXRMaXN0ZW5lcigpOworICAgIHZvaWQgaW52b2tlRHJtU2V0QWxnb3JpdGhtQVBJKCk7CisgICAgdm9pZCBpbnZva2VEcm1Qcm9wZXJ0eUFQSSgpOworICAgIHZvaWQgaW52b2tlRHJtRGVjcnlwdEVuY3J5cHRBUEkoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgaW52b2tlRHJtU2VjdXJlU3RvcEFQSSgpOworICAgIHZvaWQgaW52b2tlRHJtT2ZmbGluZUxpY2Vuc2VBUEkoKTsKKyAgICB2b2lkIGludm9rZURybUNsb3NlU2Vzc2lvbigpOworICAgIHZvaWQgaW52b2tlRHJtRGVzdHJveVBsdWdpbigpOworICAgIHZvaWQgaW52b2tlQ3J5cHRvKGNvbnN0IHVpbnQ4X3QgKmRhdGEpOworICAgIGJvb2wgaW5pdENyeXB0bygpOworICAgIHZvaWQgaW52b2tlQ3J5cHRvQ3JlYXRlUGx1Z2luKCk7CisgICAgdm9pZCBpbnZva2VDcnlwdG9EZWNyeXB0KGNvbnN0IHVpbnQ4X3QgKmRhdGEpOworICAgIHZvaWQgaW52b2tlQ3J5cHRvRGVzdHJveVBsdWdpbigpOworICAgIHNwPERybUhhbD4gbURybSA9IG51bGxwdHI7CisgICAgc3A8Q3J5cHRvSGFsPiBtQ3J5cHRvID0gbnVsbHB0cjsKKyAgICBWZWN0b3I8dWludDhfdD4gbVNlc3Npb25JZCA9IHt9OworICAgIEZ1enplZERhdGFQcm92aWRlciAqbUZ1enplZERhdGFQcm92aWRlciA9IG51bGxwdHI7Cit9OworCitib29sIERybUZ1enplcjo6aW5pdERybSgpIHsKKyAgICBtRHJtID0gbmV3IERybUhhbCgpOworICAgIGlmICghbURybSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIERybUZ1enplcjo6aW52b2tlRHJtQ3JlYXRlUGx1Z2luKCkgeworICAgIG1Ecm0tPmluaXRDaGVjaygpOworICAgIFN0cmluZzggcGFja2FnZU5hbWUobUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4U3RyaW5nTGVuZ3RoKS5jX3N0cigpKTsKKyAgICB1aW50MzJfdCB1dWlkRW51bSA9IGtVVUlEW21GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBrTnVtVVVJRCAtIDEpXTsKKyAgICBzd2l0Y2ggKHV1aWRFbnVtKSB7CisgICAgICAgIGNhc2UgSU5WQUxJRF9VVUlEOgorICAgICAgICAgICAgbURybS0+Y3JlYXRlUGx1Z2luKGtJbnZhbGlkVVVJRCwgcGFja2FnZU5hbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUFNTSF9CT1hfVVVJRDoKKyAgICAgICAgICAgIG1Ecm0tPmNyZWF0ZVBsdWdpbihrQ29tbW9uUHNzaEJveFVVSUQsIHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENMRUFSS0VZX1VVSUQ6CisgICAgICAgICAgICBtRHJtLT5jcmVhdGVQbHVnaW4oa0NsZWFyS2V5VVVJRCwgcGFja2FnZU5hbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgRHJtRnV6emVyOjppbnZva2VEcm1EZXN0cm95UGx1Z2luKCkgeyBtRHJtLT5kZXN0cm95UGx1Z2luKCk7IH0KKwordm9pZCBEcm1GdXp6ZXI6Omludm9rZURybU9wZW5TZXNzaW9uKCkgeworICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsOworICAgIGJvb2wgc2hvdWxkUGFzc1JhbmRvbVNlY3VyaXR5TGV2ZWwgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpOworICAgIGlmIChzaG91bGRQYXNzUmFuZG9tU2VjdXJpdHlMZXZlbCkgeworICAgICAgICBzZWN1cml0eUxldmVsID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbD4obUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPHNpemVfdD4oKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2VjdXJpdHlMZXZlbCA9IGtTZWN1cml0eUxldmVsW21GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigKKyAgICAgICAgICAgIDAsIGtOdW1TZWN1cml0eUxldmVsIC0gMSldOworICAgIH0KKyAgICBtRHJtLT5vcGVuU2Vzc2lvbihzZWN1cml0eUxldmVsLCBtU2Vzc2lvbklkKTsKK30KKwordm9pZCBEcm1GdXp6ZXI6Omludm9rZURybUNsb3NlU2Vzc2lvbigpIHsgbURybS0+Y2xvc2VTZXNzaW9uKG1TZXNzaW9uSWQpOyB9CisKK3ZvaWQgRHJtRnV6emVyOjppbnZva2VEcm1TZXRMaXN0ZW5lcigpIHsKKyAgICBzcDxEcm1MaXN0ZW5lcj4gbGlzdGVuZXIgPSBuZXcgRHJtTGlzdGVuZXIoKTsKKyAgICBtRHJtLT5zZXRMaXN0ZW5lcihsaXN0ZW5lcik7Cit9CisKK3ZvaWQgRHJtRnV6emVyOjppbnZva2VEcm1TZXRBbGdvcml0aG1BUEkoKSB7CisgICAgbURybS0+c2V0Q2lwaGVyQWxnb3JpdGhtKG1TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoa0NpcGhlckFsZ29yaXRobVttRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpXSkpOworICAgIG1Ecm0tPnNldE1hY0FsZ29yaXRobShtU2Vzc2lvbklkLCBTdHJpbmc4KGtNYWNBbGdvcml0aG1bbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUJvb2woKV0pKTsKK30KKwordm9pZCBEcm1GdXp6ZXI6Omludm9rZURybVByb3BlcnR5QVBJKCkgeworICAgIG1Ecm0tPnNldFByb3BlcnR5U3RyaW5nKFN0cmluZzgoInByb3BlcnR5IiksIFN0cmluZzgoInZhbHVlIikpOworICAgIFN0cmluZzggc3RyaW5nVmFsdWU7CisgICAgbURybS0+Z2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCgicHJvcGVydHkiKSwgc3RyaW5nVmFsdWUpOworICAgIFZlY3Rvcjx1aW50OF90PiB2YWx1ZSA9IHt9OworICAgIG1Ecm0tPnNldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzgoInByb3BlcnR5IiksIHZhbHVlKTsKKyAgICBWZWN0b3I8dWludDhfdD4gYnl0ZVZhbHVlOworICAgIG1Ecm0tPmdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzgoInByb3BlcnR5IiksIGJ5dGVWYWx1ZSk7Cit9CisKK3ZvaWQgRHJtRnV6emVyOjppbnZva2VEcm1EZWNyeXB0RW5jcnlwdEFQSShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIHVpbnQzMl90IG9wZW5TZXNzaW9ucyA9IDA7CisgICAgdWludDMyX3QgbWF4U2Vzc2lvbnMgPSAwOworICAgIG1Ecm0tPmdldE51bWJlck9mU2Vzc2lvbnMoJm9wZW5TZXNzaW9ucywgJm1heFNlc3Npb25zKTsKKworICAgIERybVBsdWdpbjo6SGRjcExldmVsIGNvbm5lY3RlZDsKKyAgICBEcm1QbHVnaW46OkhkY3BMZXZlbCBtYXg7CisgICAgbURybS0+Z2V0SGRjcExldmVscygmY29ubmVjdGVkLCAmbWF4KTsKKworICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsOworICAgIG1Ecm0tPmdldFNlY3VyaXR5TGV2ZWwobVNlc3Npb25JZCwgJnNlY3VyaXR5TGV2ZWwpOworCisgICAgLy8gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoKSBzaGFsbCBmaWxsIGlzU3VwcG9ydGVkCisgICAgYm9vbCBpc1N1cHBvcnRlZDsKKyAgICBTdHJpbmc4IG1pbWVUeXBlKAorICAgICAgICBrTWltZVR5cGVbbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIGtOdW1NaW1lVHlwZSAtIDEpXSk7CisgICAgbURybS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoa0NsZWFyS2V5VVVJRCwgbWltZVR5cGUsIHNlY3VyaXR5TGV2ZWwsICZpc1N1cHBvcnRlZCk7CisKKyAgICAvLyBnZXRQcm92aXNpb25SZXF1ZXN0KCkgc2hhbGwgZmlsbCBsZWdhY3lSZXF1ZXN0IGFuZCBsZWdhY3lEZWZhdWx0VXJsCisgICAgU3RyaW5nOCBjZXJ0aWZpY2F0ZVR5cGUoCisgICAgICAgIG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heFN0cmluZ0xlbmd0aCkuY19zdHIoKSk7CisgICAgU3RyaW5nOCBjZXJ0QXV0aG9yaXR5KG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heFN0cmluZ0xlbmd0aCkuY19zdHIoKSk7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGxlZ2FjeVJlcXVlc3QgPSB7fTsKKyAgICBTdHJpbmc4IGxlZ2FjeURlZmF1bHRVcmw7CisgICAgbURybS0+Z2V0UHJvdmlzaW9uUmVxdWVzdChjZXJ0aWZpY2F0ZVR5cGUsIGNlcnRBdXRob3JpdHksIGxlZ2FjeVJlcXVlc3QsIGxlZ2FjeURlZmF1bHRVcmwpOworCisgICAgLy8gcHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKCkgc2hhbGwgZmlsbCBjZXJ0aWZpY2F0ZSBhbmQgd3JhcHBlZEtleQorICAgIFZlY3Rvcjx1aW50OF90PiBwcm92aXNpb25SZXNwb25zZSA9IHt9OworICAgIFZlY3Rvcjx1aW50OF90PiBjZXJ0aWZpY2F0ZSA9IHt9OworICAgIFZlY3Rvcjx1aW50OF90PiB3cmFwcGVkS2V5ID0ge307CisgICAgbURybS0+cHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKHByb3Zpc2lvblJlc3BvbnNlLCBjZXJ0aWZpY2F0ZSwgd3JhcHBlZEtleSk7CisKKyAgICAvLyBnZXRLZXlSZXF1ZXN0KCkgc2hhbGwgZmlsbCBrZXlSZXF1ZXN0LCBkZWZhdWx0VXJsIGFuZCBrZXlSZXF1ZXN0VHlwZQorICAgIFZlY3Rvcjx1aW50OF90PiBpbml0RGF0YSA9IHt9OworICAgIGluaXREYXRhLmFwcGVuZEFycmF5KGRhdGEsIHNpemUpOworICAgIERybVBsdWdpbjo6S2V5VHlwZSBrZXlUeXBlOworICAgIGJvb2wgc2hvdWxkUGFzc1JhbmRvbUtleVR5cGUgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpOworICAgIGlmIChzaG91bGRQYXNzUmFuZG9tS2V5VHlwZSkgeworICAgICAgICBrZXlUeXBlID0gc3RhdGljX2Nhc3Q8RHJtUGx1Z2luOjpLZXlUeXBlPihtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8c2l6ZV90PigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBrZXlUeXBlID0ga0tleVR5cGVbbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIGtOdW1LZXlUeXBlIC0gMSldOworICAgIH0KKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtZE9wdGlvbmFsUGFyYW1ldGVycyA9IHt9OworICAgIFZlY3Rvcjx1aW50OF90PiBrZXlSZXF1ZXN0ID0ge307CisgICAgU3RyaW5nOCBkZWZhdWx0VXJsOworICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUga2V5UmVxdWVzdFR5cGU7CisgICAgbURybS0+Z2V0S2V5UmVxdWVzdChtU2Vzc2lvbklkLCBpbml0RGF0YSwgbWltZVR5cGUsIGtleVR5cGUsIG1kT3B0aW9uYWxQYXJhbWV0ZXJzLCBrZXlSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCwgJmtleVJlcXVlc3RUeXBlKTsKKworICAgIC8vIHByb3ZpZGVLZXlSZXNwb25zZSgpIHNoYWxsIGZpbGwga2V5U2V0SWQKKyAgICBWZWN0b3I8dWludDhfdD4ga2V5UmVzcG9uc2UgPSB7fTsKKyAgICBrZXlSZXNwb25zZS5hcHBlbmRBcnJheShkYXRhLCBzaXplKTsKKyAgICBWZWN0b3I8dWludDhfdD4ga2V5U2V0SWQgPSB7fTsKKyAgICBtRHJtLT5wcm92aWRlS2V5UmVzcG9uc2UobVNlc3Npb25JZCwga2V5UmVzcG9uc2UsIGtleVNldElkKTsKKworICAgIC8vIHJlc3RvcmVLZXlzCisgICAgbURybS0+cmVzdG9yZUtleXMobVNlc3Npb25JZCwga2V5U2V0SWQpOworCisgICAgLy8gcXVlcnlLZXlTdGF0dXMoKSBzaGFsbCBmaWxsIGluZm9NYXAKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBpbmZvTWFwID0ge307CisgICAgbURybS0+cXVlcnlLZXlTdGF0dXMobVNlc3Npb25JZCwgaW5mb01hcCk7CisKKyAgICAvLyBkZWNyeXB0KCkgc2hhbGwgZmlsbCBvdXRwdXRWZWMKKyAgICBWZWN0b3I8dWludDhfdD4ga2V5SWRWZWMgPSB7fTsKKyAgICBrZXlJZFZlYy5hcHBlbmRBcnJheShkYXRhLCBzaXplKTsKKworICAgIFZlY3Rvcjx1aW50OF90PiBpbnB1dFZlYyA9IHt9OworICAgIGlucHV0VmVjLmFwcGVuZEFycmF5KGRhdGEsIHNpemUpOworCisgICAgVmVjdG9yPHVpbnQ4X3Q+IGl2VmVjID0ge307CisgICAgaXZWZWMuYXBwZW5kQXJyYXkoZGF0YSwgc2l6ZSk7CisKKyAgICBWZWN0b3I8dWludDhfdD4gb3V0cHV0VmVjID0ge307CisgICAgbURybS0+ZGVjcnlwdChtU2Vzc2lvbklkLCBrZXlJZFZlYywgaW5wdXRWZWMsIGl2VmVjLCBvdXRwdXRWZWMpOworCisgICAgLy8gZW5jcnlwdCgpIHNoYWxsIGZpbGwgb3V0cHV0VmVjCisgICAgbURybS0+ZW5jcnlwdChtU2Vzc2lvbklkLCBrZXlJZFZlYywgaW5wdXRWZWMsIGl2VmVjLCBvdXRwdXRWZWMpOworCisgICAgLy8gc2lnbigpIHNoYWxsIGZpbGwgc2lnbmF0dXJlCisgICAgVmVjdG9yPHVpbnQ4X3Q+IG1lc3NhZ2UgPSB7fTsKKyAgICBtZXNzYWdlLmFwcGVuZEFycmF5KGRhdGEsIHNpemUpOworICAgIFZlY3Rvcjx1aW50OF90PiBzaWduYXR1cmUgPSB7fTsKKyAgICBtRHJtLT5zaWduKG1TZXNzaW9uSWQsIGtleUlkVmVjLCBtZXNzYWdlLCBzaWduYXR1cmUpOworCisgICAgLy8gdmVyaWZ5KCkgc2hhbGwgZmlsbCBtYXRjaAorICAgIGJvb2wgbWF0Y2g7CisgICAgbURybS0+dmVyaWZ5KG1TZXNzaW9uSWQsIGtleUlkVmVjLCBtZXNzYWdlLCBzaWduYXR1cmUsIG1hdGNoKTsKKworICAgIC8vIHNpZ25SU0EoKSBzaGFsbCBmaWxsIHNpZ25hdHVyZQorICAgIG1Ecm0tPnNpZ25SU0EobVNlc3Npb25JZCwgU3RyaW5nOChrUlNBQWxnb3JpdGhtW21GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVCb29sKCldKSwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgIHdyYXBwZWRLZXksIHNpZ25hdHVyZSk7CisKKyAgICBtRHJtLT5yZW1vdmVLZXlzKG1TZXNzaW9uSWQpOworfQorCit2b2lkIERybUZ1enplcjo6aW52b2tlRHJtU2VjdXJlU3RvcEFQSSgpIHsKKyAgICAvLyBnZXRTZWN1cmVTdG9wcygpIHNoYWxsIGZpbGwgc2VjdXJlU3RvcHMKKyAgICBMaXN0PFZlY3Rvcjx1aW50OF90Pj4gc2VjdXJlU3RvcHMgPSB7fTsKKyAgICBtRHJtLT5nZXRTZWN1cmVTdG9wcyhzZWN1cmVTdG9wcyk7CisKKyAgICAvLyBnZXRTZWN1cmVTdG9wSWRzKCkgc2hhbGwgZmlsbCBzZWN1cmVTdG9wSWRzCisgICAgTGlzdDxWZWN0b3I8dWludDhfdD4+IHNlY3VyZVN0b3BJZHMgPSB7fTsKKyAgICBtRHJtLT5nZXRTZWN1cmVTdG9wSWRzKHNlY3VyZVN0b3BJZHMpOworCisgICAgLy8gZ2V0U2VjdXJlU3RvcCgpIHNoYWxsIGZpbGwgc2VjdXJlU3RvcAorICAgIFZlY3Rvcjx1aW50OF90PiBzc2lkID0ge307CisgICAgVmVjdG9yPHVpbnQ4X3Q+IHNlY3VyZVN0b3AgPSB7fTsKKyAgICBtRHJtLT5nZXRTZWN1cmVTdG9wKHNzaWQsIHNlY3VyZVN0b3ApOworCisgICAgbURybS0+cmVtb3ZlU2VjdXJlU3RvcChzc2lkKTsKKworICAgIG1Ecm0tPnJlbGVhc2VTZWN1cmVTdG9wcyhzc2lkKTsKKworICAgIG1Ecm0tPnJlbW92ZUFsbFNlY3VyZVN0b3BzKCk7Cit9CisKK3ZvaWQgRHJtRnV6emVyOjppbnZva2VEcm1PZmZsaW5lTGljZW5zZUFQSSgpIHsKKyAgICAvLyBnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcygpIHNoYWxsIGtleVNldElkcworICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBrZXlTZXRJZHMgPSB7fTsKKyAgICBtRHJtLT5nZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhrZXlTZXRJZHMpOworCisgICAgLy8gZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZSgpIHNoYWxsIGZpbGwgc3RhdGUKKyAgICBWZWN0b3I8dWludDhfdD4gY29uc3Qga2V5U2V0SWRPZmZsaW5lTGljZW5zZSA9IHt9OworICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSBzdGF0ZTsKKyAgICBtRHJtLT5nZXRPZmZsaW5lTGljZW5zZVN0YXRlKGtleVNldElkT2ZmbGluZUxpY2Vuc2UsICZzdGF0ZSk7CisKKyAgICBtRHJtLT5yZW1vdmVPZmZsaW5lTGljZW5zZShrZXlTZXRJZE9mZmxpbmVMaWNlbnNlKTsKK30KKworYm9vbCBEcm1GdXp6ZXI6OmluaXRDcnlwdG8oKSB7CisgICAgbUNyeXB0byA9IG5ldyBDcnlwdG9IYWwoKTsKKyAgICBpZiAoIW1DcnlwdG8pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBEcm1GdXp6ZXI6Omludm9rZUNyeXB0b0NyZWF0ZVBsdWdpbigpIHsKKyAgICBtQ3J5cHRvLT5pbml0Q2hlY2soKTsKKworICAgIG1DcnlwdG8tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGtDbGVhcktleVVVSUQpOworICAgIG1DcnlwdG8tPmNyZWF0ZVBsdWdpbihrQ2xlYXJLZXlVVUlELCBOVUxMLCAwKTsKK30KKwordm9pZCBEcm1GdXp6ZXI6Omludm9rZUNyeXB0b0Rlc3Ryb3lQbHVnaW4oKSB7IG1DcnlwdG8tPmRlc3Ryb3lQbHVnaW4oKTsgfQorCit2b2lkIERybUZ1enplcjo6aW52b2tlQ3J5cHRvRGVjcnlwdChjb25zdCB1aW50OF90ICpkYXRhKSB7CisgICAgbUNyeXB0by0+cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KAorICAgICAgICBrTWltZVR5cGVbbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIGtOdW1NaW1lVHlwZSAtIDEpXSk7CisKKyAgICB1aW50MzJfdCB3aWR0aCA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgICB1aW50MzJfdCBoZWlnaHQgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgICAgbUNyeXB0by0+bm90aWZ5UmVzb2x1dGlvbih3aWR0aCwgaGVpZ2h0KTsKKworICAgIG1DcnlwdG8tPnNldE1lZGlhRHJtU2Vzc2lvbihtU2Vzc2lvbklkKTsKKworICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6UGF0dGVybiBwYXR0ZXJuID0gezAsIDB9OworCisgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IDA7CisgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMSwga01heFN1YlNhbXBsZXMpOworCisgICAgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgc3ViU2FtcGxlc1tudW1TdWJTYW1wbGVzXTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3ViU2FtcGxlczsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IGNsZWFyQnl0ZXMgPQorICAgICAgICAgICAgbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MzJfdD4oMSwga01heE51bUJ5dGVzKTsKKyAgICAgICAgdWludDMyX3QgZW5jcnlwdGVkQnl0ZXMgPQorICAgICAgICAgICAgbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MzJfdD4oMSwga01heE51bUJ5dGVzKTsKKyAgICAgICAgc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSA9IGNsZWFyQnl0ZXM7CisgICAgICAgIHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID0gZW5jcnlwdGVkQnl0ZXM7CisgICAgICAgIHRvdGFsU2l6ZSArPSBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mQ2xlYXJEYXRhOworICAgICAgICB0b3RhbFNpemUgKz0gc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGE7CisgICAgfQorCisgICAgc2l6ZV90IGhlYXBTaXplID0gdG90YWxTaXplICogMjsKKyAgICBzcDxNZW1vcnlEZWFsZXI+IGRlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIoaGVhcFNpemUsICJEcm1GdXp6ZXJNZW1vcnkiKTsKKyAgICBpZiAoIWRlYWxlcikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8SGlkbE1lbW9yeT4gaGVhcCA9IGZyb21IZWFwKGRlYWxlci0+Z2V0TWVtb3J5SGVhcCgpKTsKKyAgICBpZiAoIWhlYXApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQgaGVhcFNlcU51bSA9IG1DcnlwdG8tPnNldEhlYXAoaGVhcCk7CisgICAgaWYgKGhlYXBTZXFOdW0gPCAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBzaXplX3Qgc2VnbWVudEluZGV4ID0gMDsKKyAgICBjb25zdCB1aW50OF90IGtleUlkW0FFU19CTE9DS19TSVpFXSA9IHt9OworICAgIG1lbWNweSgodm9pZCAqKWtleUlkLCBkYXRhLCBBRVNfQkxPQ0tfU0laRSk7CisKKyAgICBjb25zdCB1aW50OF90IGl2W0FFU19CTE9DS19TSVpFXSA9IHt9OworICAgIG1lbXNldCgodm9pZCAqKWl2LCAwLCBBRVNfQkxPQ0tfU0laRSk7CisKKyAgICBjb25zdCBTaGFyZWRCdWZmZXIgc291cmNlQnVmZmVyID0gey5idWZmZXJJZCA9IHNlZ21lbnRJbmRleCwgLm9mZnNldCA9IDAsIC5zaXplID0gdG90YWxTaXplfTsKKworICAgIGNvbnN0IERlc3RpbmF0aW9uQnVmZmVyIGRlc3RCdWZmZXIgPSB7CisgICAgICAgIC50eXBlID0gQnVmZmVyVHlwZTo6U0hBUkVEX01FTU9SWSwKKyAgICAgICAgey5idWZmZXJJZCA9IHNlZ21lbnRJbmRleCwgLm9mZnNldCA9IHRvdGFsU2l6ZSwgLnNpemUgPSB0b3RhbFNpemV9LAorICAgICAgICAuc2VjdXJlTWVtb3J5ID0gbnVsbHB0cn07CisKKyAgICBjb25zdCB1aW50NjRfdCBvZmZzZXQgPSAwOworICAgIEFTdHJpbmcgKmVycm9yRGV0YWlsTXNnID0gbnVsbHB0cjsKKyAgICBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZTsKKyAgICBib29sIHNob3VsZFBhc3NSYW5kb21DcnlwdG9Nb2RlID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUJvb2woKTsKKyAgICBpZiAoc2hvdWxkUGFzc1JhbmRvbUNyeXB0b01vZGUpIHsKKyAgICAgICAgbW9kZSA9IHN0YXRpY19jYXN0PENyeXB0b1BsdWdpbjo6TW9kZT4obUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPHNpemVfdD4oKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbW9kZSA9CisgICAgICAgICAgICBrQ3J5cHRvTW9kZVttRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwga051bUNyeXB0b01vZGUgLSAxKV07CisgICAgfQorICAgIG1DcnlwdG8tPmRlY3J5cHQoa2V5SWQsIGl2LCBtb2RlLCBwYXR0ZXJuLCBzb3VyY2VCdWZmZXIsIG9mZnNldCwgc3ViU2FtcGxlcywgbnVtU3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgIGRlc3RCdWZmZXIsIGVycm9yRGV0YWlsTXNnKTsKKworICAgIGlmIChoZWFwU2VxTnVtID49IDApIHsKKyAgICAgICAgbUNyeXB0by0+dW5zZXRIZWFwKGhlYXBTZXFOdW0pOworICAgIH0KKyAgICBoZWFwLmNsZWFyKCk7Cit9CisKK3ZvaWQgRHJtRnV6emVyOjppbnZva2VEcm0oY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoIWluaXREcm0oKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludm9rZURybUNyZWF0ZVBsdWdpbigpOworICAgIGludm9rZURybU9wZW5TZXNzaW9uKCk7CisgICAgaW52b2tlRHJtU2V0QWxnb3JpdGhtQVBJKCk7CisgICAgaW52b2tlRHJtU2V0TGlzdGVuZXIoKTsKKyAgICBpbnZva2VEcm1Qcm9wZXJ0eUFQSSgpOworICAgIGludm9rZURybURlY3J5cHRFbmNyeXB0QVBJKGRhdGEsIHNpemUpOworICAgIGludm9rZURybVNlY3VyZVN0b3BBUEkoKTsKKyAgICBpbnZva2VEcm1PZmZsaW5lTGljZW5zZUFQSSgpOworICAgIGludm9rZURybUNsb3NlU2Vzc2lvbigpOworICAgIGludm9rZURybURlc3Ryb3lQbHVnaW4oKTsKK30KKwordm9pZCBEcm1GdXp6ZXI6Omludm9rZUNyeXB0byhjb25zdCB1aW50OF90ICpkYXRhKSB7CisgICAgaWYgKCFpbml0Q3J5cHRvKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnZva2VDcnlwdG9DcmVhdGVQbHVnaW4oKTsKKyAgICBpbnZva2VDcnlwdG9EZWNyeXB0KGRhdGEpOworICAgIGludm9rZUNyeXB0b0Rlc3Ryb3lQbHVnaW4oKTsKK30KKwordm9pZCBEcm1GdXp6ZXI6OnByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBtRnV6emVkRGF0YVByb3ZpZGVyID0gbmV3IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKyAgICBpbnZva2VEcm0oZGF0YSwgc2l6ZSk7CisgICAgaW52b2tlQ3J5cHRvKGRhdGEpOworICAgIGRlbGV0ZSBtRnV6emVkRGF0YVByb3ZpZGVyOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKHNpemUgPCBBRVNfQkxPQ0tfU0laRSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgRHJtRnV6emVyIGRybUZ1enplcjsKKyAgICBkcm1GdXp6ZXIucHJvY2VzcyhkYXRhLCBzaXplKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmggYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5oCmluZGV4IDllNDM1MDQuLmM1NmJmMDEgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmgKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuaApAQCAtNjIsNyArNjIsNyBAQAogICAgIHZvaWQgcmVtb3ZlU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCk7CiAgICAgYm9vbCByZWNsYWltU2Vzc2lvbihpbnQgY2FsbGluZ1BpZCk7CiAKLSAgICAvLyBzYW5pdHkgY2hlY2sgQVBJcworICAgIC8vIGluc3BlY3Rpb24gQVBJcwogICAgIHNpemVfdCBnZXRTZXNzaW9uQ291bnQoKSBjb25zdDsKICAgICBib29sIGNvbnRhaW5zU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgY29uc3Q7CiAKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9wcm90b3MvQW5kcm9pZC5icCBiL2RybS9saWJtZWRpYWRybS9wcm90b3MvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGQyMzdhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYm1lZGlhZHJtL3Byb3Rvcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBUaGlzIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSBkcm0gbWV0cmljcyBjb25maWd1cmVkIGZvciBwcm90b2J1ZiBmdWxsIG9uIGhvc3QuCisvLyBJdCBpcyB1c2VkIGJ5IHRoZSBtZXRyaWNzX2R1bXAgdG9vbC4KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitjY19saWJyYXJ5X2hvc3Rfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliZHJtX21ldHJpY3NfcHJvdG9zX2Z1bGxfaG9zdCIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIGluY2x1ZGVfZGlyczogWyJleHRlcm5hbC9wcm90b2J1Zi9zcmMiXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIm1ldHJpY3MucHJvdG8iLAorICAgIF0sCisKKyAgICBwcm90bzogeworICAgICAgICBleHBvcnRfcHJvdG9faGVhZGVyczogdHJ1ZSwKKyAgICAgICAgdHlwZTogImZ1bGwiLAorICAgIH0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgLy8gU3VwcHJlc3MgdW51c2VkIHBhcmFtZXRlciBlcnJvci4gVGhpcyBlcnJvciBvY2N1cnMKKyAgICAgICAgLy8gd2hlbiB1c2luZyB0aGUgbWFwIHR5cGUgaW4gYSBwcm90byBkZWZpbml0aW9uLgorICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5icAppbmRleCA2NTI5Mzg3Li45MjY3ZTc5IDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5icAorKysgYi9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDE0IEBACiAvLyBCdWlsZCBkZWZpbml0aW9ucyBmb3IgdW5pdCB0ZXN0cy4KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiQ291bnRlck1ldHJpY190ZXN0IiwKICAgICBzcmNzOiBbIkNvdW50ZXJNZXRyaWNfdGVzdC5jcHAiXSwKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9BbmRyb2lkLmJwCmluZGV4IDAxMTNjYjguLjU2OWNkYmUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQuYnAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTUgQEAKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLy8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmNsZWFya2V5Y2FzcGx1Z2luIiwKIApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlGZXRjaGVyLmNwcCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5RmV0Y2hlci5jcHAKaW5kZXggY2I2OWY5MS4uNDY2ZTU3MSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlGZXRjaGVyLmNwcAorKysgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUZldGNoZXIuY3BwCkBAIC02Miw4ICs2Miw4IEBACiAgICAgfQogICAgIEFMT0dWKCJkZXNjcmlwdG9yX3NpemU9JXp1IiwgY29udGFpbmVyLmRlc2NyaXB0b3Jfc2l6ZSgpKTsKIAotICAgIC8vIFNhbml0eSBjaGVjayB0byB2ZXJpZnkgdGhhdCB0aGUgQnJvYWRjYXN0RW5jcnlwdG9yIGlzIHNlbmRpbmcgYSBwcm9wZXJseQotICAgIC8vIGZvcm1lZCBFY21Db250YWluZXIuIElmIGl0IGNvbnRhaW5zIHR3byBFY21zLCB0aGUgaWRzIHNob3VsZCBoYXZlIGRpZmZlcmVudAorICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIEJyb2FkY2FzdEVuY3J5cHRvciBpcyBzZW5kaW5nIGEgcHJvcGVybHkgZm9ybWVkCisgICAgLy8gRWNtQ29udGFpbmVyLiBJZiBpdCBjb250YWlucyB0d28gRWNtcywgdGhlIGlkcyBzaG91bGQgaGF2ZSBkaWZmZXJlbnQKICAgICAvLyBwYXJpdHkgKG9uZSBvZGQsIG9uZSBldmVuKS4gVGhpcyBkb2VzIG5vdCBuZWNlc3NhcmlseSBhZmZlY3QgZGVjcnlwdGlvbgogICAgIC8vIGJ1dCBpbmRpY2F0ZXMgYSBwcm9ibGVtIHdpdGggRWNtIGdlbmVyYXRpb24uCiAgICAgaWYgKGNvbnRhaW5lci5kZXNjcmlwdG9yX3NpemUoKSA9PSAyKSB7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVNlc3Npb25MaWJyYXJ5LmggYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVNlc3Npb25MaWJyYXJ5LmgKaW5kZXggYTUzN2U2My4uN2M2ZDg2YyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlTZXNzaW9uTGlicmFyeS5oCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5U2Vzc2lvbkxpYnJhcnkuaApAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogc3RydWN0IEFCdWZmZXI7CkBAIC0zMCw3ICsyOSw3IEBACiBuYW1lc3BhY2UgY2xlYXJrZXljYXMgewogY2xhc3MgS2V5RmV0Y2hlcjsKIAotY2xhc3MgQ2xlYXJLZXlDYXNTZXNzaW9uIDogcHVibGljIFJlZkJhc2UgeworY2xhc3MgQ2xlYXJLZXlDYXNTZXNzaW9uIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBDbGVhcktleUNhc1Nlc3Npb24oQ2FzUGx1Z2luICpwbHVnaW4pOwogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLmJwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5icAppbmRleCA1NzU4NjNjLi45YWQ4ZDFlIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogIkNsZWFyS2V5RmV0Y2hlclRlc3QiLAogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL0FuZHJvaWQuYnAKaW5kZXggZThhM2M2Zi4uNmY2OGM3NyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTUgQEAKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLy8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYm1vY2tjYXNwbHVnaW4iLAogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9BbmRyb2lkLmJwCmluZGV4IDJjNjc0ZTEuLjdlZDhiODggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwxNSBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAvLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGliY2xlYXJrZXljb21tb24iLAogICAgIHZlbmRvcjogdHJ1ZSwKQEAgLTM1LDQgKzQ0LDMgQEAKICAgICAgICAgaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKICAgICB9LAogfQotCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L0FuZHJvaWQuYnAKaW5kZXggOTgwM2QzMi4uNGI1Mzg5YSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTUgQEAKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLy8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmRybWNsZWFya2V5cGx1Z2luIiwKICAgICB2ZW5kb3I6IHRydWUsCkBAIC02MCw0ICs2OSwzIEBACiAgICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCiAgICAgfSwKIH0KLQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC90ZXN0cy9BbmRyb2lkLmJwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDQ0MTk4NjUuLmI5N2U5MjQgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvdGVzdHMvQW5kcm9pZC5icAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTE3LDYgKzE3LDE1IEBACiAvLyBCdWlsZHMgQ2xlYXJLZXkgRHJtIFRlc3RzCiAvLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJDbGVhcktleURybVVuaXRUZXN0IiwKICAgICB2ZW5kb3I6IHRydWUsCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0FuZHJvaWQuYnAKaW5kZXggYzZhZmE2MC4uYzQ5ZDVmZSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTkgQEAKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLy8KIAorLy8gKioqIFRISVMgUEFDS0FHRSBIQVMgU1BFQ0lBTCBMSUNFTlNJTkcgQ09ORElUSU9OUy4gIFBMRUFTRQorLy8gICAgIENPTlNVTFQgVEhFIE9XTkVSUyBBTkQgb3BlbnNvdXJjZS1saWNlbnNpbmdAZ29vZ2xlLmNvbSBCRUZPUkUKKy8vICAgICBERVBFTkRJTkcgT04gSVQgSU4gWU9VUiBQUk9KRUNULiAqKioKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIC8vICAgbGVnYWN5X2J5X2V4Y2VwdGlvbl9vbmx5IChieSBleGNlcHRpb24gb25seSkKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2RlZmF1bHRzIHsKICAgICBuYW1lOiAiY2xlYXJrZXlfc2VydmljZV9kZWZhdWx0cyIsCiAgICAgdmVuZG9yOiB0cnVlLApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9NZW1vcnlGaWxlU3lzdGVtLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvTWVtb3J5RmlsZVN5c3RlbS5jcHAKaW5kZXggZDI5YWNhYy4uMzJjZjJkYyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9NZW1vcnlGaWxlU3lzdGVtLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwCkBAIC0xNSw3ICsxNSw3IEBACiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBzdGQ6OnN0cmluZyBNZW1vcnlGaWxlU3lzdGVtOjpHZXRGaWxlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgewotICAgIHNpemVfdCBpbmRleCA9IHBhdGguZmluZF9sYXN0X29mKCIvIik7CisgICAgc2l6ZV90IGluZGV4ID0gcGF0aC5maW5kX2xhc3Rfb2YoJy8nKTsKICAgICBpZiAoaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKICAgICAgICAgcmV0dXJuIHBhdGguc3Vic3RyKGluZGV4KzEpOwogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQuYnAKaW5kZXggZGQyYWQ3Yi4uMjBkZmI0YSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTUgQEAKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLy8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYm1vY2tkcm1jcnlwdG9wbHVnaW4iLAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9Ecm1NYW5hZ2VyQ2xpZW50LmggYi9pbmNsdWRlL2RybS9Ecm1NYW5hZ2VyQ2xpZW50LmgKaW5kZXggODY2ZWRhYy4uYTM4YWE5YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vRHJtTWFuYWdlckNsaWVudC5oCisrKyBiL2luY2x1ZGUvZHJtL0RybU1hbmFnZXJDbGllbnQuaApAQCAtMzE4LDcgKzMxOCw3IEBACiAKICAgICAvKioKICAgICAgKiBSZW1vdmVzIGFsbCB0aGUgcmlnaHRzIGluZm9ybWF0aW9uIG9mIGVhY2ggcGx1Zy1pbiBhc3NvY2lhdGVkIHdpdGgKLSAgICAgKiBEUk0gZnJhbWV3b3JrLiBXaWxsIGJlIHVzZWQgaW4gbWFzdGVyIHJlc2V0CisgICAgICogRFJNIGZyYW1ld29yay4KICAgICAgKgogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01pY3JvcGhvbmVJbmZvLmggYi9pbmNsdWRlL21lZGlhL01pY3JvcGhvbmVJbmZvLmgKaW5kZXggMjI4N2FjYS4uMGEyNGIwMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NaWNyb3Bob25lSW5mby5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWljcm9waG9uZUluZm8uaApAQCAtMjA1LDExICsyMDUsMTEgQEAKIHByaXZhdGU6CiAgICAgc3RhdHVzX3QgcmVhZEZsb2F0VmVjdG9yKAogICAgICAgICAgICAgY29uc3QgUGFyY2VsKiBwYXJjZWwsIFZlY3RvcjxmbG9hdD4gKnZlY3RvclB0ciwgc2l6ZV90IGRlZmF1bHRMZW5ndGgpIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dmVjdG9yPGZsb2F0Pj4gdjsKKyAgICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxmbG9hdD4+IHY7CiAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHBhcmNlbC0+cmVhZEZsb2F0VmVjdG9yKCZ2KTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgdmVjdG9yUHRyLT5jbGVhcigpOwotICAgICAgICBpZiAodi5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZXIgOiAqdikgewogICAgICAgICAgICAgICAgIHZlY3RvclB0ci0+cHVzaF9iYWNrKGl0ZXIpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaCBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKaW5kZXggOWNhYmQ4Yi4uMjAwZTkyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCkBAIC0xODIsNiArMTgyLDcgQEAKICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHNldCBieSBBdWRpb1RyYWNrLnNldEJ1ZmZlclNpemVJbkZyYW1lcygpLgogICAgICAgICAgICAgICAgIC8vIEEgd3JpdGUgd2lsbCBub3QgZmlsbCB0aGUgYnVmZmVyIGFib3ZlIHRoaXMgbGltaXQuCiAgICAgdm9sYXRpbGUgICAgdWludDMyX3QgICBtQnVmZmVyU2l6ZUluRnJhbWVzOyAgLy8gZWZmZWN0aXZlIHNpemUgb2YgdGhlIGJ1ZmZlcgorICAgIHZvbGF0aWxlICAgIHVpbnQzMl90ICAgbVN0YXJ0VGhyZXNob2xkSW5GcmFtZXM7IC8vIG1pbiBmcmFtZXMgaW4gYnVmZmVyIHRvIHN0YXJ0IHN0cmVhbWluZwogCiBwdWJsaWM6CiAKQEAgLTIxNiw2ICsyMTcsOCBAQAogICAgIH07CiAKICAgICBzaXplX3QgZnJhbWVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZUNvdW50OyB9CisgICAgdWludDMyX3QgZ2V0U3RhcnRUaHJlc2hvbGRJbkZyYW1lcygpIGNvbnN0OworICAgIHVpbnQzMl90IHNldFN0YXJ0VGhyZXNob2xkSW5GcmFtZXModWludDMyX3Qgc3RhcnRUaHJlc2hvbGRJbkZyYW1lcyk7CiAKIHByb3RlY3RlZDoKICAgICAvLyBUaGVzZSByZWZlciB0byBzaGFyZWQgbWVtb3J5LCBhbmQgYXJlIHZpcnR1YWwgYWRkcmVzc2VzIHdpdGggcmVzcGVjdCB0byB0aGUgY3VycmVudCBwcm9jZXNzLgpkaWZmIC0tZ2l0IGEvbWVkaWEvT1dORVJTIGIvbWVkaWEvT1dORVJTCmluZGV4IDFhZmMyNTMuLjNlMTk0ZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL09XTkVSUworKysgYi9tZWRpYS9PV05FUlMKQEAgLTgsMTMgKzgsMTQgQEAKIGh1bmdhQGdvb2dsZS5jb20KIGppYWJpbkBnb29nbGUuY29tCiBqbXRyaXZpQGdvb2dsZS5jb20KLWtyb2NhcmRAZ29vZ2xlLmNvbQogbGFqb3NAZ29vZ2xlLmNvbQogbWFyY29uZUBnb29nbGUuY29tCiBtbmFnYW5vdkBnb29nbGUuY29tCituY2hhbGtvQGdvb2dsZS5jb20KIHBhd2luQGdvb2dsZS5jb20KIHBoaWxidXJrQGdvb2dsZS5jb20KIHBtY2xlYW5AZ29vZ2xlLmNvbQorcXV4aWFuZ2ZhbmdAZ29vZ2xlLmNvbQogcmFjaGFkQGdvb2dsZS5jb20KIHJhZ29AZ29vZ2xlLmNvbQogcm9iZXJ0c2hpaEBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tawppbmRleCBjZjFjMTRjLi5hY2MxYjgyIDEwMDY0NAotLS0gYS9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKQEAgLTQzLDYgKzQzLDkgQEAKIAlleHRlcm5hbC9zb25pYyBcCiAKIExPQ0FMX01PRFVMRSA6PSBhdWRpb3NlcnZlcgorTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCitMT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCitMT0NBTF9OT1RJQ0VfRklMRSA6PSAkKExPQ0FMX1BBVEgpLy4uLy4uL05PVElDRQogCiBMT0NBTF9JTklUX1JDIDo9IGF1ZGlvc2VydmVyLnJjCiAKZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKaW5kZXggZjlmNGYzMS4uMTczMDlkZCAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKQEAgLTQ5LDcgKzQ5LDEyIEBACiAKICAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CiAKKyNpZiAxCisgICAgLy8gRklYTUUgU2VlIGJ1ZyAxNjU3MDIzOTQgYW5kIGJ1ZyAxNjg1MTE0ODUKKyAgICBjb25zdCBib29sIGRvTG9nID0gZmFsc2U7CisjZWxzZQogICAgIGJvb2wgZG9Mb2cgPSAoYm9vbCkgcHJvcGVydHlfZ2V0X2Jvb2woInJvLnRlc3RfaGFybmVzcyIsIDApOworI2VuZGlmCiAKICAgICBwaWRfdCBjaGlsZFBpZDsKICAgICAvLyBGSVhNRSBUaGUgYWR2YW50YWdlIG9mIG1ha2luZyB0aGUgcHJvY2VzcyBjb250YWluaW5nIG1lZGlhLmxvZyBzZXJ2aWNlIHRoZSBwYXJlbnQgcHJvY2VzcyBvZgpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQW5kcm9pZC5icCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FuZHJvaWQuYnAKaW5kZXggZjgxN2M3Ni4uMTZjZjkyMCAxMDA2NDQKLS0tIGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQW5kcm9pZC5icAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMS4wIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL0FuZHJvaWQuYnAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvQW5kcm9pZC5icAppbmRleCBlZTVhNzU3Li5iMzk4NzFlIDEwMDY0NAotLS0gYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogIlZ0c1ZuZGtIaWRsQnVmZmVycG9vbFYxXzBUYXJnZXRTaW5nbGVUZXN0IiwKICAgICBkZWZhdWx0czogWyJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9tdWx0aS5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvbXVsdGkuY3BwCmluZGV4IDE3OTY4MTkuLmQ4Y2MyODUgMTAwNjQ0Ci0tLSBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9tdWx0aS5jcHAKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL211bHRpLmNwcApAQCAtMjE1LDcgKzIxNSw3IEBACiB9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICBzZXRlbnYoIlRSRUJMRV9URVNUSU5HX09WRVJSSURFIiwgInRydWUiLCB0cnVlKTsKKyAgYW5kcm9pZDo6aGFyZHdhcmU6OmRldGFpbHM6OnNldFRyZWJsZVRlc3RpbmdPdmVycmlkZSh0cnVlKTsKICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CiAgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CiAgIExPRyhJTkZPKSA8PCAiVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuY3BwCmluZGV4IDYxMTFmZWEuLjFkMjU2MmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5jcHAKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmNwcApAQCAtMzksNiArMzksOCBAQAogCiAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pbkFsbG9jQnl0ZXNGb3JFdmljdGlvbiA9IDEwMjQqMTAyNCoxNTsKICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWluQnVmZmVyQ291bnRGb3JFdmljdGlvbiA9IDI1OworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXhVbnVzZWRCdWZmZXJDb3VudCA9IDY0OworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtVbnVzZWRCdWZmZXJDb3VudFRhcmdldCA9IGtNYXhVbnVzZWRCdWZmZXJDb3VudCAtIDE2OwogCiAgICAgc3RhdGljIGNvbnN0ZXhwciBuc2Vjc190IGtFdmljdEdyYW51bGFyaXR5TnMgPSAxMDAwMDAwMDAwOyAvLyAxIHNlYwogICAgIHN0YXRpYyBjb25zdGV4cHIgbnNlY3NfdCBrRXZpY3REdXJhdGlvbk5zID0gNTAwMDAwMDAwMDsgLy8gNSBzZWNzCkBAIC03MjQsOSArNzI2LDExIEBACiB9CiAKIHZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7Ci0gICAgaWYgKGNsZWFyQ2FjaGUgfHwgbVRpbWVzdGFtcFVzID4gbUxhc3RDbGVhblVwVXMgKyBrQ2xlYW5VcER1cmF0aW9uVXMpIHsKKyAgICBpZiAoY2xlYXJDYWNoZSB8fCBtVGltZXN0YW1wVXMgPiBtTGFzdENsZWFuVXBVcyArIGtDbGVhblVwRHVyYXRpb25VcyB8fAorICAgICAgICAgICAgbVN0YXRzLmJ1ZmZlcnNOb3RJblVzZSgpID4ga01heFVudXNlZEJ1ZmZlckNvdW50KSB7CiAgICAgICAgIG1MYXN0Q2xlYW5VcFVzID0gbVRpbWVzdGFtcFVzOwotICAgICAgICBpZiAobVRpbWVzdGFtcFVzID4gbUxhc3RMb2dVcyArIGtMb2dEdXJhdGlvblVzKSB7CisgICAgICAgIGlmIChtVGltZXN0YW1wVXMgPiBtTGFzdExvZ1VzICsga0xvZ0R1cmF0aW9uVXMgfHwKKyAgICAgICAgICAgICAgICBtU3RhdHMuYnVmZmVyc05vdEluVXNlKCkgPiBrTWF4VW51c2VkQnVmZmVyQ291bnQpIHsKICAgICAgICAgICAgIG1MYXN0TG9nVXMgPSBtVGltZXN0YW1wVXM7CiAgICAgICAgICAgICBBTE9HRCgiYnVmZmVycG9vbDIgJXAgOiAlenUoJXp1IHNpemUpIHRvdGFsIGJ1ZmZlcnMgLSAiCiAgICAgICAgICAgICAgICAgICAiJXp1KCV6dSBzaXplKSB1c2VkIGJ1ZmZlcnMgLSAlenUvJXp1IChyZWN5Y2xlL2FsbG9jKSAtICIKQEAgLTczNyw4ICs3NDEsOSBAQAogICAgICAgICAgICAgICAgICAgbVN0YXRzLm1Ub3RhbEZldGNoZXMsIG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMpOwogICAgICAgICB9CiAgICAgICAgIGZvciAoYXV0byBmcmVlSXQgPSBtRnJlZUJ1ZmZlcnMuYmVnaW4oKTsgZnJlZUl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKTspIHsKLSAgICAgICAgICAgIGlmICghY2xlYXJDYWNoZSAmJiAobVN0YXRzLm1TaXplQ2FjaGVkIDwga01pbkFsbG9jQnl0ZXNGb3JFdmljdGlvbgotICAgICAgICAgICAgICAgICAgICB8fCBtQnVmZmVycy5zaXplKCkgPCBrTWluQnVmZmVyQ291bnRGb3JFdmljdGlvbikpIHsKKyAgICAgICAgICAgIGlmICghY2xlYXJDYWNoZSAmJiBtU3RhdHMuYnVmZmVyc05vdEluVXNlKCkgPD0ga1VudXNlZEJ1ZmZlckNvdW50VGFyZ2V0ICYmCisgICAgICAgICAgICAgICAgICAgIChtU3RhdHMubVNpemVDYWNoZWQgPCBrTWluQWxsb2NCeXRlc0ZvckV2aWN0aW9uIHx8CisgICAgICAgICAgICAgICAgICAgICBtQnVmZmVycy5zaXplKCkgPCBrTWluQnVmZmVyQ291bnRGb3JFdmljdGlvbikpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF1dG8gaXQgPSBtQnVmZmVycy5maW5kKCpmcmVlSXQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuaAppbmRleCBjZDFiNGQwLi4zZDM5OTQxIDEwMDY0NAotLS0gYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuaAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuaApAQCAtMTkzLDYgKzE5MywxMiBAQAogICAgICAgICAgICAgICAgIDogbVNpemVDYWNoZWQoMCksIG1CdWZmZXJzQ2FjaGVkKDApLCBtU2l6ZUluVXNlKDApLCBtQnVmZmVyc0luVXNlKDApLAogICAgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMoMCksIG1Ub3RhbFJlY3ljbGVzKDApLCBtVG90YWxUcmFuc2ZlcnMoMCksIG1Ub3RhbEZldGNoZXMoMCkge30KIAorICAgICAgICAgICAgLy8vICMgb2YgY3VycmVudGx5IHVudXNlZCBidWZmZXJzCisgICAgICAgICAgICBzaXplX3QgYnVmZmVyc05vdEluVXNlKCkgY29uc3QgeworICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG1CdWZmZXJzQ2FjaGVkID49IG1CdWZmZXJzSW5Vc2UpOworICAgICAgICAgICAgICAgIHJldHVybiBtQnVmZmVyc0NhY2hlZCAtIG1CdWZmZXJzSW5Vc2U7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vLyBBIG5ldyBidWZmZXIgaXMgYWxsb2NhdGVkIG9uIGFuIGFsbG9jYXRpb24gcmVxdWVzdC4KICAgICAgICAgICAgIHZvaWQgb25CdWZmZXJBbGxvY2F0ZWQoc2l6ZV90IGFsbG9jU2l6ZSkgewogICAgICAgICAgICAgICAgIG1TaXplQ2FjaGVkICs9IGFsbG9jU2l6ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FuZHJvaWQuYnAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BbmRyb2lkLmJwCmluZGV4IDUzNmY3NWUuLjBkMWZlMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2RlZmF1bHRzIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAtZGVmYXVsdCIsCiAgICAgc3JjczogWwpAQCAtNDksNCArNTgsMyBAQAogICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgIH0sCiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclBvb2xDbGllbnQuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5jcHAKaW5kZXggMzQyZmVmNi4uY2RhMjNmZiAxMDA2NDQKLS0tIGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5jcHAKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5jcHAKQEAgLTI5LDkgKzI5LDExIEBACiBuYW1lc3BhY2UgVjJfMCB7CiBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24gewogCi1zdGF0aWMgY29uc3RleHByIGludDY0X3Qga1JlY2VpdmVUaW1lb3V0VXMgPSAxMDAwMDAwOyAvLyAxMDBtcworc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtSZWNlaXZlVGltZW91dFVzID0gMjAwMDAwMDsgLy8gMnMKIHN0YXRpYyBjb25zdGV4cHIgaW50IGtQb3N0TWF4UmV0cnkgPSAzOwogc3RhdGljIGNvbnN0ZXhwciBpbnQga0NhY2hlVHRsVXMgPSAxMDAwMDAwOyAvLyBUT0RPOiB0dW5lCitzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWF4Q2FjaGVkQnVmZmVyQ291bnQgPSA2NDsKK3N0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtDYWNoZWRCdWZmZXJDb3VudFRhcmdldCA9IGtNYXhDYWNoZWRCdWZmZXJDb3VudCAtIDE2OwogCiBjbGFzcyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsCiAgICAgICAgIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gewpAQCAtMTM2LDYgKzEzOCwxMCBAQAogICAgICAgICAgICAgLS1tQWN0aXZlOwogICAgICAgICAgICAgbUxhc3RDaGFuZ2VVcyA9IGdldFRpbWVzdGFtcE5vdygpOwogICAgICAgICB9CisKKyAgICAgICAgaW50IGNhY2hlZEJ1ZmZlckNvdW50KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1CdWZmZXJzLnNpemUoKSAtIG1BY3RpdmU7CisgICAgICAgIH0KICAgICB9IG1DYWNoZTsKIAogICAgIC8vIEZNUSAtIHJlbGVhc2Ugbm90aWZpZXIKQEAgLTY2OCwxMCArNjc0LDEyIEBACiAvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKIHZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6ZXZpY3RDYWNoZXMoYm9vbCBjbGVhckNhY2hlKSB7CiAgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKLSAgICBpZiAobm93ID49IG1MYXN0RXZpY3RDYWNoZVVzICsga0NhY2hlVHRsVXMgfHwgY2xlYXJDYWNoZSkgeworICAgIGlmIChub3cgPj0gbUxhc3RFdmljdENhY2hlVXMgKyBrQ2FjaGVUdGxVcyB8fAorICAgICAgICAgICAgY2xlYXJDYWNoZSB8fCBtQ2FjaGUuY2FjaGVkQnVmZmVyQ291bnQoKSA+IGtNYXhDYWNoZWRCdWZmZXJDb3VudCkgewogICAgICAgICBzaXplX3QgZXZpY3RlZCA9IDA7CiAgICAgICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCk7KSB7Ci0gICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmhhc0NhY2hlKCkgJiYgKGl0LT5zZWNvbmQtPmV4cGlyZSgpIHx8IGNsZWFyQ2FjaGUpKSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmhhc0NhY2hlKCkgJiYgKGl0LT5zZWNvbmQtPmV4cGlyZSgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckNhY2hlIHx8IG1DYWNoZS5jYWNoZWRCdWZmZXJDb3VudCgpID4ga0NhY2hlZEJ1ZmZlckNvdW50VGFyZ2V0KSkgewogICAgICAgICAgICAgICAgIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGl0KTsKICAgICAgICAgICAgICAgICArK2V2aWN0ZWQ7CiAgICAgICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggOGI0NGY2MS4uZDZkYjIwMiAxMDA2NDQKLS0tIGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiVnRzVm5ka0hpZGxCdWZmZXJwb29sVjJfMFRhcmdldFNpbmdsZVRlc3QiLAogICAgIGRlZmF1bHRzOiBbIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvbXVsdGkuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvbXVsdGkuY3BwCmluZGV4IDY4YjY5OTIuLmI0MDgzOGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL211bHRpLmNwcAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9tdWx0aS5jcHAKQEAgLTIxNSw3ICsyMTUsNyBAQAogfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgc2V0ZW52KCJUUkVCTEVfVEVTVElOR19PVkVSUklERSIsICJ0cnVlIiwgdHJ1ZSk7CisgIGFuZHJvaWQ6OmhhcmR3YXJlOjpkZXRhaWxzOjpzZXRUcmVibGVUZXN0aW5nT3ZlcnJpZGUodHJ1ZSk7CiAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwogICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOwogICBMT0coSU5GTykgPDwgIlRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9BbmRyb2lkLmJwCmluZGV4IDllY2E1ODUuLmM1NDdlODUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsMjMgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlYzJfY29tcG9uZW50c19hYWNfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWMyX2NvbXBvbmVudHNfYWFjX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hYWNkZWMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCkBAIC0xNSw3ICszNCw3IEBACiAgICAgXSwKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2FhY2VuYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5jcHAKaW5kZXggNjc3ZjMxNi4uMzMyNjk2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5jcHAKQEAgLTU1LDYgKzU1LDggQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmFhYy5kZWNvZGVyIjsKK2NvbnN0ZXhwciBzaXplX3Qga0RlZmF1bHRPdXRwdXRQb3J0RGVsYXkgPSAyOworY29uc3RleHByIHNpemVfdCBrTWF4T3V0cHV0UG9ydERlbGF5ID0gMTY7CiAKIGNsYXNzIEMyU29mdEFhY0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKIHB1YmxpYzoKQEAgLTczLDcgKzc1LDkgQEAKIAogICAgICAgICBhZGRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbE91dHB1dERlbGF5LCBDMl9QQVJBTUtFWV9PVVRQVVRfREVMQVkpCi0gICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0KDJ1KSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQoa0RlZmF1bHRPdXRwdXRQb3J0RGVsYXkpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUFjdHVhbE91dHB1dERlbGF5LCB2YWx1ZSkuaW5SYW5nZSgwLCBrTWF4T3V0cHV0UG9ydERlbGF5KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQWN0dWFsT3V0cHV0RGVsYXkpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQogICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKIAogICAgICAgICBhZGRQYXJhbWV0ZXIoCkBAIC0yNjMsNiArMjY3LDcgQEAKICAgICAgIG1BQUNEZWNvZGVyKG51bGxwdHIpLAogICAgICAgbVN0cmVhbUluZm8obnVsbHB0ciksCiAgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAorICAgICAgbU91dHB1dFBvcnREZWxheShrRGVmYXVsdE91dHB1dFBvcnREZWxheSksCiAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyKG51bGxwdHIpIHsKIH0KIApAQCAtODc3LDEwICs4ODIsMTQgQEAKICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAogICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KGN1cnJlbnRCb29zdEZhY3RvcikpOwogCi0gICAgICAgICAgICBDMlN0cmVhbURyY0NvbXByZXNzaW9uTW9kZVR1bmluZzo6aW5wdXQgY3VycmVudENvbXByZXNzTW9kZSgwdSwKLSAgICAgICAgICAgICAgICAgICAgKEMyQ29uZmlnOjpkcmNfY29tcHJlc3Npb25fbW9kZV90KSBjb21wcmVzc01vZGUpOwotICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoY3VycmVudENvbXByZXNzTW9kZSkpOworICAgICAgICAgICAgaWYgKGFuZHJvaWRfZ2V0X2RldmljZV9hcGlfbGV2ZWwoKSA8IF9fQU5EUk9JRF9BUElfU19fKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgdXNlZCB0byByZXBvcnQgRFJDIGNvbXByZXNzaW9uIG1vZGUgaW4gdGhlIG91dHB1dCBmb3JtYXQKKyAgICAgICAgICAgICAgICAvLyBpbiBRIGFuZCBSLCBidXQgc3RvcHBlZCBkb2luZyB0aGF0IGluIFMKKyAgICAgICAgICAgICAgICBDMlN0cmVhbURyY0NvbXByZXNzaW9uTW9kZVR1bmluZzo6aW5wdXQgY3VycmVudENvbXByZXNzTW9kZSgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChDMkNvbmZpZzo6ZHJjX2NvbXByZXNzaW9uX21vZGVfdCkgY29tcHJlc3NNb2RlKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoY3VycmVudENvbXByZXNzTW9kZSkpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBDMlN0cmVhbURyY0VuY29kZWRUYXJnZXRMZXZlbFR1bmluZzo6aW5wdXQgY3VycmVudEVuY29kZWRUYXJnZXRMZXZlbCgwdSwKICAgICAgICAgICAgICAgICAgICAgKEMyRmxvYXRWYWx1ZSkgKGVuY1RhcmdldExldmVsKi0wLjI1KSk7CkBAIC05MTEsNiArOTIwLDI5IEBACiAKICAgICBpbnQzMl90IG91dHB1dERlbGF5ID0gbVN0cmVhbUluZm8tPm91dHB1dERlbGF5ICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOwogCisgICAgc2l6ZV90IG51bVNhbXBsZXNJbk91dHB1dCA9IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisgICAgaWYgKG51bVNhbXBsZXNJbk91dHB1dCA+IDApIHsKKyAgICAgICAgc2l6ZV90IGFjdHVhbE91dHB1dFBvcnREZWxheSA9IChvdXRwdXREZWxheSArIG51bVNhbXBsZXNJbk91dHB1dCAtIDEpIC8gbnVtU2FtcGxlc0luT3V0cHV0OworICAgICAgICBpZiAoYWN0dWFsT3V0cHV0UG9ydERlbGF5ID4gbU91dHB1dFBvcnREZWxheSkgeworICAgICAgICAgICAgbU91dHB1dFBvcnREZWxheSA9IGFjdHVhbE91dHB1dFBvcnREZWxheTsKKyAgICAgICAgICAgIEFMT0dWKCJOZXcgT3V0cHV0IHBvcnQgZGVsYXkgJXp1ICIsIG1PdXRwdXRQb3J0RGVsYXkpOworCisgICAgICAgICAgICBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0IG91dHB1dFBvcnREZWxheShtT3V0cHV0UG9ydERlbGF5KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgICAgICAgICAgbUludGYtPmNvbmZpZyh7Jm91dHB1dFBvcnREZWxheX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShvdXRwdXRQb3J0RGVsYXkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgb3V0cHV0IGRlbGF5Iik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAgICAgbUJ1ZmZlcnNJbmZvLnB1c2hfYmFjayhzdGQ6Om1vdmUoaW5JbmZvKSk7CiAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKICAgICBpZiAoIWVvcyAmJiBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA8IG91dHB1dERlbGF5KSB7CkBAIC0xMDYxLDExICsxMDkzLDEzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QWFjRGVjRmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBmYWN0b3J5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5oCmluZGV4IDk2NWMyOWUuLjk4NjE4N2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmgKQEAgLTU3LDYgKzU3LDcgQEAKICAgICBzaXplX3QgbUlucHV0QnVmZmVyQ291bnQ7CiAgICAgc2l6ZV90IG1PdXRwdXRCdWZmZXJDb3VudDsKICAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBzaXplX3QgbU91dHB1dFBvcnREZWxheTsKICAgICBzdHJ1Y3QgSW5mbyB7CiAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXg7CiAgICAgICAgIHNpemVfdCBidWZmZXJTaXplOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRW5jLmNwcAppbmRleCAyZTg1OTE1Li5kODY1YWIyIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRW5jLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRW5jLmNwcApAQCAtMjcyLDggKzI3Miw5IEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAotICAgIGlmIChzYnJNb2RlICE9IC0xICYmIGFhY1Byb2ZpbGUgPT0gQzJDb25maWc6OlBST0ZJTEVfQUFDX0VMRCkgewotICAgICAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19TQlJfTU9ERSwgc2JyTW9kZSkpIHsKKyAgICBpZiAoc2JyTW9kZSAhPSBDMkNvbmZpZzo6QUFDX1NCUl9BVVRPICYmIGFhY1Byb2ZpbGUgPT0gQzJDb25maWc6OlBST0ZJTEVfQUFDX0VMRCkgeworICAgICAgICBpbnQgYWFjU2JyTW9kZSA9IHNick1vZGUgIT0gQzJDb25maWc6OkFBQ19TQlJfT0ZGOworICAgICAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19TQlJfTU9ERSwgYWFjU2JyTW9kZSkpIHsKICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CkBAIC02OTIsMTEgKzY5MywxMyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEFhY0VuY0ZhY3RvcnkoKTsKIH0KIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgZmFjdG9yeTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0FuZHJvaWQuYnAKaW5kZXggY2UyNWJjOS4uMTQxOGJhNSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0FuZHJvaWQuYnAKQEAgLTEsNCArMSwyMyBAQAotY2NfbGlicmFyeV9zaGFyZWQgeworcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjMl9jb21wb25lbnRzX2Ftcl9uYl93Yl9saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlYzJfY29tcG9uZW50c19hbXJfbmJfd2JfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZGVjIiwKICAgICBkZWZhdWx0czogWwogICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLApAQCAtMjEsNyArNDAsNyBAQAogICAgIF0sCiB9CiAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hbXJ3YmRlYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKQEAgLTQwLDcgKzU5LDcgQEAKICAgICBdLAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYW1ybmJlbmMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCkBAIC01OCw3ICs3Nyw3IEBACiAgICAgXSwKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2FtcndiZW5jIiwKICAgICBkZWZhdWx0czogWwogICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtckRlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yRGVjLmNwcAppbmRleCBmNzk0M2JlLi5jMDhlMDJiIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yRGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yRGVjLmNwcApAQCAtNDIwLDExICs0MjAsMTMgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBTVJEZWNGYWN0b3J5KCk7CiB9CiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgZGVsZXRlIGZhY3Rvcnk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmNwcAppbmRleCBlMmQ4Y2I2Li5iYjYzZTFmIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5jcHAKQEAgLTMzNywxMSArMzM3LDEzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QW1yTmJFbmNGYWN0b3J5KCk7CiB9CiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgZGVsZXRlIGZhY3Rvcnk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmNwcAppbmRleCA4NGFlNGI3Li44NDcyOGFlIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5jcHAKQEAgLTQxMSwxMSArNDExLDEzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QW1yV2JFbmNGYWN0b3J5KCk7CiB9CiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgZGVsZXRlIGZhY3Rvcnk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9BbmRyb2lkLmJwCmluZGV4IDYxZGJkNGMuLmNiOTgzN2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsMTMgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2F2MWRlY19hb20iLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwCmluZGV4IGM3MDQ2Y2IuLmMwOGNkNTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwCkBAIC01MDYsMzAgKzUwNiwyOCBAQAogfQogCiBzdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKLSAgICAgICAgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAorICAgICAgICB1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLAorICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAogICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAogICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAogICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7Ci0gICAgdWludDhfdCogZHN0U3RhcnQgPSBkc3Q7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7Ci0gICAgICAgIG1lbWNweShkc3QsIHNyY1ksIHdpZHRoKTsKKyAgICAgICAgbWVtY3B5KGRzdFksIHNyY1ksIHdpZHRoKTsKICAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOwotICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZTsKKyAgICAgICAgZHN0WSArPSBkc3RZU3RyaWRlOwogICAgIH0KIAotICAgIGRzdCA9IGRzdFN0YXJ0ICsgZHN0WVN0cmlkZSAqIGhlaWdodDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgICAgICAgbWVtY3B5KGRzdCwgc3JjViwgd2lkdGggLyAyKTsKKyAgICAgICAgbWVtY3B5KGRzdFYsIHNyY1YsIHdpZHRoIC8gMik7CiAgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKLSAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOwogICAgIH0KIAotICAgIGRzdCA9IGRzdFN0YXJ0ICsgKGRzdFlTdHJpZGUgKiBoZWlnaHQpICsgKGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3QsIHNyY1UsIHdpZHRoIC8gMik7CisgICAgICAgIG1lbWNweShkc3RVLCBzcmNVLCB3aWR0aCAvIDIpOwogICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7Ci0gICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKICAgICB9CiB9CiAKQEAgLTU5NiwxNiArNTk0LDEyIEBACiAgICAgcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcih1aW50OF90ICpkc3QsCitzdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcigKKyAgICAgICAgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKLSAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7Ci0KLSAgICB1aW50OF90ICpkc3RZID0gKHVpbnQ4X3QgKilkc3Q7Ci0gICAgc2l6ZV90IGRzdFlTaXplID0gZHN0WVN0cmlkZSAqIGhlaWdodDsKLSAgICBzaXplX3QgZHN0VVZTaXplID0gZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyOwotICAgIHVpbnQ4X3QgKmRzdFYgPSBkc3RZICsgZHN0WVNpemU7Ci0gICAgdWludDhfdCAqZHN0VSA9IGRzdFYgKyBkc3RVVlNpemU7CisgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCisgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgewogCiAgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewogICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKQEAgLTY5Niw3ICs2OTAsOSBAQAogICAgICAgICAgIGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCksIG1XaWR0aCwgbUhlaWdodCwKICAgICAgICAgICAoaW50KSooaW50NjRfdCopaW1nLT51c2VyX3ByaXYpOwogCi0gICAgdWludDhfdCogZHN0ID0gY29uc3RfY2FzdDx1aW50OF90Kj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgdWludDhfdCogZHN0WSA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHVpbnQ4X3QqIGRzdFUgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgICB1aW50OF90KiBkc3RWID0gY29uc3RfY2FzdDx1aW50OF90Kj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSk7CiAgICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBpbWctPnN0cmlkZVtBT01fUExBTkVfWV07CiAgICAgc2l6ZV90IHNyY1VTdHJpZGUgPSBpbWctPnN0cmlkZVtBT01fUExBTkVfVV07CiAgICAgc2l6ZV90IHNyY1ZTdHJpZGUgPSBpbWctPnN0cmlkZVtBT01fUExBTkVfVl07CkBAIC03MTAsMTMgKzcwNiwxNCBAQAogICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjViA9IChjb25zdCB1aW50MTZfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9WXTsKIAogICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyKSB7Ci0gICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAoKHVpbnQzMl90ICopZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKKyAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCgodWludDMyX3QgKilkc3RZLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUgLyBzaXplb2YodWludDMyX3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3RZLCBkc3RVLCBkc3RWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUgLyAyLCBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CiAgICAgICAgIH0KQEAgLTcyNSw3ICs3MjIsNyBAQAogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfVV07CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9WXTsKICAgICAgICAgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCi0gICAgICAgICAgICAgICAgZHN0LCBzcmNZLCBzcmNVLCBzcmNWLAorICAgICAgICAgICAgICAgIGRzdFksIGRzdFUsIGRzdFYsIHNyY1ksIHNyY1UsIHNyY1YsCiAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwKICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwpAQCAtODAzLDExICs4MDAsMTMgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBb21GYWN0b3J5KCk7CiB9CiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgZGVsZXRlIGZhY3Rvcnk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9BbmRyb2lkLmJwCmluZGV4IDQwMjE0NDQuLjBiZTFiZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9BbmRyb2lkLmJwCkBAIC0xLDkgKzEsMTkgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2F2Y2RlYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCi0gICBdLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfY2ZpLWRlZmF1bHRzIiwKKyAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsibGliYXZjZGVjIl0sCiAKQEAgLTE1LDEyICsyNSwxMyBAQAogICAgIF0sCiB9CiAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hdmNlbmMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCiAgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAotICAgXSwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2NmaS1kZWZhdWx0cyIsCisgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYmF2Y2VuYyJdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwCmluZGV4IGQ3YjllMTIuLmU4Mjg3ZjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KIAogI2luY2x1ZGUgIkMyU29mdEF2Y0RlYy5oIgotI2luY2x1ZGUgImloMjY0ZC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM0LDcgKzMzLDExIEBACiBjb25zdGV4cHIgc2l6ZV90IGtNaW5JbnB1dEJ1ZmZlclNpemUgPSAyICogMTAyNCAqIDEwMjQ7CiBjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiOwogY29uc3RleHByIHVpbnQzMl90IGtEZWZhdWx0T3V0cHV0RGVsYXkgPSA4OwotY29uc3RleHByIHVpbnQzMl90IGtNYXhPdXRwdXREZWxheSA9IDE2OworLyogYXZjIHNwZWNpZmljYXRpb24gYWxsb3dzIGZvciBhIG1heGltdW0gZGVsYXkgb2YgMTYgZnJhbWVzLgorICAgQXMgc29mdCBhdmMgZGVjb2RlciBzdXBwb3J0cyBpbnRlcmxhY2VkLCB0aGlzIGRlbGF5IHdvdWxkIGJlIDMyIGZpZWxkcy4KKyAgIEFuZCBhdmMgZGVjb2RlciBpbXBsZW1lbnRhdGlvbiBoYXMgYW4gYWRkaXRpb25hbCBkZWxheSBvZiAyIGRlY29kZSBjYWxscy4KKyAgIFNvIHRvdGFsIG1heGltdW0gb3V0cHV0IGRlbGF5IGlzIDM0ICovCitjb25zdGV4cHIgdWludDMyX3Qga01heE91dHB1dERlbGF5ID0gMzQ7CiBjb25zdGV4cHIgdWludDMyX3Qga01pbklucHV0Qnl0ZXMgPSA0OwogfSAgLy8gbmFtZXNwYWNlCiAKQEAgLTM4NywxMiArMzkwLDE0IEBACiAgICAgfQogCiAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOwotICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisgICAgICAgIGloMjY0ZF92aWRlb19kZWNvZGVfaXBfdCBzX2gyNjRkX2RlY29kZV9pcCA9IHt9OworICAgICAgICBpaDI2NGRfdmlkZW9fZGVjb2RlX29wX3Qgc19oMjY0ZF9kZWNvZGVfb3AgPSB7fTsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAgPSAmc19oMjY0ZF9kZWNvZGVfaXAuc19pdmRfdmlkZW9fZGVjb2RlX2lwX3Q7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wID0gJnNfaDI2NGRfZGVjb2RlX29wLnNfaXZkX3ZpZGVvX2RlY29kZV9vcF90OwogCi0gICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsIG51bGxwdHIsIDAsIDAsIDApOwotICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKLSAgICAgICAgaWYgKDAgPT0gc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgc2V0RGVjb2RlQXJncyhwc19kZWNvZGVfaXAsIHBzX2RlY29kZV9vcCwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgMCwgMCk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfaDI2NGRfZGVjb2RlX2lwLCAmc19oMjY0ZF9kZWNvZGVfb3ApOworICAgICAgICBpZiAoMCA9PSBwc19kZWNvZGVfb3AtPnU0X291dHB1dF9wcmVzZW50KSB7CiAgICAgICAgICAgICByZXNldFBsdWdpbigpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTQwNyw4ICs0MTIsOCBAQAogfQogCiBzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmNyZWF0ZURlY29kZXIoKSB7Ci0gICAgaXZkZXh0X2NyZWF0ZV9pcF90IHNfY3JlYXRlX2lwOwotICAgIGl2ZGV4dF9jcmVhdGVfb3BfdCBzX2NyZWF0ZV9vcDsKKyAgICBpdmRleHRfY3JlYXRlX2lwX3Qgc19jcmVhdGVfaXAgPSB7fTsKKyAgICBpdmRleHRfY3JlYXRlX29wX3Qgc19jcmVhdGVfb3AgPSB7fTsKIAogICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2NyZWF0ZV9pcF90KTsKICAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5lX2NtZCA9IElWRF9DTURfQ1JFQVRFOwpAQCAtNDM0LDggKzQzOSw4IEBACiB9CiAKIHN0YXR1c190IEMyU29mdEF2Y0RlYzo6c2V0TnVtQ29yZXMoKSB7Ci0gICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3Qgc19zZXRfbnVtX2NvcmVzX2lwOwotICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90IHNfc2V0X251bV9jb3Jlc19vcDsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCBzX3NldF9udW1fY29yZXNfaXAgPSB7fTsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCBzX3NldF9udW1fY29yZXNfb3AgPSB7fTsKIAogICAgIHNfc2V0X251bV9jb3Jlc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90KTsKICAgICBzX3NldF9udW1fY29yZXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKQEAgLTQ1NCwyMiArNDU5LDI2IEBACiB9CiAKIHN0YXR1c190IEMyU29mdEF2Y0RlYzo6c2V0UGFyYW1zKHNpemVfdCBzdHJpZGUsIElWRF9WSURFT19ERUNPREVfTU9ERV9UIGRlY19tb2RlKSB7Ci0gICAgaXZkX2N0bF9zZXRfY29uZmlnX2lwX3Qgc19zZXRfZHluX3BhcmFtc19pcDsKLSAgICBpdmRfY3RsX3NldF9jb25maWdfb3BfdCBzX3NldF9keW5fcGFyYW1zX29wOworICAgIGloMjY0ZF9jdGxfc2V0X2NvbmZpZ19pcF90IHNfaDI2NGRfc2V0X2R5bl9wYXJhbXNfaXAgPSB7fTsKKyAgICBpaDI2NGRfY3RsX3NldF9jb25maWdfb3BfdCBzX2gyNjRkX3NldF9keW5fcGFyYW1zX29wID0ge307CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX2lwX3QgKnBzX3NldF9keW5fcGFyYW1zX2lwID0KKyAgICAgICAgJnNfaDI2NGRfc2V0X2R5bl9wYXJhbXNfaXAuc19pdmRfY3RsX3NldF9jb25maWdfaXBfdDsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfb3BfdCAqcHNfc2V0X2R5bl9wYXJhbXNfb3AgPQorICAgICAgICAmc19oMjY0ZF9zZXRfZHluX3BhcmFtc19vcC5zX2l2ZF9jdGxfc2V0X2NvbmZpZ19vcF90OwogCi0gICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKLSAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7Ci0gICAgc19zZXRfZHluX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9TRVRQQVJBTVM7Ci0gICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9kaXNwX3dkID0gKFVXT1JEMzIpIHN0cmlkZTsKLSAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX3NraXBfbW9kZSA9IElWRF9TS0lQX05PTkU7Ci0gICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2ZybV9vdXRfbW9kZSA9IElWRF9ESVNQTEFZX0ZSQU1FX09VVDsKLSAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfdmlkX2RlY19tb2RlID0gZGVjX21vZGU7Ci0gICAgc19zZXRfZHluX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKKyAgICBwc19zZXRfZHluX3BhcmFtc19pcC0+dTRfc2l6ZSA9IHNpemVvZihpaDI2NGRfY3RsX3NldF9jb25maWdfaXBfdCk7CisgICAgcHNfc2V0X2R5bl9wYXJhbXNfaXAtPmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgcHNfc2V0X2R5bl9wYXJhbXNfaXAtPmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1NFVFBBUkFNUzsKKyAgICBwc19zZXRfZHluX3BhcmFtc19pcC0+dTRfZGlzcF93ZCA9IChVV09SRDMyKSBzdHJpZGU7CisgICAgcHNfc2V0X2R5bl9wYXJhbXNfaXAtPmVfZnJtX3NraXBfbW9kZSA9IElWRF9TS0lQX05PTkU7CisgICAgcHNfc2V0X2R5bl9wYXJhbXNfaXAtPmVfZnJtX291dF9tb2RlID0gSVZEX0RJU1BMQVlfRlJBTUVfT1VUOworICAgIHBzX3NldF9keW5fcGFyYW1zX2lwLT5lX3ZpZF9kZWNfbW9kZSA9IGRlY19tb2RlOworICAgIHBzX3NldF9keW5fcGFyYW1zX29wLT51NF9zaXplID0gc2l6ZW9mKGloMjY0ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKICAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfaXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9keW5fcGFyYW1zX29wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfaDI2NGRfc2V0X2R5bl9wYXJhbXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2gyNjRkX3NldF9keW5fcGFyYW1zX29wKTsKICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKLSAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2R5bl9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBwc19zZXRfZHluX3BhcmFtc19vcC0+dTRfZXJyb3JfY29kZSk7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIApAQCAtNDc3LDggKzQ4Niw4IEBACiB9CiAKIHZvaWQgQzJTb2Z0QXZjRGVjOjpnZXRWZXJzaW9uKCkgewotICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCBzX2dldF92ZXJzaW9uaW5mb19pcDsKLSAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3Qgc19nZXRfdmVyc2lvbmluZm9fb3A7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfZ2V0X3ZlcnNpb25pbmZvX2lwID0ge307CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90IHNfZ2V0X3ZlcnNpb25pbmZvX29wID0ge307CiAgICAgVVdPUkQ4IGF1MV9idWZbNTEyXTsKIAogICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90KTsKQEAgLTUzNCw3ICs1NDMsNyBAQAogICAgICAgICBpZiAoT0sgIT0gc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfRlJBTUUpKSByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHNfZGVjb2RlX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfaXBfdCk7CisgICAgcHNfZGVjb2RlX2lwLT51NF9zaXplID0gc2l6ZW9mKGloMjY0ZF92aWRlb19kZWNvZGVfaXBfdCk7CiAgICAgcHNfZGVjb2RlX2lwLT5lX2NtZCA9IElWRF9DTURfVklERU9fREVDT0RFOwogICAgIGlmIChpbkJ1ZmZlcikgewogICAgICAgICBwc19kZWNvZGVfaXAtPnU0X3RzID0gdHNNYXJrZXI7CkBAIC01NjMsMTQgKzU3MiwxNCBAQAogICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IG1PdXRCdWZmZXJGbHVzaCArIGx1bWFTaXplICsgY2hyb21hU2l6ZTsKICAgICB9CiAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbnVtX2J1ZnMgPSAzOwotICAgIHBzX2RlY29kZV9vcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX29wX3QpOworICAgIHBzX2RlY29kZV9vcC0+dTRfc2l6ZSA9IHNpemVvZihpaDI2NGRfdmlkZW9fZGVjb2RlX29wX3QpOwogCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgQzJTb2Z0QXZjRGVjOjpnZXRWdWlQYXJhbXMoKSB7Ci0gICAgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90IHNfZ2V0X3Z1aV9wYXJhbXNfaXA7Ci0gICAgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19vcF90IHNfZ2V0X3Z1aV9wYXJhbXNfb3A7CisgICAgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90IHNfZ2V0X3Z1aV9wYXJhbXNfaXAgPSB7fTsKKyAgICBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3Qgc19nZXRfdnVpX3BhcmFtc19vcCA9IHt9OwogCiAgICAgc19nZXRfdnVpX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCk7CiAgICAgc19nZXRfdnVpX3BhcmFtc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOwpAQCAtNjE4LDggKzYyNyw4IEBACiB9CiAKIHN0YXR1c190IEMyU29mdEF2Y0RlYzo6c2V0Rmx1c2hNb2RlKCkgewotICAgIGl2ZF9jdGxfZmx1c2hfaXBfdCBzX3NldF9mbHVzaF9pcDsKLSAgICBpdmRfY3RsX2ZsdXNoX29wX3Qgc19zZXRfZmx1c2hfb3A7CisgICAgaXZkX2N0bF9mbHVzaF9pcF90IHNfc2V0X2ZsdXNoX2lwID0ge307CisgICAgaXZkX2N0bF9mbHVzaF9vcF90IHNfc2V0X2ZsdXNoX29wID0ge307CiAKICAgICBzX3NldF9mbHVzaF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfaXBfdCk7CiAgICAgc19zZXRfZmx1c2hfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKQEAgLTYzNyw4ICs2NDYsOCBAQAogfQogCiBzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OnJlc2V0RGVjb2RlcigpIHsKLSAgICBpdmRfY3RsX3Jlc2V0X2lwX3Qgc19yZXNldF9pcDsKLSAgICBpdmRfY3RsX3Jlc2V0X29wX3Qgc19yZXNldF9vcDsKKyAgICBpdmRfY3RsX3Jlc2V0X2lwX3Qgc19yZXNldF9pcCA9IHt9OworICAgIGl2ZF9jdGxfcmVzZXRfb3BfdCBzX3Jlc2V0X29wID0ge307CiAKICAgICBzX3Jlc2V0X2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9pcF90KTsKICAgICBzX3Jlc2V0X2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CkBAIC02NjcsOCArNjc2LDggQEAKIAogc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpkZWxldGVEZWNvZGVyKCkgewogICAgIGlmIChtRGVjSGFuZGxlKSB7Ci0gICAgICAgIGl2ZGV4dF9kZWxldGVfaXBfdCBzX2RlbGV0ZV9pcDsKLSAgICAgICAgaXZkZXh0X2RlbGV0ZV9vcF90IHNfZGVsZXRlX29wOworICAgICAgICBpdmRleHRfZGVsZXRlX2lwX3Qgc19kZWxldGVfaXAgPSB7fTsKKyAgICAgICAgaXZkZXh0X2RlbGV0ZV9vcF90IHNfZGVsZXRlX29wID0ge307CiAKICAgICAgICAgc19kZWxldGVfaXAuc19pdmRfZGVsZXRlX2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfZGVsZXRlX2lwX3QpOwogICAgICAgICBzX2RlbGV0ZV9pcC5zX2l2ZF9kZWxldGVfaXBfdC5lX2NtZCA9IElWRF9DTURfREVMRVRFOwpAQCAtODMzLDggKzg0MiwxMCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOwotICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisgICAgICAgIGloMjY0ZF92aWRlb19kZWNvZGVfaXBfdCBzX2gyNjRkX2RlY29kZV9pcCA9IHt9OworICAgICAgICBpaDI2NGRfdmlkZW9fZGVjb2RlX29wX3Qgc19oMjY0ZF9kZWNvZGVfb3AgPSB7fTsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAgPSAmc19oMjY0ZF9kZWNvZGVfaXAuc19pdmRfdmlkZW9fZGVjb2RlX2lwX3Q7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wID0gJnNfaDI2NGRfZGVjb2RlX29wLnNfaXZkX3ZpZGVvX2RlY29kZV9vcF90OwogICAgICAgICB7CiAgICAgICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKICAgICAgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CkBAIC04NDIsNyArODUzLDcgQEAKICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgJnJWaWV3LCAmd1ZpZXcsCisgICAgICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MocHNfZGVjb2RlX2lwLCBwc19kZWNvZGVfb3AsICZyVmlldywgJndWaWV3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT2Zmc2V0ICsgaW5Qb3MsIGluU2l6ZSAtIGluUG9zLCB3b3JrSW5kZXgpKSB7CiAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OwpAQCAtODU4LDI2ICs4NjksMjcgQEAKICAgICAgICAgICAgIFdPUkQzMiBkZWxheTsKICAgICAgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOwogICAgICAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCBkZWxheSk7Ci0gICAgICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfaDI2NGRfZGVjb2RlX2lwLCAmc19oMjY0ZF9kZWNvZGVfb3ApOwogICAgICAgICAgICAgV09SRDMyIGRlY29kZVRpbWU7CiAgICAgICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CiAgICAgICAgICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIGRlY29kZVRpbWUpOwogICAgICAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQiLCBkZWNvZGVUaW1lLCBkZWxheSwKLSAgICAgICAgICAgICAgICAgIHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZCk7CisgICAgICAgICAgICAgICAgICBwc19kZWNvZGVfb3AtPnU0X251bV9ieXRlc19jb25zdW1lZCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKElWRF9NRU1fQUxMT0NfRkFJTEVEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgSVZEX0VSUk9SX01BU0spKSB7CisgICAgICAgIGlmIChJVkRfTUVNX0FMTE9DX0ZBSUxFRCA9PSAocHNfZGVjb2RlX29wLT51NF9lcnJvcl9jb2RlICYgSVZEX0VSUk9SX01BU0spKSB7CiAgICAgICAgICAgICBBTE9HRSgiYWxsb2NhdGlvbiBmYWlsdXJlIGluIGRlY29kZXIiKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OwogICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOwogICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKElWRF9TVFJFQU1fV0lEVEhfSEVJR0hUX05PVF9TVVBQT1JURUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpIHsKKyAgICAgICAgfSBlbHNlIGlmIChJVkRfU1RSRUFNX1dJRFRIX0hFSUdIVF9OT1RfU1VQUE9SVEVEID09CisgICAgICAgICAgICAgICAgKHBzX2RlY29kZV9vcC0+dTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSkgewogICAgICAgICAgICAgQUxPR0UoInVuc3VwcG9ydGVkIHJlc29sdXRpb24gOiAlZHglZCIsIG1XaWR0aCwgbUhlaWdodCk7CiAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChJVkRfUkVTX0NIQU5HRUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpIHsKKyAgICAgICAgfSBlbHNlIGlmIChJVkRfUkVTX0NIQU5HRUQgPT0gKHBzX2RlY29kZV9vcC0+dTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSkgewogICAgICAgICAgICAgQUxPR1YoInJlc29sdXRpb24gY2hhbmdlZCIpOwogICAgICAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfTk9fRU9TLCBwb29sLCB3b3JrKTsKICAgICAgICAgICAgIHJlc2V0RGVjb2RlcigpOwpAQCAtODg2LDE2ICs4OTgsMTYgQEAKIAogICAgICAgICAgICAgLyogRGVjb2RlIGhlYWRlciBhbmQgZ2V0IG5ldyBkaW1lbnNpb25zICovCiAgICAgICAgICAgICBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9IRUFERVIpOwotICAgICAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoSVNfSVZEX0ZBVEFMX0VSUk9SKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmF0YWwgZXJyb3IgaW4gZGVjb2RlciAweCV4Iiwgc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsIHBzX2RlY29kZV9pcCwgcHNfZGVjb2RlX29wKTsKKyAgICAgICAgfSBlbHNlIGlmIChJU19JVkRfRkFUQUxfRVJST1IocHNfZGVjb2RlX29wLT51NF9lcnJvcl9jb2RlKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhdGFsIGVycm9yIGluIGRlY29kZXIgMHgleCIsIHBzX2RlY29kZV9vcC0+dTRfZXJyb3JfY29kZSk7CiAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBpZiAoc19kZWNvZGVfb3AuaTRfcmVvcmRlcl9kZXB0aCA+PSAwICYmIG1PdXRwdXREZWxheSAhPSBzX2RlY29kZV9vcC5pNF9yZW9yZGVyX2RlcHRoKSB7Ci0gICAgICAgICAgICBtT3V0cHV0RGVsYXkgPSBzX2RlY29kZV9vcC5pNF9yZW9yZGVyX2RlcHRoOworICAgICAgICBpZiAocHNfZGVjb2RlX29wLT5pNF9yZW9yZGVyX2RlcHRoID49IDAgJiYgbU91dHB1dERlbGF5ICE9IHBzX2RlY29kZV9vcC0+aTRfcmVvcmRlcl9kZXB0aCkgeworICAgICAgICAgICAgbU91dHB1dERlbGF5ID0gcHNfZGVjb2RlX29wLT5pNF9yZW9yZGVyX2RlcHRoOwogICAgICAgICAgICAgQUxPR1YoIk5ldyBPdXRwdXQgZGVsYXkgJWQgIiwgbU91dHB1dERlbGF5KTsKIAogICAgICAgICAgICAgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dCBvdXRwdXREZWxheShtT3V0cHV0RGVsYXkpOwpAQCAtOTEzLDE2ICs5MjUsMTYgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKDAgPCBzX2RlY29kZV9vcC51NF9waWNfd2QgJiYgMCA8IHNfZGVjb2RlX29wLnU0X3BpY19odCkgeworICAgICAgICBpZiAoMCA8IHBzX2RlY29kZV9vcC0+dTRfcGljX3dkICYmIDAgPCBwc19kZWNvZGVfb3AtPnU0X3BpY19odCkgewogICAgICAgICAgICAgaWYgKG1IZWFkZXJEZWNvZGVkID09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgbUhlYWRlckRlY29kZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1TdHJpZGUgPSBBTElHTjMyKHNfZGVjb2RlX29wLnU0X3BpY193ZCk7CisgICAgICAgICAgICAgICAgbVN0cmlkZSA9IEFMSUdOMzIocHNfZGVjb2RlX29wLT51NF9waWNfd2QpOwogICAgICAgICAgICAgICAgIHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0ZSQU1FKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9waWNfd2QgIT0gbVdpZHRoIHx8IHNfZGVjb2RlX29wLnU0X3BpY19odCAhPSBtSGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgbVdpZHRoID0gc19kZWNvZGVfb3AudTRfcGljX3dkOwotICAgICAgICAgICAgICAgIG1IZWlnaHQgPSBzX2RlY29kZV9vcC51NF9waWNfaHQ7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoMHUsIHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KTsKKyAgICAgICAgICAgIGlmIChwc19kZWNvZGVfb3AtPnU0X3BpY193ZCAhPSBtV2lkdGggfHwgcHNfZGVjb2RlX29wLT51NF9waWNfaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgICAgIG1XaWR0aCA9IHBzX2RlY29kZV9vcC0+dTRfcGljX3dkOworICAgICAgICAgICAgICAgIG1IZWlnaHQgPSBwc19kZWNvZGVfb3AtPnU0X3BpY19odDsKKyAgICAgICAgICAgICAgICBDSEVDS19FUSgwdSwgcHNfZGVjb2RlX29wLT51NF9vdXRwdXRfcHJlc2VudCk7CiAKICAgICAgICAgICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CiAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOwpAQCAtOTQxLDExICs5NTMsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAodm9pZClnZXRWdWlQYXJhbXMoKTsKLSAgICAgICAgaGFzUGljdHVyZSB8PSAoMSA9PSBzX2RlY29kZV9vcC51NF9mcmFtZV9kZWNvZGVkX2ZsYWcpOwotICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKLSAgICAgICAgICAgIGZpbmlzaFdvcmsoc19kZWNvZGVfb3AudTRfdHMsIHdvcmspOworICAgICAgICBoYXNQaWN0dXJlIHw9ICgxID09IHBzX2RlY29kZV9vcC0+dTRfZnJhbWVfZGVjb2RlZF9mbGFnKTsKKyAgICAgICAgaWYgKHBzX2RlY29kZV9vcC0+dTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsocHNfZGVjb2RlX29wLT51NF90cywgd29yayk7CiAgICAgICAgIH0KLSAgICAgICAgaW5Qb3MgKz0gc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkOworICAgICAgICBpblBvcyArPSBwc19kZWNvZGVfb3AtPnU0X251bV9ieXRlc19jb25zdW1lZDsKICAgICB9CiAgICAgaWYgKGVvcykgewogICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywgcG9vbCwgd29yayk7CkBAIC05ODMsMTYgKzk5NSwxOCBAQAogICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CiAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOwogICAgICAgICB9Ci0gICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKLSAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOwotICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsICZ3VmlldywgMCwgMCwgMCkpIHsKKyAgICAgICAgaWgyNjRkX3ZpZGVvX2RlY29kZV9pcF90IHNfaDI2NGRfZGVjb2RlX2lwID0ge307CisgICAgICAgIGloMjY0ZF92aWRlb19kZWNvZGVfb3BfdCBzX2gyNjRkX2RlY29kZV9vcCA9IHt9OworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY29kZV9pcCA9ICZzX2gyNjRkX2RlY29kZV9pcC5zX2l2ZF92aWRlb19kZWNvZGVfaXBfdDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNvZGVfb3AgPSAmc19oMjY0ZF9kZWNvZGVfb3Auc19pdmRfdmlkZW9fZGVjb2RlX29wX3Q7CisgICAgICAgIGlmICghc2V0RGVjb2RlQXJncyhwc19kZWNvZGVfaXAsIHBzX2RlY29kZV9vcCwgbnVsbHB0ciwgJndWaWV3LCAwLCAwLCAwKSkgewogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CiAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOwogICAgICAgICB9Ci0gICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOwotICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKLSAgICAgICAgICAgIGZpbmlzaFdvcmsoc19kZWNvZGVfb3AudTRfdHMsIHdvcmspOworICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2gyNjRkX2RlY29kZV9pcCwgJnNfaDI2NGRfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKHBzX2RlY29kZV9vcC0+dTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsocHNfZGVjb2RlX29wLT51NF90cywgd29yayk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xMDQ1LDExICsxMDU5LDEzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QXZjRGVjRmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBmYWN0b3J5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5oCmluZGV4IGJkODRkZTAuLjVjMDdkMjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmgKQEAgLTI1LDggKzI1LDcgQEAKICNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgogCiAjaW5jbHVkZSAiaWgyNjRfdHlwZWRlZnMuaCIKLSNpbmNsdWRlICJpdi5oIgotI2luY2x1ZGUgIml2ZC5oIgorI2luY2x1ZGUgImloMjY0ZC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5jcHAKaW5kZXggNTY2ODk1Zi4uMGIxMjFhZCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5jcHAKQEAgLTE5LDYgKzE5LDggQEAKICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgpAQCAtMjYsNiArMjgsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAKICNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8Q29kZWMyTWFwcGVyLmg+CiAjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KICNpbmNsdWRlIDxDb2RlYzJCdWZmZXJVdGlscy5oPgogI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CkBAIC0xMjEsNiArMTI0LDE5IEBACiAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogCiAgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGljdHVyZVF1YW50aXphdGlvbiwgQzJfUEFSQU1LRVlfUElDVFVSRV9RVUFOVElaQVRJT04pCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyU3RyZWFtUGljdHVyZVF1YW50aXphdGlvblR1bmluZzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogZmxleENvdW50ICovLCAwdSAvKiBzdHJlYW0gKi8pKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVBpY3R1cmVRdWFudGl6YXRpb24sIG0udmFsdWVzWzBdLnR5cGVfKS5vbmVPZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0MyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChJX0ZSQU1FKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoUF9GUkFNRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OnBpY3R1cmVfdHlwZV90KEJfRlJBTUUpfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtUGljdHVyZVF1YW50aXphdGlvbiwgbS52YWx1ZXNbMF0ubWluKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1QaWN0dXJlUXVhbnRpemF0aW9uLCBtLnZhbHVlc1swXS5tYXgpLmFueSgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQaWN0dXJlUXVhbnRpemF0aW9uU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbElucHV0RGVsYXksIEMyX1BBUkFNS0VZX0lOUFVUX0RFTEFZKQogICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6OmlucHV0KERFRkFVTFRfQl9GUkFNRVMpKQogICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUFjdHVhbElucHV0RGVsYXksIHZhbHVlKS5pblJhbmdlKDAsIE1BWF9CX0ZSQU1FUyl9KQpAQCAtMTk4LDYgKzIxNCw0MiBAQAogICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVN5bmNGcmFtZVBlcmlvZCwgdmFsdWUpLmFueSgpfSkKICAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1TeW5jRnJhbWVQZXJpb2QpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQogICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2RlZENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9MSU1JVEVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyLCBtQ29sb3JBc3BlY3RzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKICAgICB9CiAKICAgICBzdGF0aWMgQzJSIElucHV0RGVsYXlTZXR0ZXIoCkBAIC0yMjAsNiArMjcyLDcgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKKwogICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmb2xkTWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZtZSkgewogICAgICAgICAodm9pZCltYXlCbG9jazsKQEAgLTMzNiw2ICszODksNDAgQEAKICAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKICAgICB9CiAKKyAgICBzdGF0aWMgQzJSIFBpY3R1cmVRdWFudGl6YXRpb25TZXR0ZXIoYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVF1YW50aXphdGlvblR1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKW1lOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZjb2RlZCkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBjb2RlZC52LnJhbmdlOworICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBjb2RlZC52LnByaW1hcmllczsKKyAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBjb2RlZC52LnRyYW5zZmVyOworICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBjb2RlZC52Lm1hdHJpeDsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKICAgICBJVl9QUk9GSUxFX1QgZ2V0UHJvZmlsZV9sKCkgY29uc3QgewogICAgICAgICBzd2l0Y2ggKG1Qcm9maWxlTGV2ZWwtPnByb2ZpbGUpIHsKICAgICAgICAgY2FzZSBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORTogIFtbZmFsbHRocm91Z2hdXTsKQEAgLTM5Myw2ICs0ODAsMTEgQEAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBnZXRCaXRyYXRlX2woKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZTsgfQogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gZ2V0UmVxdWVzdFN5bmNfbCgpIGNvbnN0IHsgcmV0dXJuIG1SZXF1ZXN0U3luYzsgfQogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUdvcFR1bmluZzo6b3V0cHV0PiBnZXRHb3BfbCgpIGNvbnN0IHsgcmV0dXJuIG1Hb3A7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlUXVhbnRpemF0aW9uVHVuaW5nOjpvdXRwdXQ+IGdldFBpY3R1cmVRdWFudGl6YXRpb25fbCgpIGNvbnN0CisgICAgeyByZXR1cm4gbVBpY3R1cmVRdWFudGl6YXRpb247IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IGdldENvZGVkQ29sb3JBc3BlY3RzX2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ29kZWRDb2xvckFzcGVjdHM7CisgICAgfQogCiBwcml2YXRlOgogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dD4gbVVzYWdlOwpAQCAtNDA0LDYgKzQ5Niw5IEBACiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiBtUHJvZmlsZUxldmVsOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQ+IG1TeW5jRnJhbWVQZXJpb2Q7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ+IG1Hb3A7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVF1YW50aXphdGlvblR1bmluZzo6b3V0cHV0PiBtUGljdHVyZVF1YW50aXphdGlvbjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gbUNvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IG1Db2RlZENvbG9yQXNwZWN0czsKIH07CiAKICNkZWZpbmUgaXZlX2FwaV9mdW5jdGlvbiAgaWgyNjRlX2FwaV9mdW5jdGlvbgpAQCAtNjY0LDIwICs3NTksNjcgQEAKICAgICBpdmVfY3RsX3NldF9xcF9vcF90IHNfcXBfb3A7CiAgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOwogCisgICAgQUxPR1YoImluIHNldFFwKCkiKTsKKworICAgIC8vIHNldCB0aGUgZGVmYXVsdHMKICAgICBzX3FwX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CiAgICAgc19xcF9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfUVA7CiAKLSAgICBzX3FwX2lwLnU0X2lfcXAgPSBERUZBVUxUX0lfUVA7Ci0gICAgc19xcF9pcC51NF9pX3FwX21heCA9IERFRkFVTFRfUVBfTUFYOwotICAgIHNfcXBfaXAudTRfaV9xcF9taW4gPSBERUZBVUxUX1FQX01JTjsKKyAgICAvLyB0aGVzZSBhcmUgdGhlIG9uZXMgd2UncmUgZ29pbmcgdG8gc2V0LCBzbyB3YW50IHRoZW0gdG8gZGVmYXVsdCAuLi4uCisgICAgLy8gdG8gdGhlIERFRkFVTFQgdmFsdWVzIGZvciB0aGUgY29kZWMgaW5zdGVhIGRvZiBDT0RFQ18gYm91bmRpbmcKKyAgICBpbnQzMl90IGlNaW4gPSBJTlQzMl9NSU4sIHBNaW4gPSBJTlQzMl9NSU4sIGJNaW4gPSBJTlQzMl9NSU47CisgICAgaW50MzJfdCBpTWF4ID0gSU5UMzJfTUFYLCBwTWF4ID0gSU5UMzJfTUFYLCBiTWF4ID0gSU5UMzJfTUFYOwogCi0gICAgc19xcF9pcC51NF9wX3FwID0gREVGQVVMVF9QX1FQOwotICAgIHNfcXBfaXAudTRfcF9xcF9tYXggPSBERUZBVUxUX1FQX01BWDsKLSAgICBzX3FwX2lwLnU0X3BfcXBfbWluID0gREVGQVVMVF9RUF9NSU47CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVF1YW50aXphdGlvblR1bmluZzo6b3V0cHV0PiBxcCA9CisgICAgICAgICAgICAgICAgICAgIG1JbnRmLT5nZXRQaWN0dXJlUXVhbnRpemF0aW9uX2woKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHFwLT5mbGV4Q291bnQoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IEMyUGljdHVyZVF1YW50aXphdGlvblN0cnVjdCAmbGF5ZXIgPSBxcC0+bS52YWx1ZXNbaV07CiAKLSAgICBzX3FwX2lwLnU0X2JfcXAgPSBERUZBVUxUX1BfUVA7Ci0gICAgc19xcF9pcC51NF9iX3FwX21heCA9IERFRkFVTFRfUVBfTUFYOwotICAgIHNfcXBfaXAudTRfYl9xcF9taW4gPSBERUZBVUxUX1FQX01JTjsKKyAgICAgICAgaWYgKGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChJX0ZSQU1FKSkgeworICAgICAgICAgICAgaU1heCA9IGxheWVyLm1heDsKKyAgICAgICAgICAgIGlNaW4gPSBsYXllci5taW47CisgICAgICAgICAgICBBTE9HVigiaU1pbiAlZCBpTWF4ICVkIiwgaU1pbiwgaU1heCk7CisgICAgICAgIH0gZWxzZSBpZiAobGF5ZXIudHlwZV8gPT0gQzJDb25maWc6OnBpY3R1cmVfdHlwZV90KFBfRlJBTUUpKSB7CisgICAgICAgICAgICBwTWF4ID0gbGF5ZXIubWF4OworICAgICAgICAgICAgcE1pbiA9IGxheWVyLm1pbjsKKyAgICAgICAgICAgIEFMT0dWKCJwTWluICVkIHBNYXggJWQiLCBwTWluLCBwTWF4KTsKKyAgICAgICAgfSBlbHNlIGlmIChsYXllci50eXBlXyA9PSBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoQl9GUkFNRSkpIHsKKyAgICAgICAgICAgIGJNYXggPSBsYXllci5tYXg7CisgICAgICAgICAgICBiTWluID0gbGF5ZXIubWluOworICAgICAgICAgICAgQUxPR1YoImJNaW4gJWQgYk1heCAlZCIsIGJNaW4sIGJNYXgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSU5UMzJfe01JTixNQVh9IG1lYW5zIHVuc3BlY2lmaWVkLCBzbyB1c2UgdGhlIGNvZGVjJ3MgZGVmYXVsdAorICAgIGlmIChpTWF4ID09IElOVDMyX01BWCkgaU1heCA9IERFRkFVTFRfSV9RUF9NQVg7CisgICAgaWYgKGlNaW4gPT0gSU5UMzJfTUlOKSBpTWluID0gREVGQVVMVF9JX1FQX01JTjsKKyAgICBpZiAocE1heCA9PSBJTlQzMl9NQVgpIHBNYXggPSBERUZBVUxUX1BfUVBfTUFYOworICAgIGlmIChwTWluID09IElOVDMyX01JTikgcE1pbiA9IERFRkFVTFRfUF9RUF9NSU47CisgICAgaWYgKGJNYXggPT0gSU5UMzJfTUFYKSBiTWF4ID0gREVGQVVMVF9CX1FQX01BWDsKKyAgICBpZiAoYk1pbiA9PSBJTlQzMl9NSU4pIGJNaW4gPSBERUZBVUxUX0JfUVBfTUlOOworCisgICAgLy8gZW5zdXJlIHdlIGhhdmUgbGVnYWwgdmFsdWVzCisgICAgaU1heCA9IHN0ZDo6Y2xhbXAoaU1heCwgQ09ERUNfUVBfTUlOLCBDT0RFQ19RUF9NQVgpOworICAgIGlNaW4gPSBzdGQ6OmNsYW1wKGlNaW4sIENPREVDX1FQX01JTiwgQ09ERUNfUVBfTUFYKTsKKyAgICBwTWF4ID0gc3RkOjpjbGFtcChwTWF4LCBDT0RFQ19RUF9NSU4sIENPREVDX1FQX01BWCk7CisgICAgcE1pbiA9IHN0ZDo6Y2xhbXAocE1pbiwgQ09ERUNfUVBfTUlOLCBDT0RFQ19RUF9NQVgpOworICAgIGJNYXggPSBzdGQ6OmNsYW1wKGJNYXgsIENPREVDX1FQX01JTiwgQ09ERUNfUVBfTUFYKTsKKyAgICBiTWluID0gc3RkOjpjbGFtcChiTWluLCBDT0RFQ19RUF9NSU4sIENPREVDX1FQX01BWCk7CisKKyAgICBzX3FwX2lwLnU0X2lfcXBfbWF4ID0gaU1heDsKKyAgICBzX3FwX2lwLnU0X2lfcXBfbWluID0gaU1pbjsKKyAgICBzX3FwX2lwLnU0X3BfcXBfbWF4ID0gcE1heDsKKyAgICBzX3FwX2lwLnU0X3BfcXBfbWluID0gcE1pbjsKKyAgICBzX3FwX2lwLnU0X2JfcXBfbWF4ID0gYk1heDsKKyAgICBzX3FwX2lwLnU0X2JfcXBfbWluID0gYk1pbjsKKworICAgIC8vIGVuc3VyZSBpbml0aWFsIHFwIHZhbHVlcyBhcmUgd2l0aGluIG91ciBuZXdseSBjb25maWd1cmVkIGJvdW5kcy4uLgorICAgIHNfcXBfaXAudTRfaV9xcCA9IHN0ZDo6Y2xhbXAoREVGQVVMVF9JX1FQLCBpTWluLCBpTWF4KTsKKyAgICBzX3FwX2lwLnU0X3BfcXAgPSBzdGQ6OmNsYW1wKERFRkFVTFRfUF9RUCwgcE1pbiwgcE1heCk7CisgICAgc19xcF9pcC51NF9iX3FwID0gc3RkOjpjbGFtcChERUZBVUxUX0JfUVAsIGJNaW4sIGJNYXgpOworCisgICAgQUxPR1YoInNldHRpbmcgUVA6IGkgJWQtJWQgcCAlZC0lZCBiICVkLSVkIiwgaU1pbiwgaU1heCwgcE1pbiwgcE1heCwgYk1pbiwgYk1heCk7CisKIAogICAgIHNfcXBfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKICAgICBzX3FwX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKQEAgLTkwNyw2ICsxMDQ5LDU1IEBACiAgICAgcmV0dXJuOwogfQogCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldFZ1aVBhcmFtcygpCit7CisgICAgQ29sb3JBc3BlY3RzIHNmQXNwZWN0czsKKyAgICBpZiAoIUMyTWFwcGVyOjptYXAobUNvbG9yQXNwZWN0cy0+cHJpbWFyaWVzLCAmc2ZBc3BlY3RzLm1QcmltYXJpZXMpKSB7CisgICAgICAgIHNmQXNwZWN0cy5tUHJpbWFyaWVzID0gYW5kcm9pZDo6Q29sb3JBc3BlY3RzOjpQcmltYXJpZXNVbnNwZWNpZmllZDsKKyAgICB9CisgICAgaWYgKCFDMk1hcHBlcjo6bWFwKG1Db2xvckFzcGVjdHMtPnJhbmdlLCAmc2ZBc3BlY3RzLm1SYW5nZSkpIHsKKyAgICAgICAgc2ZBc3BlY3RzLm1SYW5nZSA9IGFuZHJvaWQ6OkNvbG9yQXNwZWN0czo6UmFuZ2VVbnNwZWNpZmllZDsKKyAgICB9CisgICAgaWYgKCFDMk1hcHBlcjo6bWFwKG1Db2xvckFzcGVjdHMtPm1hdHJpeCwgJnNmQXNwZWN0cy5tTWF0cml4Q29lZmZzKSkgeworICAgICAgICBzZkFzcGVjdHMubU1hdHJpeENvZWZmcyA9IGFuZHJvaWQ6OkNvbG9yQXNwZWN0czo6TWF0cml4VW5zcGVjaWZpZWQ7CisgICAgfQorICAgIGlmICghQzJNYXBwZXI6Om1hcChtQ29sb3JBc3BlY3RzLT50cmFuc2ZlciwgJnNmQXNwZWN0cy5tVHJhbnNmZXIpKSB7CisgICAgICAgIHNmQXNwZWN0cy5tVHJhbnNmZXIgPSBhbmRyb2lkOjpDb2xvckFzcGVjdHM6OlRyYW5zZmVyVW5zcGVjaWZpZWQ7CisgICAgfQorICAgIGludDMyX3QgcHJpbWFyaWVzLCB0cmFuc2ZlciwgbWF0cml4Q29lZmZzOworICAgIGJvb2wgcmFuZ2U7CisgICAgQ29sb3JVdGlsczo6Y29udmVydENvZGVjQ29sb3JBc3BlY3RzVG9Jc29Bc3BlY3RzKHNmQXNwZWN0cywKKyAgICAgICAgICAgICZwcmltYXJpZXMsCisgICAgICAgICAgICAmdHJhbnNmZXIsCisgICAgICAgICAgICAmbWF0cml4Q29lZmZzLAorICAgICAgICAgICAgJnJhbmdlKTsKKyAgICBpaDI2NGVfdnVpX2lwX3Qgc192dWlfcGFyYW1zX2lwIHt9OworICAgIGloMjY0ZV92dWlfb3BfdCBzX3Z1aV9wYXJhbXNfb3Age307CisKKyAgICBzX3Z1aV9wYXJhbXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3Z1aV9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX1ZVSV9QQVJBTVM7CisKKyAgICBzX3Z1aV9wYXJhbXNfaXAudTFfdmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnID0gMTsKKyAgICBzX3Z1aV9wYXJhbXNfaXAudTFfY29sb3VyX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZyA9IDE7CisgICAgc192dWlfcGFyYW1zX2lwLnUxX2NvbG91cl9wcmltYXJpZXMgPSBwcmltYXJpZXM7CisgICAgc192dWlfcGFyYW1zX2lwLnUxX3RyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyA9IHRyYW5zZmVyOworICAgIHNfdnVpX3BhcmFtc19pcC51MV9tYXRyaXhfY29lZmZpY2llbnRzID0gbWF0cml4Q29lZmZzOworICAgIHNfdnVpX3BhcmFtc19pcC51MV92aWRlb19mdWxsX3JhbmdlX2ZsYWcgPSByYW5nZTsKKworICAgIHNfdnVpX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGloMjY0ZV92dWlfaXBfdCk7CisgICAgc192dWlfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaWgyNjRlX3Z1aV9vcF90KTsKKworICAgIElWX1NUQVRVU19UIHN0YXR1cyA9IGloMjY0ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc192dWlfcGFyYW1zX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfdnVpX3BhcmFtc19vcCk7CisgICAgaWYoc3RhdHVzICE9IElWX1NVQ0NFU1MpCisgICAgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCB2dWkgcGFyYW1zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX3Z1aV9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKwogYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjppbml0RW5jb2RlcigpIHsKICAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CiAgICAgV09SRDMyIGxldmVsOwpAQCAtOTI2LDYgKzExMTcsNyBAQAogICAgICAgICBtSUludGVydmFsID0gbUludGYtPmdldFN5bmNGcmFtZVBlcmlvZF9sKCk7CiAgICAgICAgIG1JRFJJbnRlcnZhbCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2RfbCgpOwogICAgICAgICBnb3AgPSBtSW50Zi0+Z2V0R29wX2woKTsKKyAgICAgICAgbUNvbG9yQXNwZWN0cyA9IG1JbnRmLT5nZXRDb2RlZENvbG9yQXNwZWN0c19sKCk7CiAgICAgfQogICAgIGlmIChnb3AgJiYgZ29wLT5mbGV4Q291bnQoKSA+IDApIHsKICAgICAgICAgdWludDMyX3Qgc3luY0ludGVydmFsID0gMTsKQEAgLTEwMDksMjkgKzEyMDEsMzEgQEAKIAogICAgIC8qIEdldHRpbmcgTWVtUmVjb3JkcyBBdHRyaWJ1dGVzICovCiAgICAgewotICAgICAgICBpdl9maWxsX21lbV9yZWNfaXBfdCBzX2ZpbGxfbWVtX3JlY19pcDsKLSAgICAgICAgaXZfZmlsbF9tZW1fcmVjX29wX3Qgc19maWxsX21lbV9yZWNfb3A7CisgICAgICAgIGloMjY0ZV9maWxsX21lbV9yZWNfaXBfdCBzX2loMjY0ZV9tZW1fcmVjX2lwID0ge307CisgICAgICAgIGloMjY0ZV9maWxsX21lbV9yZWNfb3BfdCBzX2loMjY0ZV9tZW1fcmVjX29wID0ge307CisgICAgICAgIGl2X2ZpbGxfbWVtX3JlY19pcF90ICpwc19maWxsX21lbV9yZWNfaXAgPSAmc19paDI2NGVfbWVtX3JlY19pcC5zX2l2ZV9pcDsKKyAgICAgICAgaXZfZmlsbF9tZW1fcmVjX29wX3QgKnBzX2ZpbGxfbWVtX3JlY19vcCA9ICZzX2loMjY0ZV9tZW1fcmVjX29wLnNfaXZlX29wOwogCi0gICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X3NpemUgPSBzaXplb2YoaXZfZmlsbF9tZW1fcmVjX2lwX3QpOwotICAgICAgICBzX2ZpbGxfbWVtX3JlY19vcC51NF9zaXplID0gc2l6ZW9mKGl2X2ZpbGxfbWVtX3JlY19vcF90KTsKKyAgICAgICAgcHNfZmlsbF9tZW1fcmVjX2lwLT51NF9zaXplID0gc2l6ZW9mKGloMjY0ZV9maWxsX21lbV9yZWNfaXBfdCk7CisgICAgICAgIHBzX2ZpbGxfbWVtX3JlY19vcC0+dTRfc2l6ZSA9IHNpemVvZihpaDI2NGVfZmlsbF9tZW1fcmVjX29wX3QpOwogCi0gICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLmVfY21kID0gSVZfQ01EX0ZJTExfTlVNX01FTV9SRUM7Ci0gICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKLSAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbnVtX21lbV9yZWMgPSBtTnVtTWVtUmVjb3JkczsKLSAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X3dkID0gd2lkdGg7Ci0gICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9odCA9IGhlaWdodDsKLSAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X2xldmVsID0gbUFWQ0VuY0xldmVsOwotICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC5lX2NvbG9yX2Zvcm1hdCA9IERFRkFVTFRfSU5QX0NPTE9SX0ZPUk1BVDsKLSAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X3JlZl9jbnQgPSBERUZBVUxUX01BWF9SRUZfRlJNOwotICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfcmVvcmRlcl9jbnQgPSBERUZBVUxUX01BWF9SRU9SREVSX0ZSTTsKLSAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X3NyY2hfcm5nX3ggPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1g7Ci0gICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9zcmNoX3JuZ195ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9ZOworICAgICAgICBwc19maWxsX21lbV9yZWNfaXAtPmVfY21kID0gSVZfQ01EX0ZJTExfTlVNX01FTV9SRUM7CisgICAgICAgIHBzX2ZpbGxfbWVtX3JlY19pcC0+cHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBwc19maWxsX21lbV9yZWNfaXAtPnU0X251bV9tZW1fcmVjID0gbU51bU1lbVJlY29yZHM7CisgICAgICAgIHBzX2ZpbGxfbWVtX3JlY19pcC0+dTRfbWF4X3dkID0gd2lkdGg7CisgICAgICAgIHBzX2ZpbGxfbWVtX3JlY19pcC0+dTRfbWF4X2h0ID0gaGVpZ2h0OworICAgICAgICBwc19maWxsX21lbV9yZWNfaXAtPnU0X21heF9sZXZlbCA9IG1BVkNFbmNMZXZlbDsKKyAgICAgICAgcHNfZmlsbF9tZW1fcmVjX2lwLT5lX2NvbG9yX2Zvcm1hdCA9IERFRkFVTFRfSU5QX0NPTE9SX0ZPUk1BVDsKKyAgICAgICAgcHNfZmlsbF9tZW1fcmVjX2lwLT51NF9tYXhfcmVmX2NudCA9IERFRkFVTFRfTUFYX1JFRl9GUk07CisgICAgICAgIHBzX2ZpbGxfbWVtX3JlY19pcC0+dTRfbWF4X3Jlb3JkZXJfY250ID0gREVGQVVMVF9NQVhfUkVPUkRFUl9GUk07CisgICAgICAgIHBzX2ZpbGxfbWVtX3JlY19pcC0+dTRfbWF4X3NyY2hfcm5nX3ggPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1g7CisgICAgICAgIHBzX2ZpbGxfbWVtX3JlY19pcC0+dTRfbWF4X3NyY2hfcm5nX3kgPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1k7CiAKLSAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihudWxscHRyLCAmc19maWxsX21lbV9yZWNfaXAsICZzX2ZpbGxfbWVtX3JlY19vcCk7CisgICAgICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obnVsbHB0ciwgJnNfaWgyNjRlX21lbV9yZWNfaXAsICZzX2loMjY0ZV9tZW1fcmVjX29wKTsKIAogICAgICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKICAgICAgICAgICAgIEFMT0dFKCJGaWxsIG1lbW9yeSByZWNvcmRzIGZhaWxlZCA9IDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgIHNfZmlsbF9tZW1fcmVjX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgICAgICAgICBwc19maWxsX21lbV9yZWNfb3AtPnU0X2Vycm9yX2NvZGUpOwogICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKICAgICAgICAgfQogICAgIH0KQEAgLTEwNjAsNDggKzEyNTQsNTEgQEAKIAogICAgIC8qIENvZGVjIEluc3RhbmNlIENyZWF0aW9uICovCiAgICAgewotICAgICAgICBpdmVfaW5pdF9pcF90IHNfaW5pdF9pcDsKLSAgICAgICAgaXZlX2luaXRfb3BfdCBzX2luaXRfb3A7CisgICAgICAgIGloMjY0ZV9pbml0X2lwX3Qgc19lbmNfaXAgPSB7fTsKKyAgICAgICAgaWgyNjRlX2luaXRfb3BfdCBzX2VuY19vcCA9IHt9OworCisgICAgICAgIGl2ZV9pbml0X2lwX3QgKnBzX2luaXRfaXAgPSAmc19lbmNfaXAuc19pdmVfaXA7CisgICAgICAgIGl2ZV9pbml0X29wX3QgKnBzX2luaXRfb3AgPSAmc19lbmNfb3Auc19pdmVfb3A7CiAKICAgICAgICAgbUNvZGVjQ3R4ID0gKGl2X29ial90ICopbU1lbVJlY29yZHNbMF0ucHZfYmFzZTsKICAgICAgICAgbUNvZGVjQ3R4LT51NF9zaXplID0gc2l6ZW9mKGl2X29ial90KTsKICAgICAgICAgbUNvZGVjQ3R4LT5wdl9meG5zID0gKHZvaWQgKilpdmVfYXBpX2Z1bmN0aW9uOwogCi0gICAgICAgIHNfaW5pdF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9pbml0X2lwX3QpOwotICAgICAgICBzX2luaXRfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfaW5pdF9vcF90KTsKKyAgICAgICAgcHNfaW5pdF9pcC0+dTRfc2l6ZSA9IHNpemVvZihpaDI2NGVfaW5pdF9pcF90KTsKKyAgICAgICAgcHNfaW5pdF9vcC0+dTRfc2l6ZSA9IHNpemVvZihpaDI2NGVfaW5pdF9vcF90KTsKIAotICAgICAgICBzX2luaXRfaXAuZV9jbWQgPSBJVl9DTURfSU5JVDsKLSAgICAgICAgc19pbml0X2lwLnU0X251bV9tZW1fcmVjID0gbU51bU1lbVJlY29yZHM7Ci0gICAgICAgIHNfaW5pdF9pcC5wc19tZW1fcmVjID0gbU1lbVJlY29yZHM7Ci0gICAgICAgIHNfaW5pdF9pcC51NF9tYXhfd2QgPSB3aWR0aDsKLSAgICAgICAgc19pbml0X2lwLnU0X21heF9odCA9IGhlaWdodDsKLSAgICAgICAgc19pbml0X2lwLnU0X21heF9yZWZfY250ID0gREVGQVVMVF9NQVhfUkVGX0ZSTTsKLSAgICAgICAgc19pbml0X2lwLnU0X21heF9yZW9yZGVyX2NudCA9IERFRkFVTFRfTUFYX1JFT1JERVJfRlJNOwotICAgICAgICBzX2luaXRfaXAudTRfbWF4X2xldmVsID0gbUFWQ0VuY0xldmVsOwotICAgICAgICBzX2luaXRfaXAuZV9pbnBfY29sb3JfZm10ID0gbUl2VmlkZW9Db2xvckZvcm1hdDsKKyAgICAgICAgcHNfaW5pdF9pcC0+ZV9jbWQgPSBJVl9DTURfSU5JVDsKKyAgICAgICAgcHNfaW5pdF9pcC0+dTRfbnVtX21lbV9yZWMgPSBtTnVtTWVtUmVjb3JkczsKKyAgICAgICAgcHNfaW5pdF9pcC0+cHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBwc19pbml0X2lwLT51NF9tYXhfd2QgPSB3aWR0aDsKKyAgICAgICAgcHNfaW5pdF9pcC0+dTRfbWF4X2h0ID0gaGVpZ2h0OworICAgICAgICBwc19pbml0X2lwLT51NF9tYXhfcmVmX2NudCA9IERFRkFVTFRfTUFYX1JFRl9GUk07CisgICAgICAgIHBzX2luaXRfaXAtPnU0X21heF9yZW9yZGVyX2NudCA9IERFRkFVTFRfTUFYX1JFT1JERVJfRlJNOworICAgICAgICBwc19pbml0X2lwLT51NF9tYXhfbGV2ZWwgPSBtQVZDRW5jTGV2ZWw7CisgICAgICAgIHBzX2luaXRfaXAtPmVfaW5wX2NvbG9yX2ZtdCA9IG1JdlZpZGVvQ29sb3JGb3JtYXQ7CiAKICAgICAgICAgaWYgKG1SZWNvbkVuYWJsZSB8fCBtUFNOUkVuYWJsZSkgewotICAgICAgICAgICAgc19pbml0X2lwLnU0X2VuYWJsZV9yZWNvbiA9IDE7CisgICAgICAgICAgICBwc19pbml0X2lwLT51NF9lbmFibGVfcmVjb24gPSAxOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc19pbml0X2lwLnU0X2VuYWJsZV9yZWNvbiA9IDA7CisgICAgICAgICAgICBwc19pbml0X2lwLT51NF9lbmFibGVfcmVjb24gPSAwOwogICAgICAgICB9Ci0gICAgICAgIHNfaW5pdF9pcC5lX3JlY29uX2NvbG9yX2ZtdCA9IERFRkFVTFRfUkVDT05fQ09MT1JfRk9STUFUOwotICAgICAgICBzX2luaXRfaXAuZV9yY19tb2RlID0gREVGQVVMVF9SQ19NT0RFOwotICAgICAgICBzX2luaXRfaXAudTRfbWF4X2ZyYW1lcmF0ZSA9IERFRkFVTFRfTUFYX0ZSQU1FUkFURTsKLSAgICAgICAgc19pbml0X2lwLnU0X21heF9iaXRyYXRlID0gREVGQVVMVF9NQVhfQklUUkFURTsKLSAgICAgICAgc19pbml0X2lwLnU0X251bV9iZnJhbWVzID0gbUJmcmFtZXM7Ci0gICAgICAgIHNfaW5pdF9pcC5lX2NvbnRlbnRfdHlwZSA9IElWX1BST0dSRVNTSVZFOwotICAgICAgICBzX2luaXRfaXAudTRfbWF4X3NyY2hfcm5nX3ggPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1g7Ci0gICAgICAgIHNfaW5pdF9pcC51NF9tYXhfc3JjaF9ybmdfeSA9IERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWTsKLSAgICAgICAgc19pbml0X2lwLmVfc2xpY2VfbW9kZSA9IG1TbGljZU1vZGU7Ci0gICAgICAgIHNfaW5pdF9pcC51NF9zbGljZV9wYXJhbSA9IG1TbGljZVBhcmFtOwotICAgICAgICBzX2luaXRfaXAuZV9hcmNoID0gbUFyY2g7Ci0gICAgICAgIHNfaW5pdF9pcC5lX3NvYyA9IERFRkFVTFRfU09DOworICAgICAgICBwc19pbml0X2lwLT5lX3JlY29uX2NvbG9yX2ZtdCA9IERFRkFVTFRfUkVDT05fQ09MT1JfRk9STUFUOworICAgICAgICBwc19pbml0X2lwLT5lX3JjX21vZGUgPSBERUZBVUxUX1JDX01PREU7CisgICAgICAgIHBzX2luaXRfaXAtPnU0X21heF9mcmFtZXJhdGUgPSBERUZBVUxUX01BWF9GUkFNRVJBVEU7CisgICAgICAgIHBzX2luaXRfaXAtPnU0X21heF9iaXRyYXRlID0gREVGQVVMVF9NQVhfQklUUkFURTsKKyAgICAgICAgcHNfaW5pdF9pcC0+dTRfbnVtX2JmcmFtZXMgPSBtQmZyYW1lczsKKyAgICAgICAgcHNfaW5pdF9pcC0+ZV9jb250ZW50X3R5cGUgPSBJVl9QUk9HUkVTU0lWRTsKKyAgICAgICAgcHNfaW5pdF9pcC0+dTRfbWF4X3NyY2hfcm5nX3ggPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1g7CisgICAgICAgIHBzX2luaXRfaXAtPnU0X21heF9zcmNoX3JuZ195ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9ZOworICAgICAgICBwc19pbml0X2lwLT5lX3NsaWNlX21vZGUgPSBtU2xpY2VNb2RlOworICAgICAgICBwc19pbml0X2lwLT51NF9zbGljZV9wYXJhbSA9IG1TbGljZVBhcmFtOworICAgICAgICBwc19pbml0X2lwLT5lX2FyY2ggPSBtQXJjaDsKKyAgICAgICAgcHNfaW5pdF9pcC0+ZV9zb2MgPSBERUZBVUxUX1NPQzsKIAotICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfaW5pdF9pcCwgJnNfaW5pdF9vcCk7CisgICAgICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19lbmNfaXAsICZzX2VuY19vcCk7CiAKICAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICBBTE9HRSgiSW5pdCBlbmNvZGVyIGZhaWxlZCA9IDB4JXhcbiIsIHNfaW5pdF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIEFMT0dFKCJJbml0IGVuY29kZXIgZmFpbGVkID0gMHgleFxuIiwgcHNfaW5pdF9vcC0+dTRfZXJyb3JfY29kZSk7CiAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOwogICAgICAgICB9CiAgICAgfQpAQCAtMTE0NSw2ICsxMzQyLDkgQEAKICAgICAvKiBWaWRlbyBjb250cm9sIFNldCBQcm9maWxlIHBhcmFtcyAqLwogICAgIHNldFByb2ZpbGVQYXJhbXMoKTsKIAorICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IFZVSSBwYXJhbXMgKi8KKyAgICBzZXRWdWlQYXJhbXMoKTsKKwogICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IGluIEVuY29kZSBoZWFkZXIgbW9kZSAqLwogICAgIHNldEVuY01vZGUoSVZFX0VOQ19NT0RFX0hFQURFUik7CiAKQEAgLTE0MjksMTUgKzE2MjksMTcgQEAKICAgICB9CiAgICAgLy8gd2hpbGUgKCFtU2F3T3V0cHV0RU9TICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CiAgICAgYzJfc3RhdHVzX3QgZXJyb3I7Ci0gICAgaXZlX3ZpZGVvX2VuY29kZV9pcF90IHNfZW5jb2RlX2lwOwotICAgIGl2ZV92aWRlb19lbmNvZGVfb3BfdCBzX2VuY29kZV9vcDsKLSAgICBtZW1zZXQoJnNfZW5jb2RlX29wLCAwLCBzaXplb2Yoc19lbmNvZGVfb3ApKTsKKyAgICBpaDI2NGVfdmlkZW9fZW5jb2RlX2lwX3Qgc192aWRlb19lbmNvZGVfaXAgPSB7fTsKKyAgICBpaDI2NGVfdmlkZW9fZW5jb2RlX29wX3Qgc192aWRlb19lbmNvZGVfb3AgPSB7fTsKKyAgICBpdmVfdmlkZW9fZW5jb2RlX2lwX3QgKnBzX2VuY29kZV9pcCA9ICZzX3ZpZGVvX2VuY29kZV9pcC5zX2l2ZV9pcDsKKyAgICBpdmVfdmlkZW9fZW5jb2RlX29wX3QgKnBzX2VuY29kZV9vcCA9ICZzX3ZpZGVvX2VuY29kZV9vcC5zX2l2ZV9vcDsKKyAgICBtZW1zZXQocHNfZW5jb2RlX29wLCAwLCBzaXplb2YoKnBzX2VuY29kZV9vcCkpOwogCiAgICAgaWYgKCFtU3BzUHBzSGVhZGVyUmVjZWl2ZWQpIHsKICAgICAgICAgY29uc3RleHByIHVpbnQzMl90IGtIZWFkZXJMZW5ndGggPSBNSU5fU1RSRUFNX1NJWkU7CiAgICAgICAgIHVpbnQ4X3QgaGVhZGVyW2tIZWFkZXJMZW5ndGhdOwogICAgICAgICBlcnJvciA9IHNldEVuY29kZUFyZ3MoCi0gICAgICAgICAgICAgICAgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3AsIG51bGxwdHIsIGhlYWRlciwga0hlYWRlckxlbmd0aCwgd29ya0luZGV4KTsKKyAgICAgICAgICAgICAgICBwc19lbmNvZGVfaXAsIHBzX2VuY29kZV9vcCwgbnVsbHB0ciwgaGVhZGVyLCBrSGVhZGVyTGVuZ3RoLCB3b3JrSW5kZXgpOwogICAgICAgICBpZiAoZXJyb3IgIT0gQzJfT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJzZXRFbmNvZGVBcmdzIGZhaWxlZDogJWQiLCBlcnJvcik7CiAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwpAQCAtMTQ0NSwyMiArMTY0NywyMiBAQAogICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3ApOworICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgcHNfZW5jb2RlX2lwLCBwc19lbmNvZGVfb3ApOwogCiAgICAgICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgewogICAgICAgICAgICAgQUxPR0UoIkVuY29kZSBoZWFkZXIgZmFpbGVkID0gMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgc19lbmNvZGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICAgICAgICAgIHBzX2VuY29kZV9vcC0+dTRfZXJyb3JfY29kZSk7CiAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR1YoIkJ5dGVzIEdlbmVyYXRlZCBpbiBoZWFkZXIgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcyk7CisgICAgICAgICAgICAgICAgICAgIHBzX2VuY29kZV9vcC0+c19vdXRfYnVmLnU0X2J5dGVzKTsKICAgICAgICAgfQogCiAgICAgICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZCA9IHRydWU7CiAKICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+IGNzZCA9Ci0gICAgICAgICAgICBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpBbGxvY1VuaXF1ZShzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMsIDB1KTsKKyAgICAgICAgICAgIEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKHBzX2VuY29kZV9vcC0+c19vdXRfYnVmLnU0X2J5dGVzLCAwdSk7CiAgICAgICAgIGlmICghY3NkKSB7CiAgICAgICAgICAgICBBTE9HRSgiQ1NEIGFsbG9jYXRpb24gZmFpbGVkIik7CiAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwpAQCAtMTQ2OCw3ICsxNjcwLDcgQEAKICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgbWVtY3B5KGNzZC0+bS52YWx1ZSwgaGVhZGVyLCBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpOworICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBoZWFkZXIsIHBzX2VuY29kZV9vcC0+c19vdXRfYnVmLnU0X2J5dGVzKTsKICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNzZCkpOwogCiAgICAgICAgIERVTVBfVE9fRklMRSgKQEAgLTE1NjIsNyArMTc2NCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBlcnJvciA9IHNldEVuY29kZUFyZ3MoCi0gICAgICAgICAgICAgICAgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3AsIHZpZXcuZ2V0KCksIHdWaWV3LmJhc2UoKSwgd1ZpZXcuY2FwYWNpdHkoKSwgd29ya0luZGV4KTsKKyAgICAgICAgICAgICAgICBwc19lbmNvZGVfaXAsIHBzX2VuY29kZV9vcCwgdmlldy5nZXQoKSwgd1ZpZXcuYmFzZSgpLCB3Vmlldy5jYXBhY2l0eSgpLCB3b3JrSW5kZXgpOwogICAgICAgICBpZiAoZXJyb3IgIT0gQzJfT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJzZXRFbmNvZGVBcmdzIGZhaWxlZCA6ICVkIiwgZXJyb3IpOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKQEAgLTE1NzksMTcgKzE3ODEsMTcgQEAKICAgICAgICAgLyogQ29tcHV0ZSB0aW1lIGVsYXBzZWQgYmV0d2VlbiBlbmQgb2YgcHJldmlvdXMgZGVjb2RlKCkKICAgICAgICAgICogdG8gc3RhcnQgb2YgY3VycmVudCBkZWNvZGUoKSAqLwogICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIHRpbWVEZWxheSk7Ci0gICAgICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCk7CisgICAgICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc192aWRlb19lbmNvZGVfaXAsICZzX3ZpZGVvX2VuY29kZV9vcCk7CiAKICAgICAgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7Ci0gICAgICAgICAgICBpZiAoKHNfZW5jb2RlX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSA9PSBJSDI2NEVfQklUU1RSRUFNX0JVRkZFUl9PVkVSRkxPVykgeworICAgICAgICAgICAgaWYgKChwc19lbmNvZGVfb3AtPnU0X2Vycm9yX2NvZGUgJiAweEZGKSA9PSBJSDI2NEVfQklUU1RSRUFNX0JVRkZFUl9PVkVSRkxPVykgewogICAgICAgICAgICAgICAgIC8vIFRPRE86IHVzZSBJVkVfQ01EX0NUTF9HRVRCVUZJTkZPIGZvciBwcm9wZXIgbWF4IGlucHV0IHNpemU/CiAgICAgICAgICAgICAgICAgbU91dEJ1ZmZlclNpemUgKj0gMjsKICAgICAgICAgICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dFKCJFbmNvZGUgRnJhbWUgZmFpbGVkID0gMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgc19lbmNvZGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICAgICAgICAgIHBzX2VuY29kZV9vcC0+dTRfZXJyb3JfY29kZSk7CiAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOwogICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKQEAgLTE1OTksNyArMTgwMSw3IEBACiAKICAgICAvLyBIb2xkIGlucHV0IGJ1ZmZlciByZWZlcmVuY2UKICAgICBpZiAoaW5wdXRCdWZmZXIpIHsKLSAgICAgICAgbUJ1ZmZlcnNbc19lbmNvZGVfaXAuc19pbnBfYnVmLmFwdl9idWZzWzBdXSA9IGlucHV0QnVmZmVyOworICAgICAgICBtQnVmZmVyc1twc19lbmNvZGVfaXAtPnNfaW5wX2J1Zi5hcHZfYnVmc1swXV0gPSBpbnB1dEJ1ZmZlcjsKICAgICB9CiAKICAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CkBAIC0xNjA3LDkgKzE4MDksOSBAQAogICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgdGltZVRha2VuKTsKIAogICAgIEFMT0dWKCJ0aW1lVGFrZW49JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQiLCB0aW1lVGFrZW4sIHRpbWVEZWxheSwKLSAgICAgICAgICAgIHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcyk7CisgICAgICAgICAgICBwc19lbmNvZGVfb3AtPnNfb3V0X2J1Zi51NF9ieXRlcyk7CiAKLSAgICB2b2lkICpmcmVlZCA9IHNfZW5jb2RlX29wLnNfaW5wX2J1Zi5hcHZfYnVmc1swXTsKKyAgICB2b2lkICpmcmVlZCA9IHBzX2VuY29kZV9vcC0+c19pbnBfYnVmLmFwdl9idWZzWzBdOwogICAgIC8qIElmIGVuY29kZXIgZnJlZXMgdXAgYW4gaW5wdXQgYnVmZmVyLCBtYXJrIGl0IGFzIGZyZWUgKi8KICAgICBpZiAoZnJlZWQgIT0gbnVsbHB0cikgewogICAgICAgICBpZiAobUJ1ZmZlcnMuY291bnQoZnJlZWQpID09IDB1KSB7CkBAIC0xNjIxLDE3ICsxODIzLDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoc19lbmNvZGVfb3Aub3V0cHV0X3ByZXNlbnQpIHsKLSAgICAgICAgaWYgKCFzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpIHsKKyAgICBpZiAocHNfZW5jb2RlX29wLT5vdXRwdXRfcHJlc2VudCkgeworICAgICAgICBpZiAoIXBzX2VuY29kZV9vcC0+c19vdXRfYnVmLnU0X2J5dGVzKSB7CiAgICAgICAgICAgICBBTE9HRSgiRXJyb3I6IE91dHB1dCBwcmVzZW50IGJ1dCBieXRlcyBnZW5lcmF0ZWQgaXMgemVybyIpOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgdWludDY0X3Qgd29ya0lkID0gKCh1aW50NjRfdClzX2VuY29kZV9vcC51NF90aW1lc3RhbXBfaGlnaCA8PCAzMikgfAotICAgICAgICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLnU0X3RpbWVzdGFtcF9sb3c7Ci0gICAgICAgIGZpbmlzaFdvcmsod29ya0lkLCB3b3JrLCAmc19lbmNvZGVfb3ApOworICAgICAgICB1aW50NjRfdCB3b3JrSWQgPSAoKHVpbnQ2NF90KXBzX2VuY29kZV9vcC0+dTRfdGltZXN0YW1wX2hpZ2ggPDwgMzIpIHwKKyAgICAgICAgICAgICAgICAgICAgICBwc19lbmNvZGVfb3AtPnU0X3RpbWVzdGFtcF9sb3c7CisgICAgICAgIGZpbmlzaFdvcmsod29ya0lkLCB3b3JrLCBwc19lbmNvZGVfb3ApOwogICAgIH0KICAgICBpZiAobVNhd0lucHV0RU9TKSB7CiAgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKQEAgLTE2NzEsOSArMTg3MywxMSBAQAogICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CiAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOwogICAgICAgICB9Ci0gICAgICAgIGl2ZV92aWRlb19lbmNvZGVfaXBfdCBzX2VuY29kZV9pcDsKLSAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90IHNfZW5jb2RlX29wOwotICAgICAgICBpZiAoQzJfT0sgIT0gc2V0RW5jb2RlQXJncygmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCwgbnVsbHB0ciwKKyAgICAgICAgaWgyNjRlX3ZpZGVvX2VuY29kZV9pcF90IHNfdmlkZW9fZW5jb2RlX2lwID0ge307CisgICAgICAgIGloMjY0ZV92aWRlb19lbmNvZGVfb3BfdCBzX3ZpZGVvX2VuY29kZV9vcCA9IHt9OworICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX2lwX3QgKnBzX2VuY29kZV9pcCA9ICZzX3ZpZGVvX2VuY29kZV9pcC5zX2l2ZV9pcDsKKyAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90ICpwc19lbmNvZGVfb3AgPSAmc192aWRlb19lbmNvZGVfb3Auc19pdmVfb3A7CisgICAgICAgIGlmIChDMl9PSyAhPSBzZXRFbmNvZGVBcmdzKHBzX2VuY29kZV9pcCwgcHNfZW5jb2RlX29wLCBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Vmlldy5iYXNlKCksIHdWaWV3LmNhcGFjaXR5KCksIDApKSB7CiAgICAgICAgICAgICBBTE9HRSgic2V0RW5jb2RlQXJncyBmYWlsZWQgZm9yIGRyYWluSW50ZXJuYWwiKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CkBAIC0xNjgxLDkgKzE4ODUsOSBAQAogICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CiAgICAgICAgIH0KLSAgICAgICAgKHZvaWQpaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wKTsKKyAgICAgICAgKHZvaWQpaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX3ZpZGVvX2VuY29kZV9pcCwgJnNfdmlkZW9fZW5jb2RlX29wKTsKIAotICAgICAgICB2b2lkICpmcmVlZCA9IHNfZW5jb2RlX29wLnNfaW5wX2J1Zi5hcHZfYnVmc1swXTsKKyAgICAgICAgdm9pZCAqZnJlZWQgPSBwc19lbmNvZGVfb3AtPnNfaW5wX2J1Zi5hcHZfYnVmc1swXTsKICAgICAgICAgLyogSWYgZW5jb2RlciBmcmVlcyB1cCBhbiBpbnB1dCBidWZmZXIsIG1hcmsgaXQgYXMgZnJlZSAqLwogICAgICAgICBpZiAoZnJlZWQgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgaWYgKG1CdWZmZXJzLmNvdW50KGZyZWVkKSA9PSAwdSkgewpAQCAtMTY5NSwxMCArMTg5OSwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHNfZW5jb2RlX29wLm91dHB1dF9wcmVzZW50KSB7Ci0gICAgICAgICAgICB1aW50NjRfdCB3b3JrSWQgPSAoKHVpbnQ2NF90KXNfZW5jb2RlX29wLnU0X3RpbWVzdGFtcF9oaWdoIDw8IDMyKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLnU0X3RpbWVzdGFtcF9sb3c7Ci0gICAgICAgICAgICBmaW5pc2hXb3JrKHdvcmtJZCwgd29yaywgJnNfZW5jb2RlX29wKTsKKyAgICAgICAgaWYgKHBzX2VuY29kZV9vcC0+b3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHdvcmtJZCA9ICgodWludDY0X3QpcHNfZW5jb2RlX29wLT51NF90aW1lc3RhbXBfaGlnaCA8PCAzMikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICBwc19lbmNvZGVfb3AtPnU0X3RpbWVzdGFtcF9sb3c7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHdvcmtJZCwgd29yaywgcHNfZW5jb2RlX29wKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmICh3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCAhPSAxdSkgewogICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOwpAQCAtMTc1NiwxMSArMTk2MCwxMyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEF2Y0VuY0ZhY3RvcnkoKTsKIH0KIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgZmFjdG9yeTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuaAppbmRleCA1NTUwNTViLi5iYWYzM2UyIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5oCkBAIC0yNCw4ICsyNCw3IEBACiAjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KIAogI2luY2x1ZGUgImloMjY0X3R5cGVkZWZzLmgiCi0jaW5jbHVkZSAiaXYyLmgiCi0jaW5jbHVkZSAiaXZlMi5oIgorI2luY2x1ZGUgImloMjY0ZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTEwMCw2ICs5OSwxMSBAQAogI2RlZmluZSBTVFJMRU5HVEggICAgICAgICAgICAgICAgICAgNTAwCiAjZGVmaW5lIERFRkFVTFRfQ09OU1RSQUlORURfSU5UUkEgICAwCiAKKy8qKiBsaW1pdHMgYXMgc3BlY2lmaWVkIGJ5IGgyNjQgKi8KKyNkZWZpbmUgQ09ERUNfUVBfTUlOICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ09ERUNfUVBfTUFYICAgICAgICAgICAgICAgIDUxCisKKwogI2RlZmluZSBNSU4oYSwgYikgKChhKSA8IChiKSk/IChhKSA6IChiKQogI2RlZmluZSBNQVgoYSwgYikgKChhKSA+IChiKSk/IChhKSA6IChiKQogI2RlZmluZSBBTElHTjE2KHgpICgoKCh4KSArIDE1KSA+PiA0KSA8PCA0KQpAQCAtMTkyLDYgKzE5Niw3IEBACiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gbUNvbG9yQXNwZWN0czsKIAogICAgIHVpbnQzMl90IG1PdXRCdWZmZXJTaXplOwogICAgIFVXT1JEMzIgbUhlYWRlckdlbmVyYXRlZDsKQEAgLTIyNSw2ICsyMzAsNyBAQAogICAgIGMyX3N0YXR1c190IHNldFByb2ZpbGVQYXJhbXMoKTsKICAgICBjMl9zdGF0dXNfdCBzZXREZWJsb2NrUGFyYW1zKCk7CiAgICAgYzJfc3RhdHVzX3Qgc2V0VmJ2UGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0VnVpUGFyYW1zKCk7CiAgICAgdm9pZCBsb2dWZXJzaW9uKCk7CiAgICAgYzJfc3RhdHVzX3Qgc2V0RW5jb2RlQXJncygKICAgICAgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfaXBfdCAqcHNfZW5jb2RlX2lwLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwCmluZGV4IGYxMDgzNWYuLjE2MGUyNTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL0FuZHJvaWQuYnAKQEAgLTEsNiArMSwxNSBAQAogLy8gRE8gTk9UIERFUEVORCBPTiBUSElTIERJUkVDVExZCiAvLyB1c2UgbGliY29kZWMyX3NvZnQtZGVmYXVsdHMgaW5zdGVhZAotY2NfbGlicmFyeV9zaGFyZWQgeworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfY29tbW9uIiwKICAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCkBAIC0yMCw3ICsyOSw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliY3V0aWxzIiwgLy8gZm9yIHByb3BlcnRpZXMKLSAgICAgICAgImxpYmxvZyIsICAgIC8vIGZvciBBTE9HCisgICAgICAgICJsaWJsb2ciLCAvLyBmb3IgQUxPRwogICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwgLy8gZm9yIEltYWdlQ29weQogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsIC8vIGZvciBNdXRleGVkCiAgICAgXSwKQEAgLTM4LDcgKzQ3LDcgQEAKIAogZmlsZWdyb3VwIHsKICAgICBuYW1lOiAiY29kZWMyX3NvZnRfZXhwb3J0cyIsCi0gICAgc3JjczogWyAiZXhwb3J0cy5sZHMiIF0sCisgICAgc3JjczogWyJleHBvcnRzLmxkcyJdLAogfQogCiAvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3Igc29mdHdhcmUgY29kZWMgaW1wbGVtZW50YXRpb24KQEAgLTkxLDEyICsxMDAsMjIgQEAKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCisgICAgfSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9jZmktZGVmYXVsdHMiLAorCisgICAgc2FuaXRpemU6IHsKICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBjb25maWc6IHsKKyAgICAgICAgICAgIGNmaV9hc3NlbWJseV9zdXBwb3J0OiB0cnVlLAorICAgICAgICB9LAogICAgIH0sCiB9CiAKIC8vIFRFTVA6IHVzZWQgYnkgY2hlZXRzMiBwcm9qZWN0IC0gcmVtb3ZlIHdoZW4gbm8gbG9uZ2VyIHVzZWQKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc2ltcGxlX2NvbXBvbmVudCIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKIApAQCAtMTMxLDQgKzE1MCwzIEBACiAKICAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJDb21wb25lbnQuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkNvbXBvbmVudC5jcHAKaW5kZXggZmIzZmJkMC4uZGZhZDIyNiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkNvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkNvbXBvbmVudC5jcHAKQEAgLTExMCwxNyArMTEwLDIwIEBACiAgICAgICAgIH0KICAgICAgICAgY2FzZSBrV2hhdFN0b3A6IHsKICAgICAgICAgICAgIGludDMyX3QgZXJyID0gdGhpei0+b25TdG9wKCk7CisgICAgICAgICAgICB0aGl6LT5tT3V0cHV0QmxvY2tQb29sLnJlc2V0KCk7CiAgICAgICAgICAgICBSZXBseShtc2csICZlcnIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBrV2hhdFJlc2V0OiB7CiAgICAgICAgICAgICB0aGl6LT5vblJlc2V0KCk7CisgICAgICAgICAgICB0aGl6LT5tT3V0cHV0QmxvY2tQb29sLnJlc2V0KCk7CiAgICAgICAgICAgICBtUnVubmluZyA9IGZhbHNlOwogICAgICAgICAgICAgUmVwbHkobXNnKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2Uga1doYXRSZWxlYXNlOiB7CiAgICAgICAgICAgICB0aGl6LT5vblJlbGVhc2UoKTsKKyAgICAgICAgICAgIHRoaXotPm1PdXRwdXRCbG9ja1Bvb2wucmVzZXQoKTsKICAgICAgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7CiAgICAgICAgICAgICBSZXBseShtc2cpOwogICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL0FuZHJvaWQuYnAKaW5kZXggYTA4MWUyOC4uZDZmZmQxMiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2JpbmFyeSB7CiAgICAgbmFtZTogImNvZGVjMnBsYXkiLAogICAgIGRlZmF1bHRzOiBbImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL2NvZGVjMi5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL2NvZGVjMi5jcHAKaW5kZXggZDYwMjVkZS4uYTE3YjA0ZSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9jb2RlYzIuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvY29kZWMyLmNwcApAQCAtMTM4LDcgKzEzOCw3IEBACiAKIFNpbXBsZVBsYXllcjo6U2ltcGxlUGxheWVyKCkKICAgICA6IG1MaXN0ZW5lcihuZXcgTGlzdGVuZXIodGhpcykpLAotICAgICAgbVByb2R1Y2VyTGlzdGVuZXIobmV3IER1bW15UHJvZHVjZXJMaXN0ZW5lciksCisgICAgICBtUHJvZHVjZXJMaXN0ZW5lcihuZXcgU3R1YlByb2R1Y2VyTGlzdGVuZXIpLAogICAgICAgbUxpbmVhclBvb2xJZChDMkJsb2NrUG9vbDo6UExBVEZPUk1fU1RBUlQpLAogICAgICAgbUNvbXBvc2VyQ2xpZW50KG5ldyBTdXJmYWNlQ29tcG9zZXJDbGllbnQpIHsKICAgICBDSEVDS19FUShtQ29tcG9zZXJDbGllbnQtPmluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9BbmRyb2lkLmJwCmluZGV4IDQ4Y2M1MWIuLjExNDNiZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0FuZHJvaWQuYnAKQEAgLTEsNCArMSwyMyBAQAotY2NfbGlicmFyeV9zaGFyZWQgeworcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjMl9jb21wb25lbnRzX2ZsYWNfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWMyX2NvbXBvbmVudHNfZmxhY19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfZmxhY2RlYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKQEAgLTE0LDcgKzMzLDcgQEAKICAgICBdLAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfZmxhY2VuYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNEZWMuY3BwCmluZGV4IDQwMzliOWIuLjQ5ODkyYTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmNwcApAQCAtMjIxLDYgKzIyMSwxMSBAQAogCiAgICAgdWludDhfdCAqaW5wdXQgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOwogICAgIGlmIChjb2RlY0NvbmZpZykgeworICAgICAgICBpZiAobUhhc1N0cmVhbUluZm8pIHsKKyAgICAgICAgICAgIEFMT0dWKCJJZ25vcmUgQ29kZWMgQ29uZmlnIik7CisgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIHN0YXR1c190IGRlY29kZXJFcnIgPSBtRkxBQ0RlY29kZXItPnBhcnNlTWV0YWRhdGEoaW5wdXQsIGluU2l6ZSk7CiAgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IE9LICYmIGRlY29kZXJFcnIgIT0gV09VTERfQkxPQ0spIHsKICAgICAgICAgICAgIEFMT0dFKCJwcm9jZXNzOiBGTEFDRGVjb2RlciBwYXJzZU1ldGFEYXRhIHJldHVybnMgZXJyb3IgJWQiLCBkZWNvZGVyRXJyKTsKQEAgLTM2NywxMSArMzcyLDEzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0RmxhY0RlY0ZhY3RvcnkoKTsKIH0KIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgZmFjdG9yeTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuY3BwCmluZGV4IDQwOGRiN2UuLjFjMGJhYmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmNwcApAQCAtNDgxLDExICs0ODEsMTMgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRGbGFjRW5jRmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBmYWN0b3J5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9BbmRyb2lkLmJwCmluZGV4IDNlZGU2OGMuLjQ1ZTg1YTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0FuZHJvaWQuYnAKQEAgLTEsNCArMSwyMyBAQAotY2NfbGlicmFyeV9zaGFyZWQgeworcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjMl9jb21wb25lbnRzX2c3MTFfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWMyX2NvbXBvbmVudHNfZzcxMV9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfZzcxMWFsYXdkZWMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCkBAIC03LDEyICsyNiwxNCBAQAogCiAgICAgc3JjczogWyJDMlNvZnRHNzExRGVjLmNwcCJdLAogCisgICAgc3RhdGljX2xpYnM6IFsiY29kZWNzX2c3MTFkZWMiXSwKKwogICAgIGNmbGFnczogWwogICAgICAgICAiLURBTEFXIiwKICAgICBdLAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfZzcxMW1sYXdkZWMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCkBAIC0yMCw0ICs0MSw2IEBACiAgICAgXSwKIAogICAgIHNyY3M6IFsiQzJTb2Z0RzcxMURlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImNvZGVjc19nNzExZGVjIl0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmNwcAppbmRleCA0ZmYwNzkzLi5mOTI5OWFmIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CiAjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KLQorI2luY2x1ZGUgPGc3MTFEZWMuaD4KICNpbmNsdWRlICJDMlNvZnRHNzExRGVjLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTIyNCw1MyArMjI0LDYgQEAKICAgICByZXR1cm4gQzJfT0s7CiB9CiAKLSNpZmRlZiBBTEFXCi12b2lkIEMyU29mdEc3MTFEZWM6OkRlY29kZUFMYXcoCi0gICAgICAgIGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpIHsKLSAgICB3aGlsZSAoaW5TaXplID4gMCkgewotICAgICAgICBpblNpemUtLTsKLSAgICAgICAgaW50MzJfdCB4ID0gKmluKys7Ci0KLSAgICAgICAgaW50MzJfdCBpeCA9IHggXiAweDU1OwotICAgICAgICBpeCAmPSAweDdmOwotCi0gICAgICAgIGludDMyX3QgaWV4cCA9IGl4ID4+IDQ7Ci0gICAgICAgIGludDMyX3QgbWFudCA9IGl4ICYgMHgwZjsKLQotICAgICAgICBpZiAoaWV4cCA+IDApIHsKLSAgICAgICAgICAgIG1hbnQgKz0gMTY7Ci0gICAgICAgIH0KLQotICAgICAgICBtYW50ID0gKG1hbnQgPDwgNCkgKyA4OwotCi0gICAgICAgIGlmIChpZXhwID4gMSkgewotICAgICAgICAgICAgbWFudCA9IG1hbnQgPDwgKGlleHAgLSAxKTsKLSAgICAgICAgfQotCi0gICAgICAgICpvdXQrKyA9ICh4ID4gMTI3KSA/IG1hbnQgOiAtbWFudDsKLSAgICB9Ci19Ci0jZWxzZQotdm9pZCBDMlNvZnRHNzExRGVjOjpEZWNvZGVNTGF3KAotICAgICAgICBpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7Ci0gICAgd2hpbGUgKGluU2l6ZSA+IDApIHsKLSAgICAgICAgaW5TaXplLS07Ci0gICAgICAgIGludDMyX3QgeCA9ICppbisrOwotCi0gICAgICAgIGludDMyX3QgbWFudGlzc2EgPSB+eDsKLSAgICAgICAgaW50MzJfdCBleHBvbmVudCA9IChtYW50aXNzYSA+PiA0KSAmIDc7Ci0gICAgICAgIGludDMyX3Qgc2VnbWVudCA9IGV4cG9uZW50ICsgMTsKLSAgICAgICAgbWFudGlzc2EgJj0gMHgwZjsKLQotICAgICAgICBpbnQzMl90IHN0ZXAgPSA0IDw8IHNlZ21lbnQ7Ci0KLSAgICAgICAgaW50MzJfdCBhYnMgPSAoMHg4MGwgPDwgZXhwb25lbnQpICsgc3RlcCAqIG1hbnRpc3NhICsgc3RlcCAvIDIgLSA0ICogMzM7Ci0KLSAgICAgICAgKm91dCsrID0gKHggPCAweDgwKSA/IC1hYnMgOiBhYnM7Ci0gICAgfQotfQotI2VuZGlmCi0KIGNsYXNzIEMyU29mdEc3MTFEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CiBwdWJsaWM6CiAgICAgQzJTb2Z0RzcxMURlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKQEAgLTMwNiwxMSArMjU5LDEzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0RzcxMURlY0ZhY3RvcnkoKTsKIH0KIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgZmFjdG9yeTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmgKaW5kZXggMjNlOGZmYy4uZjkzODQwYiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmgKQEAgLTQ1LDEyICs0NSw2IEBACiAgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKICAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CiAKLSNpZmRlZiBBTEFXCi0gICAgdm9pZCBEZWNvZGVBTGF3KGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpOwotI2Vsc2UKLSAgICB2b2lkIERlY29kZU1MYXcoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSk7Ci0jZW5kaWYKLQogICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEc3MTFEZWMpOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9BbmRyb2lkLmJwCmluZGV4IGYzNzQwODkuLjc2OTJkMzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0FuZHJvaWQuYnAKQEAgLTEsNCArMSwxMyBAQAotY2NfbGlicmFyeV9zaGFyZWQgeworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYXYxZGVjX2dhdjEiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0MyU29mdEdhdjFEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9DMlNvZnRHYXYxRGVjLmNwcAppbmRleCAxMjBiYTdhLi43NjM0NWFlIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0MyU29mdEdhdjFEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5jcHAKQEAgLTQ1OCwzMiArNDU4LDI4IEBACiAgIH0KIH0KIAotc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YsIHNpemVfdCBzcmNZU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKLSAgdWludDhfdCAqY29uc3QgZHN0U3RhcnQgPSBkc3Q7CitzdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZVjEyRnJhbWUodWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CiAKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgewotICAgIG1lbWNweShkc3QsIHNyY1ksIHdpZHRoKTsKKyAgICBtZW1jcHkoZHN0WSwgc3JjWSwgd2lkdGgpOwogICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKLSAgICBkc3QgKz0gZHN0WVN0cmlkZTsKKyAgICBkc3RZICs9IGRzdFlTdHJpZGU7CiAgIH0KIAotICBkc3QgPSBkc3RTdGFydCArIGRzdFlTdHJpZGUgKiBoZWlnaHQ7CiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgbWVtY3B5KGRzdCwgc3JjViwgd2lkdGggLyAyKTsKKyAgICBtZW1jcHkoZHN0Viwgc3JjViwgd2lkdGggLyAyKTsKICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7Ci0gICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7CiAgIH0KIAotICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KSArIChkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDIpOwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgIG1lbWNweShkc3QsIHNyY1UsIHdpZHRoIC8gMik7CisgICAgbWVtY3B5KGRzdFUsIHNyY1UsIHdpZHRoIC8gMik7CiAgICAgc3JjVSArPSBzcmNVU3RyaWRlOwotICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICBkc3RVICs9IGRzdFVWU3RyaWRlOwogICB9CiB9CiAKQEAgLTU1NSwxNSArNTUxLDExIEBACiB9CiAKIHN0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKAotICAgIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLAotICAgIGNvbnN0IHVpbnQxNl90ICpzcmNWLCBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsCi0gICAgc2l6ZV90IHNyY1ZTdHJpZGUsIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCisgICAgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKKyAgICBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLAorICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKLSAgdWludDhfdCAqZHN0WSA9ICh1aW50OF90ICopZHN0OwotICBzaXplX3QgZHN0WVNpemUgPSBkc3RZU3RyaWRlICogaGVpZ2h0OwotICBzaXplX3QgZHN0VVZTaXplID0gZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyOwotICB1aW50OF90ICpkc3RWID0gZHN0WSArIGRzdFlTaXplOwotICB1aW50OF90ICpkc3RVID0gZHN0ViArIGRzdFVWU2l6ZTsKIAogICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CiAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CkBAIC02NjcsMTAgKzY1OSwxMyBAQAogICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpLCBvdXQgZnJhbWVpbmRleCAlZCIsIGJsb2NrLT53aWR0aCgpLAogICAgICAgICBibG9jay0+aGVpZ2h0KCksIG1XaWR0aCwgbUhlaWdodCwgKGludClidWZmZXItPnVzZXJfcHJpdmF0ZV9kYXRhKTsKIAotICB1aW50OF90ICpkc3QgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgIHVpbnQ4X3QgKmRzdFkgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgIHVpbnQ4X3QgKmRzdFUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgIHVpbnQ4X3QgKmRzdFYgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSk7CiAgIHNpemVfdCBzcmNZU3RyaWRlID0gYnVmZmVyLT5zdHJpZGVbMF07CiAgIHNpemVfdCBzcmNVU3RyaWRlID0gYnVmZmVyLT5zdHJpZGVbMV07CiAgIHNpemVfdCBzcmNWU3RyaWRlID0gYnVmZmVyLT5zdHJpZGVbMl07CisKICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0ID0gd1ZpZXcubGF5b3V0KCk7CiAgIHNpemVfdCBkc3RZU3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0ucm93SW5jOwogICBzaXplX3QgZHN0VVZTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb3dJbmM7CkBAIC02ODIsMjAgKzY3NywyNCBAQAogCiAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMikgewogICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKAotICAgICAgICAgICh1aW50MzJfdCAqKWRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsIHNyY1VTdHJpZGUgLyAyLAorICAgICAgICAgICh1aW50MzJfdCAqKWRzdFksIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLCBzcmNVU3RyaWRlIC8gMiwKICAgICAgICAgICBzcmNWU3RyaWRlIC8gMiwgZHN0WVN0cmlkZSAvIHNpemVvZih1aW50MzJfdCksIG1XaWR0aCwgbUhlaWdodCk7CiAgICAgfSBlbHNlIHsKLSAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKGRzdFksIGRzdFUsIGRzdFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZLCBzcmNVLCBzcmNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSAvIDIsIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopYnVmZmVyLT5wbGFuZVswXTsKICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPnBsYW5lWzFdOwogICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+cGxhbmVbMl07Ci0gICAgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1ZTdHJpZGUsIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKGRzdFksIGRzdFUsIGRzdFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwogICB9CiAgIGZpbmlzaFdvcmsoYnVmZmVyLT51c2VyX3ByaXZhdGVfZGF0YSwgd29yaywgc3RkOjptb3ZlKGJsb2NrKSk7CiAgIGJsb2NrID0gbnVsbHB0cjsKQEAgLTc3MSwxMSArNzcwLDEzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5ICpDcmVhdGVDb2RlYzJGYWN0b3J5KCkgewogICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRHYXYxRmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5ICpmYWN0b3J5KSB7CiAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgZGVsZXRlIGZhY3Rvcnk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9BbmRyb2lkLmJwCmluZGV4IDkzMzBjMDEuLjJkMDk3NmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsMjMgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlYzJfY29tcG9uZW50c19nc21fbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWMyX2NvbXBvbmVudHNfZ3NtX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9nc21kZWMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuY3BwCmluZGV4IDI4N2NmYzYuLjk3NzY3N2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuY3BwCkBAIC0yOTQsMTEgKzI5NCwxMyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEdTTURlY0ZhY3RvcnkoKTsKIH0KIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgZmFjdG9yeTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuaAppbmRleCAyYjIwOWZlLi5lZGQyNzNiIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5oCkBAIC0xOSwxMCArMTksNyBAQAogCiAjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KIAotCi1leHRlcm4gIkMiIHsKLSAgICAjaW5jbHVkZSAiZ3NtLmgiCi19CisjaW5jbHVkZSAiZ3NtLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9BbmRyb2lkLmJwCmluZGV4IDM2OWJkNzguLmQxMzg4YjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0FuZHJvaWQuYnAKQEAgLTEsOCArMSwxOCBAQAotY2NfbGlicmFyeV9zaGFyZWQgeworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfaGV2Y2RlYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9jZmktZGVmYXVsdHMiLAogICAgIF0sCiAKICAgICBzcmNzOiBbIkMyU29mdEhldmNEZWMuY3BwIl0sCkBAIC0xMSwxMSArMjEsMTIgQEAKIAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfaGV2Y2VuYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9jZmktZGVmYXVsdHMiLAogICAgIF0sCiAKICAgICBzcmNzOiBbIkMyU29mdEhldmNFbmMuY3BwIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmNwcAppbmRleCAyMzEwNGRjLi42YmNmM2EyIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5jcHAKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgogCiAjaW5jbHVkZSAiQzJTb2Z0SGV2Y0RlYy5oIgotI2luY2x1ZGUgImloZXZjZF9jeGEuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zODAsMTIgKzM3OSwxNCBAQAogICAgIH0KIAogICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKLSAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICBpaGV2Y2RfY3hhX3ZpZGVvX2RlY29kZV9pcF90IHNfaGV2Y2RfZGVjb2RlX2lwID0ge307CisgICAgICAgIGloZXZjZF9jeGFfdmlkZW9fZGVjb2RlX29wX3Qgc19oZXZjZF9kZWNvZGVfb3AgPSB7fTsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAgPSAmc19oZXZjZF9kZWNvZGVfaXAuc19pdmRfdmlkZW9fZGVjb2RlX2lwX3Q7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wID0gJnNfaGV2Y2RfZGVjb2RlX29wLnNfaXZkX3ZpZGVvX2RlY29kZV9vcF90OwogCi0gICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsIG51bGxwdHIsIDAsIDAsIDApOwotICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKLSAgICAgICAgaWYgKDAgPT0gc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgc2V0RGVjb2RlQXJncyhwc19kZWNvZGVfaXAsIHBzX2RlY29kZV9vcCwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgMCwgMCk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgcHNfZGVjb2RlX2lwLCBwc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoMCA9PSBwc19kZWNvZGVfb3AtPnU0X291dHB1dF9wcmVzZW50KSB7CiAgICAgICAgICAgICByZXNldFBsdWdpbigpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTQwMCw4ICs0MDEsOCBAQAogfQogCiBzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpjcmVhdGVEZWNvZGVyKCkgewotICAgIGl2ZGV4dF9jcmVhdGVfaXBfdCBzX2NyZWF0ZV9pcDsKLSAgICBpdmRleHRfY3JlYXRlX29wX3Qgc19jcmVhdGVfb3A7CisgICAgaXZkZXh0X2NyZWF0ZV9pcF90IHNfY3JlYXRlX2lwID0ge307CisgICAgaXZkZXh0X2NyZWF0ZV9vcF90IHNfY3JlYXRlX29wID0ge307CiAKICAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jcmVhdGVfaXBfdCk7CiAgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QuZV9jbWQgPSBJVkRfQ01EX0NSRUFURTsKQEAgLTQyNyw4ICs0MjgsOCBAQAogfQogCiBzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpzZXROdW1Db3JlcygpIHsKLSAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCBzX3NldF9udW1fY29yZXNfaXA7Ci0gICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3Qgc19zZXRfbnVtX2NvcmVzX29wOworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfc2V0X251bV9jb3Jlc19pcCA9IHt9OworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90IHNfc2V0X251bV9jb3Jlc19vcCA9IHt9OwogCiAgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QpOwogICAgIHNfc2V0X251bV9jb3Jlc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOwpAQCAtNDQ3LDIyICs0NDgsMjYgQEAKIH0KIAogc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6c2V0UGFyYW1zKHNpemVfdCBzdHJpZGUsIElWRF9WSURFT19ERUNPREVfTU9ERV9UIGRlY19tb2RlKSB7Ci0gICAgaXZkX2N0bF9zZXRfY29uZmlnX2lwX3Qgc19zZXRfZHluX3BhcmFtc19pcDsKLSAgICBpdmRfY3RsX3NldF9jb25maWdfb3BfdCBzX3NldF9keW5fcGFyYW1zX29wOworICAgIGloZXZjZF9jeGFfY3RsX3NldF9jb25maWdfaXBfdCBzX2hldmNkX3NldF9keW5fcGFyYW1zX2lwID0ge307CisgICAgaWhldmNkX2N4YV9jdGxfc2V0X2NvbmZpZ19vcF90IHNfaGV2Y2Rfc2V0X2R5bl9wYXJhbXNfb3AgPSB7fTsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfaXBfdCAqcHNfc2V0X2R5bl9wYXJhbXNfaXAgPQorICAgICAgICAmc19oZXZjZF9zZXRfZHluX3BhcmFtc19pcC5zX2l2ZF9jdGxfc2V0X2NvbmZpZ19pcF90OworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90ICpwc19zZXRfZHluX3BhcmFtc19vcCA9CisgICAgICAgICZzX2hldmNkX3NldF9keW5fcGFyYW1zX29wLnNfaXZkX2N0bF9zZXRfY29uZmlnX29wX3Q7CiAKLSAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX2lwX3QpOwotICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKLSAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1NFVFBBUkFNUzsKLSAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X2Rpc3Bfd2QgPSAoVVdPUkQzMikgc3RyaWRlOwotICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9mcm1fc2tpcF9tb2RlID0gSVZEX1NLSVBfTk9ORTsKLSAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX291dF9tb2RlID0gSVZEX0RJU1BMQVlfRlJBTUVfT1VUOwotICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV92aWRfZGVjX21vZGUgPSBkZWNfbW9kZTsKLSAgICBzX3NldF9keW5fcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX29wX3QpOworICAgIHBzX3NldF9keW5fcGFyYW1zX2lwLT51NF9zaXplID0gc2l6ZW9mKGloZXZjZF9jeGFfY3RsX3NldF9jb25maWdfaXBfdCk7CisgICAgcHNfc2V0X2R5bl9wYXJhbXNfaXAtPmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgcHNfc2V0X2R5bl9wYXJhbXNfaXAtPmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1NFVFBBUkFNUzsKKyAgICBwc19zZXRfZHluX3BhcmFtc19pcC0+dTRfZGlzcF93ZCA9IChVV09SRDMyKSBzdHJpZGU7CisgICAgcHNfc2V0X2R5bl9wYXJhbXNfaXAtPmVfZnJtX3NraXBfbW9kZSA9IElWRF9TS0lQX05PTkU7CisgICAgcHNfc2V0X2R5bl9wYXJhbXNfaXAtPmVfZnJtX291dF9tb2RlID0gSVZEX0RJU1BMQVlfRlJBTUVfT1VUOworICAgIHBzX3NldF9keW5fcGFyYW1zX2lwLT5lX3ZpZF9kZWNfbW9kZSA9IGRlY19tb2RlOworICAgIHBzX3NldF9keW5fcGFyYW1zX29wLT51NF9zaXplID0gc2l6ZW9mKGloZXZjZF9jeGFfY3RsX3NldF9jb25maWdfb3BfdCk7CiAgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9keW5fcGFyYW1zX2lwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZHluX3BhcmFtc19vcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX3NldF9keW5fcGFyYW1zX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19zZXRfZHluX3BhcmFtc19vcCk7CiAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7Ci0gICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9keW5fcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgcHNfc2V0X2R5bl9wYXJhbXNfb3AtPnU0X2Vycm9yX2NvZGUpOwogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKQEAgLTQ3MCw4ICs0NzUsOCBAQAogfQogCiBzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpnZXRWZXJzaW9uKCkgewotICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCBzX2dldF92ZXJzaW9uaW5mb19pcDsKLSAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3Qgc19nZXRfdmVyc2lvbmluZm9fb3A7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfZ2V0X3ZlcnNpb25pbmZvX2lwID0ge307CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90IHNfZ2V0X3ZlcnNpb25pbmZvX29wID0ge307CiAgICAgVVdPUkQ4IGF1MV9idWZbNTEyXTsKIAogICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90KTsKQEAgLTUyOSw3ICs1MzQsNyBAQAogICAgICAgICBpZiAoT0sgIT0gc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfRlJBTUUpKSByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHNfZGVjb2RlX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfaXBfdCk7CisgICAgcHNfZGVjb2RlX2lwLT51NF9zaXplID0gc2l6ZW9mKGloZXZjZF9jeGFfdmlkZW9fZGVjb2RlX2lwX3QpOwogICAgIHBzX2RlY29kZV9pcC0+ZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0RFQ09ERTsKICAgICBpZiAoaW5CdWZmZXIpIHsKICAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IHRzTWFya2VyOwpAQCAtNTU4LDE1ICs1NjMsMTUgQEAKICAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBtT3V0QnVmZmVyRmx1c2ggKyBsdW1hU2l6ZSArIGNocm9tYVNpemU7CiAgICAgfQogICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X251bV9idWZzID0gMzsKLSAgICBwc19kZWNvZGVfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9vcF90KTsKKyAgICBwc19kZWNvZGVfb3AtPnU0X3NpemUgPSBzaXplb2YoaWhldmNkX2N4YV92aWRlb19kZWNvZGVfb3BfdCk7CiAgICAgcHNfZGVjb2RlX29wLT51NF9vdXRwdXRfcHJlc2VudCA9IDA7CiAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAogYm9vbCBDMlNvZnRIZXZjRGVjOjpnZXRWdWlQYXJhbXMoKSB7Ci0gICAgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90IHNfZ2V0X3Z1aV9wYXJhbXNfaXA7Ci0gICAgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19vcF90IHNfZ2V0X3Z1aV9wYXJhbXNfb3A7CisgICAgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90IHNfZ2V0X3Z1aV9wYXJhbXNfaXAgPSB7fTsKKyAgICBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3Qgc19nZXRfdnVpX3BhcmFtc19vcCA9IHt9OwogCiAgICAgc19nZXRfdnVpX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCk7CiAgICAgc19nZXRfdnVpX3BhcmFtc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOwpAQCAtNjE0LDggKzYxOSw4IEBACiB9CiAKIHN0YXR1c190IEMyU29mdEhldmNEZWM6OnNldEZsdXNoTW9kZSgpIHsKLSAgICBpdmRfY3RsX2ZsdXNoX2lwX3Qgc19zZXRfZmx1c2hfaXA7Ci0gICAgaXZkX2N0bF9mbHVzaF9vcF90IHNfc2V0X2ZsdXNoX29wOworICAgIGl2ZF9jdGxfZmx1c2hfaXBfdCBzX3NldF9mbHVzaF9pcCA9IHt9OworICAgIGl2ZF9jdGxfZmx1c2hfb3BfdCBzX3NldF9mbHVzaF9vcCA9IHt9OwogCiAgICAgc19zZXRfZmx1c2hfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX2lwX3QpOwogICAgIHNfc2V0X2ZsdXNoX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CkBAIC02MzMsOCArNjM4LDggQEAKIH0KIAogc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6cmVzZXREZWNvZGVyKCkgewotICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX3Jlc2V0X2lwOwotICAgIGl2ZF9jdGxfcmVzZXRfb3BfdCBzX3Jlc2V0X29wOworICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX3Jlc2V0X2lwID0ge307CisgICAgaXZkX2N0bF9yZXNldF9vcF90IHNfcmVzZXRfb3AgPSB7fTsKIAogICAgIHNfcmVzZXRfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X2lwX3QpOwogICAgIHNfcmVzZXRfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKQEAgLTY2Miw4ICs2NjcsOCBAQAogCiBzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpkZWxldGVEZWNvZGVyKCkgewogICAgIGlmIChtRGVjSGFuZGxlKSB7Ci0gICAgICAgIGl2ZGV4dF9kZWxldGVfaXBfdCBzX2RlbGV0ZV9pcDsKLSAgICAgICAgaXZkZXh0X2RlbGV0ZV9vcF90IHNfZGVsZXRlX29wOworICAgICAgICBpdmRleHRfZGVsZXRlX2lwX3Qgc19kZWxldGVfaXAgPSB7fTsKKyAgICAgICAgaXZkZXh0X2RlbGV0ZV9vcF90IHNfZGVsZXRlX29wID0ge307CiAKICAgICAgICAgc19kZWxldGVfaXAuc19pdmRfZGVsZXRlX2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfZGVsZXRlX2lwX3QpOwogICAgICAgICBzX2RlbGV0ZV9pcC5zX2l2ZF9kZWxldGVfaXBfdC5lX2NtZCA9IElWRF9DTURfREVMRVRFOwpAQCAtODM1LDkgKzg0MCwxMSBAQAogICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7Ci0gICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKLSAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCAmclZpZXcsICZ3VmlldywKKyAgICAgICAgaWhldmNkX2N4YV92aWRlb19kZWNvZGVfaXBfdCBzX2hldmNkX2RlY29kZV9pcCA9IHt9OworICAgICAgICBpaGV2Y2RfY3hhX3ZpZGVvX2RlY29kZV9vcF90IHNfaGV2Y2RfZGVjb2RlX29wID0ge307CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwID0gJnNfaGV2Y2RfZGVjb2RlX2lwLnNfaXZkX3ZpZGVvX2RlY29kZV9pcF90OworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY29kZV9vcCA9ICZzX2hldmNkX2RlY29kZV9vcC5zX2l2ZF92aWRlb19kZWNvZGVfb3BfdDsKKyAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKHBzX2RlY29kZV9pcCwgcHNfZGVjb2RlX29wLCAmclZpZXcsICZ3VmlldywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT2Zmc2V0ICsgaW5Qb3MsIGluU2l6ZSAtIGluUG9zLCB3b3JrSW5kZXgpKSB7CiAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKQEAgLTg1MiwyNiArODU5LDI2IEBACiAgICAgICAgIFdPUkQzMiBkZWxheTsKICAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CiAgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgZGVsYXkpOwotICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCBwc19kZWNvZGVfaXAsIHBzX2RlY29kZV9vcCk7CiAgICAgICAgIFdPUkQzMiBkZWNvZGVUaW1lOwogICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CiAgICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgZGVjb2RlVGltZSk7CiAgICAgICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgZGVjb2RlVGltZSwgZGVsYXksCi0gICAgICAgICAgICAgIHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZCk7Ci0gICAgICAgIGlmIChJVkRfTUVNX0FMTE9DX0ZBSUxFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSkgeworICAgICAgICAgICAgICBwc19kZWNvZGVfb3AtPnU0X251bV9ieXRlc19jb25zdW1lZCk7CisgICAgICAgIGlmIChJVkRfTUVNX0FMTE9DX0ZBSUxFRCA9PSAocHNfZGVjb2RlX29wLT51NF9lcnJvcl9jb2RlICYgSVZEX0VSUk9SX01BU0spKSB7CiAgICAgICAgICAgICBBTE9HRSgiYWxsb2NhdGlvbiBmYWlsdXJlIGluIGRlY29kZXIiKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OwogICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9IGVsc2UgaWYgKElWRF9TVFJFQU1fV0lEVEhfSEVJR0hUX05PVF9TVVBQT1JURUQgPT0KLSAgICAgICAgICAgICAgICAgICAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSkgeworICAgICAgICAgICAgICAgICAgIChwc19kZWNvZGVfb3AtPnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpIHsKICAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCByZXNvbHV0aW9uIDogJWR4JWQiLCBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CiAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CiAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoSVZEX1JFU19DSEFOR0VEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgSVZEX0VSUk9SX01BU0spKSB7CisgICAgICAgIH0gZWxzZSBpZiAoSVZEX1JFU19DSEFOR0VEID09IChwc19kZWNvZGVfb3AtPnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpIHsKICAgICAgICAgICAgIEFMT0dWKCJyZXNvbHV0aW9uIGNoYW5nZWQiKTsKICAgICAgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX05PX0VPUywgcG9vbCwgd29yayk7CiAgICAgICAgICAgICByZXNldERlY29kZXIoKTsKQEAgLTg4MCwxNiArODg3LDE2IEBACiAKICAgICAgICAgICAgIC8qIERlY29kZSBoZWFkZXIgYW5kIGdldCBuZXcgZGltZW5zaW9ucyAqLwogICAgICAgICAgICAgc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfSEVBREVSKTsKLSAgICAgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOwotICAgICAgICB9IGVsc2UgaWYgKElTX0lWRF9GQVRBTF9FUlJPUihzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlKSkgewotICAgICAgICAgICAgQUxPR0UoIkZhdGFsIGVycm9yIGluIGRlY29kZXIgMHgleCIsIHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCBwc19kZWNvZGVfaXAsIHBzX2RlY29kZV9vcCk7CisgICAgICAgIH0gZWxzZSBpZiAoSVNfSVZEX0ZBVEFMX0VSUk9SKHBzX2RlY29kZV9vcC0+dTRfZXJyb3JfY29kZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYXRhbCBlcnJvciBpbiBkZWNvZGVyIDB4JXgiLCBwc19kZWNvZGVfb3AtPnU0X2Vycm9yX2NvZGUpOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CiAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHNfZGVjb2RlX29wLmk0X3Jlb3JkZXJfZGVwdGggPj0gMCAmJiBtT3V0cHV0RGVsYXkgIT0gc19kZWNvZGVfb3AuaTRfcmVvcmRlcl9kZXB0aCkgewotICAgICAgICAgICAgbU91dHB1dERlbGF5ID0gc19kZWNvZGVfb3AuaTRfcmVvcmRlcl9kZXB0aDsKKyAgICAgICAgaWYgKHBzX2RlY29kZV9vcC0+aTRfcmVvcmRlcl9kZXB0aCA+PSAwICYmIG1PdXRwdXREZWxheSAhPSBwc19kZWNvZGVfb3AtPmk0X3Jlb3JkZXJfZGVwdGgpIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheSA9IHBzX2RlY29kZV9vcC0+aTRfcmVvcmRlcl9kZXB0aDsKICAgICAgICAgICAgIEFMT0dWKCJOZXcgT3V0cHV0IGRlbGF5ICVkICIsIG1PdXRwdXREZWxheSk7CiAKICAgICAgICAgICAgIEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQgb3V0cHV0RGVsYXkobU91dHB1dERlbGF5KTsKQEAgLTkwNiwxNyArOTEzLDE2IEBACiAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIGlmICgwIDwgc19kZWNvZGVfb3AudTRfcGljX3dkICYmIDAgPCBzX2RlY29kZV9vcC51NF9waWNfaHQpIHsKKyAgICAgICAgaWYgKDAgPCBwc19kZWNvZGVfb3AtPnU0X3BpY193ZCAmJiAwIDwgcHNfZGVjb2RlX29wLT51NF9waWNfaHQpIHsKICAgICAgICAgICAgIGlmIChtSGVhZGVyRGVjb2RlZCA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgIG1IZWFkZXJEZWNvZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzZXRQYXJhbXMoQUxJR04zMihzX2RlY29kZV9vcC51NF9waWNfd2QpLCBJVkRfREVDT0RFX0ZSQU1FKTsKKyAgICAgICAgICAgICAgICBzZXRQYXJhbXMoQUxJR04zMihwc19kZWNvZGVfb3AtPnU0X3BpY193ZCksIElWRF9ERUNPREVfRlJBTUUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X3BpY193ZCAhPSBtV2lkdGggfHwgIHNfZGVjb2RlX29wLnU0X3BpY19odCAhPSBtSGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgbVdpZHRoID0gc19kZWNvZGVfb3AudTRfcGljX3dkOwotICAgICAgICAgICAgICAgIG1IZWlnaHQgPSBzX2RlY29kZV9vcC51NF9waWNfaHQ7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoMHUsIHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KTsKKyAgICAgICAgICAgIGlmIChwc19kZWNvZGVfb3AtPnU0X3BpY193ZCAhPSBtV2lkdGggfHwgIHBzX2RlY29kZV9vcC0+dTRfcGljX2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtV2lkdGggPSBwc19kZWNvZGVfb3AtPnU0X3BpY193ZDsKKyAgICAgICAgICAgICAgICBtSGVpZ2h0ID0gcHNfZGVjb2RlX29wLT51NF9waWNfaHQ7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoMHUsIHBzX2RlY29kZV9vcC0+dTRfb3V0cHV0X3ByZXNlbnQpOwogCiAgICAgICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKQEAgLTkzNiwxNSArOTQyLDE1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgKHZvaWQpIGdldFZ1aVBhcmFtcygpOwotICAgICAgICBoYXNQaWN0dXJlIHw9ICgxID09IHNfZGVjb2RlX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZyk7Ci0gICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgewotICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIGhhc1BpY3R1cmUgfD0gKDEgPT0gcHNfZGVjb2RlX29wLT51NF9mcmFtZV9kZWNvZGVkX2ZsYWcpOworICAgICAgICBpZiAocHNfZGVjb2RlX29wLT51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhwc19kZWNvZGVfb3AtPnU0X3RzLCB3b3JrKTsKICAgICAgICAgfQotICAgICAgICBpZiAoMCA9PSBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpIHsKKyAgICAgICAgaWYgKDAgPT0gcHNfZGVjb2RlX29wLT51NF9udW1fYnl0ZXNfY29uc3VtZWQpIHsKICAgICAgICAgICAgIEFMT0dEKCJCeXRlcyBjb25zdW1lZCBpcyB6ZXJvLiBJZ25vcmluZyByZW1haW5pbmcgYnl0ZXMiKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGluUG9zICs9IHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZDsKKyAgICAgICAgaW5Qb3MgKz0gcHNfZGVjb2RlX29wLT51NF9udW1fYnl0ZXNfY29uc3VtZWQ7CiAgICAgICAgIGlmIChoYXNQaWN0dXJlICYmIChpblNpemUgLSBpblBvcykpIHsKICAgICAgICAgICAgIEFMT0dEKCJkZWNvZGVkIGZyYW1lIGluIGN1cnJlbnQgYWNjZXNzIG5hbCwgaWdub3JpbmcgZnVydGhlciB0cmFpbGluZyBieXRlcyAlZCIsCiAgICAgICAgICAgICAgICAgICAoaW50KWluU2l6ZSAtIChpbnQpaW5Qb3MpOwpAQCAtOTg2LDE2ICs5OTIsMTggQEAKICAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOwogICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKICAgICAgICAgfQotICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7Ci0gICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKLSAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCBudWxscHRyLCAmd1ZpZXcsIDAsIDAsIDApKSB7CisgICAgICAgIGloZXZjZF9jeGFfdmlkZW9fZGVjb2RlX2lwX3Qgc19oZXZjZF9kZWNvZGVfaXAgPSB7fTsKKyAgICAgICAgaWhldmNkX2N4YV92aWRlb19kZWNvZGVfb3BfdCBzX2hldmNkX2RlY29kZV9vcCA9IHt9OworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY29kZV9pcCA9ICZzX2hldmNkX2RlY29kZV9pcC5zX2l2ZF92aWRlb19kZWNvZGVfaXBfdDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNvZGVfb3AgPSAmc19oZXZjZF9kZWNvZGVfb3Auc19pdmRfdmlkZW9fZGVjb2RlX29wX3Q7CisgICAgICAgIGlmICghc2V0RGVjb2RlQXJncyhwc19kZWNvZGVfaXAsIHBzX2RlY29kZV9vcCwgbnVsbHB0ciwgJndWaWV3LCAwLCAwLCAwKSkgewogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CiAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOwogICAgICAgICB9Ci0gICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOwotICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKLSAgICAgICAgICAgIGZpbmlzaFdvcmsoc19kZWNvZGVfb3AudTRfdHMsIHdvcmspOworICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsIHBzX2RlY29kZV9pcCwgcHNfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKHBzX2RlY29kZV9vcC0+dTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsocHNfZGVjb2RlX29wLT51NF90cywgd29yayk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xMDQ4LDExICsxMDU2LDEzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0SGV2Y0RlY0ZhY3RvcnkoKTsKIH0KIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgZmFjdG9yeTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmgKaW5kZXggNjAwZDdjMS4uYjliMGE0OCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmgKQEAgLTIzLDggKzIzLDcgQEAKICNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgogCiAjaW5jbHVkZSAiaWhldmNfdHlwZWRlZnMuaCIKLSNpbmNsdWRlICJpdi5oIgotI2luY2x1ZGUgIml2ZC5oIgorI2luY2x1ZGUgImloZXZjZF9jeGEuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmNwcAppbmRleCBjMmQyNTQwLi40YmMxNzc3IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0VuYy5jcHAKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogCiAjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPENvZGVjMk1hcHBlci5oPgogI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CiAjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KICNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgpAQCAtMjA4LDYgKzIwOSw0MiBAQAogICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAogICAgICAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1TeW5jRnJhbWVQZXJpb2QpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQogICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2RlZENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9MSU1JVEVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyLCBtQ29sb3JBc3BlY3RzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKICAgICB9CiAKICAgICBzdGF0aWMgQzJSIElucHV0RGVsYXlTZXR0ZXIoCkBAIC00MDIsNiArNDM5LDM0IEBACiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ+IGdldEdvcF9sKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbUdvcDsKICAgICB9CisgICAgc3RhdGljIEMyUiBDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKyAgICBzdGF0aWMgQzJSIENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZjb2RlZCkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBjb2RlZC52LnJhbmdlOworICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBjb2RlZC52LnByaW1hcmllczsKKyAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBjb2RlZC52LnRyYW5zZmVyOworICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBjb2RlZC52Lm1hdHJpeDsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBnZXRDb2RlZENvbG9yQXNwZWN0c19sKCkgeworICAgICAgICByZXR1cm4gbUNvZGVkQ29sb3JBc3BlY3RzOworICAgIH0KIAogICAgcHJpdmF0ZToKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQ+IG1Vc2FnZTsKQEAgLTQxNSw2ICs0ODAsOCBAQAogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbVByb2ZpbGVMZXZlbDsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0PiBtU3luY0ZyYW1lUGVyaW9kOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUdvcFR1bmluZzo6b3V0cHV0PiBtR29wOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiBtQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gbUNvZGVkQ29sb3JBc3BlY3RzOwogfTsKIAogc3RhdGljIHNpemVfdCBHZXRDUFVDb3JlQ291bnQoKSB7CkBAIC01MzMsNiArNjAwLDMyIEBACiAgICAgICAgICAgICBtQmZyYW1lcyA9IG1heEJmcmFtZXM7CiAgICAgICAgIH0KICAgICB9CisgICAgQ29sb3JBc3BlY3RzIHNmQXNwZWN0czsKKyAgICBpZiAoIUMyTWFwcGVyOjptYXAobUNvbG9yQXNwZWN0cy0+cHJpbWFyaWVzLCAmc2ZBc3BlY3RzLm1QcmltYXJpZXMpKSB7CisgICAgICAgIHNmQXNwZWN0cy5tUHJpbWFyaWVzID0gYW5kcm9pZDo6Q29sb3JBc3BlY3RzOjpQcmltYXJpZXNVbnNwZWNpZmllZDsKKyAgICB9CisgICAgaWYgKCFDMk1hcHBlcjo6bWFwKG1Db2xvckFzcGVjdHMtPnJhbmdlLCAmc2ZBc3BlY3RzLm1SYW5nZSkpIHsKKyAgICAgICAgc2ZBc3BlY3RzLm1SYW5nZSA9IGFuZHJvaWQ6OkNvbG9yQXNwZWN0czo6UmFuZ2VVbnNwZWNpZmllZDsKKyAgICB9CisgICAgaWYgKCFDMk1hcHBlcjo6bWFwKG1Db2xvckFzcGVjdHMtPm1hdHJpeCwgJnNmQXNwZWN0cy5tTWF0cml4Q29lZmZzKSkgeworICAgICAgICBzZkFzcGVjdHMubU1hdHJpeENvZWZmcyA9IGFuZHJvaWQ6OkNvbG9yQXNwZWN0czo6TWF0cml4VW5zcGVjaWZpZWQ7CisgICAgfQorICAgIGlmICghQzJNYXBwZXI6Om1hcChtQ29sb3JBc3BlY3RzLT50cmFuc2ZlciwgJnNmQXNwZWN0cy5tVHJhbnNmZXIpKSB7CisgICAgICAgIHNmQXNwZWN0cy5tVHJhbnNmZXIgPSBhbmRyb2lkOjpDb2xvckFzcGVjdHM6OlRyYW5zZmVyVW5zcGVjaWZpZWQ7CisgICAgfQorICAgIGludDMyX3QgcHJpbWFyaWVzLCB0cmFuc2ZlciwgbWF0cml4Q29lZmZzOworICAgIGJvb2wgcmFuZ2U7CisgICAgQ29sb3JVdGlsczo6Y29udmVydENvZGVjQ29sb3JBc3BlY3RzVG9Jc29Bc3BlY3RzKHNmQXNwZWN0cywKKyAgICAgICAgICAgICZwcmltYXJpZXMsCisgICAgICAgICAgICAmdHJhbnNmZXIsCisgICAgICAgICAgICAmbWF0cml4Q29lZmZzLAorICAgICAgICAgICAgJnJhbmdlKTsKKyAgICBtRW5jUGFyYW1zLnNfb3V0X3N0cm1fcHJtcy5pNF92dWlfZW5hYmxlID0gMTsKKyAgICBtRW5jUGFyYW1zLnNfdnVpX3NlaV9wcm1zLnUxX2NvbG91cl9kZXNjcmlwdGlvbl9wcmVzZW50X2ZsYWcgPSAxOworICAgIG1FbmNQYXJhbXMuc192dWlfc2VpX3BybXMudTFfY29sb3VyX3ByaW1hcmllcyA9IHByaW1hcmllczsKKyAgICBtRW5jUGFyYW1zLnNfdnVpX3NlaV9wcm1zLnUxX3RyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyA9IHRyYW5zZmVyOworICAgIG1FbmNQYXJhbXMuc192dWlfc2VpX3BybXMudTFfbWF0cml4X2NvZWZmaWNpZW50cyA9IG1hdHJpeENvZWZmczsKKyAgICBtRW5jUGFyYW1zLnNfdnVpX3NlaV9wcm1zLnUxX3ZpZGVvX2Z1bGxfcmFuZ2VfZmxhZyA9IHJhbmdlOwogICAgIC8vIHVwZGF0ZSBjb25maWd1cmF0aW9uCiAgICAgbUVuY1BhcmFtcy5zX3NyY19wcm1zLmk0X3dpZHRoID0gbVNpemUtPndpZHRoOwogICAgIG1FbmNQYXJhbXMuc19zcmNfcHJtcy5pNF9oZWlnaHQgPSBtU2l6ZS0+aGVpZ2h0OwpAQCAtNjI5LDYgKzcyMiw3IEBACiAgICAgICAgIG1RdWFsaXR5ID0gbUludGYtPmdldFF1YWxpdHlfbCgpOwogICAgICAgICBtR29wID0gbUludGYtPmdldEdvcF9sKCk7CiAgICAgICAgIG1SZXF1ZXN0U3luYyA9IG1JbnRmLT5nZXRSZXF1ZXN0U3luY19sKCk7CisgICAgICAgIG1Db2xvckFzcGVjdHMgPSBtSW50Zi0+Z2V0Q29kZWRDb2xvckFzcGVjdHNfbCgpOwogICAgIH0KIAogICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGluaXRFbmNQYXJhbXMoKTsKQEAgLTEwNzgsMTEgKzExNzIsMTMgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRIZXZjRW5jRmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBmYWN0b3J5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuaAppbmRleCA1ZWE0NjAyLi45ZGJmNjgyIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuaApAQCAtODksNiArODksNyBAQAogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVF1YWxpdHlUdW5pbmc6Om91dHB1dD4gbVF1YWxpdHk7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ+IG1Hb3A7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBtUmVxdWVzdFN5bmM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBtQ29sb3JBc3BlY3RzOwogI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKICAgICBjaGFyIG1JbkZpbGVbMjAwXTsKICAgICBjaGFyIG1PdXRGaWxlWzIwMF07CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9BbmRyb2lkLmJwCmluZGV4IDY2NjY1ZWQuLjQzN2QzNGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsMjMgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlYzJfY29tcG9uZW50c19tcDNfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWMyX2NvbXBvbmVudHNfbXAzX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9tcDNkZWMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuY3BwCmluZGV4IDViYTdlM2QuLjcxMzc3NjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuY3BwCkBAIC01MzksMTEgKzUzOSwxMyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE1wM0RlY0ZhY3RvcnkoKTsKIH0KIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgZmFjdG9yeTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9BbmRyb2lkLmJwCmluZGV4IDg0MWYwYTkuLmRhYTEwYWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQW5kcm9pZC5icApAQCAtMSw0ICsxLDEzIEBACi1jY19saWJyYXJ5X3NoYXJlZCB7CitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9tcGVnMmRlYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmNwcAppbmRleCA1NWRkNDc1Li5iMWNmMzg4IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuY3BwCkBAIC0zMCw2ICszMCw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIGNvbnN0ZXhwciBzaXplX3Qga01pbklucHV0QnVmZmVyU2l6ZSA9IDIgKiAxMDI0ICogMTAyNDsKK2NvbnN0ZXhwciBzaXplX3Qga01heERpbWVuc2lvbiA9IDE5MjA7CiBjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQubXBlZzIuZGVjb2RlciI7CiAKIGNsYXNzIEMyU29mdE1wZWcyRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgewpAQCAtNjQsOCArNjUsOCBAQAogICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpCiAgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCiAgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoewotICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDE2LCAxOTIwLCA0KSwKLSAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMTYsIDEwODgsIDQpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDE2LCBrTWF4RGltZW5zaW9uLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMTYsIGtNYXhEaW1lbnNpb24sIDIpLAogICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CkBAIC05MSw4ICs5Miw4IEBACiAgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFNpemUsIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUpCiAgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKICAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7Ci0gICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMTkyMCwgMiksCi0gICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDEwODgsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIGtNYXhEaW1lbnNpb24sIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCBrTWF4RGltZW5zaW9uLCAyKSwKICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CkBAIC0yMDQsOCArMjA1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgewogICAgICAgICAodm9pZCltYXlCbG9jazsKICAgICAgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuIGhhcmRjb2RpbmcKLSAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDE5MjB1KTsKLSAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDEwODh1KTsKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIGtNYXhEaW1lbnNpb24pOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwga01heERpbWVuc2lvbik7CiAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CiAgICAgfQogCkBAIC0xMTEzLDExICsxMTE0LDEzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0TXBlZzJEZWNGYWN0b3J5KCk7CiB9CiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgZGVsZXRlIGZhY3Rvcnk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0FuZHJvaWQuYnAKaW5kZXggNDFlNGY0NC4uZTE5ZmE0NSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQW5kcm9pZC5icApAQCAtMSw0ICsxLDIzIEBACi1jY19saWJyYXJ5X3NoYXJlZCB7CitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWMyX2NvbXBvbmVudHNfbXBlZzRfaDI2M19saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlYzJfY29tcG9uZW50c19tcGVnNF9oMjYzX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9tcGVnNGRlYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKQEAgLTE1LDcgKzM0LDcgQEAKICAgICBdLAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfaDI2M2RlYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKQEAgLTMxLDcgKzUwLDcgQEAKICAgICBdLAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfbXBlZzRlbmMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCkBAIC00OSw3ICs2OCw3IEBACiAgICAgXSwKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2gyNjNlbmMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwCmluZGV4IDYxYjI4NmMuLmRkZDMxMmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwCkBAIC0zNSw4ICszNSwxMCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogY29uc3RleHByIHNpemVfdCBrTWluSW5wdXRCdWZmZXJTaXplID0gMiAqIDEwMjQgKiAxMDI0OwogI2lmZGVmIE1QRUc0Citjb25zdGV4cHIgc2l6ZV90IGtNYXhEaW1lbnNpb24gPSAxOTIwOwogY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm1wZWc0LmRlY29kZXIiOwogI2Vsc2UKK2NvbnN0ZXhwciBzaXplX3Qga01heERpbWVuc2lvbiA9IDM1MjsKIGNvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5oMjYzLmRlY29kZXIiOwogI2VuZGlmCiAKQEAgLTc1LDEzICs3Nyw4IEBACiAgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKICAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDE3NiwgMTQ0KSkKICAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7Ci0jaWZkZWYgTVBFRzQKLSAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAxOTIwLCAyKSwKLSAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMTA4OCwgMiksCi0jZWxzZQotICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDM1MiwgMiksCi0gICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDI4OCwgMiksCi0jZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCBrTWF4RGltZW5zaW9uLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwga01heERpbWVuc2lvbiwgMiksCiAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQogICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKQEAgLTEzMCwxOSArMTI3LDEwIEBACiAKICAgICAgICAgYWRkUGFyYW1ldGVyKAogICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhTaXplLCBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFKQotI2lmZGVmIE1QRUc0Ci0gICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDE5MjAsIDEwODgpKQotI2Vsc2UKICAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dCgwdSwgMzUyLCAyODgpKQotI2VuZGlmCiAgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoewotI2lmZGVmIE1QRUc0Ci0gICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMTkyMCwgMiksCi0gICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDEwODgsIDIpLAotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAzNTIsIDIpLAotICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyODgsIDIpLAotI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwga01heERpbWVuc2lvbiwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIGtNYXhEaW1lbnNpb24sIDIpLAogICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQogICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKQEAgLTIwMCwxMyArMTg4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgewogICAgICAgICAodm9pZCltYXlCbG9jazsKICAgICAgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuIGhhcmRjb2RpbmcKLSNpZmRlZiBNUEVHNAotICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgMTkyMHUpOwotICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgMTA4OHUpOwotI2Vsc2UKLSAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDM1MnUpOwotICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgMjg4dSk7Ci0jZW5kaWYKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIGtNYXhEaW1lbnNpb24pOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwga01heERpbWVuc2lvbik7CiAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CiAgICAgfQogCkBAIC00NjQsMzQgKzQ0NywzNCBAQAogLyogVE9ETzogY2FuIHJlbW92ZSB0ZW1wb3JhcnkgY29weSBhZnRlciBsaWJyYXJ5IHN1cHBvcnRzIHdyaXRpbmcgdG8gZGlzcGxheQogICogYnVmZmVyIFksIFUgYW5kIFYgcGxhbmUgcG9pbnRlcnMgdXNpbmcgc3RyaWRlIGluZm8uICovCiBzdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKLSAgICAgICAgdWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCisgICAgICAgIHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsIHVpbnQ4X3QgKnNyYywKICAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHVpbnQzMl90IHdpZHRoLAogICAgICAgICB1aW50MzJfdCBoZWlnaHQpIHsKICAgICBzaXplX3Qgc3JjVVZTdHJpZGUgPSBzcmNZU3RyaWRlIC8gMjsKICAgICB1aW50OF90ICpzcmNTdGFydCA9IHNyYzsKLSAgICB1aW50OF90ICpkc3RTdGFydCA9IGRzdDsKKwogICAgIHNpemVfdCB2U3RyaWRlID0gYWxpZ24oaGVpZ2h0LCAxNik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgewotICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCk7CisgICAgICAgICBtZW1jcHkoZHN0WSwgc3JjLCB3aWR0aCk7CiAgICAgICAgICBzcmMgKz0gc3JjWVN0cmlkZTsKLSAgICAgICAgIGRzdCArPSBkc3RZU3RyaWRlOworICAgICAgICAgZHN0WSArPSBkc3RZU3RyaWRlOwogICAgIH0KKwogICAgIC8qIFUgYnVmZmVyICovCiAgICAgc3JjID0gc3JjU3RhcnQgKyB2U3RyaWRlICogc3JjWVN0cmlkZTsKLSAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KSArIChkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoIC8gMik7CisgICAgICAgICBtZW1jcHkoZHN0VSwgc3JjLCB3aWR0aCAvIDIpOwogICAgICAgICAgc3JjICs9IHNyY1VWU3RyaWRlOwotICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKICAgICB9CisKICAgICAvKiBWIGJ1ZmZlciAqLwogICAgIHNyYyA9IHNyY1N0YXJ0ICsgdlN0cmlkZSAqIHNyY1lTdHJpZGUgKiA1IC8gNDsKLSAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCAvIDIpOworICAgICAgICAgbWVtY3B5KGRzdFYsIHNyYywgd2lkdGggLyAyKTsKICAgICAgICAgIHNyYyArPSBzcmNVVlN0cmlkZTsKLSAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7CiAgICAgfQogfQogCkBAIC02NzIsMTEgKzY1NSwxNCBAQAogICAgICAgICB9CiAKICAgICAgICAgdWludDhfdCAqb3V0cHV0QnVmZmVyWSA9IHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgIHVpbnQ4X3QgKm91dHB1dEJ1ZmZlclUgPSB3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICB1aW50OF90ICpvdXRwdXRCdWZmZXJWID0gd1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKwogICAgICAgICBDMlBsYW5hckxheW91dCBsYXlvdXQgPSB3Vmlldy5sYXlvdXQoKTsKICAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXS5yb3dJbmM7CiAgICAgICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvd0luYzsKICAgICAgICAgKHZvaWQpY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCi0gICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyWSwKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJZLCBvdXRwdXRCdWZmZXJVLCBvdXRwdXRCdWZmZXJWLAogICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbbU51bVNhbXBsZXNPdXRwdXQgJiAxXSwKICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKICAgICAgICAgICAgICAgICBhbGlnbihtV2lkdGgsIDE2KSwgbVdpZHRoLCBtSGVpZ2h0KTsKQEAgLTc0NCwxMSArNzMwLDEzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0TXBlZzREZWNGYWN0b3J5KCk7CiB9CiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgZGVsZXRlIGZhY3Rvcnk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuY3BwCmluZGV4IDU0YzhjNDcuLjNjODc1MzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuY3BwCkBAIC00NDgsNiArNDQ4LDIwIEBACiAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKHN0ZDo6bW92ZShjc2QpKTsKICAgICB9CiAKKyAgICAvLyBoYW5kbGUgZHluYW1pYyBiaXRyYXRlIGNoYW5nZQorICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisKKyAgICAgICAgaWYgKGJpdHJhdGUgIT0gbUJpdHJhdGUpIHsKKyAgICAgICAgICAgIG1CaXRyYXRlID0gYml0cmF0ZTsKKyAgICAgICAgICAgIGludCBsYXllckJpdHJhdGVbMl0gPSB7c3RhdGljX2Nhc3Q8aW50PihtQml0cmF0ZS0+dmFsdWUpLCAwfTsKKyAgICAgICAgICAgIEFMT0dWKCJDYWxsaW5nIFBWVXBkYXRlQml0UmF0ZSAlZCIsIGxheWVyQml0cmF0ZVswXSk7CisgICAgICAgICAgICBQVlVwZGF0ZUJpdFJhdGUobUhhbmRsZSwgbGF5ZXJCaXRyYXRlKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiByVmlldzsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGlucHV0QnVmZmVyOwogICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOwpAQCAtNjUyLDExICs2NjYsMTMgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRNcGVnNEVuY0ZhY3RvcnkoKTsKIH0KIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgZmFjdG9yeTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvVEVTVF9NQVBQSU5HIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNmYmEyMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsNiBAQAorLy8gbWFwcGluZ3MgZm9yIGZyYW1ld29ya3MvYXYvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2MworeworICAicHJlc3VibWl0IjogWworICAgIHsgIm5hbWUiOiAiQzJTb2Z0TXBlZzREZWNUZXN0IiB9CisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQW5kcm9pZC5icAppbmRleCAwZWQxNDFiLi5iZmJhNDVjIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsMTMgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X29wdXNkZWMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCkBAIC05LDcgKzE4LDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbImxpYm9wdXMiXSwKIH0KLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9vcHVzZW5jIiwKICAgICBkZWZhdWx0czogWwogICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0RlYy5jcHAKaW5kZXggYjdjMTU1Ni4uZDQ5ODdjMCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuY3BwCkBAIC00NzMsMTEgKzQ3MywxMyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE9wdXNEZWNGYWN0b3J5KCk7CiB9CiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgZGVsZXRlIGZhY3Rvcnk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmNwcAppbmRleCA3MGQxOTY1Li5iNDcyNzVmIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNFbmMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0VuYy5jcHAKQEAgLTYyNiwxMSArNjI2LDEzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0T3B1c0VuY0ZhY3RvcnkoKTsKIH0KIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgZmFjdG9yeTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0FuZHJvaWQuYnAKaW5kZXggZGM5NDRkYS4uYzBiNzYxMyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0FuZHJvaWQuYnAKQEAgLTEsNCArMSwyMyBAQAotY2NfbGlicmFyeV9zaGFyZWQgeworcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjMl9jb21wb25lbnRzX3Jhd19saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlYzJfY29tcG9uZW50c19yYXdfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3Jhd2RlYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9DMlNvZnRSYXdEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5jcHAKaW5kZXggN2I2ZjIxYS4uYTAzZDRlMiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5jcHAKQEAgLTg3LDcgKzg3LDkgQEAKICAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1QY21FbmNvZGluZ0luZm8sIHZhbHVlKS5vbmVPZih7CiAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNXzE2LAogICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV84LAotICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV9GTE9BVH0pCisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNX0ZMT0FULAorICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV8yNCwKKyAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQQ01fMzJ9KQogICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVBjbUVuY29kaW5nSW5mbyk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQogICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKQEAgLTIxNSwxMSArMjE3LDEzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0UmF3RGVjRmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBmYWN0b3J5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2OGVlZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2OCBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogIkMyU29mdENvZGVjVGVzdC1kZWZhdWx0cyIsCisgICAgZ3Rlc3Q6IHRydWUsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IGZhbHNlLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkMyU29mdENvZGVjVGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmlvbiIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmRtYWJ1ZmhlYXAiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2NvbW1vbiIsCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMC4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MubWFwcGVyQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckAzLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmFsbG9jYXRvckAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3JAMy4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMi4wIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmhhcmR3YXJlIiwKKyAgICAgICAgImxpYnZuZGtzdXBwb3J0IiwKKyAgICAgICAgImxpYnByb2Nlc3Nncm91cCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkMyU29mdE1wZWc0RGVjVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiQzJTb2Z0Q29kZWNUZXN0LWRlZmF1bHRzIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9tcGVnNGRlYyIsCisgICAgXSwKKworICAgIHRlc3Rfc3VpdGVzOiBbCisgICAgICAgICJnZW5lcmFsLXRlc3RzIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdGVzdHMvQzJTb2Z0Q29kZWNUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Rlc3RzL0MyU29mdENvZGVjVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjMjU2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Rlc3RzL0MyU29mdENvZGVjVGVzdC5jcHAKQEAgLTAsMCArMSwxMDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpOworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KTsKKworY2xhc3MgQzJTb2Z0Q29kZWNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgbUZhY3RvcnkgPSBDcmVhdGVDb2RlYzJGYWN0b3J5KCk7CisgIH0KKworICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIGlmIChtRmFjdG9yeSkgeworICAgICAgRGVzdHJveUNvZGVjMkZhY3RvcnkobUZhY3RvcnkpOworICAgIH0KKyAgfQorCisgIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcCkgeworICAgIGlmICghbUZhY3RvcnkpIHsKKyAgICAgIHJldHVybiBDMl9OT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUZhY3RvcnktPmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAga1BsYWNlaG9sZGVySWQsIGNvbXAsIHN0ZDo6ZGVmYXVsdF9kZWxldGU8QzJDb21wb25lbnQ+KCkpOworICB9CisKKyAgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZikgeworICAgIGlmICghbUZhY3RvcnkpIHsKKyAgICAgIHJldHVybiBDMl9OT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUZhY3RvcnktPmNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAga1BsYWNlaG9sZGVySWQsIGludGYsIHN0ZDo6ZGVmYXVsdF9kZWxldGU8QzJDb21wb25lbnRJbnRlcmZhY2U+KCkpOworICB9CisKKyAgOjpDMkNvbXBvbmVudEZhY3RvcnkgKmdldEZhY3RvcnkoKSB7IHJldHVybiBtRmFjdG9yeTsgfQorCitwcml2YXRlOgorICBzdGF0aWMgY29uc3RleHByIDo6YzJfbm9kZV9pZF90IGtQbGFjZWhvbGRlcklkID0gMDsKKworICA6OkMyQ29tcG9uZW50RmFjdG9yeSAqbUZhY3Rvcnk7Cit9OworCitURVNUX0YoQzJTb2Z0Q29kZWNUZXN0LCBQaWN0dXJlU2l6ZUluZm9UZXN0KSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZXJmYWNlOworICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBjcmVhdGVJbnRlcmZhY2UoJmludGVyZmFjZSk7CisgIEFTU0VSVF9FUShzdGF0dXMsIEMyX09LKSA8PCAiRXJyb3IgaW4gY3JlYXRlSW50ZXJmYWNlIjsKKyAgQVNTRVJUX05FKGludGVyZmFjZSwgbnVsbHB0cikgPDwgImludGVyZmFjZSBpcyBudWxsIjsKKworICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gcGFyYW0gPQorICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PigpOworICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IHZhbGlkVmFsdWVJbmZvcyA9IHsKKyAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q3VycmVudCgKKyAgICAgICAgICBDMlBhcmFtRmllbGQocGFyYW0uZ2V0KCksICZDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6d2lkdGgpKSwKKyAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q3VycmVudCgKKyAgICAgICAgICBDMlBhcmFtRmllbGQocGFyYW0uZ2V0KCksICZDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aGVpZ2h0KSl9OworICBzdGF0dXMgPSBpbnRlcmZhY2UtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKHZhbGlkVmFsdWVJbmZvcywgQzJfTUFZX0JMT0NLKTsKKyAgQVNTRVJUX0VRKHN0YXR1cywgQzJfT0spIDw8ICJFcnJvciBpbiBxdWVyeVN1cHBvcnRlZFZhbHVlc192YiI7CisgIEFTU0VSVF9FUSh2YWxpZFZhbHVlSW5mb3Muc2l6ZSgpLCAyKSA8PCAicXVlcnlTdXBwb3J0ZWRWYWx1ZXNfdmIgZGlkbid0IHJldHVybiAyIHZhbHVlcyI7CisKKyAgQVNTRVJUX0VRKHZhbGlkVmFsdWVJbmZvc1swXS52YWx1ZXMucmFuZ2UubWF4LnJlZjx1aW50MzJfdD4oKSwgMTkyMCkKKyAgICAgIDw8ICJJbmNvcnJlY3QgbWF4aW11bSB2YWx1ZSBmb3Igd2lkdGgiOworICBBU1NFUlRfRVEodmFsaWRWYWx1ZUluZm9zWzFdLnZhbHVlcy5yYW5nZS5tYXgucmVmPHVpbnQzMl90PigpLCAxOTIwKQorICAgICAgPDwgIkluY29ycmVjdCBtYXhpbXVtIHZhbHVlIGZvciBoZWlnaHQiOworICBBU1NFUlRfRVEodmFsaWRWYWx1ZUluZm9zWzBdLnZhbHVlcy5yYW5nZS5taW4ucmVmPHVpbnQzMl90PigpLCAyKQorICAgICAgPDwgIkluY29ycmVjdCBtaW5pbXVtIHZhbHVlIGZvciB3aWR0aCI7CisgIEFTU0VSVF9FUSh2YWxpZFZhbHVlSW5mb3NbMV0udmFsdWVzLnJhbmdlLm1pbi5yZWY8dWludDMyX3Q+KCksIDIpCisgICAgICA8PCAiSW5jb3JyZWN0IG1pbmltdW0gdmFsdWUgZm9yIGhlaWdodCI7CisgIEFTU0VSVF9FUSh2YWxpZFZhbHVlSW5mb3NbMF0udmFsdWVzLnJhbmdlLnN0ZXAucmVmPHVpbnQzMl90PigpLCAyKQorICAgICAgPDwgIkluY29ycmVjdCBhbGlnbm1lbnQgdmFsdWUgZm9yIHdpZHRoIjsKKyAgQVNTRVJUX0VRKHZhbGlkVmFsdWVJbmZvc1sxXS52YWx1ZXMucmFuZ2Uuc3RlcC5yZWY8dWludDMyX3Q+KCksIDIpCisgICAgICA8PCAiSW5jb3JyZWN0IGFsaWdubWVudCB2YWx1ZSBmb3IgaGVpZ2h0IjsKKworICByZXR1cm47Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgQUxPR1YoIlRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9BbmRyb2lkLmJwCmluZGV4IGJjMWMzODAuLmNjZjZmMjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsMjMgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlYzJfY29tcG9uZW50c192b3JiaXNfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWMyX2NvbXBvbmVudHNfdm9yYmlzX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92b3JiaXNkZWMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQzJTb2Z0Vm9yYmlzRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuY3BwCmluZGV4IGE4YjUzNzcuLjg5OWZlOWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuY3BwCkBAIC00NzcsMTEgKzQ3NywxMyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFZvcmJpc0RlY0ZhY3RvcnkoKTsKIH0KIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgZmFjdG9yeTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0FuZHJvaWQuYnAKaW5kZXggMzRmNTc1My4uYmI2YTU0NSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0FuZHJvaWQuYnAKQEAgLTEsNCArMSwyMyBAQAotY2NfbGlicmFyeV9zaGFyZWQgeworcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjMl9jb21wb25lbnRzX3ZweF9saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlYzJfY29tcG9uZW50c192cHhfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3ZwOWRlYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKQEAgLTE0LDcgKzMzLDcgQEAKICAgICBdLAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfdnA4ZGVjIiwKICAgICBkZWZhdWx0czogWwogICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLApAQCAtMjYsNyArNDUsNyBAQAogICAgIHNoYXJlZF9saWJzOiBbImxpYnZweCJdLAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfdnA5ZW5jIiwKICAgICBkZWZhdWx0czogWwogICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLApAQCAtNDMsNyArNjIsNyBAQAogICAgIGNmbGFnczogWyItRFZQOSJdLAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfdnA4ZW5jIiwKICAgICBkZWZhdWx0czogWwogICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLApAQCAtNTcsNCArNzYsMyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsibGlidnB4Il0sCiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5jcHAKaW5kZXggZjE4ZjVkMC4uMDQ5ZWMzOCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5jcHAKQEAgLTEwMSwxMSArMTAxLDEzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0VnA4RW5jRmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBmYWN0b3J5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmNwcAppbmRleCA3NDBkYmRhLi42NDAxNTIxIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmNwcApAQCAtMTMxLDExICsxMzEsMTMgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRWcDlFbmNGYWN0b3J5KCk7CiB9CiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgZGVsZXRlIGZhY3Rvcnk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwCmluZGV4IDNlZWYxZTMuLjI5NTNkOTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwCkBAIC02MzEsMzEgKzYzMSwzMCBAQAogfQogCiBzdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKLSAgICAgICAgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAorICAgICAgICB1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLAorICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAogICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAogICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAogICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7Ci0gICAgdWludDhfdCAqZHN0U3RhcnQgPSBkc3Q7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0LCBzcmNZLCB3aWR0aCk7CisgICAgICAgICBtZW1jcHkoZHN0WSwgc3JjWSwgd2lkdGgpOwogICAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOwotICAgICAgICAgZHN0ICs9IGRzdFlTdHJpZGU7CisgICAgICAgICBkc3RZICs9IGRzdFlTdHJpZGU7CiAgICAgfQogCi0gICAgZHN0ID0gZHN0U3RhcnQgKyBkc3RZU3RyaWRlICogaGVpZ2h0OwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0LCBzcmNWLCB3aWR0aCAvIDIpOworICAgICAgICAgbWVtY3B5KGRzdFYsIHNyY1YsIHdpZHRoIC8gMik7CiAgICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7Ci0gICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOwogICAgIH0KIAotICAgIGRzdCA9IGRzdFN0YXJ0ICsgKGRzdFlTdHJpZGUgKiBoZWlnaHQpICsgKGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3QsIHNyY1UsIHdpZHRoIC8gMik7CisgICAgICAgICBtZW1jcHkoZHN0VSwgc3JjVSwgd2lkdGggLyAyKTsKICAgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKLSAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7CiAgICAgfQorCiB9CiAKIHN0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCh1aW50MzJfdCAqZHN0LApAQCAtNzIxLDE2ICs3MjAsMTIgQEAKICAgICByZXR1cm47CiB9CiAKLXN0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKHVpbnQ4X3QgKmRzdCwKK3N0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKAorICAgICAgICB1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLAogICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLAogICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAotICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKLQotICAgIHVpbnQ4X3QgKmRzdFkgPSAodWludDhfdCAqKWRzdDsKLSAgICBzaXplX3QgZHN0WVNpemUgPSBkc3RZU3RyaWRlICogaGVpZ2h0OwotICAgIHNpemVfdCBkc3RVVlNpemUgPSBkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDI7Ci0gICAgdWludDhfdCAqZHN0ViA9IGRzdFkgKyBkc3RZU2l6ZTsKLSAgICB1aW50OF90ICpkc3RVID0gZHN0ViArIGRzdFVWU2l6ZTsKKyAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKKyAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7CiAKICAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewpAQCAtODIzLDcgKzgxOCwxMCBAQAogICAgICAgICAgICBibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpLCBtV2lkdGgsIG1IZWlnaHQsCiAgICAgICAgICAgICgoYzJfY250cjY0X3QgKilpbWctPnVzZXJfcHJpdiktPnBlZWtsbCgpKTsKIAotICAgIHVpbnQ4X3QgKmRzdCA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICB1aW50OF90ICpkc3RZID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHVpbnQ4X3QgKmRzdFUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgICAgdWludDhfdCAqZHN0ViA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdKTsKKwogICAgIHNpemVfdCBzcmNZU3RyaWRlID0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ldOwogICAgIHNpemVfdCBzcmNVU3RyaWRlID0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1VdOwogICAgIHNpemVfdCBzcmNWU3RyaWRlID0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ZdOwpAQCAtODQyLDE4ICs4NDAsMTggQEAKICAgICAgICAgICAgIGNvbnN0ZXhwciBzaXplX3Qga0hlaWdodCA9IDY0OwogICAgICAgICAgICAgZm9yICg7IGkgPCBtSGVpZ2h0OyBpICs9IGtIZWlnaHQpIHsKICAgICAgICAgICAgICAgICBxdWV1ZS0+ZW50cmllcy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgICAgICAgICBbZHN0LCBzcmNZLCBzcmNVLCBzcmNWLAorICAgICAgICAgICAgICAgICAgICAgICAgW2RzdFksIHNyY1ksIHNyY1UsIHNyY1YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwgZHN0WVN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IG1XaWR0aCwgaGVpZ2h0ID0gc3RkOjptaW4obUhlaWdodCAtIGksIGtIZWlnaHQpXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90ICopZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCAqKWRzdFksIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLCBkc3RZU3RyaWRlIC8gc2l6ZW9mKHVpbnQzMl90KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlIC8gMiAqIGtIZWlnaHQ7CiAgICAgICAgICAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlIC8gMiAqIChrSGVpZ2h0IC8gMik7CiAgICAgICAgICAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlIC8gMiAqIChrSGVpZ2h0IC8gMik7Ci0gICAgICAgICAgICAgICAgZHN0ICs9IGRzdFlTdHJpZGUgKiBrSGVpZ2h0OworICAgICAgICAgICAgICAgIGRzdFkgKz0gZHN0WVN0cmlkZSAqIGtIZWlnaHQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBDSEVDS19FUSgwdSwgcXVldWUtPm51bVBlbmRpbmcpOwogICAgICAgICAgICAgcXVldWUtPm51bVBlbmRpbmcgPSBxdWV1ZS0+ZW50cmllcy5zaXplKCk7CkBAIC04NjIsOCArODYwLDkgQEAKICAgICAgICAgICAgICAgICBxdWV1ZS53YWl0Rm9yQ29uZGl0aW9uKHF1ZXVlLT5jb25kKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3RZLCBkc3RVLCBkc3RWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUgLyAyLCBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CiAgICAgICAgIH0KQEAgLTg3MSw4ICs4NzAsMTAgQEAKICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ldOwogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfVV07CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9WXTsKKwogICAgICAgICBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKLSAgICAgICAgICAgICAgICBkc3QsIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgZHN0WSwgZHN0VSwgZHN0ViwKKyAgICAgICAgICAgICAgICBzcmNZLCBzcmNVLCBzcmNWLAogICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUsCiAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCiAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKQEAgLTk0NywxMSArOTQ4LDEzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0VnB4RmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBmYWN0b3J5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5oCmluZGV4IDVlMzRiOGEuLmM5OGI4MDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmgKQEAgLTM0NSw2ICszNDUsNDIgQEAKICAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1SZXF1ZXN0U3luYywgdmFsdWUpLm9uZU9mKHsgQzJfRkFMU0UsIEMyX1RSVUUgfSkgfSkKICAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1SZXF1ZXN0U3luYyk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvZGVkQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX0xJTUlURUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIsIG1Db2xvckFzcGVjdHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogICAgIH0KIAogICAgIHN0YXRpYyBDMlIgQml0cmF0ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiAmbWUpIHsKQEAgLTQxNSw2ICs0NTEsMzEgQEAKICAgICAgICAgZG91YmxlIHBlcmlvZCA9IG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIC8gMWU2ICogbUZyYW1lUmF0ZS0+dmFsdWU7CiAgICAgICAgIHJldHVybiAodWludDMyX3QpYzJfbWF4KGMyX21pbihwZXJpb2QgKyAwLjUsIGRvdWJsZShVSU5UMzJfTUFYKSksIDEuKTsKICAgICB9CisgICAgc3RhdGljIEMyUiBDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKyAgICBzdGF0aWMgQzJSIENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZjb2RlZCkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBjb2RlZC52LnJhbmdlOworICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBjb2RlZC52LnByaW1hcmllczsKKyAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBjb2RlZC52LnRyYW5zZmVyOworICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBjb2RlZC52Lm1hdHJpeDsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CiAKICAgIHByaXZhdGU6CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CkBAIC00MjcsNiArNDg4LDggQEAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlTW9kZVR1bmluZzo6b3V0cHV0PiBtQml0cmF0ZU1vZGU7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiBtQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gbUNvZGVkQ29sb3JBc3BlY3RzOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQW5kcm9pZC5icAppbmRleCA3Nzk1Y2MxLi5iYjNlZmI1IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9BbmRyb2lkLmJwCkBAIC0xLDggKzEsMTggQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3hhYWNkZWMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCiAgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorCSJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9jZmktZGVmYXVsdHMiLAogICAgIF0sCiAKICAgICBzcmNzOiBbIkMyU29mdFhhYWNEZWMuY3BwIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmNwcAppbmRleCA5NTFkMDU4Li42ZGVhZmRhIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQzJTb2Z0WGFhY0RlYy5jcHAKQEAgLTE2MDAsMTEgKzE2MDAsMTMgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRYYWFjRGVjRmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBmYWN0b3J5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb3JlL0FuZHJvaWQuYnAKaW5kZXggY2UxYzlhYy4uNjQ5OTliNyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvcmUvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9oZWFkZXJzIHsKICAgICBuYW1lOiAibGliY29kZWMyX2hlYWRlcnMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCkBAIC01LDcgKzE0LDcgQEAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMiIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCkBAIC0yMSw2ICszMCwxMCBAQAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIAorICAgIGhlYWRlcl9hYmlfY2hlY2tlcjogeworICAgICAgICBjaGVja19hbGxfYXBpczogdHJ1ZSwKKyAgICB9LAorCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmNvZGVjMl9oZWFkZXJzIiwKICAgICAgICAgImxpYmhhcmR3YXJlX2hlYWRlcnMiLApAQCAtNDgsNCArNjEsMyBAQAogCiAgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyLmgKaW5kZXggM2QzNTg3Yy4uYTVkNmZiZiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkJ1ZmZlci5oCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJCdWZmZXIuaApAQCAtNjQyLDcgKzY0Miw4IEBACiAgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSB0aGUgYWxsb2NhdGlvbgogICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIGNhcGFjaXR5IG9yIHVzYWdlIGFyZSBub3Qgc3VwcG9ydGVkIChpbnZhbGlkKSAoY2FsbGVyIGVycm9yKQogICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMUQgYWxsb2NhdGlvbnMKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgYWxsb2NhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGFsbG9jYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKICAgICAgKi8KICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG5ld0xpbmVhckFsbG9jYXRpb24oCiAgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSBfX3VudXNlZCwgQzJNZW1vcnlVc2FnZSB1c2FnZSBfX3VudXNlZCwKQEAgLTY2Niw3ICs2NjcsOCBAQAogICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gcmVjcmVhdGUgdGhlIGFsbG9jYXRpb24KICAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBpbnZhbGlkIGhhbmRsZSAoY2FsbGVyIGVycm9yKQogICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMUQgYWxsb2NhdGlvbnMKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgYWxsb2NhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGFsbG9jYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKICAgICAgKi8KICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHByaW9yTGluZWFyQWxsb2NhdGlvbigKICAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUgX191bnVzZWQsCkBAIC02OTksNyArNzAxLDggQEAKICAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCiAgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgd2lkdGgsIGhlaWdodCwgZm9ybWF0IG9yIHVzYWdlIGFyZSBub3Qgc3VwcG9ydGVkIChpbnZhbGlkKSAoY2FsbGVyIGVycm9yKQogICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMkQgYWxsb2NhdGlvbnMKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgYWxsb2NhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGFsbG9jYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKICAgICAgKi8KICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG5ld0dyYXBoaWNBbGxvY2F0aW9uKAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggX191bnVzZWQsIHVpbnQzMl90IGhlaWdodCBfX3VudXNlZCwgdWludDMyX3QgZm9ybWF0IF9fdW51c2VkLApAQCAtNzI0LDcgKzcyNyw4IEBACiAgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byByZWNyZWF0ZSB0aGUgYWxsb2NhdGlvbgogICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIGludmFsaWQgaGFuZGxlIChjYWxsZXIgZXJyb3IpCiAgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBhbGxvY2F0b3IgZG9lcyBub3Qgc3VwcG9ydCAyRCBhbGxvY2F0aW9ucwotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyByZWNyZWF0aW9uICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cnJlZCBkdXJpbmcgcmVjcmVhdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQogICAgICAqLwogICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcHJpb3JHcmFwaGljQWxsb2NhdGlvbigKICAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUgX191bnVzZWQsCkBAIC03MzQsNiArNzM4LDIyIEBACiAgICAgfQogCiAgICAgdmlydHVhbCB+QzJBbGxvY2F0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdHJ1ZSBpZiB0aGUgaGFuZGxlIGxvb2tzIHZhbGlkIGZvciB0aGlzIGFsbG9jYXRvci4KKyAgICAgKgorICAgICAqIEl0IGRvZXMgbm90IGFjdHVhbGx5IHZhbGlkYXRlIHRoYXQgdGhlIGhhbmRsZSByZXByZXNlbnRzIGEgdmFsaWQgYWxsb2NhdGlvbiAoYnkgdGhpcworICAgICAqIGFsbG9jYXRvciksIG9ubHkgdGhhdCB0aGUgaGFuZGxlIGNvdWxkIGhhdmUgYmVlbiByZXR1cm5lZCBieSB0aGlzIGFsbG9jYXRvci4gQXMgc3VjaCwKKyAgICAgKiBtdWx0aXBsZSBhbGxvY2F0b3JzIG1heSByZXR1cm4gdHJ1ZSBmb3IgbG9va3NWYWxpZCBmb3IgdGhlIHNhbWUgaGFuZGxlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiwgTVVTVCBub3QgYWNjZXNzIGtlcm5lbCBhbmQvb3IgZGV2aWNlIGRyaXZlcnMsIGFuZAorICAgICAqIHJldHVybiB3aXRoaW4gMXVzLgorICAgICAqCisgICAgICogXHBhcmFtIGhhbmRsZSAgICAgIHRoZSBoYW5kbGUgZm9yIGFuIGV4aXN0aW5nIGFsbG9jYXRpb24gKHBvc3NpYmx5IGZyb20gYW5vdGhlcgorICAgICAqICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3IpCisgICAgICovCisgICAgdmlydHVhbCBib29sIGNoZWNrSGFuZGxlKGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUpIGNvbnN0ID0gMDsKKwogcHJvdGVjdGVkOgogICAgIEMyQWxsb2NhdG9yKCkgPSBkZWZhdWx0OwogfTsKQEAgLTg5Miw3ICs5MTIsOCBAQAogICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gY29tcGxldGUgYW55IHJlcXVpcmVkIGFsbG9jYXRpb24KICAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBjYXBhY2l0eSBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlciBlcnJvcikKICAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0aGlzIHBvb2wgZG9lcyBub3Qgc3VwcG9ydCBsaW5lYXIgYmxvY2tzCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIG9wZXJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIG9wZXJhdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQogICAgICAqLwogICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hMaW5lYXJCbG9jaygKICAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5IF9fdW51c2VkLCBDMk1lbW9yeVVzYWdlIHVzYWdlIF9fdW51c2VkLApAQCAtOTIxLDcgKzk0Miw4IEBACiAgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSBhbnkgcmVxdWlyZWQgYWxsb2NhdGlvbgogICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIGNhcGFjaXR5IG9yIHVzYWdlIGFyZSBub3Qgc3VwcG9ydGVkIChpbnZhbGlkKSAoY2FsbGVyIGVycm9yKQogICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgcG9vbCBkb2VzIG5vdCBzdXBwb3J0IGNpcmN1bGFyIGJsb2NrcwotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBvcGVyYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VycmVkIGR1cmluZyBvcGVyYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKICAgICAgKi8KICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoQ2lyY3VsYXJCbG9jaygKICAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5IF9fdW51c2VkLCBDMk1lbW9yeVVzYWdlIHVzYWdlIF9fdW51c2VkLApAQCAtOTUzLDcgKzk3NSw4IEBACiAgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgd2lkdGgsIGhlaWdodCwgZm9ybWF0IG9yIHVzYWdlIGFyZSBub3Qgc3VwcG9ydGVkIChpbnZhbGlkKSAoY2FsbGVyCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgZXJyb3IpCiAgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBwb29sIGRvZXMgbm90IHN1cHBvcnQgMkQgYmxvY2tzCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIG9wZXJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIG9wZXJhdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQogICAgICAqLwogICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCBfX3VudXNlZCwgdWludDMyX3QgaGVpZ2h0IF9fdW51c2VkLCB1aW50MzJfdCBmb3JtYXQgX191bnVzZWQsCkBAIC05NjQsNiArOTg3LDkwIEBACiAgICAgfQogCiAgICAgdmlydHVhbCB+QzJCbG9ja1Bvb2woKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBCbG9ja2luZyBmZXRjaCBmb3IgbGluZWFyIGJsb2NrLiBPYnRhaW5zIGEgbGluZWFyIHdyaXRhYmxlIGJsb2NrIG9mIGdpdmVuIHxjYXBhY2l0eXwKKyAgICAgKiBhbmQgfHVzYWdlfC4gSWYgYSBibG9jayBjYW4gYmUgc3VjY2Vzc2Z1bGx5IG9idGFpbmVkLCB0aGUgYmxvY2sgaXMgc3RvcmVkIGluIHxibG9ja3wsCisgICAgICogfGZlbmNlfCBpcyBzZXQgdG8gYSBudWxsLWZlbmNlIGFuZCBDMl9PSyBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIElmIGEgYmxvY2sgY2Fubm90IGJlIHRlbXBvcmFyaWx5IG9idGFpbmVkLCB8YmxvY2t8IGlzIHNldCB0byBudWxscHRyLCBhIHdhaXRhYmxlIGZlbmNlCisgICAgICogaXMgc3RvcmVkIGludG8gfGZlbmNlfCBhbmQgQzJfQkxPQ0tJTkcgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBPdGhlcndpc2UsIHxibG9ja3wgaXMgc2V0IHRvIG51bGxwdHIgYW5kIHxmZW5jZXwgaXMgc2V0IHRvIGEgbnVsbC1mZW5jZS4gVGhlIHdhaXRhYmxlCisgICAgICogZmVuY2UgaXMgc2lnbmFsbGVkIHdoZW4gdGhlIHRlbXBvcmFyeSByZXN0cmljdGlvbiBvbiBmZXRjaCBpcyBsaWZ0ZWQuCisgICAgICogZS5nLiBtb3JlIG1lbW9yeSBpcyBhdmFpbGFibGUgdG8gZmV0Y2ggYmVjYXVzZSBzb21lIG1lb21vcnkgb3IgcHJpb3IgYmxvY2tzIHdlcmUgcmVsZWFzZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gY2FwYWNpdHkgdGhlIHNpemUgb2YgcmVxdWVzdGVkIGJsb2NrLgorICAgICAqIFxwYXJhbSB1c2FnZSAgICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYmxvY2suIFJldHVybmVkIGJsb2NrcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgIG9wdGltaXplZCBmb3IgdGhpcyB1c2FnZSwgYnV0IG1heSBiZSB1c2VkIHdpdGggYW55IHVzYWdlLiBPbmUgZXhjZXB0aW9uOgorICAgICAqICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYmxvY2tzL2J1ZmZlcnMgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYmxvY2sgICAgcG9pbnRlciB0byB3aGVyZSB0aGUgb2J0YWluZWQgYmxvY2sgc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIgd2lsbAorICAgICAqICAgICAgICAgICAgICAgICBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICogXHBhcmFtIGZlbmNlICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZlbmNlIHNoYWxsIGJlIHN0b3JlZCBvbiBDMl9CTE9DS0lORyBlcnJvci4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSBhbnkgcmVxdWlyZWQgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9CTE9DS0lORyAgdGhlIG9wZXJhdGlvbiBpcyBibG9ja2VkCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSBhbnkgcmVxdWlyZWQgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIGNhcGFjaXR5IG9yIHVzYWdlIGFyZSBub3Qgc3VwcG9ydGVkIChpbnZhbGlkKSAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgcG9vbCBkb2VzIG5vdCBzdXBwb3J0IGxpbmVhciBibG9ja3Mgbm9yIGZlbmNlLgorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cnJlZCBkdXJpbmcgb3BlcmF0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHkgX191bnVzZWQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8sCisgICAgICAgICAgICBDMkZlbmNlICpmZW5jZSAvKiBub25udWxsICovKSB7CisgICAgICAgICpibG9jayA9IG51bGxwdHI7CisgICAgICAgICh2b2lkKSBmZW5jZTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmxvY2tpbmcgZmV0Y2ggZm9yIDJEIGdyYXBoaWMgYmxvY2suIE9idGFpbnMgYSAyRCBncmFwaGljIHdyaXRhYmxlIGJsb2NrIG9mIGdpdmVuIHxjYXBhY2l0eXwKKyAgICAgKiBhbmQgfHVzYWdlfC4gSWYgYSBibG9jayBjYW4gYmUgc3VjY2Vzc2Z1bGx5IG9idGFpbmVkLCB0aGUgYmxvY2sgaXMgc3RvcmVkIGluIHxibG9ja3wsCisgICAgICogfGZlbmNlfCBpcyBzZXQgdG8gYSBudWxsLWZlbmNlIGFuZCBDMl9PSyBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIElmIGEgYmxvY2sgY2Fubm90IGJlIHRlbXBvcmFyaWx5IG9idGFpbmVkLCB8YmxvY2t8IGlzIHNldCB0byBudWxscHRyLCBhIHdhaXRhYmxlIGZlbmNlCisgICAgICogaXMgc3RvcmVkIGludG8gfGZlbmNlfCBhbmQgQzJfQkxPQ0tJTkcgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBPdGhlcndpc2UsIHxibG9ja3wgaXMgc2V0IHRvIG51bGxwdHIgYW5kIHxmZW5jZXwgaXMgc2V0IHRvIGEgbnVsbC1mZW5jZS4gVGhlIHdhaXRhYmxlCisgICAgICogZmVuY2UgaXMgc2lnbmFsbGVkIHdoZW4gdGhlIHRlbXBvcmFyeSByZXN0cmljdGlvbiBvbiBmZXRjaCBpcyBsaWZ0ZWQuCisgICAgICogZS5nLiBtb3JlIG1lbW9yeSBpcyBhdmFpbGFibGUgdG8gZmV0Y2ggYmVjYXVzZSBzb21lIG1lb21vcnkgb3IgcHJpb3IgYmxvY2tzIHdlcmUgcmVsZWFzZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gd2lkdGggIHRoZSB3aWR0aCBvZiByZXF1ZXN0ZWQgYmxvY2sgKHRoZSBvYnRhaW5lZCBibG9jayBjb3VsZCBiZSBzbGlnaHRseSBsYXJnZXIsIGUuZy4KKyAgICAgKiAgICAgICAgICAgICAgIHRvIGFjY29tbW9kYXRlIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiByZXF1ZXN0ZWQgYmxvY2sgKHRoZSBvYnRhaW5lZCBibG9jayBjb3VsZCBiZSBzbGlnaHRseSBsYXJnZXIsCisgICAgICogICAgICAgICAgICAgICBlLmcuIHRvIGFjY29tbW9kYXRlIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSBmb3JtYXQgdGhlIHBpeGVsIGZvcm1hdCBvZiByZXF1ZXN0ZWQgYmxvY2suIFRoaXMgY291bGQgYmUgYSB2ZW5kb3Igc3BlY2lmaWMgZm9ybWF0LgorICAgICAqIFxwYXJhbSB1c2FnZSAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGJsb2NrLiBSZXR1cm5lZCBibG9ja3Mgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgb3B0aW1pemVkIGZvciB0aGlzIHVzYWdlLCBidXQgbWF5IGJlIHVzZWQgd2l0aCBhbnkgdXNhZ2UuIE9uZSBleGNlcHRpb246CisgICAgICogICAgICAgICAgICAgICBwcm90ZWN0ZWQgYmxvY2tzL2J1ZmZlcnMgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYmxvY2sgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG9idGFpbmVkIGJsb2NrIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgICAgICogICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAgICAgKiBccGFyYW0gZmVuY2UgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZlbmNlIHNoYWxsIGJlIHN0b3JlZCBvbiBDMl9CTE9DS0lORyBlcnJvci4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSBhbnkgcmVxdWlyZWQgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9CTE9DS0lORyAgdGhlIG9wZXJhdGlvbiBpcyBibG9ja2VkCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSBhbnkgcmVxdWlyZWQgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgcG9vbCBkb2VzIG5vdCBzdXBwb3J0IDJEIGJsb2NrcworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cnJlZCBkdXJpbmcgb3BlcmF0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoIF9fdW51c2VkLCB1aW50MzJfdCBoZWlnaHQgX191bnVzZWQsIHVpbnQzMl90IGZvcm1hdCBfX3VudXNlZCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovLAorICAgICAgICAgICAgQzJGZW5jZSAqZmVuY2UgLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYmxvY2sgPSBudWxscHRyOworICAgICAgICAodm9pZCkgZmVuY2U7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KIHByb3RlY3RlZDoKICAgICBDMkJsb2NrUG9vbCgpID0gZGVmYXVsdDsKIH07CkBAIC0yMTU2LDkgKzIyNjMsMTIgQEAKIH07CiAKIC8qKgotICogQW4gZXh0ZW5zaW9uIG9mIEMySW5mbyBvYmplY3RzIHRoYXQgY2FuIGNvbnRhaW4gYXJiaXRyYXJ5IGJ1ZmZlciBkYXRhLgorICogQSBjb25zdCBtZXRhZGF0YSBvYmplY3QgdGhhdCBjYW4gY29udGFpbiBhcmJpdHJhcnkgYnVmZmVyIGRhdGEuCiAgKgotICogXG5vdGUgVGhpcyBvYmplY3QgaXMgbm90IGRlc2NyaWJhYmxlIGFuZCBjb250YWlucyBvcGFxdWUgZGF0YS4KKyAqIFRoaXMgb2JqZWN0IGlzIG5vdCBhbiBhY3R1YWwgQzJJbmZvIGFuZCBpcyBub3QgYXR0YWNoZWQgdG8gYnVmZmVycyAoQzJCdWZmZXIpLCBidXQgcmF0aGVyIHRvCisgKiBmcmFtZXMgKEMyRnJhbWVEYXRhKS4gSXQgaXMgbm90IGRlc2NyaWJhYmxlIHZpYSBDMlBhcmFtRGVzY3JpcHRvci4KKyAqCisgKiBDMkluZm9CdWZmZXIgaXMgYSBjb25zdCBvYmplY3QgdGhhdCBjYW4gYmUgYWxsb2NhdGVkIG9uIHN0YWNrIGFuZCBpcyBjb3BpYWJsZS4KICAqLwogY2xhc3MgQzJJbmZvQnVmZmVyIHsKIHB1YmxpYzoKQEAgLTIxNjcsMTQgKzIyNzcsNjUgQEAKICAgICAgKgogICAgICAqIFxyZXR1cm4gdGhlIHBhcmFtZXRlciBpbmRleC4KICAgICAgKi8KLSAgICBjb25zdCBDMlBhcmFtOjpJbmRleCBpbmRleCgpIGNvbnN0OworICAgIGNvbnN0IEMyUGFyYW06OkluZGV4IGluZGV4KCkgY29uc3QgeyByZXR1cm4gbUluZGV4OyB9CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBidWZmZXIncyBkYXRhLgogICAgICAqCiAgICAgICogXHJldHVybiB0aGUgYnVmZmVyJ3MgZGF0YS4KICAgICAgKi8KLSAgICBjb25zdCBDMkJ1ZmZlckRhdGEgZGF0YSgpIGNvbnN0OworICAgIGNvbnN0IEMyQnVmZmVyRGF0YSBkYXRhKCkgY29uc3QgeyByZXR1cm4gbURhdGE7IH0KKworICAgIC8vLyBSZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyBhcyBhIGdsb2JhbCBpbmZvIGJ1ZmZlci4KKyAgICBDMkluZm9CdWZmZXIgYXNHbG9iYWwoKSBjb25zdCB7CisgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4ID0gbUluZGV4OworICAgICAgICBpbmRleC5jb252ZXJ0VG9HbG9iYWwoKTsKKyAgICAgICAgcmV0dXJuIEMySW5mb0J1ZmZlcihpbmRleCwgbURhdGEpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyBhcyBhIHBvcnQgaW5mbyBidWZmZXIuCisgICAgQzJJbmZvQnVmZmVyIGFzUG9ydChib29sIG91dHB1dCkgY29uc3QgeworICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleCA9IG1JbmRleDsKKyAgICAgICAgaW5kZXguY29udmVydFRvUG9ydChvdXRwdXQpOworICAgICAgICByZXR1cm4gQzJJbmZvQnVmZmVyKGluZGV4LCBtRGF0YSk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgYSBjbG9uZSBvZiB0aGlzIGFzIGEgc3RyZWFtIGluZm8gYnVmZmVyLgorICAgIEMySW5mb0J1ZmZlciBhc1N0cmVhbShib29sIG91dHB1dCwgdW5zaWduZWQgc3RyZWFtKSBjb25zdCB7CisgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4ID0gbUluZGV4OworICAgICAgICBpbmRleC5jb252ZXJ0VG9TdHJlYW0ob3V0cHV0LCBzdHJlYW0pOworICAgICAgICByZXR1cm4gQzJJbmZvQnVmZmVyKGluZGV4LCBtRGF0YSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGdsb2JhbCBpbmZvIGJ1ZmZlciBjb250YWluaW5nIGEgc2luZ2xlIGxpbmVhciBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpbmRleCB0aGUgY29yZSBwYXJhbWV0ZXIgaW5kZXggb2YgdGhpcyBpbmZvIGJ1ZmZlci4KKyAgICAgKiBccGFyYW0gYmxvY2sgdGhlIGNvbnRlbnQgb2YgdGhlIGluZm8gYnVmZmVyLgorICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBpbmZvIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgQzJJbmZvQnVmZmVyIENyZWF0ZUxpbmVhckJ1ZmZlcihDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgsIGNvbnN0IEMyQ29uc3RMaW5lYXJCbG9jayAmYmxvY2spOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGdsb2JhbCBpbmZvIGJ1ZmZlciBjb250YWluaW5nIGEgc2luZ2xlIGdyYXBoaWMgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5kZXggdGhlIGNvcmUgcGFyYW1ldGVyIGluZGV4IG9mIHRoaXMgaW5mbyBidWZmZXIuCisgICAgICogXHBhcmFtIGJsb2NrIHRoZSBjb250ZW50IG9mIHRoZSBpbmZvIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgaW5mbyBidWZmZXIuCisgICAgICovCisgICAgc3RhdGljIEMySW5mb0J1ZmZlciBDcmVhdGVHcmFwaGljQnVmZmVyKEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCwgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2spOworCitwcm90ZWN0ZWQ6CisgICAgLy8gbm8gcHVibGljIGNvbnN0cnVjdG9yCisgICAgZXhwbGljaXQgQzJJbmZvQnVmZmVyKEMyUGFyYW06OkluZGV4IGluZGV4LCBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpOworICAgIGV4cGxpY2l0IEMySW5mb0J1ZmZlcihDMlBhcmFtOjpJbmRleCBpbmRleCwgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2Nrcyk7CisKK3ByaXZhdGU6CisgICAgQzJQYXJhbTo6SW5kZXggbUluZGV4OworICAgIEMyQnVmZmVyRGF0YSBtRGF0YTsKKyAgICBleHBsaWNpdCBDMkluZm9CdWZmZXIoQzJQYXJhbTo6SW5kZXggaW5kZXgsIGNvbnN0IEMyQnVmZmVyRGF0YSAmZGF0YSk7CiB9OwogCiAvLy8gQH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb25maWcuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb25maWcuaAppbmRleCAyOWJjY2Q1Li45ZDllZDcwIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29uZmlnLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbmZpZy5oCkBAIC03NSw2ICs3NSwxMCBAQAogICAgIGVudW0gdGlsaW5nX21vZGVfdCA6IHVpbnQzMl90OyAgICAgICAgICAvLy88IHRpbGluZyBtb2RlcwogfTsKIAorc3RydWN0IEMyUGxhdGZvcm1Db25maWcgeworICAgIGVudW0gZW5jb2RpbmdfcXVhbGl0eV9sZXZlbF90IDogdWludDMyX3Q7IC8vLzwgZW5jb2RpbmcgcXVhbGl0eSBsZXZlbAorfTsKKwogbmFtZXNwYWNlIHsKIAogZW51bSBDMlBhcmFtSW5kZXhLaW5kIDogQzJQYXJhbTo6dHlwZV9pbmRleF90IHsKQEAgLTE1MSw2ICsxNTUsNyBAQAogCiAgICAgLyogcHJvdGVjdGVkIGNvbnRlbnQgKi8KICAgICBrUGFyYW1JbmRleFNlY3VyZU1vZGUsCisgICAga1BhcmFtSW5kZXhFbmNyeXB0ZWRCdWZmZXIsIC8vIGluZm8tYnVmZmVyLCB1c2VkIHdpdGggU01fUkVBRF9QUk9URUNURURfV0lUSF9FTkNSWVBURUQKIAogICAgIC8vIGRlcHJlY2F0ZWQKICAgICBrUGFyYW1JbmRleERlbGF5UmVxdWVzdCA9IGtQYXJhbUluZGV4RGVsYXkgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX1JFUVVFU1RfRkxBRywKQEAgLTE4Niw2ICsxOTEsOCBAQAogICAgIGtQYXJhbUluZGV4UGljdHVyZVR5cGUsCiAgICAga1BhcmFtSW5kZXhIZHIxMFBsdXNNZXRhZGF0YSwKIAorICAgIGtQYXJhbUluZGV4UGljdHVyZVF1YW50aXphdGlvbiwKKwogICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB2aWRlbyBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAgICAga1BhcmFtSW5kZXhGcmFtZVJhdGUgPSBDMl9QQVJBTV9JTkRFWF9WSURFT19QQVJBTV9TVEFSVCwKQEAgLTIyMSw2ICsyMjgsNyBAQAogICAgIGtQYXJhbUluZGV4RHJjRWZmZWN0VHlwZSwgLy8gZHJjLCBlbnVtCiAgICAga1BhcmFtSW5kZXhEcmNPdXRwdXRMb3VkbmVzcywgLy8gZHJjLCBmbG9hdCAoZEJGUykKICAgICBrUGFyYW1JbmRleERyY0FsYnVtTW9kZSwgLy8gZHJjLCBlbnVtCisgICAga1BhcmFtSW5kZXhBdWRpb0ZyYW1lU2l6ZSwgLy8gaW50CiAKICAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gcGxhdGZvcm0tZGVmaW5lZCBwYXJhbWV0ZXJzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCkBAIC0yNDksNiArMjU3LDE3IEBACiAKICAgICAvLyBsb3cgbGF0ZW5jeSBtb2RlCiAgICAga1BhcmFtSW5kZXhMb3dMYXRlbmN5TW9kZSwgLy8gYm9vbAorCisgICAgLy8gdHVubmVsZWQgY29kZWMKKyAgICBrUGFyYW1JbmRleFR1bm5lbGVkTW9kZSwgLy8gc3RydWN0CisgICAga1BhcmFtSW5kZXhUdW5uZWxIYW5kbGUsIC8vIGludDMyW10KKyAgICBrUGFyYW1JbmRleFR1bm5lbFN5c3RlbVRpbWUsIC8vIGludDY0CisKKyAgICAvLyBkbWFidWYgYWxsb2NhdG9yCisgICAga1BhcmFtSW5kZXhTdG9yZURtYUJ1ZlVzYWdlLCAgLy8gc3RvcmUsIHN0cnVjdAorCisgICAgLy8gZW5jb2RpbmcgcXVhbGl0eSByZXF1aXJlbWVudHMKKyAgICBrUGFyYW1JbmRleEVuY29kaW5nUXVhbGl0eUxldmVsLCAvLyBlbmNvZGVycywgZW51bQogfTsKIAogfQpAQCAtMzczLDYgKzM5Miw3IEBACiAKIG5hbWVzcGFjZSB7CiAKKy8vIENvZGVjIGJhc2VzIGFyZSBvcmRlcmVkIGJ5IHRoZWlyIGRhdGUgb2YgaW50cm9kdWN0aW9uIHRvIHRoZSBjb2RlIGJhc2UuCiBlbnVtIDogdWludDMyX3QgewogICAgIF9DMl9QTF9NUDJWX0JBU0UgPSAweDEwMDAsCiAgICAgX0MyX1BMX0FBQ19CQVNFICA9IDB4MjAwMCwKQEAgLTM4MywxMiArNDAzLDE2IEBACiAgICAgX0MyX1BMX1ZQOV9CQVNFICA9IDB4NzAwMCwKICAgICBfQzJfUExfRFZfQkFTRSAgID0gMHg4MDAwLAogICAgIF9DMl9QTF9BVjFfQkFTRSAgPSAweDkwMDAsCisgICAgX0MyX1BMX1ZQOF9CQVNFICA9IDB4QTAwMCwKKyAgICBfQzJfUExfTVBFR0hfQkFTRSA9IDB4QjAwMCwgICAgIC8vIE1QRUctSCAzRCBBdWRpbwogCiAgICAgQzJfUFJPRklMRV9MRVZFTF9WRU5ET1JfU1RBUlQgPSAweDcwMDAwMDAwLAogfTsKIAogfQogCisvLyBQcm9maWxlcyBhbmQgbGV2ZWxzIGZvciBlYWNoIGNvZGVjIGFyZSBvcmRlcmVkIGJhc2VkIG9uIGhvdyB0aGV5IGFyZSBvcmRlcmVkIGluIHRoZQorLy8gY29ycmVzcG9uZGluZyBzdGFuZGFyZCBkb2N1bWVudHMgYXQgaW50cm9kdWN0aW9uLCBhbmQgY2hyb25vbG9naWNhbGx5IGFmdGVyd2FyZHMuCiBlbnVtIEMyQ29uZmlnOjpwcm9maWxlX3QgOiB1aW50MzJfdCB7CiAgICAgUFJPRklMRV9VTlVTRUQgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHByb2ZpbGUgaXMgbm90IHVzZWQgYnkgdGhpcyBtZWRpYSB0eXBlCiAKQEAgLTUzNiw2ICs1NjAsMTkgQEAKICAgICBQUk9GSUxFX0FWMV8wID0gX0MyX1BMX0FWMV9CQVNFLCAgICAgICAgICAgIC8vLzwgQVYxIFByb2ZpbGUgMCAoNDoyOjAsIDggdG8gMTAgYml0KQogICAgIFBST0ZJTEVfQVYxXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgUHJvZmlsZSAxICg4IHRvIDEwIGJpdCkKICAgICBQUk9GSUxFX0FWMV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIFByb2ZpbGUgMiAoOCB0byAxMiBiaXQpCisKKyAgICAvLyBWUDggcHJvZmlsZXMKKyAgICBQUk9GSUxFX1ZQOF8wID0gX0MyX1BMX1ZQOF9CQVNFLCAgICAgICAgICAgIC8vLzwgVlA4IFByb2ZpbGUgMAorICAgIFBST0ZJTEVfVlA4XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDggUHJvZmlsZSAxCisgICAgUFJPRklMRV9WUDhfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOCBQcm9maWxlIDIKKyAgICBQUk9GSUxFX1ZQOF8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA4IFByb2ZpbGUgMworCisgICAgLy8gTVBFRy1IIDNEIEF1ZGlvIHByb2ZpbGVzCisgICAgUFJPRklMRV9NUEVHSF9NQUlOID0gX0MyX1BMX01QRUdIX0JBU0UsICAgICAvLy88IE1QRUctSCBNYWluCisgICAgUFJPRklMRV9NUEVHSF9ISUdILCAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctSCBIaWdoCisgICAgUFJPRklMRV9NUEVHSF9MQywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctSCBMb3ctY29tcGxleGl0eQorICAgIFBST0ZJTEVfTVBFR0hfQkFTRUxJTkUsICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLUggQmFzZWxpbmUKKwogfTsKIAogZW51bSBDMkNvbmZpZzo6bGV2ZWxfdCA6IHVpbnQzMl90IHsKQEAgLTY3OCw2ICs3MTUsMTMgQEAKICAgICBMRVZFTF9BVjFfN18xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDcuMQogICAgIExFVkVMX0FWMV83XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNy4yCiAgICAgTEVWRUxfQVYxXzdfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA3LjMKKworICAgIC8vIE1QRUctSCAzRCBBdWRpbyBsZXZlbHMKKyAgICBMRVZFTF9NUEVHSF8xID0gX0MyX1BMX01QRUdIX0JBU0UsICAgICAgICAgIC8vLzwgTVBFRy1IIEwxCisgICAgTEVWRUxfTVBFR0hfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctSCBMMgorICAgIExFVkVMX01QRUdIXzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLUggTDMKKyAgICBMRVZFTF9NUEVHSF80LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy1IIEw0CisgICAgTEVWRUxfTVBFR0hfNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctSCBMNQogfTsKIAogc3RydWN0IEMyUHJvZmlsZUxldmVsU3RydWN0IHsKQEAgLTExMzcsNiArMTE4MSw4IEBACiBDMkVOVU0oQzJDb25maWc6OnNlY3VyZV9tb2RlX3QsIHVpbnQzMl90LAogICAgIFNNX1VOUFJPVEVDVEVELCAgICAvLy88IG5vIGNvbnRlbnQgcHJvdGVjdGlvbgogICAgIFNNX1JFQURfUFJPVEVDVEVELCAvLy88IGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBzaGFsbCBiZSBwcm90ZWN0ZWQgZnJvbSByZWFkaW5nCisgICAgLy8vIGJvdGggcmVhZCBwcm90ZWN0ZWQgYW5kIHJlYWRhYmxlIGVuY3J5cHRlZCBidWZmZXJzIGFyZSB1c2VkCisgICAgU01fUkVBRF9QUk9URUNURURfV0lUSF9FTkNSWVBURUQsCiApCiAKIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6c2VjdXJlX21vZGVfdD4sIGtQYXJhbUluZGV4U2VjdXJlTW9kZT4KQEAgLTE2ODgsNiArMTczNCwzMSBAQAogY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfR09QW10gPSAiY29kaW5nLmdvcCI7CiAKIC8qKgorICogUXVhbnRpemF0aW9uCisgKiBtaW4vbWF4IGZvciBlYWNoIHBpY3R1cmUgdHlwZQorICoKKyAqLworc3RydWN0IEMyUGljdHVyZVF1YW50aXphdGlvblN0cnVjdCB7CisgICAgQzJQaWN0dXJlUXVhbnRpemF0aW9uU3RydWN0KCkgOiB0eXBlXygoQzJDb25maWc6OnBpY3R1cmVfdHlwZV90KTApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oSU5UMzJfTUlOKSwgbWF4KElOVDMyX01BWCkge30KKyAgICBDMlBpY3R1cmVRdWFudGl6YXRpb25TdHJ1Y3QoQzJDb25maWc6OnBpY3R1cmVfdHlwZV90IHR5cGUsIGludDMyX3QgbWluXywgaW50MzJfdCBtYXhfKQorICAgICAgICA6IHR5cGVfKHR5cGUpLCBtaW4obWluXyksIG1heChtYXhfKSB7IH0KKworICAgIEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCB0eXBlXzsKKyAgICBpbnQzMl90IG1pbjsgICAgICAvLyBJTlQzMl9NSU4gPT0gJ25vIGxvd2VyIGJvdW5kIHNwZWNpZmllZCcKKyAgICBpbnQzMl90IG1heDsgICAgICAvLyBJTlQzMl9NQVggPT0gJ25vIHVwcGVyIGJvdW5kIHNwZWNpZmllZCcKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoUGljdHVyZVF1YW50aXphdGlvbikKKyAgICBDMkZJRUxEKHR5cGVfLCAidHlwZSIpCisgICAgQzJGSUVMRChtaW4sICJtaW4iKQorICAgIEMyRklFTEQobWF4LCAibWF4IikKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMlBpY3R1cmVRdWFudGl6YXRpb25TdHJ1Y3Q+LAorICAgICAgICBrUGFyYW1JbmRleFBpY3R1cmVRdWFudGl6YXRpb24+IEMyU3RyZWFtUGljdHVyZVF1YW50aXphdGlvblR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BJQ1RVUkVfUVVBTlRJWkFUSU9OW10gPSAiY29kaW5nLnFwIjsKKworLyoqCiAgKiBTeW5jIGZyYW1lIGNhbiBiZSByZXF1ZXN0ZWQgb24gZGVtYW5kIGJ5IHRoZSBjbGllbnQuCiAgKgogICogSWYgdHJ1ZSwgdGhlIG5leHQgSSBmcmFtZSBzaGFsbCBiZSBlbmNvZGVkIGFzIGEgc3luYyBmcmFtZS4gVGhpcyBjb25maWcgY2FuIGJlIHBhc3NlZApAQCAtMTg2Myw3ICsxOTM0LDkgQEAKIEMyRU5VTShDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QsIHVpbnQzMl90LAogICAgIFBDTV8xNiwKICAgICBQQ01fOCwKLSAgICBQQ01fRkxPQVQKKyAgICBQQ01fRkxPQVQsCisgICAgUENNXzI0LAorICAgIFBDTV8zMgogKQogCiB0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdD4sIGtQYXJhbUluZGV4UGNtRW5jb2Rpbmc+CkBAIC0xOTYyLDkgKzIwMzUsMjAgQEAKIC8qKgogICogRFJDIG91dHB1dCBsb3VkbmVzcyBpbiBkQkZTLiBSZXRyaWV2ZWQgZHVyaW5nIGRlY29kaW5nCiAgKi8KLSB0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4RHJjT3V0cHV0TG91ZG5lc3M+Cit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4RHJjT3V0cHV0TG91ZG5lc3M+CiAgICAgICAgIEMyU3RyZWFtRHJjT3V0cHV0TG91ZG5lc3NUdW5pbmc7Ci0gY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRFJDX09VVFBVVF9MT1VETkVTU1tdID0gIm91dHB1dC5kcmMub3V0cHV0LWxvdWRuZXNzIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0RSQ19PVVRQVVRfTE9VRE5FU1NbXSA9ICJvdXRwdXQuZHJjLm91dHB1dC1sb3VkbmVzcyI7CisKKy8qKgorICogQXVkaW8gZnJhbWUgc2l6ZSBpbiBzYW1wbGVzLgorICoKKyAqIEF1ZGlvIGVuY29kZXJzIGNhbiBleHBvc2UgdGhpcyBwYXJhbWV0ZXIgdG8gc2lnbmFsIHRoZSBkZXNpcmVkIGF1ZGlvIGZyYW1lCisgKiBzaXplIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGUgY29kZWQgYWNjZXNzIHVuaXQuCisgKiBEZWZhdWx0IHZhbHVlIGlzIDAsIG1lYW5pbmcgdGhhdCB0aGUgZW5jb2RlciBhY2NlcHRzIGlucHV0IGJ1ZmZlcnMgb2YgYW55IHNpemUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4QXVkaW9GcmFtZVNpemU+CisgICAgICAgIEMyU3RyZWFtQXVkaW9GcmFtZVNpemVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQVVESU9fRlJBTUVfU0laRVtdID0gInJhdy5hdWRpby1mcmFtZS1zaXplIjsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFBQyBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0yMDM2LDYgKzIxMjAsMzMgQEAKICAgICAgICAgQzJTdG9yZUlvblVzYWdlSW5mbzsKIAogLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIHByZWZlcnJlZCBETUEtQnVmIGFsbG9jYXRpb24gcGFyYW1ldGVycyBmb3IgYSBnaXZlbiBtZW1vcnkgdXNhZ2UuCisgKi8KK3N0cnVjdCBDMlN0b3JlRG1hQnVmVXNhZ2VTdHJ1Y3QgeworICAgIGlubGluZSBDMlN0b3JlRG1hQnVmVXNhZ2VTdHJ1Y3QoKSB7IG1lbXNldCh0aGlzLCAwLCBzaXplb2YoKnRoaXMpKTsgfQorCisgICAgaW5saW5lIEMyU3RvcmVEbWFCdWZVc2FnZVN0cnVjdChzaXplX3QgZmxleENvdW50LCB1aW50NjRfdCB1c2FnZV8sIHVpbnQzMl90IGNhcGFjaXR5XykKKyAgICAgICAgOiB1c2FnZSh1c2FnZV8pLCBjYXBhY2l0eShjYXBhY2l0eV8pLCBhbGxvY0ZsYWdzKDApIHsKKyAgICAgICAgbWVtc2V0KGhlYXBOYW1lLCAwLCBmbGV4Q291bnQpOworICAgIH0KKworICAgIHVpbnQ2NF90IHVzYWdlOyAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEMyTWVtb3J5VXNhZ2UKKyAgICB1aW50MzJfdCBjYXBhY2l0eTsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjYXBhY2l0eQorICAgIGludDMyX3QgYWxsb2NGbGFnczsgICAgICAgICAgICAgICAgICAgICAvLy88IGlvbiBhbGxvY2F0aW9uIGZsYWdzCisgICAgY2hhciBoZWFwTmFtZVtdOyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZG1hYnVmIGhlYXAgbmFtZQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFN0b3JlRG1hQnVmVXNhZ2UsIGhlYXBOYW1lKQorICAgIEMyRklFTEQodXNhZ2UsICJ1c2FnZSIpCisgICAgQzJGSUVMRChjYXBhY2l0eSwgImNhcGFjaXR5IikKKyAgICBDMkZJRUxEKGFsbG9jRmxhZ3MsICJhbGxvYy1mbGFncyIpCisgICAgQzJGSUVMRChoZWFwTmFtZSwgImhlYXAtbmFtZSIpCit9OworCisvLyBzdG9yZSwgcHJpdmF0ZQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJTdG9yZURtYUJ1ZlVzYWdlU3RydWN0LCBrUGFyYW1JbmRleFN0b3JlRG1hQnVmVXNhZ2U+CisgICAgICAgIEMyU3RvcmVEbWFCdWZVc2FnZUluZm87CisKKy8qKgogICogRmxleGlibGUgcGl4ZWwgZm9ybWF0IGRlc2NyaXB0b3JzCiAgKi8KIHN0cnVjdCBDMkZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yU3RydWN0IHsKQEAgLTIxODIsNiArMjI5Myw5NiBAQAogdHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJUaW1lc3RhbXBHYXBBZGp1c3RtZW50U3RydWN0PiBDMlBvcnRUaW1lc3RhbXBHYXBUdW5pbmc7CiBjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX1RJTUVTVEFNUF9BREpVU1RNRU5UW10gPSAiaW5wdXQtc3VyZmFjZS50aW1lc3RhbXAtYWRqdXN0bWVudCI7CiAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVFVOTkVMRUQgQ09ERUMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogVHVubmVsZWQgY29kZWMgY29udHJvbC4KKyAqLworc3RydWN0IEMyVHVubmVsZWRNb2RlU3RydWN0IHsKKyAgICAvLy8gbW9kZQorICAgIGVudW0gbW9kZV90IDogdWludDMyX3Q7CisgICAgLy8vIHN5bmMgdHlwZQorICAgIGVudW0gc3luY190eXBlX3QgOiB1aW50MzJfdDsKKworICAgIGlubGluZSBDMlR1bm5lbGVkTW9kZVN0cnVjdCgpID0gZGVmYXVsdDsKKworICAgIGlubGluZSBDMlR1bm5lbGVkTW9kZVN0cnVjdCgKKyAgICAgICAgICAgIHNpemVfdCBmbGV4Q291bnQsIG1vZGVfdCBtb2RlXywgc3luY190eXBlX3QgdHlwZSwgc3RkOjp2ZWN0b3I8aW50MzJfdD4gaWQpCisgICAgICAgIDogbW9kZShtb2RlXyksIHN5bmNUeXBlKHR5cGUpIHsKKyAgICAgICAgbWVtY3B5KCZzeW5jSWQsICZpZFswXSwgYzJfbWluKGlkLnNpemUoKSwgZmxleENvdW50KSAqIEZMRVhfU0laRSk7CisgICAgfQorCisgICAgaW5saW5lIEMyVHVubmVsZWRNb2RlU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIG1vZGVfdCBtb2RlXywgc3luY190eXBlX3QgdHlwZSwgaW50MzJfdCBpZCkKKyAgICAgICAgOiBtb2RlKG1vZGVfKSwgc3luY1R5cGUodHlwZSkgeworICAgICAgICBpZiAoZmxleENvdW50ID49IDEpIHsKKyAgICAgICAgICAgIHN5bmNJZFswXSA9IGlkOworICAgICAgICB9CisgICAgfQorCisgICAgbW9kZV90IG1vZGU7ICAgICAgICAgIC8vLzwgdHVubmVsZWQgbW9kZQorICAgIHN5bmNfdHlwZV90IHN5bmNUeXBlOyAvLy88IHR5cGUgb2Ygc3luYyB1c2VkIGZvciB0dW5uZWxlZCBtb2RlCisgICAgaW50MzJfdCBzeW5jSWRbXTsgICAgIC8vLzwgc3luYyBpZAorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFR1bm5lbGVkTW9kZSwgc3luY0lkKQorICAgIEMyRklFTEQobW9kZSwgIm1vZGUiKQorICAgIEMyRklFTEQoc3luY1R5cGUsICJzeW5jLXR5cGUiKQorICAgIEMyRklFTEQoc3luY0lkLCAic3luYy1pZCIpCisKK307CisKK0MyRU5VTShDMlR1bm5lbGVkTW9kZVN0cnVjdDo6bW9kZV90LCB1aW50MzJfdCwKKyAgICBOT05FLAorICAgIFNJREVCQU5ELAorKTsKKworCitDMkVOVU0oQzJUdW5uZWxlZE1vZGVTdHJ1Y3Q6OnN5bmNfdHlwZV90LCB1aW50MzJfdCwKKyAgICBSRUFMVElNRSwKKyAgICBBVURJT19IV19TWU5DLAorICAgIEhXX0FWX1NZTkMsCispOworCisvKioKKyAqIENvbmZpZ3VyZSB0dW5uZWxlZCBtb2RlCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVHVubmVsZWRNb2RlU3RydWN0LCBrUGFyYW1JbmRleFR1bm5lbGVkTW9kZT4KKyAgICAgICAgQzJQb3J0VHVubmVsZWRNb2RlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVFVOTkVMRURfUkVOREVSW10gPSAib3V0cHV0LnR1bm5lbGVkLXJlbmRlciI7CisKKy8qKgorICogVHVubmVsZWQgbW9kZSBoYW5kbGUuIFRoZSBtZWFuaW5nIG9mIHRoaXMgaXMgZGVwZW5kcyBvbiB0aGUKKyAqIHR1bm5lbGVkIG1vZGUuIElmIHRoZSB0dW5uZWxlZCBtb2RlIGlzIFNJREVCQU5ELCB0aGlzIGlzIHRoZQorICogc2lkZWJhbmQgaGFuZGxlLgorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMkludDMyQXJyYXksIGtQYXJhbUluZGV4VHVubmVsSGFuZGxlPiBDMlBvcnRUdW5uZWxIYW5kbGVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfVFVOTkVMX0hBTkRMRVtdID0gIm91dHB1dC50dW5uZWwtaGFuZGxlIjsKKworLyoqCisgKiBUaGUgc3lzdGVtIHRpbWUgdXNpbmcgQ0xPQ0tfTU9OT1RPTklDIGluIG5hbm9zZWNvbmRzIGF0IHRoZSB0dW5uZWwgZW5kcG9pbnQuCisgKiBGb3IgZGVjb2RlcnMgdGhpcyBpcyB0aGUgcmVuZGVyIHRpbWUgZm9yIHRoZSBvdXRwdXQgZnJhbWUgYW5kCisgKiB0aGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBtZWRpYSB0aW1lc3RhbXAgb2YgdGhlIG91dHB1dCBmcmFtZS4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8aW50NjRfdD4sIGtQYXJhbUluZGV4VHVubmVsU3lzdGVtVGltZT4KKyAgICAgICAgQzJQb3J0VHVubmVsU3lzdGVtVGltZTsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9SRU5ERVJfVElNRVtdID0gIm91dHB1dC5yZW5kZXItdGltZSI7CisKK0MyRU5VTShDMlBsYXRmb3JtQ29uZmlnOjplbmNvZGluZ19xdWFsaXR5X2xldmVsX3QsIHVpbnQzMl90LAorICAgIE5PTkUsCisgICAgU19IQU5ESEVMRCwKKyAgICBTX0hBTkRIRUxEX1BDCispOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogRW5jb2RpbmcgcXVhbGl0eSBsZXZlbCBzaWduYWxpbmcuCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsCisgICAgICAgIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJFYXN5RW51bTxDMlBsYXRmb3JtQ29uZmlnOjplbmNvZGluZ19xdWFsaXR5X2xldmVsX3Q+PiwKKyAgICAgICAga1BhcmFtSW5kZXhFbmNvZGluZ1F1YWxpdHlMZXZlbD4gQzJFbmNvZGluZ1F1YWxpdHlMZXZlbDsKKworfQorCiAvLy8gQH0KIAogI2VuZGlmICAvLyBDMkNPTkZJR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkVudW0uaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJFbnVtLmgKaW5kZXggYjBmYWQ4Zi4uZGExZjQzYiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkVudW0uaAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyRW51bS5oCkBAIC01NCw3ICs1NCw3IEBACiAvLy8gXG5vdGUgdGhpcyB3aWxsIGNvbnRhaW4gYW55IGluaXRpYWxpemF0aW9uLCB3aGljaCB3ZSB3aWxsIHJlbW92ZSB3aGVuIGNvbnZlcnRpbmcgdG8gbG93ZXItY2FzZQogI2RlZmluZSBfQzJfR0VUX0VOVU1fTkFNRSh4LCB5KSAjeAogLy8vIG1hcHBlciB0byBnZXQgdmFsdWUgb2YgZW51bQotI2RlZmluZSBfQzJfR0VUX0VOVU1fVkFMVUUoeCwgdHlwZSkgKF9DMkVudW1Db25zdDx0eXBlPil4CisjZGVmaW5lIF9DMl9HRVRfRU5VTV9WQUxVRSh4LCB0eXBlXykgKF9DMkVudW1Db25zdDx0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTx0eXBlXz46OnR5cGU+KXR5cGVfOjp4CiAKIC8vLyBcZW5kY29uZAogCkBAIC0xMDYsNyArMTA2LDcgQEAKIHRlbXBsYXRlPD4gXAogQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoY29uc3QgbmFtZSAmciBfX3VudXNlZCkgeyBcCiAgICAgcmV0dXJuIF9DMkVudW1VdGlsczo6c2FuaXRpemVFbnVtVmFsdWVzKCBcCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHsgX0MyX01BUChfQzJfR0VUX0VOVU1fVkFMVUUsIHR5cGUsIF9fVkFfQVJHU19fKSB9LCBcCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHsgX0MyX01BUChfQzJfR0VUX0VOVU1fVkFMVUUsIG5hbWUsIF9fVkFfQVJHU19fKSB9LCBcCiAgICAgICAgICAgICB7IF9DMl9NQVAoX0MyX0dFVF9FTlVNX05BTUUsIHR5cGUsIF9fVkFfQVJHU19fKSB9LCBcCiAgICAgICAgICAgICBwcmVmaXgpOyBcCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW0uaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbS5oCmluZGV4IDUxZDQxN2EuLmU5MzhmOTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbS5oCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbS5oCkBAIC0zMTcsNyArMzE3LDggQEAKICAgICAgICAgREVGSU5FX0ZJRUxEX0JBU0VEX0NPTVBBUklTT05fT1BFUkFUT1JTKEluZGV4LCBtSW5kZXgpCiAKICAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgc3RydWN0IEMyUGFyYW07ICAgICAgICAgICAvLyBmb3Igc2V0U3RyZWFtLCBNYWtlU3RyZWFtSWQsIGlzVmFsaWQKKyAgICAgICAgZnJpZW5kIGNsYXNzIEMySW5mb0J1ZmZlcjsgICAgICAgLy8gZm9yIGNvbnZlcnRUbyoKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBDMlBhcmFtOyAgICAgICAgICAgLy8gZm9yIHNldFN0cmVhbSwgTWFrZVN0cmVhbUlkLCBpc1ZhbGlkLCBjb252ZXJ0VG8qCiAgICAgICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7IC8vIGZvciB0ZXN0aW5nCiAKICAgICAgICAgLyoqCkBAIC01MDgsNiArNTA5LDE0IEBACiAgICAgICAgIHJldHVybiBfbUluZGV4LnNldFBvcnQob3V0cHV0KTsKICAgICB9CiAKKyAgICAvLy8gc2V0cyB0aGUgc2l6ZSBvZiB0aGlzIHBhcmFtZXRlci4KKyAgICBpbmxpbmUgdm9pZCBzZXRTaXplKHNpemVfdCBzaXplKSB7CisgICAgICAgIGlmIChzaXplIDwgc2l6ZW9mKEMyUGFyYW0pKSB7CisgICAgICAgICAgICBzaXplID0gMDsKKyAgICAgICAgfQorICAgICAgICBfbVNpemUgPSBjMl9taW4oc2l6ZSwgX21TaXplKTsKKyAgICB9CisKIHB1YmxpYzoKICAgICAvLy8gaW52YWxpZGF0ZSB0aGlzIHBhcmFtZXRlci4gVGhlcmUgaXMgbm8gcmVjb3ZlcnkgZnJvbSB0aGlzIGNhbGw7IGUuZy4gcGFyYW1ldGVyCiAgICAgLy8vIGNhbm5vdCBiZSAnY29ycmVjdGVkJyB0byBiZSB2YWxpZC4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbURlZi5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtRGVmLmgKaW5kZXggMGEzMzI4My4uZDU3ODgyMCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtRGVmLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtRGVmLmgKQEAgLTk3LDYgKzk3LDkgQEAKICAgICAgICAgUEFSQU1fVFlQRSA9IENvcmVJbmRleCB8IFR5cGVGbGFncwogICAgIH07CiAKKyAgICAvLyB0aGUgdW5kZXJseWluZyBwYXJhbSBzdHJ1Y3QgdHlwZQorICAgIHR5cGVkZWYgUyBTdHJ1Y3Q7CisKIHByb3RlY3RlZDoKICAgICBlbnVtIDogdWludDMyX3QgewogICAgICAgICBGTEVYX1NJWkUgPSAwLApAQCAtMjcwLDYgKzI3MywxMSBAQAogICAgICAgICB9IFwKICAgICAgICAgcmV0dXJuIDA7IFwKICAgICB9IFwKKyAgICBpbmxpbmUgdm9pZCBzZXRGbGV4Q291bnQoc2l6ZV90IGNvdW50KSB7IFwKKyAgICAgICAgaWYgKGNvdW50IDwgZmxleENvdW50KCkpIHsgXAorICAgICAgICAgICAgdGhpcy0+c2V0U2l6ZShzaXplb2YoX1R5cGUpICsgX1R5cGU6OkZMRVhfU0laRSAqIGNvdW50KTsgXAorICAgICAgICB9IFwKKyAgICB9IFwKIAogLy8vIE1hcmsgZmxleGlibGUgbWVtYmVyIHZhcmlhYmxlIGFuZCBtYWtlIHN0cnVjdHVyZSBmbGV4aWJsZS4KICNkZWZpbmUgRkxFWChjbHMsIG0pIFwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJXb3JrLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyV29yay5oCmluZGV4IDY5MjNmM2UuLjY3MDg0Y2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJXb3JrLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMldvcmsuaApAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgLy88IGZvciBpbml0aWFsIHdvcmsgaXRlbSwgdGhlc2UgbWF5IGFsc28gY29tZSBmcm9tIHRoZSBwYXJzZXIgLSBpZiBwcm92aWRlZAogICAgIC8vPCBmb3Igb3V0cHV0IGJ1ZmZlcnMsIHRoZXNlIGFyZSB0aGUgcmVzcG9uc2VzIHRvIHJlcXVlc3RlZEluZm9zCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAgICAgIGNvbmZpZ1VwZGF0ZTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvQnVmZmVyPj4gaW5mb0J1ZmZlcnM7CisgICAgc3RkOjp2ZWN0b3I8QzJJbmZvQnVmZmVyPiBpbmZvQnVmZmVyczsKIH07CiAKIHN0cnVjdCBDMldvcmtsZXQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQW5kcm9pZC5icAppbmRleCBhMGFkM2NlLi5jMDRlY2JlIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliY29kZWMyX2NvbXBvbmVudF93cmFwcGVyIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLApAQCAtMjYsNCArMzUsMyBAQAogCiAgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQxZmFjNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiQzJGdXp6ZXItZGVmYXVsdHMiLAorCisgICAgc3JjczogWworICAgICAgICAiQzJGdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJpb24iLAorICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJkbWFidWZoZWFwIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9jb21tb24iLAorICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMy4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3JAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYWxsb2NhdG9yQDMuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDIuMCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGlidm5ka3N1cHBvcnQiLAorICAgICAgICAibGlicHJvY2Vzc2dyb3VwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiQzJGdXp6ZXJBdmNEZWMiLAorICAgIGRlZmF1bHRzOiBbIkMyRnV6emVyLWRlZmF1bHRzIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQzJDT01QT05FTlROQU1FPVwiYzIuYW5kcm9pZC5hdmMuZGVjb2RlclwiIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF2Y2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hdmNkZWMiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJDMkZ1enplckhldmNEZWMiLAorICAgIGRlZmF1bHRzOiBbIkMyRnV6emVyLWRlZmF1bHRzIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQzJDT01QT05FTlROQU1FPVwiYzIuYW5kcm9pZC5oZXZjLmRlY29kZXJcIiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJoZXZjZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2hldmNkZWMiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJDMkZ1enplck1wZWcyRGVjIiwKKyAgICBkZWZhdWx0czogWyJDMkZ1enplci1kZWZhdWx0cyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREMyQ09NUE9ORU5UTkFNRT1cImMyLmFuZHJvaWQubXBlZzIuZGVjb2RlclwiIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYm1wZWcyZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X21wZWcyZGVjIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiQzJGdXp6ZXJNcGVnNERlYyIsCisgICAgZGVmYXVsdHM6IFsiQzJGdXp6ZXItZGVmYXVsdHMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURDMkNPTVBPTkVOVE5BTUU9XCJjMi5hbmRyb2lkLm1wZWc0LmRlY29kZXJcIiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X21wZWc0ZGVjIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiQzJGdXp6ZXJIMjYzRGVjIiwKKyAgICBkZWZhdWx0czogWyJDMkZ1enplci1kZWZhdWx0cyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREMyQ09NUE9ORU5UTkFNRT1cImMyLmFuZHJvaWQuaDI2My5kZWNvZGVyXCIiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9oMjYzZGVjIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiQzJGdXp6ZXJWcDhEZWMiLAorICAgIGRlZmF1bHRzOiBbIkMyRnV6emVyLWRlZmF1bHRzIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQzJDT01QT05FTlROQU1FPVwiYzIuYW5kcm9pZC52cDguZGVjb2RlclwiIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnZweCIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF92cDhkZWMiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJDMkZ1enplclZwOURlYyIsCisgICAgZGVmYXVsdHM6IFsiQzJGdXp6ZXItZGVmYXVsdHMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURDMkNPTVBPTkVOVE5BTUU9XCJjMi5hbmRyb2lkLnZwOS5kZWNvZGVyXCIiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlidnB4IiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3ZwOWRlYyIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIkMyRnV6emVyQWFjRGVjIiwKKyAgICBkZWZhdWx0czogWyJDMkZ1enplci1kZWZhdWx0cyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREMyQ09NUE9ORU5UTkFNRT1cImMyLmFuZHJvaWQuYWFjLmRlY29kZXJcIiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJGcmF1bmhvZmVyQUFDIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2FhY2RlYyIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIkMyRnV6emVyQW1ybmJEZWMiLAorICAgIGRlZmF1bHRzOiBbIkMyRnV6emVyLWRlZmF1bHRzIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQzJDT01QT05FTlROQU1FPVwiYzIuYW5kcm9pZC5hbXJuYi5kZWNvZGVyXCIiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1yd2JkZWMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZGVjIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiQzJGdXp6ZXJBbXJ3YkRlYyIsCisgICAgZGVmYXVsdHM6IFsiQzJGdXp6ZXItZGVmYXVsdHMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURDMkNPTVBPTkVOVE5BTUU9XCJjMi5hbmRyb2lkLmFtcndiLmRlY29kZXJcIiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYmRlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYW1yd2JkZWMiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJDMkZ1enplckZsYWNEZWMiLAorICAgIGRlZmF1bHRzOiBbIkMyRnV6emVyLWRlZmF1bHRzIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQzJDT01QT05FTlROQU1FPVwiYzIuYW5kcm9pZC5mbGFjLmRlY29kZXJcIiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJGTEFDIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZsYWNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfZmxhY2RlYyIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIkMyRnV6emVyRzcxMUFsYXdEZWMiLAorICAgIGRlZmF1bHRzOiBbIkMyRnV6emVyLWRlZmF1bHRzIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQzJDT01QT05FTlROQU1FPVwiYzIuYW5kcm9pZC5nNzExLmFsYXcuZGVjb2RlclwiIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImNvZGVjc19nNzExZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2c3MTFhbGF3ZGVjIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiQzJGdXp6ZXJHNzExTWxhd0RlYyIsCisgICAgZGVmYXVsdHM6IFsiQzJGdXp6ZXItZGVmYXVsdHMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURDMkNPTVBPTkVOVE5BTUU9XCJjMi5hbmRyb2lkLmc3MTEubWxhdy5kZWNvZGVyXCIiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiY29kZWNzX2c3MTFkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfZzcxMW1sYXdkZWMiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJDMkZ1enplckdzbURlYyIsCisgICAgZGVmYXVsdHM6IFsiQzJGdXp6ZXItZGVmYXVsdHMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURDMkNPTVBPTkVOVE5BTUU9XCJjMi5hbmRyb2lkLmdzbS5kZWNvZGVyXCIiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliZ3NtIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2dzbWRlYyIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIkMyRnV6emVyTXAzRGVjIiwKKyAgICBkZWZhdWx0czogWyJDMkZ1enplci1kZWZhdWx0cyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREMyQ09NUE9ORU5UTkFNRT1cImMyLmFuZHJvaWQubXAzLmRlY29kZXJcIiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcDNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfbXAzZGVjIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiQzJGdXp6ZXJPcHVzRGVjIiwKKyAgICBkZWZhdWx0czogWyJDMkZ1enplci1kZWZhdWx0cyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREMyQ09NUE9ORU5UTkFNRT1cImMyLmFuZHJvaWQub3B1cy5kZWNvZGVyXCIiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlib3B1cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9vcHVzZGVjIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiQzJGdXp6ZXJSYXdEZWMiLAorICAgIGRlZmF1bHRzOiBbIkMyRnV6emVyLWRlZmF1bHRzIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQzJDT01QT05FTlROQU1FPVwiYzIuYW5kcm9pZC5yYXcuZGVjb2RlclwiIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Jhd2RlYyIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIkMyRnV6emVyVm9yYmlzRGVjIiwKKyAgICBkZWZhdWx0czogWyJDMkZ1enplci1kZWZhdWx0cyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREMyQ09NUE9ORU5UTkFNRT1cImMyLmFuZHJvaWQudm9yYmlzLmRlY29kZXJcIiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJ2b3JiaXNpZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3ZvcmJpc2RlYyIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIkMyRnV6emVyWGFhY0RlYyIsCisgICAgZGVmYXVsdHM6IFsiQzJGdXp6ZXItZGVmYXVsdHMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURDMkNPTVBPTkVOVE5BTUU9XCJjMi5hbmRyb2lkLnhhYWMuZGVjb2RlclwiIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnhhYWNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfeGFhY2RlYyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9mdXp6ZXIvQzJGdXp6ZXIuY3BwIGIvbWVkaWEvY29kZWMyL2Z1enplci9DMkZ1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlMTAxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9mdXp6ZXIvQzJGdXp6ZXIuY3BwCkBAIC0wLDAgKzEsMzE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8QzJGdXp6ZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIExpbmVhckJ1ZmZlciA6IHB1YmxpYyBDMkJ1ZmZlciB7CisgcHVibGljOgorICBleHBsaWNpdCBMaW5lYXJCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+JiBibG9jaykKKyAgICAgIDogQzJCdWZmZXIoe2Jsb2NrLT5zaGFyZShibG9jay0+b2Zmc2V0KCksIGJsb2NrLT5zaXplKCksIDo6QzJGZW5jZSgpKX0pIHt9CisKKyAgZXhwbGljaXQgTGluZWFyQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiYgYmxvY2ssIHNpemVfdCBzaXplKQorICAgICAgOiBDMkJ1ZmZlcih7YmxvY2stPnNoYXJlKGJsb2NrLT5vZmZzZXQoKSwgc2l6ZSwgOjpDMkZlbmNlKCkpfSkge30KK307CisKKy8qKgorICogSGFuZGxlIENhbGxiYWNrIGZ1bmN0aW9ucyBvbldvcmtEb25lX25iKCksIG9uVHJpcHBlZF9uYigpLCBvbkVycm9yX25iKCkgZm9yIEMyIENvbXBvbmVudHMKKyAqLworc3RydWN0IENvZGVjTGlzdGVuZXIgOiBwdWJsaWMgQzJDb21wb25lbnQ6Okxpc3RlbmVyIHsKKyBwdWJsaWM6CisgIENvZGVjTGlzdGVuZXIoY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcyk+CisgICAgICAgICAgICAgICAgICAgIGZuID0gbnVsbHB0cikKKyAgICAgIDogY2FsbEJhY2soZm4pIHt9CisgIHZpcnR1YWwgdm9pZCBvbldvcmtEb25lX25iKGNvbnN0IHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKSB7CisgICAgaWYgKGNhbGxCYWNrKSB7CisgICAgICBjYWxsQmFjayhjb21wLCB3b3JrSXRlbXMpOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWRfbmIoY29uc3Qgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gc2V0dGluZ1Jlc3VsdHMpIHsKKyAgICAodm9pZCljb21wOworICAgICh2b2lkKXNldHRpbmdSZXN1bHRzOworICB9CisKKyAgdmlydHVhbCB2b2lkIG9uRXJyb3JfbmIoY29uc3Qgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcCwgdWludDMyX3QgZXJyb3JDb2RlKSB7CisgICAgKHZvaWQpY29tcDsKKyAgICAodm9pZCllcnJvckNvZGU7CisgIH0KKworICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcCwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcyk+IGNhbGxCYWNrOworfTsKKworLyoqCisgKiBCdWZmZXIgc291cmNlIGltcGxlbWVudGF0aW9ucyB0byBpZGVudGlmeSBhIGZyYW1lIGFuZCBpdHMgc2l6ZQorICovCitib29sIENvZGVjMkZ1enplcjo6QnVmZmVyU291cmNlOjpzZWFyY2hGb3JNYXJrZXIoKSB7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKGlzTWFya2VyKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAtLW1SZWFkSW5kZXg7CisgICAgaWYgKG1SZWFkSW5kZXggPiBtU2l6ZSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBDb2RlYzJGdXp6ZXI6OkJ1ZmZlclNvdXJjZTo6cGFyc2UoKSB7CisgIGJvb2wgaXNGcmFtZUF2YWlsYWJsZSA9IHRydWU7CisgIHNpemVfdCBieXRlc1JlbWFpbmluZyA9IG1TaXplOworICB3aGlsZSAoaXNGcmFtZUF2YWlsYWJsZSkgeworICAgIGlzRnJhbWVBdmFpbGFibGUgPSBzZWFyY2hGb3JNYXJrZXIoKTsKKyAgICBpZiAoaXNGcmFtZUF2YWlsYWJsZSkgeworICAgICAgc2l6ZV90IGxvY2F0aW9uID0gbVJlYWRJbmRleCArIGtNYXJrZXJTaXplOworICAgICAgYm9vbCBpc0NTRCA9IGlzQ1NETWFya2VyKGxvY2F0aW9uKTsKKyAgICAgIGxvY2F0aW9uICs9IGtNYXJrZXJTdWZmaXhTaXplOworICAgICAgdWludDhfdCogZnJhbWVQdHIgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPigmbURhdGFbbG9jYXRpb25dKTsKKyAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBieXRlc1JlbWFpbmluZyAtIGxvY2F0aW9uOworICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgaWYgKG1GcmFtZUxpc3QuZW1wdHkoKSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgfSBlbHNlIGlmIChpc0NTRCkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUc7CisgICAgICB9CisgICAgICBtRnJhbWVMaXN0LmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfdHVwbGUoZnJhbWVQdHIsIGZyYW1lU2l6ZSwgZmxhZ3MpKTsKKyAgICAgIGJ5dGVzUmVtYWluaW5nIC09IChmcmFtZVNpemUgKyBrTWFya2VyU2l6ZSArIGtNYXJrZXJTdWZmaXhTaXplKTsKKyAgICAgIC0tbVJlYWRJbmRleDsKKyAgICB9CisgIH0KKyAgaWYgKG1GcmFtZUxpc3QuZW1wdHkoKSkgeworICAgIC8qKgorICAgICAqIFNjZW5hcmlvIHdoZXJlIGlucHV0IGRhdGEgZG9lcyBub3QgY29udGFpbiB0aGUgY3VzdG9tIGZyYW1lIG1hcmtlcnMuCisgICAgICogSGVuY2UgZmVlZCB0aGUgZW50aXJlIGRhdGEgYXMgc2luZ2xlIGZyYW1lLgorICAgICAqLworICAgIG1GcmFtZUxpc3QuZW1wbGFjZV9iYWNrKAorICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoY29uc3RfY2FzdDx1aW50OF90Kj4obURhdGEpLCAwLCBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSk7CisgICAgbUZyYW1lTGlzdC5lbXBsYWNlX2JhY2soCisgICAgICAgIHN0ZDo6bWFrZV90dXBsZShjb25zdF9jYXN0PHVpbnQ4X3QqPihtRGF0YSksIG1TaXplLCBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpKTsKKyAgfQorfQorCitGcmFtZURhdGEgQ29kZWMyRnV6emVyOjpCdWZmZXJTb3VyY2U6OmdldEZyYW1lKCkgeworICBGcmFtZURhdGEgZnJhbWUgPSBtRnJhbWVMaXN0LmJhY2soKTsKKyAgbUZyYW1lTGlzdC5wb3BfYmFjaygpOworICByZXR1cm4gZnJhbWU7Cit9CisKK3ZvaWQgQ29kZWMyRnV6emVyOjpoYW5kbGVXb3JrRG9uZShzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAodm9pZCljb21wOworICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0l0ZW1zKSB7CisgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpKSB7CisgICAgICBpZiAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICE9IEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpIHsKKyAgICAgICAgbUVvcyA9ICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIHsKKyAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobVF1ZXVlTG9jayk7CisgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICBtUXVldWVDb25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgICAgICB9CisgICAgICAgIGlmIChtRW9zKSB7CisgICAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IHdhaXRGb3JEZWNvZGVDb21wbGV0ZShtRGVjb2RlQ29tcGxldGVNdXRleCk7CisgICAgICAgICAgfQorICAgICAgICAgIG1Db25kaXRpb25hbFZhcmlhYmxlLm5vdGlmeV9vbmUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCitib29sIENvZGVjMkZ1enplcjo6aW5pdERlY29kZXIoKSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8QzJTdHJpbmcsIEMyQ29tcG9uZW50RmFjdG9yeTo6Q3JlYXRlQ29kZWMyRmFjdG9yeUZ1bmMsCisgICAgICAgIEMyQ29tcG9uZW50RmFjdG9yeTo6RGVzdHJveUNvZGVjMkZhY3RvcnlGdW5jPj4gY29kZWMyRmFjdG9yeUZ1bmM7CisKKyAgY29kZWMyRmFjdG9yeUZ1bmMuZW1wbGFjZV9iYWNrKAorICAgICAgc3RkOjptYWtlX3R1cGxlKEMyQ09NUE9ORU5UTkFNRSwgJkNyZWF0ZUNvZGVjMkZhY3RvcnksICZEZXN0cm95Q29kZWMyRmFjdG9yeSkpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBjb21wb25lbnRTdG9yZSA9IEdldFRlc3RDb21wb25lbnRTdG9yZShjb2RlYzJGYWN0b3J5RnVuYyk7CisgIGlmICghY29tcG9uZW50U3RvcmUpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gYWxsb2NhdG9yU3RvcmUgPSBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgIGlmICghYWxsb2NhdG9yU3RvcmUpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLCAmbUxpbmVhckFsbG9jYXRvcik7CisgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBtTGluZWFyUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KG1MaW5lYXJBbGxvY2F0b3IsICsrbUJsb2NrUG9vbElkKTsKKyAgaWYgKCFtTGluZWFyUG9vbCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtOdW1iZXJPZkMyV29ya0l0ZW1zOyArK2kpIHsKKyAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgfQorCisgIHN0YXR1cyA9IGNvbXBvbmVudFN0b3JlLT5jcmVhdGVDb21wb25lbnQoQzJDT01QT05FTlROQU1FLCAmbUNvbXBvbmVudCk7CisgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGF0dXMgPSBjb21wb25lbnRTdG9yZS0+Y3JlYXRlSW50ZXJmYWNlKEMyQ09NUE9ORU5UTkFNRSwgJm1JbnRlcmZhY2UpOworICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQzJDb21wb25lbnRLaW5kU2V0dGluZyBraW5kOworICBDMkNvbXBvbmVudERvbWFpblNldHRpbmcgZG9tYWluOworICBzdGF0dXMgPSBtSW50ZXJmYWNlLT5xdWVyeV92Yih7JmtpbmQsICZkb21haW59LCB7fSwgQzJfTUFZX0JMT0NLLCBudWxscHRyKTsKKyAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjb25maWdQYXJhbXM7CisgIGlmIChkb21haW4udmFsdWUgPT0gRE9NQUlOX1ZJREVPKSB7CisgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0IGlucHV0U2l6ZSgwdSwga1dpZHRoT2ZWaWRlbywga0hlaWdodE9mVmlkZW8pOworICAgIGNvbmZpZ1BhcmFtcy5wdXNoX2JhY2soJmlucHV0U2l6ZSk7CisgIH0gZWxzZSBpZiAoZG9tYWluLnZhbHVlID09IERPTUFJTl9BVURJTykgeworICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygwdSwga1NhbXBsaW5nUmF0ZU9mQXVkaW8pOworICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIGtDaGFubmVsc09mQXVkaW8pOworICAgIGNvbmZpZ1BhcmFtcy5wdXNoX2JhY2soJnNhbXBsZVJhdGVJbmZvKTsKKyAgICBjb25maWdQYXJhbXMucHVzaF9iYWNrKCZjaGFubmVsQ291bnRJbmZvKTsKKyAgfQorCisgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgIFt0aGlzXShzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgaGFuZGxlV29ya0RvbmUoY29tcCwgd29ya0l0ZW1zKTsKKyAgICAgIH0pKTsKKyAgaWYgKCFtTGlzdGVuZXIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGF0dXMgPSBtQ29tcG9uZW50LT5zZXRMaXN0ZW5lcl92YihtTGlzdGVuZXIsIEMyX0RPTlRfQkxPQ0spOworICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICBjb21wb25lbnRTdG9yZS0+Y29uZmlnX3NtKGNvbmZpZ1BhcmFtcywgJmZhaWx1cmVzKTsKKyAgaWYgKGZhaWx1cmVzLnNpemUoKSAhPSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RhdHVzID0gbUNvbXBvbmVudC0+c3RhcnQoKTsKKyAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENvZGVjMkZ1enplcjo6ZGVJbml0RGVjb2RlcigpIHsKKyAgbUNvbXBvbmVudC0+c3RvcCgpOworICBtQ29tcG9uZW50LT5yZXNldCgpOworICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgIG1Db21wb25lbnQgPSBudWxscHRyOworfQorCit2b2lkIENvZGVjMkZ1enplcjo6ZGVjb2RlRnJhbWVzKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIG1CdWZmZXJTb3VyY2UgPSBuZXcgQnVmZmVyU291cmNlKGRhdGEsIHNpemUpOworICBpZiAoIW1CdWZmZXJTb3VyY2UpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbUJ1ZmZlclNvdXJjZS0+cGFyc2UoKTsKKyAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQzJfT0s7CisgIHNpemVfdCBudW1GcmFtZXMgPSAwOworICB3aGlsZSAoIW1CdWZmZXJTb3VyY2UtPmlzRW9zKCkpIHsKKyAgICB1aW50OF90KiBmcmFtZSA9IG51bGxwdHI7CisgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IDA7CisgICAgRnJhbWVEYXRhIGZyYW1lRGF0YSA9IG1CdWZmZXJTb3VyY2UtPmdldEZyYW1lKCk7CisgICAgZnJhbWUgPSBzdGQ6OmdldDwwPihmcmFtZURhdGEpOworICAgIGZyYW1lU2l6ZSA9IHN0ZDo6Z2V0PDE+KGZyYW1lRGF0YSk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIHsKKyAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtUXVldWVMb2NrKTsKKyAgICAgIGlmIChtV29ya1F1ZXVlLmVtcHR5KCkpIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2Zvcihsb2NrLCBrQzJGdXp6ZXJUaW1lT3V0KTsKKyAgICAgIGlmICghbVdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KXN0ZDo6Z2V0PDI+KGZyYW1lRGF0YSk7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSAwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9ICsrbnVtRnJhbWVzOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBpbnQzMl90IGFsaWduZWRTaXplID0gQzJGVVpaRVJfQUxJR04oZnJhbWVTaXplLCBQQUdFX1NJWkUpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIHN0YXR1cyA9IG1MaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICBhbGlnbmVkU2l6ZSwge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9LCAmYmxvY2spOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0sgfHwgYmxvY2sgPT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtZW1jcHkodmlldy5iYXNlKCksIGZyYW1lLCBmcmFtZVNpemUpOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG5ldyBMaW5lYXJCdWZmZXIoYmxvY2ssIGZyYW1lU2l6ZSkpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBzdGF0dXMgPSBtQ29tcG9uZW50LT5xdWV1ZV9uYigmaXRlbXMpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiB3YWl0Rm9yRGVjb2RlQ29tcGxldGUobURlY29kZUNvbXBsZXRlTXV0ZXgpOworICBtQ29uZGl0aW9uYWxWYXJpYWJsZS53YWl0X2Zvcih3YWl0Rm9yRGVjb2RlQ29tcGxldGUsIGtDMkZ1enplclRpbWVPdXQsIFt0aGlzXSB7IHJldHVybiBtRW9zOyB9KTsKKyAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBjMmZsdXNoZWRXb3JrczsKKyAgbUNvbXBvbmVudC0+Zmx1c2hfc20oQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmMyZmx1c2hlZFdvcmtzKTsKKyAgZGVsZXRlIG1CdWZmZXJTb3VyY2U7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKHNpemUgPCAxKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQ29kZWMyRnV6emVyKiBjb2RlYyA9IG5ldyBDb2RlYzJGdXp6ZXIoKTsKKyAgaWYgKCFjb2RlYykgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChjb2RlYy0+aW5pdERlY29kZXIoKSkgeworICAgIGNvZGVjLT5kZWNvZGVGcmFtZXMoZGF0YSwgc2l6ZSk7CisgIH0KKyAgZGVsZXRlIGNvZGVjOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9mdXp6ZXIvQzJGdXp6ZXIuaCBiL21lZGlhL2NvZGVjMi9mdXp6ZXIvQzJGdXp6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWFjODFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2Z1enplci9DMkZ1enplci5oCkBAIC0wLDAgKzEsMTI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKyNpZm5kZWYgX19DMkZVWlpFUl9IX18KKyNkZWZpbmUgX19DMkZVWlpFUl9IX18KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOworCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCk7CitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgQzJGVVpaRVJfQUxJR04oX3N6LCBfYWxpZ24pICgoKF9zeikgKyAoKF9hbGlnbiktMSkpICYgfigoX2FsaWduKS0xKSkKKworY29uc3RleHByIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMga0MyRnV6emVyVGltZU91dCA9IDUwMDBtczsKK2NvbnN0ZXhwciBpbnQzMl90IGtOdW1iZXJPZkMyV29ya0l0ZW1zID0gODsKK2NvbnN0ZXhwciB1aW50MzJfdCBrV2lkdGhPZlZpZGVvID0gMzg0MDsKK2NvbnN0ZXhwciB1aW50MzJfdCBrSGVpZ2h0T2ZWaWRlbyA9IDIxNjA7Citjb25zdGV4cHIgdWludDMyX3Qga1NhbXBsaW5nUmF0ZU9mQXVkaW8gPSA0ODAwMDsKK2NvbnN0ZXhwciB1aW50MzJfdCBrQ2hhbm5lbHNPZkF1ZGlvID0gODsKKwordHlwZWRlZiBzdGQ6OnR1cGxlPHVpbnQ4X3QqLCBzaXplX3QsIHVpbnQzMl90PiBGcmFtZURhdGE7CisKK2NsYXNzIENvZGVjMkZ1enplciB7CisgcHVibGljOgorICBDb2RlYzJGdXp6ZXIoKSA9IGRlZmF1bHQ7CisgIH5Db2RlYzJGdXp6ZXIoKSB7IGRlSW5pdERlY29kZXIoKTsgfQorICBib29sIGluaXREZWNvZGVyKCk7CisgIHZvaWQgZGVJbml0RGVjb2RlcigpOworICB2b2lkIGRlY29kZUZyYW1lcyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgdm9pZCBoYW5kbGVXb3JrRG9uZShzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcyk7CisKKyBwcml2YXRlOgorICBjbGFzcyBCdWZmZXJTb3VyY2UgeworICAgcHVibGljOgorICAgIEJ1ZmZlclNvdXJjZShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgOiBtRGF0YShkYXRhKSwgbVNpemUoc2l6ZSkgeworICAgICAgbVJlYWRJbmRleCA9IChzaXplIDw9IGtNYXJrZXJTaXplKSA/IDAgOiAoc2l6ZSAtIGtNYXJrZXJTaXplKTsKKyAgICB9CisgICAgfkJ1ZmZlclNvdXJjZSgpIHsKKyAgICAgIG1EYXRhID0gbnVsbHB0cjsKKyAgICAgIG1TaXplID0gMDsKKyAgICAgIG1SZWFkSW5kZXggPSAwOworICAgICAgbUZyYW1lTGlzdC5jbGVhcigpOworICAgIH0KKyAgICBib29sIGlzRW9zKCkgeyByZXR1cm4gbUZyYW1lTGlzdC5lbXB0eSgpOyB9CisgICAgdm9pZCBwYXJzZSgpOworICAgIEZyYW1lRGF0YSBnZXRGcmFtZSgpOworCisgICBwcml2YXRlOgorICAgIGJvb2wgaXNNYXJrZXIoKSB7CisgICAgICBpZiAoKGtNYXJrZXJTaXplIDwgbVNpemUpICYmIChtUmVhZEluZGV4IDwgbVNpemUgLSBrTWFya2VyU2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIChtZW1jbXAoJm1EYXRhW21SZWFkSW5kZXhdLCBrTWFya2VyLCBrTWFya2VyU2l6ZSkgPT0gMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgYm9vbCBpc0NTRE1hcmtlcihzaXplX3QgcG9zaXRpb24pIHsKKyAgICAgIGlmICgoa01hcmtlclN1ZmZpeFNpemUgPCBtU2l6ZSkgJiYgKHBvc2l0aW9uIDwgbVNpemUgLSBrTWFya2VyU3VmZml4U2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIChtZW1jbXAoJm1EYXRhW3Bvc2l0aW9uXSwga0NzZE1hcmtlclN1ZmZpeCwga01hcmtlclN1ZmZpeFNpemUpID09IDApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIGJvb2wgc2VhcmNoRm9yTWFya2VyKCk7CisKKyAgICBjb25zdCB1aW50OF90KiBtRGF0YSA9IG51bGxwdHI7CisgICAgc2l6ZV90IG1TaXplID0gMDsKKyAgICBzaXplX3QgbVJlYWRJbmRleCA9IDA7CisgICAgc3RkOjp2ZWN0b3I8RnJhbWVEYXRhPiBtRnJhbWVMaXN0OworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrTWFya2VyW10gPSAiX01BUksiOworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQ3NkTWFya2VyU3VmZml4W10gPSAiX0hfIjsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0ZyYW1lTWFya2VyU3VmZml4W10gPSAiX0ZfIjsKKyAgICAvLyBBbGwgbWFya2VycyBzaG91bGQgYmUgNSBieXRlcyBsb25nICggc2l6ZW9mICdfTUFSSycgd2hpY2ggaXMgNSkKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWFya2VyU2l6ZSA9IChzaXplb2Yoa01hcmtlcikgLSAxKTsKKyAgICAvLyBBbGwgbWFya2VyIHR5cGVzIHNob3VsZCBiZSAzIGJ5dGVzIGxvbmcgKCdfSF8nLCAnX0ZfJykKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWFya2VyU3VmZml4U2l6ZSA9IDM7CisgIH07CisKKyAgQnVmZmVyU291cmNlKiBtQnVmZmVyU291cmNlOworICBib29sIG1Fb3MgPSBmYWxzZTsKKyAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbElkOworCisgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUxpbmVhclBvb2w7CisgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUxpbmVhckFsbG9jYXRvcjsKKyAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1Db21wb25lbnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gbUludGVyZmFjZTsKKyAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVdvcmtRdWV1ZTsKKyAgc3RkOjptdXRleCBtRGVjb2RlQ29tcGxldGVNdXRleDsKKyAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNvbmRpdGlvbmFsVmFyaWFibGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIF9fQzJGVVpaRVJfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9BbmRyb2lkLmJwCmluZGV4IDNiNzMzNTAuLjAwOGRlZjggMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsMTQgQEAKIC8vIERPIE5PVCBERVBFTkQgT04gVEhJUyBESVJFQ1RMWQogLy8gdXNlIGxpYmNvZGVjMi1oaWRsLWNsaWVudC1kZWZhdWx0cyBpbnN0ZWFkCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfaGlkbF9jbGllbnRAMS4wIiwKIApAQCAtODAsNiArODksNyBAQAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJjb2RlYzIiLAogICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY29kZWMyX2hpZGxfcGx1Z2luX3N0dWIiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmxvZyIsCkBAIC05Myw5ICsxMDMsMTcgQEAKICAgICAgICAgdmVuZG9yOiB7CiAgICAgICAgICAgICBleGNsdWRlX3NoYXJlZF9saWJzOiBbCiAgICAgICAgICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlcl9ub3ZuZGsiLAorICAgICAgICAgICAgICAgICJsaWJjb2RlYzJfaGlkbF9wbHVnaW5fc3R1YiIsCiAgICAgICAgICAgICBdLAogICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycXVldWVfaGVscGVyIiwKKyAgICAgICAgICAgICAgICAibGliY29kZWMyX2hpZGxfcGx1Z2luIiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgICAgIGFwZXg6IHsKKyAgICAgICAgICAgIGV4Y2x1ZGVfc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgICAgICAgICAibGliY29kZWMyX2hpZGxfcGx1Z2luIiwKKyAgICAgICAgICAgICAgICAibGliY29kZWMyX2hpZGxfcGx1Z2luX3N0dWIiLAogICAgICAgICAgICAgXSwKICAgICAgICAgfSwKICAgICB9LApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50LmNwcAppbmRleCA4YTg0NjAxLi4wODJjNWUzIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50LmNwcApAQCAtMjIsNiArMjIsMTAgQEAKICNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KICNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvSW5wdXRCdWZmZXJNYW5hZ2VyLmg+CiAKKyNpZm5kZWYgX19BTkRST0lEX0FQRVhfXworI2luY2x1ZGUgPEZpbHRlcldyYXBwZXIuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8aGlkbC9IaWRsQmluZGVyU3VwcG9ydC5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogCkBAIC0zOTAsMTAgKzM5NCwxNyBAQAogICAgICAgICB1aW50MzJfdCBhbGxvY2F0b3JJZCwKICAgICAgICAgY3JlYXRlQmxvY2tQb29sX2NiIF9oaWRsX2NiKSB7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBibG9ja1Bvb2w7CisjaWZkZWYgX19BTkRST0lEX0FQRVhfXwogICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IENyZWF0ZUNvZGVjMkJsb2NrUG9vbCgKICAgICAgICAgICAgIHN0YXRpY19jYXN0PEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdD4oYWxsb2NhdG9ySWQpLAogICAgICAgICAgICAgbUNvbXBvbmVudCwKICAgICAgICAgICAgICZibG9ja1Bvb2wpOworI2Vsc2UKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBDb21wb25lbnRTdG9yZTo6R2V0RmlsdGVyV3JhcHBlcigpLT5jcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OmlkX3Q+KGFsbG9jYXRvcklkKSwKKyAgICAgICAgICAgIG1Db21wb25lbnQsCisgICAgICAgICAgICAmYmxvY2tQb29sKTsKKyNlbmRpZgogICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKICAgICAgICAgYmxvY2tQb29sID0gbnVsbHB0cjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50U3RvcmUuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudFN0b3JlLmNwcAppbmRleCA5YjlkNDQ5Li4xYzBkNWIwIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50U3RvcmUuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKQEAgLTM1LDYgKzM1LDE0IEBACiAjaW5jbHVkZSA8b3N0cmVhbT4KICNpbmNsdWRlIDxzc3RyZWFtPgogCisjaWZuZGVmIF9fQU5EUk9JRF9BUEVYX18KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9wbHVnaW4vRmlsdGVyUGx1Z2luLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPERlZmF1bHRGaWx0ZXJQbHVnaW4uaD4KKyNpbmNsdWRlIDxGaWx0ZXJXcmFwcGVyLmg+CisjZW5kaWYKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBtZWRpYSB7CkBAIC0xNzYsNiArMTg0LDE2IEBACiAgICAgcmV0dXJuIG1QYXJhbWV0ZXJDYWNoZTsKIH0KIAorI2lmbmRlZiBfX0FORFJPSURfQVBFWF9fCisvLyBzdGF0aWMKK3N0ZDo6c2hhcmVkX3B0cjxGaWx0ZXJXcmFwcGVyPiBDb21wb25lbnRTdG9yZTo6R2V0RmlsdGVyV3JhcHBlcigpIHsKKyAgICBjb25zdGV4cHIgY29uc3QgY2hhciBrUGx1Z2luUGF0aFtdID0gImxpYmMyZmlsdGVycGx1Z2luLnNvIjsKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEZpbHRlcldyYXBwZXI+IHdyYXBwZXIgPSBGaWx0ZXJXcmFwcGVyOjpDcmVhdGUoCisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPERlZmF1bHRGaWx0ZXJQbHVnaW4+KGtQbHVnaW5QYXRoKSk7CisgICAgcmV0dXJuIHdyYXBwZXI7Cit9CisjZW5kaWYKKwogLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbXBvbmVudFN0b3JlCiBSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUNvbXBvbmVudCgKICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCkBAIC0xODksNiArMjA3LDkgQEAKICAgICAgICAgICAgIG1TdG9yZS0+Y3JlYXRlQ29tcG9uZW50KG5hbWUsICZjMmNvbXBvbmVudCkpOwogCiAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisjaWZuZGVmIF9fQU5EUk9JRF9BUEVYX18KKyAgICAgICAgYzJjb21wb25lbnQgPSBHZXRGaWx0ZXJXcmFwcGVyKCktPm1heWJlV3JhcENvbXBvbmVudChjMmNvbXBvbmVudCk7CisjZW5kaWYKICAgICAgICAgb25JbnRlcmZhY2VMb2FkZWQoYzJjb21wb25lbnQtPmludGYoKSk7CiAgICAgICAgIGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnQoYzJjb21wb25lbnQsIGxpc3RlbmVyLCB0aGlzLCBwb29sKTsKICAgICAgICAgaWYgKCFjb21wb25lbnQpIHsKQEAgLTIxNCw4ICsyMzUsMTIgQEAKICAgICAgICAgY3JlYXRlSW50ZXJmYWNlX2NiIF9oaWRsX2NiKSB7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBjMmludGVyZmFjZTsKICAgICBjMl9zdGF0dXNfdCByZXMgPSBtU3RvcmUtPmNyZWF0ZUludGVyZmFjZShuYW1lLCAmYzJpbnRlcmZhY2UpOworCiAgICAgc3A8SUNvbXBvbmVudEludGVyZmFjZT4gaW50ZXJmYWNlOwogICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyNpZm5kZWYgX19BTkRST0lEX0FQRVhfXworICAgICAgICBjMmludGVyZmFjZSA9IEdldEZpbHRlcldyYXBwZXIoKS0+bWF5YmVXcmFwSW50ZXJmYWNlKGMyaW50ZXJmYWNlKTsKKyNlbmRpZgogICAgICAgICBvbkludGVyZmFjZUxvYWRlZChjMmludGVyZmFjZSk7CiAgICAgICAgIGludGVyZmFjZSA9IG5ldyBDb21wb25lbnRJbnRlcmZhY2UoYzJpbnRlcmZhY2UsIG1QYXJhbWV0ZXJDYWNoZSk7CiAgICAgfQpAQCAtNDU4LDcgKzQ4Myw2IEBACiAgICAgcmV0dXJuIFZvaWQoKTsKIH0KIAotCiB9ICAvLyBuYW1lc3BhY2UgdXRpbHMKIH0gIC8vIG5hbWVzcGFjZSBWMV8wCiB9ICAvLyBuYW1lc3BhY2UgYzIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmgKaW5kZXggZmU3ZDA0OC4uMjdlMmEwNSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmgKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmgKQEAgLTM3LDYgKzM3LDggQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK2NsYXNzIEZpbHRlcldyYXBwZXI7CisKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgbWVkaWEgewogbmFtZXNwYWNlIGMyIHsKQEAgLTc0LDYgKzc2LDggQEAKICAgICAgKi8KICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1ldGVyQ2FjaGU+IGdldFBhcmFtZXRlckNhY2hlKCkgY29uc3Q7CiAKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEZpbHRlcldyYXBwZXI+IEdldEZpbHRlcldyYXBwZXIoKTsKKwogICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnRTdG9yZS4KICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjcmVhdGVDb21wb25lbnQoCiAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy90eXBlcy5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvdHlwZXMuY3BwCmluZGV4IGM3M2NiNTIuLjcyZjdjNDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy90eXBlcy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL3R5cGVzLmNwcApAQCAtODk1LDEzICs4OTUsMTIgQEAKICAgICAgICAgQnVmZmVyUG9vbFNlbmRlciogYnVmZmVyUG9vbFNlbmRlciwKICAgICAgICAgc3RkOjpsaXN0PEJhc2VCbG9jaz4qIGJhc2VCbG9ja3MsCiAgICAgICAgIHN0ZDo6bWFwPGNvbnN0IHZvaWQqLCB1aW50MzJfdD4qIGJhc2VCbG9ja0luZGljZXMpIHsKLSAgICAvLyBUT0RPOiBDMkluZm9CdWZmZXIgaXMgbm90IGltcGxlbWVudGVkLgotICAgICh2b2lkKWQ7Ci0gICAgKHZvaWQpczsKLSAgICAodm9pZClidWZmZXJQb29sU2VuZGVyOwotICAgICh2b2lkKWJhc2VCbG9ja3M7Ci0gICAgKHZvaWQpYmFzZUJsb2NrSW5kaWNlczsKLSAgICBMT0coSU5GTykgPDwgIkluZm9CdWZmZXIgbm90IGltcGxlbWVudGVkLiI7CisgICAgZC0+aW5kZXggPSBzdGF0aWNfY2FzdDxQYXJhbUluZGV4PihzLmluZGV4KCkpOworICAgIEJ1ZmZlciYgZEJ1ZmZlciA9IGQtPmJ1ZmZlcjsKKyAgICBpZiAoIW9iamNweSgmZEJ1ZmZlciwgcy5kYXRhKCksIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJJbmZvQnVmZmVyOjpkYXRhIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtOTQzLDE0ICs5NDIsOSBAQAogCiAgICAgZC0+aW5mb0J1ZmZlcnMucmVzaXplKHMuaW5mb0J1ZmZlcnMuc2l6ZSgpKTsKICAgICBpID0gMDsKLSAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkluZm9CdWZmZXI+JiBzSW5mb0J1ZmZlciA6IHMuaW5mb0J1ZmZlcnMpIHsKKyAgICBmb3IgKGNvbnN0IEMySW5mb0J1ZmZlciYgc0luZm9CdWZmZXIgOiBzLmluZm9CdWZmZXJzKSB7CiAgICAgICAgIEluZm9CdWZmZXImIGRJbmZvQnVmZmVyID0gZC0+aW5mb0J1ZmZlcnNbaSsrXTsKLSAgICAgICAgaWYgKCFzSW5mb0J1ZmZlcikgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTnVsbCBDMkZyYW1lRGF0YTo6aW5mb0J1ZmZlcnNbIgotICAgICAgICAgICAgICAgICAgICAgICA8PCBpIC0gMSA8PCAiXS4iOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghb2JqY3B5KCZkSW5mb0J1ZmZlciwgKnNJbmZvQnVmZmVyLAorICAgICAgICBpZiAoIW9iamNweSgmZEluZm9CdWZmZXIsIHNJbmZvQnVmZmVyLAogICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpKSB7CiAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyRnJhbWVEYXRhOjppbmZvQnVmZmVyc1siCiAgICAgICAgICAgICAgICAgICAgICAgIDw8IGkgLSAxIDw8ICJdLiI7CkBAIC0xMzQxLDYgKzEzMzUsNjggQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorLy8gSW5mb0J1ZmZlciAtPiBDMkluZm9CdWZmZXIKK2Jvb2wgb2JqY3B5KHN0ZDo6dmVjdG9yPEMySW5mb0J1ZmZlcj4gKmQsIGNvbnN0IEluZm9CdWZmZXImIHMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQmFzZUJsb2NrPiYgYmFzZUJsb2NrcykgeworCisgICAgLy8gQ3VycmVudGx5LCBhIG5vbi1udWxsIEMySW5mb0J1ZmVyIG11c3QgY29udGFpbiBleGFjdGx5IDEgYmxvY2suCisgICAgaWYgKHMuYnVmZmVyLmJsb2Nrcy5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHMuYnVmZmVyLmJsb2Nrcy5zaXplKCkgIT0gMSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEluZm9CdWZmZXI6OkJ1ZmZlciAiCisgICAgICAgICAgICAgICAgICAgICAgIkN1cnJlbnRseSwgYSBDMkluZm9CdWZmZXIgbXVzdCBjb250YWluIGV4YWN0bHkgMSBibG9jay4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgQmxvY2sgJnNCbG9jayA9IHMuYnVmZmVyLmJsb2Nrc1swXTsKKyAgICBpZiAoc0Jsb2NrLmluZGV4ID49IGJhc2VCbG9ja3Muc2l6ZSgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgSW5mb0J1ZmZlcjo6QnVmZmVyOjpibG9ja3NbMF0uaW5kZXg6ICIKKyAgICAgICAgICAgICAgICAgICAgICAiQXJyYXkgaW5kZXggb3V0IG9mIHJhbmdlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3QgQzJCYXNlQmxvY2sgJmJhc2VCbG9jayA9IGJhc2VCbG9ja3Nbc0Jsb2NrLmluZGV4XTsKKworICAgIC8vIFBhcnNlIG1ldGEuCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHNCbG9ja01ldGE7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnNCbG9ja01ldGEsIHNCbG9jay5tZXRhKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEluZm9CdWZmZXI6OkJ1ZmZlcjo6YmxvY2tzWzBdLm1ldGEuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIENvcHkgZmVuY2UuCisgICAgQzJGZW5jZSBkRmVuY2U7CisgICAgaWYgKCFvYmpjcHkoJmRGZW5jZSwgc0Jsb2NrLmZlbmNlKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEluZm9CdWZmZXI6OkJ1ZmZlcjo6YmxvY2tzWzBdLmZlbmNlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDb25zdHJ1Y3QgYSBibG9jay4KKyAgICBzd2l0Y2ggKGJhc2VCbG9jay50eXBlKSB7CisgICAgY2FzZSBDMkJhc2VCbG9jazo6TElORUFSOgorICAgICAgICBpZiAoc0Jsb2NrTWV0YS5zaXplKCkgPT0gMSAmJiBzQmxvY2tNZXRhWzBdICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgIHNCbG9ja01ldGFbMF0tPnNpemUoKSA9PSBzaXplb2YoQzJIaWRsX1JhbmdlSW5mbykpIHsKKyAgICAgICAgICAgIEMySGlkbF9SYW5nZUluZm8gKnJhbmdlSW5mbyA9CisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QzJIaWRsX1JhbmdlSW5mbyo+KHNCbG9ja01ldGFbMF0pOworICAgICAgICAgICAgZC0+ZW1wbGFjZV9iYWNrKEMySW5mb0J1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBzLmluZGV4LAorICAgICAgICAgICAgICAgICAgICBiYXNlQmxvY2subGluZWFyLT5zaGFyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZUluZm8tPm9mZnNldCwgcmFuZ2VJbmZvLT5sZW5ndGgsIGRGZW5jZSkpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgTWV0YSBmb3IgQzJCYXNlQmxvY2s6OkxpbmVhciBJbmZvQnVmZmVyLiI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJCYXNlQmxvY2s6OkdSQVBISUM6CisgICAgICAgIC8vIEl0J3Mgbm90IHVzZWQgbm93CisgICAgICAgIExPRyhFUlJPUikgPDwgIk5vbi1Vc2VkIEMyQmFzZUJsb2NrOjp0eXBlIGZvciBJbmZvQnVmZmVyLiI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJCYXNlQmxvY2s6OnR5cGUgZm9yIEluZm9CdWZmZXIuIjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCiAvLyBGcmFtZURhdGEgLT4gQzJGcmFtZURhdGEKIGJvb2wgb2JqY3B5KEMyRnJhbWVEYXRhKiBkLCBjb25zdCBGcmFtZURhdGEmIHMsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQmFzZUJsb2NrPiYgYmFzZUJsb2NrcykgewpAQCAtMTM3NSw4ICsxNDMxLDE4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcyBvbmNlIEMySW5mb0J1ZmZlciBoYXMgY29uc3RydWN0b3JzLgogICAgIGQtPmluZm9CdWZmZXJzLmNsZWFyKCk7CisgICAgaWYgKHMuaW5mb0J1ZmZlcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgLy8gSW5mb0J1ZmZlciBpcyBvcHRpb25hbAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZC0+aW5mb0J1ZmZlcnMucmVzZXJ2ZShzLmluZm9CdWZmZXJzLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBJbmZvQnVmZmVyICZzSW5mb0J1ZmZlcjogcy5pbmZvQnVmZmVycykgeworICAgICAgICBpZiAoIW9iamNweSgmKGQtPmluZm9CdWZmZXJzKSwgc0luZm9CdWZmZXIsIGJhc2VCbG9ja3MpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEZyYW1lZGF0YTo6aW5mb0J1ZmZlcnMuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy8uY2xhbmctZm9ybWF0IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy8uY2xhbmctZm9ybWF0Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjEzNjI3OWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzLy5jbGFuZy1mb3JtYXQKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vLi4vLi4vLi4vLi4vYnVpbGQvc29vbmcvc2NyaXB0cy9zeXN0ZW0tY2xhbmctZm9ybWF0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvQW5kcm9pZC5icAppbmRleCA1ZWE0ODI1Li4wYWUxMzNjIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTUgQEAKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLy8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBmaWxlZ3JvdXAgewogICAgIG5hbWU6ICJtZWRpYV9jMl92MV9hdWRpb19kZWNvZGVfcmVzIiwKICAgICBwYXRoOiAicmVzIiwKQEAgLTEwOCw0ICsxMTcsNCBAQAogICAgIHNyY3M6IFsKICAgICAgICAgInJlcy9iYmJfMzUyeDI4OF80MjBwXzMwZnBzXzMyZnJhbWVzLnl1diIsCiAgICAgXSwKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9BbmRyb2lkLmJwCmluZGV4IDAxNGNiZTkuLjYyNGFhZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QiLAogICAgIHN0ZW06ICJ2dHNfbWVkaWFfYzJfdjFfMF9hdWRpb19kZWNfdGVzdCIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcAppbmRleCAzYTQ3YWU5Li41OGE1NjhlIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdC5jcHAKQEAgLTIzLDI0ICsyMyw0NyBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogCi0jaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KICNpbmNsdWRlIDxDMkJ1ZmZlci5oPgogI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgogI2luY2x1ZGUgPEMyQ29uZmlnLmg+CiAjaW5jbHVkZSA8QzJEZWJ1Zy5oPgogI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgogCi11c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKLQogI2luY2x1ZGUgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCIKK3VzaW5nIERlY29kZVRlc3RQYXJhbWV0ZXJzID0gc3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpbnQzMl90LCBib29sPjsKK3N0YXRpYyBzdGQ6OnZlY3RvcjxEZWNvZGVUZXN0UGFyYW1ldGVycz4gZ0RlY29kZVRlc3RQYXJhbWV0ZXJzOwogCi1zdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+Ci0gICAgICAgIGtEZWNvZGVUZXN0UGFyYW1ldGVyczsKK3VzaW5nIENzZEZsdXNoVGVzdFBhcmFtZXRlcnMgPSBzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgYm9vbD47CitzdGF0aWMgc3RkOjp2ZWN0b3I8Q3NkRmx1c2hUZXN0UGFyYW1ldGVycz4gZ0NzZEZsdXNoVGVzdFBhcmFtZXRlcnM7CiAKLXN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiBrQ3NkRmx1c2hUZXN0UGFyYW1ldGVyczsKK3N0cnVjdCBDb21wVG9VUkwgeworICAgIHN0ZDo6c3RyaW5nIG1pbWU7CisgICAgc3RkOjpzdHJpbmcgbVVSTDsKKyAgICBzdGQ6OnN0cmluZyBpbmZvOworfTsKIAotLy8gUmVzb3VyY2UgZGlyZWN0b3J5Ci1zdGF0aWMgc3RkOjpzdHJpbmcgc1Jlc291cmNlRGlyID0gIiI7CitzdGQ6OnZlY3RvcjxDb21wVG9VUkw+IGdDb21wVG9VUkwgPSB7CisgICAgICAgIHsibXA0YS1sYXRtIiwgImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMiLCAiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8ifSwKKyAgICAgICAgeyJtcDRhLWxhdG0iLCAiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYyIsCisgICAgICAgICAiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8ifSwKKyAgICAgICAgeyJhdWRpby9tcGVnIiwgImJiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5tcDMiLCAiYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6LmluZm8ifSwKKyAgICAgICAgeyJhdWRpby9tcGVnIiwgImJiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5tcDMiLAorICAgICAgICAgImJiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvIn0sCisgICAgICAgIHsiM2dwcCIsICJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iIiwgInNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouaW5mbyJ9LAorICAgICAgICB7IjNncHAiLCAic2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5hbXJuYiIsCisgICAgICAgICAic2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoel9tdWx0aV9mcmFtZS5pbmZvIn0sCisgICAgICAgIHsiYW1yLXdiIiwgImJiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouYW1yd2IiLCAiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5pbmZvIn0sCisgICAgICAgIHsiYW1yLXdiIiwgImJiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouYW1yd2IiLAorICAgICAgICAgImJiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyJ9LAorICAgICAgICB7InZvcmJpcyIsICJiYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoudm9yYmlzIiwKKyAgICAgICAgICJiYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyJ9LAorICAgICAgICB7Im9wdXMiLCAiYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5vcHVzIiwgImJiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyJ9LAorICAgICAgICB7Imc3MTEtYWxhdyIsICJiYmJfZzcxMWFsYXdfMWNoXzhraHoucmF3IiwgImJiYl9nNzExYWxhd18xY2hfOGtoei5pbmZvIn0sCisgICAgICAgIHsiZzcxMS1tbGF3IiwgImJiYl9nNzExbXVsYXdfMWNoXzhraHoucmF3IiwgImJiYl9nNzExbXVsYXdfMWNoXzhraHouaW5mbyJ9LAorICAgICAgICB7ImdzbSIsICJiYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5yYXciLCAiYmJiX2dzbV8xY2hfOGtoel8xM2ticHMuaW5mbyJ9LAorICAgICAgICB7InJhdyIsICJiYmJfcmF3XzFjaF84a2h6X3MzMmxlLnJhdyIsICJiYmJfcmF3XzFjaF84a2h6X3MzMmxlLmluZm8ifSwKKyAgICAgICAgeyJmbGFjIiwgImJiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouZmxhYyIsICJiYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmluZm8ifSwKK307CiAKIGNsYXNzIExpbmVhckJ1ZmZlciA6IHB1YmxpYyBDMkJ1ZmZlciB7CiAgIHB1YmxpYzoKQEAgLTc2LDMzICs5OSwxNyBAQAogICAgICAgICBtTGluZWFyUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KG1MaW5lYXJBbGxvY2F0b3IsIG1CbG9ja1Bvb2xJZCsrKTsKICAgICAgICAgQVNTRVJUX05FKG1MaW5lYXJQb29sLCBudWxscHRyKTsKIAotICAgICAgICBtQ29tcE5hbWUgPSB1bmtub3duX2NvbXA7Ci0gICAgICAgIHN0cnVjdCBTdHJpbmdUb05hbWUgewotICAgICAgICAgICAgY29uc3QgY2hhciogTmFtZTsKLSAgICAgICAgICAgIHN0YW5kYXJkQ29tcCBDb21wTmFtZTsKLSAgICAgICAgfTsKLSAgICAgICAgY29uc3QgU3RyaW5nVG9OYW1lIGtTdHJpbmdUb05hbWVbXSA9IHsKLSAgICAgICAgICAgICAgICB7InhhYWMiLCB4YWFjfSwgICAgICAgICAgeyJtcDMiLCBtcDN9LCB7ImFtcm5iIiwgYW1ybmJ9LAotICAgICAgICAgICAgICAgIHsiYW1yd2IiLCBhbXJ3Yn0sICAgICAgICB7ImFhYyIsIGFhY30sIHsidm9yYmlzIiwgdm9yYmlzfSwKLSAgICAgICAgICAgICAgICB7Im9wdXMiLCBvcHVzfSwgICAgICAgICAgeyJwY20iLCBwY219LCB7Imc3MTEuYWxhdyIsIGc3MTFhbGF3fSwKLSAgICAgICAgICAgICAgICB7Imc3MTEubWxhdyIsIGc3MTFtbGF3fSwgeyJnc20iLCBnc219LCB7InJhdyIsIHJhd30sCi0gICAgICAgICAgICAgICAgeyJmbGFjIiwgZmxhY30sCi0gICAgICAgIH07Ci0gICAgICAgIGNvbnN0IHNpemVfdCBrTnVtU3RyaW5nVG9OYW1lID0gc2l6ZW9mKGtTdHJpbmdUb05hbWUpIC8gc2l6ZW9mKGtTdHJpbmdUb05hbWVbMF0pOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgICAgIG1Db21wb25lbnQtPnF1ZXJ5KHt9LCB7QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEV9LCBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgICAgIEFTU0VSVF9HVChxdWVyaWVkLnNpemUoKSwgMCk7CiAKLSAgICAgICAgLy8gRmluZCB0aGUgY29tcG9uZW50IHR5cGUKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU3RyaW5nVG9OYW1lOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChzdHJjYXNlc3RyKG1Db21wb25lbnROYW1lLmNfc3RyKCksIGtTdHJpbmdUb05hbWVbaV0uTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBtQ29tcE5hbWUgPSBrU3RyaW5nVG9OYW1lW2ldLkNvbXBOYW1lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIG1NaW1lID0gKChDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dCopcXVlcmllZFswXS5nZXQoKSktPm0udmFsdWU7CisKICAgICAgICAgbUVvcyA9IGZhbHNlOwogICAgICAgICBtRnJhbWVzUmVjZWl2ZWQgPSAwOwogICAgICAgICBtVGltZXN0YW1wVXMgPSAwdTsKICAgICAgICAgbVdvcmtSZXN1bHQgPSBDMl9PSzsKICAgICAgICAgbVRpbWVzdGFtcERldlRlc3QgPSBmYWxzZTsKLSAgICAgICAgaWYgKG1Db21wTmFtZSA9PSB1bmtub3duX2NvbXApIG1EaXNhYmxlVGVzdCA9IHRydWU7CiAgICAgICAgIGlmIChtRGlzYWJsZVRlc3QpIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgRGlzYWJsZWQgXG4iOwogICAgIH0KIApAQCAtMTE5LDYgKzEyNiw4IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGVUaW1lc3RhbXBMaXN0KGludDMyX3QqIGJpdFN0cmVhbUluZm8pOwogCisgICAgdm9pZCBHZXRVUkxGb3JDb21wb25lbnQoY2hhciogbVVSTCwgY2hhciogaW5mbywgc2l6ZV90IHN0cmVhbUluZGV4ID0gMCk7CisKICAgICBzdHJ1Y3Qgb3V0cHV0TWV0YURhdGEgewogICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXBVczsKICAgICAgICAgdWludDMyX3QgcmFuZ2VMZW5ndGg7CkBAIC0xNTgsMjkgKzE2NywxMiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgZW51bSBzdGFuZGFyZENvbXAgewotICAgICAgICB4YWFjLAotICAgICAgICBtcDMsCi0gICAgICAgIGFtcm5iLAotICAgICAgICBhbXJ3YiwKLSAgICAgICAgYWFjLAotICAgICAgICB2b3JiaXMsCi0gICAgICAgIG9wdXMsCi0gICAgICAgIHBjbSwKLSAgICAgICAgZzcxMWFsYXcsCi0gICAgICAgIGc3MTFtbGF3LAotICAgICAgICBnc20sCi0gICAgICAgIHJhdywKLSAgICAgICAgZmxhYywKLSAgICAgICAgdW5rbm93bl9jb21wLAotICAgIH07Ci0KKyAgICBzdGQ6OnN0cmluZyBtTWltZTsKICAgICBzdGQ6OnN0cmluZyBtSW5zdGFuY2VOYW1lOwogICAgIHN0ZDo6c3RyaW5nIG1Db21wb25lbnROYW1lOwogICAgIGJvb2wgbUVvczsKICAgICBib29sIG1EaXNhYmxlVGVzdDsKICAgICBib29sIG1UaW1lc3RhbXBEZXZUZXN0OwotICAgIHN0YW5kYXJkQ29tcCBtQ29tcE5hbWU7CiAKICAgICBpbnQzMl90IG1Xb3JrUmVzdWx0OwogICAgIHVpbnQ2NF90IG1UaW1lc3RhbXBVczsKQEAgLTIwNyw5ICsxOTksOCBAQAogICAgIH0KIH07CiAKLWNsYXNzIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QKLSAgICA6IHB1YmxpYyBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0QmFzZSwKLSAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IHsKK2NsYXNzIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QgOiBwdWJsaWMgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPFRlc3RQYXJhbWV0ZXJzPiB7CiAgICAgdm9pZCBnZXRQYXJhbXMoKSB7CiAgICAgICAgIG1JbnN0YW5jZU5hbWUgPSBzdGQ6OmdldDwwPihHZXRQYXJhbSgpKTsKICAgICAgICAgbUNvbXBvbmVudE5hbWUgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKQEAgLTIxNyw3ICsyMDgsNyBAQAogfTsKIAogdm9pZCB2YWxpZGF0ZUNvbXBvbmVudChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wTmFtZSwgYm9vbCYgZGlzYWJsZVRlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgZGlzYWJsZVRlc3QpIHsKICAgICAvLyBWYWxpZGF0ZSBpdHMgYSBDMiBDb21wb25lbnQKICAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiYzIiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgewogICAgICAgICBBTE9HRSgiTm90IGEgYzIgY29tcG9uZW50Iik7CkBAIC0yNDQsMTMgKzIzNSw2IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICAvLyBWYWxpZGF0ZXMgY29tcG9uZW50IG5hbWUKLSAgICBpZiAoY29tcE5hbWUgPT0gQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6dW5rbm93bl9jb21wKSB7Ci0gICAgICAgIEFMT0dFKCJDb21wb25lbnQgSW5WYWxpZCIpOwotICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CiAgICAgQUxPR1YoIkNvbXBvbmVudCBWYWxpZCIpOwogfQogCkBAIC0yNzEsNyArMjU1LDcgQEAKIC8vIHBhcnNpbmcgdGhlIGhlYWRlciBvZiBlbGVtZW50YXJ5IHN0cmVhbS4gQ2xpZW50IG5lZWRzIHRvIGNvbGxlY3QgdGhpcwogLy8gaW5mb3JtYXRpb24gYW5kIHJlY29uZmlndXJlCiB2b2lkIGdldElucHV0Q2hhbm5lbEluZm8oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wTmFtZSwgaW50MzJfdCogYml0U3RyZWFtSW5mbykgeworICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1pbWUsIGludDMyX3QqIGJpdFN0cmVhbUluZm8pIHsKICAgICAvLyBxdWVyeSBuU2FtcGxlUmF0ZSBhbmQgbkNoYW5uZWxzCiAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PEMyUGFyYW06OkluZGV4PiBpbmRpY2VzewogICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLApAQCAtMjg4LDg5ICsyNzIsMjkgQEAKICAgICAgICAgICAgIEMyUGFyYW0qIHBhcmFtID0gaW5QYXJhbXNbaV0uZ2V0KCk7CiAgICAgICAgICAgICBiaXRTdHJlYW1JbmZvW2ldID0gKihpbnQzMl90KikoKHVpbnQ4X3QqKXBhcmFtICsgb2Zmc2V0KTsKICAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKGNvbXBOYW1lKSB7Ci0gICAgICAgICAgICBjYXNlIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OmFtcm5iOiB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX0VRKGJpdFN0cmVhbUluZm9bMF0sIDgwMDApOwotICAgICAgICAgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzFdLCAxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6YW1yd2I6IHsKLSAgICAgICAgICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1swXSwgMTYwMDApOwotICAgICAgICAgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzFdLCAxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6Z3NtOiB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX0VRKGJpdFN0cmVhbUluZm9bMF0sIDgwMDApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKG1pbWUuZmluZCgiM2dwcCIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1swXSwgODAwMCk7CisgICAgICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1sxXSwgMSk7CisgICAgICAgIH0gZWxzZSBpZiAobWltZS5maW5kKCJhbXItd2IiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgQVNTRVJUX0VRKGJpdFN0cmVhbUluZm9bMF0sIDE2MDAwKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzFdLCAxKTsKKyAgICAgICAgfSBlbHNlIGlmIChtaW1lLmZpbmQoImdzbSIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1swXSwgODAwMCk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLS8vIG51bWJlciBvZiBlbGVtZW50YXJ5IHN0cmVhbXMgcGVyIGNvbXBvbmVudAotI2RlZmluZSBTVFJFQU1fQ09VTlQgMgotCiAvLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBhbmQgbWV0YWRhdGEgZm9yIGNvbXBvbmVudCB0ZXN0aW5nCi12b2lkIEdldFVSTEZvckNvbXBvbmVudChDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcCwgY2hhciogbVVSTCwgY2hhciogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzdHJlYW1JbmRleCA9IDApIHsKLSAgICBzdHJ1Y3QgQ29tcFRvVVJMIHsKLSAgICAgICAgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXA7Ci0gICAgICAgIGNvbnN0IGNoYXIgbVVSTFtTVFJFQU1fQ09VTlRdWzUxMl07Ci0gICAgICAgIGNvbnN0IGNoYXIgaW5mb1tTVFJFQU1fQ09VTlRdWzUxMl07Ci0gICAgfTsKLSAgICBBU1NFUlRfVFJVRShzdHJlYW1JbmRleCA8IFNUUkVBTV9DT1VOVCk7Ci0KLSAgICBzdGF0aWMgY29uc3QgQ29tcFRvVVJMIGtDb21wVG9VUkxbXSA9IHsKLSAgICAgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnhhYWMsCi0gICAgICAgICAgICAgeyJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjIiwgImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMifSwKLSAgICAgICAgICAgICB7ImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIiwKLSAgICAgICAgICAgICAgImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvIn19LAotICAgICAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6bXAzLAotICAgICAgICAgICAgIHsiYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMyIsICJiYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzIn0sCi0gICAgICAgICAgICAgeyJiYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHouaW5mbyIsCi0gICAgICAgICAgICAgICJiYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyJ9fSwKLSAgICAgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFhYywKLSAgICAgICAgICAgICB7ImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMiLCAiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYyJ9LAotICAgICAgICAgICAgIHsiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLAotICAgICAgICAgICAgICAiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8ifX0sCi0gICAgICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphbXJuYiwKLSAgICAgICAgICAgICB7InNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouYW1ybmIiLCAic2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5hbXJuYiJ9LAotICAgICAgICAgICAgIHsic2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5pbmZvIiwKLSAgICAgICAgICAgICAgInNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyJ9fSwKLSAgICAgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFtcndiLAotICAgICAgICAgICAgIHsiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YiIsICJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiIn0sCi0gICAgICAgICAgICAgeyJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmluZm8iLAotICAgICAgICAgICAgICAiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoel9tdWx0aV9mcmFtZS5pbmZvIn19LAotICAgICAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6dm9yYmlzLAotICAgICAgICAgICAgIHsiYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LnZvcmJpcyIsICIifSwKLSAgICAgICAgICAgICB7ImJiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIiwgIiJ9fSwKLSAgICAgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Om9wdXMsCi0gICAgICAgICAgICAgeyJiYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm9wdXMiLCAiIn0sCi0gICAgICAgICAgICAgeyJiYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLCAiIn19LAotICAgICAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6ZzcxMWFsYXcsCi0gICAgICAgICAgICAgeyJiYmJfZzcxMWFsYXdfMWNoXzhraHoucmF3IiwgIiJ9LAotICAgICAgICAgICAgIHsiYmJiX2c3MTFhbGF3XzFjaF84a2h6LmluZm8iLCAiIn19LAotICAgICAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6ZzcxMW1sYXcsCi0gICAgICAgICAgICAgeyJiYmJfZzcxMW11bGF3XzFjaF84a2h6LnJhdyIsICIifSwKLSAgICAgICAgICAgICB7ImJiYl9nNzExbXVsYXdfMWNoXzhraHouaW5mbyIsICIifX0sCi0gICAgICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpnc20sCi0gICAgICAgICAgICAgeyJiYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5yYXciLCAiIn0sCi0gICAgICAgICAgICAgeyJiYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5pbmZvIiwgIiJ9fSwKLSAgICAgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnJhdywKLSAgICAgICAgICAgICB7ImJiYl9yYXdfMWNoXzhraHpfczMybGUucmF3IiwgIiJ9LAotICAgICAgICAgICAgIHsiYmJiX3Jhd18xY2hfOGtoel9zMzJsZS5pbmZvIiwgIiJ9fSwKLSAgICAgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmZsYWMsCi0gICAgICAgICAgICAgeyJiYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmZsYWMiLCAiIn0sCi0gICAgICAgICAgICAgeyJiYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmluZm8iLCAiIn19LAotICAgIH07Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihrQ29tcFRvVVJMKSAvIHNpemVvZihrQ29tcFRvVVJMWzBdKTsgKytpKSB7Ci0gICAgICAgIGlmIChrQ29tcFRvVVJMW2ldLmNvbXAgPT0gY29tcCkgewotICAgICAgICAgICAgc3RyY2F0KG1VUkwsIGtDb21wVG9VUkxbaV0ubVVSTFtzdHJlYW1JbmRleF0pOwotICAgICAgICAgICAgc3RyY2F0KGluZm8sIGtDb21wVG9VUkxbaV0uaW5mb1tzdHJlYW1JbmRleF0pOwotICAgICAgICAgICAgcmV0dXJuOwordm9pZCBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0QmFzZTo6R2V0VVJMRm9yQ29tcG9uZW50KGNoYXIqIG1VUkwsIGNoYXIqIGluZm8sIHNpemVfdCBzdHJlYW1JbmRleCkgeworICAgIGludCBzdHJlYW1Db3VudCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBnQ29tcFRvVVJMLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChtTWltZS5maW5kKGdDb21wVG9VUkxbaV0ubWltZSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW1Db3VudCA9PSBzdHJlYW1JbmRleCkgeworICAgICAgICAgICAgICAgIHN0cmNhdChtVVJMLCBnQ29tcFRvVVJMW2ldLm1VUkwuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgc3RyY2F0KGluZm8sIGdDb21wVG9VUkxbaV0uaW5mby5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW1Db3VudCsrOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtNDYxLDcgKzM4NSw3IEBACiB2b2lkIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3RCYXNlOjp2YWxpZGF0ZVRpbWVzdGFtcExpc3QoaW50MzJfdCogYml0U3RyZWFtSW5mbykgewogICAgIHVpbnQzMl90IHNhbXBsZXNSZWNlaXZlZCA9IDA7CiAgICAgLy8gVXBkYXRlIFNhbXBsZVJhdGUgYW5kIENoYW5uZWxDb3VudAotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtTWltZSwgYml0U3RyZWFtSW5mbykpOwogICAgIGludDMyX3QgblNhbXBsZVJhdGUgPSBiaXRTdHJlYW1JbmZvWzBdOwogICAgIGludDMyX3QgbkNoYW5uZWxzID0gYml0U3RyZWFtSW5mb1sxXTsKICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBpdEluID0gbVRpbWVzdGFtcFVzbGlzdC5iZWdpbigpOwpAQCAtNDg2LDcgKzQxMCw3IEBACiBURVNUX1AoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgdmFsaWRhdGVDb21wTmFtZSkgewogICAgIGlmIChtRGlzYWJsZVRlc3QpIEdURVNUX1NLSVAoKSA8PCAiVGVzdCBpcyBkaXNhYmxlZCI7CiAgICAgQUxPR1YoIkNoZWNrcyBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGlzIGEgdmFsaWQgYXVkaW8gY29tcG9uZW50Iik7Ci0gICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbUNvbXBOYW1lLCBtRGlzYWJsZVRlc3QpOworICAgIHZhbGlkYXRlQ29tcG9uZW50KG1Db21wb25lbnQsIG1EaXNhYmxlVGVzdCk7CiAgICAgQVNTRVJUX0VRKG1EaXNhYmxlVGVzdCwgZmFsc2UpOwogfQogCkBAIC00OTUsMTUgKzQxOSwxMyBAQAogICAgIGlmIChtRGlzYWJsZVRlc3QpIEdURVNUX1NLSVAoKSA8PCAiVGVzdCBpcyBkaXNhYmxlZCI7CiAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKICAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07Ci0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1NaW1lLCBiaXRTdHJlYW1JbmZvKSk7CiAgICAgc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKTsKICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CiB9CiAKLWNsYXNzIENvZGVjMkF1ZGlvRGVjRGVjb2RlVGVzdAotICAgIDogcHVibGljIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3RCYXNlLAotICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPAotICAgICAgICAgICAgICBzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4geworY2xhc3MgQ29kZWMyQXVkaW9EZWNEZWNvZGVUZXN0IDogcHVibGljIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3RCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPERlY29kZVRlc3RQYXJhbWV0ZXJzPiB7CiAgICAgdm9pZCBnZXRQYXJhbXMoKSB7CiAgICAgICAgIG1JbnN0YW5jZU5hbWUgPSBzdGQ6OmdldDwwPihHZXRQYXJhbSgpKTsKICAgICAgICAgbUNvbXBvbmVudE5hbWUgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKQEAgLTUxNCwxNiArNDM2LDE1IEBACiAgICAgZGVzY3JpcHRpb24oIkRlY29kZXMgaW5wdXQgZmlsZSIpOwogICAgIGlmIChtRGlzYWJsZVRlc3QpIEdURVNUX1NLSVAoKSA8PCAiVGVzdCBpcyBkaXNhYmxlZCI7CiAKLSAgICB1aW50MzJfdCBzdHJlYW1JbmRleCA9IHN0ZDo6c3RvaShzdGQ6OmdldDwyPihHZXRQYXJhbSgpKSk7Ci0gICAgOwotICAgIGJvb2wgc2lnbmFsRU9TID0gIXN0ZDo6Z2V0PDM+KEdldFBhcmFtKCkpLmNvbXBhcmUoInRydWUiKTsKKyAgICB1aW50MzJfdCBzdHJlYW1JbmRleCA9IHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpOworICAgIGJvb2wgc2lnbmFsRU9TID0gc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSk7CiAgICAgbVRpbWVzdGFtcERldlRlc3QgPSB0cnVlOwogICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CiAgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKIAogICAgIHN0cmNweShtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7CiAgICAgc3RyY3B5KGluZm8sIHNSZXNvdXJjZURpci5jX3N0cigpKTsKLSAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvLCBzdHJlYW1JbmRleCk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1VUkwsIGluZm8sIHN0cmVhbUluZGV4KTsKICAgICBpZiAoIXN0cmNtcChtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSkpIHsKICAgICAgICAgQUxPR1YoIkVNUFRZIElOUFVUIHNSZXNvdXJjZURpci5jX3N0cigpICVzIG1VUkwgICVzICIsIHNSZXNvdXJjZURpci5jX3N0cigpLCBtVVJMKTsKICAgICAgICAgcmV0dXJuOwpAQCAtNTM2LDExICs0NTcsMTEgQEAKICAgICBtRnJhbWVzUmVjZWl2ZWQgPSAwOwogICAgIG1UaW1lc3RhbXBVcyA9IDA7CiAgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzJdID0gezB9OwotICAgIGlmIChtQ29tcE5hbWUgPT0gcmF3KSB7CisgICAgaWYgKG1NaW1lLmZpbmQoInJhdyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CiAgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOwogICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKICAgICB9IGVsc2UgewotICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1Db21wTmFtZSwgYml0U3RyZWFtSW5mbykpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1NaW1lLCBiaXRTdHJlYW1JbmZvKSk7CiAgICAgfQogICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKSkgewogICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOwpAQCAtNTkxLDE3ICs1MTIsMTcgQEAKIAogICAgIHN0cmNweShtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7CiAgICAgc3RyY3B5KGluZm8sIHNSZXNvdXJjZURpci5jX3N0cigpKTsKLSAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobVVSTCwgaW5mbyk7CiAKICAgICBpbnQzMl90IG51bUNzZHMgPSBwb3B1bGF0ZUluZm9WZWN0b3IoaW5mbywgJkluZm8sIG1UaW1lc3RhbXBEZXZUZXN0LCAmbVRpbWVzdGFtcFVzbGlzdCk7CiAgICAgQVNTRVJUX0dFKG51bUNzZHMsIDApIDw8ICJFcnJvciBpbiBwYXJzaW5nIGlucHV0IGluZm8gZmlsZTogIiA8PCBpbmZvOwogCiAgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzJdID0gezB9OwotICAgIGlmIChtQ29tcE5hbWUgPT0gcmF3KSB7CisgICAgaWYgKG1NaW1lLmZpbmQoInJhdyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CiAgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOwogICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKICAgICB9IGVsc2UgewotICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1Db21wTmFtZSwgYml0U3RyZWFtSW5mbykpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1NaW1lLCBiaXRTdHJlYW1JbmZvKSk7CiAgICAgfQogICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKSkgewogICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOwpAQCAtNjgzLDE3ICs2MDQsMTcgQEAKIAogICAgIHN0cmNweShtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7CiAgICAgc3RyY3B5KGluZm8sIHNSZXNvdXJjZURpci5jX3N0cigpKTsKLSAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobVVSTCwgaW5mbyk7CiAKICAgICBpbnQzMl90IG51bUNzZHMgPSBwb3B1bGF0ZUluZm9WZWN0b3IoaW5mbywgJkluZm8sIG1UaW1lc3RhbXBEZXZUZXN0LCAmbVRpbWVzdGFtcFVzbGlzdCk7CiAgICAgQVNTRVJUX0dFKG51bUNzZHMsIDApIDw8ICJFcnJvciBpbiBwYXJzaW5nIGlucHV0IGluZm8gZmlsZTogIiA8PCBpbmZvOwogCiAgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzJdID0gezB9OwotICAgIGlmIChtQ29tcE5hbWUgPT0gcmF3KSB7CisgICAgaWYgKG1NaW1lLmZpbmQoInJhdyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CiAgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOwogICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKICAgICB9IGVsc2UgewotICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1Db21wTmFtZSwgYml0U3RyZWFtSW5mbykpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1NaW1lLCBiaXRTdHJlYW1JbmZvKSk7CiAgICAgfQogICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKSkgewogICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOwpAQCAtNzY4LDcgKzY4OSw3IEBACiAKICAgICBzdHJjcHkobVVSTCwgc1Jlc291cmNlRGlyLmNfc3RyKCkpOwogICAgIHN0cmNweShpbmZvLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7Ci0gICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1VUkwsIGluZm8pOwogCiAgICAgZWxlSW5mby5vcGVuKGluZm8pOwogICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIC0gZmlsZSBub3QgZm91bmQiOwpAQCAtNzk4LDExICs3MTksMTEgQEAKICAgICB9CiAgICAgZWxlSW5mby5jbG9zZSgpOwogICAgIGludDMyX3QgYml0U3RyZWFtSW5mb1syXSA9IHswfTsKLSAgICBpZiAobUNvbXBOYW1lID09IHJhdykgeworICAgIGlmIChtTWltZS5maW5kKCJyYXciKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewogICAgICAgICBiaXRTdHJlYW1JbmZvWzBdID0gODAwMDsKICAgICAgICAgYml0U3RyZWFtSW5mb1sxXSA9IDE7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtTWltZSwgYml0U3RyZWFtSW5mbykpOwogICAgIH0KICAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obUNvbXBvbmVudCwgYml0U3RyZWFtSW5mbykpIHsKICAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKQEAgLTgzMyw5ICs3NTQsOCBAQAogICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKIH0KIAotY2xhc3MgQ29kZWMyQXVkaW9EZWNDc2RJbnB1dFRlc3RzCi0gICAgOiBwdWJsaWMgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdEJhc2UsCi0gICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4geworY2xhc3MgQ29kZWMyQXVkaW9EZWNDc2RJbnB1dFRlc3RzIDogcHVibGljIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3RCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPENzZEZsdXNoVGVzdFBhcmFtZXRlcnM+IHsKICAgICB2b2lkIGdldFBhcmFtcygpIHsKICAgICAgICAgbUluc3RhbmNlTmFtZSA9IHN0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpOwogICAgICAgICBtQ29tcG9uZW50TmFtZSA9IHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOwpAQCAtODUzLDcgKzc3Myw3IEBACiAKICAgICBzdHJjcHkobVVSTCwgc1Jlc291cmNlRGlyLmNfc3RyKCkpOwogICAgIHN0cmNweShpbmZvLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7Ci0gICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1VUkwsIGluZm8pOwogICAgIGlmICghc3RyY21wKG1VUkwsIHNSZXNvdXJjZURpci5jX3N0cigpKSkgewogICAgICAgICBBTE9HVigiRU1QVFkgSU5QVVQgc1Jlc291cmNlRGlyLmNfc3RyKCkgJXMgbVVSTCAgJXMgIiwgc1Jlc291cmNlRGlyLmNfc3RyKCksIG1VUkwpOwogICAgICAgICByZXR1cm47CkBAIC04NjQsMTEgKzc4NCwxMSBAQAogICAgIEFTU0VSVF9HRShudW1Dc2RzLCAwKSA8PCAiRXJyb3IgaW4gcGFyc2luZyBpbnB1dCBpbmZvIGZpbGUiOwogCiAgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzJdID0gezB9OwotICAgIGlmIChtQ29tcE5hbWUgPT0gcmF3KSB7CisgICAgaWYgKG1NaW1lLmZpbmQoInJhdyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CiAgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOwogICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKICAgICB9IGVsc2UgewotICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1Db21wTmFtZSwgYml0U3RyZWFtSW5mbykpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1NaW1lLCBiaXRTdHJlYW1JbmZvKSk7CiAgICAgfQogICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKSkgewogICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOwpAQCAtODgxLDcgKzgwMSw3IEBACiAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOwogCiAgICAgYm9vbCBzaWduYWxFT1MgPSBmYWxzZTsKLSAgICBib29sIGZsdXNoQ3NkID0gIXN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpLmNvbXBhcmUoInRydWUiKTsKKyAgICBib29sIGZsdXNoQ3NkID0gc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSk7CiAgICAgQUxPR1YoInNlbmRpbmcgJWQgY3NkIGRhdGEgIiwgbnVtQ3Nkcyk7CiAgICAgaW50IGZyYW1lc1RvRGVjb2RlID0gbnVtQ3NkczsKICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKQEAgLTkzNiw0NSArODU2LDM3IEBACiAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOwogfQogCi1JTlNUQU5USUFURV9URVNUX1NVSVRFX1AoUGVySW5zdGFuY2UsIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIHRlc3Rpbmc6OlZhbHVlc0luKGtUZXN0UGFyYW1ldGVycyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlByaW50SW5zdGFuY2VUdXBsZU5hbWVUb1N0cmluZzw+KTsKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChQZXJJbnN0YW5jZSwgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgdGVzdGluZzo6VmFsdWVzSW4oZ1Rlc3RQYXJhbWV0ZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEluc3RhbmNlVHVwbGVOYW1lVG9TdHJpbmc8Pik7CiAKIC8vIERlY29kZVRlc3Qgd2l0aCBTdHJlYW1JbmRleCBhbmQgRU9TIC8gTm8gRU9TCiBJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoU3RyZWFtSW5kZXhBbmRFT1MsIENvZGVjMkF1ZGlvRGVjRGVjb2RlVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpWYWx1ZXNJbihrRGVjb2RlVGVzdFBhcmFtZXRlcnMpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpQcmludEluc3RhbmNlVHVwbGVOYW1lVG9TdHJpbmc8Pik7CisgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6VmFsdWVzSW4oZ0RlY29kZVRlc3RQYXJhbWV0ZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEluc3RhbmNlVHVwbGVOYW1lVG9TdHJpbmc8Pik7CiAKIElOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChDc2RJbnB1dHMsIENvZGVjMkF1ZGlvRGVjQ3NkSW5wdXRUZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpWYWx1ZXNJbihrQ3NkRmx1c2hUZXN0UGFyYW1ldGVycyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlByaW50SW5zdGFuY2VUdXBsZU5hbWVUb1N0cmluZzw+KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpWYWx1ZXNJbihnQ3NkRmx1c2hUZXN0UGFyYW1ldGVycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRJbnN0YW5jZVR1cGxlTmFtZVRvU3RyaW5nPD4pOwogCiB9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICAgIGtUZXN0UGFyYW1ldGVycyA9IGdldFRlc3RQYXJhbWV0ZXJzKEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8sIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIpOwotICAgIGZvciAoYXV0byBwYXJhbXMgOiBrVGVzdFBhcmFtZXRlcnMpIHsKLSAgICAgICAga0RlY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgIjAiLCAiZmFsc2UiKSk7Ci0gICAgICAgIGtEZWNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksICIwIiwgInRydWUiKSk7Ci0gICAgICAgIGtEZWNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksICIxIiwgImZhbHNlIikpOwotICAgICAgICBrRGVjb2RlVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCAiMSIsICJ0cnVlIikpOworICAgIHBhcnNlQXJncyhhcmdjLCBhcmd2KTsKKyAgICBnVGVzdFBhcmFtZXRlcnMgPSBnZXRUZXN0UGFyYW1ldGVycyhDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLCBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSKTsKKyAgICBmb3IgKGF1dG8gcGFyYW1zIDogZ1Rlc3RQYXJhbWV0ZXJzKSB7CisgICAgICAgIGdEZWNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIDAsIGZhbHNlKSk7CisgICAgICAgIGdEZWNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIDAsIHRydWUpKTsKKyAgICAgICAgZ0RlY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgMSwgZmFsc2UpKTsKKyAgICAgICAgZ0RlY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgMSwgdHJ1ZSkpOwogCi0gICAgICAgIGtDc2RGbHVzaFRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgInRydWUiKSk7Ci0gICAgICAgIGtDc2RGbHVzaFRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgImZhbHNlIikpOwotICAgIH0KLQotICAgIC8vIFNldCB0aGUgcmVzb3VyY2UgZGlyZWN0b3J5IGJhc2VkIG9uIGNvbW1hbmQgbGluZSBhcmdzLgotICAgIC8vIFRlc3Qgd2lsbCBmYWlsIHRvIHNldCB1cCBpZiB0aGUgYXJndW1lbnQgaXMgbm90IHNldC4KLSAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgewotICAgICAgICBpZiAoc3RyY21wKGFyZ3ZbaV0sICItUCIpID09IDAgJiYgaSA8IGFyZ2MgLSAxKSB7Ci0gICAgICAgICAgICBzUmVzb3VyY2VEaXIgPSBhcmd2W2kgKyAxXTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgICAgIGdDc2RGbHVzaFRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgdHJ1ZSkpOworICAgICAgICBnQ3NkRmx1c2hUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIGZhbHNlKSk7CiAgICAgfQogCiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRBdWRpb0VuY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0QXVkaW9FbmNUZXN0LmNwcAppbmRleCBlM2E0ZjY4Li45MmI1M2EwIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRBdWRpb0VuY1Rlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdC5jcHAKQEAgLTI0LDIyICsyNCwxNyBAQAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxmc3RyZWFtPgogCi0jaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KICNpbmNsdWRlIDxDMkJ1ZmZlci5oPgogI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgogI2luY2x1ZGUgPEMyQ29uZmlnLmg+CiAjaW5jbHVkZSA8QzJEZWJ1Zy5oPgogI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgogCi11c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKLQogI2luY2x1ZGUgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCIKIAotc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PgotICAgICAgICBrRW5jb2RlVGVzdFBhcmFtZXRlcnM7Cit1c2luZyBFbmNvZGVUZXN0UGFyYW1ldGVycyA9IHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCBib29sLCBpbnQzMl90PjsKIAotLy8gUmVzb3VyY2UgZGlyZWN0b3J5Ci1zdGF0aWMgc3RkOjpzdHJpbmcgc1Jlc291cmNlRGlyID0gIiI7CitzdGF0aWMgc3RkOjp2ZWN0b3I8RW5jb2RlVGVzdFBhcmFtZXRlcnM+IGdFbmNvZGVUZXN0UGFyYW1ldGVyczsKIAogY2xhc3MgTGluZWFyQnVmZmVyIDogcHVibGljIEMyQnVmZmVyIHsKICAgcHVibGljOgpAQCAtNDcsNiArNDIsOCBAQAogICAgICAgICA6IEMyQnVmZmVyKHtibG9jay0+c2hhcmUoYmxvY2stPm9mZnNldCgpLCBibG9jay0+c2l6ZSgpLCA6OkMyRmVuY2UoKSl9KSB7fQogfTsKIAorY29uc3RleHByIHVpbnQzMl90IGtNYXhTYW1wbGVzUGVyRnJhbWUgPSAyNTY7CisKIG5hbWVzcGFjZSB7CiAKIGNsYXNzIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3RCYXNlIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CkBAIC03NSwzMCArNzIsMTcgQEAKICAgICAgICAgbUxpbmVhclBvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihtTGluZWFyQWxsb2NhdG9yLCBtQmxvY2tQb29sSWQrKyk7CiAgICAgICAgIEFTU0VSVF9ORShtTGluZWFyUG9vbCwgbnVsbHB0cik7CiAKLSAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOwotICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7Ci0gICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7Ci0gICAgICAgIH07Ci0gICAgICAgIGNvbnN0IFN0cmluZ1RvTmFtZSBrU3RyaW5nVG9OYW1lW10gPSB7Ci0gICAgICAgICAgICAgICAgeyJhYWMiLCBhYWN9LCB7ImZsYWMiLCBmbGFjfSwgeyJvcHVzIiwgb3B1c30sIHsiYW1ybmIiLCBhbXJuYn0sIHsiYW1yd2IiLCBhbXJ3Yn0sCi0gICAgICAgIH07Ci0gICAgICAgIGNvbnN0IHNpemVfdCBrTnVtU3RyaW5nVG9OYW1lID0gc2l6ZW9mKGtTdHJpbmdUb05hbWUpIC8gc2l6ZW9mKGtTdHJpbmdUb05hbWVbMF0pOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgICAgIG1Db21wb25lbnQtPnF1ZXJ5KHt9LCB7QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0OjpQQVJBTV9UWVBFfSwgQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1ZXJpZWQpOworICAgICAgICBBU1NFUlRfR1QocXVlcmllZC5zaXplKCksIDApOwogCi0gICAgICAgIC8vIEZpbmQgdGhlIGNvbXBvbmVudCB0eXBlCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVN0cmluZ1RvTmFtZTsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoc3RyY2FzZXN0cihtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBrU3RyaW5nVG9OYW1lW2ldLk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgbUNvbXBOYW1lID0ga1N0cmluZ1RvTmFtZVtpXS5Db21wTmFtZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBtTWltZSA9ICgoQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0KilxdWVyaWVkWzBdLmdldCgpKS0+bS52YWx1ZTsKICAgICAgICAgbUVvcyA9IGZhbHNlOwogICAgICAgICBtQ3NkID0gZmFsc2U7CiAgICAgICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CiAgICAgICAgIG1Xb3JrUmVzdWx0ID0gQzJfT0s7CiAgICAgICAgIG1PdXRwdXRTaXplID0gMHU7Ci0gICAgICAgIGlmIChtQ29tcE5hbWUgPT0gdW5rbm93bl9jb21wKSBtRGlzYWJsZVRlc3QgPSB0cnVlOwotICAgICAgICBpZiAobURpc2FibGVUZXN0KSBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKICAgICAgICAgZ2V0SW5wdXRNYXhCdWZTaXplKCk7CiAgICAgfQogCkBAIC0xMTMsNiArOTcsOCBAQAogICAgIC8vIEdldCB0aGUgdGVzdCBwYXJhbWV0ZXJzIGZyb20gR2V0UGFyYW0gY2FsbC4KICAgICB2aXJ0dWFsIHZvaWQgZ2V0UGFyYW1zKCkge30KIAorICAgIHZvaWQgR2V0VVJMRm9yQ29tcG9uZW50KGNoYXIqIG1VUkwsIGludDMyX3QgY2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUpOworCiAgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCiAgICAgdm9pZCBoYW5kbGVXb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKICAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtJdGVtcykgewpAQCAtMTMzLDIxICsxMTksMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBlbnVtIHN0YW5kYXJkQ29tcCB7Ci0gICAgICAgIGFhYywKLSAgICAgICAgZmxhYywKLSAgICAgICAgb3B1cywKLSAgICAgICAgYW1ybmIsCi0gICAgICAgIGFtcndiLAotICAgICAgICB1bmtub3duX2NvbXAsCi0gICAgfTsKIAorICAgIHN0ZDo6c3RyaW5nIG1NaW1lOwogICAgIHN0ZDo6c3RyaW5nIG1JbnN0YW5jZU5hbWU7CiAgICAgc3RkOjpzdHJpbmcgbUNvbXBvbmVudE5hbWU7CiAgICAgYm9vbCBtRW9zOwogICAgIGJvb2wgbUNzZDsKICAgICBib29sIG1EaXNhYmxlVGVzdDsKLSAgICBzdGFuZGFyZENvbXAgbUNvbXBOYW1lOwogCiAgICAgaW50MzJfdCBtV29ya1Jlc3VsdDsKICAgICB1aW50MzJfdCBtRnJhbWVzUmVjZWl2ZWQ7CkBAIC0xOTIsOSArMTcwLDggQEAKICAgICB9CiB9OwogCi1jbGFzcyBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0Ci0gICAgOiBwdWJsaWMgQ29kZWMyQXVkaW9FbmNIaWRsVGVzdEJhc2UsCi0gICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiB7CitjbGFzcyBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0IDogcHVibGljIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3RCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxUZXN0UGFyYW1ldGVycz4gewogICAgIHZvaWQgZ2V0UGFyYW1zKCkgewogICAgICAgICBtSW5zdGFuY2VOYW1lID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CiAgICAgICAgIG1Db21wb25lbnROYW1lID0gc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSk7CkBAIC0yMDIsNyArMTc5LDcgQEAKIH07CiAKIHZvaWQgdmFsaWRhdGVDb21wb25lbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGJvb2wmIGRpc2FibGVUZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGRpc2FibGVUZXN0KSB7CiAgICAgLy8gVmFsaWRhdGUgaXRzIGEgQzIgQ29tcG9uZW50CiAgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImMyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKICAgICAgICAgQUxPR0UoIk5vdCBhIGMyIGNvbXBvbmVudCIpOwpAQCAtMjI5LDEzICsyMDYsNiBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQotCi0gICAgLy8gVmFsaWRhdGVzIGNvbXBvbmVudCBuYW1lCi0gICAgaWYgKGNvbXBOYW1lID09IENvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnVua25vd25fY29tcCkgewotICAgICAgICBBTE9HRSgiQ29tcG9uZW50IEluVmFsaWQiKTsKLSAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOwotICAgICAgICByZXR1cm47Ci0gICAgfQogICAgIEFMT0dWKCJDb21wb25lbnQgVmFsaWQiKTsKIH0KIApAQCAtMjUyLDYxICsyMjIsMTA1IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi0vLyBHZXQgY29uZmlnIHBhcmFtcyBmb3IgYSBjb21wb25lbnQKLWJvb2wgZ2V0Q29uZmlnUGFyYW1zKENvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wTmFtZSwgaW50MzJfdCogbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogblNhbXBsZVJhdGUsIGludDMyX3QqIHNhbXBsZXNQZXJGcmFtZSkgewotICAgIHN3aXRjaCAoY29tcE5hbWUpIHsKLSAgICAgICAgY2FzZSBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjphYWM6Ci0gICAgICAgICAgICAqbkNoYW5uZWxzID0gMjsKLSAgICAgICAgICAgICpuU2FtcGxlUmF0ZSA9IDQ4MDAwOwotICAgICAgICAgICAgKnNhbXBsZXNQZXJGcmFtZSA9IDEwMjQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpmbGFjOgotICAgICAgICAgICAgKm5DaGFubmVscyA9IDI7Ci0gICAgICAgICAgICAqblNhbXBsZVJhdGUgPSA0ODAwMDsKLSAgICAgICAgICAgICpzYW1wbGVzUGVyRnJhbWUgPSAxMTUyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6b3B1czoKLSAgICAgICAgICAgICpuQ2hhbm5lbHMgPSAyOwotICAgICAgICAgICAgKm5TYW1wbGVSYXRlID0gNDgwMDA7Ci0gICAgICAgICAgICAqc2FtcGxlc1BlckZyYW1lID0gOTYwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6YW1ybmI6Ci0gICAgICAgICAgICAqbkNoYW5uZWxzID0gMTsKLSAgICAgICAgICAgICpuU2FtcGxlUmF0ZSA9IDgwMDA7Ci0gICAgICAgICAgICAqc2FtcGxlc1BlckZyYW1lID0gMTYwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6YW1yd2I6Ci0gICAgICAgICAgICAqbkNoYW5uZWxzID0gMTsKLSAgICAgICAgICAgICpuU2FtcGxlUmF0ZSA9IDE2MDAwOwotICAgICAgICAgICAgKnNhbXBsZXNQZXJGcmFtZSA9IDE2MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworYzJfc3RhdHVzX3QgZ2V0Q2hhbm5lbENvdW50KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBuQ2hhbm5lbHMpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gY2hhbm5lbENvdW50ID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4oKTsKKyAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IHZhbGlkVmFsdWVJbmZvcyA9IHsKKyAgICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q3VycmVudCgKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbUZpZWxkKGNoYW5uZWxDb3VudC5nZXQoKSwgJkMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6dmFsdWUpKX07CisgICAgYzJfc3RhdHVzX3QgYzJlcnIgPSBjb21wb25lbnQtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKHZhbGlkVmFsdWVJbmZvcywgQzJfRE9OVF9CTE9DSyk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LIHx8IHZhbGlkVmFsdWVJbmZvcy5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgQUxPR0UoInF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiIGZhaWxlZCBmb3IgY2hhbm5lbENvdW50Iik7CisgICAgICAgIHJldHVybiBjMmVycjsKICAgICB9CisKKyAgICAvLyBzZXR0aW5nIGRlZmF1bHQgdmFsdWUgb2YgY2hhbm5lbENvdW50CisgICAgKm5DaGFubmVscyA9IDE7CisgICAgY29uc3QgYXV0byYgYzJGU1YgPSB2YWxpZFZhbHVlSW5mb3NbMF0udmFsdWVzOworICAgIHN3aXRjaCAoYzJGU1YudHlwZSkgeworICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdDo6UkFOR0U6IHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8mIHJhbmdlID0gYzJGU1YucmFuZ2U7CisgICAgICAgICAgICB1aW50MzJfdCBybWF4ID0gKHVpbnQzMl90KShyYW5nZS5tYXgpLnJlZjx1aW50MzJfdD4oKTsKKyAgICAgICAgICAgIGlmIChybWF4ID49IDIpIHsKKyAgICAgICAgICAgICAgICAqbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKm5DaGFubmVscyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdDo6VkFMVUVTOiB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSYgcHJpbSA6IGMyRlNWLnZhbHVlcykgeworICAgICAgICAgICAgICAgIGlmICgodWludDMyX3QpcHJpbS5yZWY8dWludDMyX3Q+KCkgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAqbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh1aW50MzJfdClwcmltLnJlZjx1aW50MzJfdD4oKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICpuQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBnZXRTYW1wbGVSYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogblNhbXBsZVJhdGUpIHsKKyAgICAvLyBVc2UgdGhlIGRlZmF1bHQgc2FtcGxlIHJhdGUgZm9yIGNvbXBvbmVudHMKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgYzJfc3RhdHVzX3QgYzJlcnIgPSBjb21wb25lbnQtPnF1ZXJ5KHt9LCB7QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQ6OlBBUkFNX1RZUEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LIHx8IHF1ZXJpZWQuc2l6ZSgpID09IDApIHJldHVybiBjMmVycjsKKworICAgIHNpemVfdCBvZmZzZXQgPSBzaXplb2YoQzJQYXJhbSk7CisgICAgQzJQYXJhbSogcGFyYW0gPSBxdWVyaWVkWzBdLmdldCgpOworICAgICpuU2FtcGxlUmF0ZSA9ICooaW50MzJfdCopKCh1aW50OF90KilwYXJhbSArIG9mZnNldCk7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IGdldFNhbXBsZXNQZXJGcmFtZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhbm5lbHMsIGludDMyX3QqIHNhbXBsZXNQZXJGcmFtZSkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9IGNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dDo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICBpZiAoYzJlcnIgIT0gQzJfT0sgfHwgcXVlcmllZC5zaXplKCkgPT0gMCkgcmV0dXJuIGMyZXJyOworCisgICAgc2l6ZV90IG9mZnNldCA9IHNpemVvZihDMlBhcmFtKTsKKyAgICBDMlBhcmFtKiBwYXJhbSA9IHF1ZXJpZWRbMF0uZ2V0KCk7CisgICAgdWludDMyX3QgbWF4SW5wdXRTaXplID0gKih1aW50MzJfdCopKCh1aW50OF90KilwYXJhbSArIG9mZnNldCk7CisgICAgKnNhbXBsZXNQZXJGcmFtZSA9IHN0ZDo6bWluKChtYXhJbnB1dFNpemUgLyAobkNoYW5uZWxzICogMikpLCBrTWF4U2FtcGxlc1BlckZyYW1lKTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gR2V0IGNvbmZpZyBwYXJhbXMgZm9yIGEgY29tcG9uZW50Citib29sIGdldENvbmZpZ1BhcmFtcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBuQ2hhbm5lbHMsIGludDMyX3QqIG5TYW1wbGVSYXRlLCBpbnQzMl90KiBzYW1wbGVzUGVyRnJhbWUpIHsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBnZXRDaGFubmVsQ291bnQoY29tcG9uZW50LCBuQ2hhbm5lbHMpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHJldHVybiBmYWxzZTsKKworICAgIHN0YXR1cyA9IGdldFNhbXBsZVJhdGUoY29tcG9uZW50LCBuU2FtcGxlUmF0ZSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgcmV0dXJuIGZhbHNlOworCisgICAgc3RhdHVzID0gZ2V0U2FtcGxlc1BlckZyYW1lKGNvbXBvbmVudCwgKm5DaGFubmVscywgc2FtcGxlc1BlckZyYW1lKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSByZXR1cm4gZmFsc2U7CisKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAogLy8gTG9va1VwVGFibGUgb2YgY2xpcHMgYW5kIG1ldGFkYXRhIGZvciBjb21wb25lbnQgdGVzdGluZwotdm9pZCBHZXRVUkxGb3JDb21wb25lbnQoQ29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXAsIGNoYXIqIG1VUkwpIHsKLSAgICBzdHJ1Y3QgQ29tcFRvVVJMIHsKLSAgICAgICAgQ29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXA7Ci0gICAgICAgIGNvbnN0IGNoYXIqIG1VUkw7Ci0gICAgfTsKLSAgICBzdGF0aWMgY29uc3QgQ29tcFRvVVJMIGtDb21wVG9VUkxbXSA9IHsKLSAgICAgICAgICAgIHtDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFhYywgImJiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdyJ9LAotICAgICAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YW1ybmIsICJiYmJfcmF3XzFjaF84a2h6X3MxNmxlLnJhdyJ9LAotICAgICAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YW1yd2IsICJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXcifSwKLSAgICAgICAgICAgIHtDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmZsYWMsICJiYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXcifSwKLSAgICAgICAgICAgIHtDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Om9wdXMsICJiYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXcifSwKLSAgICB9OwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoa0NvbXBUb1VSTCkgLyBzaXplb2Yoa0NvbXBUb1VSTFswXSk7ICsraSkgewotICAgICAgICBpZiAoa0NvbXBUb1VSTFtpXS5jb21wID09IGNvbXApIHsKLSAgICAgICAgICAgIHN0cmNhdChtVVJMLCBrQ29tcFRvVVJMW2ldLm1VUkwpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Cit2b2lkIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3RCYXNlOjpHZXRVUkxGb3JDb21wb25lbnQoY2hhciogbVVSTCwgaW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlKSB7CisgICAgc3RkOjpzdHJpbmcgcmF3SW5wdXQgPSAiYmJiX3Jhd18xY2hfOGtoel9zMTZsZS5yYXciOworICAgIGlmIChjaGFubmVsQ291bnQgPT0gMSAmJiBzYW1wbGVSYXRlID09IDE2MDAwKSB7CisgICAgICAgIHJhd0lucHV0ID0gImJiYl9yYXdfMWNoXzE2a2h6X3MxNmxlLnJhdyI7CisgICAgfSBlbHNlIGlmIChjaGFubmVsQ291bnQgPT0gMikgeworICAgICAgICByYXdJbnB1dCA9ICJiYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXciOwogICAgIH0KKworICAgIHN0cmNhdChtVVJMLCByYXdJbnB1dC5jX3N0cigpKTsKIH0KIAogdm9pZCBlbmNvZGVORnJhbWVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKQEAgLTMyMCw5ICszMzQsMTcgQEAKIAogICAgIHVpbnQzMl90IGZyYW1lSUQgPSAwOwogICAgIHVpbnQzMl90IG1heFJldHJ5ID0gMDsKLSAgICBpbnQgYnl0ZXNDb3VudCA9IHNhbXBsZXNQZXJGcmFtZSAqIG5DaGFubmVscyAqIDI7CisgICAgdWludDMyX3QgYnl0ZXNDb3VudCA9IHNhbXBsZXNQZXJGcmFtZSAqIG5DaGFubmVscyAqIDI7CiAgICAgaW50MzJfdCB0aW1lc3RhbXBJbmNyID0gKGludCkoKChmbG9hdClzYW1wbGVzUGVyRnJhbWUgLyBuU2FtcGxlUmF0ZSkgKiAxMDAwMDAwKTsKICAgICB1aW50NjRfdCB0aW1lc3RhbXAgPSAwOworCisgICAgLy8gZ2V0IGxlbmd0aCBvZiBmaWxlOgorICAgIGludDMyX3QgY3VyclBvcyA9IGVsZVN0cmVhbS50ZWxsZygpOworICAgIGVsZVN0cmVhbS5zZWVrZygwLCBlbGVTdHJlYW0uZW5kKTsKKyAgICB1aW50MzJfdCByZW1haW5pbmdCeXRlcyA9ICh1aW50MzJfdCllbGVTdHJlYW0udGVsbGcoKSAtIGN1cnJQb3M7CisgICAgZWxlU3RyZWFtLnNlZWtnKGN1cnJQb3MsIGVsZVN0cmVhbS5iZWcpOworCisgICAgbkZyYW1lcyA9IHN0ZDo6bWluKG5GcmFtZXMsIHJlbWFpbmluZ0J5dGVzIC8gYnl0ZXNDb3VudCk7CiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgaWYgKG5GcmFtZXMgPT0gMCkgYnJlYWs7CiAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKQEAgLTM1Niw3ICszNzgsMTIgQEAKICAgICAgICAgY2hhciogZGF0YSA9IChjaGFyKiltYWxsb2MoYnl0ZXNDb3VudCk7CiAgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKTsKICAgICAgICAgZWxlU3RyZWFtLnJlYWQoZGF0YSwgYnl0ZXNDb3VudCk7Ci0gICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uZ2NvdW50KCksIGJ5dGVzQ291bnQpOworICAgICAgICAvLyBpZiB3ZSBoYXZlIHJlYWNoZWQgYXQgdGhlIGVuZCBvZiBpbnB1dCBzdHJlYW0sIHNpZ25hbCBlb3MKKyAgICAgICAgaWYgKGVsZVN0cmVhbS5nY291bnQoKSA8IGJ5dGVzQ291bnQpIHsKKyAgICAgICAgICAgIGJ5dGVzQ291bnQgPSBlbGVTdHJlYW0uZ2NvdW50KCk7CisgICAgICAgICAgICBpZiAoc2lnbmFsRU9TKSBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOwogICAgICAgICBBU1NFUlRfRVEoQzJfT0ssCiAgICAgICAgICAgICAgICAgICBsaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKApAQCAtMzk1LDE0ICs0MjIsMTIgQEAKIFRFU1RfUChDb2RlYzJBdWRpb0VuY0hpZGxUZXN0LCB2YWxpZGF0ZUNvbXBOYW1lKSB7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgR1RFU1RfU0tJUCgpIDw8ICJUZXN0IGlzIGRpc2FibGVkIjsKICAgICBBTE9HVigiQ2hlY2tzIGlmIHRoZSBnaXZlbiBjb21wb25lbnQgaXMgYSB2YWxpZCBhdWRpbyBjb21wb25lbnQiKTsKLSAgICB2YWxpZGF0ZUNvbXBvbmVudChtQ29tcG9uZW50LCBtQ29tcE5hbWUsIG1EaXNhYmxlVGVzdCk7CisgICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbURpc2FibGVUZXN0KTsKICAgICBBU1NFUlRfRVEobURpc2FibGVUZXN0LCBmYWxzZSk7CiB9CiAKLWNsYXNzIENvZGVjMkF1ZGlvRW5jRW5jb2RlVGVzdAotICAgIDogcHVibGljIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3RCYXNlLAotICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPAotICAgICAgICAgICAgICBzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4geworY2xhc3MgQ29kZWMyQXVkaW9FbmNFbmNvZGVUZXN0IDogcHVibGljIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3RCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPEVuY29kZVRlc3RQYXJhbWV0ZXJzPiB7CiAgICAgdm9pZCBnZXRQYXJhbXMoKSB7CiAgICAgICAgIG1JbnN0YW5jZU5hbWUgPSBzdGQ6OmdldDwwPihHZXRQYXJhbSgpKTsKICAgICAgICAgbUNvbXBvbmVudE5hbWUgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKQEAgLTQxMiwxOSArNDM3LDE2IEBACiBURVNUX1AoQ29kZWMyQXVkaW9FbmNFbmNvZGVUZXN0LCBFbmNvZGVUZXN0KSB7CiAgICAgQUxPR1YoIkVuY29kZVRlc3QiKTsKICAgICBpZiAobURpc2FibGVUZXN0KSBHVEVTVF9TS0lQKCkgPDwgIlRlc3QgaXMgZGlzYWJsZWQiOwotICAgIGNoYXIgbVVSTFs1MTJdOwotICAgIHN0cmNweShtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7Ci0gICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCk7Ci0gICAgYm9vbCBzaWduYWxFT1MgPSAhc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSkuY29tcGFyZSgidHJ1ZSIpOworICAgIGJvb2wgc2lnbmFsRU9TID0gc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSk7CiAgICAgLy8gUmF0aW8gdy5yLnQgdG8gbUlucHV0TWF4QnVmU2l6ZQotICAgIGludDMyX3QgaW5wdXRNYXhCdWZSYXRpbyA9IHN0ZDo6c3RvaShzdGQ6OmdldDwzPihHZXRQYXJhbSgpKSk7CisgICAgaW50MzJfdCBpbnB1dE1heEJ1ZlJhdGlvID0gc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSk7CiAKICAgICBpbnQzMl90IG5DaGFubmVsczsKICAgICBpbnQzMl90IG5TYW1wbGVSYXRlOwogICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lOwogCi0gICAgaWYgKCFnZXRDb25maWdQYXJhbXMobUNvbXBOYW1lLCAmbkNoYW5uZWxzLCAmblNhbXBsZVJhdGUsICZzYW1wbGVzUGVyRnJhbWUpKSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiRmFpbGVkIHRvIGdldCB0aGUgY29uZmlnIHBhcmFtcyBmb3IgIiA8PCBtQ29tcE5hbWUgPDwgIiBjb21wb25lbnRcbiI7CisgICAgaWYgKCFnZXRDb25maWdQYXJhbXMobUNvbXBvbmVudCwgJm5DaGFubmVscywgJm5TYW1wbGVSYXRlLCAmc2FtcGxlc1BlckZyYW1lKSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIkZhaWxlZCB0byBnZXQgdGhlIGNvbmZpZyBwYXJhbXMgZm9yICIgPDwgbUNvbXBvbmVudE5hbWUgPDwgIlxuIjsKICAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTQzNyw2ICs0NTksMTAgQEAKICAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBjaGFyIG1VUkxbNTEyXTsKKyAgICBzdHJjcHkobVVSTCwgc1Jlc291cmNlRGlyLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtVVJMLCBuQ2hhbm5lbHMsIG5TYW1wbGVSYXRlKTsKKwogICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CiAgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CiAgICAgdWludDMyX3QgbnVtRnJhbWVzID0gMTY7CkBAIC00NjQsMTEgKzQ5MCw5IEBACiAgICAgICAgIEFMT0dFKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXUiLCBtRnJhbWVzUmVjZWl2ZWQsIG51bUZyYW1lcyk7CiAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKICAgICB9Ci0gICAgaWYgKChtQ29tcE5hbWUgPT0gZmxhYyB8fCBtQ29tcE5hbWUgPT0gb3B1cyB8fCBtQ29tcE5hbWUgPT0gYWFjKSkgewotICAgICAgICBpZiAoIW1Dc2QpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDU0QgYnVmZmVyIG1pc3NpbmciKTsKLSAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKLSAgICAgICAgfQorICAgIGlmICgobU1pbWUuZmluZCgiZmxhYyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB8fCAobU1pbWUuZmluZCgib3B1cyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB8fAorICAgICAgICAobU1pbWUuZmluZCgibXA0YS1sYXRtIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKG1Dc2QpIDw8ICJDU0QgYnVmZmVyIG1pc3NpbmciOwogICAgIH0KICAgICBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CiAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOwpAQCAtNTIwLDE3ICs1NDQsMTMgQEAKICAgICBkZXNjcmlwdGlvbigiVGVzdCBSZXF1ZXN0IGZvciBmbHVzaCIpOwogICAgIGlmIChtRGlzYWJsZVRlc3QpIEdURVNUX1NLSVAoKSA8PCAiVGVzdCBpcyBkaXNhYmxlZCI7CiAKLSAgICBjaGFyIG1VUkxbNTEyXTsKLSAgICBzdHJjcHkobVVSTCwgc1Jlc291cmNlRGlyLmNfc3RyKCkpOwotICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwpOwotCiAgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CiAgICAgaW50MzJfdCBuQ2hhbm5lbHM7CiAgICAgaW50MzJfdCBuU2FtcGxlUmF0ZTsKICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZTsKIAotICAgIGlmICghZ2V0Q29uZmlnUGFyYW1zKG1Db21wTmFtZSwgJm5DaGFubmVscywgJm5TYW1wbGVSYXRlLCAmc2FtcGxlc1BlckZyYW1lKSkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgIkZhaWxlZCB0byBnZXQgdGhlIGNvbmZpZyBwYXJhbXMgZm9yICIgPDwgbUNvbXBOYW1lIDw8ICIgY29tcG9uZW50XG4iOworICAgIGlmICghZ2V0Q29uZmlnUGFyYW1zKG1Db21wb25lbnQsICZuQ2hhbm5lbHMsICZuU2FtcGxlUmF0ZSwgJnNhbXBsZXNQZXJGcmFtZSkpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBjb25maWcgcGFyYW1zIGZvciAiIDw8IG1Db21wb25lbnROYW1lIDw8ICJcbiI7CiAgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC01MzksNiArNTU5LDEwIEBACiAgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgY2hhciBtVVJMWzUxMl07CisgICAgc3RyY3B5KG1VUkwsIHNSZXNvdXJjZURpci5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobVVSTCwgbkNoYW5uZWxzLCBuU2FtcGxlUmF0ZSk7CisKICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOwogCiAgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CkBAIC01ODUsMzMgKzYwOSwzMiBAQAogICAgIGRlc2NyaXB0aW9uKCJFbmNvZGVzIGlucHV0IGZpbGUgZm9yIGRpZmZlcmVudCBjaGFubmVsIGNvdW50Iik7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgR1RFU1RfU0tJUCgpIDw8ICJUZXN0IGlzIGRpc2FibGVkIjsKIAotICAgIGNoYXIgbVVSTFs1MTJdOwotICAgIHN0cmNweShtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7Ci0gICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCk7Ci0KLSAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKLSAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOwotICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKSA8PCBtVVJMIDw8ICIgZmlsZSBub3QgZm91bmQiOwotICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKLQogICAgIGludDMyX3QgblNhbXBsZVJhdGU7CiAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWU7CiAgICAgaW50MzJfdCBuQ2hhbm5lbHM7CiAgICAgaW50MzJfdCBudW1GcmFtZXMgPSAxNjsKICAgICBpbnQzMl90IG1heENoYW5uZWxDb3VudCA9IDg7CiAKLSAgICBpZiAoIWdldENvbmZpZ1BhcmFtcyhtQ29tcE5hbWUsICZuQ2hhbm5lbHMsICZuU2FtcGxlUmF0ZSwgJnNhbXBsZXNQZXJGcmFtZSkpIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBjb25maWcgcGFyYW1zIGZvciAiIDw8IG1Db21wTmFtZSA8PCAiIGNvbXBvbmVudFxuIjsKKyAgICBpZiAoIWdldENvbmZpZ1BhcmFtcyhtQ29tcG9uZW50LCAmbkNoYW5uZWxzLCAmblNhbXBsZVJhdGUsICZzYW1wbGVzUGVyRnJhbWUpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiRmFpbGVkIHRvIGdldCB0aGUgY29uZmlnIHBhcmFtcyBmb3IgIiA8PCBtQ29tcG9uZW50TmFtZSA8PCAiXG4iOwogICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOwogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIGNoYXIgbVVSTFs1MTJdOworICAgIHN0cmNweShtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1VUkwsIG5DaGFubmVscywgblNhbXBsZVJhdGUpOworCisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIGZpbGUgbm90IGZvdW5kIjsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CiAKICAgICB1aW50NjRfdCBwcmV2T3V0cHV0U2l6ZSA9IDB1OwogICAgIHVpbnQzMl90IHByZXZDaGFubmVsQ291bnQgPSAwdTsKIAogICAgIC8vIExvb3BpbmcgdGhyb3VnaCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbCBjb3VudCBzdXBwb3J0ZWQgYnkgZW5jb2RlcgogICAgIGZvciAobkNoYW5uZWxzID0gMTsgbkNoYW5uZWxzIDwgbWF4Q2hhbm5lbENvdW50OyBuQ2hhbm5lbHMrKykgewotICAgICAgICBBTE9HVigiQ29uZmlndXJpbmcgJXUgZW5jb2RlciBmb3IgY2hhbm5lbCBjb3VudCA9ICVkIiwgbUNvbXBOYW1lLCBuQ2hhbm5lbHMpOworICAgICAgICBBTE9HVigiQ29uZmlndXJpbmcgZW5jb2RlciAlcyAgZm9yIGNoYW5uZWwgY291bnQgPSAlZCIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG5DaGFubmVscyk7CiAgICAgICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBuQ2hhbm5lbHMsIG5TYW1wbGVSYXRlKSkgewogICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTYzMiw4ICs2NTUsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFRvIGNoZWNrIGlmIHRoZSBpbnB1dCBzdHJlYW0gaXMgc3VmZmljaWVudCB0byBlbmNvZGUgZm9yIHRoZSBoaWdoZXIgY2hhbm5lbCBjb3VudAorICAgICAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgICAgIHN0YXQobVVSTCwgJmJ1Zik7CisgICAgICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOwogICAgICAgICBpbnQzMl90IGJ5dGVzQ291bnQgPSAoc2FtcGxlc1BlckZyYW1lICogbkNoYW5uZWxzICogMikgKiBudW1GcmFtZXM7Ci0gICAgICAgIGlmIChlbGVTdHJlYW0uZ2NvdW50KCkgPCBieXRlc0NvdW50KSB7CisgICAgICAgIGlmIChmaWxlU2l6ZSA8IGJ5dGVzQ291bnQpIHsKICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBmb3IgQ2hhbm5lbENvdW50ICIgPDwgbkNoYW5uZWxzCiAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBiZWNhdXNlIG9mIGluc3VmZmljaWVudCBpbnB1dCBkYXRhXG4iOwogICAgICAgICAgICAgY29udGludWU7CkBAIC02NTcsOSArNjgzLDYgQEAKICAgICAgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUgY29uc3VtZWQKICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpOwogCi0gICAgICAgIC8vIFZhbGlkYXRlIG91dHB1dCBzaXplIGJhc2VkIG9uIGNob3NlbiBDaGFubmVsQ291bnQKLSAgICAgICAgRVhQRUNUX0dFKG1PdXRwdXRTaXplLCBwcmV2T3V0cHV0U2l6ZSk7Ci0KICAgICAgICAgcHJldkNoYW5uZWxDb3VudCA9IG5DaGFubmVsczsKICAgICAgICAgcHJldk91dHB1dFNpemUgPSBtT3V0cHV0U2l6ZTsKIApAQCAtNjY4LDExICs2OTEsMTQgQEAKICAgICAgICAgICAgIEFMT0dFKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXUiLCBtRnJhbWVzUmVjZWl2ZWQsIG51bUZyYW1lcyk7CiAgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKChtQ29tcE5hbWUgPT0gZmxhYyB8fCBtQ29tcE5hbWUgPT0gb3B1cyB8fCBtQ29tcE5hbWUgPT0gYWFjKSkgeworICAgICAgICBpZiAoKG1NaW1lLmZpbmQoImZsYWMiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgfHwKKyAgICAgICAgICAgIChtTWltZS5maW5kKCJvcHVzIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHx8CisgICAgICAgICAgICAobU1pbWUuZmluZCgibXA0YS1sYXRtIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpKSB7CiAgICAgICAgICAgICBBU1NFUlRfVFJVRShtQ3NkKSA8PCAiQ1NEIGJ1ZmZlciBtaXNzaW5nIjsKICAgICAgICAgfQogICAgICAgICBBU1NFUlRfVFJVRShtRW9zKTsKLSAgICAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworICAgICAgICAvLyBUT0RPKGIvMTQ3MzQ4NzExKSBVc2UgcmVzZXQgaW5zdGVhZCBvZiBzdG9wIHdoZW4gdXNpbmcgdGhlIHNhbWUgaW5zdGFuY2Ugb2YgY29kZWMuCisgICAgICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5yZXNldCgpLCBDMl9PSyk7CiAgICAgICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CiAgICAgICAgIG1PdXRwdXRTaXplID0gMDsKICAgICAgICAgbUVvcyA9IGZhbHNlOwpAQCAtNjg1LDI1ICs3MTEsMjQgQEAKICAgICBkZXNjcmlwdGlvbigiRW5jb2RlcyBpbnB1dCBmaWxlIGZvciBkaWZmZXJlbnQgU2FtcGxlUmF0ZSIpOwogICAgIGlmIChtRGlzYWJsZVRlc3QpIEdURVNUX1NLSVAoKSA8PCAiVGVzdCBpcyBkaXNhYmxlZCI7CiAKLSAgICBjaGFyIG1VUkxbNTEyXTsKLSAgICBzdHJjcHkobVVSTCwgc1Jlc291cmNlRGlyLmNfc3RyKCkpOwotICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwpOwotCi0gICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07Ci0gICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKLSAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIGZpbGUgbm90IGZvdW5kIjsKLSAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7Ci0KICAgICBpbnQzMl90IG5TYW1wbGVSYXRlOwogICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lOwogICAgIGludDMyX3QgbkNoYW5uZWxzOwogICAgIGludDMyX3QgbnVtRnJhbWVzID0gMTY7CiAKLSAgICBpZiAoIWdldENvbmZpZ1BhcmFtcyhtQ29tcE5hbWUsICZuQ2hhbm5lbHMsICZuU2FtcGxlUmF0ZSwgJnNhbXBsZXNQZXJGcmFtZSkpIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBjb25maWcgcGFyYW1zIGZvciAiIDw8IG1Db21wTmFtZSA8PCAiIGNvbXBvbmVudFxuIjsKKyAgICBpZiAoIWdldENvbmZpZ1BhcmFtcyhtQ29tcG9uZW50LCAmbkNoYW5uZWxzLCAmblNhbXBsZVJhdGUsICZzYW1wbGVzUGVyRnJhbWUpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiRmFpbGVkIHRvIGdldCB0aGUgY29uZmlnIHBhcmFtcyBmb3IgIiA8PCBtQ29tcG9uZW50TmFtZSA8PCAiXG4iOwogICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOwogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIGNoYXIgbVVSTFs1MTJdOworICAgIHN0cmNweShtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1VUkwsIG5DaGFubmVscywgblNhbXBsZVJhdGUpOworCisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIGZpbGUgbm90IGZvdW5kIjsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CiAKICAgICBpbnQzMl90IHNhbXBsZVJhdGVWYWx1ZXNbXSA9IHsxMDAwLCA4MDAwLCAxNjAwMCwgMjQwMDAsIDQ4MDAwLCA5NjAwMCwgMTkyMDAwfTsKIApAQCAtNzExLDcgKzczNiw3IEBACiAgICAgdWludDMyX3QgcHJldlNhbXBsZVJhdGUgPSAwdTsKIAogICAgIGZvciAoaW50MzJfdCBuU2FtcGxlUmF0ZSA6IHNhbXBsZVJhdGVWYWx1ZXMpIHsKLSAgICAgICAgQUxPR1YoIkNvbmZpZ3VyaW5nICV1IGVuY29kZXIgZm9yIFNhbXBsZVJhdGUgPSAlZCIsIG1Db21wTmFtZSwgblNhbXBsZVJhdGUpOworICAgICAgICBBTE9HVigiQ29uZmlndXJpbmcgZW5jb2RlciAlcyAgZm9yIFNhbXBsZVJhdGUgPSAlZCIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG5TYW1wbGVSYXRlKTsKICAgICAgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIG5DaGFubmVscywgblNhbXBsZVJhdGUpKSB7CiAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOwogICAgICAgICAgICAgcmV0dXJuOwpAQCAtNzMzLDggKzc1OCwxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gVG8gY2hlY2sgaWYgdGhlIGlucHV0IHN0cmVhbSBpcyBzdWZmaWNpZW50IHRvIGVuY29kZSBmb3IgdGhlIGhpZ2hlciBTYW1wbGVSYXRlCisgICAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICAgICAgc3RhdChtVVJMLCAmYnVmKTsKKyAgICAgICAgc2l6ZV90IGZpbGVTaXplID0gYnVmLnN0X3NpemU7CiAgICAgICAgIGludDMyX3QgYnl0ZXNDb3VudCA9IChzYW1wbGVzUGVyRnJhbWUgKiBuQ2hhbm5lbHMgKiAyKSAqIG51bUZyYW1lczsKLSAgICAgICAgaWYgKGVsZVN0cmVhbS5nY291bnQoKSA8IGJ5dGVzQ291bnQpIHsKKyAgICAgICAgaWYgKGZpbGVTaXplIDwgYnl0ZXNDb3VudCkgewogICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIGZvciBTYW1wbGVSYXRlICIgPDwgblNhbXBsZVJhdGUKICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGJlY2F1c2Ugb2YgaW5zdWZmaWNpZW50IGlucHV0IGRhdGFcbiI7CiAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTc1OCwxMiArNzg2LDYgQEAKICAgICAgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUgY29uc3VtZWQKICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpOwogCi0gICAgICAgIC8vIFZhbGlkYXRlIG91dHB1dCBzaXplIGJhc2VkIG9uIGNob3NlbiBzYW1wbGVyYXRlCi0gICAgICAgIGlmIChwcmV2U2FtcGxlUmF0ZSA+PSBuU2FtcGxlUmF0ZSkgewotICAgICAgICAgICAgRVhQRUNUX0xFKG1PdXRwdXRTaXplLCBwcmV2T3V0cHV0U2l6ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBFWFBFQ1RfR1QobU91dHB1dFNpemUsIHByZXZPdXRwdXRTaXplKTsKLSAgICAgICAgfQogICAgICAgICBwcmV2U2FtcGxlUmF0ZSA9IG5TYW1wbGVSYXRlOwogICAgICAgICBwcmV2T3V0cHV0U2l6ZSA9IG1PdXRwdXRTaXplOwogCkBAIC03NzIsMTEgKzc5NCwxNCBAQAogICAgICAgICAgICAgQUxPR0UoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAldSIsIG1GcmFtZXNSZWNlaXZlZCwgbnVtRnJhbWVzKTsKICAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKICAgICAgICAgfQotICAgICAgICBpZiAoKG1Db21wTmFtZSA9PSBmbGFjIHx8IG1Db21wTmFtZSA9PSBvcHVzIHx8IG1Db21wTmFtZSA9PSBhYWMpKSB7CisgICAgICAgIGlmICgobU1pbWUuZmluZCgiZmxhYyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB8fAorICAgICAgICAgICAgKG1NaW1lLmZpbmQoIm9wdXMiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgfHwKKyAgICAgICAgICAgIChtTWltZS5maW5kKCJtcDRhLWxhdG0iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykpIHsKICAgICAgICAgICAgIEFTU0VSVF9UUlVFKG1Dc2QpIDw8ICJDU0QgYnVmZmVyIG1pc3NpbmciOwogICAgICAgICB9CiAgICAgICAgIEFTU0VSVF9UUlVFKG1Fb3MpOwotICAgICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CisgICAgICAgIC8vIFRPRE8oYi8xNDczNDg3MTEpIFVzZSByZXNldCBpbnN0ZWFkIG9mIHN0b3Agd2hlbiB1c2luZyB0aGUgc2FtZSBpbnN0YW5jZSBvZiBjb2RlYy4KKyAgICAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnJlc2V0KCksIEMyX09LKTsKICAgICAgICAgbUZyYW1lc1JlY2VpdmVkID0gMDsKICAgICAgICAgbU91dHB1dFNpemUgPSAwOwogICAgICAgICBtRW9zID0gZmFsc2U7CkBAIC03ODUsMzcgKzgxMCwyOSBAQAogICAgIH0KIH0KIAotSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFBlckluc3RhbmNlLCBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0LCB0ZXN0aW5nOjpWYWx1ZXNJbihrVGVzdFBhcmFtZXRlcnMpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpQcmludEluc3RhbmNlVHVwbGVOYW1lVG9TdHJpbmc8Pik7CitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoUGVySW5zdGFuY2UsIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QsIHRlc3Rpbmc6OlZhbHVlc0luKGdUZXN0UGFyYW1ldGVycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRJbnN0YW5jZVR1cGxlTmFtZVRvU3RyaW5nPD4pOwogCiAvLyBFbmNvZGVUZXN0IHdpdGggRU9TIC8gTm8gRU9TIGFuZCBpbnB1dE1heEJ1ZlJhdGlvCiAvLyBpbnB1dE1heEJ1ZlJhdGlvIGlzIHJhdGlvIHcuci50LiB0byBtSW5wdXRNYXhCdWZTaXplCiBJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoRW5jb2RlVGVzdCwgQ29kZWMyQXVkaW9FbmNFbmNvZGVUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlc0luKGtFbmNvZGVUZXN0UGFyYW1ldGVycyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlByaW50SW5zdGFuY2VUdXBsZU5hbWVUb1N0cmluZzw+KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpWYWx1ZXNJbihnRW5jb2RlVGVzdFBhcmFtZXRlcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50SW5zdGFuY2VUdXBsZU5hbWVUb1N0cmluZzw+KTsKIAogfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgICBrVGVzdFBhcmFtZXRlcnMgPSBnZXRUZXN0UGFyYW1ldGVycyhDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLCBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSKTsKLSAgICBmb3IgKGF1dG8gcGFyYW1zIDoga1Rlc3RQYXJhbWV0ZXJzKSB7Ci0gICAgICAgIGtFbmNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksICJmYWxzZSIsICIxIikpOwotICAgICAgICBrRW5jb2RlVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCAiZmFsc2UiLCAiMiIpKTsKLSAgICAgICAga0VuY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgInRydWUiLCAiMSIpKTsKLSAgICAgICAga0VuY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgInRydWUiLCAiMiIpKTsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIHJlc291cmNlIGRpcmVjdG9yeSBiYXNlZCBvbiBjb21tYW5kIGxpbmUgYXJncy4KLSAgICAvLyBUZXN0IHdpbGwgZmFpbCB0byBzZXQgdXAgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBzZXQuCi0gICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKLSAgICAgICAgaWYgKHN0cmNtcChhcmd2W2ldLCAiLVAiKSA9PSAwICYmIGkgPCBhcmdjIC0gMSkgewotICAgICAgICAgICAgc1Jlc291cmNlRGlyID0gYXJndltpICsgMV07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgIHBhcnNlQXJncyhhcmdjLCBhcmd2KTsKKyAgICBnVGVzdFBhcmFtZXRlcnMgPSBnZXRUZXN0UGFyYW1ldGVycyhDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLCBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSKTsKKyAgICBmb3IgKGF1dG8gcGFyYW1zIDogZ1Rlc3RQYXJhbWV0ZXJzKSB7CisgICAgICAgIGdFbmNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIGZhbHNlLCAxKSk7CisgICAgICAgIGdFbmNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIGZhbHNlLCAyKSk7CisgICAgICAgIGdFbmNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIHRydWUsIDEpKTsKKyAgICAgICAgZ0VuY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgdHJ1ZSwgMikpOwogICAgIH0KIAogICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9BbmRyb2lkLmJwCmluZGV4IGY5ZWM1YWUuLjQxMDZiZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogIlZ0c0hhbE1lZGlhQzJWMV8wQ29tbW9uVXRpbCIsCiAgICAgZGVmYXVsdHM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uY3BwCmluZGV4IDAyNTFlYzIuLjFmMTY4MWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmNwcApAQCAtMjIsNiArMjIsNDggQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgogCitzdGQ6OnN0cmluZyBzUmVzb3VyY2VEaXIgPSAiIjsKKworc3RkOjpzdHJpbmcgc0NvbXBvbmVudE5hbWVQcmVmaXggPSAiIjsKKworc3RhdGljIGNvbnN0ZXhwciBzdHJ1Y3Qgb3B0aW9uIGtBcmdPcHRpb25zW10gPSB7CisgICAgICAgIHsicmVzIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdQJ30sCisgICAgICAgIHsicHJlZml4IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdwJ30sCisgICAgICAgIHsiaGVscCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnaCd9LAorICAgICAgICB7bnVsbHB0ciwgMCwgbnVsbHB0ciwgMH0sCit9OworCit2b2lkIHByaW50VXNhZ2UoY2hhciogbWUpIHsKKyAgICBzdGQ6OmNlcnIgPDwgIlZUUyB0ZXN0cyB0byB0ZXN0IGNvZGVjMiBjb21wb25lbnRzIFxuIjsKKyAgICBzdGQ6OmNlcnIgPDwgIlVzYWdlOiAiIDw8IG1lIDw8ICIgW29wdGlvbnNdIFxuIjsKKyAgICBzdGQ6OmNlcnIgPDwgIlx0IC1QLCAgLS1yZXM6ICAgIE1hbmRhdG9yeSBwYXRoIHRvIGEgZm9sZGVyIHRoYXQgY29udGFpbnMgdGVzdCByZXNvdXJjZXMgXG4iOworICAgIHN0ZDo6Y2VyciA8PCAiXHQgLXAsICAtLXByZWZpeDogT3B0aW9uYWwgcHJlZml4IHRvIHNlbGVjdCBjb21wb25lbnQvcyB0byBiZSB0ZXN0ZWQgXG4iOworICAgIHN0ZDo6Y2VyciA8PCAiXHQgICAgICAgICAgICAgICAgICAgIEFsbCBjb2RlY3MgYXJlIHRlc3RlZCBieSBkZWZhdWx0IFxuIjsKKyAgICBzdGQ6OmNlcnIgPDwgIlx0ICAgICAgICAgICAgICAgICAgICBFZzogYzIuYW5kcm9pZCAtIHRlc3QgY29kZWNzIHN0YXJ0aW5nIHdpdGggYzIuYW5kcm9pZCBcbiI7CisgICAgc3RkOjpjZXJyIDw8ICJcdCAgICAgICAgICAgICAgICAgICAgRWc6IGMyLmFuZHJvaWQuYWFjLmRlY29kZXIgLSB0ZXN0IGEgc3BlY2lmaWMgY29kZWMgXG4iOworICAgIHN0ZDo6Y2VyciA8PCAiXHQgLWgsICAtLWhlbHA6ICAgUHJpbnQgdXNhZ2UgXG4iOworfQorCit2b2lkIHBhcnNlQXJncyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBpbnQgYXJnOworICAgIGludCBvcHRpb25faW5kZXg7CisgICAgd2hpbGUgKChhcmcgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiOlA6cDpoIiwga0FyZ09wdGlvbnMsICZvcHRpb25faW5kZXgpKSAhPSAtMSkgeworICAgICAgICBzd2l0Y2ggKGFyZykgeworICAgICAgICAgICAgY2FzZSAnUCc6CisgICAgICAgICAgICAgICAgc1Jlc291cmNlRGlyID0gb3B0YXJnOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAncCc6CisgICAgICAgICAgICAgICAgc0NvbXBvbmVudE5hbWVQcmVmaXggPSBvcHRhcmc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgICAgICBwcmludFVzYWdlKGFyZ3ZbMF0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwogLy8gVGVzdCB0aGUgY29kZWNzIGZvciBOdWxsQnVmZmVyLCBFbXB0eSBJbnB1dCBCdWZmZXIgd2l0aChvdXQpIGZsYWdzIHNldAogdm9pZCB0ZXN0SW5wdXRCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAogICAgICAgICAgICAgICAgICAgICAgc3RkOjptdXRleCYgcXVldWVMb2NrLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCkBAIC05Miw4ICsxMzQsNyBAQAogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHVwZGF0ZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIEMyUGFyYW0qIHBhcmFtID0gdXBkYXRlc1tpXS5nZXQoKTsKICAgICAgICAgICAgIGlmIChwYXJhbS0+aW5kZXgoKSA9PSBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSB7Ci0gICAgICAgICAgICAgICAgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCogY3NkQnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0KikocGFyYW0pOworICAgICAgICAgICAgICAgIEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQqIGNzZEJ1ZmZlciA9IChDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0KikocGFyYW0pOwogICAgICAgICAgICAgICAgIHNpemVfdCBjc2RTaXplID0gY3NkQnVmZmVyLT5mbGV4Q291bnQoKTsKICAgICAgICAgICAgICAgICBpZiAoY3NkU2l6ZSA+IDApIGNzZCA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKChwYXJhbS0+aW5kZXgoKSA9PSBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpIHx8CkBAIC0xMTgsOCArMTU5LDcgQEAKICAgICAgICAgICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKICAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKICAgICAgICAgICAgIHdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKLSAgICAgICAgICAgIGlmICghZmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgotICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gZmx1c2hlZEluZGljZXMuZW5kKCkpKSB7CisgICAgICAgICAgICBpZiAoIWZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYgKGZyYW1lSW5kZXhJdCAhPSBmbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKICAgICAgICAgICAgICAgICBmbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcXVldWVDb25kaXRpb24ubm90aWZ5X2FsbCgpOwpAQCAtMTM2LDE1ICsxNzYsMTUgQEAKIH0KIAogLy8gUmV0dXJuIGFsbCB0ZXN0IHBhcmFtZXRlcnMsIGEgbGlzdCBvZiB0dXBsZSBvZiA8aW5zdGFuY2UsIGNvbXBvbmVudD4KLWNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4mIGdldFRlc3RQYXJhbWV0ZXJzKCkgeworY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdFBhcmFtZXRlcnM+JiBnZXRUZXN0UGFyYW1ldGVycygpIHsKICAgICByZXR1cm4gZ2V0VGVzdFBhcmFtZXRlcnMoQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUiwgQzJDb21wb25lbnQ6OktJTkRfT1RIRVIpOwogfQogCiAvLyBSZXR1cm4gYWxsIHRlc3QgcGFyYW1ldGVycywgYSBsaXN0IG9mIHR1cGxlIG9mIDxpbnN0YW5jZSwgY29tcG9uZW50PiB3aXRoIG1hdGNoaW5nIGRvbWFpbiBhbmQKIC8vIGtpbmQuCi1jb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+JiBnZXRUZXN0UGFyYW1ldGVycygKLSAgICAgICAgQzJDb21wb25lbnQ6OmRvbWFpbl90IGRvbWFpbiwgQzJDb21wb25lbnQ6OmtpbmRfdCBraW5kKSB7Ci0gICAgc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gcGFyYW1ldGVyczsKK2NvbnN0IHN0ZDo6dmVjdG9yPFRlc3RQYXJhbWV0ZXJzPiYgZ2V0VGVzdFBhcmFtZXRlcnMoQzJDb21wb25lbnQ6OmRvbWFpbl90IGRvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OmtpbmRfdCBraW5kKSB7CisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPFRlc3RQYXJhbWV0ZXJzPiBwYXJhbWV0ZXJzOwogCiAgICAgYXV0byBpbnN0YW5jZXMgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkdldFNlcnZpY2VOYW1lcygpOwogICAgIGZvciAoc3RkOjpzdHJpbmcgaW5zdGFuY2UgOiBpbnN0YW5jZXMpIHsKQEAgLTE1NywxMSArMTk3LDE4IEBACiAgICAgICAgICAgICAgICAgKHRyYWl0cy5kb21haW4gIT0gZG9tYWluIHx8IHRyYWl0cy5raW5kICE9IGtpbmQpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgIGlmICh0cmFpdHMubmFtZS5yZmluZChzQ29tcG9uZW50TmFtZVByZWZpeCwgMCkgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJTa2lwcGluZyB0ZXN0cyBmb3IgJXMuIFByZWZpeCBzcGVjaWZpZWQgaXMgJXMiLCB0cmFpdHMubmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgIHNDb21wb25lbnROYW1lUHJlZml4LmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcGFyYW1ldGVycy5wdXNoX2JhY2soc3RkOjptYWtlX3R1cGxlKGluc3RhbmNlLCB0cmFpdHMubmFtZSkpOwogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKHBhcmFtZXRlcnMuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiTm8gdGVzdCBwYXJhbWV0ZXJzIGFkZGVkLiBWZXJpZnkgY29tcG9uZW50IHByZWZpeCBwYXNzZWQgdG8gdGhlIHRlc3QiKTsKKyAgICB9CiAgICAgcmV0dXJuIHBhcmFtZXRlcnM7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgKaW5kZXggNTBlM2FjNS4uMjIyMmFhZiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgKQEAgLTQwLDcgKzQwLDE0IEBACiAKIHVzaW5nIG5hbWVzcGFjZSA6OnN0ZDo6Y2hyb25vOwogCi1zdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiBrVGVzdFBhcmFtZXRlcnM7Cit1c2luZyBUZXN0UGFyYW1ldGVycyA9IHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjsKK3N0YXRpYyBzdGQ6OnZlY3RvcjxUZXN0UGFyYW1ldGVycz4gZ1Rlc3RQYXJhbWV0ZXJzOworCisvLyBSZXNvdXJjZSBkaXJlY3RvcnkKK2V4dGVybiBzdGQ6OnN0cmluZyBzUmVzb3VyY2VEaXI7CisKKy8vIENvbXBvbmVudCBuYW1lIHByZWZpeAorZXh0ZXJuIHN0ZDo6c3RyaW5nIHNDb21wb25lbnROYW1lUHJlZml4OwogCiBzdHJ1Y3QgRnJhbWVJbmZvIHsKICAgICBpbnQgYnl0ZXNDb3VudDsKQEAgLTQ4LDYgKzU1LDE4IEBACiAgICAgaW50NjRfdCB0aW1lc3RhbXA7CiB9OwogCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVD4KK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgUHJpbnRJbnN0YW5jZVR1cGxlTmFtZVRvU3RyaW5nKAorICAgICAgICBjb25zdCB0ZXN0aW5nOjpUZXN0UGFyYW1JbmZvPHN0ZDo6dHVwbGU8VC4uLj4+JiBpbmZvKSB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgc3RkOjphcHBseShbJnNzXShhdXRvJiYuLi4gZWxlbXMpIHsgKChzcyA8PCBlbGVtcyA8PCAnXycpLCAuLi4pOyB9LCBpbmZvLnBhcmFtKTsKKyAgICBzcyA8PCBpbmZvLmluZGV4OworICAgIHN0ZDo6c3RyaW5nIHBhcmFtX3N0cmluZyA9IHNzLnN0cigpOworICAgIGF1dG8gaXNOb3RBbHBoYU51bSA9IFtdKGNoYXIgYykgeyByZXR1cm4gIXN0ZDo6aXNhbG51bShjKTsgfTsKKyAgICBzdGQ6OnJlcGxhY2VfaWYocGFyYW1fc3RyaW5nLmJlZ2luKCksIHBhcmFtX3N0cmluZy5lbmQoKSwgaXNOb3RBbHBoYU51bSwgJ18nKTsKKyAgICByZXR1cm4gcGFyYW1fc3RyaW5nOworfQorCiAvKgogICogSGFuZGxlIENhbGxiYWNrIGZ1bmN0aW9ucyBvbldvcmtEb25lKCksIG9uVHJpcHBlZCgpLAogICogb25FcnJvcigpLCBvbkRlYXRoKCksIG9uRnJhbWVzUmVuZGVyZWQoKQpAQCAtMTA1LDEzICsxMjQsMTUgQEAKICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKT4gY2FsbEJhY2s7CiB9OwogCit2b2lkIHBhcnNlQXJncyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpOworCiAvLyBSZXR1cm4gYWxsIHRlc3QgcGFyYW1ldGVycywgYSBsaXN0IG9mIHR1cGxlIG9mIDxpbnN0YW5jZSwgY29tcG9uZW50Pi4KLWNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4mIGdldFRlc3RQYXJhbWV0ZXJzKCk7Citjb25zdCBzdGQ6OnZlY3RvcjxUZXN0UGFyYW1ldGVycz4mIGdldFRlc3RQYXJhbWV0ZXJzKCk7CiAKIC8vIFJldHVybiBhbGwgdGVzdCBwYXJhbWV0ZXJzLCBhIGxpc3Qgb2YgdHVwbGUgb2YgPGluc3RhbmNlLCBjb21wb25lbnQ+IHdpdGggbWF0Y2hpbmcgZG9tYWluIGFuZAogLy8ga2luZC4KLWNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4mIGdldFRlc3RQYXJhbWV0ZXJzKAotICAgICAgICBDMkNvbXBvbmVudDo6ZG9tYWluX3QgZG9tYWluLCBDMkNvbXBvbmVudDo6a2luZF90IGtpbmQpOworY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdFBhcmFtZXRlcnM+JiBnZXRUZXN0UGFyYW1ldGVycyhDMkNvbXBvbmVudDo6ZG9tYWluX3QgZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6a2luZF90IGtpbmQpOwogCiAvKgogICogY29tbW9uIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvQW5kcm9pZC5icAppbmRleCA3ZWM2NGVlLi5jYzAxOWRhIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tcG9uZW50L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9BbmRyb2lkLmJwCkBAIC0xNCw5ICsxNCwxNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0IiwKICAgICBkZWZhdWx0czogWyJWdHNIYWxNZWRpYUMyVjFfMERlZmF1bHRzIl0sCiAgICAgc3JjczogWyJWdHNIYWxNZWRpYUMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwIl0sCiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0LmNwcAppbmRleCA2MTIyMjI1Li5mZmVjODk3IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tcG9uZW50L1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwCkBAIC01Myw5ICs1Myw4IEBACiAgICAgfQogCiBuYW1lc3BhY2UgewotCi1zdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+Ci0gICAgICAgIGtJbnB1dFRlc3RQYXJhbWV0ZXJzOwordXNpbmcgSW5wdXRUZXN0UGFyYW1ldGVycyA9IHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCB1aW50MzJfdCwgYm9vbD47CitzdGF0aWMgc3RkOjp2ZWN0b3I8SW5wdXRUZXN0UGFyYW1ldGVycz4gZ0lucHV0VGVzdFBhcmFtZXRlcnM7CiAKIC8vIGdvb2dsZS5jb2RlYzIgQ29tcG9uZW50IHRlc3Qgc2V0dXAKIGNsYXNzIENvZGVjMkNvbXBvbmVudEhpZGxUZXN0QmFzZSA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewpAQCAtMTIwLDkgKzExOSw4IEBACiAgICAgfQogfTsKIAotY2xhc3MgQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QKLSAgICA6IHB1YmxpYyBDb2RlYzJDb21wb25lbnRIaWRsVGVzdEJhc2UsCi0gICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiB7CitjbGFzcyBDb2RlYzJDb21wb25lbnRIaWRsVGVzdCA6IHB1YmxpYyBDb2RlYzJDb21wb25lbnRIaWRsVGVzdEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxUZXN0UGFyYW1ldGVycz4gewogICAgIHZvaWQgZ2V0UGFyYW1zKCkgewogICAgICAgICBtSW5zdGFuY2VOYW1lID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CiAgICAgICAgIG1Db21wb25lbnROYW1lID0gc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSk7CkBAIC0zMTcsMTAgKzMxNSw4IEBACiAgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOwogfQogCi1jbGFzcyBDb2RlYzJDb21wb25lbnRJbnB1dFRlc3RzCi0gICAgOiBwdWJsaWMgQ29kZWMyQ29tcG9uZW50SGlkbFRlc3RCYXNlLAotICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPAotICAgICAgICAgICAgICBzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4geworY2xhc3MgQ29kZWMyQ29tcG9uZW50SW5wdXRUZXN0cyA6IHB1YmxpYyBDb2RlYzJDb21wb25lbnRIaWRsVGVzdEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPElucHV0VGVzdFBhcmFtZXRlcnM+IHsKICAgICB2b2lkIGdldFBhcmFtcygpIHsKICAgICAgICAgbUluc3RhbmNlTmFtZSA9IHN0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpOwogICAgICAgICBtQ29tcG9uZW50TmFtZSA9IHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOwpAQCAtMzMwLDggKzMyNiw4IEBACiBURVNUX1AoQ29kZWMyQ29tcG9uZW50SW5wdXRUZXN0cywgSW5wdXRCdWZmZXJUZXN0KSB7CiAgICAgZGVzY3JpcHRpb24oIlRlc3RzIGZvciBkaWZmZXJlbnQgaW5wdXRzIik7CiAKLSAgICB1aW50MzJfdCBmbGFncyA9IHN0ZDo6c3RvdWwoc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSkpOwotICAgIGJvb2wgaXNOdWxsQnVmZmVyID0gIXN0ZDo6Z2V0PDM+KEdldFBhcmFtKCkpLmNvbXBhcmUoInRydWUiKTsKKyAgICB1aW50MzJfdCBmbGFncyA9IHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpOworICAgIGJvb2wgaXNOdWxsQnVmZmVyID0gc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSk7CiAgICAgaWYgKGlzTnVsbEJ1ZmZlcikKICAgICAgICAgQUxPR0QoIlRlc3RpbmcgZm9yIG51bGwgaW5wdXQgYnVmZmVyIHdpdGggZmxhZyA6ICV1IiwgZmxhZ3MpOwogICAgIGVsc2UKQEAgLTM0OSwzMiArMzQ1LDI5IEBACiAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnJlc2V0KCksIEMyX09LKTsKIH0KIAotSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFBlckluc3RhbmNlLCBDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgdGVzdGluZzo6VmFsdWVzSW4oa1Rlc3RQYXJhbWV0ZXJzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UHJpbnRJbnN0YW5jZVR1cGxlTmFtZVRvU3RyaW5nPD4pOworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFBlckluc3RhbmNlLCBDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgdGVzdGluZzo6VmFsdWVzSW4oZ1Rlc3RQYXJhbWV0ZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEluc3RhbmNlVHVwbGVOYW1lVG9TdHJpbmc8Pik7CiAKIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE5vblN0ZElucHV0cywgQ29kZWMyQ29tcG9uZW50SW5wdXRUZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlc0luKGtJbnB1dFRlc3RQYXJhbWV0ZXJzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpQcmludEluc3RhbmNlVHVwbGVOYW1lVG9TdHJpbmc8Pik7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpWYWx1ZXNJbihnSW5wdXRUZXN0UGFyYW1ldGVycyksIFByaW50SW5zdGFuY2VUdXBsZU5hbWVUb1N0cmluZzw+KTsKIH0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKIAogLy8gVE9ETzogQWRkIHRlc3QgZm9yIEludmFsaWQgd29yaywKIC8vIFRPRE86IEFkZCB0ZXN0IGZvciBJbnZhbGlkIHN0YXRlcwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gICAga1Rlc3RQYXJhbWV0ZXJzID0gZ2V0VGVzdFBhcmFtZXRlcnMoKTsKLSAgICBmb3IgKGF1dG8gcGFyYW1zIDoga1Rlc3RQYXJhbWV0ZXJzKSB7Ci0gICAgICAgIGtJbnB1dFRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgIjAiLCAidHJ1ZSIpKTsKLSAgICAgICAga0lucHV0VGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSwgInRydWUiKSk7Ci0gICAgICAgIGtJbnB1dFRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgIjAiLCAiZmFsc2UiKSk7Ci0gICAgICAgIGtJbnB1dFRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcoQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSwgImZhbHNlIikpOwotICAgICAgICBrSW5wdXRUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pLCAiZmFsc2UiKSk7CisgICAgcGFyc2VBcmdzKGFyZ2MsIGFyZ3YpOworICAgIGdUZXN0UGFyYW1ldGVycyA9IGdldFRlc3RQYXJhbWV0ZXJzKCk7CisgICAgZm9yIChhdXRvIHBhcmFtcyA6IGdUZXN0UGFyYW1ldGVycykgeworICAgICAgICBnSW5wdXRUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIDAsIHRydWUpKTsKKyAgICAgICAgZ0lucHV0VGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0sIHRydWUpKTsKKyAgICAgICAgZ0lucHV0VGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCAwLCBmYWxzZSkpOworICAgICAgICBnSW5wdXRUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHLCBmYWxzZSkpOworICAgICAgICBnSW5wdXRUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSwgZmFsc2UpKTsKICAgICB9CiAKICAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9tYXN0ZXIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9tYXN0ZXIvQW5kcm9pZC5icAppbmRleCA1M2UzMjNlLi40MGY1MjAxIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvbWFzdGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL21hc3Rlci9BbmRyb2lkLmJwCkBAIC0xNCw5ICsxNCwxNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRNYXN0ZXJUZXN0IiwKICAgICBkZWZhdWx0czogWyJWdHNIYWxNZWRpYUMyVjFfMERlZmF1bHRzIl0sCiAgICAgc3JjczogWyJWdHNIYWxNZWRpYUMyVjFfMFRhcmdldE1hc3RlclRlc3QuY3BwIl0sCiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL0FuZHJvaWQuYnAKaW5kZXggYzdiMGMxMi4uZjIxMWVjZiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJWdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdCIsCiAgICAgc3RlbTogInZ0c19tZWRpYV9jMl92MV8wX3ZpZGVvX2RlY190ZXN0IiwKQEAgLTQwLDQgKzQ5LDMgQEAKICAgICBkYXRhOiBbIjptZWRpYV9jMl92MV92aWRlb19lbmNvZGVfcmVzIl0sCiAgICAgdGVzdF9jb25maWc6ICJWdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdC54bWwiLAogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRWaWRlb0RlY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0VmlkZW9EZWNUZXN0LmNwcAppbmRleCAxMmVkNzI1Li44ZDkxN2IzIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRWaWRlb0RlY1Rlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdC5jcHAKQEAgLTI0LDcgKzI0LDYgQEAKIAogI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CiAKLSNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgogI2luY2x1ZGUgPEMyQnVmZmVyLmg+CiAjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CiAjaW5jbHVkZSA8QzJDb25maWcuaD4KQEAgLTM1LDE4ICszNCw0NyBAQAogI2luY2x1ZGUgPGd1aS9JUHJvZHVjZXJMaXN0ZW5lci5oPgogI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KIAotdXNpbmcgYW5kcm9pZDo6QzJBbGxvY2F0b3JJb247Ci0KICNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCiAjaW5jbHVkZSAibWVkaWFfYzJfdmlkZW9faGlkbF90ZXN0X2NvbW1vbi5oIgogCi1zdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+Ci0gICAgICAgIGtEZWNvZGVUZXN0UGFyYW1ldGVyczsKK3VzaW5nIERlY29kZVRlc3RQYXJhbWV0ZXJzID0gc3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpbnQzMl90LCBib29sPjsKK3N0YXRpYyBzdGQ6OnZlY3RvcjxEZWNvZGVUZXN0UGFyYW1ldGVycz4gZ0RlY29kZVRlc3RQYXJhbWV0ZXJzOwogCi1zdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4ga0NzZEZsdXNoVGVzdFBhcmFtZXRlcnM7Cit1c2luZyBDc2RGbHVzaFRlc3RQYXJhbWV0ZXJzID0gc3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIGJvb2w+Oworc3RhdGljIHN0ZDo6dmVjdG9yPENzZEZsdXNoVGVzdFBhcmFtZXRlcnM+IGdDc2RGbHVzaFRlc3RQYXJhbWV0ZXJzOwogCi0vLyBSZXNvdXJjZSBkaXJlY3RvcnkKLXN0YXRpYyBzdGQ6OnN0cmluZyBzUmVzb3VyY2VEaXIgPSAiIjsKK3N0cnVjdCBDb21wVG9VUkwgeworICAgIHN0ZDo6c3RyaW5nIG1pbWU7CisgICAgc3RkOjpzdHJpbmcgbVVSTDsKKyAgICBzdGQ6OnN0cmluZyBpbmZvOworICAgIHN0ZDo6c3RyaW5nIGNoa3N1bTsKK307CitzdGQ6OnZlY3RvcjxDb21wVG9VUkw+IGdDb21wVG9VUkwgPSB7CisgICAgICAgIHsiYXZjIiwgImJiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmgyNjQiLCAiYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaW5mbyIsCisgICAgICAgICAiYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHNfY2hrc3VtLm1kNSJ9LAorICAgICAgICB7ImF2YyIsICJiYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5oMjY0IiwgImJiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmluZm8iLAorICAgICAgICAgImJiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzX2Noa3N1bS5tZDUifSwKKyAgICAgICAgeyJoZXZjIiwgImJiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5oZXZjIiwgImJiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5pbmZvIiwKKyAgICAgICAgICJiYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHNfY2hrc3VtLm1kNSJ9LAorICAgICAgICB7ImhldmMiLCAiYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5oZXZjIiwgImJiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbyIsCisgICAgICAgICAiYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwc19jaGtzdW0ubWQ1In0sCisgICAgICAgIHsibXBlZzIiLCAiYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5tMnYiLCAiYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5pbmZvIiwKKyAgICAgICAgICIifSwKKyAgICAgICAgeyJtcGVnMiIsICJiYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5tMnYiLCAiYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMuaW5mbyIsICIifSwKKyAgICAgICAgeyIzZ3BwIiwgImJiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5oMjYzIiwgImJiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5pbmZvIiwgIiJ9LAorICAgICAgICB7Im1wNHYtZXMiLCAiYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5tNHYiLCAiYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5pbmZvIiwKKyAgICAgICAgICIifSwKKyAgICAgICAgeyJ2cDgiLCAiYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMudnA4IiwgImJiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLmluZm8iLCAiIn0sCisgICAgICAgIHsidnA4IiwgImJiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy52cDgiLCAiYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLmluZm8iLAorICAgICAgICAgImJiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwc19jaGtzbS5tZDUifSwKKyAgICAgICAgeyJ2cDkiLCAiYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMudnA5IiwgImJiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8iLCAiIn0sCisgICAgICAgIHsidnA5IiwgImJiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy52cDkiLCAiYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8iLAorICAgICAgICAgImJiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwc19jaGtzbS5tZDUifSwKKyAgICAgICAgeyJ2cDkiLCAiYmJiX3ZwOV83MDR4NDgwXzI4MGticHNfMjRmcHNfYWx0cmVmXzIudnA5IiwKKyAgICAgICAgICJiYmJfdnA5XzcwNHg0ODBfMjgwa2Jwc18yNGZwc19hbHRyZWZfMi5pbmZvIiwgIiJ9LAorICAgICAgICB7ImF2MDEiLCAiYmJiX2F2MV82NDBfMzYwLmF2MSIsICJiYmJfYXYxXzY0MF8zNjAuaW5mbyIsICJiYmJfYXYxXzY0MF8zNjBfY2hrc3VtLm1kNSJ9LAorICAgICAgICB7ImF2MDEiLCAiYmJiX2F2MV8xNzZfMTQ0LmF2MSIsICJiYmJfYXYxXzE3Nl8xNDQuaW5mbyIsICJiYmJfYXYxXzE3Nl8xNDRfY2hrc20ubWQ1In0sCit9OwogCiBjbGFzcyBMaW5lYXJCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgewogICBwdWJsaWM6CkBAIC04NSwyNiArMTEzLDExIEBACiAgICAgICAgIG1MaW5lYXJQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUxpbmVhckFsbG9jYXRvciwgbUJsb2NrUG9vbElkKyspOwogICAgICAgICBBU1NFUlRfTkUobUxpbmVhclBvb2wsIG51bGxwdHIpOwogCi0gICAgICAgIG1Db21wTmFtZSA9IHVua25vd25fY29tcDsKLSAgICAgICAgc3RydWN0IFN0cmluZ1RvTmFtZSB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lOwotICAgICAgICAgICAgc3RhbmRhcmRDb21wIENvbXBOYW1lOwotICAgICAgICB9OworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgICAgIG1Db21wb25lbnQtPnF1ZXJ5KHt9LCB7QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEV9LCBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgICAgIEFTU0VSVF9HVChxdWVyaWVkLnNpemUoKSwgMCk7CiAKLSAgICAgICAgY29uc3QgU3RyaW5nVG9OYW1lIGtTdHJpbmdUb05hbWVbXSA9IHsKLSAgICAgICAgICAgICAgICB7ImgyNjMiLCBoMjYzfSwgeyJhdmMiLCBhdmN9LCB7Im1wZWcyIiwgbXBlZzJ9LCB7Im1wZWc0IiwgbXBlZzR9LAotICAgICAgICAgICAgICAgIHsiaGV2YyIsIGhldmN9LCB7InZwOCIsIHZwOH0sIHsidnA5IiwgdnA5fSwgICAgIHsiYXYxIiwgYXYxfSwKLSAgICAgICAgfTsKLQotICAgICAgICBjb25zdCBzaXplX3Qga051bVN0cmluZ1RvTmFtZSA9IHNpemVvZihrU3RyaW5nVG9OYW1lKSAvIHNpemVvZihrU3RyaW5nVG9OYW1lWzBdKTsKLQotICAgICAgICAvLyBGaW5kIHRoZSBjb21wb25lbnQgdHlwZQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1TdHJpbmdUb05hbWU7ICsraSkgewotICAgICAgICAgICAgaWYgKHN0cmNhc2VzdHIobUNvbXBvbmVudE5hbWUuY19zdHIoKSwga1N0cmluZ1RvTmFtZVtpXS5OYW1lKSkgewotICAgICAgICAgICAgICAgIG1Db21wTmFtZSA9IGtTdHJpbmdUb05hbWVbaV0uQ29tcE5hbWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbU1pbWUgPSAoKEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0KilxdWVyaWVkWzBdLmdldCgpKS0+bS52YWx1ZTsKICAgICAgICAgbUVvcyA9IGZhbHNlOwogICAgICAgICBtRnJhbWVzUmVjZWl2ZWQgPSAwOwogICAgICAgICBtVGltZXN0YW1wVXMgPSAwdTsKQEAgLTExNCwxMSArMTI3LDExIEBACiAgICAgICAgIG1NZDVPZmZzZXQgPSAwOwogICAgICAgICBtTWQ1RW5hYmxlID0gZmFsc2U7CiAgICAgICAgIG1SZWZNZDUgPSBudWxscHRyOwotICAgICAgICBpZiAobUNvbXBOYW1lID09IHVua25vd25fY29tcCkgbURpc2FibGVUZXN0ID0gdHJ1ZTsKIAogICAgICAgICBDMlNlY3VyZU1vZGVUdW5pbmcgc2VjdXJlTW9kZVR1bmluZ3t9OwogICAgICAgICBtQ29tcG9uZW50LT5xdWVyeSh7JnNlY3VyZU1vZGVUdW5pbmd9LCB7fSwgQzJfTUFZX0JMT0NLLCBudWxscHRyKTsKLSAgICAgICAgaWYgKHNlY3VyZU1vZGVUdW5pbmcudmFsdWUgPT0gQzJDb25maWc6OlNNX1JFQURfUFJPVEVDVEVEKSB7CisgICAgICAgIGlmIChzZWN1cmVNb2RlVHVuaW5nLnZhbHVlID09IEMyQ29uZmlnOjpTTV9SRUFEX1BST1RFQ1RFRCB8fAorICAgICAgICAgICAgc2VjdXJlTW9kZVR1bmluZy52YWx1ZSA9PSBDMkNvbmZpZzo6U01fUkVBRF9QUk9URUNURURfV0lUSF9FTkNSWVBURUQpIHsKICAgICAgICAgICAgIG1EaXNhYmxlVGVzdCA9IHRydWU7CiAgICAgICAgIH0KIApAQCAtMTM2LDYgKzE0OSw5IEBACiAgICAgLy8gR2V0IHRoZSB0ZXN0IHBhcmFtZXRlcnMgZnJvbSBHZXRQYXJhbSBjYWxsLgogICAgIHZpcnR1YWwgdm9pZCBnZXRQYXJhbXMoKSB7fQogCisgICAgdm9pZCBHZXRVUkxDaGtzbUZvckNvbXBvbmVudChjaGFyKiBtVVJMLCBjaGFyKiBpbmZvLCBjaGFyKiBjaGtzdW0sIHNpemVfdCBzdHJlYW1JbmRleCk7CisgICAgdm9pZCBHZXRVUkxGb3JDb21wb25lbnQoY2hhciogbVVSTCwgY2hhciogaW5mbywgc2l6ZV90IHN0cmVhbUluZGV4ID0gMCk7CisKICAgICAvKiBDYWxjdWxhdGUgdGhlIENLU1VNIGZvciB0aGUgZGF0YSBpbiBpbmJ1ZiAqLwogICAgIHZvaWQgY2FsY19tZDVfY2tzdW0odWludDhfdCogcHUxX2luYnVmLCB1aW50MzJfdCB1NF9zdHJpZGUsIHVpbnQzMl90IHU0X3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdTRfaGVpZ2h0LCB1aW50OF90KiBwdTFfY2tzdW1fcCkgewpAQCAtMjIwLDggKzIzNiw3IEBACiAgICAgICAgICAgICAgICAgaWYgKCFjb2RlY0NvbmZpZyAmJiAhd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAobVJlb3JkZXJEZXB0aCA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEMyUG9ydFJlb3JkZXJCdWZmZXJEZXB0aFR1bmluZzo6b3V0cHV0IHJlb3JkZXJCdWZmZXJEZXB0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnQtPnF1ZXJ5KHsmcmVvcmRlckJ1ZmZlckRlcHRofSwge30sIEMyX01BWV9CTE9DSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudC0+cXVlcnkoeyZyZW9yZGVyQnVmZmVyRGVwdGh9LCB7fSwgQzJfTUFZX0JMT0NLLCBudWxscHRyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1SZW9yZGVyRGVwdGggPSByZW9yZGVyQnVmZmVyRGVwdGgudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJlb3JkZXJEZXB0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBBZGQgdmFsaWRhdGlvbiBmb3IgcmVvcmRlcmVkIG91dHB1dApAQCAtMjY3LDE4ICsyODIsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgZW51bSBzdGFuZGFyZENvbXAgewotICAgICAgICBoMjYzLAotICAgICAgICBhdmMsCi0gICAgICAgIG1wZWcyLAotICAgICAgICBtcGVnNCwKLSAgICAgICAgaGV2YywKLSAgICAgICAgdnA4LAotICAgICAgICB2cDksCi0gICAgICAgIGF2MSwKLSAgICAgICAgdW5rbm93bl9jb21wLAotICAgIH07Ci0KKyAgICBzdGQ6OnN0cmluZyBtTWltZTsKICAgICBzdGQ6OnN0cmluZyBtSW5zdGFuY2VOYW1lOwogICAgIHN0ZDo6c3RyaW5nIG1Db21wb25lbnROYW1lOwogCkBAIC0yOTEsNyArMjk1LDYgQEAKICAgICBjaGFyKiBtUmVmTWQ1OwogICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbVRpbWVzdGFtcFVzbGlzdDsKICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1GbHVzaGVkSW5kaWNlczsKLSAgICBzdGFuZGFyZENvbXAgbUNvbXBOYW1lOwogCiAgICAgaW50MzJfdCBtV29ya1Jlc3VsdDsKICAgICBpbnQzMl90IG1SZW9yZGVyRGVwdGg7CkBAIC0zMTQsOSArMzE3LDggQEAKICAgICB9CiB9OwogCi1jbGFzcyBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0Ci0gICAgOiBwdWJsaWMgQ29kZWMyVmlkZW9EZWNIaWRsVGVzdEJhc2UsCi0gICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiB7CitjbGFzcyBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0IDogcHVibGljIENvZGVjMlZpZGVvRGVjSGlkbFRlc3RCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxUZXN0UGFyYW1ldGVycz4gewogICAgIHZvaWQgZ2V0UGFyYW1zKCkgewogICAgICAgICBtSW5zdGFuY2VOYW1lID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CiAgICAgICAgIG1Db21wb25lbnROYW1lID0gc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSk7CkBAIC0zMjQsNyArMzI2LDcgQEAKIH07CiAKIHZvaWQgdmFsaWRhdGVDb21wb25lbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGJvb2wmIGRpc2FibGVUZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGRpc2FibGVUZXN0KSB7CiAgICAgLy8gVmFsaWRhdGUgaXRzIGEgQzIgQ29tcG9uZW50CiAgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImMyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKICAgICAgICAgQUxPR0UoIk5vdCBhIGMyIGNvbXBvbmVudCIpOwpAQCAtMzUxLDgzICszNTMsMzIgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KLQotICAgIC8vIFZhbGlkYXRlcyBjb21wb25lbnQgbmFtZQotICAgIGlmIChjb21wTmFtZSA9PSBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0Ojp1bmtub3duX2NvbXApIHsKLSAgICAgICAgQUxPR0UoIkNvbXBvbmVudCBJblZhbGlkIik7Ci0gICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KICAgICBBTE9HVigiQ29tcG9uZW50IFZhbGlkIik7CiB9CiAKIC8vIG51bWJlciBvZiBlbGVtZW50YXJ5IHN0cmVhbXMgcGVyIGNvbXBvbmVudAogI2RlZmluZSBTVFJFQU1fQ09VTlQgMwogLy8gTG9va1VwVGFibGUgb2YgY2xpcHMsIG1ldGFkYXRhIGFuZCBjaGtzdW0gZm9yIGNvbXBvbmVudCB0ZXN0aW5nCi12b2lkIEdldFVSTENoa3NtRm9yQ29tcG9uZW50KENvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wLCBjaGFyKiBtVVJMLCBjaGFyKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBjaGtzdW0sIHNpemVfdCBzdHJlYW1JbmRleCA9IDEpIHsKLSAgICBzdHJ1Y3QgQ29tcFRvVVJMIHsKLSAgICAgICAgQ29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXA7Ci0gICAgICAgIGNvbnN0IGNoYXIgbVVSTFtTVFJFQU1fQ09VTlRdWzUxMl07Ci0gICAgICAgIGNvbnN0IGNoYXIgaW5mb1tTVFJFQU1fQ09VTlRdWzUxMl07Ci0gICAgICAgIGNvbnN0IGNoYXIgY2hrc3VtW1NUUkVBTV9DT1VOVF1bNTEyXTsKLSAgICB9OwotICAgIEFTU0VSVF9UUlVFKHN0cmVhbUluZGV4IDwgU1RSRUFNX0NPVU5UKTsKLQotICAgIHN0YXRpYyBjb25zdCBDb21wVG9VUkwga0NvbXBUb1VSTFtdID0gewotICAgICAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YXZjLAotICAgICAgICAgICAgIHsiYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaDI2NCIsICJiYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5oMjY0IiwgIiJ9LAotICAgICAgICAgICAgIHsiYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaW5mbyIsICJiYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5pbmZvIiwgIiJ9LAotICAgICAgICAgICAgIHsiYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHNfY2hrc3VtLm1kNSIsCi0gICAgICAgICAgICAgICJiYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwc19jaGtzdW0ubWQ1IiwgIiJ9fSwKLSAgICAgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmhldmMsCi0gICAgICAgICAgICAgeyJiYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaGV2YyIsICJiYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmhldmMiLCAiIn0sCi0gICAgICAgICAgICAgeyJiYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaW5mbyIsICJiYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8iLCAiIn0sCi0gICAgICAgICAgICAgeyJiYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHNfY2hrc3VtLm1kNSIsCi0gICAgICAgICAgICAgICJiYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzX2Noa3N1bS5tZDUiLCAiIn19LAotICAgICAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6bXBlZzIsCi0gICAgICAgICAgICAgeyJiYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLm0ydiIsICJiYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5tMnYiLCAiIn0sCi0gICAgICAgICAgICAgeyJiYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLmluZm8iLCAiYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMuaW5mbyIsICIifSwKLSAgICAgICAgICAgICB7IiIsICIiLCAiIn19LAotICAgICAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6aDI2MywKLSAgICAgICAgICAgICB7IiIsICJiYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MyIsICIifSwKLSAgICAgICAgICAgICB7IiIsICJiYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaW5mbyIsICIifSwKLSAgICAgICAgICAgICB7IiIsICIiLCAiIn19LAotICAgICAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6bXBlZzQsCi0gICAgICAgICAgICAgeyIiLCAiYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5tNHYiLCAiIn0sCi0gICAgICAgICAgICAgeyIiLCAiYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5pbmZvIiwgIiJ9LAotICAgICAgICAgICAgIHsiIiwgIiIsICIifX0sCi0gICAgICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjp2cDgsCi0gICAgICAgICAgICAgeyJiYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy52cDgiLCAiYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLnZwOCIsICIifSwKLSAgICAgICAgICAgICB7ImJiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLmluZm8iLCAiYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLmluZm8iLCAiIn0sCi0gICAgICAgICAgICAgeyIiLCAiYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzX2Noa3NtLm1kNSIsICIifX0sCi0gICAgICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjp2cDksCi0gICAgICAgICAgICAgeyJiYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy52cDkiLCAiYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLnZwOSIsCi0gICAgICAgICAgICAgICJiYmJfdnA5XzcwNHg0ODBfMjgwa2Jwc18yNGZwc19hbHRyZWZfMi52cDkifSwKLSAgICAgICAgICAgICB7ImJiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8iLCAiYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8iLAotICAgICAgICAgICAgICAiYmJiX3ZwOV83MDR4NDgwXzI4MGticHNfMjRmcHNfYWx0cmVmXzIuaW5mbyJ9LAotICAgICAgICAgICAgIHsiIiwgImJiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwc19jaGtzbS5tZDUiLCAiIn19LAotICAgICAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YXYxLAotICAgICAgICAgICAgIHsiYmJiX2F2MV82NDBfMzYwLmF2MSIsICJiYmJfYXYxXzE3Nl8xNDQuYXYxIiwgIiJ9LAotICAgICAgICAgICAgIHsiYmJiX2F2MV82NDBfMzYwLmluZm8iLCAiYmJiX2F2MV8xNzZfMTQ0LmluZm8iLCAiIn0sCi0gICAgICAgICAgICAgeyJiYmJfYXYxXzY0MF8zNjBfY2hrc3VtLm1kNSIsICJiYmJfYXYxXzE3Nl8xNDRfY2hrc20ubWQ1IiwgIiJ9fSwKLSAgICB9OwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoa0NvbXBUb1VSTCkgLyBzaXplb2Yoa0NvbXBUb1VSTFswXSk7ICsraSkgewotICAgICAgICBpZiAoa0NvbXBUb1VSTFtpXS5jb21wID09IGNvbXApIHsKLSAgICAgICAgICAgIHN0cmNhdChtVVJMLCBrQ29tcFRvVVJMW2ldLm1VUkxbc3RyZWFtSW5kZXhdKTsKLSAgICAgICAgICAgIHN0cmNhdChpbmZvLCBrQ29tcFRvVVJMW2ldLmluZm9bc3RyZWFtSW5kZXhdKTsKLSAgICAgICAgICAgIHN0cmNhdChjaGtzdW0sIGtDb21wVG9VUkxbaV0uY2hrc3VtW3N0cmVhbUluZGV4XSk7Ci0gICAgICAgICAgICByZXR1cm47Cit2b2lkIENvZGVjMlZpZGVvRGVjSGlkbFRlc3RCYXNlOjpHZXRVUkxDaGtzbUZvckNvbXBvbmVudChjaGFyKiBtVVJMLCBjaGFyKiBpbmZvLCBjaGFyKiBjaGtzdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3RyZWFtSW5kZXgpIHsKKyAgICBpbnQgc3RyZWFtQ291bnQgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZ0NvbXBUb1VSTC5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAobU1pbWUuZmluZChnQ29tcFRvVVJMW2ldLm1pbWUpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBpZiAoc3RyZWFtQ291bnQgPT0gc3RyZWFtSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBzdHJjYXQobVVSTCwgZ0NvbXBUb1VSTFtpXS5tVVJMLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHN0cmNhdChpbmZvLCBnQ29tcFRvVVJMW2ldLmluZm8uY19zdHIoKSk7CisgICAgICAgICAgICAgICAgc3RyY2F0KGNoa3N1bSwgZ0NvbXBUb1VSTFtpXS5jaGtzdW0uY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyZWFtQ291bnQrKzsKICAgICAgICAgfQogICAgIH0KIH0KIAotdm9pZCBHZXRVUkxGb3JDb21wb25lbnQoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXAsIGNoYXIqIG1VUkwsIGNoYXIqIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3RyZWFtSW5kZXggPSAxKSB7Cit2b2lkIENvZGVjMlZpZGVvRGVjSGlkbFRlc3RCYXNlOjpHZXRVUkxGb3JDb21wb25lbnQoY2hhciogbVVSTCwgY2hhciogaW5mbywgc2l6ZV90IHN0cmVhbUluZGV4KSB7CiAgICAgY2hhciBjaGtzdW1bNTEyXTsKICAgICBzdHJjcHkoY2hrc3VtLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7Ci0gICAgR2V0VVJMQ2hrc21Gb3JDb21wb25lbnQoY29tcCwgbVVSTCwgaW5mbywgY2hrc3VtLCBzdHJlYW1JbmRleCk7CisgICAgR2V0VVJMQ2hrc21Gb3JDb21wb25lbnQobVVSTCwgaW5mbywgY2hrc3VtLCBzdHJlYW1JbmRleCk7CiB9CiAKIHZvaWQgZGVjb2RlTkZyYW1lcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCkBAIC01MTcsNyArNDY4LDcgQEAKIFRFU1RfUChDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LCB2YWxpZGF0ZUNvbXBOYW1lKSB7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgR1RFU1RfU0tJUCgpIDw8ICJUZXN0IGlzIGRpc2FibGVkIjsKICAgICBBTE9HVigiQ2hlY2tzIGlmIHRoZSBnaXZlbiBjb21wb25lbnQgaXMgYSB2YWxpZCB2aWRlbyBjb21wb25lbnQiKTsKLSAgICB2YWxpZGF0ZUNvbXBvbmVudChtQ29tcG9uZW50LCBtQ29tcE5hbWUsIG1EaXNhYmxlVGVzdCk7CisgICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbURpc2FibGVUZXN0KTsKICAgICBBU1NFUlRfRVEobURpc2FibGVUZXN0LCBmYWxzZSk7CiB9CiAKQEAgLTU3MywxMCArNTI0LDggQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWNsYXNzIENvZGVjMlZpZGVvRGVjRGVjb2RlVGVzdAotICAgIDogcHVibGljIENvZGVjMlZpZGVvRGVjSGlkbFRlc3RCYXNlLAotICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPAotICAgICAgICAgICAgICBzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4geworY2xhc3MgQ29kZWMyVmlkZW9EZWNEZWNvZGVUZXN0IDogcHVibGljIENvZGVjMlZpZGVvRGVjSGlkbFRlc3RCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPERlY29kZVRlc3RQYXJhbWV0ZXJzPiB7CiAgICAgdm9pZCBnZXRQYXJhbXMoKSB7CiAgICAgICAgIG1JbnN0YW5jZU5hbWUgPSBzdGQ6OmdldDwwPihHZXRQYXJhbSgpKTsKICAgICAgICAgbUNvbXBvbmVudE5hbWUgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKQEAgLTU4OCw4ICs1MzcsOCBAQAogICAgIGRlc2NyaXB0aW9uKCJEZWNvZGVzIGlucHV0IGZpbGUiKTsKICAgICBpZiAobURpc2FibGVUZXN0KSBHVEVTVF9TS0lQKCkgPDwgIlRlc3QgaXMgZGlzYWJsZWQiOwogCi0gICAgdWludDMyX3Qgc3RyZWFtSW5kZXggPSBzdGQ6OnN0b2koc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSkpOwotICAgIGJvb2wgc2lnbmFsRU9TID0gIXN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpLmNvbXBhcmUoInRydWUiKTsKKyAgICB1aW50MzJfdCBzdHJlYW1JbmRleCA9IHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpOworICAgIGJvb2wgc2lnbmFsRU9TID0gc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSk7CiAgICAgbVRpbWVzdGFtcERldlRlc3QgPSB0cnVlOwogCiAgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXSwgY2hrc3VtWzUxMl07CkBAIC01OTksNyArNTQ4LDcgQEAKICAgICBzdHJjcHkoaW5mbywgc1Jlc291cmNlRGlyLmNfc3RyKCkpOwogICAgIHN0cmNweShjaGtzdW0sIHNSZXNvdXJjZURpci5jX3N0cigpKTsKIAotICAgIEdldFVSTENoa3NtRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbywgY2hrc3VtLCBzdHJlYW1JbmRleCk7CisgICAgR2V0VVJMQ2hrc21Gb3JDb21wb25lbnQobVVSTCwgaW5mbywgY2hrc3VtLCBzdHJlYW1JbmRleCk7CiAgICAgaWYgKCEoc3RyY21wKG1VUkwsIHNSZXNvdXJjZURpci5jX3N0cigpKSkgfHwgIShzdHJjbXAoaW5mbywgc1Jlc291cmNlRGlyLmNfc3RyKCkpKSkgewogICAgICAgICBBTE9HVigiU2tpcHBpbmcgVGVzdCwgU3RyZWFtIG5vdCBhdmFpbGFibGUiKTsKICAgICAgICAgcmV0dXJuOwpAQCAtNjg4LDkgKzYzNywxMSBAQAogVEVTVF9QKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIEFkYXB0aXZlRGVjb2RlVGVzdCkgewogICAgIGRlc2NyaXB0aW9uKCJBZGFwdGl2ZSBEZWNvZGUgVGVzdCIpOwogICAgIGlmIChtRGlzYWJsZVRlc3QpIEdURVNUX1NLSVAoKSA8PCAiVGVzdCBpcyBkaXNhYmxlZCI7Ci0gICAgaWYgKCEobUNvbXBOYW1lID09IGF2YyB8fCBtQ29tcE5hbWUgPT0gaGV2YyB8fCBtQ29tcE5hbWUgPT0gdnA4IHx8IG1Db21wTmFtZSA9PSB2cDkgfHwKLSAgICAgICAgICBtQ29tcE5hbWUgPT0gbXBlZzIpKQorICAgIGlmICghKHN0cmNhc2VzdHIobU1pbWUuY19zdHIoKSwgImF2YyIpIHx8IHN0cmNhc2VzdHIobU1pbWUuY19zdHIoKSwgImhldmMiKSB8fAorICAgICAgICAgIHN0cmNhc2VzdHIobU1pbWUuY19zdHIoKSwgInZwOCIpIHx8IHN0cmNhc2VzdHIobU1pbWUuY19zdHIoKSwgInZwOSIpIHx8CisgICAgICAgICAgc3RyY2FzZXN0cihtTWltZS5jX3N0cigpLCAibXBlZzIiKSkpIHsKICAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOwpAQCAtNzA1LDcgKzY1Niw3IEBACiAKICAgICAgICAgc3RyY3B5KG1VUkwsIHNSZXNvdXJjZURpci5jX3N0cigpKTsKICAgICAgICAgc3RyY3B5KGluZm8sIHNSZXNvdXJjZURpci5jX3N0cigpKTsKLSAgICAgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbywgaSAlIFNUUkVBTV9DT1VOVCk7CisgICAgICAgIEdldFVSTEZvckNvbXBvbmVudChtVVJMLCBpbmZvLCBpICUgU1RSRUFNX0NPVU5UKTsKICAgICAgICAgaWYgKCEoc3RyY21wKG1VUkwsIHNSZXNvdXJjZURpci5jX3N0cigpKSkgfHwgIShzdHJjbXAoaW5mbywgc1Jlc291cmNlRGlyLmNfc3RyKCkpKSkgewogICAgICAgICAgICAgQUxPR1YoIlN0cmVhbSBub3QgYXZhaWxhYmxlLCBza2lwcGluZyB0aGlzIGluZGV4Iik7CiAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTczNCw3ICs2ODUsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHRpbWVzdGFtcE1heCA8IHRpbWVzdGFtcCkgdGltZXN0YW1wTWF4ID0gdGltZXN0YW1wOwogICAgICAgICB9Ci0gICAgICAgIHRpbWVzdGFtcE9mZnNldCA9IHRpbWVzdGFtcE1heDsKKyAgICAgICAgdGltZXN0YW1wT2Zmc2V0ID0gdGltZXN0YW1wTWF4ICsgMzMzMzM7CiAgICAgICAgIGVsZUluZm8uY2xvc2UoKTsKIAogICAgICAgICAvLyBSZXNldCBUb3RhbCBmcmFtZXMgYmVmb3JlIHNlY29uZCBkZWNvZGUgbG9vcApAQCAtODAxLDcgKzc1Miw3IEBACiAKICAgICBzdHJjcHkobVVSTCwgc1Jlc291cmNlRGlyLmNfc3RyKCkpOwogICAgIHN0cmNweShpbmZvLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7Ci0gICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1VUkwsIGluZm8pOwogCiAgICAgaW50MzJfdCBudW1Dc2RzID0gcG9wdWxhdGVJbmZvVmVjdG9yKGluZm8sICZJbmZvLCBtVGltZXN0YW1wRGV2VGVzdCwgJm1UaW1lc3RhbXBVc2xpc3QpOwogICAgIEFTU0VSVF9HRShudW1Dc2RzLCAwKSA8PCAiRXJyb3IgaW4gcGFyc2luZyBpbnB1dCBpbmZvIGZpbGU6ICIgPDwgaW5mbzsKQEAgLTg4OCw3ICs4MzksNyBAQAogCiAgICAgc3RyY3B5KG1VUkwsIHNSZXNvdXJjZURpci5jX3N0cigpKTsKICAgICBzdHJjcHkoaW5mbywgc1Jlc291cmNlRGlyLmNfc3RyKCkpOwotICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOworICAgIEdldFVSTEZvckNvbXBvbmVudChtVVJMLCBpbmZvKTsKIAogICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOwogCkBAIC05NjQsNyArOTE1LDcgQEAKIAogICAgIHN0cmNweShtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7CiAgICAgc3RyY3B5KGluZm8sIHNSZXNvdXJjZURpci5jX3N0cigpKTsKLSAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobVVSTCwgaW5mbyk7CiAKICAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CiAgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKSA8PCBtVVJMIDw8ICIgLSBmaWxlIG5vdCBmb3VuZCI7CkBAIC0xMDE3LDkgKzk2OCw4IEBACiAgICAgfQogfQogCi1jbGFzcyBDb2RlYzJWaWRlb0RlY0NzZElucHV0VGVzdHMKLSAgICA6IHB1YmxpYyBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0QmFzZSwKLSAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiB7CitjbGFzcyBDb2RlYzJWaWRlb0RlY0NzZElucHV0VGVzdHMgOiBwdWJsaWMgQ29kZWMyVmlkZW9EZWNIaWRsVGVzdEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8Q3NkRmx1c2hUZXN0UGFyYW1ldGVycz4gewogICAgIHZvaWQgZ2V0UGFyYW1zKCkgewogICAgICAgICBtSW5zdGFuY2VOYW1lID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CiAgICAgICAgIG1Db21wb25lbnROYW1lID0gc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSk7CkBAIC0xMDM4LDcgKzk4OCw3IEBACiAKICAgICBzdHJjcHkobVVSTCwgc1Jlc291cmNlRGlyLmNfc3RyKCkpOwogICAgIHN0cmNweShpbmZvLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7Ci0gICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1VUkwsIGluZm8pOwogCiAgICAgaW50MzJfdCBudW1Dc2RzID0gcG9wdWxhdGVJbmZvVmVjdG9yKGluZm8sICZJbmZvLCBtVGltZXN0YW1wRGV2VGVzdCwgJm1UaW1lc3RhbXBVc2xpc3QpOwogICAgIEFTU0VSVF9HRShudW1Dc2RzLCAwKSA8PCAiRXJyb3IgaW4gcGFyc2luZyBpbnB1dCBpbmZvIGZpbGUiOwpAQCAtMTA1Miw3ICsxMDAyLDcgQEAKICAgICBib29sIGZsdXNoZWREZWNvZGVyID0gZmFsc2U7CiAgICAgYm9vbCBzaWduYWxFT1MgPSBmYWxzZTsKICAgICBib29sIGtleUZyYW1lID0gZmFsc2U7Ci0gICAgYm9vbCBmbHVzaENzZCA9ICFzdGQ6OmdldDwyPihHZXRQYXJhbSgpKS5jb21wYXJlKCJ0cnVlIik7CisgICAgYm9vbCBmbHVzaENzZCA9IHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpOwogCiAgICAgQUxPR1YoInNlbmRpbmcgJWQgY3NkIGRhdGEgIiwgbnVtQ3Nkcyk7CiAgICAgaW50IGZyYW1lc1RvRGVjb2RlID0gbnVtQ3NkczsKQEAgLTExMjEsNTAgKzEwNzEsNDIgQEAKICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CiB9CiAKLUlOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChQZXJJbnN0YW5jZSwgQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCwgdGVzdGluZzo6VmFsdWVzSW4oa1Rlc3RQYXJhbWV0ZXJzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UHJpbnRJbnN0YW5jZVR1cGxlTmFtZVRvU3RyaW5nPD4pOworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFBlckluc3RhbmNlLCBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LCB0ZXN0aW5nOjpWYWx1ZXNJbihnVGVzdFBhcmFtZXRlcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50SW5zdGFuY2VUdXBsZU5hbWVUb1N0cmluZzw+KTsKIAogLy8gRGVjb2RlVGVzdCB3aXRoIFN0cmVhbUluZGV4IGFuZCBFT1MgLyBObyBFT1MKIElOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChTdHJlYW1JbmRleEFuZEVPUywgQ29kZWMyVmlkZW9EZWNEZWNvZGVUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlc0luKGtEZWNvZGVUZXN0UGFyYW1ldGVycyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlByaW50SW5zdGFuY2VUdXBsZU5hbWVUb1N0cmluZzw+KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpWYWx1ZXNJbihnRGVjb2RlVGVzdFBhcmFtZXRlcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50SW5zdGFuY2VUdXBsZU5hbWVUb1N0cmluZzw+KTsKIAogSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKENzZElucHV0cywgQ29kZWMyVmlkZW9EZWNDc2RJbnB1dFRlc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlc0luKGtDc2RGbHVzaFRlc3RQYXJhbWV0ZXJzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UHJpbnRJbnN0YW5jZVR1cGxlTmFtZVRvU3RyaW5nPD4pOworICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlc0luKGdDc2RGbHVzaFRlc3RQYXJhbWV0ZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEluc3RhbmNlVHVwbGVOYW1lVG9TdHJpbmc8Pik7CiAKIH0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKIAogLy8gVE9ETyA6IFZpZGVvIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gVGVzdAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gICAga1Rlc3RQYXJhbWV0ZXJzID0gZ2V0VGVzdFBhcmFtZXRlcnMoQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUik7Ci0gICAgZm9yIChhdXRvIHBhcmFtcyA6IGtUZXN0UGFyYW1ldGVycykgewotICAgICAgICBrRGVjb2RlVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCAiMCIsICJmYWxzZSIpKTsKLSAgICAgICAga0RlY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgIjAiLCAidHJ1ZSIpKTsKLSAgICAgICAga0RlY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgIjEiLCAiZmFsc2UiKSk7Ci0gICAgICAgIGtEZWNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksICIxIiwgInRydWUiKSk7Ci0gICAgICAgIGtEZWNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksICIyIiwgImZhbHNlIikpOwotICAgICAgICBrRGVjb2RlVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCAiMiIsICJ0cnVlIikpOworICAgIHBhcnNlQXJncyhhcmdjLCBhcmd2KTsKKyAgICBnVGVzdFBhcmFtZXRlcnMgPSBnZXRUZXN0UGFyYW1ldGVycyhDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLCBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSKTsKKyAgICBmb3IgKGF1dG8gcGFyYW1zIDogZ1Rlc3RQYXJhbWV0ZXJzKSB7CisgICAgICAgIGdEZWNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIDAsIGZhbHNlKSk7CisgICAgICAgIGdEZWNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIDAsIHRydWUpKTsKKyAgICAgICAgZ0RlY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgMSwgZmFsc2UpKTsKKyAgICAgICAgZ0RlY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgMSwgdHJ1ZSkpOworICAgICAgICBnRGVjb2RlVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCAyLCBmYWxzZSkpOworICAgICAgICBnRGVjb2RlVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCAyLCB0cnVlKSk7CiAKLSAgICAgICAga0NzZEZsdXNoVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCAidHJ1ZSIpKTsKLSAgICAgICAga0NzZEZsdXNoVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCAiZmFsc2UiKSk7Ci0gICAgfQotCi0gICAgLy8gU2V0IHRoZSByZXNvdXJjZSBkaXJlY3RvcnkgYmFzZWQgb24gY29tbWFuZCBsaW5lIGFyZ3MuCi0gICAgLy8gVGVzdCB3aWxsIGZhaWwgdG8gc2V0IHVwIGlmIHRoZSBhcmd1bWVudCBpcyBub3Qgc2V0LgotICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7Ci0gICAgICAgIGlmIChzdHJjbXAoYXJndltpXSwgIi1QIikgPT0gMCAmJiBpIDwgYXJnYyAtIDEpIHsKLSAgICAgICAgICAgIHNSZXNvdXJjZURpciA9IGFyZ3ZbaSArIDFdOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKyAgICAgICAgZ0NzZEZsdXNoVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCB0cnVlKSk7CisgICAgICAgIGdDc2RGbHVzaFRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgZmFsc2UpKTsKICAgICB9CiAKICAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRWaWRlb0VuY1Rlc3QuY3BwCmluZGV4IGVjYWYzYTguLmRmZDY0OWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0LmNwcApAQCAtMjMsMTUgKzIzLDEyIEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxmc3RyZWFtPgogCi0jaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KICNpbmNsdWRlIDxDMkJ1ZmZlci5oPgogI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgogI2luY2x1ZGUgPEMyQ29uZmlnLmg+CiAjaW5jbHVkZSA8QzJEZWJ1Zy5oPgogI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgogCi11c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKLQogI2luY2x1ZGUgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCIKICNpbmNsdWRlICJtZWRpYV9jMl92aWRlb19oaWRsX3Rlc3RfY29tbW9uLmgiCiAKQEAgLTQxLDEzICszOCwxMSBAQAogICAgICAgICA6IEMyQnVmZmVyKHtibG9jay0+c2hhcmUoQzJSZWN0KGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCkpLCA6OkMyRmVuY2UoKSl9KSB7fQogfTsKIAotc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4KLSAgICAgICAga0VuY29kZVRlc3RQYXJhbWV0ZXJzOwotc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PgotICAgICAgICBrRW5jb2RlUmVzb2x1dGlvblRlc3RQYXJhbWV0ZXJzOwordXNpbmcgRW5jb2RlVGVzdFBhcmFtZXRlcnMgPSBzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgYm9vbCwgYm9vbCwgYm9vbD47CitzdGF0aWMgc3RkOjp2ZWN0b3I8RW5jb2RlVGVzdFBhcmFtZXRlcnM+IGdFbmNvZGVUZXN0UGFyYW1ldGVyczsKIAotLy8gUmVzb3VyY2UgZGlyZWN0b3J5Ci1zdGF0aWMgc3RkOjpzdHJpbmcgc1Jlc291cmNlRGlyID0gIiI7Cit1c2luZyBFbmNvZGVSZXNvbHV0aW9uVGVzdFBhcmFtZXRlcnMgPSBzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgaW50MzJfdCwgaW50MzJfdD47CitzdGF0aWMgc3RkOjp2ZWN0b3I8RW5jb2RlUmVzb2x1dGlvblRlc3RQYXJhbWV0ZXJzPiBnRW5jb2RlUmVzb2x1dGlvblRlc3RQYXJhbWV0ZXJzOwogCiBuYW1lc3BhY2UgewogCkBAIC03OCwyNiArNzMsMTMgQEAKICAgICAgICAgbUdyYXBoaWNQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUdyYXBoaWNBbGxvY2F0b3IsIG1CbG9ja1Bvb2xJZCsrKTsKICAgICAgICAgQVNTRVJUX05FKG1HcmFwaGljUG9vbCwgbnVsbHB0cik7CiAKLSAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOwotICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7Ci0gICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7Ci0gICAgICAgIH07CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICAgICAgbUNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEV9LCBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVlcmllZCk7CisgICAgICAgIEFTU0VSVF9HVChxdWVyaWVkLnNpemUoKSwgMCk7CiAKLSAgICAgICAgY29uc3QgU3RyaW5nVG9OYW1lIGtTdHJpbmdUb05hbWVbXSA9IHsKLSAgICAgICAgICAgICAgICB7ImgyNjMiLCBoMjYzfSwgeyJhdmMiLCBhdmN9LCB7Im1wZWc0IiwgbXBlZzR9LAotICAgICAgICAgICAgICAgIHsiaGV2YyIsIGhldmN9LCB7InZwOCIsIHZwOH0sIHsidnA5IiwgdnA5fSwKLSAgICAgICAgfTsKLQotICAgICAgICBjb25zdCBzaXplX3Qga051bVN0cmluZ1RvTmFtZSA9IHNpemVvZihrU3RyaW5nVG9OYW1lKSAvIHNpemVvZihrU3RyaW5nVG9OYW1lWzBdKTsKLQotICAgICAgICAvLyBGaW5kIHRoZSBjb21wb25lbnQgdHlwZQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1TdHJpbmdUb05hbWU7ICsraSkgewotICAgICAgICAgICAgaWYgKHN0cmNhc2VzdHIobUNvbXBvbmVudE5hbWUuY19zdHIoKSwga1N0cmluZ1RvTmFtZVtpXS5OYW1lKSkgewotICAgICAgICAgICAgICAgIG1Db21wTmFtZSA9IGtTdHJpbmdUb05hbWVbaV0uQ29tcE5hbWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbU1pbWUgPSAoKEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dCopcXVlcmllZFswXS5nZXQoKSktPm0udmFsdWU7CisgICAgICAgIHN0ZDo6Y291dCA8PCAibWltZSA6ICIgPDwgbU1pbWUgPDwgIlxuIjsKICAgICAgICAgbUVvcyA9IGZhbHNlOwogICAgICAgICBtQ3NkID0gZmFsc2U7CiAgICAgICAgIG1Db25maWdCUGljdHVyZXMgPSBmYWxzZTsKQEAgLTEwNiw3ICs4OCwxNCBAQAogICAgICAgICBtVGltZXN0YW1wVXMgPSAwdTsKICAgICAgICAgbU91dHB1dFNpemUgPSAwdTsKICAgICAgICAgbVRpbWVzdGFtcERldlRlc3QgPSBmYWxzZTsKLSAgICAgICAgaWYgKG1Db21wTmFtZSA9PSB1bmtub3duX2NvbXApIG1EaXNhYmxlVGVzdCA9IHRydWU7CisKKyAgICAgICAgQzJTZWN1cmVNb2RlVHVuaW5nIHNlY3VyZU1vZGVUdW5pbmd7fTsKKyAgICAgICAgbUNvbXBvbmVudC0+cXVlcnkoeyZzZWN1cmVNb2RlVHVuaW5nfSwge30sIEMyX01BWV9CTE9DSywgbnVsbHB0cik7CisgICAgICAgIGlmIChzZWN1cmVNb2RlVHVuaW5nLnZhbHVlID09IEMyQ29uZmlnOjpTTV9SRUFEX1BST1RFQ1RFRCB8fAorICAgICAgICAgICAgc2VjdXJlTW9kZVR1bmluZy52YWx1ZSA9PSBDMkNvbmZpZzo6U01fUkVBRF9QUk9URUNURURfV0lUSF9FTkNSWVBURUQpIHsKKyAgICAgICAgICAgIG1EaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIH0KKwogICAgICAgICBpZiAobURpc2FibGVUZXN0KSBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKICAgICB9CiAKQEAgLTE4MCwxNiArMTY5LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGVudW0gc3RhbmRhcmRDb21wIHsKLSAgICAgICAgaDI2MywKLSAgICAgICAgYXZjLAotICAgICAgICBtcGVnNCwKLSAgICAgICAgaGV2YywKLSAgICAgICAgdnA4LAotICAgICAgICB2cDksCi0gICAgICAgIHVua25vd25fY29tcCwKLSAgICB9OwotCisgICAgc3RkOjpzdHJpbmcgbU1pbWU7CiAgICAgc3RkOjpzdHJpbmcgbUluc3RhbmNlTmFtZTsKICAgICBzdGQ6OnN0cmluZyBtQ29tcG9uZW50TmFtZTsKICAgICBib29sIG1Fb3M7CkBAIC0xOTcsNyArMTc3LDYgQEAKICAgICBib29sIG1EaXNhYmxlVGVzdDsKICAgICBib29sIG1Db25maWdCUGljdHVyZXM7CiAgICAgYm9vbCBtVGltZXN0YW1wRGV2VGVzdDsKLSAgICBzdGFuZGFyZENvbXAgbUNvbXBOYW1lOwogICAgIHVpbnQzMl90IG1GcmFtZXNSZWNlaXZlZDsKICAgICB1aW50MzJfdCBtRmFpbGVkV29ya1JlY2VpdmVkOwogICAgIHVpbnQ2NF90IG1UaW1lc3RhbXBVczsKQEAgLTIyNCw5ICsyMDMsOCBAQAogICAgIH0KIH07CiAKLWNsYXNzIENvZGVjMlZpZGVvRW5jSGlkbFRlc3QKLSAgICA6IHB1YmxpYyBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0QmFzZSwKLSAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IHsKK2NsYXNzIENvZGVjMlZpZGVvRW5jSGlkbFRlc3QgOiBwdWJsaWMgQ29kZWMyVmlkZW9FbmNIaWRsVGVzdEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPFRlc3RQYXJhbWV0ZXJzPiB7CiAgICAgdm9pZCBnZXRQYXJhbXMoKSB7CiAgICAgICAgIG1JbnN0YW5jZU5hbWUgPSBzdGQ6OmdldDwwPihHZXRQYXJhbSgpKTsKICAgICAgICAgbUNvbXBvbmVudE5hbWUgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKQEAgLTIzNCw3ICsyMTIsNyBAQAogfTsKIAogdm9pZCB2YWxpZGF0ZUNvbXBvbmVudChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIENvZGVjMlZpZGVvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wTmFtZSwgYm9vbCYgZGlzYWJsZVRlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgZGlzYWJsZVRlc3QpIHsKICAgICAvLyBWYWxpZGF0ZSBpdHMgYSBDMiBDb21wb25lbnQKICAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiYzIiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgewogICAgICAgICBBTE9HRSgiTm90IGEgYzIgY29tcG9uZW50Iik7CkBAIC0yNjEsMTMgKzIzOSw2IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICAvLyBWYWxpZGF0ZXMgY29tcG9uZW50IG5hbWUKLSAgICBpZiAoY29tcE5hbWUgPT0gQ29kZWMyVmlkZW9FbmNIaWRsVGVzdDo6dW5rbm93bl9jb21wKSB7Ci0gICAgICAgIEFMT0dFKCJDb21wb25lbnQgSW5WYWxpZCIpOwotICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CiAgICAgQUxPR1YoIkNvbXBvbmVudCBWYWxpZCIpOwogfQogCkBAIC0zOTgsMTQgKzM2OSwxMiBAQAogVEVTVF9QKENvZGVjMlZpZGVvRW5jSGlkbFRlc3QsIHZhbGlkYXRlQ29tcE5hbWUpIHsKICAgICBpZiAobURpc2FibGVUZXN0KSBHVEVTVF9TS0lQKCkgPDwgIlRlc3QgaXMgZGlzYWJsZWQiOwogICAgIEFMT0dWKCJDaGVja3MgaWYgdGhlIGdpdmVuIGNvbXBvbmVudCBpcyBhIHZhbGlkIHZpZGVvIGNvbXBvbmVudCIpOwotICAgIHZhbGlkYXRlQ29tcG9uZW50KG1Db21wb25lbnQsIG1Db21wTmFtZSwgbURpc2FibGVUZXN0KTsKKyAgICB2YWxpZGF0ZUNvbXBvbmVudChtQ29tcG9uZW50LCBtRGlzYWJsZVRlc3QpOwogICAgIEFTU0VSVF9FUShtRGlzYWJsZVRlc3QsIGZhbHNlKTsKIH0KIAotY2xhc3MgQ29kZWMyVmlkZW9FbmNFbmNvZGVUZXN0Ci0gICAgOiBwdWJsaWMgQ29kZWMyVmlkZW9FbmNIaWRsVGVzdEJhc2UsCi0gICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8Ci0gICAgICAgICAgICAgIHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4geworY2xhc3MgQ29kZWMyVmlkZW9FbmNFbmNvZGVUZXN0IDogcHVibGljIENvZGVjMlZpZGVvRW5jSGlkbFRlc3RCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPEVuY29kZVRlc3RQYXJhbWV0ZXJzPiB7CiAgICAgdm9pZCBnZXRQYXJhbXMoKSB7CiAgICAgICAgIG1JbnN0YW5jZU5hbWUgPSBzdGQ6OmdldDwwPihHZXRQYXJhbSgpKTsKICAgICAgICAgbUNvbXBvbmVudE5hbWUgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKQEAgLTQxOSwxMCArMzg4LDEwIEBACiAgICAgY2hhciBtVVJMWzUxMl07CiAgICAgaW50MzJfdCBuV2lkdGggPSBFTkNfREVGQVVMVF9GUkFNRV9XSURUSDsKICAgICBpbnQzMl90IG5IZWlnaHQgPSBFTkNfREVGQVVMVF9GUkFNRV9IRUlHSFQ7Ci0gICAgYm9vbCBzaWduYWxFT1MgPSAhc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSkuY29tcGFyZSgidHJ1ZSIpOworICAgIGJvb2wgc2lnbmFsRU9TID0gc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSk7CiAgICAgLy8gU2VuZCBhbiBlbXB0eSBmcmFtZSB0byByZWNlaXZlIENTRCBkYXRhIGZyb20gZW5jb2Rlci4KLSAgICBib29sIHNlbmRFbXB0eUZpcnN0RnJhbWUgPSAhc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSkuY29tcGFyZSgidHJ1ZSIpOwotICAgIG1Db25maWdCUGljdHVyZXMgPSAhc3RkOjpnZXQ8ND4oR2V0UGFyYW0oKSkuY29tcGFyZSgidHJ1ZSIpOworICAgIGJvb2wgc2VuZEVtcHR5Rmlyc3RGcmFtZSA9IHN0ZDo6Z2V0PDM+KEdldFBhcmFtKCkpOworICAgIG1Db25maWdCUGljdHVyZXMgPSBzdGQ6OmdldDw0PihHZXRQYXJhbSgpKTsKIAogICAgIHN0cmNweShtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7CiAgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1VUkwpOwpAQCAtNTEwLDkgKzQ3OSw5IEBACiAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKICAgICB9CiAKLSAgICBpZiAobUNvbXBOYW1lID09IHZwOCB8fCBtQ29tcE5hbWUgPT0gaDI2MykgeworICAgIGlmICgobU1pbWUuZmluZCgidnA4IikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHx8IChtTWltZS5maW5kKCIzZ3BwIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpKSB7CiAgICAgICAgIEFTU0VSVF9GQUxTRShtQ3NkKSA8PCAiQ1NEIEJ1ZmZlciBub3QgZXhwZWN0ZWQiOwotICAgIH0gZWxzZSBpZiAobUNvbXBOYW1lICE9IHZwOSkgeworICAgIH0gZWxzZSBpZiAobU1pbWUuZmluZCgidnA5IikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKICAgICAgICAgQVNTRVJUX1RSVUUobUNzZCkgPDwgIkNTRCBCdWZmZXIgbm90IHJlY2VpdmVkIjsKICAgICB9CiAKQEAgLTY5MCw4ICs2NTksNyBAQAogCiBjbGFzcyBDb2RlYzJWaWRlb0VuY1Jlc29sdXRpb25UZXN0CiAgICAgOiBwdWJsaWMgQ29kZWMyVmlkZW9FbmNIaWRsVGVzdEJhc2UsCi0gICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8Ci0gICAgICAgICAgICAgIHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiB7CisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8RW5jb2RlUmVzb2x1dGlvblRlc3RQYXJhbWV0ZXJzPiB7CiAgICAgdm9pZCBnZXRQYXJhbXMoKSB7CiAgICAgICAgIG1JbnN0YW5jZU5hbWUgPSBzdGQ6OmdldDwwPihHZXRQYXJhbSgpKTsKICAgICAgICAgbUNvbXBvbmVudE5hbWUgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKQEAgLTcwMyw4ICs2NzEsOCBAQAogICAgIGlmIChtRGlzYWJsZVRlc3QpIEdURVNUX1NLSVAoKSA8PCAiVGVzdCBpcyBkaXNhYmxlZCI7CiAKICAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKLSAgICBpbnQzMl90IG5XaWR0aCA9IHN0ZDo6c3RvaShzdGQ6OmdldDwyPihHZXRQYXJhbSgpKSk7Ci0gICAgaW50MzJfdCBuSGVpZ2h0ID0gc3RkOjpzdG9pKHN0ZDo6Z2V0PDM+KEdldFBhcmFtKCkpKTsKKyAgICBpbnQzMl90IG5XaWR0aCA9IHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpOworICAgIGludDMyX3QgbkhlaWdodCA9IHN0ZDo6Z2V0PDM+KEdldFBhcmFtKCkpOwogICAgIEFMT0dEKCJUcnlpbmcgZW5jb2RlIGZvciB3aWR0aCAlZCBoZWlnaHQgJWQiLCBuV2lkdGgsIG5IZWlnaHQpOwogICAgIG1Fb3MgPSBmYWxzZTsKIApAQCAtNzM1LDE1ICs3MDMsMTcgQEAKICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cmVzZXQoKSwgQzJfT0spOwogfQogCi1JTlNUQU5USUFURV9URVNUX1NVSVRFX1AoUGVySW5zdGFuY2UsIENvZGVjMlZpZGVvRW5jSGlkbFRlc3QsIHRlc3Rpbmc6OlZhbHVlc0luKGtUZXN0UGFyYW1ldGVycyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlByaW50SW5zdGFuY2VUdXBsZU5hbWVUb1N0cmluZzw+KTsKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChQZXJJbnN0YW5jZSwgQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgdGVzdGluZzo6VmFsdWVzSW4oZ1Rlc3RQYXJhbWV0ZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEluc3RhbmNlVHVwbGVOYW1lVG9TdHJpbmc8Pik7CiAKIElOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChOb25TdGRTaXplcywgQ29kZWMyVmlkZW9FbmNSZXNvbHV0aW9uVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKGtFbmNvZGVSZXNvbHV0aW9uVGVzdFBhcmFtZXRlcnMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKGdFbmNvZGVSZXNvbHV0aW9uVGVzdFBhcmFtZXRlcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50SW5zdGFuY2VUdXBsZU5hbWVUb1N0cmluZzw+KTsKIAogLy8gRW5jb2RlVGVzdCB3aXRoIEVPUyAvIE5vIEVPUwogSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKEVuY29kZVRlc3R3aXRoRU9TLCBDb2RlYzJWaWRlb0VuY0VuY29kZVRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXNJbihrRW5jb2RlVGVzdFBhcmFtZXRlcnMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKGdFbmNvZGVUZXN0UGFyYW1ldGVycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRJbnN0YW5jZVR1cGxlTmFtZVRvU3RyaW5nPD4pOwogCiBURVNUX1AoQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgQWRhcHRpdmVCaXRyYXRlVGVzdCkgewogICAgIGRlc2NyaXB0aW9uKCJFbmNvZGVzIGlucHV0IGZpbGUgZm9yIGRpZmZlcmVudCBiaXRyYXRlcyIpOwpAQCAtODM0LDM4ICs4MDQsMjYgQEAKIH0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gICAga1Rlc3RQYXJhbWV0ZXJzID0gZ2V0VGVzdFBhcmFtZXRlcnMoQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywgQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUik7Ci0gICAgZm9yIChhdXRvIHBhcmFtcyA6IGtUZXN0UGFyYW1ldGVycykgewotICAgICAgICBjb25zdGV4cHIgY2hhciBjb25zdCoga0Jvb2xTdHJpbmdbXSA9IHsgImZhbHNlIiwgInRydWUiIH07CisgICAgcGFyc2VBcmdzKGFyZ2MsIGFyZ3YpOworICAgIGdUZXN0UGFyYW1ldGVycyA9IGdldFRlc3RQYXJhbWV0ZXJzKEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sIEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIpOworICAgIGZvciAoYXV0byBwYXJhbXMgOiBnVGVzdFBhcmFtZXRlcnMpIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxIDw8IDM7ICsraSkgewotICAgICAgICAgICAga0VuY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjayhzdGQ6Om1ha2VfdHVwbGUoCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksCi0gICAgICAgICAgICAgICAgICAgIGtCb29sU3RyaW5nW2kgJiAxXSwKLSAgICAgICAgICAgICAgICAgICAga0Jvb2xTdHJpbmdbKGkgPj4gMSkgJiAxXSwKLSAgICAgICAgICAgICAgICAgICAga0Jvb2xTdHJpbmdbKGkgPj4gMikgJiAxXSkpOworICAgICAgICAgICAgZ0VuY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjayhzdGQ6Om1ha2VfdHVwbGUoCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIGkgJiAxLCAoaSA+PiAxKSAmIDEsIChpID4+IDIpICYgMSkpOwogICAgICAgICB9CiAKLSAgICAgICAga0VuY29kZVJlc29sdXRpb25UZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksICI1MiIsICIxOCIpKTsKLSAgICAgICAga0VuY29kZVJlc29sdXRpb25UZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksICIzNjUiLCAiMzY1IikpOwotICAgICAgICBrRW5jb2RlUmVzb2x1dGlvblRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgIjQ4NCIsICIzNjIiKSk7Ci0gICAgICAgIGtFbmNvZGVSZXNvbHV0aW9uVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCAiMjQ0IiwgIjQ4OCIpKTsKLSAgICAgICAga0VuY29kZVJlc29sdXRpb25UZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksICI4NTIiLCAiNjA4IikpOwotICAgICAgICBrRW5jb2RlUmVzb2x1dGlvblRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgIjE0MDAiLCAiNDQyIikpOwotICAgIH0KLQotICAgIC8vIFNldCB0aGUgcmVzb3VyY2UgZGlyZWN0b3J5IGJhc2VkIG9uIGNvbW1hbmQgbGluZSBhcmdzLgotICAgIC8vIFRlc3Qgd2lsbCBmYWlsIHRvIHNldCB1cCBpZiB0aGUgYXJndW1lbnQgaXMgbm90IHNldC4KLSAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgewotICAgICAgICBpZiAoc3RyY21wKGFyZ3ZbaV0sICItUCIpID09IDAgJiYgaSA8IGFyZ2MgLSAxKSB7Ci0gICAgICAgICAgICBzUmVzb3VyY2VEaXIgPSBhcmd2W2kgKyAxXTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgICAgIGdFbmNvZGVSZXNvbHV0aW9uVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCA1MiwgMTgpKTsKKyAgICAgICAgZ0VuY29kZVJlc29sdXRpb25UZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIDM2NSwgMzY1KSk7CisgICAgICAgIGdFbmNvZGVSZXNvbHV0aW9uVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCA0ODQsIDM2MikpOworICAgICAgICBnRW5jb2RlUmVzb2x1dGlvblRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgMjQ0LCA0ODgpKTsKKyAgICAgICAgZ0VuY29kZVJlc29sdXRpb25UZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIDg1MiwgNjA4KSk7CisgICAgICAgIGdFbmNvZGVSZXNvbHV0aW9uVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCAxNDAwLCA0NDIpKTsKICAgICB9CiAKICAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4xL3V0aWxzL0FuZHJvaWQuYnAKaW5kZXggMzg2ZjZlMi4uODM5YTkxMCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4xL3V0aWxzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4xL3V0aWxzL0FuZHJvaWQuYnAKQEAgLTEsNSArMSwxNCBAQAogLy8gRE8gTk9UIERFUEVORCBPTiBUSElTIERJUkVDVExZCiAvLyB1c2UgbGliY29kZWMyLWhpZGwtY2xpZW50LWRlZmF1bHRzIGluc3RlYWQKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9oaWRsX2NsaWVudEAxLjEiLAogCkBAIC00NCw2ICs1MywxMiBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAuMSIsCiAgICAgICAgICJsaWJ1aSIsCiAgICAgXSwKKworICAgIC8vIERldmljZSBkb2VzIG5vdCBib290IHdoZW4gZ2xvYmFsIFRoaW5MVE8gaXMgZW5hYmxlZCBmb3IgdGhpcyBsaWJyYXJ5LgorICAgIC8vIGh0dHA6Ly9iLzE3MDU5NTQyOQorICAgIGx0bzogeworICAgICAgICBuZXZlcjogdHJ1ZSwKKyAgICB9LAogfQogCiAKQEAgLTg1LDYgKzEwMCw3IEBACiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmNvZGVjMiIsCiAgICAgICAgICJsaWJjb2RlYzJfaGlkbEAxLjAiLAorICAgICAgICAibGliY29kZWMyX2hpZGxfcGx1Z2luX3N0dWIiLAogICAgICAgICAibGliY29kZWMyX3ZuZGsiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKQEAgLTk5LDkgKzExNSwxNyBAQAogICAgICAgICB2ZW5kb3I6IHsKICAgICAgICAgICAgIGV4Y2x1ZGVfc2hhcmVkX2xpYnM6IFsKICAgICAgICAgICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycXVldWVfaGVscGVyX25vdm5kayIsCisgICAgICAgICAgICAgICAgImxpYmNvZGVjMl9oaWRsX3BsdWdpbl9zdHViIiwKICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAorICAgICAgICAgICAgICAgICJsaWJjb2RlYzJfaGlkbF9wbHVnaW4iLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICAgICAgYXBleDogeworICAgICAgICAgICAgZXhjbHVkZV9zaGFyZWRfbGliczogWworICAgICAgICAgICAgICAgICJsaWJjb2RlYzJfaGlkbF9wbHVnaW5fc3R1YiIsCisgICAgICAgICAgICAgICAgImxpYmNvZGVjMl9oaWRsX3BsdWdpbiIsCiAgICAgICAgICAgICBdLAogICAgICAgICB9LAogICAgIH0sCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvQ29tcG9uZW50LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9Db21wb25lbnQuY3BwCmluZGV4IGVkMjgxZTYuLjFkN2QzZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9Db21wb25lbnQuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9Db21wb25lbnQuY3BwCkBAIC0yMiw2ICsyMiwxMCBAQAogI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMS9Db21wb25lbnRTdG9yZS5oPgogI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMS9JbnB1dEJ1ZmZlck1hbmFnZXIuaD4KIAorI2lmbmRlZiBfX0FORFJPSURfQVBFWF9fCisjaW5jbHVkZSA8RmlsdGVyV3JhcHBlci5oPgorI2VuZGlmCisKICNpbmNsdWRlIDxoaWRsL0hpZGxCaW5kZXJTdXBwb3J0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CiAKQEAgLTM5MCwxMCArMzk0LDE3IEBACiAgICAgICAgIHVpbnQzMl90IGFsbG9jYXRvcklkLAogICAgICAgICBjcmVhdGVCbG9ja1Bvb2xfY2IgX2hpZGxfY2IpIHsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IGJsb2NrUG9vbDsKKyNpZmRlZiBfX0FORFJPSURfQVBFWF9fCiAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQ3JlYXRlQ29kZWMyQmxvY2tQb29sKAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90PihhbGxvY2F0b3JJZCksCiAgICAgICAgICAgICBtQ29tcG9uZW50LAogICAgICAgICAgICAgJmJsb2NrUG9vbCk7CisjZWxzZQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IENvbXBvbmVudFN0b3JlOjpHZXRGaWx0ZXJXcmFwcGVyKCktPmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdD4oYWxsb2NhdG9ySWQpLAorICAgICAgICAgICAgbUNvbXBvbmVudCwKKyAgICAgICAgICAgICZibG9ja1Bvb2wpOworI2VuZGlmCiAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgewogICAgICAgICBibG9ja1Bvb2wgPSBudWxscHRyOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9Db21wb25lbnRTdG9yZS5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvQ29tcG9uZW50U3RvcmUuY3BwCmluZGV4IDIyNWNkMDkuLjE2MzY4NmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4xL3V0aWxzL0NvbXBvbmVudFN0b3JlLmNwcApAQCAtMzUsNiArMzUsMTQgQEAKICNpbmNsdWRlIDxvc3RyZWFtPgogI2luY2x1ZGUgPHNzdHJlYW0+CiAKKyNpZm5kZWYgX19BTkRST0lEX0FQRVhfXworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL3BsdWdpbi9GaWx0ZXJQbHVnaW4uaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8RGVmYXVsdEZpbHRlclBsdWdpbi5oPgorI2luY2x1ZGUgPEZpbHRlcldyYXBwZXIuaD4KKyNlbmRpZgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIG1lZGlhIHsKQEAgLTE3Niw2ICsxODQsMTYgQEAKICAgICByZXR1cm4gbVBhcmFtZXRlckNhY2hlOwogfQogCisjaWZuZGVmIF9fQU5EUk9JRF9BUEVYX18KKy8vIHN0YXRpYworc3RkOjpzaGFyZWRfcHRyPEZpbHRlcldyYXBwZXI+IENvbXBvbmVudFN0b3JlOjpHZXRGaWx0ZXJXcmFwcGVyKCkgeworICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyIGtQbHVnaW5QYXRoW10gPSAibGliYzJmaWx0ZXJwbHVnaW4uc28iOworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8RmlsdGVyV3JhcHBlcj4gd3JhcHBlciA9IEZpbHRlcldyYXBwZXI6OkNyZWF0ZSgKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8RGVmYXVsdEZpbHRlclBsdWdpbj4oa1BsdWdpblBhdGgpKTsKKyAgICByZXR1cm4gd3JhcHBlcjsKK30KKyNlbmRpZgorCiAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50U3RvcmUKIFJldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6Y3JlYXRlQ29tcG9uZW50KAogICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKQEAgLTE4OSw2ICsyMDcsOSBAQAogICAgICAgICAgICAgbVN0b3JlLT5jcmVhdGVDb21wb25lbnQobmFtZSwgJmMyY29tcG9uZW50KSk7CiAKICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyNpZm5kZWYgX19BTkRST0lEX0FQRVhfXworICAgICAgICBjMmNvbXBvbmVudCA9IEdldEZpbHRlcldyYXBwZXIoKS0+bWF5YmVXcmFwQ29tcG9uZW50KGMyY29tcG9uZW50KTsKKyNlbmRpZgogICAgICAgICBvbkludGVyZmFjZUxvYWRlZChjMmNvbXBvbmVudC0+aW50ZigpKTsKICAgICAgICAgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudChjMmNvbXBvbmVudCwgbGlzdGVuZXIsIHRoaXMsIHBvb2wpOwogICAgICAgICBpZiAoIWNvbXBvbmVudCkgewpAQCAtMjE2LDYgKzIzNyw5IEBACiAgICAgYzJfc3RhdHVzX3QgcmVzID0gbVN0b3JlLT5jcmVhdGVJbnRlcmZhY2UobmFtZSwgJmMyaW50ZXJmYWNlKTsKICAgICBzcDxJQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRlcmZhY2U7CiAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworI2lmbmRlZiBfX0FORFJPSURfQVBFWF9fCisgICAgICAgIGMyaW50ZXJmYWNlID0gR2V0RmlsdGVyV3JhcHBlcigpLT5tYXliZVdyYXBJbnRlcmZhY2UoYzJpbnRlcmZhY2UpOworI2VuZGlmCiAgICAgICAgIG9uSW50ZXJmYWNlTG9hZGVkKGMyaW50ZXJmYWNlKTsKICAgICAgICAgaW50ZXJmYWNlID0gbmV3IENvbXBvbmVudEludGVyZmFjZShjMmludGVyZmFjZSwgbVBhcmFtZXRlckNhY2hlKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjEvQ29tcG9uZW50U3RvcmUuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMS9Db21wb25lbnRTdG9yZS5oCmluZGV4IDFmMDQzOTEuLmY2ZGFlZTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMS9Db21wb25lbnRTdG9yZS5oCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMS9Db21wb25lbnRTdG9yZS5oCkBAIC0zOCw2ICszOCw4IEBACiAjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CitjbGFzcyBGaWx0ZXJXcmFwcGVyOworCiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIG1lZGlhIHsKIG5hbWVzcGFjZSBjMiB7CkBAIC03NSw2ICs3Nyw4IEBACiAgICAgICovCiAgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtZXRlckNhY2hlPiBnZXRQYXJhbWV0ZXJDYWNoZSgpIGNvbnN0OwogCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxGaWx0ZXJXcmFwcGVyPiBHZXRGaWx0ZXJXcmFwcGVyKCk7CisKICAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50U3RvcmUuCiAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY3JlYXRlQ29tcG9uZW50KAogICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9BbmRyb2lkLmJwCmluZGV4IDNjMzc5OTAuLjVhMzRjMzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9jbGllbnQiLAogCkBAIC0zOSw0ICs0OCwzIEBACiAgICAgXSwKIAogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvY2xpZW50LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwCmluZGV4IDdlNDM1MmQuLjQ2NTA2NzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwCkBAIC04NDMsNiArODQzLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiU2ltcGxlUGFyYW1SZWZsZWN0b3IgLS0gdHJhbnNhY3Rpb24gZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0cmFuc1N0YXR1cy5kZXNjcmlwdGlvbigpOworICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IucmVzZXQoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODczYmIwMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzUgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGliY29kZWMyX2hpZGxfcGx1Z2luX2hlYWRlcnMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmNvZGVjMl9oaWRsX3BsdWdpbl9zdHViIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkRlZmF1bHRGaWx0ZXJQbHVnaW4uY3BwIiwKKyAgICAgICAgIkZpbHRlcldyYXBwZXJTdHViLmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfaW50ZXJuYWwiLCAvLyBwcml2YXRlCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICAgICAgImludGVybmFsIiwKKyAgICBdLAorCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfaGlkbF9wbHVnaW4iLAorICAgIHZlbmRvcjogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkRlZmF1bHRGaWx0ZXJQbHVnaW4uY3BwIiwKKyAgICAgICAgIkZpbHRlcldyYXBwZXIuY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9pbnRlcm5hbCIsIC8vIHByaXZhdGUKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgICAgICAiaW50ZXJuYWwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vRGVmYXVsdEZpbHRlclBsdWdpbi5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vRGVmYXVsdEZpbHRlclBsdWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxYmNiMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9EZWZhdWx0RmlsdGVyUGx1Z2luLmNwcApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzItRGVmYXVsdEZpbHRlclBsdWdpbiIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSA8ZGxmY24uaD4KKworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvcGx1Z2luL0ZpbHRlclBsdWdpbi5oPgorCisjaW5jbHVkZSA8RGVmYXVsdEZpbHRlclBsdWdpbi5oPgorI2luY2x1ZGUgPEZpbHRlcldyYXBwZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitEZWZhdWx0RmlsdGVyUGx1Z2luOjpEZWZhdWx0RmlsdGVyUGx1Z2luKGNvbnN0IGNoYXIgKnBsdWdpblBhdGgpCisgICAgOiBtSW5pdChOT19JTklUKSwKKyAgICAgIG1IYW5kbGUobnVsbHB0ciksCisgICAgICBtRGVzdHJveVBsdWdpbihudWxscHRyKSwKKyAgICAgIG1QbHVnaW4obnVsbHB0cikgeworICAgIG1IYW5kbGUgPSBkbG9wZW4ocGx1Z2luUGF0aCwgUlRMRF9OT1cgfCBSVExEX05PREVMRVRFKTsKKyAgICBpZiAoIW1IYW5kbGUpIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiRmlsdGVyUGx1Z2luOiBubyBwbHVnaW4gZGV0ZWN0ZWQiOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEdldEZpbHRlclBsdWdpblZlcnNpb25GdW5jIGdldFZlcnNpb24gPQorICAgICAgICAoR2V0RmlsdGVyUGx1Z2luVmVyc2lvbkZ1bmMpZGxzeW0obUhhbmRsZSwgIkdldEZpbHRlclBsdWdpblZlcnNpb24iKTsKKyAgICBpZiAoIWdldFZlcnNpb24pIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJGaWx0ZXJQbHVnaW46IEdldEZpbHRlclBsdWdpblZlcnNpb24gdW5kZWZpbmVkIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQzMl90IHZlcnNpb24gPSBnZXRWZXJzaW9uKCk7CisgICAgaWYgKHZlcnNpb24gIT0gRmlsdGVyUGx1Z2luX1YxOjpWRVJTSU9OKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiRmlsdGVyUGx1Z2luOiB1bnJlY29nbml6ZWQgdmVyc2lvbiAoIiA8PCB2ZXJzaW9uIDw8ICIpIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDcmVhdGVGaWx0ZXJQbHVnaW5GdW5jIGNyZWF0ZVBsdWdpbiA9CisgICAgICAgIChDcmVhdGVGaWx0ZXJQbHVnaW5GdW5jKWRsc3ltKG1IYW5kbGUsICJDcmVhdGVGaWx0ZXJQbHVnaW4iKTsKKyAgICBpZiAoIWNyZWF0ZVBsdWdpbikgeworICAgICAgICBMT0coV0FSTklORykgPDwgIkZpbHRlclBsdWdpbjogQ3JlYXRlRmlsdGVyUGx1Z2luIHVuZGVmaW5lZCI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbURlc3Ryb3lQbHVnaW4gPQorICAgICAgICAoRGVzdHJveUZpbHRlclBsdWdpbkZ1bmMpZGxzeW0obUhhbmRsZSwgIkRlc3Ryb3lGaWx0ZXJQbHVnaW4iKTsKKyAgICBpZiAoIW1EZXN0cm95UGx1Z2luKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiRmlsdGVyUGx1Z2luOiBEZXN0cm95RmlsdGVyUGx1Z2luIHVuZGVmaW5lZCI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVBsdWdpbiA9IChGaWx0ZXJQbHVnaW5fVjEgKiljcmVhdGVQbHVnaW4oKTsKKyAgICBpZiAoIW1QbHVnaW4pIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJGaWx0ZXJQbHVnaW46IENyZWF0ZUZpbHRlclBsdWdpbiByZXR1cm5lZCBudWxscHRyIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtU3RvcmUgPSBtUGx1Z2luLT5nZXRDb21wb25lbnRTdG9yZSgpOworICAgIGlmICghbVN0b3JlKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiRmlsdGVyUGx1Z2luOiBGaWx0ZXJQbHVnaW5fVjE6OmdldENvbXBvbmVudFN0b3JlIHJldHVybmVkIG51bGxwdHIiOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1Jbml0ID0gT0s7Cit9CisKK0RlZmF1bHRGaWx0ZXJQbHVnaW46On5EZWZhdWx0RmlsdGVyUGx1Z2luKCkgeworICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgIGlmIChtRGVzdHJveVBsdWdpbiAmJiBtUGx1Z2luKSB7CisgICAgICAgICAgICBtRGVzdHJveVBsdWdpbihtUGx1Z2luKTsKKyAgICAgICAgICAgIG1QbHVnaW4gPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGRsY2xvc2UobUhhbmRsZSk7CisgICAgICAgIG1IYW5kbGUgPSBudWxscHRyOworICAgICAgICBtRGVzdHJveVBsdWdpbiA9IG51bGxwdHI7CisgICAgfQorfQorCitib29sIERlZmF1bHRGaWx0ZXJQbHVnaW46OmRlc2NyaWJlKEMyU3RyaW5nIG5hbWUsIEZpbHRlcldyYXBwZXI6OkRlc2NyaXB0b3IgKmRlc2MpIHsKKyAgICBpZiAobUluaXQgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbVBsdWdpbi0+ZGVzY3JpYmUobmFtZSwgZGVzYyk7Cit9CisKK2Jvb2wgRGVmYXVsdEZpbHRlclBsdWdpbjo6aXNGaWx0ZXJpbmdFbmFibGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpIHsKKyAgICBpZiAobUluaXQgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbVBsdWdpbi0+aXNGaWx0ZXJpbmdFbmFibGVkKGludGYpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL0ZpbHRlcldyYXBwZXIuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL0ZpbHRlcldyYXBwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZDhhZWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vRmlsdGVyV3JhcHBlci5jcHAKQEAgLTAsMCArMSw5MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUZpbHRlcldyYXBwZXIiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgPGRsZmNuLmg+CisKKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL3BsdWdpbi9GaWx0ZXJQbHVnaW4uaD4KKworI2luY2x1ZGUgPEZpbHRlcldyYXBwZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCisvLyBJbmRpY2VzIHRoYXQgdGhlIGxhc3QgZmlsdGVyIGluIHRoZSBjaGFpbiBzaG91bGQgY29uc3VtZS4KK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1R5cGVzRm9yTGFzdEZpbHRlcltdID0geworICAgIC8vIEluIGNhc2Ugd2UgaGF2ZSBhbiBvdXRwdXQgc3VyZmFjZSwgd2Ugd2FudCB0byB1c2UgdGhlIGJsb2NrIHBvb2wKKyAgICAvLyBiYWNrZWQgYnkgdGhlIG91dHB1dCBzdXJmYWNlIGZvciB0aGUgb3V0cHV0IGJ1ZmZlciBnb2luZyB0byB0aGUgY2xpZW50LgorICAgIEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSwKK307CisKK2NsYXNzIFdyYXBwZWREZWNvZGVySW50ZXJmYWNlIDogcHVibGljIEMyQ29tcG9uZW50SW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICBXcmFwcGVkRGVjb2RlckludGVyZmFjZSgKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZiwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEZpbHRlcldyYXBwZXI6OkNvbXBvbmVudD4gJiZmaWx0ZXJzKQorICAgICAgICA6IG1JbnRmKGludGYpIHsKKyAgICAgICAgdGFrZUZpbHRlcnMoc3RkOjptb3ZlKGZpbHRlcnMpKTsKKyAgICB9CisKKyAgICB+V3JhcHBlZERlY29kZXJJbnRlcmZhY2UoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIHRha2VGaWx0ZXJzKHN0ZDo6dmVjdG9yPEZpbHRlcldyYXBwZXI6OkNvbXBvbmVudD4gJiZmaWx0ZXJzKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtTXV0ZXgpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGxhc3RGaWx0ZXJQYXJhbXM7CisgICAgICAgIGlmICghbUZpbHRlcnMuZW1wdHkoKSkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiBwYXJhbURlc2NzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUZpbHRlcnMuYmFjaygpLmludGYtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKCZwYXJhbURlc2NzKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIldyYXBwZWREZWNvZGVySW50ZXJmYWNlOiAiIDw8IG1GaWx0ZXJzLmJhY2soKS50cmFpdHMubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiByZXR1cm5lZCBlcnJvciBmb3IgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmI7IGVycj0iIDw8IGVycjsKKyAgICAgICAgICAgICAgICBwYXJhbURlc2NzLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gJnBhcmFtRGVzYyA6IHBhcmFtRGVzY3MpIHsKKyAgICAgICAgICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleCA9IHBhcmFtRGVzYy0+aW5kZXgoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjpjb3VudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJlZ2luKGtUeXBlc0Zvckxhc3RGaWx0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZW5kKGtUeXBlc0Zvckxhc3RGaWx0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LnR5cGUoKSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXguZm9yU3RyZWFtKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXJ5U3VwcG9ydGVkUGFyYW1zIGRvZXMgbm90IHJldHVybiBwZXItc3RyZWFtIHBhcmFtcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgc3VwcG9ydCBzdHJlYW0tMCBmb3Igbm93LgorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpbmRleC53aXRoU3RyZWFtKDB1KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbmRpY2VzLnB1c2hfYmFjayhpbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFpbmRpY2VzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtRmlsdGVycy5iYWNrKCkuaW50Zi0+cXVlcnlfdmIoe30sIGluZGljZXMsIEMyX01BWV9CTE9DSywgJmxhc3RGaWx0ZXJQYXJhbXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogZG9jdW1lbnRhdGlvbgorICAgICAgICBtRmlsdGVycyA9IHN0ZDo6bW92ZShmaWx0ZXJzKTsKKyAgICAgICAgbVR5cGVUb0luZGV4Rm9yUXVlcnkuY2xlYXIoKTsKKyAgICAgICAgbVR5cGVUb0luZGV4Rm9yQ29uZmlnLmNsZWFyKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZpbHRlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICB0cmFuc2ZlclBhcmFtc19sKG1JbnRmLCBtRmlsdGVyc1swXS5pbnRmLCBDMl9NQVlfQkxPQ0spOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cmFuc2ZlclBhcmFtc19sKG1GaWx0ZXJzW2kgLSAxXS5pbnRmLCBtRmlsdGVyc1tpXS5pbnRmLCBDMl9NQVlfQkxPQ0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChDMlBhcmFtOjpUeXBlIHR5cGUgOiBtRmlsdGVyc1tpXS5kZXNjLmNvbnRyb2xQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICBtVHlwZVRvSW5kZXhGb3JRdWVyeVt0eXBlLnR5cGUoKV0gPSBpOworICAgICAgICAgICAgICAgIG1UeXBlVG9JbmRleEZvckNvbmZpZ1t0eXBlLnR5cGUoKSAmIH5DMlBhcmFtOjpDb3JlSW5kZXg6OklTX1JFUVVFU1RfRkxBR10gPSBpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChDMlBhcmFtOjpUeXBlIHR5cGUgOiBtRmlsdGVyc1tpXS5kZXNjLmFmZmVjdGVkUGFyYW1zKSB7CisgICAgICAgICAgICAgICAgbVR5cGVUb0luZGV4Rm9yUXVlcnlbdHlwZS50eXBlKCldID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW1GaWx0ZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgdHlwZSA6IGtUeXBlc0Zvckxhc3RGaWx0ZXIpIHsKKyAgICAgICAgICAgICAgICBtVHlwZVRvSW5kZXhGb3JRdWVyeVt0eXBlXSA9IG1GaWx0ZXJzLnNpemUoKSAtIDE7CisgICAgICAgICAgICAgICAgbVR5cGVUb0luZGV4Rm9yQ29uZmlnW3R5cGUgJiB+QzJQYXJhbTo6Q29yZUluZGV4OjpJU19SRVFVRVNUX0ZMQUddID0KKyAgICAgICAgICAgICAgICAgICAgbUZpbHRlcnMuc2l6ZSgpIC0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbGFzdEZpbHRlclBhcmFtcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiBwYXJhbVB0cnMobGFzdEZpbHRlclBhcmFtcy5zaXplKCkpOworICAgICAgICAgICAgICAgIHN0ZDo6dHJhbnNmb3JtKAorICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEZpbHRlclBhcmFtcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEZpbHRlclBhcmFtcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtUHRycy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwYXJhbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBtRmlsdGVycy5iYWNrKCkuaW50Zi0+Y29uZmlnX3ZiKHBhcmFtUHRycywgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1JbnRmLT5nZXROYW1lKCk7IH0KKworICAgIGMyX25vZGVfaWRfdCBnZXRJZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1JbnRmLT5nZXRJZCgpOyB9CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeV92YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1NdXRleCk7CisgICAgICAgIHN0ZDo6bGlzdDxDMlBhcmFtICo+IHN0YWNrUGFyYW1zTGlzdChzdGFja1BhcmFtcy5zaXplKCkpOworICAgICAgICBzdGQ6OmNvcHlfbihzdGFja1BhcmFtcy5iZWdpbigpLCBzdGFja1BhcmFtcy5zaXplKCksIHN0YWNrUGFyYW1zTGlzdC5iZWdpbigpKTsKKyAgICAgICAgaGVhcFBhcmFtcy0+Y2xlYXIoKTsKKyAgICAgICAgYzJfc3RhdHVzX3QgcmVzdWx0ID0gQzJfT0s7CisgICAgICAgIC8vIFRPRE86IGxvb3Agb3B0aW1pemF0aW9uCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZpbHRlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIC8vIEZpbHRlciBzdGFjayBwYXJhbXMgYWNjb3JkaW5nIHRvIG1UeXBlVG9JbmRleEZvclF1ZXJ5CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+IHN0YWNrUGFyYW1zRm9yRmlsdGVyOworICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gc3RhY2tQYXJhbXNMaXN0LmJlZ2luKCk7IGl0ICE9IHN0YWNrUGFyYW1zTGlzdC5lbmQoKTsgKSB7CisgICAgICAgICAgICAgICAgQzJQYXJhbSAqcGFyYW0gPSAqaXQ7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdHlwZSA9IHBhcmFtLT50eXBlKCkudHlwZSgpOworICAgICAgICAgICAgICAgIGF1dG8gaXQyID0gbVR5cGVUb0luZGV4Rm9yUXVlcnkuZmluZCh0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoaXQyID09IG1UeXBlVG9JbmRleEZvclF1ZXJ5LmVuZCgpIHx8IGl0Mi0+c2Vjb25kICE9IGkpIHsKKyAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YWNrUGFyYW1zRm9yRmlsdGVyLnB1c2hfYmFjayhwYXJhbSk7CisgICAgICAgICAgICAgICAgaXQgPSBzdGFja1BhcmFtc0xpc3QuZXJhc2UoaXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRmlsdGVyIGhlYXAgcGFyYW1zIGFjY29yZGluZyB0byBtVHlwZVRvSW5kZXhGb3JRdWVyeQorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGhlYXBQYXJhbUluZGljZXNGb3JGaWx0ZXI7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGhlYXBQYXJhbUluZGljZXMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB0eXBlID0gaGVhcFBhcmFtSW5kaWNlc1tqXS50eXBlKCk7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG1UeXBlVG9JbmRleEZvclF1ZXJ5LmZpbmQodHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKGl0ID09IG1UeXBlVG9JbmRleEZvclF1ZXJ5LmVuZCgpIHx8IGl0LT5zZWNvbmQgIT0gaSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaGVhcFBhcmFtSW5kaWNlc0ZvckZpbHRlci5wdXNoX2JhY2soaGVhcFBhcmFtSW5kaWNlc1tqXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGhlYXBQYXJhbXNGb3JGaWx0ZXI7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZmaWx0ZXIgPSBtRmlsdGVyc1tpXS5pbnRmOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gZmlsdGVyLT5xdWVyeV92YigKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tQYXJhbXNGb3JGaWx0ZXIsIGhlYXBQYXJhbUluZGljZXNGb3JGaWx0ZXIsIG1heUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAmaGVhcFBhcmFtc0ZvckZpbHRlcik7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIldyYXBwZWREZWNvZGVySW50ZXJmYWNlOiAiIDw8IGZpbHRlci0+Z2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHJldHVybmVkIGVycm9yIGZvciBxdWVyeV92YjsgZXJyPSIgPDwgZXJyOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGVycjsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhlYXBQYXJhbXMtPmluc2VydCgKKyAgICAgICAgICAgICAgICAgICAgaGVhcFBhcmFtcy0+ZW5kKCksCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKGhlYXBQYXJhbXNGb3JGaWx0ZXIuYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKGhlYXBQYXJhbXNGb3JGaWx0ZXIuZW5kKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gc3RhY2tQYXJhbXNGb3JJbnRmOworICAgICAgICBzdGQ6OmNvcHlfbihzdGFja1BhcmFtc0xpc3QuYmVnaW4oKSwgc3RhY2tQYXJhbXNMaXN0LnNpemUoKSwgc3RhY2tQYXJhbXNGb3JJbnRmLmJlZ2luKCkpOworCisgICAgICAgIC8vIEdhdGhlciBoZWFwIHBhcmFtcyB0aGF0IGRpZCBub3QgZ2V0IHF1ZXJpZWQgZnJvbSB0aGUgZmlsdGVyIGludGVyZmFjZXMgYWJvdmUuCisgICAgICAgIC8vIFRoZXNlIG5lZWQgdG8gYmUgcXVlcmllZCBmcm9tIHRoZSBkZWNvZGVyIGludGVyZmFjZS4KKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGhlYXBQYXJhbUluZGljZXNGb3JJbnRmOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGhlYXBQYXJhbUluZGljZXMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHR5cGUgPSBoZWFwUGFyYW1JbmRpY2VzW2pdLnR5cGUoKTsKKyAgICAgICAgICAgIGlmIChtVHlwZVRvSW5kZXhGb3JRdWVyeS5maW5kKHR5cGUpICE9IG1UeXBlVG9JbmRleEZvclF1ZXJ5LmVuZCgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoZWFwUGFyYW1JbmRpY2VzRm9ySW50Zi5wdXNoX2JhY2soaGVhcFBhcmFtSW5kaWNlc1tqXSk7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGhlYXBQYXJhbXNGb3JJbnRmOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+cXVlcnlfdmIoCisgICAgICAgICAgICAgICAgc3RhY2tQYXJhbXNGb3JJbnRmLCBoZWFwUGFyYW1JbmRpY2VzRm9ySW50ZiwgbWF5QmxvY2ssICZoZWFwUGFyYW1zRm9ySW50Zik7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIExPRyhlcnIgPT0gQzJfQkFEX0lOREVYID8gVkVSQk9TRSA6IFdBUk5JTkcpCisgICAgICAgICAgICAgICAgICAgIDw8ICJXcmFwcGVkRGVjb2RlckludGVyZmFjZTogIiA8PCBtSW50Zi0+Z2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICIgcmV0dXJuZWQgZXJyb3IgZm9yIHF1ZXJ5X3ZiOyBlcnI9IiA8PCBlcnI7CisgICAgICAgICAgICByZXN1bHQgPSBlcnI7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBwYXJhbXMgbmVlZHMgdG8gcHJlc2VydmUgdGhlIG9yZGVyCisgICAgICAgIGhlYXBQYXJhbXMtPmluc2VydCgKKyAgICAgICAgICAgICAgICBoZWFwUGFyYW1zLT5lbmQoKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihoZWFwUGFyYW1zRm9ySW50Zi5iZWdpbigpKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihoZWFwUGFyYW1zRm9ySW50Zi5lbmQoKSkpOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgY29uZmlnX3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiAmcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1NdXRleCk7CisgICAgICAgIGMyX3N0YXR1c190IHJlc3VsdCA9IEMyX09LOworICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+IHBhcmFtc0ZvckludGY7CisgICAgICAgIGZvciAoQzJQYXJhbSogcGFyYW0gOiBwYXJhbXMpIHsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBtVHlwZVRvSW5kZXhGb3JDb25maWcuZmluZChwYXJhbS0+dHlwZSgpLnR5cGUoKSk7CisgICAgICAgICAgICBpZiAoaXQgIT0gbVR5cGVUb0luZGV4Rm9yQ29uZmlnLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJhbXNGb3JJbnRmLnB1c2hfYmFjayhwYXJhbSk7CisgICAgICAgIH0KKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZ192YihwYXJhbXNGb3JJbnRmLCBtYXlCbG9jaywgZmFpbHVyZXMpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBMT0coZXJyID09IEMyX0JBRF9JTkRFWCA/IFZFUkJPU0UgOiBXQVJOSU5HKQorICAgICAgICAgICAgICAgICAgICA8PCAiV3JhcHBlZERlY29kZXJJbnRlcmZhY2U6ICIgPDwgbUludGYtPmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiIHJldHVybmVkIGVycm9yIGZvciBjb25maWdfdmI7IGVycj0iIDw8IGVycjsKKyAgICAgICAgICAgIHJlc3VsdCA9IGVycjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GaWx0ZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdHJhbnNmZXJQYXJhbXNfbChtSW50ZiwgbUZpbHRlcnNbMF0uaW50ZiwgbWF5QmxvY2spOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cmFuc2ZlclBhcmFtc19sKG1GaWx0ZXJzW2kgLSAxXS5pbnRmLCBtRmlsdGVyc1tpXS5pbnRmLCBtYXlCbG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZmaWx0ZXIgPSBtRmlsdGVyc1tpXS5pbnRmOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZpbHRlckZhaWx1cmVzOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiBwYXJhbXNGb3JGaWx0ZXI7CisgICAgICAgICAgICBmb3IgKEMyUGFyYW0qIHBhcmFtIDogcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG1UeXBlVG9JbmRleEZvckNvbmZpZy5maW5kKHBhcmFtLT50eXBlKCkudHlwZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoaXQgIT0gbVR5cGVUb0luZGV4Rm9yQ29uZmlnLmVuZCgpICYmIGl0LT5zZWNvbmQgIT0gaSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGFyYW1zRm9yRmlsdGVyLnB1c2hfYmFjayhwYXJhbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBmaWx0ZXItPmNvbmZpZ192YihwYXJhbXNGb3JGaWx0ZXIsIG1heUJsb2NrLCAmZmlsdGVyRmFpbHVyZXMpOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIExPRyhlcnIgPT0gQzJfQkFEX0lOREVYID8gVkVSQk9TRSA6IFdBUk5JTkcpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiV3JhcHBlZERlY29kZXJJbnRlcmZhY2U6ICIgPDwgZmlsdGVyLT5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgcmV0dXJuZWQgZXJyb3IgZm9yIGNvbmZpZ192YjsgZXJyPSIgPDwgZXJyOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlVHVubmVsX3NtKGMyX25vZGVfaWRfdCkgb3ZlcnJpZGUgeyByZXR1cm4gQzJfT01JVFRFRDsgfQorICAgIGMyX3N0YXR1c190IHJlbGVhc2VUdW5uZWxfc20oYzJfbm9kZV9pZF90KSBvdmVycmlkZSB7IHJldHVybiBDMl9PTUlUVEVEOyB9CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICogY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtTXV0ZXgpOworICAgICAgICBjMl9zdGF0dXNfdCByZXN1bHQgPSBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIocGFyYW1zKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBDMl9PSykgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJXcmFwcGVkRGVjb2RlckludGVyZmFjZTogIiA8PCBtSW50Zi0+Z2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICIgcmV0dXJuZWQgZXJyb3IgZm9yIHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iOyBlcnI9IiA8PCByZXN1bHQ7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IG9wdGltaXphdGlvbiBpZGVhIC0tLSBwcmUtY29tcHV0ZSBhdCB0YWtlRmlsdGVyKCkuCisgICAgICAgIGZvciAoY29uc3QgRmlsdGVyV3JhcHBlcjo6Q29tcG9uZW50ICZmaWx0ZXIgOiBtRmlsdGVycykgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gZmlsdGVyUGFyYW1zOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gZmlsdGVyLmludGYtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKCZmaWx0ZXJQYXJhbXMpOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiV3JhcHBlZERlY29kZXJJbnRlcmZhY2U6ICIgPDwgZmlsdGVyLmludGYtPmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiByZXR1cm5lZCBlcnJvciBmb3IgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmI7IGVycj0iIDw8IHJlc3VsdDsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBlcnI7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gJnBhcmFtRGVzYyA6IGZpbHRlclBhcmFtcykgeworICAgICAgICAgICAgICAgIGlmIChzdGQ6OmNvdW50KAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLmRlc2MuY29udHJvbFBhcmFtcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLmRlc2MuY29udHJvbFBhcmFtcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtRGVzYy0+aW5kZXgoKS50eXBlKCkpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhcmFtcy0+cHVzaF9iYWNrKHBhcmFtRGVzYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc192YigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1NdXRleCk7CisgICAgICAgIGMyX3N0YXR1c190IHJlc3VsdCA9IG1JbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlc192YihmaWVsZHMsIG1heUJsb2NrKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBDMl9PSyAmJiByZXN1bHQgIT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIldyYXBwZWREZWNvZGVySW50ZXJmYWNlOiAiIDw8IG1JbnRmLT5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIiByZXR1cm5lZCBlcnJvciBmb3IgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmI7IGVycj0iIDw8IHJlc3VsdDsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBGaWx0ZXJXcmFwcGVyOjpDb21wb25lbnQgJmZpbHRlciA6IG1GaWx0ZXJzKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IGZpbHRlckZpZWxkczsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gaW5kaWNlczsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5ICZmaWVsZCA9IGZpZWxkc1tpXTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB0eXBlID0gQzJQYXJhbTo6SW5kZXgoX0MyUGFyYW1JbnNwZWN0b3I6OkdldEluZGV4KGZpZWxkLmZpZWxkKCkpKS50eXBlKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0ZDo6Y291bnQoCisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuZGVzYy5jb250cm9sUGFyYW1zLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuZGVzYy5jb250cm9sUGFyYW1zLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmlsdGVyRmllbGRzLnB1c2hfYmFjayhmaWVsZCk7CisgICAgICAgICAgICAgICAgaW5kaWNlcy5wdXNoX2JhY2soaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBmaWx0ZXIuaW50Zi0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfdmIoZmlsdGVyRmllbGRzLCBtYXlCbG9jayk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIldyYXBwZWREZWNvZGVySW50ZXJmYWNlOiAiIDw8IGZpbHRlci5pbnRmLT5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgcmV0dXJuZWQgZXJyb3IgZm9yIHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iOyBlcnI9IiA8PCByZXN1bHQ7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZXJyOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaWx0ZXJGaWVsZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmaWVsZHNbaW5kaWNlc1tpXV0gPSBmaWx0ZXJGaWVsZHNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IG1JbnRmOworICAgIHN0ZDo6dmVjdG9yPEZpbHRlcldyYXBwZXI6OkNvbXBvbmVudD4gbUZpbHRlcnM7CisgICAgc3RkOjptYXA8dWludDMyX3QsIHNpemVfdD4gbVR5cGVUb0luZGV4Rm9yUXVlcnk7CisgICAgc3RkOjptYXA8dWludDMyX3QsIHNpemVfdD4gbVR5cGVUb0luZGV4Rm9yQ29uZmlnOworCisgICAgYzJfc3RhdHVzX3QgdHJhbnNmZXJQYXJhbXNfbCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmN1cnIsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZuZXh0LAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgeworICAgICAgICAvLyBOT1RFOiB0aGlzIGltcGxlbWVudGF0aW9uIGlzIHByZWxpbWluYXJ5IC0tLSBpdCBjb3VsZCBjaGFuZ2Ugb25jZQorICAgICAgICAvLyB3ZSBkZWZpbmUgd2hhdCBwYXJhbWV0ZXJzIG5lZWRzIHRvIGJlIHByb3BhZ2F0ZWQgaW4gY29tcG9uZW50IGNoYWluaW5nLgorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiBwYXJhbURlc2NzOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBuZXh0LT5xdWVyeVN1cHBvcnRlZFBhcmFtc19uYigmcGFyYW1EZXNjcyk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIldyYXBwZWREZWNvZGVySW50ZXJmYWNlOiAiIDw8IG5leHQtPmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiIHJldHVybmVkIGVycm9yIGZvciBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYjsgZXJyPSIgPDwgZXJyOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICAvLyBGaW5kIHN1cHBvcnRlZCBpbnB1dCBwYXJhbXMgZnJvbSB0aGUgbmV4dCBpbnRlcmZhY2UgYW5kIGZsaXAgZGlyZWN0aW9uCisgICAgICAgIC8vIHNvIHRoZXkgYmVjb21lIG91dHB1dCBwYXJhbXMuCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gJnBhcmFtRGVzYyA6IHBhcmFtRGVzY3MpIHsKKyAgICAgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4ID0gcGFyYW1EZXNjLT5pbmRleCgpOworICAgICAgICAgICAgaWYgKCFpbmRleC5mb3JJbnB1dCgpIHx8IHBhcmFtRGVzYy0+aXNSZWFkT25seSgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5kZXguZm9yU3RyZWFtKCkpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW0gPSBpbmRleC5zdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4LndpdGhQb3J0KHRydWUgLyogb3V0cHV0ICovKS53aXRoU3RyZWFtKHN0cmVhbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXgud2l0aFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kaWNlcy5wdXNoX2JhY2soaW5kZXgpOworICAgICAgICB9CisgICAgICAgIC8vIFF1ZXJ5IHRob3NlIG91dHB1dCBwYXJhbXMgZnJvbSB0aGUgY3VycmVudCBpbnRlcmZhY2UKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBoZWFwUGFyYW1zOworICAgICAgICBlcnIgPSBjdXJyLT5xdWVyeV92Yih7fSwgaW5kaWNlcywgbWF5QmxvY2ssICZoZWFwUGFyYW1zKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSyAmJiBlcnIgIT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJXcmFwcGVkRGVjb2RlckludGVyZmFjZTogIiA8PCBjdXJyLT5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIiByZXR1cm5lZCBlcnJvciBmb3IgcXVlcnlfdmI7IGVycj0iIDw8IGVycjsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgLy8gRmxpcCB0aGUgZGlyZWN0aW9uIG9mIHRoZSBxdWVyaWVkIHBhcmFtcywgc28gdGhleSBiZWNvbWUgaW5wdXQgcGFyYW1ldGVycy4KKyAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBuZXh0IGludGVyZmFjZSB3aXRoIHRoZSBwYXJhbXMuCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gY29uZmlnUGFyYW1zOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlYXBQYXJhbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghaGVhcFBhcmFtc1tpXSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhlYXBQYXJhbXNbaV0tPmZvclN0cmVhbSgpKSB7CisgICAgICAgICAgICAgICAgaGVhcFBhcmFtc1tpXSA9IEMyUGFyYW06OkNvcHlBc1N0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgICpoZWFwUGFyYW1zW2ldLCBmYWxzZSAvKiBvdXRwdXQgKi8sIGhlYXBQYXJhbXNbaV0tPnN0cmVhbSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGVhcFBhcmFtc1tpXSA9IEMyUGFyYW06OkNvcHlBc1BvcnQoKmhlYXBQYXJhbXNbaV0sIGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25maWdQYXJhbXMucHVzaF9iYWNrKGhlYXBQYXJhbXNbaV0uZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgZXJyID0gbmV4dC0+Y29uZmlnX3ZiKGNvbmZpZ1BhcmFtcywgbWF5QmxvY2ssICZmYWlsdXJlcyk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0sgJiYgZXJyICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiV3JhcHBlZERlY29kZXJJbnRlcmZhY2U6ICIgPDwgbmV4dC0+Z2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICIgcmV0dXJuZWQgZXJyb3IgZm9yIGNvbmZpZ192YjsgZXJyPSIgPDwgZXJyOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorfTsKKworY2xhc3MgV3JhcHBlZERlY29kZXIgOiBwdWJsaWMgQzJDb21wb25lbnQsIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFdyYXBwZWREZWNvZGVyPiB7CitwdWJsaWM6CisgICAgV3JhcHBlZERlY29kZXIoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGNvbXAsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxGaWx0ZXJXcmFwcGVyOjpDb21wb25lbnQ+ICYmZmlsdGVycywKKyAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8RmlsdGVyV3JhcHBlcj4gZmlsdGVyV3JhcHBlcikKKyAgICAgICAgOiBtQ29tcChjb21wKSwgbUZpbHRlcnMoc3RkOjptb3ZlKGZpbHRlcnMpKSwgbUZpbHRlcldyYXBwZXIoZmlsdGVyV3JhcHBlcikgeworICAgICAgICBzdGQ6OnZlY3RvcjxGaWx0ZXJXcmFwcGVyOjpDb21wb25lbnQ+IGZpbHRlcnNEdXAobUZpbHRlcnMpOworICAgICAgICBtSW50ZiA9IHN0ZDo6bWFrZV9zaGFyZWQ8V3JhcHBlZERlY29kZXJJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIGNvbXAtPmludGYoKSwgc3RkOjptb3ZlKGZpbHRlcnNEdXApKTsKKyAgICB9CisKKyAgICB+V3JhcHBlZERlY29kZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYoKSBvdmVycmlkZSB7IHJldHVybiBtSW50ZjsgfQorCisgICAgYzJfc3RhdHVzX3Qgc2V0TGlzdGVuZXJfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+ICZsaXN0ZW5lciwgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgb3ZlcnJpZGUgeworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIHNldExpc3RlbmVySW50ZXJuYWwobUZpbHRlcnMsIGxpc3RlbmVyLCBtYXlCbG9jayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ29tcC0+c2V0TGlzdGVuZXJfdmIobnVsbHB0ciwgbWF5QmxvY2spOworICAgICAgICAgICAgZm9yIChGaWx0ZXJXcmFwcGVyOjpDb21wb25lbnQgJmZpbHRlciA6IG1GaWx0ZXJzKSB7CisgICAgICAgICAgICAgICAgZmlsdGVyLmNvbXAtPnNldExpc3RlbmVyX3ZiKG51bGxwdHIsIG1heUJsb2NrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHF1ZXVlX25iKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQ29tcC0+cXVldWVfbmIoaXRlbXMpOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGFubm91bmNlX25iKGNvbnN0IHN0ZDo6dmVjdG9yPEMyV29ya091dGxpbmU+ICYpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZmx1c2hfc20oCisgICAgICAgICAgICBmbHVzaF9tb2RlX3QgbW9kZSwgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspIG92ZXJyaWRlIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgcmVzdWx0ID0gbUNvbXAtPmZsdXNoX3NtKG1vZGUsIGZsdXNoZWRXb3JrKTsKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmaWx0ZXJGbHVzaGVkV29yazsKKyAgICAgICAgZm9yIChGaWx0ZXJXcmFwcGVyOjpDb21wb25lbnQgZmlsdGVyIDogbVJ1bm5pbmdGaWx0ZXJzKSB7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBmaWx0ZXIuY29tcC0+Zmx1c2hfc20obW9kZSwgJmZpbHRlckZsdXNoZWRXb3JrKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbHVzaGVkV29yay0+c3BsaWNlKGZsdXNoZWRXb3JrLT5lbmQoKSwgZmlsdGVyRmx1c2hlZFdvcmspOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZHJhaW5fbmIoZHJhaW5fbW9kZV90IG1vZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETzogc2ltcGxpZnkgdXNpbmcgY29tcC0+ZHJhaW5fbmIobW9kZSkKKyAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TOiB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiBlb3NXb3Jre25ldyBDMldvcmt9OworICAgICAgICAgICAgZW9zV29yay0+aW5wdXQuZmxhZ3MgPSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgZW9zV29yay0+d29ya2xldHMucHVzaF9iYWNrKHN0ZDo6bWFrZV91bmlxdWU8QzJXb3JrbGV0PigpKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKGVvc1dvcmspKTsKKyAgICAgICAgICAgIG1Db21wLT5xdWV1ZV9uYigmaXRlbXMpOworICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICB9CisgICAgICAgIGNhc2UgRFJBSU5fQ09NUE9ORU5UX05PX0VPUzoKKyAgICAgICAgY2FzZSBEUkFJTl9DSEFJTjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8RmlsdGVyV3JhcHBlcjo6Q29tcG9uZW50PiBmaWx0ZXJzOworICAgICAgICBpZiAoc3RkOjpzaGFyZWRfcHRyPEZpbHRlcldyYXBwZXI+IGZpbHRlcldyYXBwZXIgPSBtRmlsdGVyV3JhcHBlci5sb2NrKCkpIHsKKyAgICAgICAgICAgIC8vIExldCdzIGNoZWNrIGlmIHdlIGhhdmUgZmlsdGVycyB0aGF0IHdlIGNhbiBza2lwCisgICAgICAgICAgICBmb3IgKEZpbHRlcldyYXBwZXI6OkNvbXBvbmVudCAmZmlsdGVyIDogbUZpbHRlcnMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpbHRlcldyYXBwZXItPmlzRmlsdGVyaW5nRW5hYmxlZChmaWx0ZXIuaW50ZikpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJmaWx0ZXJpbmcgZGlzYWJsZWQgZm9yICIgPDwgZmlsdGVyLnRyYWl0cy5uYW1lOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJmaWx0ZXJpbmcgZW5hYmxlZCBmb3IgIiA8PCBmaWx0ZXIudHJhaXRzLm5hbWU7CisgICAgICAgICAgICAgICAgZmlsdGVycy5wdXNoX2JhY2soZmlsdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmaWx0ZXJzLnNpemUoKSA8IG1GaWx0ZXJzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAobUZpbHRlcnMuc2l6ZSgpIC0gZmlsdGVycy5zaXplKCkpIDw8ICIgZmlsdGVyKHMpIHNraXBwZWQiOworICAgICAgICAgICAgICAgIHNldExpc3RlbmVySW50ZXJuYWwoZmlsdGVycywgbUxpc3RlbmVyLCBDMl9NQVlfQkxPQ0spOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yIGZpbHRlcnNDb3B5KGZpbHRlcnMpOworICAgICAgICAgICAgICAgIG1JbnRmLT50YWtlRmlsdGVycyhzdGQ6Om1vdmUoZmlsdGVyc0NvcHkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wLT5zdGFydCgpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGZvciAoRmlsdGVyV3JhcHBlcjo6Q29tcG9uZW50ICZmaWx0ZXIgOiBmaWx0ZXJzKSB7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBmaWx0ZXIuY29tcC0+c3RhcnQoKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAvLyBQcmV2aW91cyBjb21wb25lbnRzIGFyZSBhbHJlYWR5IHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5OworICAgICAgICAgICAgICAgIC8vIHdlIGVuZGVkIHVwIGluIGFuIGluY29oZXJlbnQgc3RhdGUuCisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtUnVubmluZ0ZpbHRlcnMgPSBzdGQ6Om1vdmUoZmlsdGVycyk7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBzdG9wKCkgb3ZlcnJpZGUgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQ29tcC0+c3RvcCgpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGZvciAoRmlsdGVyV3JhcHBlcjo6Q29tcG9uZW50IGZpbHRlciA6IG1SdW5uaW5nRmlsdGVycykgeworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gZmlsdGVyLmNvbXAtPnN0b3AoKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAvLyBQcmV2aW91cyBjb21wb25lbnRzIGFyZSBhbHJlYWR5IHN0b3BwZWQgc3VjY2Vzc2Z1bGx5OworICAgICAgICAgICAgICAgIC8vIHdlIGVuZGVkIHVwIGluIGFuIGluY29oZXJlbnQgc3RhdGUuCisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtUnVubmluZ0ZpbHRlcnMuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHJlc2V0KCkgb3ZlcnJpZGUgeworICAgICAgICBjMl9zdGF0dXNfdCByZXN1bHQgPSBtQ29tcC0+cmVzZXQoKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBDMl9PSykgeworICAgICAgICAgICAgcmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGZvciAoRmlsdGVyV3JhcHBlcjo6Q29tcG9uZW50IGZpbHRlciA6IG1GaWx0ZXJzKSB7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBmaWx0ZXIuY29tcC0+cmVzZXQoKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAvLyBQcmV2aW91cyBjb21wb25lbnRzIGFyZSBhbHJlYWR5IHJlc2V0IHN1Y2Nlc3NmdWxseTsKKyAgICAgICAgICAgICAgICAvLyB3ZSBlbmRlZCB1cCBpbiBhbiBpbmNvaGVyZW50IHN0YXRlLgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAvLyBjb250aW51ZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIGNoYWluCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVJ1bm5pbmdGaWx0ZXJzLmNsZWFyKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgcmVsZWFzZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgcmVzdWx0ID0gbUNvbXAtPnJlbGVhc2UoKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBDMl9PSykgeworICAgICAgICAgICAgcmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGZvciAoRmlsdGVyV3JhcHBlcjo6Q29tcG9uZW50IGZpbHRlciA6IG1GaWx0ZXJzKSB7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBmaWx0ZXIuY29tcC0+cmVsZWFzZSgpOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIC8vIFByZXZpb3VzIGNvbXBvbmVudHMgYXJlIGFscmVhZHkgcmVsZWFzZWQgc3VjY2Vzc2Z1bGx5OworICAgICAgICAgICAgICAgIC8vIHdlIGVuZGVkIHVwIGluIGFuIGluY29oZXJlbnQgc3RhdGUuCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIGZvciB0aGUgcmVzdCBvZiB0aGUgY2hhaW4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtUnVubmluZ0ZpbHRlcnMuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY2xhc3MgUGFzc2luZ0xpc3RlbmVyIDogcHVibGljIExpc3RlbmVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFBhc3NpbmdMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IHdyYXBwZWRDb21wb25lbnQsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiAmd3JhcHBlZENvbXBvbmVudExpc3RlbmVyLAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gbmV4dENvbXBvbmVudCkKKyAgICAgICAgICAgIDogbVdyYXBwZWRDb21wb25lbnQod3JhcHBlZENvbXBvbmVudCksCisgICAgICAgICAgICAgIG1XcmFwcGVkQ29tcG9uZW50TGlzdGVuZXIod3JhcHBlZENvbXBvbmVudExpc3RlbmVyKSwKKyAgICAgICAgICAgICAgbU5leHRDb21wb25lbnQobmV4dENvbXBvbmVudCkgeworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBvbldvcmtEb25lX25iKAorICAgICAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+LAorICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKSBvdmVycmlkZSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG5leHRDb21wb25lbnQgPSBtTmV4dENvbXBvbmVudC5sb2NrKCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZhaWxlZFdvcmtJdGVtczsKKyAgICAgICAgICAgIGlmICghbmV4dENvbXBvbmVudCkgeworICAgICAgICAgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmsgOiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTmV4dCBjb21wb25lbnQgdW5leHBlY3RlZGx5IHJlbGVhc2VkIHdoaWxlIHRoZSB3b3JrIGlzCisgICAgICAgICAgICAgICAgICAgIC8vIGluLWZsaWdodC4gUmVwb3J0IEMyX0NPUlJVUFRFRCB0byB0aGUgY2xpZW50LgorICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIGZhaWxlZFdvcmtJdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd29ya0l0ZW1zLmNsZWFyKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IHdvcmtJdGVtcy5iZWdpbigpOyBpdCAhPSB3b3JrSXRlbXMuZW5kKCk7ICkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayA9ICppdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmstPnJlc3VsdCAhPSBDMl9PSworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHdvcmstPndvcmtsZXRzLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWRXb3JrSXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSgqaXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ID0gd29ya0l0ZW1zLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhICZvdXRwdXQgPSB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIGMyX2NudHI2NF90IGN1c3RvbU9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWw7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0ID0gc3RkOjptb3ZlKG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbCA9IGN1c3RvbU9yZGluYWw7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5mbGFncyA9IEMyRnJhbWVEYXRhOjpmbGFnc190KDApOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5pbmZvQnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZmFpbGVkV29ya0l0ZW1zLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrIDogZmFpbGVkV29ya0l0ZW1zKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAid29yayAjIiA8PCB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVlaygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ6IGVycj0iIDw8IHdvcmstPnJlc3VsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgd29ya2xldHMuc2l6ZSgpPSIgPDwgd29yay0+d29ya2xldHMuc2l6ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiB3cmFwcGVkQ29tcG9uZW50TGlzdGVuZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgbVdyYXBwZWRDb21wb25lbnRMaXN0ZW5lci5sb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JhcHBlZENvbXBvbmVudExpc3RlbmVyLT5vbldvcmtEb25lX25iKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XcmFwcGVkQ29tcG9uZW50LCBzdGQ6Om1vdmUoZmFpbGVkV29ya0l0ZW1zKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF3b3JrSXRlbXMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG5leHRDb21wb25lbnQtPnF1ZXVlX25iKCZ3b3JrSXRlbXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBvblRyaXBwZWRfbmIoCisgICAgICAgICAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4sCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KSBvdmVycmlkZSB7CisgICAgICAgICAgICAvLyBUcmlwIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgb25FcnJvcl9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiwgdWludDMyX3QgZXJyb3JDb2RlKSB7CisgICAgICAgICAgICBpZiAoc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiB3cmFwcGVkQ29tcG9uZW50TGlzdGVuZXIgPQorICAgICAgICAgICAgICAgICAgICBtV3JhcHBlZENvbXBvbmVudExpc3RlbmVyLmxvY2soKSkgeworICAgICAgICAgICAgICAgIHdyYXBwZWRDb21wb25lbnRMaXN0ZW5lci0+b25FcnJvcl9uYihtV3JhcHBlZENvbXBvbmVudCwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gbVdyYXBwZWRDb21wb25lbnQ7CisgICAgICAgIHN0ZDo6d2Vha19wdHI8TGlzdGVuZXI+IG1XcmFwcGVkQ29tcG9uZW50TGlzdGVuZXI7CisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IG1OZXh0Q29tcG9uZW50OworICAgIH07CisKKyAgICBjbGFzcyBMYXN0TGlzdGVuZXIgOiBwdWJsaWMgTGlzdGVuZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgTGFzdExpc3RlbmVyKAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gd3JhcHBlZENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+ICZ3cmFwcGVkQ29tcG9uZW50TGlzdGVuZXIpCisgICAgICAgICAgICA6IG1XcmFwcGVkQ29tcG9uZW50KHdyYXBwZWRDb21wb25lbnQpLAorICAgICAgICAgICAgICBtV3JhcHBlZENvbXBvbmVudExpc3RlbmVyKHdyYXBwZWRDb21wb25lbnRMaXN0ZW5lcikgeworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBvbldvcmtEb25lX25iKAorICAgICAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+LAorICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKSBvdmVycmlkZSB7CisgICAgICAgICAgICBpZiAobVdyYXBwZWRDb21wb25lbnQuZXhwaXJlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gd3JhcHBlZENvbXBvbmVudExpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAgICAgbVdyYXBwZWRDb21wb25lbnRMaXN0ZW5lci5sb2NrKCkpIHsKKyAgICAgICAgICAgICAgICB3cmFwcGVkQ29tcG9uZW50TGlzdGVuZXItPm9uV29ya0RvbmVfbmIoCisgICAgICAgICAgICAgICAgICAgICAgICBtV3JhcHBlZENvbXBvbmVudCwgc3RkOjptb3ZlKHdvcmtJdGVtcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBvblRyaXBwZWRfbmIoCisgICAgICAgICAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4sCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KSBvdmVycmlkZSB7CisgICAgICAgICAgICAvLyBUcmlwIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgb25FcnJvcl9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiwgdWludDMyX3QgZXJyb3JDb2RlKSB7CisgICAgICAgICAgICBpZiAobVdyYXBwZWRDb21wb25lbnQuZXhwaXJlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gd3JhcHBlZENvbXBvbmVudExpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAgICAgbVdyYXBwZWRDb21wb25lbnRMaXN0ZW5lci5sb2NrKCkpIHsKKyAgICAgICAgICAgICAgICB3cmFwcGVkQ29tcG9uZW50TGlzdGVuZXItPm9uRXJyb3JfbmIobVdyYXBwZWRDb21wb25lbnQsIGVycm9yQ29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IG1XcmFwcGVkQ29tcG9uZW50OworICAgICAgICBzdGQ6OndlYWtfcHRyPExpc3RlbmVyPiBtV3JhcHBlZENvbXBvbmVudExpc3RlbmVyOworICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1Db21wOworICAgIHN0ZDo6c2hhcmVkX3B0cjxXcmFwcGVkRGVjb2RlckludGVyZmFjZT4gbUludGY7CisgICAgc3RkOjp2ZWN0b3I8RmlsdGVyV3JhcHBlcjo6Q29tcG9uZW50PiBtRmlsdGVyczsKKyAgICBzdGQ6OnZlY3RvcjxGaWx0ZXJXcmFwcGVyOjpDb21wb25lbnQ+IG1SdW5uaW5nRmlsdGVyczsKKyAgICBzdGQ6OndlYWtfcHRyPEZpbHRlcldyYXBwZXI+IG1GaWx0ZXJXcmFwcGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gbUxpc3RlbmVyOworI2lmIGRlZmluZWQoTE9HX05ERUJVRykgJiYgIUxPR19OREVCVUcKKyAgICBiYXNlOjpTY29wZWRMb2dTZXZlcml0eSBtU2NvcGVkTG9nU2V2ZXJpdHl7YmFzZTo6VkVSQk9TRX07CisjZW5kaWYKKworICAgIGMyX3N0YXR1c190IHNldExpc3RlbmVySW50ZXJuYWwoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxGaWx0ZXJXcmFwcGVyOjpDb21wb25lbnQ+ICZmaWx0ZXJzLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiAmbGlzdGVuZXIsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSB7CisgICAgICAgIGlmIChmaWx0ZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29tcC0+c2V0TGlzdGVuZXJfdmIobGlzdGVuZXIsIG1heUJsb2NrKTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHIgcGFzc2luZ0xpc3RlbmVyID0gc3RkOjptYWtlX3NoYXJlZDxQYXNzaW5nTGlzdGVuZXI+KAorICAgICAgICAgICAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSwKKyAgICAgICAgICAgICAgICBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICBmaWx0ZXJzLmZyb250KCkuY29tcCk7CisgICAgICAgIG1Db21wLT5zZXRMaXN0ZW5lcl92YihwYXNzaW5nTGlzdGVuZXIsIG1heUJsb2NrKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaWx0ZXJzLnNpemUoKSAtIDE7ICsraSkgeworICAgICAgICAgICAgZmlsdGVyc1tpXS5jb21wLT5zZXRMaXN0ZW5lcl92YigKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxQYXNzaW5nTGlzdGVuZXI+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzW2kgKyAxXS5jb21wKSwKKyAgICAgICAgICAgICAgICAgICAgbWF5QmxvY2spOworICAgICAgICB9CisgICAgICAgIGZpbHRlcnMuYmFjaygpLmNvbXAtPnNldExpc3RlbmVyX3ZiKAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8TGFzdExpc3RlbmVyPihzaGFyZWRfZnJvbV90aGlzKCksIGxpc3RlbmVyKSwgbWF5QmxvY2spOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorfTsKKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitGaWx0ZXJXcmFwcGVyOjpGaWx0ZXJXcmFwcGVyKHN0ZDo6dW5pcXVlX3B0cjxQbHVnaW4+ICYmcGx1Z2luKQorICAgIDogbUluaXQoTk9fSU5JVCksCisgICAgICBtUGx1Z2luKHN0ZDo6bW92ZShwbHVnaW4pKSB7CisgICAgaWYgKG1QbHVnaW4tPnN0YXR1cygpICE9IE9LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInBsdWdpbiBub3QgT0s6ICIgPDwgbVBsdWdpbi0+c3RhdHVzKCk7CisgICAgICAgIG1QbHVnaW4ucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtU3RvcmUgPSBtUGx1Z2luLT5nZXRTdG9yZSgpOworICAgIGlmICghbVN0b3JlKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIm5vIHN0b3JlIjsKKyAgICAgICAgbVBsdWdpbi5yZXNldCgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gdHJhaXRzID0KKyAgICAgICAgbVN0b3JlLT5saXN0Q29tcG9uZW50cygpOworICAgIHN0ZDo6c29ydCgKKyAgICAgICAgICAgIHRyYWl0cy5iZWdpbigpLAorICAgICAgICAgICAgdHJhaXRzLmVuZCgpLAorICAgICAgICAgICAgW10oc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+ICZhLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4gJmIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYS0+cmFuayA8IGItPnJhbms7CisgICAgICAgICAgICB9KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRyYWl0cy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4gJnRyYWl0ID0gdHJhaXRzW2ldOworICAgICAgICBpZiAodHJhaXQtPmRvbWFpbiA9PSBDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSCisgICAgICAgICAgICAgICAgfHwgdHJhaXQtPmRvbWFpbiA9PSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPCisgICAgICAgICAgICAgICAgfHwgdHJhaXQtPmtpbmQgIT0gQzJDb21wb25lbnQ6OktJTkRfT1RIRVIpIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgdHJhaXQtPm5hbWUgPDwgIiBpcyBpZ25vcmVkIGJlY2F1c2Ugb2YgZG9tYWluL2tpbmQ6ICIKKyAgICAgICAgICAgICAgICA8PCB0cmFpdC0+ZG9tYWluIDw8ICIvIiA8PCB0cmFpdC0+a2luZDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIERlc2NyaXB0b3IgZGVzYzsKKyAgICAgICAgaWYgKCFtUGx1Z2luLT5kZXNjcmliZSh0cmFpdC0+bmFtZSwgJmRlc2MpKSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8IHRyYWl0LT5uYW1lIDw8ICIgaXMgaWdub3JlZCBiZWNhdXNlIGRlc2NyaWJlKCkgZmFpbGVkIjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG1Db21wb25lbnRzLnB1c2hfYmFjayh7bnVsbHB0ciwgbnVsbHB0ciwgKnRyYWl0LCBkZXNjfSk7CisgICAgfQorICAgIGlmIChtQ29tcG9uZW50cy5lbXB0eSgpKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIkZpbHRlcldyYXBwZXI6IG5vIGZpbHRlciBjb21wb25lbnQgZm91bmQiOworICAgICAgICBtUGx1Z2luLnJlc2V0KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUluaXQgPSBPSzsKK30KKworRmlsdGVyV3JhcHBlcjo6fkZpbHRlcldyYXBwZXIoKSB7Cit9CisKK3N0ZDo6dmVjdG9yPEZpbHRlcldyYXBwZXI6OkNvbXBvbmVudD4gRmlsdGVyV3JhcHBlcjo6Y3JlYXRlRmlsdGVycygpIHsKKyAgICBzdGQ6OnZlY3RvcjxGaWx0ZXJXcmFwcGVyOjpDb21wb25lbnQ+IGZpbHRlcnM7CisgICAgZm9yIChjb25zdCBGaWx0ZXJXcmFwcGVyOjpDb21wb25lbnQgJmZpbHRlciA6IG1Db21wb25lbnRzKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gY29tcDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmOworICAgICAgICBpZiAoQzJfT0sgIT0gbVN0b3JlLT5jcmVhdGVDb21wb25lbnQoZmlsdGVyLnRyYWl0cy5uYW1lLCAmY29tcCkpIHsKKyAgICAgICAgICAgIHJldHVybiB7fTsKKyAgICAgICAgfQorICAgICAgICBmaWx0ZXJzLnB1c2hfYmFjayh7Y29tcCwgY29tcC0+aW50ZigpLCBmaWx0ZXIudHJhaXRzLCBmaWx0ZXIuZGVzY30pOworICAgIH0KKyAgICByZXR1cm4gZmlsdGVyczsKK30KKworQzJDb21wb25lbnQ6OlRyYWl0cyBGaWx0ZXJXcmFwcGVyOjpnZXRUcmFpdHMoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpIHsKKyAgICB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtQ2FjaGVNdXRleCk7CisgICAgICAgIGlmIChtQ2FjaGVkVHJhaXRzLmNvdW50KGludGYtPmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2FjaGVkVHJhaXRzLmF0KGludGYtPmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQzJDb21wb25lbnREb21haW5TZXR0aW5nIGRvbWFpbjsKKyAgICBDMkNvbXBvbmVudEtpbmRTZXR0aW5nIGtpbmQ7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gaW50Zi0+cXVlcnlfdmIoeyZkb21haW4sICZraW5kfSwge30sIEMyX01BWV9CTE9DSywgbnVsbHB0cik7CisgICAgQzJDb21wb25lbnQ6OlRyYWl0cyB0cmFpdHMgPSB7CisgICAgICAgICJxdWVyeSBmYWlsZWQiLCAgLy8gbmFtZQorICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSLAorICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9PVEhFUiwKKyAgICAgICAgMCwgICAvLyByYW5rLCB1bnVzZWQKKyAgICAgICAgIiIsICAvLyBtZWRpYSB0eXBlLCB1bnVzZWQKKyAgICAgICAgIiIsICAvLyBvd25lciwgdW51c2VkCisgICAgICAgIHt9LCAgLy8gYWxpYXNlcywgdW51c2VkCisgICAgfTsKKyAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgIHRyYWl0cyA9IHsKKyAgICAgICAgICAgIGludGYtPmdldE5hbWUoKSwKKyAgICAgICAgICAgIGRvbWFpbi52YWx1ZSwKKyAgICAgICAgICAgIGtpbmQudmFsdWUsCisgICAgICAgICAgICAwLCAgIC8vIHJhbmssIHVudXNlZAorICAgICAgICAgICAgIiIsICAvLyBtZWRpYSB0eXBlLCB1bnVzZWQKKyAgICAgICAgICAgICIiLCAgLy8gb3duZXIsIHVudXNlZAorICAgICAgICAgICAge30sICAvLyBhbGlhc2VzLCB1bnVzZWQKKyAgICAgICAgfTsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1DYWNoZU11dGV4KTsKKyAgICAgICAgbUNhY2hlZFRyYWl0c1t0cmFpdHMubmFtZV0gPSB0cmFpdHM7CisgICAgfQorICAgIHJldHVybiB0cmFpdHM7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gRmlsdGVyV3JhcHBlcjo6bWF5YmVXcmFwSW50ZXJmYWNlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYpIHsKKyAgICBpZiAobUluaXQgIT0gT0spIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJtYXliZVdyYXBJbnRlcmZhY2U6IFdyYXBwZXIgbm90IGluaXRpYWxpemVkOiAiCisgICAgICAgICAgICAgICAgPDwgaW50Zi0+Z2V0TmFtZSgpIDw8ICIgaXMgbm90IHdyYXBwZWQuIjsKKyAgICAgICAgcmV0dXJuIGludGY7CisgICAgfQorICAgIEMyQ29tcG9uZW50OjpUcmFpdHMgdHJhaXRzID0gZ2V0VHJhaXRzKGludGYpOworICAgIGlmICh0cmFpdHMubmFtZSAhPSBpbnRmLT5nZXROYW1lKCkpIHsKKyAgICAgICAgTE9HKElORk8pIDw8ICJtYXliZVdyYXBJbnRlcmZhY2U6IFF1ZXJ5aW5nIHRyYWl0cyBmcm9tICIgPDwgaW50Zi0+Z2V0TmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ7IG5vdCB3cmFwcGluZyB0aGUgaW50ZXJmYWNlIjsKKyAgICAgICAgcmV0dXJuIGludGY7CisgICAgfQorICAgIGlmICgodHJhaXRzLmRvbWFpbiAhPSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPICYmIHRyYWl0cy5kb21haW4gIT0gQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRSkKKyAgICAgICAgICAgIHx8IHRyYWl0cy5raW5kICE9IEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIpIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJtYXliZVdyYXBJbnRlcmZhY2U6ICIgPDwgdHJhaXRzLm5hbWUKKyAgICAgICAgICAgICAgICA8PCAiIGlzIG5vdCB2aWRlby9pbWFnZSBkZWNvZGVyOyBub3Qgd3JhcHBpbmcgdGhlIGludGVyZmFjZSI7CisgICAgICAgIHJldHVybiBpbnRmOworICAgIH0KKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxXcmFwcGVkRGVjb2RlckludGVyZmFjZT4oaW50ZiwgY3JlYXRlRmlsdGVycygpKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBGaWx0ZXJXcmFwcGVyOjptYXliZVdyYXBDb21wb25lbnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gY29tcCkgeworICAgIGlmIChtSW5pdCAhPSBPSykgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIm1heWJlV3JhcENvbXBvbmVudDogV3JhcHBlciBub3QgaW5pdGlhbGl6ZWQ6ICIKKyAgICAgICAgICAgICAgICA8PCBjb21wLT5pbnRmKCktPmdldE5hbWUoKSA8PCAiIGlzIG5vdCB3cmFwcGVkLiI7CisgICAgICAgIHJldHVybiBjb21wOworICAgIH0KKyAgICBDMkNvbXBvbmVudDo6VHJhaXRzIHRyYWl0cyA9IGdldFRyYWl0cyhjb21wLT5pbnRmKCkpOworICAgIGlmICh0cmFpdHMubmFtZSAhPSBjb21wLT5pbnRmKCktPmdldE5hbWUoKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIm1heWJlV3JhcENvbXBvbmVudDogUXVlcnlpbmcgdHJhaXRzIGZyb20gIiA8PCBjb21wLT5pbnRmKCktPmdldE5hbWUoKQorICAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkOyBub3Qgd3JhcHBpbmcgdGhlIGNvbXBvbmVudCI7CisgICAgICAgIHJldHVybiBjb21wOworICAgIH0KKyAgICBpZiAoKHRyYWl0cy5kb21haW4gIT0gQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTyAmJiB0cmFpdHMuZG9tYWluICE9IEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0UpCisgICAgICAgICAgICB8fCB0cmFpdHMua2luZCAhPSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSKSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAibWF5YmVXcmFwQ29tcG9uZW50OiAiIDw8IHRyYWl0cy5uYW1lCisgICAgICAgICAgICAgICAgPDwgIiBpcyBub3QgdmlkZW8vaW1hZ2UgZGVjb2Rlcjsgbm90IHdyYXBwaW5nIHRoZSBjb21wb25lbnQiOworICAgICAgICByZXR1cm4gY29tcDsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8Q29tcG9uZW50PiBmaWx0ZXJzID0gY3JlYXRlRmlsdGVycygpOworICAgIHN0ZDo6c2hhcmVkX3B0ciB3cmFwcGVkID0gc3RkOjptYWtlX3NoYXJlZDxXcmFwcGVkRGVjb2Rlcj4oCisgICAgICAgICAgICBjb21wLCBzdGQ6OnZlY3RvcihmaWx0ZXJzKSwgd2Vha19mcm9tX3RoaXMoKSk7CisgICAgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobVdyYXBwZWRDb21wb25lbnRzTXV0ZXgpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OndlYWtfcHRyPGNvbnN0IEMyQ29tcG9uZW50Pj4gJmNvbXBvbmVudHMgPQorICAgICAgICAgICAgbVdyYXBwZWRDb21wb25lbnRzLmVtcGxhY2VfYmFjaygpOworICAgICAgICBjb21wb25lbnRzLnB1c2hfYmFjayh3cmFwcGVkKTsKKyAgICAgICAgY29tcG9uZW50cy5wdXNoX2JhY2soY29tcCk7CisgICAgICAgIGZvciAoY29uc3QgQ29tcG9uZW50ICZmaWx0ZXIgOiBmaWx0ZXJzKSB7CisgICAgICAgICAgICBjb21wb25lbnRzLnB1c2hfYmFjayhmaWx0ZXIuY29tcCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHdyYXBwZWQ7Cit9CisKK2Jvb2wgRmlsdGVyV3JhcHBlcjo6aXNGaWx0ZXJpbmdFbmFibGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpIHsKKyAgICBpZiAobUluaXQgIT0gT0spIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJpc0ZpbHRlcmluZ0VuYWJsZWQ6IFdyYXBwZXIgbm90IGluaXRpYWxpemVkOiAiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtUGx1Z2luLT5pc0ZpbHRlcmluZ0VuYWJsZWQoaW50Zik7Cit9CisKK2MyX3N0YXR1c190IEZpbHRlcldyYXBwZXI6OmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtV3JhcHBlZENvbXBvbmVudHNNdXRleCk7CisgICAgZm9yIChhdXRvIGl0ID0gbVdyYXBwZWRDb21wb25lbnRzLmJlZ2luKCk7IGl0ICE9IG1XcmFwcGVkQ29tcG9uZW50cy5lbmQoKTsgKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcCA9IGl0LT5mcm9udCgpLmxvY2soKTsKKyAgICAgICAgaWYgKCFjb21wKSB7CisgICAgICAgICAgICBpdCA9IG1XcmFwcGVkQ29tcG9uZW50cy5lcmFzZShpdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29tcG9uZW50ID09IGNvbXApIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4+IGNvbXBvbmVudHMoaXQtPnNpemUoKSk7CisgICAgICAgICAgICBzdGQ6OnRyYW5zZm9ybSgKKyAgICAgICAgICAgICAgICAgICAgaXQtPmJlZ2luKCksIGl0LT5lbmQoKSwgY29tcG9uZW50cy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBzdGQ6OndlYWtfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiAmZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbC5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKEMyX09LID09IENyZWF0ZUNvZGVjMkJsb2NrUG9vbChhbGxvY2F0b3JJZCwgY29tcG9uZW50cywgcG9vbCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKytpdDsKKyAgICB9CisgICAgcmV0dXJuIENyZWF0ZUNvZGVjMkJsb2NrUG9vbChhbGxvY2F0b3JJZCwgY29tcG9uZW50LCBwb29sKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9GaWx0ZXJXcmFwcGVyU3R1Yi5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vRmlsdGVyV3JhcHBlclN0dWIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxY2E1OTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vRmlsdGVyV3JhcHBlclN0dWIuY3BwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUZpbHRlcldyYXBwZXJTdHViIgorCisjaW5jbHVkZSA8RmlsdGVyV3JhcHBlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0ZpbHRlcldyYXBwZXI6OkZpbHRlcldyYXBwZXIoc3RkOjp1bmlxdWVfcHRyPFBsdWdpbj4gJiYpIHsKK30KKworRmlsdGVyV3JhcHBlcjo6fkZpbHRlcldyYXBwZXIoKSB7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gRmlsdGVyV3JhcHBlcjo6bWF5YmVXcmFwSW50ZXJmYWNlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYpIHsKKyAgICByZXR1cm4gaW50ZjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBGaWx0ZXJXcmFwcGVyOjptYXliZVdyYXBDb21wb25lbnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gY29tcCkgeworICAgIHJldHVybiBjb21wOworfQorCitib29sIEZpbHRlcldyYXBwZXI6OmlzRmlsdGVyaW5nRW5hYmxlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICYpIHsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2MyX3N0YXR1c190IEZpbHRlcldyYXBwZXI6OmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCkgeworICAgIHJldHVybiBDcmVhdGVDb2RlYzJCbG9ja1Bvb2woYWxsb2NhdG9ySWQsIGNvbXBvbmVudCwgcG9vbCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vaW5jbHVkZS9jb2RlYzIvaGlkbC9wbHVnaW4vRmlsdGVyUGx1Z2luLmggYi9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vaW5jbHVkZS9jb2RlYzIvaGlkbC9wbHVnaW4vRmlsdGVyUGx1Z2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYxZjkwNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9pbmNsdWRlL2NvZGVjMi9oaWRsL3BsdWdpbi9GaWx0ZXJQbHVnaW4uaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1BMVUdJTl9GSUxURVJfUExVR0lOX0gKKworI2RlZmluZSBDT0RFQzJfSElETF9QTFVHSU5fRklMVEVSX1BMVUdJTl9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEZpbHRlclBsdWdpbl9WMSB7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IFZFUlNJT04gPSAxOworCisgICAgdmlydHVhbCB+RmlsdGVyUGx1Z2luX1YxKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIEMyQ29tcG9uZW50U3RvcmUgb2JqZWN0IHdpdGggd2hpY2ggY2xpZW50cyBjYW4gY3JlYXRlCisgICAgICogZmlsdGVyIGNvbXBvbmVudHMgLyBpbnRlcmZhY2VzLgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IGdldENvbXBvbmVudFN0b3JlKCkgPSAwOworICAgIHN0cnVjdCBEZXNjcmlwdG9yIHsKKyAgICAgICAgLy8gUGFyYW1ldGVycyB0aGF0IGNsaWVudCBzZXRzIGZvciBmaWx0ZXIgY29udHJvbC4KKyAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PEMyUGFyYW06OlR5cGU+IGNvbnRyb2xQYXJhbXM7CisgICAgICAgIC8vIFBhcmFtZXRlcnMgdGhhdCB0aGUgY29tcG9uZW50IGNoYW5nZXMgYWZ0ZXIgZmlsdGVyaW5nLgorICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8QzJQYXJhbTo6VHlwZT4gYWZmZWN0ZWRQYXJhbXM7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIERlc2NyaWJlIGEgZmlsdGVyIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lW2luXSAgZmlsdGVyJ3MgbmFtZQorICAgICAqIEBwYXJhbSBkZXNjW291dF0gcG9pbnRlciB0byBmaWx0ZXIgZGVzY3JpcHRvciB0byBiZSBwb3B1bGF0ZWQKKyAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHxuYW1lfCBpcyBpbiB0aGUgc3RvcmUgYW5kIHxkZXNjfCBpcyBwb3B1bGF0ZWQ7CisgICAgICogICAgICAgICAgZmFsc2UgaWYgfG5hbWV8IGlzIG5vdCByZWNvZ25pemVkCisgICAgICovCisgICAgdmlydHVhbCBib29sIGRlc2NyaWJlKEMyU3RyaW5nIG5hbWUsIERlc2NyaXB0b3IgKmRlc2MpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhIGNvbXBvbmVudCB3aWxsIGFwcGx5IGZpbHRlcmluZyBhZnRlciBhbGwgZ2l2ZW4gdGhlCisgICAgICogY3VycmVudCBjb25maWd1cmF0aW9uOyBmYWxzZSBpZiBpdCB3aWxsIGJlIG5vLW9wLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBpc0ZpbHRlcmluZ0VuYWJsZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50ZikgPSAwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiB7CisKK3R5cGVkZWYgaW50MzJfdCAoKkdldEZpbHRlclBsdWdpblZlcnNpb25GdW5jKSgpOworaW50MzJfdCBHZXRGaWx0ZXJQbHVnaW5WZXJzaW9uKCk7CisKK3R5cGVkZWYgdm9pZCogKCpDcmVhdGVGaWx0ZXJQbHVnaW5GdW5jKSgpOwordm9pZCAqQ3JlYXRlRmlsdGVyUGx1Z2luKCk7CisKK3R5cGVkZWYgdm9pZCAoKkRlc3Ryb3lGaWx0ZXJQbHVnaW5GdW5jKSh2b2lkICopOwordm9pZCBEZXN0cm95RmlsdGVyUGx1Z2luKHZvaWQgKnBsdWdpbik7CisKK30gIC8vIGV4dGVybiAiQyIKKworI2VuZGlmICAvLyBDT0RFQzJfSElETF9QTFVHSU5fRklMVEVSX1BMVUdJTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vaW50ZXJuYWwvRGVmYXVsdEZpbHRlclBsdWdpbi5oIGIvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL2ludGVybmFsL0RlZmF1bHRGaWx0ZXJQbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODU2MzI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL2ludGVybmFsL0RlZmF1bHRGaWx0ZXJQbHVnaW4uaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1BMVUdJTl9ERUZBVUxUX0ZJTFRFUl9QTFVHSU5fSAorCisjZGVmaW5lIENPREVDMl9ISURMX1BMVUdJTl9ERUZBVUxUX0ZJTFRFUl9QTFVHSU5fSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvcGx1Z2luL0ZpbHRlclBsdWdpbi5oPgorCisjaW5jbHVkZSA8RmlsdGVyV3JhcHBlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERlZmF1bHRGaWx0ZXJQbHVnaW4gOiBwdWJsaWMgRmlsdGVyV3JhcHBlcjo6UGx1Z2luIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBEZWZhdWx0RmlsdGVyUGx1Z2luKGNvbnN0IGNoYXIgKnBsdWdpblBhdGgpOworCisgICAgfkRlZmF1bHRGaWx0ZXJQbHVnaW4oKTsKKworICAgIHN0YXR1c190IHN0YXR1cygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1Jbml0OyB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gZ2V0U3RvcmUoKSBvdmVycmlkZSB7IHJldHVybiBtU3RvcmU7IH0KKyAgICBib29sIGRlc2NyaWJlKEMyU3RyaW5nIG5hbWUsIEZpbHRlcldyYXBwZXI6OkRlc2NyaXB0b3IgKmRlc2MpIG92ZXJyaWRlOworICAgIGJvb2wgaXNGaWx0ZXJpbmdFbmFibGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0YXR1c190IG1Jbml0OworICAgIHZvaWQgKm1IYW5kbGU7CisgICAgRGVzdHJveUZpbHRlclBsdWdpbkZ1bmMgbURlc3Ryb3lQbHVnaW47CisgICAgRmlsdGVyUGx1Z2luX1YxICptUGx1Z2luOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBtU3RvcmU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9ISURMX1BMVUdJTl9ERUZBVUxUX0ZJTFRFUl9QTFVHSU5fSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL2ludGVybmFsL0ZpbHRlcldyYXBwZXIuaCBiL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9pbnRlcm5hbC9GaWx0ZXJXcmFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNlZDQzNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9pbnRlcm5hbC9GaWx0ZXJXcmFwcGVyLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfUExVR0lOX0ZJTFRFUl9XUkFQUEVSX0gKKworI2RlZmluZSBDT0RFQzJfSElETF9QTFVHSU5fRklMVEVSX1dSQVBQRVJfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL3BsdWdpbi9GaWx0ZXJQbHVnaW4uaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUT0RPOiBkb2N1bWVudGF0aW9uCitjbGFzcyBGaWx0ZXJXcmFwcGVyIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8RmlsdGVyV3JhcHBlcj4geworcHVibGljOgorICAgIHVzaW5nIERlc2NyaXB0b3IgPSBGaWx0ZXJQbHVnaW5fVjE6OkRlc2NyaXB0b3I7CisKKyAgICBjbGFzcyBQbHVnaW4geworICAgIHB1YmxpYzoKKyAgICAgICAgUGx1Z2luKCkgPSBkZWZhdWx0OworICAgICAgICB2aXJ0dWFsIH5QbHVnaW4oKSA9IGRlZmF1bHQ7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBnZXRTdG9yZSgpID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIGRlc2NyaWJlKEMyU3RyaW5nIG5hbWUsIERlc2NyaXB0b3IgKmRlc2MpID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIGlzRmlsdGVyaW5nRW5hYmxlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKSA9IDA7CisgICAgICAgIEMyX0RPX05PVF9DT1BZKFBsdWdpbik7CisgICAgfTsKKworICAgIHN0cnVjdCBDb21wb25lbnQgeworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGNvbXA7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZjsKKyAgICAgICAgY29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cyB0cmFpdHM7CisgICAgICAgIGNvbnN0IERlc2NyaXB0b3IgZGVzYzsKKyAgICB9OworCitwcml2YXRlOgorICAgIGV4cGxpY2l0IEZpbHRlcldyYXBwZXIoc3RkOjp1bmlxdWVfcHRyPFBsdWdpbj4gJiZwbHVnaW4pOworcHVibGljOgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8RmlsdGVyV3JhcHBlcj4gQ3JlYXRlKHN0ZDo6dW5pcXVlX3B0cjxQbHVnaW4+ICYmcGx1Z2luKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8RmlsdGVyV3JhcHBlcj4obmV3IEZpbHRlcldyYXBwZXIoc3RkOjptb3ZlKHBsdWdpbikpKTsKKyAgICB9CisgICAgfkZpbHRlcldyYXBwZXIoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd3JhcHBlZCBpbnRlcmZhY2UsIG9yIHxpbnRmfCBpZiB3cmFwcGluZyBpcyBub3QgcG9zc2libGUgLyBuZWVkZWQuCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBtYXliZVdyYXBJbnRlcmZhY2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3cmFwcGVkIGNvbXBvbmVudCwgb3IgfGNvbXB8IGlmIHdyYXBwaW5nIGlzIG5vdCBwb3NzaWJsZSAvIG5lZWRlZC4KKyAgICAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1heWJlV3JhcENvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gY29tcCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHR1cmUgaWZmIHRoZSBmaWx0ZXJpbmcgd2lsbCBhcHBseSB0byB0aGUgYnVmZmVyIGluIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBib29sIGlzRmlsdGVyaW5nRW5hYmxlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKTsKKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCk7CisKK3ByaXZhdGU6CisgICAgc3RhdHVzX3QgbUluaXQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFBsdWdpbj4gbVBsdWdpbjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gbVN0b3JlOworICAgIHN0ZDo6bGlzdDxGaWx0ZXJXcmFwcGVyOjpDb21wb25lbnQ+IG1Db21wb25lbnRzOworCisgICAgc3RkOjptdXRleCBtQ2FjaGVNdXRleDsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQzJDb21wb25lbnQ6OlRyYWl0cz4gbUNhY2hlZFRyYWl0czsKKworICAgIHN0ZDo6bXV0ZXggbVdyYXBwZWRDb21wb25lbnRzTXV0ZXg7CisgICAgc3RkOjpsaXN0PHN0ZDo6dmVjdG9yPHN0ZDo6d2Vha19wdHI8Y29uc3QgQzJDb21wb25lbnQ+Pj4gbVdyYXBwZWRDb21wb25lbnRzOworCisgICAgc3RkOjp2ZWN0b3I8RmlsdGVyV3JhcHBlcjo6Q29tcG9uZW50PiBjcmVhdGVGaWx0ZXJzKCk7CisgICAgQzJDb21wb25lbnQ6OlRyYWl0cyBnZXRUcmFpdHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50Zik7CisKKyAgICBDMl9ET19OT1RfQ09QWShGaWx0ZXJXcmFwcGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfUExVR0lOX0ZJTFRFUl9XUkFQUEVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLmJwCmluZGV4IGExNmIxMDYuLjVhMjMyMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icApAQCAtMjksNiArMjksMTUgQEAKIC8vIFRoZSBzZWNjb21wX3BvbGljeSBmaWxlIG5hbWUgYW5kIGl0cyBjb250ZW50IGNhbiBiZSBtb2RpZmllZCwgYnV0IG5vdGUgdGhhdAogLy8gdmVuZG9yLmNwcCBhbHNvIG5lZWRzIHRvIGJlIHVwZGF0ZWQgYmVjYXVzZSBpdCBuZWVkcyB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUKIC8vIHNlY2NvbXAgcG9saWN5IGZpbGUgb24gdGhlIGRldmljZS4KK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfYmluYXJ5IHsKICAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjEtZGVmYXVsdC1zZXJ2aWNlIiwKICAgICB2ZW5kb3I6IHRydWUsCkBAIC01Miw2ICs2MSw5IEBACiAgICAgLy8gZGlyZWN0bHkgaW4gdGhlIG1haW4gZGV2aWNlIG1hbmlmZXN0LnhtbCBmaWxlIG9yIHZpYSB2aW50Zl9mcmFnbWVudHMuCiAgICAgLy8gKFJlbW92ZSB0aGUgbGluZSBiZWxvdyBpZiB0aGUgZW50cnkgaXMgYWxyZWFkeSBpbiB0aGUgbWFpbiBtYW5pZmVzdC4pCiAgICAgdmludGZfZnJhZ21lbnRzOiBbIm1hbmlmZXN0X21lZGlhX2MyX1YxXzFfZGVmYXVsdC54bWwiXSwKKworICAgIC8vIFJlbW92ZSB0aGlzIGxpbmUgdG8gZW5hYmxlIHRoaXMgbW9kdWxlLgorICAgIGVuYWJsZWQ6IGZhbHNlLAogfQogCiAvLyBzZWNjb21wIHBvbGljeSBmaWxlLgpAQCAtODQsNCArOTYsMyBAQAogICAgIC8vIFRoaXMgbWF5IGJlIHJlbW92ZWQuCiAgICAgcmVxdWlyZWQ6IFsiY3Jhc2hfZHVtcC5wb2xpY3kiXSwKIH0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjEtZGVmYXVsdC1hcm02NC5wb2xpY3kgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMS1kZWZhdWx0LWFybTY0LnBvbGljeQppbmRleCA0ZmFmOGIyLi44NWZkMjhkIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMS1kZWZhdWx0LWFybTY0LnBvbGljeQorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMS1kZWZhdWx0LWFybTY0LnBvbGljeQpAQCAtMzUsNyArMzUsNyBAQAogIyBvbiBBUk0gaXMgc3RhdGljYWxseSBsb2FkZWQgYXQgMHhmZmZmIDAwMDAuIFNlZQogIyBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvaW5kZXguanNwP3RvcGljPS9jb20uYXJtLmRvYy5kZGkwMjExaC9CYWJmZWVnYS5odG1sCiAjIGZvciBtb3JlIGRldGFpbHMuCi1tcmVtYXA6IGFyZzMgPT0gMworbXJlbWFwOiBhcmczID09IDMgfHwgYXJnMyA9PSBNUkVNQVBfTUFZTU9WRQogbXVubWFwOiAxCiBwcmN0bDogMQogd3JpdGV2OiAxCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy92ZW5kb3IuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvdmVuZG9yLmNwcAppbmRleCA4MWJmZmViLi4zZGRiMDM5IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy92ZW5kb3IuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3ZlbmRvci5jcHAKQEAgLTEyMiw2ICsxMjIsMTggQEAKICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldElvblVzYWdlKQogICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EbWFCdWZVc2FnZUluZm8sICJkbWFidWYtdXNhZ2UiKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdG9yZURtYUJ1ZlVzYWdlSW5mbygpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EbWFCdWZVc2FnZUluZm8sIHVzYWdlKS5mbGFncyh7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQgfCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EbWFCdWZVc2FnZUluZm8sIGNhcGFjaXR5KS5pblJhbmdlKDAsIFVJTlQzMl9NQVgsIDEwMjQpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURtYUJ1ZlVzYWdlSW5mbywgaGVhcE5hbWUpLmFueSgpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURtYUJ1ZlVzYWdlSW5mbywgYWxsb2NGbGFncykuZmxhZ3Moe30pLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0RG1hQnVmVXNhZ2UpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogICAgICAgICB9CiAKICAgICAgICAgdmlydHVhbCB+SW50ZXJmYWNlKCkgPSBkZWZhdWx0OwpAQCAtMTM1LDcgKzE0NywxNiBAQAogICAgICAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKICAgICAgICAgfQogCisgICAgICAgIHN0YXRpYyBDMlIgU2V0RG1hQnVmVXNhZ2UoYm9vbCAvKiBtYXlCbG9jayAqLywgQzJQPEMyU3RvcmVEbWFCdWZVc2FnZUluZm8+ICZtZSkgeworICAgICAgICAgICAgLy8gVmVuZG9yJ3MgVE9ETzogcHV0IGFwcHJvcHJpYXRlIG1hcHBpbmcgbG9naWMKKyAgICAgICAgICAgIHN0cm5jcHkobWUuc2V0KCkubS5oZWFwTmFtZSwgInN5c3RlbSIsIG1lLnYuZmxleENvdW50KCkpOworICAgICAgICAgICAgbWUuc2V0KCkubS5hbGxvY0ZsYWdzID0gMDsKKyAgICAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgICAgIH0KKworCiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0b3JlSW9uVXNhZ2VJbmZvPiBtSW9uVXNhZ2VJbmZvOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdG9yZURtYUJ1ZlVzYWdlSW5mbz4gbURtYUJ1ZlVzYWdlSW5mbzsKICAgICB9OwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbVJlZmxlY3RvckhlbHBlcjsKICAgICBJbnRlcmZhY2UgbUludGVyZmFjZTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0FuZHJvaWQuYnAKaW5kZXggOTQwMzRiNS4uMmJjNzQ4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnNmcGx1Z2luX2Njb2RlYyIsCiAKQEAgLTExLDYgKzIwLDcgQEAKICAgICAgICAgIkNDb2RlY0NvbmZpZy5jcHAiLAogICAgICAgICAiQ29kZWMyQnVmZmVyLmNwcCIsCiAgICAgICAgICJDb2RlYzJJbmZvQnVpbGRlci5jcHAiLAorICAgICAgICAiRnJhbWVSZWFzc2VtYmxlci5jcHAiLAogICAgICAgICAiUGlwZWxpbmVXYXRjaGVyLmNwcCIsCiAgICAgICAgICJSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuY3BwIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmNwcAppbmRleCBjNzU4OGU5Li4yNDYwNDkwIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmNwcApAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgogI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgogI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KICNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgogCiAjaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgpAQCAtMzIsMTggKzMzLDIyIEBACiAjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkL2Zkc2FuLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDx1aS9GZW5jZS5oPgogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KICNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KIAorI2luY2x1ZGUgInV0aWxzL0NvZGVjMk1hcHBlci5oIgogI2luY2x1ZGUgIkMyT01YTm9kZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIG5hbWVzcGFjZSB7CiAKK2NvbnN0ZXhwciBPTVhfVTMyIGtQb3J0SW5kZXhJbnB1dCA9IDA7CisKIGNsYXNzIEJ1ZmZlcjJEIDogcHVibGljIEMyQnVmZmVyIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBCdWZmZXIyRChDMkNvbnN0R3JhcGhpY0Jsb2NrIGJsb2NrKSA6IEMyQnVmZmVyKHsgYmxvY2sgfSkge30KQEAgLTY4LDYgKzczLDIzIEBACiAgICAgICAgIGpvYnMtPmNvbmQuYnJvYWRjYXN0KCk7CiAgICAgfQogCisgICAgdm9pZCBzZXREYXRhc3BhY2UoYW5kcm9pZF9kYXRhc3BhY2UgZGF0YXNwYWNlKSB7CisgICAgICAgIE11dGV4ZWQ8Sm9icz46OkxvY2tlZCBqb2JzKG1Kb2JzKTsKKyAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydERhdGFTcGFjZVRvVjAoZGF0YXNwYWNlKTsKKyAgICAgICAgam9icy0+Y29uZmlnVXBkYXRlLmVtcGxhY2VfYmFjayhuZXcgQzJTdHJlYW1EYXRhU3BhY2VJbmZvOjppbnB1dCgwdSwgZGF0YXNwYWNlKSk7CisgICAgICAgIGludDMyX3Qgc3RhbmRhcmQ7CisgICAgICAgIGludDMyX3QgdHJhbnNmZXI7CisgICAgICAgIGludDMyX3QgcmFuZ2U7CisgICAgICAgIENvbG9yVXRpbHM6OmdldENvbG9yQ29uZmlnRnJvbURhdGFTcGFjZShkYXRhc3BhY2UsICZyYW5nZSwgJnN0YW5kYXJkLCAmdHJhbnNmZXIpOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gY29sb3JBc3BlY3RzID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4oMHUpOworICAgICAgICBpZiAoQzJNYXBwZXI6Om1hcChzdGFuZGFyZCwgJmNvbG9yQXNwZWN0cy0+cHJpbWFyaWVzLCAmY29sb3JBc3BlY3RzLT5tYXRyaXgpCisgICAgICAgICAgICAgICAgJiYgQzJNYXBwZXI6Om1hcCh0cmFuc2ZlciwgJmNvbG9yQXNwZWN0cy0+dHJhbnNmZXIpCisgICAgICAgICAgICAgICAgJiYgQzJNYXBwZXI6Om1hcChyYW5nZSwgJmNvbG9yQXNwZWN0cy0+cmFuZ2UpKSB7CisgICAgICAgICAgICBqb2JzLT5jb25maWdVcGRhdGUucHVzaF9iYWNrKHN0ZDo6bW92ZShjb2xvckFzcGVjdHMpKTsKKyAgICAgICAgfQorICAgIH0KKwogcHJvdGVjdGVkOgogICAgIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlIHsKICAgICAgICAgY29uc3RleHByIG5zZWNzX3Qga0ludGVydmFsTnMgPSBuc2Vjc190KDEwKSAqIDEwMDAgKiAxMDAwOyAgLy8gMTBtcwpAQCAtOTksNiArMTIxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgdW5pcXVlRmRzLnB1c2hfYmFjayhzdGQ6Om1vdmUocXVldWUud29ya0xpc3QuZnJvbnQoKS5mZDEpKTsKICAgICAgICAgICAgICAgICAgICAgcXVldWUud29ya0xpc3QucG9wX2Zyb250KCk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwYXJhbSA6IGpvYnMtPmNvbmZpZ1VwZGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBpdGVtcy5mcm9udCgpLT5pbnB1dC5jb25maWdVcGRhdGUuZW1wbGFjZV9iYWNrKEMyUGFyYW06OkNvcHkoKnBhcmFtKSk7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgam9icy51bmxvY2soKTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBmZW5jZUZkIDogZmVuY2VGZHMpIHsKQEAgLTExNiw2ICsxNDEsNyBAQAogICAgICAgICAgICAgICAgIHF1ZXVlZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocXVldWVkKSB7CisgICAgICAgICAgICAgICAgam9icy0+Y29uZmlnVXBkYXRlLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CkBAIC0xNTgsNiArMTg0LDcgQEAKICAgICAgICAgc3RkOjptYXA8c3RkOjp3ZWFrX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4sCiAgICAgICAgICAgICAgICAgIFF1ZXVlLAogICAgICAgICAgICAgICAgICBzdGQ6Om93bmVyX2xlc3M8c3RkOjp3ZWFrX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4+PiBxdWV1ZXM7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gY29uZmlnVXBkYXRlOwogICAgICAgICBDb25kaXRpb24gY29uZDsKICAgICB9OwogICAgIE11dGV4ZWQ8Sm9icz4gbUpvYnM7CkBAIC0xNjksNiArMTk2LDkgQEAKICAgICAgIG1RdWV1ZVRocmVhZChuZXcgUXVldWVUaHJlYWQpIHsKICAgICBhbmRyb2lkX2Zkc2FuX3NldF9lcnJvcl9sZXZlbChBTkRST0lEX0ZEU0FOX0VSUk9SX0xFVkVMX1dBUk5fQUxXQVlTKTsKICAgICBtUXVldWVUaHJlYWQtPnJ1bigiQzJPTVhOb2RlIiwgUFJJT1JJVFlfQVVESU8pOworCisgICAgTXV0ZXhlZDxhbmRyb2lkX2RhdGFzcGFjZT46OkxvY2tlZCBkcyhtRGF0YXNwYWNlKTsKKyAgICAqZHMgPSBIQUxfREFUQVNQQUNFX1VOS05PV047CiB9CiAKIHN0YXR1c190IEMyT01YTm9kZTo6ZnJlZU5vZGUoKSB7CkBAIC0yMDAsMTEgKzIzMCwzNSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwRGVmID0gKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKilwYXJhbXM7Ci0gICAgICAgICAgICAvLyBUT0RPOiByZWFkIHRoZXNlIGZyb20gaW50ZigpCisgICAgICAgICAgICBpZiAocERlZi0+blBvcnRJbmRleCAhPSBrUG9ydEluZGV4SW5wdXQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgcERlZi0+bkJ1ZmZlckNvdW50QWN0dWFsID0gMTY7CisKKyAgICAgICAgICAgIC8vIFdPUktBUk9VTkQ6IGhhdmluZyBtb3JlIHNsb3RzIGltcHJvdmUgcGVyZm9ybWFuY2Ugd2hpbGUgY29uc3VtaW5nCisgICAgICAgICAgICAvLyBtb3JlIG1lbW9yeS4gVGhpcyBpcyBhIHRlbXBvcmFyeSB3b3JrYXJvdW5kIHRvIHJlZHVjZSBtZW1vcnkgZm9yCisgICAgICAgICAgICAvLyBsYXJnZXItdGhhbi00SyBzY2VuYXJpby4KKyAgICAgICAgICAgIGlmIChtV2lkdGggKiBtSGVpZ2h0ID4gNDA5NiAqIDIzNDApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXAgPSBtQ29tcC5sb2NrKCk7CisgICAgICAgICAgICAgICAgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6OmlucHV0IGlucHV0RGVsYXkoMCk7CisgICAgICAgICAgICAgICAgQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nIHBpcGVsaW5lRGVsYXkoMCk7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgYzJlcnIgPSBDMl9OT1RfRk9VTkQ7CisgICAgICAgICAgICAgICAgaWYgKGNvbXApIHsKKyAgICAgICAgICAgICAgICAgICAgYzJlcnIgPSBjb21wLT5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7JmlucHV0RGVsYXksICZwaXBlbGluZURlbGF5fSwge30sIEMyX0RPTlRfQkxPQ0ssIG51bGxwdHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYzJlcnIgPT0gQzJfT0sgfHwgYzJlcnIgPT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICAgICAgICAgIHBEZWYtPm5CdWZmZXJDb3VudEFjdHVhbCA9IDQ7CisgICAgICAgICAgICAgICAgICAgIHBEZWYtPm5CdWZmZXJDb3VudEFjdHVhbCArPSAoaW5wdXREZWxheSA/IGlucHV0RGVsYXkudmFsdWUgOiAwdSk7CisgICAgICAgICAgICAgICAgICAgIHBEZWYtPm5CdWZmZXJDb3VudEFjdHVhbCArPSAocGlwZWxpbmVEZWxheSA/IHBpcGVsaW5lRGVsYXkudmFsdWUgOiAwdSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBwRGVmLT5lRG9tYWluID0gT01YX1BvcnREb21haW5WaWRlbzsKICAgICAgICAgICAgIHBEZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKICAgICAgICAgICAgIHBEZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OworICAgICAgICAgICAgcERlZi0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlOwogICAgICAgICAgICAgZXJyID0gT0s7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNDMyLDggKzQ4NiwxMSBAQAogICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSA9IChhbmRyb2lkX2RhdGFzcGFjZSltc2cudS5ldmVudF9kYXRhLmRhdGExOwogICAgIHVpbnQzMl90IHBpeGVsRm9ybWF0ID0gbXNnLnUuZXZlbnRfZGF0YS5kYXRhMzsKIAotICAgIC8vIFRPRE86IHNldCBkYXRhc3BhY2Ugb24gY29tcG9uZW50IHRvIHNlZSBpZiBpdCBpbXBhY3RzIGNvbG9yIGFzcGVjdHMKICAgICBBTE9HRCgiZGF0YXNwYWNlIGNoYW5nZWQgdG8gJSN4IHBpeGVsIGZvcm1hdDogJSN4IiwgZGF0YVNwYWNlLCBwaXhlbEZvcm1hdCk7CisgICAgbVF1ZXVlVGhyZWFkLT5zZXREYXRhc3BhY2UoZGF0YVNwYWNlKTsKKworICAgIE11dGV4ZWQ8YW5kcm9pZF9kYXRhc3BhY2U+OjpMb2NrZWQgZHMobURhdGFzcGFjZSk7CisgICAgKmRzID0gZGF0YVNwYWNlOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtNDY2LDQgKzUyMyw4IEBACiAgICAgKHZvaWQpbUJ1ZmZlclNvdXJjZS0+b25JbnB1dEJ1ZmZlckVtcHRpZWQoYnVmZmVySWQsIC0xKTsKIH0KIAorYW5kcm9pZF9kYXRhc3BhY2UgQzJPTVhOb2RlOjpnZXREYXRhc3BhY2UoKSB7CisgICAgcmV0dXJuICptRGF0YXNwYWNlLmxvY2soKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuaAppbmRleCAxNzE3Yzk2Li45YzA0OTY5IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmgKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5oCkBAIC05Myw2ICs5MywxMSBAQAogICAgICAqLwogICAgIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUoYzJfY250cjY0X3QgaW5kZXgpOwogCisgICAgLyoqCisgICAgICogUmV0dXJucyBkYXRhc3BhY2UgaW5mb3JtYXRpb24gZnJvbSBHcmFwaGljQnVmZmVyU291cmNlLgorICAgICAqLworICAgIGFuZHJvaWRfZGF0YXNwYWNlIGdldERhdGFzcGFjZSgpOworCiBwcml2YXRlOgogICAgIHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wOwogICAgIHNwPElPTVhCdWZmZXJTb3VyY2U+IG1CdWZmZXJTb3VyY2U7CkBAIC0xMDEsNiArMTA2LDcgQEAKICAgICB1aW50MzJfdCBtV2lkdGg7CiAgICAgdWludDMyX3QgbUhlaWdodDsKICAgICB1aW50NjRfdCBtVXNhZ2U7CisgICAgTXV0ZXhlZDxhbmRyb2lkX2RhdGFzcGFjZT4gbURhdGFzcGFjZTsKIAogICAgIC8vIFdPUktBUk9VTkQ6IHRpbWVzdGFtcCBhZGp1c3RtZW50CiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5jcHAKaW5kZXggNTQxMDdiZC4uYjQ3ZTU0NiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5jcHAKQEAgLTM4LDEyICszOCwxNCBAQAogI2luY2x1ZGUgPG1lZGlhL29teC8xLjAvV09teE5vZGUuaD4KICNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db3JlLmg+CiAjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfSW5kZXhFeHQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT214R3JhcGhpY0J1ZmZlclNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0J1ZmZlclByb2R1Y2VyV3JhcHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL05hdGl2ZUhhbmRsZS5oPgogCiAjaW5jbHVkZSAiQzJPTVhOb2RlLmgiCiAjaW5jbHVkZSAiQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oIgpAQCAtMjEwLDggKzIxMiw2IEBACiAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0cywKICAgICAgICAgICAgICAgICAmdXNhZ2UsIHNpemVvZih1c2FnZSkpOwogCi0gICAgICAgIC8vIE5PVEU6IHdlIGRvIG5vdCB1c2UvcGFzcyB0aHJvdWdoIGNvbG9yIGFzcGVjdHMgZnJvbSBHcmFwaGljQnVmZmVyU291cmNlIGFzIHdlCi0gICAgICAgIC8vIGNvbW11bmljYXRlIHRoYXQgZGlyZWN0bHkgdG8gdGhlIGNvbXBvbmVudC4KICAgICAgICAgbVNvdXJjZS0+Y29uZmlndXJlKAogICAgICAgICAgICAgICAgIG1PbXhOb2RlLCBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6RGF0YXNwYWNlPihtRGF0YVNwYWNlKSk7CiAgICAgICAgIHJldHVybiBPSzsKQEAgLTI0Niw4ICsyNDYsMTkgQEAKICAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICAgICAgfQotICAgICAgICBjb25zdGV4cHIgc2l6ZV90IGtOdW1TbG90cyA9IDE2OwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1TbG90czsgKytpKSB7CisKKyAgICAgICAgc2l6ZV90IG51bVNsb3RzID0gMTY7CisgICAgICAgIGNvbnN0ZXhwciBPTVhfVTMyIGtQb3J0SW5kZXhJbnB1dCA9IDA7CisKKyAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBwYXJhbTsKKyAgICAgICAgcGFyYW0ublBvcnRJbmRleCA9IGtQb3J0SW5kZXhJbnB1dDsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbU5vZGUtPmdldFBhcmFtZXRlcihPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbSwgc2l6ZW9mKHBhcmFtKSk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIG51bVNsb3RzID0gcGFyYW0ubkJ1ZmZlckNvdW50QWN0dWFsOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TbG90czsgKytpKSB7CiAgICAgICAgICAgICBzb3VyY2UtPm9uSW5wdXRCdWZmZXJBZGRlZChpKTsKICAgICAgICAgfQogCkBAIC0zOTksNiArNDEwLDEwIEBACiAgICAgICAgIG1Ob2RlLT5vbklucHV0QnVmZmVyRG9uZShpbmRleCk7CiAgICAgfQogCisgICAgYW5kcm9pZF9kYXRhc3BhY2UgZ2V0RGF0YXNwYWNlKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbU5vZGUtPmdldERhdGFzcGFjZSgpOworICAgIH0KKwogcHJpdmF0ZToKICAgICBzcDxIR3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKICAgICBzcDxDMk9NWE5vZGU+IG1Ob2RlOwpAQCAtNDcxLDYgKzQ4Niw3MiBAQAogICAgIH0KIH07CiAKK3ZvaWQgUmV2ZXJ0T3V0cHV0Rm9ybWF0SWZOZWVkZWQoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb2xkRm9ybWF0LCBzcDxBTWVzc2FnZT4gJmN1cnJlbnRGb3JtYXQpIHsKKyAgICAvLyBXZSB1c2VkIHRvIG5vdCByZXBvcnQgY2hhbmdlcyB0byB0aGVzZSBrZXlzIHRvIHRoZSBjbGllbnQuCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBzSWdub3JlZEtleXMoeworICAgICAgICAgICAgS0VZX0JJVF9SQVRFLAorICAgICAgICAgICAgS0VZX0ZSQU1FX1JBVEUsCisgICAgICAgICAgICBLRVlfTUFYX0JJVF9SQVRFLAorICAgICAgICAgICAgS0VZX01BWF9XSURUSCwKKyAgICAgICAgICAgIEtFWV9NQVhfSEVJR0hULAorICAgICAgICAgICAgImNzZC0wIiwKKyAgICAgICAgICAgICJjc2QtMSIsCisgICAgICAgICAgICAiY3NkLTIiLAorICAgIH0pOworICAgIGlmIChjdXJyZW50Rm9ybWF0ID09IG9sZEZvcm1hdCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPEFNZXNzYWdlPiBkaWZmID0gY3VycmVudEZvcm1hdC0+Y2hhbmdlc0Zyb20ob2xkRm9ybWF0KTsKKyAgICBBTWVzc2FnZTo6VHlwZSB0eXBlOworICAgIGZvciAoc2l6ZV90IGkgPSBkaWZmLT5jb3VudEVudHJpZXMoKTsgaSA+IDA7IC0taSkgeworICAgICAgICBpZiAoc0lnbm9yZWRLZXlzLmNvdW50KGRpZmYtPmdldEVudHJ5TmFtZUF0KGkgLSAxLCAmdHlwZSkpID4gMCkgeworICAgICAgICAgICAgZGlmZi0+cmVtb3ZlRW50cnlBdChpIC0gMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGRpZmYtPmNvdW50RW50cmllcygpID09IDApIHsKKyAgICAgICAgY3VycmVudEZvcm1hdCA9IG9sZEZvcm1hdDsKKyAgICB9Cit9CisKK3ZvaWQgQW1lbmRPdXRwdXRGb3JtYXRXaXRoQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplLCBjb25zdCBzdGQ6OnN0cmluZyBtZWRpYVR5cGUsCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0KSB7CisgICAgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19BVkMpIHsKKyAgICAgICAgLy8gQ29kZWMgc3BlY2lmaWMgZGF0YSBzaG91bGQgYmUgU1BTIGFuZCBQUFMgaW4gYSBzaW5nbGUgYnVmZmVyLAorICAgICAgICAvLyBlYWNoIHByZWZpeGVkIGJ5IGEgc3RhcnRjb2RlICgweDAwIDB4MDAgMHgwMCAweDAxKS4KKyAgICAgICAgLy8gV2Ugc2VwYXJhdGUgdGhlIHR3byBhbmQgcHV0IHRoZW0gaW50byB0aGUgb3V0cHV0IGZvcm1hdAorICAgICAgICAvLyB1bmRlciB0aGUga2V5cyAiY3NkLTAiIGFuZCAiY3NkLTEiLgorCisgICAgICAgIHVuc2lnbmVkIGNzZEluZGV4ID0gMDsKKworICAgICAgICBjb25zdCB1aW50OF90ICpuYWxTdGFydDsKKyAgICAgICAgc2l6ZV90IG5hbFNpemU7CisgICAgICAgIHdoaWxlIChnZXROZXh0TkFMVW5pdCgmZGF0YSwgJnNpemUsICZuYWxTdGFydCwgJm5hbFNpemUsIHRydWUpID09IE9LKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBjc2QgPSBuZXcgQUJ1ZmZlcihuYWxTaXplICsgNCk7CisgICAgICAgICAgICBtZW1jcHkoY3NkLT5kYXRhKCksICJceDAwXHgwMFx4MDBceDAxIiwgNCk7CisgICAgICAgICAgICBtZW1jcHkoY3NkLT5kYXRhKCkgKyA0LCBuYWxTdGFydCwgbmFsU2l6ZSk7CisKKyAgICAgICAgICAgIG91dHB1dEZvcm1hdC0+c2V0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBBU3RyaW5nUHJpbnRmKCJjc2QtJXUiLCBjc2RJbmRleCkuY19zdHIoKSwgY3NkKTsKKworICAgICAgICAgICAgKytjc2RJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjc2RJbmRleCAhPSAyKSB7CisgICAgICAgICAgICBBTE9HVygiRXhwZWN0ZWQgdHdvIE5BTCB1bml0cyBmcm9tIEFWQyBjb2RlYyBjb25maWcsIGJ1dCAldSBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgIGNzZEluZGV4KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZvciBldmVyeXRoaW5nIGVsc2Ugd2UganVzdCBzdGFzaCB0aGUgY29kZWMgc3BlY2lmaWMgZGF0YSBpbnRvCisgICAgICAgIC8vIHRoZSBvdXRwdXQgZm9ybWF0IGFzIGEgc2luZ2xlIHBpZWNlIG9mIGNzZCB1bmRlciAiY3NkLTAiLgorICAgICAgICBzcDxBQnVmZmVyPiBjc2QgPSBuZXcgQUJ1ZmZlcihzaXplKTsKKyAgICAgICAgbWVtY3B5KGNzZC0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKKyAgICAgICAgY3NkLT5zZXRSYW5nZSgwLCBzaXplKTsKKyAgICAgICAgb3V0cHV0Rm9ybWF0LT5zZXRCdWZmZXIoImNzZC0wIiwgY3NkKTsKKyAgICB9Cit9CisKIH0gIC8vIG5hbWVzcGFjZQogCiAvLyBDQ29kZWM6OkNsaWVudExpc3RlbmVyCkBAIC01MDIsOSArNTgzLDI2IEBACiAgICAgdmlydHVhbCB2b2lkIG9uRXJyb3IoCiAgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAogICAgICAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZSB7Ci0gICAgICAgIC8vIFRPRE8KLSAgICAgICAgKHZvaWQpY29tcG9uZW50OwotICAgICAgICAodm9pZCllcnJvckNvZGU7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENvbXBvbmVudCBpcyBvbmx5IHVzZWQgZm9yIHJlcG9ydGluZyBhcyB3ZSB1c2UgYSBzZXBhcmF0ZSBsaXN0ZW5lciBmb3IgZWFjaCBpbnN0YW5jZQorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wID0gY29tcG9uZW50LmxvY2soKTsKKyAgICAgICAgICAgIGlmICghY29tcCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJDb21wb25lbnQgZGllZCB3aXRoIGVycm9yOiAweCV4IiwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIkNvbXBvbmVudCBcIiVzXCIgcmV0dXJuZWQgZXJyb3I6IDB4JXgiLCBjb21wLT5nZXROYW1lKCkuY19zdHIoKSwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCB0byBNZWRpYUNvZGVjCisgICAgICAgIC8vIE5vdGU6IGZvciBub3cgd2UgZG8gbm90IHByb3BhZ2F0ZSB0aGUgZXJyb3IgY29kZSB0byBNZWRpYUNvZGVjCisgICAgICAgIC8vIGV4Y2VwdCBmb3IgQzJfTk9fTUVNT1JZLCBhcyB3ZSB3b3VsZCBuZWVkIHRvIHRyYW5zbGF0ZSB0byBhIE1lZGlhQ29kZWMgZXJyb3IuCisgICAgICAgIHNwPENDb2RlYz4gY29kZWMobUNvZGVjLnByb21vdGUoKSk7CisgICAgICAgIGlmICghY29kZWMgfHwgIWNvZGVjLT5tQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb2RlYy0+bUNhbGxiYWNrLT5vbkVycm9yKAorICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9PSBDMl9OT19NRU1PUlkgPyBOT19NRU1PUlkgOiBVTktOT1dOX0VSUk9SLAorICAgICAgICAgICAgICAgIEFDVElPTl9DT0RFX0ZBVEFMKTsKICAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQgb25EZWF0aCgKQEAgLTczOSwxMCArODM3LDMwIEBACiAgICAgICAgICAgICBtQ2hhbm5lbC0+c2V0TWV0YU1vZGUoQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6TU9ERV9BTlcpOwogICAgICAgICB9CiAKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKICAgICAgICAgaWYgKG1zZy0+ZmluZE9iamVjdCgibmF0aXZlLXdpbmRvdyIsICZvYmopKSB7CiAgICAgICAgICAgICBzdXJmYWNlID0gc3RhdGljX2Nhc3Q8U3VyZmFjZSAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgLy8gc2V0dXAgdHVubmVsZWQgcGxheWJhY2sKKyAgICAgICAgICAgIGlmIChzdXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+Pjo6TG9ja2VkIGNvbmZpZ0xvY2tlZChtQ29uZmlnKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiAmY29uZmlnID0gKmNvbmZpZ0xvY2tlZDsKKyAgICAgICAgICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfREVDT0RFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX1ZJREVPKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHR1bm5lbGVkOworICAgICAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImZlYXR1cmUtdHVubmVsZWQtcGxheWJhY2siLCAmdHVubmVsZWQpICYmIHR1bm5lbGVkICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJDb25maWd1cmluZyBUVU5ORUxFRCB2aWRlbyBwbGF5YmFjay4iKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gY29uZmlndXJlVHVubmVsZWRWaWRlb1BsYXliYWNrKGNvbXAsICZjb25maWctPm1TaWRlYmFuZEhhbmRsZSwgbXNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY29uZmlndXJlVHVubmVsZWRWaWRlb1BsYXliYWNrIGZhaWxlZCEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tVHVubmVsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgc2V0U3VyZmFjZShzdXJmYWNlKTsKICAgICAgICAgfQogCkBAIC03NzMsMTIgKzg5MSwxNCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCB3aWR0aCA9IDA7CisgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gMDsKICAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIChDb25maWc6OklTX0lNQUdFIHwgQ29uZmlnOjpJU19WSURFTykpIHsKLSAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX1dJRFRILCAmaTMyKSkgeworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfV0lEVEgsICZ3aWR0aCkpIHsKICAgICAgICAgICAgICAgICBBTE9HRCgid2lkdGggaXMgbWlzc2luZywgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIGltYWdlL3ZpZGVvIGNvbXBvbmVudHMuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX0hFSUdIVCwgJmkzMikpIHsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX0hFSUdIVCwgJmhlaWdodCkpIHsKICAgICAgICAgICAgICAgICBBTE9HRCgiaGVpZ2h0IGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBpbWFnZS92aWRlbyBjb21wb25lbnRzLiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CkBAIC04NjcsMjMgKzk4NywxMTYgQEAKICAgICAgICAgLyoKICAgICAgICAgICogSGFuZGxlIGRlc2lyZWQgY29sb3IgZm9ybWF0LgogICAgICAgICAgKi8KKyAgICAgICAgaW50MzJfdCBkZWZhdWx0Q29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKICAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiAoQ29uZmlnOjpJU19WSURFTyB8IENvbmZpZzo6SVNfSU1BR0UpKSkgewotICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQgPSAtMTsKKyAgICAgICAgICAgIGludDMyX3QgZm9ybWF0ID0gMDsKKyAgICAgICAgICAgIC8vIFF1ZXJ5IHZlbmRvciBmb3JtYXQgZm9yIEZsZXhpYmxlIFlVVgorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBoZWFwUGFyYW1zOworICAgICAgICAgICAgQzJTdG9yZUZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yc0luZm8gKnBpeGVsRm9ybWF0SW5mbyA9IG51bGxwdHI7CisgICAgICAgICAgICBpZiAobUNsaWVudC0+cXVlcnkoCisgICAgICAgICAgICAgICAgICAgICAgICB7fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHtDMlN0b3JlRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JzSW5mbzo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAmaGVhcFBhcmFtcykgPT0gQzJfT0sKKyAgICAgICAgICAgICAgICAgICAgJiYgaGVhcFBhcmFtcy5zaXplKCkgPT0gMXUpIHsKKyAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdEluZm8gPSBDMlN0b3JlRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JzSW5mbzo6RnJvbSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBQYXJhbXNbMF0uZ2V0KCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdEluZm8gPSBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpvcHRpb25hbDx1aW50MzJfdD4gZmxleFBpeGVsRm9ybWF0e307CisgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPHVpbnQzMl90PiBmbGV4UGxhbmFyUGl4ZWxGb3JtYXR7fTsKKyAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8dWludDMyX3Q+IGZsZXhTZW1pUGxhbmFyUGl4ZWxGb3JtYXR7fTsKKyAgICAgICAgICAgIGlmIChwaXhlbEZvcm1hdEluZm8gJiYgKnBpeGVsRm9ybWF0SW5mbykgeworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGl4ZWxGb3JtYXRJbmZvLT5mbGV4Q291bnQoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JTdHJ1Y3QgJmRlc2MgPQorICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxGb3JtYXRJbmZvLT5tLnZhbHVlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MuYml0RGVwdGggIT0gOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlc2Muc3Vic2FtcGxpbmcgIT0gQzJDb2xvcjo6WVVWXzQyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oYi8xODAwNzYxMDUpOiBzb21lIGRldmljZSByZXBvcnQgd3JvbmcgbGF5b3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfHwgZGVzYy5sYXlvdXQgPT0gQzJDb2xvcjo6SU5URVJMRUFWRURfUEFDS0VECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfHwgZGVzYy5sYXlvdXQgPT0gQzJDb2xvcjo6SU5URVJMRUFWRURfQUxJR05FRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlc2MubGF5b3V0ID09IEMyQ29sb3I6OlVOS05PV05fTEFZT1VUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIWZsZXhQaXhlbEZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxleFBpeGVsRm9ybWF0ID0gZGVzYy5waXhlbEZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYy5sYXlvdXQgPT0gQzJDb2xvcjo6UExBTkFSX1BBQ0tFRCAmJiAhZmxleFBsYW5hclBpeGVsRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGV4UGxhbmFyUGl4ZWxGb3JtYXQgPSBkZXNjLnBpeGVsRm9ybWF0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjLmxheW91dCA9PSBDMkNvbG9yOjpTRU1JUExBTkFSX1BBQ0tFRCAmJiAhZmxleFNlbWlQbGFuYXJQaXhlbEZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxleFNlbWlQbGFuYXJQaXhlbEZvcm1hdCA9IGRlc2MucGl4ZWxGb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKEtFWV9DT0xPUl9GT1JNQVQsICZmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBBbHNvIGhhbmRsZSBkZWZhdWx0IGNvbG9yIGZvcm1hdCAoZW5jb2RlcnMgcmVxdWlyZSBjb2xvciBmb3JtYXQsIHNvIHRoaXMgaXMgb25seQotICAgICAgICAgICAgICAgICAqIG5lZWRlZCBmb3IgZGVjb2RlcnMuCi0gICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgLy8gQWxzbyBoYW5kbGUgZGVmYXVsdCBjb2xvciBmb3JtYXQgKGVuY29kZXJzIHJlcXVpcmUgY29sb3IgZm9ybWF0LCBzbyB0aGlzIGlzIG9ubHkKKyAgICAgICAgICAgICAgICAvLyBuZWVkZWQgZm9yIGRlY29kZXJzLgogICAgICAgICAgICAgICAgIGlmICghKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gKHN1cmZhY2UgPT0gbnVsbHB0cikgPyBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIgOiBDT0xPUl9Gb3JtYXRTdXJmYWNlOworICAgICAgICAgICAgICAgICAgICBpZiAoc3VyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcmVmaXggPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbGV4U2VtaVBsYW5hclBpeGVsRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAic2VtaS0iOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ2xpZW50IHJlcXVlc3RlZCBCeXRlQnVmZmVyIG1vZGUgZGVjb2RlciB3L28gY29sb3IgZm9ybWF0IHNldDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgZGVmYXVsdCAlc3BsYW5hciBjb2xvciBmb3JtYXQiLCBwcmVmaXgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQ09MT1JfRm9ybWF0U3VyZmFjZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29sb3JGb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikgfHwgIXN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gZmxleFBpeGVsRm9ybWF0LnZhbHVlX29yKENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IGZsZXhQbGFuYXJQaXhlbEZvcm1hdC52YWx1ZV9vcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsZXhQaXhlbEZvcm1hdC52YWx1ZV9vcihmb3JtYXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBmbGV4U2VtaVBsYW5hclBpeGVsRm9ybWF0LnZhbHVlX29yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxleFBpeGVsRm9ybWF0LnZhbHVlX29yKGZvcm1hdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOby1vcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoZm9ybWF0ID49IDApIHsKKyAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gMCkgewogICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImFuZHJvaWQuX2NvbG9yLWZvcm1hdCIsIGZvcm1hdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICAvKgorICAgICAgICAgKiBIYW5kbGUgZGF0YXNwYWNlCisgICAgICAgICAqLworICAgICAgICBpbnQzMl90IHVzaW5nUmVjb3JkZXI7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5fdXNpbmctcmVjb3JkZXIiLCAmdXNpbmdSZWNvcmRlcikgJiYgdXNpbmdSZWNvcmRlcikgeworICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9CVDcwOTsKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpCisgICAgICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzOworICAgICAgICAgICAgICAgIGdldENvbG9yQXNwZWN0c0Zyb21Gb3JtYXQobXNnLCBhc3BlY3RzKTsKKyAgICAgICAgICAgICAgICBzZXREZWZhdWx0Q29kZWNDb2xvckFzcGVjdHNJZk5lZWRlZChhc3BlY3RzLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiByZWFkIGRhdGFzcGFjZSAvIGNvbG9yIGFzcGVjdCBmcm9tIHRoZSBjb21wb25lbnQKKyAgICAgICAgICAgICAgICBzZXRDb2xvckFzcGVjdHNJbnRvRm9ybWF0KGFzcGVjdHMsIGNvbnN0X2Nhc3Q8c3A8QU1lc3NhZ2U+ICY+KG1zZykpOworICAgICAgICAgICAgICAgIGRhdGFTcGFjZSA9IGdldERhdGFTcGFjZUZvckNvbG9yQXNwZWN0cyhhc3BlY3RzLCB0cnVlIC8qIG1heWV4cGFuZCAqLyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCAoaW50MzJfdClkYXRhU3BhY2UpOworICAgICAgICAgICAgQUxPR0QoInNldHRpbmcgZGF0YXNwYWNlIHRvICV4IiwgZGF0YVNwYWNlKTsKKyAgICAgICAgfQorCiAgICAgICAgIGludDMyX3Qgc3Vic2NyaWJlVG9BbGxWZW5kb3JQYXJhbXM7CiAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigieC0qIiwgJnN1YnNjcmliZVRvQWxsVmVuZG9yUGFyYW1zKSAmJiBzdWJzY3JpYmVUb0FsbFZlbmRvclBhcmFtcykgewogICAgICAgICAgICAgaWYgKGNvbmZpZy0+c3Vic2NyaWJlVG9BbGxWZW5kb3JQYXJhbXMoY29tcCwgQzJfTUFZX0JMT0NLKSAhPSBPSykgewpAQCAtOTAwLDcgKzExMTMsNyBAQAogICAgICAgICAgICAgc2RrUGFyYW1zID0gbXNnLT5kdXAoKTsKICAgICAgICAgICAgIHNka1BhcmFtcy0+cmVtb3ZlRW50cnlBdChzZGtQYXJhbXMtPmZpbmRFbnRyeUJ5TmFtZShQQVJBTUVURVJfS0VZX1ZJREVPX0JJVFJBVEUpKTsKICAgICAgICAgfQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb25maWctPmdldENvbmZpZ1VwZGF0ZUZyb21TZGtQYXJhbXMoCisgICAgICAgIGVyciA9IGNvbmZpZy0+Z2V0Q29uZmlnVXBkYXRlRnJvbVNka1BhcmFtcygKICAgICAgICAgICAgICAgICBjb21wLCBzZGtQYXJhbXMsIENvbmZpZzo6SVNfQ09ORklHLCBDMl9ET05UX0JMT0NLLCAmY29uZmlnVXBkYXRlKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byBjb252ZXJ0IGNvbmZpZ3VyYXRpb24gdG8gYzIgcGFyYW1zIik7CkBAIC05MjEsNiArMTEzNCw0NSBAQAogICAgICAgICAgICAgY29uZmlnVXBkYXRlLnB1c2hfYmFjayhzdGQ6Om1vdmUoZ29wKSk7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikKKyAgICAgICAgICAgICAgICAmJiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19WSURFTykpIHsKKyAgICAgICAgICAgIC8vIHdlIG1heSBub3QgdXNlIGFsbCAzIG9mIHRoZXNlIGVudHJpZXMKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbVBpY3R1cmVRdWFudGl6YXRpb25UdW5pbmc6Om91dHB1dD4gcXAgPQorICAgICAgICAgICAgICAgIEMyU3RyZWFtUGljdHVyZVF1YW50aXphdGlvblR1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgzIC8qIGZsZXhDb3VudCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUgLyogc3RyZWFtICovKTsKKworICAgICAgICAgICAgaW50IGl4ID0gMDsKKworICAgICAgICAgICAgaW50MzJfdCBpTWF4ID0gSU5UMzJfTUFYOworICAgICAgICAgICAgaW50MzJfdCBpTWluID0gSU5UMzJfTUlOOworICAgICAgICAgICAgKHZvaWQpIHNka1BhcmFtcy0+ZmluZEludDMyKEtFWV9WSURFT19RUF9JX01BWCwgJmlNYXgpOworICAgICAgICAgICAgKHZvaWQpIHNka1BhcmFtcy0+ZmluZEludDMyKEtFWV9WSURFT19RUF9JX01JTiwgJmlNaW4pOworICAgICAgICAgICAgaWYgKGlNYXggIT0gSU5UMzJfTUFYIHx8IGlNaW4gIT0gSU5UMzJfTUlOKSB7CisgICAgICAgICAgICAgICAgcXAtPm0udmFsdWVzW2l4KytdID0ge0lfRlJBTUUsIGlNaW4sIGlNYXh9OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQzMl90IHBNYXggPSBJTlQzMl9NQVg7CisgICAgICAgICAgICBpbnQzMl90IHBNaW4gPSBJTlQzMl9NSU47CisgICAgICAgICAgICAodm9pZCkgc2RrUGFyYW1zLT5maW5kSW50MzIoS0VZX1ZJREVPX1FQX1BfTUFYLCAmcE1heCk7CisgICAgICAgICAgICAodm9pZCkgc2RrUGFyYW1zLT5maW5kSW50MzIoS0VZX1ZJREVPX1FQX1BfTUlOLCAmcE1pbik7CisgICAgICAgICAgICBpZiAocE1heCAhPSBJTlQzMl9NQVggfHwgcE1pbiAhPSBJTlQzMl9NSU4pIHsKKyAgICAgICAgICAgICAgICBxcC0+bS52YWx1ZXNbaXgrK10gPSB7UF9GUkFNRSwgcE1pbiwgcE1heH07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDMyX3QgYk1heCA9IElOVDMyX01BWDsKKyAgICAgICAgICAgIGludDMyX3QgYk1pbiA9IElOVDMyX01JTjsKKyAgICAgICAgICAgICh2b2lkKSBzZGtQYXJhbXMtPmZpbmRJbnQzMihLRVlfVklERU9fUVBfQl9NQVgsICZiTWF4KTsKKyAgICAgICAgICAgICh2b2lkKSBzZGtQYXJhbXMtPmZpbmRJbnQzMihLRVlfVklERU9fUVBfQl9NSU4sICZiTWluKTsKKyAgICAgICAgICAgIGlmIChiTWF4ICE9IElOVDMyX01BWCB8fCBiTWluICE9IElOVDMyX01JTikgeworICAgICAgICAgICAgICAgIHFwLT5tLnZhbHVlc1tpeCsrXSA9IHtCX0ZSQU1FLCBiTWluLCBiTWF4fTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYWRqdXN0IHRvIHJlZmxlY3QgYWN0dWFsIHVzZS4KKyAgICAgICAgICAgIHFwLT5zZXRGbGV4Q291bnQoaXgpOworCisgICAgICAgICAgICBjb25maWdVcGRhdGUucHVzaF9iYWNrKHN0ZDo6bW92ZShxcCkpOworICAgICAgICB9CisKICAgICAgICAgZXJyID0gY29uZmlnLT5zZXRQYXJhbWV0ZXJzKGNvbXAsIGNvbmZpZ1VwZGF0ZSwgQzJfRE9OVF9CTE9DSyk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gY29uZmlndXJlIGMyIHBhcmFtcyIpOwpAQCAtOTMyLDcgKzExODQsMTAgQEAKICAgICAgICAgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQgbWF4SW5wdXRTaXplKDB1LCAwdSk7CiAgICAgICAgIEMyUHJlcGVuZEhlYWRlck1vZGVTZXR0aW5nIHByZXBlbmQoUFJFUEVORF9IRUFERVJfVE9fTk9ORSk7CiAKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggY29sb3JBc3BlY3RzUmVxdWVzdEluZGV4ID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFIHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19SRVFVRVNUX0ZMQUc7CiAgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxDMlBhcmFtOjpJbmRleD4gaW5kaWNlcyB7CisgICAgICAgICAgICBjb2xvckFzcGVjdHNSZXF1ZXN0SW5kZXgud2l0aFN0cmVhbSgwdSksCiAgICAgICAgIH07CiAgICAgICAgIGMyX3N0YXR1c190IGMyZXJyID0gY29tcC0+cXVlcnkoCiAgICAgICAgICAgICAgICAgeyAmdXNhZ2UsICZtYXhJbnB1dFNpemUsICZwcmVwZW5kIH0sCkBAIC05NDMsMTEgKzExOTgsNiBAQAogICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBxdWVyeSBjb21wb25lbnQgaW50ZXJmYWNlOiAlZCIsIGMyZXJyKTsKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IGluZGljZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ29tcG9uZW50IHJldHVybnMgd3JvbmcgbnVtYmVyIG9mIHBhcmFtczogZXhwZWN0ZWQgJXp1IGFjdHVhbCAlenUiLAotICAgICAgICAgICAgICAgICAgICBpbmRpY2VzLnNpemUoKSwgcGFyYW1zLnNpemUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQogICAgICAgICBpZiAodXNhZ2UpIHsKICAgICAgICAgICAgIGlmICh1c2FnZS52YWx1ZSAmIEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSB7CiAgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDMyKCJ1c2luZy1zdy1yZWFkLW9mdGVuIiwgdHJ1ZSk7CkBAIC0xMDEyLDEzICsxMjYyLDE0IEBACiAgICAgICAgIGludDMyX3QgY2xpZW50UHJlcGVuZDsKICAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX1ZJREVPKQogICAgICAgICAgICAgICAgICYmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpCi0gICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoS0VZX1BSRVBFTkRfSEVBREVSU19UT19TWU5DX0ZSQU1FUywgJmNsaWVudFByZXBlbmQpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoS0VZX1BSRVBFTkRfSEVBREVSX1RPX1NZTkNfRlJBTUVTLCAmY2xpZW50UHJlcGVuZCkKICAgICAgICAgICAgICAgICAmJiBjbGllbnRQcmVwZW5kCiAgICAgICAgICAgICAgICAgJiYgKCFwcmVwZW5kIHx8IHByZXBlbmQudmFsdWUgIT0gUFJFUEVORF9IRUFERVJfVE9fQUxMX1NZTkMpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBLRVlfUFJFUEVORF9IRUFERVJTX1RPX1NZTkNfRlJBTUVTIik7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBLRVlfUFJFUEVORF9IRUFERVJfVE9fU1lOQ19GUkFNRVMiKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIAorICAgICAgICBpbnQzMl90IGNvbXBvbmVudENvbG9yRm9ybWF0ID0gMDsKICAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiAoQ29uZmlnOjpJU19WSURFTyB8IENvbmZpZzo6SVNfSU1BR0UpKSkgewogICAgICAgICAgICAgLy8gcHJvcGFnYXRlIEhEUiBzdGF0aWMgaW5mbyB0byBvdXRwdXQgZm9ybWF0IGZvciBib3RoIGVuY29kZXJzIGFuZCBkZWNvZGVycwogICAgICAgICAgICAgLy8gaWYgY29tcG9uZW50IHN1cHBvcnRzIHRoaXMgaW5mbywgd2Ugd2lsbCB1cGRhdGUgZnJvbSBjb21wb25lbnQsIGJ1dCBvbmx5IHRoZSByYXcgcG9ydCwKQEAgLTEwMzEsMTIgKzEyODIsMTYgQEAKIAogICAgICAgICAgICAgLy8gU2V0IGRlc2lyZWQgY29sb3IgZm9ybWF0IGZyb20gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIKICAgICAgICAgICAgIGludDMyX3QgZm9ybWF0OwotICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJhbmRyb2lkLl9jb2xvci1mb3JtYXQiLCAmZm9ybWF0KSkgewotICAgICAgICAgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9GT1JNQVQsIGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfRk9STUFULCBmb3JtYXQpOworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfQ09MT1JfRk9STUFULCAmZm9ybWF0KSkgeworICAgICAgICAgICAgICAgIGZvcm1hdCA9IGRlZmF1bHRDb2xvckZvcm1hdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX0ZPUk1BVCwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImFuZHJvaWQuX2NvbG9yLWZvcm1hdCIsICZjb21wb25lbnRDb2xvckZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDMyKCJhbmRyb2lkLl9jb2xvci1mb3JtYXQiLCBjb21wb25lbnRDb2xvckZvcm1hdCk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9GT1JNQVQsIGZvcm1hdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTA2NCw4ICsxMzE5LDg2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBBTE9HRCgic2V0dXAgZm9ybWF0cyBpbnB1dDogJXMgYW5kIG91dHB1dDogJXMiLAotICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCksCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBjb2xvclRyYW5zZmVyUmVxdWVzdFBhcmFtOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiAmcGFyYW0gOiBwYXJhbXMpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbS0+aW5kZXgoKSA9PSBjb2xvckFzcGVjdHNSZXF1ZXN0SW5kZXgud2l0aFN0cmVhbSgwdSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiZm91bmQgY29sb3IgdHJhbnNmZXIgcmVxdWVzdCBwYXJhbSIpOworICAgICAgICAgICAgICAgIGNvbG9yVHJhbnNmZXJSZXF1ZXN0UGFyYW0gPSBzdGQ6Om1vdmUocGFyYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludDMyX3QgY29sb3JUcmFuc2ZlclJlcXVlc3QgPSAwOworICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgKENvbmZpZzo6SVNfSU1BR0UgfCBDb25maWc6OklTX1ZJREVPKQorICAgICAgICAgICAgICAgICYmICFzZGtQYXJhbXMtPmZpbmRJbnQzMigiY29sb3ItdHJhbnNmZXItcmVxdWVzdCIsICZjb2xvclRyYW5zZmVyUmVxdWVzdCkpIHsKKyAgICAgICAgICAgIGNvbG9yVHJhbnNmZXJSZXF1ZXN0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2xvclRyYW5zZmVyUmVxdWVzdCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoY29sb3JUcmFuc2ZlclJlcXVlc3RQYXJhbSAmJiAqY29sb3JUcmFuc2ZlclJlcXVlc3RQYXJhbSkgeworICAgICAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0ICppbmZvID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQgKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JUcmFuc2ZlclJlcXVlc3RQYXJhbS5nZXQoKSk7CisgICAgICAgICAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKGluZm8tPnRyYW5zZmVyLCAmY29sb3JUcmFuc2ZlclJlcXVlc3QpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbG9yVHJhbnNmZXJSZXF1ZXN0ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbG9yVHJhbnNmZXJSZXF1ZXN0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMigiY29sb3ItdHJhbnNmZXItcmVxdWVzdCIsIGNvbG9yVHJhbnNmZXJSZXF1ZXN0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb21wb25lbnRDb2xvckZvcm1hdCAhPSAwICYmIGNvbXBvbmVudENvbG9yRm9ybWF0ICE9IENPTE9SX0Zvcm1hdFN1cmZhY2UpIHsKKyAgICAgICAgICAgIC8vIE5lZWQgdG8gZ2V0IHN0cmlkZS92c3RyaWRlCisgICAgICAgICAgICB1aW50MzJfdCBwaXhlbEZvcm1hdCA9IFBJWEVMX0ZPUk1BVF9VTktOT1dOOworICAgICAgICAgICAgaWYgKEMyTWFwcGVyOjptYXBQaXhlbEZvcm1hdEZyYW1ld29ya1RvQ29kZWMoY29tcG9uZW50Q29sb3JGb3JtYXQsICZwaXhlbEZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiByZXRyaWV2ZSB0aGVzZSB2YWx1ZXMgd2l0aG91dCBhbGxvY2F0aW5nIGEgYnVmZmVyLgorICAgICAgICAgICAgICAgIC8vICAgICAgIEN1cnJlbnRseSBhbGxvY2F0aW5nIGEgYnVmZmVyIGlzIG5lY2Vzc2FyeSB0byByZXRyaWV2ZSB0aGUgbGF5b3V0LgorICAgICAgICAgICAgICAgIGludDY0X3QgYmxvY2tVc2FnZSA9CisgICAgICAgICAgICAgICAgICAgIHVzYWdlLnZhbHVlIHwgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQgfCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEU7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jayA9IEZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcGl4ZWxGb3JtYXQsIGJsb2NrVXNhZ2UsIHtjb21wLT5nZXROYW1lKCl9KTsKKyAgICAgICAgICAgICAgICBzcDxHcmFwaGljQmxvY2tCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBpZiAoYmxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gR3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShzaXplX3Qgc2l6ZSkgLT4gc3A8QUJ1ZmZlcj4geyByZXR1cm4gbmV3IEFCdWZmZXIoc2l6ZSk7IH0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBncmFwaGljIGJsb2NrICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHdpZHRoPSVkIGhlaWdodD0lZCBwaXhlbEZvcm1hdD0ldSB1c2FnZT0lbGx4KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcGl4ZWxGb3JtYXQsIChsb25nIGxvbmcpYmxvY2tVc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCBieXRlIGJ1ZmZlciBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgICAgIC8vIGFueXdheS4gU2tpcCBzZXR0aW5nIHN0cmlkZS92c3RyaWRlIHRvIGlucHV0IGZvcm1hdC4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBpbWFnZURhdGEgPSBidWZmZXItPmdldEltYWdlRGF0YSgpOworICAgICAgICAgICAgICAgICAgICBNZWRpYUltYWdlMiAqaW1nID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlRGF0YSAmJiBpbWFnZURhdGEtPmRhdGEoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGltYWdlRGF0YS0+c2l6ZSgpID49IHNpemVvZihNZWRpYUltYWdlMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltZyA9IChNZWRpYUltYWdlMiopaW1hZ2VEYXRhLT5kYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGltZyAmJiBpbWctPm1OdW1QbGFuZXMgPiAwICYmIGltZy0+bVR5cGUgIT0gaW1nLT5NRURJQV9JTUFHRV9UWVBFX1VOS05PV04pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaWRlID0gaW1nLT5tUGxhbmVbMF0ubVJvd0luYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfU1RSSURFLCBzdHJpZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltZy0+bU51bVBsYW5lcyA+IDEgJiYgc3RyaWRlID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0RGVsdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdClpbWctPm1QbGFuZVsxXS5tT2Zmc2V0IC0gKGludDY0X3QpaW1nLT5tUGxhbmVbMF0ubU9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0RGVsdGEgJSBzdHJpZGUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZzdHJpZGUgPSBpbnQzMl90KG9mZnNldERlbHRhIC8gc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDMyKEtFWV9TTElDRV9IRUlHSFQsIHZzdHJpZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJDYW5ub3QgcmVwb3J0IGFjY3VyYXRlIHNsaWNlIGhlaWdodDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXREZWx0YSA9ICVsbGQgc3RyaWRlID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpb2Zmc2V0RGVsdGEsIHN0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQUxPR0QoInNldHVwIGZvcm1hdHMgaW5wdXQ6ICVzIiwKKyAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgQUxPR0QoInNldHVwIGZvcm1hdHMgb3V0cHV0OiAlcyIsCiAgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfTsKQEAgLTEwNzYsNiArMTQwOSw4IEBACiAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPj46OkxvY2tlZCBjb25maWdMb2NrZWQobUNvbmZpZyk7CiAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPENvbmZpZz4gJmNvbmZpZyA9ICpjb25maWdMb2NrZWQ7CiAKKyAgICBjb25maWctPnF1ZXJ5Q29uZmlndXJhdGlvbihjb21wKTsKKwogICAgIG1DYWxsYmFjay0+b25Db21wb25lbnRDb25maWd1cmVkKGNvbmZpZy0+bUlucHV0Rm9ybWF0LCBjb25maWctPm1PdXRwdXRGb3JtYXQpOwogfQogCkBAIC0xMzI0LDYgKzE2NTksNyBAQAogICAgICAgICBvdXRwdXRGb3JtYXQgPSBjb25maWctPm1PdXRwdXRGb3JtYXQgPSBjb25maWctPm1PdXRwdXRGb3JtYXQtPmR1cCgpOwogICAgICAgICBpZiAoY29uZmlnLT5tSW5wdXRTdXJmYWNlKSB7CiAgICAgICAgICAgICBlcnIyID0gY29uZmlnLT5tSW5wdXRTdXJmYWNlLT5zdGFydCgpOworICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRTdXJmYWNlRGF0YXNwYWNlID0gY29uZmlnLT5tSW5wdXRTdXJmYWNlLT5nZXREYXRhc3BhY2UoKTsKICAgICAgICAgfQogICAgICAgICBidWZmZXJzQm91bmRUb0NvZGVjID0gY29uZmlnLT5tQnVmZmVyc0JvdW5kVG9Db2RlYzsKICAgICB9CkBAIC0xNDExLDYgKzE3NDcsNyBAQAogICAgICAgICBpZiAoY29uZmlnLT5tSW5wdXRTdXJmYWNlKSB7CiAgICAgICAgICAgICBjb25maWctPm1JbnB1dFN1cmZhY2UtPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZSA9IG51bGxwdHI7CisgICAgICAgICAgICBjb25maWctPm1JbnB1dFN1cmZhY2VEYXRhc3BhY2UgPSBIQUxfREFUQVNQQUNFX1VOS05PV047CiAgICAgICAgIH0KICAgICB9CiAgICAgewpAQCAtMTQ2MCw2ICsxNzk3LDcgQEAKICAgICAgICAgaWYgKGNvbmZpZy0+bUlucHV0U3VyZmFjZSkgewogICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRTdXJmYWNlLT5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgICBjb25maWctPm1JbnB1dFN1cmZhY2UgPSBudWxscHRyOworICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRTdXJmYWNlRGF0YXNwYWNlID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNDk3LDYgKzE4MzUsMjEgQEAKIH0KIAogc3RhdHVzX3QgQ0NvZGVjOjpzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+Pjo6TG9ja2VkIGNvbmZpZ0xvY2tlZChtQ29uZmlnKTsKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPENvbmZpZz4gJmNvbmZpZyA9ICpjb25maWdMb2NrZWQ7CisgICAgICAgIGlmIChjb25maWctPm1UdW5uZWxlZCAmJiBjb25maWctPm1TaWRlYmFuZEhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzcDxBTmF0aXZlV2luZG93PiBuYXRpdmVXaW5kb3cgPSBzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93ICo+KHN1cmZhY2UuZ2V0KCkpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfc2lkZWJhbmRfc3RyZWFtKAorICAgICAgICAgICAgICAgICAgICBuYXRpdmVXaW5kb3cuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KGNvbmZpZy0+bVNpZGViYW5kSGFuZGxlLT5oYW5kbGUoKSkpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJOYXRpdmVXaW5kb3coJXApIG5hdGl2ZV93aW5kb3dfc2V0X3NpZGViYW5kX3N0cmVhbSglcCkgZmFpbGVkISAoZXJyICVkKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlV2luZG93LmdldCgpLCBjb25maWctPm1TaWRlYmFuZEhhbmRsZS0+aGFuZGxlKCksIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KICAgICByZXR1cm4gbUNoYW5uZWwtPnNldFN1cmZhY2Uoc3VyZmFjZSk7CiB9CiAKQEAgLTE1ODEsNyArMTkzNCw5IEBACiAgICAgewogICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+Pjo6TG9ja2VkIGNvbmZpZ0xvY2tlZChtQ29uZmlnKTsKICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPENvbmZpZz4gJmNvbmZpZyA9ICpjb25maWdMb2NrZWQ7CisgICAgICAgIHNwPEFNZXNzYWdlPiBvdXRwdXRGb3JtYXQgPSBjb25maWctPm1PdXRwdXRGb3JtYXQ7CiAgICAgICAgIGNvbmZpZy0+cXVlcnlDb25maWd1cmF0aW9uKGNvbXApOworICAgICAgICBSZXZlcnRPdXRwdXRGb3JtYXRJZk5lZWRlZChvdXRwdXRGb3JtYXQsIGNvbmZpZy0+bU91dHB1dEZvcm1hdCk7CiAgICAgfQogCiAgICAgKHZvaWQpbUNoYW5uZWwtPnN0YXJ0KG51bGxwdHIsIG51bGxwdHIsIFsmXXsKQEAgLTE2MjcsNiArMTk4MiwxMiBAQAogICAgICAgICBwYXJhbXMtPnJlbW92ZUVudHJ5QXQocGFyYW1zLT5maW5kRW50cnlCeU5hbWUoS0VZX0JJVF9SQVRFKSk7CiAgICAgfQogCisgICAgaW50MzJfdCBzeW5jSWQgPSAwOworICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiYXVkaW8taHctc3luYyIsICZzeW5jSWQpCisgICAgICAgICAgICB8fCBwYXJhbXMtPmZpbmRJbnQzMigiaHctYXYtc3luYy1pZCIsICZzeW5jSWQpKSB7CisgICAgICAgIGNvbmZpZ3VyZVR1bm5lbGVkVmlkZW9QbGF5YmFjayhjb21wLCBudWxscHRyLCBwYXJhbXMpOworICAgIH0KKwogICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPENvbmZpZz4+OjpMb2NrZWQgY29uZmlnTG9ja2VkKG1Db25maWcpOwogICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+ICZjb25maWcgPSAqY29uZmlnTG9ja2VkOwogCkBAIC0xNjY5LDcgKzIwMzAsOSBAQAogICAgICAgICAgICAgICAgICAgICB8fCBjb21wLT5nZXROYW1lKCkuZmluZCgiYzIuYW5kcm9pZC4iKSA9PSAwKSkgewogICAgICAgICBtQ2hhbm5lbC0+c2V0UGFyYW1ldGVycyhjb25maWdVcGRhdGUpOwogICAgIH0gZWxzZSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBvdXRwdXRGb3JtYXQgPSBjb25maWctPm1PdXRwdXRGb3JtYXQ7CiAgICAgICAgICh2b2lkKWNvbmZpZy0+c2V0UGFyYW1ldGVycyhjb21wLCBjb25maWdVcGRhdGUsIEMyX01BWV9CTE9DSyk7CisgICAgICAgIFJldmVydE91dHB1dEZvcm1hdElmTmVlZGVkKG91dHB1dEZvcm1hdCwgY29uZmlnLT5tT3V0cHV0Rm9ybWF0KTsKICAgICB9CiB9CiAKQEAgLTE2OTYsNiArMjA1OSwzOSBAQAogICAgIGNvbmZpZy0+c2V0UGFyYW1ldGVycyhjb21wLCBwYXJhbXMsIEMyX01BWV9CTE9DSyk7CiB9CiAKK3N0YXR1c190IENDb2RlYzo6cXVlcnlTdXBwb3J0ZWRQYXJhbWV0ZXJzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAqbmFtZXMpIHsKKyAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+Pjo6TG9ja2VkIGNvbmZpZ0xvY2tlZChtQ29uZmlnKTsKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiAmY29uZmlnID0gKmNvbmZpZ0xvY2tlZDsKKyAgICByZXR1cm4gY29uZmlnLT5xdWVyeVN1cHBvcnRlZFBhcmFtZXRlcnMobmFtZXMpOworfQorCitzdGF0dXNfdCBDQ29kZWM6OmRlc2NyaWJlUGFyYW1ldGVyKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgQ29kZWNQYXJhbWV0ZXJEZXNjcmlwdG9yICpkZXNjKSB7CisgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPj46OkxvY2tlZCBjb25maWdMb2NrZWQobUNvbmZpZyk7CisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPENvbmZpZz4gJmNvbmZpZyA9ICpjb25maWdMb2NrZWQ7CisgICAgcmV0dXJuIGNvbmZpZy0+ZGVzY3JpYmUobmFtZSwgZGVzYyk7Cit9CisKK3N0YXR1c190IENDb2RlYzo6c3Vic2NyaWJlVG9QYXJhbWV0ZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmbmFtZXMpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXAgPSBtU3RhdGUubG9jaygpLT5jb21wOworICAgIGlmICghY29tcCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPENvbmZpZz4+OjpMb2NrZWQgY29uZmlnTG9ja2VkKG1Db25maWcpOworICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+ICZjb25maWcgPSAqY29uZmlnTG9ja2VkOworICAgIHJldHVybiBjb25maWctPnN1YnNjcmliZVRvVmVuZG9yQ29uZmlnVXBkYXRlKGNvbXAsIG5hbWVzKTsKK30KKworc3RhdHVzX3QgQ0NvZGVjOjp1bnN1YnNjcmliZUZyb21QYXJhbWV0ZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmbmFtZXMpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXAgPSBtU3RhdGUubG9jaygpLT5jb21wOworICAgIGlmICghY29tcCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPENvbmZpZz4+OjpMb2NrZWQgY29uZmlnTG9ja2VkKG1Db25maWcpOworICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+ICZjb25maWcgPSAqY29uZmlnTG9ja2VkOworICAgIHJldHVybiBjb25maWctPnVuc3Vic2NyaWJlRnJvbVZlbmRvckNvbmZpZ1VwZGF0ZShjb21wLCBuYW1lcyk7Cit9CisKIHZvaWQgQ0NvZGVjOjpvbldvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJndvcmtJdGVtcykgewogICAgIGlmICghd29ya0l0ZW1zLmVtcHR5KCkpIHsKICAgICAgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+Pjo6TG9ja2VkIHF1ZXVlKG1Xb3JrRG9uZVF1ZXVlKTsKQEAgLTE3OTIsNzggKzIxODgsOTQgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gaGFuZGxlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBpbiB3b3JrIGRvbmUKLSAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPENvbmZpZz4+OjpMb2NrZWQgY29uZmlnTG9ja2VkKG1Db25maWcpOwotICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPENvbmZpZz4gJmNvbmZpZyA9ICpjb25maWdMb2NrZWQ7Ci0gICAgICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIENvbmZpZzo6V2F0Y2hlcjxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBpbml0RGF0YSA9Ci0gICAgICAgICAgICAgICAgY29uZmlnLT53YXRjaDxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PigpOwotICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpCi0gICAgICAgICAgICAgICAgICAgICYmICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIEMyRnJhbWVEYXRhOjpGTEFHX0RJU0NBUkRfRlJBTUUpID09IDApIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBpbml0RGF0YTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBvdXRwdXRGb3JtYXQgPSBudWxscHRyOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPENvbmZpZz4+OjpMb2NrZWQgY29uZmlnTG9ja2VkKG1Db25maWcpOworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+ICZjb25maWcgPSAqY29uZmlnTG9ja2VkOworICAgICAgICAgICAgICAgIENvbmZpZzo6V2F0Y2hlcjxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBpbml0RGF0YVdhdGNoZXIgPQorICAgICAgICAgICAgICAgICAgICBjb25maWctPndhdGNoPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+KCk7CisgICAgICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgQzJGcmFtZURhdGE6OkZMQUdfRElTQ0FSRF9GUkFNRSkgPT0gMCkgewogCi0gICAgICAgICAgICAgICAgLy8gY29weSBidWZmZXIgaW5mbyB0byBjb25maWcKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHVwZGF0ZXM7Ci0gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtCi0gICAgICAgICAgICAgICAgICAgICAgICA6IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlcy5wdXNoX2JhY2soQzJQYXJhbTo6Q29weSgqcGFyYW0pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgc3RyZWFtID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZiA6IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gJmluZm8gOiBidWYtPmluZm8oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSBhbGwgaW5mbyBpbnRvIG91dHB1dC1zdHJlYW0gIzAgZG9tYWluCi0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjayhDMlBhcmFtOjpDb3B5QXNTdHJlYW0oKmluZm8sIHRydWUgLyogb3V0cHV0ICovLCBzdHJlYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gY29weSBidWZmZXIgaW5mbyB0byBjb25maWcKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiB1cGRhdGVzOworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiAmcGFyYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZXMucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoKnBhcmFtKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrICZibG9jayA6IGJ1Zi0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQUxPR1YoImdvdCBvdXRwdXQgYnVmZmVyIHdpdGggY3JvcCAldSwldSsldSwldSBhbmQgc2l6ZSAldSwldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIGJsb2NrLmNyb3AoKS5sZWZ0LCBibG9jay5jcm9wKCkudG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBibG9jay5jcm9wKCkud2lkdGgsIGJsb2NrLmNyb3AoKS5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIGJsb2NrLndpZHRoKCksIGJsb2NrLmhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZXMuZW1wbGFjZV9iYWNrKG5ldyBDMlN0cmVhbUNyb3BSZWN0SW5mbzo6b3V0cHV0KHN0cmVhbSwgYmxvY2suY3JvcCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjayhuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBibG9jay5jcm9wKCkud2lkdGgsIGJsb2NrLmNyb3AoKS5oZWlnaHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBmb3Igbm93IG9ubHkgZG8gdGhlIGZpcnN0IGJsb2NrCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHN0cmVhbSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4+ICZvdXRwdXRCdWZmZXJzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzOworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZiA6IG91dHB1dEJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gJmluZm8gOiBidWYtPmluZm8oKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgYWxsIGluZm8gaW50byBvdXRwdXQtc3RyZWFtICMwIGRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZXMuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weUFzU3RyZWFtKCppbmZvLCB0cnVlIC8qIG91dHB1dCAqLywgc3RyZWFtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+IGJsb2NrcyA9IGJ1Zi0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBub3cgb25seSBkbyB0aGUgZmlyc3QgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmxvY2tzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBTE9HVigiZ290IG91dHB1dCBidWZmZXIgd2l0aCBjcm9wICV1LCV1KyV1LCV1IGFuZCBzaXplICV1LCV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIGJsb2NrLmNyb3AoKS5sZWZ0LCBibG9jay5jcm9wKCkudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYmxvY2suY3JvcCgpLndpZHRoLCBibG9jay5jcm9wKCkuaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYmxvY2sud2lkdGgoKSwgYmxvY2suaGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgJmJsb2NrID0gYmxvY2tzWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZXMuZW1wbGFjZV9iYWNrKG5ldyBDMlN0cmVhbUNyb3BSZWN0SW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBibG9jay5jcm9wKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjayhuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgYmxvY2suY3JvcCgpLndpZHRoLCBibG9jay5jcm9wKCkuaGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICArK3N0cmVhbTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICArK3N0cmVhbTsKLSAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoY29uZmlnLT51cGRhdGVDb25maWd1cmF0aW9uKHVwZGF0ZXMsIGNvbmZpZy0+bU91dHB1dERvbWFpbikpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gb2xkRm9ybWF0ID0gY29uZmlnLT5tT3V0cHV0Rm9ybWF0OworICAgICAgICAgICAgICAgICAgICBjb25maWctPnVwZGF0ZUNvbmZpZ3VyYXRpb24odXBkYXRlcywgY29uZmlnLT5tT3V0cHV0RG9tYWluKTsKKyAgICAgICAgICAgICAgICAgICAgUmV2ZXJ0T3V0cHV0Rm9ybWF0SWZOZWVkZWQob2xkRm9ybWF0LCBjb25maWctPm1PdXRwdXRGb3JtYXQpOwogCi0gICAgICAgICAgICAgICAgLy8gY29weSBzdGFuZGFyZCBpbmZvcyB0byBncmFwaGljIGJ1ZmZlcnMgaWYgbm90IGFscmVhZHkgcHJlc2VudCAob3RoZXJ3aXNlLCB3ZQotICAgICAgICAgICAgICAgIC8vIG1heSBvdmVyd3JpdGUgdGhlIGFjdHVhbCBpbnRlcm1lZGlhdGUgdmFsdWUgd2l0aCBhIGZpbmFsIHZhbHVlKQotICAgICAgICAgICAgICAgIHN0cmVhbSA9IDA7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBzdGRHZnhJbmZvcyA9IHsKLSAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1Sb3RhdGlvbkluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtRGF0YVNwYWNlSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAotICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtUGl4ZWxBc3BlY3RSYXRpb0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dDo6UEFSQU1fVFlQRQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWYgOiB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycykgewotICAgICAgICAgICAgICAgICAgICBpZiAoYnVmLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChDMlBhcmFtOjpJbmRleCBpeCA6IHN0ZEdmeEluZm9zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFidWYtPmhhc0luZm8oaXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Z2V0Q29uZmlnUGFyYW1ldGVyVmFsdWUoaXgud2l0aFN0cmVhbShzdHJlYW0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gaW5mbyhDMlBhcmFtOjpDb3B5KCpwYXJhbSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLT5zZXRJbmZvKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkluZm8+KGluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gY29weSBzdGFuZGFyZCBpbmZvcyB0byBncmFwaGljIGJ1ZmZlcnMgaWYgbm90IGFscmVhZHkgcHJlc2VudCAob3RoZXJ3aXNlLCB3ZQorICAgICAgICAgICAgICAgICAgICAvLyBtYXkgb3ZlcndyaXRlIHRoZSBhY3R1YWwgaW50ZXJtZWRpYXRlIHZhbHVlIHdpdGggYSBmaW5hbCB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljIEMyUGFyYW06OkluZGV4IHN0ZEdmeEluZm9zW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVJvdGF0aW9uSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbURhdGFTcGFjZUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVBpeGVsQXNwZWN0UmF0aW9JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmIDogb3V0cHV0QnVmZmVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Zi0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEMyUGFyYW06OkluZGV4IGl4IDogc3RkR2Z4SW5mb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFidWYtPmhhc0luZm8oaXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBhcmFtICpwYXJhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5nZXRDb25maWdQYXJhbWV0ZXJWYWx1ZShpeC53aXRoU3RyZWFtKHN0cmVhbSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IGluZm8oQzJQYXJhbTo6Q29weSgqcGFyYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYtPnNldEluZm8oc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMySW5mbz4oaW5mbykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgKytzdHJlYW07CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKytzdHJlYW07CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvbmZpZy0+bUlucHV0U3VyZmFjZSkgewotICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZS0+b25JbnB1dEJ1ZmZlckRvbmUod29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoY29uZmlnLT5tSW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZS0+b25JbnB1dEJ1ZmZlckRvbmUod29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluaXREYXRhV2F0Y2hlci5oYXNDaGFuZ2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5pdERhdGEgPSBpbml0RGF0YVdhdGNoZXIudXBkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIEFtZW5kT3V0cHV0Rm9ybWF0V2l0aENvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXREYXRhLT5tLnZhbHVlLCBpbml0RGF0YS0+ZmxleENvdW50KCksIGNvbmZpZy0+bUNvZGluZ01lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXRwdXRGb3JtYXQgPSBjb25maWctPm1PdXRwdXRGb3JtYXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQ2hhbm5lbC0+b25Xb3JrRG9uZSgKLSAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHdvcmspLCBjaGFuZ2VkID8gY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5kdXAoKSA6IG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgIGluaXREYXRhLmhhc0NoYW5nZWQoKSA/IGluaXREYXRhLnVwZGF0ZSgpLmdldCgpIDogbnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZSh3b3JrKSwgb3V0cHV0Rm9ybWF0LCBpbml0RGF0YSA/IGluaXREYXRhLmdldCgpIDogbnVsbHB0cik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIGtXaGF0V2F0Y2g6IHsKQEAgLTE4ODcsNiArMjI5OSw1NSBAQAogICAgIGRlYWRsaW5lLT5zZXQobm93ICsgKHRpbWVvdXQgKiBtdWx0KSwgbmFtZSk7CiB9CiAKK3N0YXR1c190IENDb2RlYzo6Y29uZmlndXJlVHVubmVsZWRWaWRlb1BsYXliYWNrKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXAsCisgICAgICAgIHNwPE5hdGl2ZUhhbmRsZT4gKnNpZGViYW5kSGFuZGxlLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBvcnRUdW5uZWxlZE1vZGVUdW5pbmc6Om91dHB1dD4gdHVubmVsZWRQbGF5YmFjayA9CisgICAgICAgIEMyUG9ydFR1bm5lbGVkTW9kZVR1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICBDMlBvcnRUdW5uZWxlZE1vZGVUdW5pbmc6OlN0cnVjdDo6U0lERUJBTkQsCisgICAgICAgICAgICBDMlBvcnRUdW5uZWxlZE1vZGVUdW5pbmc6OlN0cnVjdDo6UkVBTFRJTUUsCisgICAgICAgICAgICAwKTsKKyAgICAvLyBUT0RPOiB1c2UgS0VZX0FVRElPX0hXX1NZTkMsIEtFWV9IQVJEV0FSRV9BVl9TWU5DX0lEIHdoZW4gdGhleSBhcmUgaW4gTWVkaWFDb2RlY0NvbnN0YW50cy5oCisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJhdWRpby1ody1zeW5jIiwgJnR1bm5lbGVkUGxheWJhY2stPm0uc3luY0lkWzBdKSkgeworICAgICAgICB0dW5uZWxlZFBsYXliYWNrLT5tLnN5bmNUeXBlID0gQzJQb3J0VHVubmVsZWRNb2RlVHVuaW5nOjpTdHJ1Y3Q6OnN5bmNfdHlwZV90OjpBVURJT19IV19TWU5DOworICAgIH0gZWxzZSBpZiAobXNnLT5maW5kSW50MzIoImh3LWF2LXN5bmMtaWQiLCAmdHVubmVsZWRQbGF5YmFjay0+bS5zeW5jSWRbMF0pKSB7CisgICAgICAgIHR1bm5lbGVkUGxheWJhY2stPm0uc3luY1R5cGUgPSBDMlBvcnRUdW5uZWxlZE1vZGVUdW5pbmc6OlN0cnVjdDo6c3luY190eXBlX3Q6OkhXX0FWX1NZTkM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHVubmVsZWRQbGF5YmFjay0+bS5zeW5jVHlwZSA9IEMyUG9ydFR1bm5lbGVkTW9kZVR1bmluZzo6U3RydWN0OjpzeW5jX3R5cGVfdDo6UkVBTFRJTUU7CisgICAgICAgIHR1bm5lbGVkUGxheWJhY2stPnNldEZsZXhDb3VudCgwKTsKKyAgICB9CisgICAgYzJfc3RhdHVzX3QgYzJlcnIgPSBjb21wLT5jb25maWcoeyB0dW5uZWxlZFBsYXliYWNrLmdldCgpIH0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICBpZiAoYzJlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKHNpZGViYW5kSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgIGMyZXJyID0gY29tcC0+cXVlcnkoe30sIHtDMlBvcnRUdW5uZWxIYW5kbGVUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRX0sIEMyX0RPTlRfQkxPQ0ssICZwYXJhbXMpOworICAgIGlmIChjMmVyciA9PSBDMl9PSyAmJiBwYXJhbXMuc2l6ZSgpID09IDF1KSB7CisgICAgICAgIEMyUG9ydFR1bm5lbEhhbmRsZVR1bmluZzo6b3V0cHV0ICp2aWRlb1R1bm5lbFNpZGViYW5kID0KKyAgICAgICAgICAgIEMyUG9ydFR1bm5lbEhhbmRsZVR1bmluZzo6b3V0cHV0OjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgIC8vIEN1cnJlbnRseSwgQ29kZWMyIG9ubHkgc3VwcG9ydHMgbm9uLWZkIGNhc2UgZm9yIHNpZGViYW5kIG5hdGl2ZV9oYW5kbGUuCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMCwgdmlkZW9UdW5uZWxTaWRlYmFuZC0+ZmxleENvdW50KCkpOworICAgICAgICAqc2lkZWJhbmRIYW5kbGUgPSBOYXRpdmVIYW5kbGU6OmNyZWF0ZShoYW5kbGUsIHRydWUgLyogb3duc0hhbmRsZSAqLyk7CisgICAgICAgIGlmIChoYW5kbGUgIT0gbnVsbHB0ciAmJiB2aWRlb1R1bm5lbFNpZGViYW5kLT5mbGV4Q291bnQoKSkgeworICAgICAgICAgICAgbWVtY3B5KGhhbmRsZS0+ZGF0YSwgdmlkZW9UdW5uZWxTaWRlYmFuZC0+bS52YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQzMl90KSAqIHZpZGVvVHVubmVsU2lkZWJhbmQtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Cit9CisKIHZvaWQgQ0NvZGVjOjppbml0aWF0ZVJlbGVhc2VJZlN0dWNrKCkgewogICAgIHN0ZDo6c3RyaW5nIG5hbWU7CiAgICAgYm9vbCBwZW5kaW5nRGVhZGxpbmUgPSBmYWxzZTsKQEAgLTE4OTksNyArMjM2MCw0NCBAQAogICAgICAgICAgICAgcGVuZGluZ0RlYWRsaW5lID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAobmFtZS5lbXB0eSgpKSB7CisgICAgYm9vbCB0dW5uZWxlZCA9IGZhbHNlOworICAgIGJvb2wgaXNNZWRpYVR5cGVLbm93biA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBrS25vd25NZWRpYVR5cGVzeworICAgICAgICAgICAgTUlNRVRZUEVfVklERU9fVlA4LAorICAgICAgICAgICAgTUlNRVRZUEVfVklERU9fVlA5LAorICAgICAgICAgICAgTUlNRVRZUEVfVklERU9fQVYxLAorICAgICAgICAgICAgTUlNRVRZUEVfVklERU9fQVZDLAorICAgICAgICAgICAgTUlNRVRZUEVfVklERU9fSEVWQywKKyAgICAgICAgICAgIE1JTUVUWVBFX1ZJREVPX01QRUc0LAorICAgICAgICAgICAgTUlNRVRZUEVfVklERU9fSDI2MywKKyAgICAgICAgICAgIE1JTUVUWVBFX1ZJREVPX01QRUcyLAorICAgICAgICAgICAgTUlNRVRZUEVfVklERU9fUkFXLAorICAgICAgICAgICAgTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OLAorCisgICAgICAgICAgICBNSU1FVFlQRV9BVURJT19BTVJfTkIsCisgICAgICAgICAgICBNSU1FVFlQRV9BVURJT19BTVJfV0IsCisgICAgICAgICAgICBNSU1FVFlQRV9BVURJT19NUEVHLAorICAgICAgICAgICAgTUlNRVRZUEVfQVVESU9fQUFDLAorICAgICAgICAgICAgTUlNRVRZUEVfQVVESU9fUUNFTFAsCisgICAgICAgICAgICBNSU1FVFlQRV9BVURJT19WT1JCSVMsCisgICAgICAgICAgICBNSU1FVFlQRV9BVURJT19PUFVTLAorICAgICAgICAgICAgTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXLAorICAgICAgICAgICAgTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXLAorICAgICAgICAgICAgTUlNRVRZUEVfQVVESU9fUkFXLAorICAgICAgICAgICAgTUlNRVRZUEVfQVVESU9fRkxBQywKKyAgICAgICAgICAgIE1JTUVUWVBFX0FVRElPX01TR1NNLAorICAgICAgICAgICAgTUlNRVRZUEVfQVVESU9fQUMzLAorICAgICAgICAgICAgTUlNRVRZUEVfQVVESU9fRUFDMywKKworICAgICAgICAgICAgTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDLAorICAgICAgICB9OworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+Pjo6TG9ja2VkIGNvbmZpZ0xvY2tlZChtQ29uZmlnKTsKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPENvbmZpZz4gJmNvbmZpZyA9ICpjb25maWdMb2NrZWQ7CisgICAgICAgIHR1bm5lbGVkID0gY29uZmlnLT5tVHVubmVsZWQ7CisgICAgICAgIGlzTWVkaWFUeXBlS25vd24gPSAoa0tub3duTWVkaWFUeXBlcy5jb3VudChjb25maWctPm1Db2RpbmdNZWRpYVR5cGUpICE9IDApOworICAgIH0KKyAgICBpZiAoIXR1bm5lbGVkICYmIGlzTWVkaWFUeXBlS25vd24gJiYgbmFtZS5lbXB0eSgpKSB7CiAgICAgICAgIGNvbnN0ZXhwciBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiBrV29ya0R1cmF0aW9uVGhyZXNob2xkID0gM3M7CiAgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIGVsYXBzZWQgPSBtQ2hhbm5lbC0+ZWxhcHNlZCgpOwogICAgICAgICBpZiAoZWxhcHNlZCA+PSBrV29ya0R1cmF0aW9uVGhyZXNob2xkKSB7CkBAIC0xOTkxLDcgKzI0ODksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHBhcmFtLT50eXBlKCkgPT0gQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpIHsKICAgICAgICAgICAgICAgICBtSW5wdXRBbGxvY2F0b3JzLnJlc2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ6OkZyb20ocGFyYW1zWzBdLmdldCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dDo6RnJvbShwYXJhbSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1Jbml0U3RhdHVzID0gT0s7CkBAIC0yMjg4LDQgKzI3ODYsMyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKaW5kZXggMTY1NGIxMS4uNWE1OGZkOCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmNwcApAQCAtMzAsNiArMzAsNyBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC9JRGVzY3JhbWJsZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KQEAgLTE0Myw3ICsxNDQsOCBAQAogICAgICAgbUZyYW1lSW5kZXgoMHUpLAogICAgICAgbUZpcnN0VmFsaWRGcmFtZUluZGV4KDB1KSwKICAgICAgIG1NZXRhTW9kZShNT0RFX05PTkUpLAotICAgICAgbUlucHV0TWV0RW9zKGZhbHNlKSB7CisgICAgICBtSW5wdXRNZXRFb3MoZmFsc2UpLAorICAgICAgbVNlbmRFbmNyeXB0ZWRJbmZvQnVmZmVyKGZhbHNlKSB7CiAgICAgbU91dHB1dFN1cmZhY2UubG9jaygpLT5tYXhEZXF1ZXVlQnVmZmVycyA9IGtTbW9vdGhuZXNzRmFjdG9yICsga1JlbmRlcmluZ0RlcHRoOwogICAgIHsKICAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOwpAQCAtMTg4LDcgKzE5MCwxMCBAQAogICAgIHJldHVybiBtSW5wdXRTdXJmYWNlLT5zaWduYWxFbmRPZklucHV0U3RyZWFtKCk7CiB9CiAKLXN0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXIpIHsKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbCgKKyAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gZW5jcnlwdGVkQmxvY2ssCisgICAgICAgIHNpemVfdCBibG9ja1NpemUpIHsKICAgICBpbnQ2NF90IHRpbWVVczsKICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CiAKQEAgLTIwOSw2ICsyMTQsNyBAQAogICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUc7CiAgICAgfQogICAgIEFMT0dWKCJbJXNdIHF1ZXVlSW5wdXRCdWZmZXI6IGJ1ZmZlci0+c2l6ZSgpID0gJXp1IiwgbU5hbWUsIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmsobmV3IEMyV29yayk7CiAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lVXM7CiAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXgrKzsKQEAgLTIxOCw5ICsyMjQsOCBAQAogICAgIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbCA9IHRpbWVVczsKICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CiAKLSAgICB1aW50NjRfdCBxdWV1ZWRGcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gcXVldWVkQnVmZmVyczsKICAgICBzcDxDb2RlYzJCdWZmZXI+IGNvcHk7CisgICAgYm9vbCB1c2VzRnJhbWVSZWFzc2VtYmxlciA9IGZhbHNlOwogCiAgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID4gMHUpIHsKICAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOwpAQCAtMjQ1LDMwICsyNTAsNDggQEAKICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIHN0YXJ2YXRpb24gb24gY29tcG9uZW50LiIsIG1OYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLnB1c2hfYmFjayhjMmJ1ZmZlcik7Ci0gICAgICAgIHF1ZXVlZEJ1ZmZlcnMucHVzaF9iYWNrKGMyYnVmZmVyKTsKKyAgICAgICAgaWYgKGlucHV0LT5mcmFtZVJlYXNzZW1ibGVyKSB7CisgICAgICAgICAgICB1c2VzRnJhbWVSZWFzc2VtYmxlciA9IHRydWU7CisgICAgICAgICAgICBpbnB1dC0+ZnJhbWVSZWFzc2VtYmxlci5wcm9jZXNzKGJ1ZmZlciwgJml0ZW1zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludDMyX3QgY3ZvID0gMDsKKyAgICAgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjdm8iLCAmY3ZvKSkgeworICAgICAgICAgICAgICAgIGludDMyX3Qgcm90YXRpb24gPSBjdm8gJSAzNjA7CisgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHJvdGF0aW9uIHRvIGNvdW50ZXItY2xvY2sgd2lzZS4KKyAgICAgICAgICAgICAgICByb3RhdGlvbiA9ICgocm90YXRpb24gPD0gMCkgPyAwIDogMzYwKSAtIHJvdGF0aW9uOworCisgICAgICAgICAgICAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7CisgICAgICAgICAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgICAgIG91dHB1dC0+cm90YXRpb25bZnJhbWVJbmRleF0gPSByb3RhdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGMyYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChlbmNyeXB0ZWRCbG9jaykgeworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmluZm9CdWZmZXJzLmVtcGxhY2VfYmFjayhDMkluZm9CdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4RW5jcnlwdGVkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkQmxvY2stPnNoYXJlKDAsIGJsb2NrU2l6ZSwgQzJGZW5jZSgpKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChlb3MpIHsKICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKICAgICB9Ci0gICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7Ci0gICAgLy8gVE9ETzogZmlsbCBpbmZvJ3MKKyAgICBpZiAodXNlc0ZyYW1lUmVhc3NlbWJsZXIpIHsKKyAgICAgICAgaWYgKCFpdGVtcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBpdGVtcy5mcm9udCgpLT5pbnB1dC5jb25maWdVcGRhdGUgPSBzdGQ6Om1vdmUobVBhcmFtc1RvQmVTZXQpOworICAgICAgICAgICAgbUZyYW1lSW5kZXggPSAoaXRlbXMuYmFjaygpLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggKyAxKS5wZWVrKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgLy8gVE9ETzogZmlsbCBpbmZvJ3MKIAotICAgIHdvcmstPmlucHV0LmNvbmZpZ1VwZGF0ZSA9IHN0ZDo6bW92ZShtUGFyYW1zVG9CZVNldCk7Ci0gICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKLSAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgICAgIHdvcmstPmlucHV0LmNvbmZpZ1VwZGF0ZSA9IHN0ZDo6bW92ZShtUGFyYW1zVG9CZVNldCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKIAotICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7Ci0gICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7Ci0gICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPm9uV29ya1F1ZXVlZCgKLSAgICAgICAgICAgIHF1ZXVlZEZyYW1lSW5kZXgsCi0gICAgICAgICAgICBzdGQ6Om1vdmUocXVldWVkQnVmZmVycyksCi0gICAgICAgICAgICBQaXBlbGluZVdhdGNoZXI6OkNsb2NrOjpub3coKSk7Ci0gICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKTsKLSAgICBpZiAoZXJyICE9IEMyX09LKSB7Ci0gICAgICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5vbldvcmtEb25lKHF1ZXVlZEZyYW1lSW5kZXgpOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICBlb3MgPSBlb3MgJiYgYnVmZmVyLT5zaXplKCkgPiAwdTsKICAgICB9Ci0KLSAgICBpZiAoZXJyID09IEMyX09LICYmIGVvcyAmJiBidWZmZXItPnNpemUoKSA+IDB1KSB7CisgICAgaWYgKGVvcykgewogICAgICAgICB3b3JrLnJlc2V0KG5ldyBDMldvcmspOwogICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVVczsKICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXgrKzsKQEAgLTI3NywyMyArMzAwLDI4IEBACiAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKICAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOwogICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7Ci0KLSAgICAgICAgcXVldWVkRnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOwotICAgICAgICBxdWV1ZWRCdWZmZXJzLmNsZWFyKCk7Ci0KLSAgICAgICAgaXRlbXMuY2xlYXIoKTsKICAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7Ci0KLSAgICAgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPm9uV29ya1F1ZXVlZCgKLSAgICAgICAgICAgICAgICBxdWV1ZWRGcmFtZUluZGV4LAotICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShxdWV1ZWRCdWZmZXJzKSwKLSAgICAgICAgICAgICAgICBQaXBlbGluZVdhdGNoZXI6OkNsb2NrOjpub3coKSk7Ci0gICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyk7Ci0gICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKLSAgICAgICAgICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5vbldvcmtEb25lKHF1ZXVlZEZyYW1lSW5kZXgpOwotICAgICAgICB9CiAgICAgfQotICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBpZiAoIWl0ZW1zLmVtcHR5KCkpIHsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxQaXBlbGluZVdhdGNoZXI+OjpMb2NrZWQgd2F0Y2hlcihtUGlwZWxpbmVXYXRjaGVyKTsKKyAgICAgICAgICAgIFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6OnRpbWVfcG9pbnQgbm93ID0gUGlwZWxpbmVXYXRjaGVyOjpDbG9jazo6bm93KCk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrIDogaXRlbXMpIHsKKyAgICAgICAgICAgICAgICB3YXRjaGVyLT5vbldvcmtRdWV1ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yKHdvcmstPmlucHV0LmJ1ZmZlcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgbm93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpOworICAgIH0KKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIE11dGV4ZWQ8UGlwZWxpbmVXYXRjaGVyPjo6TG9ja2VkIHdhdGNoZXIobVBpcGVsaW5lV2F0Y2hlcik7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmsgOiBpdGVtcykgeworICAgICAgICAgICAgd2F0Y2hlci0+b25Xb3JrRG9uZSh3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgewogICAgICAgICBNdXRleGVkPElucHV0Pjo6TG9ja2VkIGlucHV0KG1JbnB1dCk7CiAgICAgICAgIGJvb2wgcmVsZWFzZWQgPSBmYWxzZTsKICAgICAgICAgaWYgKGJ1ZmZlcikgewpAQCAtNTE0LDYgKzU0Miw0MCBAQAogICAgIH0KICAgICBzcDxFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcj4gZW5jcnlwdGVkQnVmZmVyKChFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlciAqKWJ1ZmZlci5nZXQoKSk7CiAKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgc2l6ZV90IGFsbG9jU2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworICAgIHNpemVfdCBidWZmZXJTaXplID0gMDsKKyAgICBjMl9zdGF0dXNfdCBibG9ja1JlcyA9IEMyX09LOworICAgIGJvb2wgY29waWVkID0gZmFsc2U7CisgICAgaWYgKG1TZW5kRW5jcnlwdGVkSW5mb0J1ZmZlcikgeworICAgICAgICBzdGF0aWMgY29uc3QgQzJNZW1vcnlVc2FnZSBrRGVmYXVsdFJlYWRXcml0ZVVzYWdleworICAgICAgICAgICAgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX07CisgICAgICAgIGNvbnN0ZXhwciBpbnQga0FsbG9jR3JhbnVsZTAgPSAxMDI0ICogNjQ7CisgICAgICAgIGNvbnN0ZXhwciBpbnQga0FsbG9jR3JhbnVsZTEgPSAxMDI0ICogMTAyNDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwb29sID0gbUJsb2NrUG9vbHMubG9jaygpLT5pbnB1dFBvb2w7CisgICAgICAgIC8vIHJvdW5kIHVwIGVuY3J5cHRlZCBzaXplcyB0byBsaW1pdCBmcmFnbWVudGF0aW9uIGFuZCBlbmNvdXJhZ2UgYnVmZmVyIHJldXNlCisgICAgICAgIGlmIChhbGxvY1NpemUgPD0ga0FsbG9jR3JhbnVsZTEpIHsKKyAgICAgICAgICAgIGJ1ZmZlclNpemUgPSBhbGlnbihhbGxvY1NpemUsIGtBbGxvY0dyYW51bGUwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZmZlclNpemUgPSBhbGlnbihhbGxvY1NpemUsIGtBbGxvY0dyYW51bGUxKTsKKyAgICAgICAgfQorICAgICAgICBibG9ja1JlcyA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSwga0RlZmF1bHRSZWFkV3JpdGVVc2FnZSwgJmJsb2NrKTsKKworICAgICAgICBpZiAoYmxvY2tSZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmlldy5lcnJvcigpID09IEMyX09LICYmIHZpZXcuc2l6ZSgpID09IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICBjb3BpZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIC8vIFRPRE86IG9ubHkgY29weSBjbGVhciBzZWN0aW9ucworICAgICAgICAgICAgICAgIG1lbWNweSh2aWV3LmRhdGEoKSwgYnVmZmVyLT5kYXRhKCksIGFsbG9jU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWNvcGllZCkgeworICAgICAgICBibG9jay5yZXNldCgpOworICAgIH0KKwogICAgIHNzaXplX3QgcmVzdWx0ID0gLTE7CiAgICAgc3NpemVfdCBjb2RlY0RhdGFPZmZzZXQgPSAwOwogICAgIGlmIChudW1TdWJTYW1wbGVzID09IDEKQEAgLTYwNSw3ICs2NjcsOCBAQAogICAgIH0KIAogICAgIGJ1ZmZlci0+c2V0UmFuZ2UoY29kZWNEYXRhT2Zmc2V0LCByZXN1bHQgLSBjb2RlY0RhdGFPZmZzZXQpOwotICAgIHJldHVybiBxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoYnVmZmVyKTsKKworICAgIHJldHVybiBxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoYnVmZmVyLCBibG9jaywgYnVmZmVyU2l6ZSk7CiB9CiAKIHZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6ZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKSB7CkBAIC02OTUsNiArNzU4LDIyIEBACiAgICAgICAgICAgICAgICAgYzJCdWZmZXItPmdldEluZm8oQzJTdHJlYW1Sb3RhdGlvbkluZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpOwogICAgIGJvb2wgZmxpcCA9IHJvdGF0aW9uICYmIChyb3RhdGlvbi0+ZmxpcCAmIDEpOwogICAgIHVpbnQzMl90IHF1YXJ0ZXJzID0gKChyb3RhdGlvbiA/IHJvdGF0aW9uLT52YWx1ZSA6IDApIC8gOTApICYgMzsKKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7CisgICAgICAgIGlmIChvdXRwdXQtPnN1cmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0koIlslc10gY2Fubm90IHJlbmRlciBidWZmZXIgd2l0aG91dCBzdXJmYWNlIiwgbU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIGludDY0X3QgZnJhbWVJbmRleDsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgiZnJhbWVJbmRleCIsICZmcmFtZUluZGV4KTsKKyAgICAgICAgaWYgKG91dHB1dC0+cm90YXRpb24uY291bnQoZnJhbWVJbmRleCkgIT0gMCkgeworICAgICAgICAgICAgYXV0byBpdCA9IG91dHB1dC0+cm90YXRpb24uZmluZChmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIHF1YXJ0ZXJzID0gKGl0LT5zZWNvbmQgLyA5MCkgJiAzOworICAgICAgICAgICAgb3V0cHV0LT5yb3RhdGlvbi5lcmFzZShpdCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICB1aW50MzJfdCB0cmFuc2Zvcm0gPSAwOwogICAgIHN3aXRjaCAocXVhcnRlcnMpIHsKICAgICAgICAgY2FzZSAwOiAvLyBubyByb3RhdGlvbgpAQCAtNzM4LDE0ICs4MTcsNiBAQAogICAgICAgICBoZHIxMFBsdXNJbmZvLnJlc2V0KCk7CiAgICAgfQogCi0gICAgewotICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKLSAgICAgICAgaWYgKG91dHB1dC0+c3VyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HSSgiWyVzXSBjYW5ub3QgcmVuZGVyIGJ1ZmZlciB3aXRob3V0IHN1cmZhY2UiLCBtTmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBibG9ja3MgPSBjMkJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKTsKICAgICBpZiAoYmxvY2tzLnNpemUoKSAhPSAxdSkgewogICAgICAgICBBTE9HRCgiWyVzXSBleHBlY3RlZCAxIGdyYXBoaWMgYmxvY2ssIGJ1dCBnb3QgJXp1IiwgbU5hbWUsIGJsb2Nrcy5zaXplKCkpOwpAQCAtODE2LDkgKzg4NywxNyBAQAogICAgIHN0YXR1c190IHJlc3VsdCA9IG1Db21wb25lbnQtPnF1ZXVlVG9PdXRwdXRTdXJmYWNlKGJsb2NrLCBxYmksICZxYm8pOwogICAgIGlmIChyZXN1bHQgIT0gT0spIHsKICAgICAgICAgQUxPR0koIlslc10gcXVldWVCdWZmZXIgZmFpbGVkOiAlZCIsIG1OYW1lLCByZXN1bHQpOworICAgICAgICBpZiAocmVzdWx0ID09IE5PX0lOSVQpIHsKKyAgICAgICAgICAgIG1DQ29kZWNDYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9Ci0gICAgQUxPR1YoIlslc10gcXVldWUgYnVmZmVyIHN1Y2Nlc3NmdWwiLCBtTmFtZSk7CisKKyAgICBpZihhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoImRlYnVnLnN0YWdlZnJpZ2h0LmZwcyIsIGZhbHNlKSkgeworICAgICAgICBBTE9HRCgiWyVzXSBxdWV1ZSBidWZmZXIgc3VjY2Vzc2Z1bCIsIG1OYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiWyVzXSBxdWV1ZSBidWZmZXIgc3VjY2Vzc2Z1bCIsIG1OYW1lKTsKKyAgICB9CiAKICAgICBpbnQ2NF90IG1lZGlhVGltZVVzID0gMDsKICAgICAodm9pZClidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpOwpAQCAtODc5LDI3ICs5NTgsMzEgQEAKICAgICAgICAgYm9vbCBidWZmZXJzQm91bmRUb0NvZGVjKSB7CiAgICAgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQgaVN0cmVhbUZvcm1hdCgwdSk7CiAgICAgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0IG9TdHJlYW1Gb3JtYXQoMHUpOworICAgIEMyQ29tcG9uZW50S2luZFNldHRpbmcga2luZDsKICAgICBDMlBvcnRSZW9yZGVyQnVmZmVyRGVwdGhUdW5pbmc6Om91dHB1dCByZW9yZGVyRGVwdGg7CiAgICAgQzJQb3J0UmVvcmRlcktleVNldHRpbmc6Om91dHB1dCByZW9yZGVyS2V5OwogICAgIEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dCBpbnB1dERlbGF5KDApOwogICAgIEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQgb3V0cHV0RGVsYXkoMCk7CiAgICAgQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nIHBpcGVsaW5lRGVsYXkoMCk7CisgICAgQzJTZWN1cmVNb2RlVHVuaW5nIHNlY3VyZU1vZGUoQzJDb25maWc6OlNNX1VOUFJPVEVDVEVEKTsKIAogICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICZpU3RyZWFtRm9ybWF0LAogICAgICAgICAgICAgICAgICZvU3RyZWFtRm9ybWF0LAorICAgICAgICAgICAgICAgICZraW5kLAogICAgICAgICAgICAgICAgICZyZW9yZGVyRGVwdGgsCiAgICAgICAgICAgICAgICAgJnJlb3JkZXJLZXksCiAgICAgICAgICAgICAgICAgJmlucHV0RGVsYXksCiAgICAgICAgICAgICAgICAgJnBpcGVsaW5lRGVsYXksCiAgICAgICAgICAgICAgICAgJm91dHB1dERlbGF5LAorICAgICAgICAgICAgICAgICZzZWN1cmVNb2RlLAogICAgICAgICAgICAgfSwKICAgICAgICAgICAgIHt9LAogICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywKICAgICAgICAgICAgIG51bGxwdHIpOwogICAgIGlmIChlcnIgPT0gQzJfQkFEX0lOREVYKSB7Ci0gICAgICAgIGlmICghaVN0cmVhbUZvcm1hdCB8fCAhb1N0cmVhbUZvcm1hdCkgeworICAgICAgICBpZiAoIWlTdHJlYW1Gb3JtYXQgfHwgIW9TdHJlYW1Gb3JtYXQgfHwgIWtpbmQpIHsKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChlcnIgIT0gQzJfT0spIHsKQEAgLTkxNiwxOCArOTk5LDI2IEBACiAgICAgLy8gVE9ETzogZ2V0IHRoaXMgZnJvbSBpbnB1dCBmb3JtYXQKICAgICBib29sIHNlY3VyZSA9IG1Db21wb25lbnQtPmdldE5hbWUoKS5maW5kKCIuc2VjdXJlIikgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CiAKKyAgICAvLyBzZWN1cmUgbW9kZSBpcyBhIHN0YXRpYyBwYXJhbWV0ZXIgKHNoYWxsIG5vdCBjaGFuZ2UgaW4gdGhlIGV4ZWN1dGluZyBzdGF0ZSkKKyAgICBtU2VuZEVuY3J5cHRlZEluZm9CdWZmZXIgPSBzZWN1cmVNb2RlLnZhbHVlID09IEMyQ29uZmlnOjpTTV9SRUFEX1BST1RFQ1RFRF9XSVRIX0VOQ1JZUFRFRDsKKwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBhbGxvY2F0b3JTdG9yZSA9IEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKICAgICBpbnQgcG9vbE1hc2sgPSBHZXRDb2RlYzJQb29sTWFzaygpOwogICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdCBwcmVmZXJyZWRMaW5lYXJJZCA9IEdldFByZWZlcnJlZExpbmVhckFsbG9jYXRvcklkKHBvb2xNYXNrKTsKIAogICAgIGlmIChpbnB1dEZvcm1hdCAhPSBudWxscHRyKSB7CiAgICAgICAgIGJvb2wgZ3JhcGhpYyA9IChpU3RyZWFtRm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6R1JBUEhJQyk7CisgICAgICAgIGJvb2wgYXVkaW9FbmNvZGVyID0gIWdyYXBoaWMgJiYgKGtpbmQudmFsdWUgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUik7CiAgICAgICAgIEMyQ29uZmlnOjphcGlfZmVhdHVyZV90IGFwaUZlYXR1cmVzID0gQzJDb25maWc6OmFwaV9mZWF0dXJlX3QoCiAgICAgICAgICAgICAgICAgQVBJX1JFRkxFQ1RJT04gfAogICAgICAgICAgICAgICAgIEFQSV9WQUxVRVMgfAogICAgICAgICAgICAgICAgIEFQSV9DVVJSRU5UX1ZBTFVFUyB8CiAgICAgICAgICAgICAgICAgQVBJX0RFUEVOREVOQ1kgfAogICAgICAgICAgICAgICAgIEFQSV9TQU1FX0lOUFVUX0JVRkZFUik7CisgICAgICAgIEMyU3RyZWFtQXVkaW9GcmFtZVNpemVJbmZvOjppbnB1dCBlbmNvZGVyRnJhbWVTaXplKDB1KTsKKyAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQgc2FtcGxlUmF0ZSgwdSk7CisgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQgY2hhbm5lbENvdW50KDB1KTsKKyAgICAgICAgQzJTdHJlYW1QY21FbmNvZGluZ0luZm86OmlucHV0IHBjbUVuY29kaW5nKDB1KTsKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwb29sOwogICAgICAgICB7CiAgICAgICAgICAgICBNdXRleGVkPEJsb2NrUG9vbHM+OjpMb2NrZWQgcG9vbHMobUJsb2NrUG9vbHMpOwpAQCAtOTQwLDcgKzEwMzEsMTkgQEAKICAgICAgICAgICAgIC8vIGZyb20gY29tcG9uZW50LCBjcmVhdGUgdGhlIGlucHV0IGJsb2NrIHBvb2wgd2l0aCBnaXZlbiBJRC4gT3RoZXJ3aXNlLCB1c2UgZGVmYXVsdCBJRHMuCiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKICAgICAgICAgICAgIEMyQXBpRmVhdHVyZXNTZXR0aW5nIGZlYXR1cmVzU2V0dGluZ3thcGlGZWF0dXJlc307Ci0gICAgICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7ICZmZWF0dXJlc1NldHRpbmcgfSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gc3RhY2tQYXJhbXMoeyZmZWF0dXJlc1NldHRpbmd9KTsKKyAgICAgICAgICAgIGlmIChhdWRpb0VuY29kZXIpIHsKKyAgICAgICAgICAgICAgICBzdGFja1BhcmFtcy5wdXNoX2JhY2soJmVuY29kZXJGcmFtZVNpemUpOworICAgICAgICAgICAgICAgIHN0YWNrUGFyYW1zLnB1c2hfYmFjaygmc2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgc3RhY2tQYXJhbXMucHVzaF9iYWNrKCZjaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgIHN0YWNrUGFyYW1zLnB1c2hfYmFjaygmcGNtRW5jb2RpbmcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlbmNvZGVyRnJhbWVTaXplLmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIHBjbUVuY29kaW5nLmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHN0YWNrUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpOwpAQCAtOTk4LDEwICsxMTAxLDIxIEBACiAgICAgICAgIGlucHV0LT5udW1TbG90cyA9IG51bUlucHV0U2xvdHM7CiAgICAgICAgIGlucHV0LT5leHRyYUJ1ZmZlcnMuZmx1c2goKTsKICAgICAgICAgaW5wdXQtPm51bUV4dHJhU2xvdHMgPSAwdTsKKyAgICAgICAgaWYgKGF1ZGlvRW5jb2RlciAmJiBlbmNvZGVyRnJhbWVTaXplICYmIHNhbXBsZVJhdGUgJiYgY2hhbm5lbENvdW50KSB7CisgICAgICAgICAgICBpbnB1dC0+ZnJhbWVSZWFzc2VtYmxlci5pbml0KAorICAgICAgICAgICAgICAgICAgICBwb29sLAorICAgICAgICAgICAgICAgICAgICB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0sCisgICAgICAgICAgICAgICAgICAgIGVuY29kZXJGcmFtZVNpemUudmFsdWUsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUudmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudC52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgcGNtRW5jb2RpbmcgPyBwY21FbmNvZGluZy52YWx1ZSA6IEMyQ29uZmlnOjpQQ01fMTYpOworICAgICAgICB9CiAgICAgICAgIGJvb2wgY29uZm9ybWluZyA9IChhcGlGZWF0dXJlcyAmIEFQSV9TQU1FX0lOUFVUX0JVRkZFUik7CiAgICAgICAgIC8vIEZvciBlbmNyeXB0ZWQgY29udGVudCwgZnJhbWV3b3JrIGRlY3J5cHRzIHNvdXJjZSBidWZmZXIgKGFzaG1lbSkgaW50bwogICAgICAgICAvLyBDMkJ1ZmZlcnMuIFRodXMgbm9uLWNvbmZvcm1pbmcgY29kZWNzIGNhbiBwcm9jZXNzIHRoZXNlLgotICAgICAgICBpZiAoIWJ1ZmZlcnNCb3VuZFRvQ29kZWMgJiYgKGhhc0NyeXB0b09yRGVzY3JhbWJsZXIoKSB8fCBjb25mb3JtaW5nKSkgeworICAgICAgICBpZiAoIWJ1ZmZlcnNCb3VuZFRvQ29kZWMKKyAgICAgICAgICAgICAgICAmJiAhaW5wdXQtPmZyYW1lUmVhc3NlbWJsZXIKKyAgICAgICAgICAgICAgICAmJiAoaGFzQ3J5cHRvT3JEZXNjcmFtYmxlcigpIHx8IGNvbmZvcm1pbmcpKSB7CiAgICAgICAgICAgICBpbnB1dC0+YnVmZmVycy5yZXNldChuZXcgU2xvdElucHV0QnVmZmVycyhtTmFtZSkpOwogICAgICAgICB9IGVsc2UgaWYgKGdyYXBoaWMpIHsKICAgICAgICAgICAgIGlmIChtSW5wdXRTdXJmYWNlKSB7CkBAIC0xMDYzLDkgKzExNzcsNiBAQAogICAgICAgICAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7CiAgICAgICAgICAgICBvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzID0gbnVtT3V0cHV0U2xvdHMgKwogICAgICAgICAgICAgICAgICAgICByZW9yZGVyRGVwdGgudmFsdWUgKyBrUmVuZGVyaW5nRGVwdGg7Ci0gICAgICAgICAgICBpZiAoIXNlY3VyZSkgewotICAgICAgICAgICAgICAgIG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMgKz0gbnVtSW5wdXRTbG90czsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIG91dHB1dFN1cmZhY2UgPSBvdXRwdXQtPnN1cmZhY2UgPwogICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPnN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSA6IG51bGxwdHI7CiAgICAgICAgICAgICBpZiAob3V0cHV0U3VyZmFjZSkgewpAQCAtMTIzNyw3ICsxMzQ4LDcgQEAKICAgICAvLyBhYm91dCBidWZmZXJzIGZyb20gdGhlIHByZXZpb3VzIGdlbmVyYXRpb24gZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZQogICAgIC8vIG5ld2x5IGluaXRpYWxpemVkIHBpcGVsaW5lIGNhcGFjaXR5LgogCi0gICAgeworICAgIGlmIChpbnB1dEZvcm1hdCB8fCBvdXRwdXRGb3JtYXQpIHsKICAgICAgICAgTXV0ZXhlZDxQaXBlbGluZVdhdGNoZXI+OjpMb2NrZWQgd2F0Y2hlcihtUGlwZWxpbmVXYXRjaGVyKTsKICAgICAgICAgd2F0Y2hlci0+aW5wdXREZWxheShpbnB1dERlbGF5VmFsdWUpCiAgICAgICAgICAgICAgICAgLnBpcGVsaW5lRGVsYXkocGlwZWxpbmVEZWxheVZhbHVlKQpAQCAtMTMwMCw1NCArMTQxMSwzMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBhLmNhcGFjaXR5IDwgYi5jYXBhY2l0eTsKICAgICAgICAgICAgIH0pOwogCi0gICAgewotICAgICAgICBNdXRleGVkPHN0ZDo6bGlzdDxzcDxBQnVmZmVyPj4+OjpMb2NrZWQgY29uZmlncyhtRmx1c2hlZENvbmZpZ3MpOwotICAgICAgICBpZiAoIWNvbmZpZ3MtPmVtcHR5KCkpIHsKLSAgICAgICAgICAgIHdoaWxlICghY29uZmlncy0+ZW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNvbmZpZyA9IGNvbmZpZ3MtPmZyb250KCk7Ci0gICAgICAgICAgICAgICAgY29uZmlncy0+cG9wX2Zyb250KCk7Ci0gICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgc21hbGxlc3QgaW5wdXQgYnVmZmVyIHRoYXQgY2FuIGZpdCB0aGUgY29uZmlnLgotICAgICAgICAgICAgICAgIGF1dG8gaSA9IHN0ZDo6ZmluZF9pZigKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudElucHV0QnVmZmVycy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50SW5wdXRCdWZmZXJzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgW2NmZ1NpemUgPSBjb25maWctPnNpemUoKV0oY29uc3QgQ2xpZW50SW5wdXRCdWZmZXImIGIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYi5jYXBhY2l0eSA+PSBjZmdTaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPT0gY2xpZW50SW5wdXRCdWZmZXJzLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJbJXNdIG5vIGlucHV0IGJ1ZmZlciBsYXJnZSBlbm91Z2ggZm9yIHRoZSBjb25maWcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiKCV6dSBieXRlcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgY29uZmlnLT5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXIgPSBpLT5idWZmZXI7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlci0+YmFzZSgpLCBjb25maWctPmRhdGEoKSwgY29uZmlnLT5zaXplKCkpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgY29uZmlnLT5zaXplKCkpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5jbGVhcigpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCAxKTsKLSAgICAgICAgICAgICAgICBpZiAocXVldWVJbnB1dEJ1ZmZlckludGVybmFsKGJ1ZmZlcikgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coIlslc10gRXJyb3Igd2hpbGUgcXVldWVpbmcgYSBmbHVzaGVkIGNvbmZpZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNsaWVudElucHV0QnVmZmVycy5lcmFzZShpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChvU3RyZWFtRm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6TElORUFSICYmCi0gICAgICAgICAgICAgICAgICAgKCFwcmVwZW5kIHx8IHByZXBlbmQudmFsdWUgPT0gUFJFUEVORF9IRUFERVJfVE9fTk9ORSkpIHsKLSAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlciA9IGNsaWVudElucHV0QnVmZmVycy5mcm9udCgpLmJ1ZmZlcjsKLSAgICAgICAgICAgIC8vIFdPUktBUk9VTkQ6IFNvbWUgYXBwcyBleHBlY3QgQ1NEIGF2YWlsYWJsZSB3aXRob3V0IHF1ZXVlaW5nCi0gICAgICAgICAgICAvLyAgICAgICAgICAgICBhbnkgaW5wdXQuIFF1ZXVlIGFuIGVtcHR5IGJ1ZmZlciB0byBnZXQgdGhlIENTRC4KLSAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7Ci0gICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+Y2xlYXIoKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7Ci0gICAgICAgICAgICBpZiAocXVldWVJbnB1dEJ1ZmZlckludGVybmFsKGJ1ZmZlcikgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiWyVzXSBFcnJvciB3aGlsZSBxdWV1ZWluZyBhbiBlbXB0eSBidWZmZXIgdG8gZ2V0IENTRCIsCi0gICAgICAgICAgICAgICAgICAgICAgbU5hbWUpOwotICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xpZW50SW5wdXRCdWZmZXJzLnBvcF9mcm9udCgpOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gZmx1c2hlZENvbmZpZ3M7CisgICAgbUZsdXNoZWRDb25maWdzLmxvY2soKS0+c3dhcChmbHVzaGVkQ29uZmlncyk7CisgICAgaWYgKCFmbHVzaGVkQ29uZmlncy5lbXB0eSgpKSB7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXVlKCZmbHVzaGVkQ29uZmlncyk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJbJXNdIEVycm9yIHdoaWxlIHF1ZXVlaW5nIGEgZmx1c2hlZCBjb25maWciLCBtTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogICAgIH0KKyAgICBpZiAob1N0cmVhbUZvcm1hdC52YWx1ZSA9PSBDMkJ1ZmZlckRhdGE6OkxJTkVBUiAmJgorICAgICAgICAgICAgKCFwcmVwZW5kIHx8IHByZXBlbmQudmFsdWUgPT0gUFJFUEVORF9IRUFERVJfVE9fTk9ORSkpIHsKKyAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyID0gY2xpZW50SW5wdXRCdWZmZXJzLmZyb250KCkuYnVmZmVyOworICAgICAgICAvLyBXT1JLQVJPVU5EOiBTb21lIGFwcHMgZXhwZWN0IENTRCBhdmFpbGFibGUgd2l0aG91dCBxdWV1ZWluZworICAgICAgICAvLyAgICAgICAgICAgICBhbnkgaW5wdXQuIFF1ZXVlIGFuIGVtcHR5IGJ1ZmZlciB0byBnZXQgdGhlIENTRC4KKyAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPmNsZWFyKCk7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgIGlmIChxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoYnVmZmVyKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coIlslc10gRXJyb3Igd2hpbGUgcXVldWVpbmcgYW4gZW1wdHkgYnVmZmVyIHRvIGdldCBDU0QiLAorICAgICAgICAgICAgICAgICAgbU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50SW5wdXRCdWZmZXJzLnBvcF9mcm9udCgpOworICAgIH0KIAogICAgIGZvciAoY29uc3QgQ2xpZW50SW5wdXRCdWZmZXImIGNsaWVudElucHV0QnVmZmVyOiBjbGllbnRJbnB1dEJ1ZmZlcnMpIHsKICAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0QnVmZmVyQXZhaWxhYmxlKApAQCAtMTM2MSwxNCArMTQ0OCwxNCBAQAogdm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzdG9wKCkgewogICAgIG1TeW5jLnN0b3AoKTsKICAgICBtRmlyc3RWYWxpZEZyYW1lSW5kZXggPSBtRnJhbWVJbmRleC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOwotICAgIGlmIChtSW5wdXRTdXJmYWNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgbUlucHV0U3VyZmFjZS5yZXNldCgpOwotICAgIH0KLSAgICBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+Zmx1c2goKTsKIH0KIAogdm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpyZXNldCgpIHsKICAgICBzdG9wKCk7CisgICAgaWYgKG1JbnB1dFN1cmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICBtSW5wdXRTdXJmYWNlLnJlc2V0KCk7CisgICAgfQorICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5mbHVzaCgpOwogICAgIHsKICAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOwogICAgICAgICBpbnB1dC0+YnVmZmVycy5yZXNldChuZXcgRHVtbXlJbnB1dEJ1ZmZlcnMoIiIpKTsKQEAgLTEzOTYsMjcgKzE0ODMsMzkgQEAKIAogdm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpmbHVzaChjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yaykgewogICAgIEFMT0dWKCJbJXNdIGZsdXNoIiwgbU5hbWUpOwotICAgIHsKLSAgICAgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3A8QUJ1ZmZlcj4+Pjo6TG9ja2VkIGNvbmZpZ3MobUZsdXNoZWRDb25maWdzKTsKLSAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayA6IGZsdXNoZWRXb3JrKSB7Ci0gICAgICAgICAgICBpZiAoISh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkKLSAgICAgICAgICAgICAgICAgICAgfHwgd29yay0+aW5wdXQuYnVmZmVycy5mcm9udCgpLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZW1wdHkoKSkgewotICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIG5vIGxpbmVhciBjb2RlYyBjb25maWcgZGF0YSBmb3VuZCIsIG1OYW1lKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEMyUmVhZFZpZXcgdmlldyA9Ci0gICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZnJvbnQoKS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0QoIlslc10gZmFpbGVkIHRvIG1hcCBmbHVzaGVkIGNvZGVjIGNvbmZpZyBkYXRhOiAlZCIsIG1OYW1lLCB2aWV3LmVycm9yKCkpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29uZmlncy0+cHVzaF9iYWNrKEFCdWZmZXI6OkNyZWF0ZUFzQ29weSh2aWV3LmRhdGEoKSwgdmlldy5jYXBhY2l0eSgpKSk7Ci0gICAgICAgICAgICBBTE9HVigiWyVzXSBzdGFzaGVkIGZsdXNoZWQgY29kZWMgY29uZmlnIGRhdGEgKHNpemU9JXUpIiwgbU5hbWUsIHZpZXcuY2FwYWNpdHkoKSk7CisgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IGluZGljZXM7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBjb25maWdzOworICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICBpbmRpY2VzLnB1c2hfYmFjayh3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgICAgIGlmICghKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSkgeworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKQorICAgICAgICAgICAgICAgIHx8IHdvcmstPmlucHV0LmJ1ZmZlcnMuZnJvbnQoKSA9PSBudWxscHRyCisgICAgICAgICAgICAgICAgfHwgd29yay0+aW5wdXQuYnVmZmVycy5mcm9udCgpLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0QoIlslc10gbm8gbGluZWFyIGNvZGVjIGNvbmZpZyBkYXRhIGZvdW5kIiwgbU5hbWUpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gY29weShuZXcgQzJXb3JrKTsKKyAgICAgICAgY29weS0+aW5wdXQuZmxhZ3MgPSBDMkZyYW1lRGF0YTo6ZmxhZ3NfdCh3b3JrLT5pbnB1dC5mbGFncyB8IEMyRnJhbWVEYXRhOjpGTEFHX0RST1BfRlJBTUUpOworICAgICAgICBjb3B5LT5pbnB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgY29weS0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXgrKzsKKyAgICAgICAgY29weS0+aW5wdXQuYnVmZmVycy5pbnNlcnQoCisgICAgICAgICAgICAgICAgY29weS0+aW5wdXQuYnVmZmVycy5iZWdpbigpLAorICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmVuZCgpKTsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtIDogd29yay0+aW5wdXQuY29uZmlnVXBkYXRlKSB7CisgICAgICAgICAgICBjb3B5LT5pbnB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoKnBhcmFtKSk7CisgICAgICAgIH0KKyAgICAgICAgY29weS0+aW5wdXQuaW5mb0J1ZmZlcnMuaW5zZXJ0KAorICAgICAgICAgICAgICAgIGNvcHktPmlucHV0LmluZm9CdWZmZXJzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuaW5mb0J1ZmZlcnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5pbmZvQnVmZmVycy5lbmQoKSk7CisgICAgICAgIGNvcHktPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKyAgICAgICAgY29uZmlncy5wdXNoX2JhY2soc3RkOjptb3ZlKGNvcHkpKTsKKyAgICAgICAgQUxPR1YoIlslc10gc3Rhc2hlZCBmbHVzaGVkIGNvZGVjIGNvbmZpZyBkYXRhIiwgbU5hbWUpOwogICAgIH0KKyAgICBtRmx1c2hlZENvbmZpZ3MubG9jaygpLT5zd2FwKGNvbmZpZ3MpOwogICAgIHsKICAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOwogICAgICAgICBpbnB1dC0+YnVmZmVycy0+Zmx1c2goKTsKQEAgLTE0MjksNyArMTUyOCwxMiBAQAogICAgICAgICAgICAgb3V0cHV0LT5idWZmZXJzLT5mbHVzaFN0YXNoKCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPmZsdXNoKCk7CisgICAgeworICAgICAgICBNdXRleGVkPFBpcGVsaW5lV2F0Y2hlcj46OkxvY2tlZCB3YXRjaGVyKG1QaXBlbGluZVdhdGNoZXIpOworICAgICAgICBmb3IgKHVpbnQ2NF90IGluZGV4IDogaW5kaWNlcykgeworICAgICAgICAgICAgd2F0Y2hlci0+b25Xb3JrRG9uZShpbmRleCk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIHZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6b25Xb3JrRG9uZSgKQEAgLTE1MjUsNyArMTYyOSw5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzdGQ6Om9wdGlvbmFsPHVpbnQzMl90PiBuZXdJbnB1dERlbGF5LCBuZXdQaXBlbGluZURlbGF5OworICAgIHN0ZDo6b3B0aW9uYWw8dWludDMyX3Q+IG5ld0lucHV0RGVsYXksIG5ld1BpcGVsaW5lRGVsYXksIG5ld091dHB1dERlbGF5LCBuZXdSZW9yZGVyRGVwdGg7CisgICAgc3RkOjpvcHRpb25hbDxDMkNvbmZpZzo6b3JkaW5hbF9rZXlfdD4gbmV3UmVvcmRlcktleTsKKyAgICBib29sIG5lZWRNYXhEZXF1ZXVlQnVmZmVyQ291bnRVcGRhdGUgPSBmYWxzZTsKICAgICB3aGlsZSAoIXdvcmtsZXQtPm91dHB1dC5jb25maWdVcGRhdGUuZW1wdHkoKSkgewogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gcGFyYW07CiAgICAgICAgIHdvcmtsZXQtPm91dHB1dC5jb25maWdVcGRhdGUuYmFjaygpLnN3YXAocGFyYW0pOwpAQCAtMTUzNCwyNCArMTY0MCwxMCBAQAogICAgICAgICAgICAgY2FzZSBDMlBvcnRSZW9yZGVyQnVmZmVyRGVwdGhUdW5pbmc6OkNPUkVfSU5ERVg6IHsKICAgICAgICAgICAgICAgICBDMlBvcnRSZW9yZGVyQnVmZmVyRGVwdGhUdW5pbmc6Om91dHB1dCByZW9yZGVyRGVwdGg7CiAgICAgICAgICAgICAgICAgaWYgKHJlb3JkZXJEZXB0aC51cGRhdGVGcm9tKCpwYXJhbSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBzZWN1cmUgPSBtQ29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiLnNlY3VyZSIpICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmc6Om5wb3M7Ci0gICAgICAgICAgICAgICAgICAgIG1PdXRwdXQubG9jaygpLT5idWZmZXJzLT5zZXRSZW9yZGVyRGVwdGgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVvcmRlckRlcHRoLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogdXBkYXRlZCByZW9yZGVyIGRlcHRoIHRvICV1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHJlb3JkZXJEZXB0aC52YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1PdXRwdXRTbG90cyA9IG1PdXRwdXQubG9jaygpLT5udW1TbG90czsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bUlucHV0U2xvdHMgPSBtSW5wdXQubG9jaygpLT5udW1TbG90czsKLSAgICAgICAgICAgICAgICAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMgPSBudW1PdXRwdXRTbG90cyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVvcmRlckRlcHRoLnZhbHVlICsga1JlbmRlcmluZ0RlcHRoOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXNlY3VyZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5tYXhEZXF1ZXVlQnVmZmVycyArPSBudW1JbnB1dFNsb3RzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQtPnN1cmZhY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+c3VyZmFjZS0+c2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5tYXhEZXF1ZXVlQnVmZmVycyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmV3UmVvcmRlckRlcHRoID0gcmVvcmRlckRlcHRoLnZhbHVlOworICAgICAgICAgICAgICAgICAgICBuZWVkTWF4RGVxdWV1ZUJ1ZmZlckNvdW50VXBkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBvbldvcmtEb25lOiBmYWlsZWQgdG8gcmVhZCByZW9yZGVyIGRlcHRoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUpOwpAQCAtMTU2MSw3ICsxNjUzLDcgQEAKICAgICAgICAgICAgIGNhc2UgQzJQb3J0UmVvcmRlcktleVNldHRpbmc6OkNPUkVfSU5ERVg6IHsKICAgICAgICAgICAgICAgICBDMlBvcnRSZW9yZGVyS2V5U2V0dGluZzo6b3V0cHV0IHJlb3JkZXJLZXk7CiAgICAgICAgICAgICAgICAgaWYgKHJlb3JkZXJLZXkudXBkYXRlRnJvbSgqcGFyYW0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1PdXRwdXQubG9jaygpLT5idWZmZXJzLT5zZXRSZW9yZGVyS2V5KHJlb3JkZXJLZXkudmFsdWUpOworICAgICAgICAgICAgICAgICAgICBuZXdSZW9yZGVyS2V5ID0gcmVvcmRlcktleS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogdXBkYXRlZCByZW9yZGVyIGtleSB0byAldSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCByZW9yZGVyS2V5LnZhbHVlKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTU5NSw1MyArMTY4NywyNSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVsYXkudXBkYXRlRnJvbSgqcGFyYW0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiB1cGRhdGluZyBvdXRwdXQgZGVsYXkgJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIG91dHB1dERlbGF5LnZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2VjdXJlID0gbUNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoIi5zZWN1cmUiKSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZzo6bnBvczsKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKW1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5vdXRwdXREZWxheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVsYXkudmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPm91dHB1dERlbGF5KG91dHB1dERlbGF5LnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld091dHB1dERlbGF5ID0gb3V0cHV0RGVsYXkudmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBuZWVkTWF4RGVxdWV1ZUJ1ZmZlckNvdW50VXBkYXRlID0gdHJ1ZTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvdXRwdXRCdWZmZXJzQ2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bU91dHB1dFNsb3RzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1JbnB1dFNsb3RzID0gbUlucHV0LmxvY2soKS0+bnVtU2xvdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTXV0ZXhlZDxPdXRwdXQ+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3V0cHV0LT5idWZmZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5vdXRwdXREZWxheSA9IG91dHB1dERlbGF5LnZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bU91dHB1dFNsb3RzID0gb3V0cHV0RGVsYXkudmFsdWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1Ntb290aG5lc3NGYWN0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dC0+bnVtU2xvdHMgPCBudW1PdXRwdXRTbG90cykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPm51bVNsb3RzID0gbnVtT3V0cHV0U2xvdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQtPmJ1ZmZlcnMtPmlzQXJyYXlNb2RlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dEJ1ZmZlcnNBcnJheSAqYXJyYXkgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPdXRwdXRCdWZmZXJzQXJyYXkgKilvdXRwdXQtPmJ1ZmZlcnMuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBncm93aW5nIG91dHB1dCBidWZmZXIgYXJyYXkgdG8gJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBudW1PdXRwdXRTbG90cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS0+Z3JvdyhudW1PdXRwdXRTbG90cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtT3V0cHV0U2xvdHMgPSBvdXRwdXQtPm51bVNsb3RzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyc0NoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVwdGggPSBtT3V0cHV0LmxvY2soKS0+YnVmZmVycy0+Z2V0UmVvcmRlckRlcHRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMgPSBudW1PdXRwdXRTbG90cyArIGRlcHRoICsga1JlbmRlcmluZ0RlcHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWN1cmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzICs9IG51bUlucHV0U2xvdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0LT5zdXJmYWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5zdXJmYWNlLT5zZXRNYXhEZXF1ZXVlZEJ1ZmZlckNvdW50KG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBDMlBvcnRUdW5uZWxTeXN0ZW1UaW1lOjpDT1JFX0lOREVYOiB7CisgICAgICAgICAgICAgICAgQzJQb3J0VHVubmVsU3lzdGVtVGltZTo6b3V0cHV0IGZyYW1lUmVuZGVyVGltZTsKKyAgICAgICAgICAgICAgICBpZiAoZnJhbWVSZW5kZXJUaW1lLnVwZGF0ZUZyb20oKnBhcmFtKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBmcmFtZSByZW5kZXJlZCAoc3lzOiVsbGQgbnMsIG1lZGlhOiVsbGQgdXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIChsb25nIGxvbmcpZnJhbWVSZW5kZXJUaW1lLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXdvcmtsZXQtPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrbGwoKSk7CisgICAgICAgICAgICAgICAgICAgIG1DQ29kZWNDYWxsYmFjay0+b25PdXRwdXRGcmFtZXNSZW5kZXJlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrbGV0LT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVlaygpLCBmcmFtZVJlbmRlclRpbWUudmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogdW5yZWNvZ25pemVkIGNvbmZpZyB1cGRhdGUgKCUwOFgpIiwKICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcGFyYW0tPmluZGV4KCkpOwpAQCAtMTY2Niw2ICsxNzMwLDQ5IEBACiAgICAgICAgICAgICBpbnB1dC0+bnVtU2xvdHMgPSBuZXdOdW1TbG90czsKICAgICAgICAgfQogICAgIH0KKyAgICBzaXplX3QgbnVtT3V0cHV0U2xvdHMgPSAwOworICAgIHVpbnQzMl90IHJlb3JkZXJEZXB0aCA9IDA7CisgICAgYm9vbCBvdXRwdXRCdWZmZXJzQ2hhbmdlZCA9IGZhbHNlOworICAgIGlmIChuZXdSZW9yZGVyS2V5IHx8IG5ld1Jlb3JkZXJEZXB0aCB8fCBuZWVkTWF4RGVxdWV1ZUJ1ZmZlckNvdW50VXBkYXRlKSB7CisgICAgICAgIE11dGV4ZWQ8T3V0cHV0Pjo6TG9ja2VkIG91dHB1dChtT3V0cHV0KTsKKyAgICAgICAgaWYgKCFvdXRwdXQtPmJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBudW1PdXRwdXRTbG90cyA9IG91dHB1dC0+bnVtU2xvdHM7CisgICAgICAgIGlmIChuZXdSZW9yZGVyS2V5KSB7CisgICAgICAgICAgICBvdXRwdXQtPmJ1ZmZlcnMtPnNldFJlb3JkZXJLZXkobmV3UmVvcmRlcktleS52YWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmV3UmVvcmRlckRlcHRoKSB7CisgICAgICAgICAgICBvdXRwdXQtPmJ1ZmZlcnMtPnNldFJlb3JkZXJEZXB0aChuZXdSZW9yZGVyRGVwdGgudmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmVvcmRlckRlcHRoID0gb3V0cHV0LT5idWZmZXJzLT5nZXRSZW9yZGVyRGVwdGgoKTsKKyAgICAgICAgaWYgKG5ld091dHB1dERlbGF5KSB7CisgICAgICAgICAgICBvdXRwdXQtPm91dHB1dERlbGF5ID0gbmV3T3V0cHV0RGVsYXkudmFsdWUoKTsKKyAgICAgICAgICAgIG51bU91dHB1dFNsb3RzID0gbmV3T3V0cHV0RGVsYXkudmFsdWUoKSArIGtTbW9vdGhuZXNzRmFjdG9yOworICAgICAgICAgICAgaWYgKG91dHB1dC0+bnVtU2xvdHMgPCBudW1PdXRwdXRTbG90cykgeworICAgICAgICAgICAgICAgIG91dHB1dC0+bnVtU2xvdHMgPSBudW1PdXRwdXRTbG90czsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0LT5idWZmZXJzLT5pc0FycmF5TW9kZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIE91dHB1dEJ1ZmZlcnNBcnJheSAqYXJyYXkgPQorICAgICAgICAgICAgICAgICAgICAgICAgKE91dHB1dEJ1ZmZlcnNBcnJheSAqKW91dHB1dC0+YnVmZmVycy5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogZ3Jvd2luZyBvdXRwdXQgYnVmZmVyIGFycmF5IHRvICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBudW1PdXRwdXRTbG90cyk7CisgICAgICAgICAgICAgICAgICAgIGFycmF5LT5ncm93KG51bU91dHB1dFNsb3RzKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyc0NoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBudW1PdXRwdXRTbG90cyA9IG91dHB1dC0+bnVtU2xvdHM7CisgICAgfQorICAgIGlmIChvdXRwdXRCdWZmZXJzQ2hhbmdlZCkgeworICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKTsKKyAgICB9CisgICAgaWYgKG5lZWRNYXhEZXF1ZXVlQnVmZmVyQ291bnRVcGRhdGUpIHsKKyAgICAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7CisgICAgICAgIG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMgPSBudW1PdXRwdXRTbG90cyArIHJlb3JkZXJEZXB0aCArIGtSZW5kZXJpbmdEZXB0aDsKKyAgICAgICAgaWYgKG91dHB1dC0+c3VyZmFjZSkgeworICAgICAgICAgICAgb3V0cHV0LT5zdXJmYWNlLT5zZXRNYXhEZXF1ZXVlZEJ1ZmZlckNvdW50KG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMpOworICAgICAgICB9CisgICAgfQogCiAgICAgaW50MzJfdCBmbGFncyA9IDA7CiAgICAgaWYgKHdvcmtsZXQtPm91dHB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oCmluZGV4IDA0NmM1YzMuLjQ1ZGEwMDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmgKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuaApAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgogCiAjaW5jbHVkZSAiQ0NvZGVjQnVmZmVycy5oIgorI2luY2x1ZGUgIkZyYW1lUmVhc3NlbWJsZXIuaCIKICNpbmNsdWRlICJJbnB1dFN1cmZhY2VXcmFwcGVyLmgiCiAjaW5jbHVkZSAiUGlwZWxpbmVXYXRjaGVyLmgiCiAKQEAgLTIzOCw3ICsyMzksOSBAQAogCiAgICAgdm9pZCBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSgpOwogICAgIHZvaWQgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGVJbnRlcm5hbCgpOwotICAgIHN0YXR1c190IHF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXIpOworICAgIHN0YXR1c190IHF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBlbmNyeXB0ZWRCbG9jayA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBibG9ja1NpemUgPSAwKTsKICAgICBib29sIGhhbmRsZVdvcmsoCiAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrLCBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKICAgICAgICAgICAgIGNvbnN0IEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQgKmluaXREYXRhKTsKQEAgLTI2OSw2ICsyNzIsOCBAQAogICAgICAgICBzaXplX3QgbnVtRXh0cmFTbG90czsKICAgICAgICAgdWludDMyX3QgaW5wdXREZWxheTsKICAgICAgICAgdWludDMyX3QgcGlwZWxpbmVEZWxheTsKKworICAgICAgICBGcmFtZVJlYXNzZW1ibGVyIGZyYW1lUmVhc3NlbWJsZXI7CiAgICAgfTsKICAgICBNdXRleGVkPElucHV0PiBtSW5wdXQ7CiAgICAgc3RydWN0IE91dHB1dCB7CkBAIC0yNzcsNyArMjgyLDcgQEAKICAgICAgICAgdWludDMyX3Qgb3V0cHV0RGVsYXk7CiAgICAgfTsKICAgICBNdXRleGVkPE91dHB1dD4gbU91dHB1dDsKLSAgICBNdXRleGVkPHN0ZDo6bGlzdDxzcDxBQnVmZmVyPj4+IG1GbHVzaGVkQ29uZmlnczsKKyAgICBNdXRleGVkPHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4+IG1GbHVzaGVkQ29uZmlnczsKIAogICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1GcmFtZUluZGV4OwogICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1GaXJzdFZhbGlkRnJhbWVJbmRleDsKQEAgLTI4OCw2ICsyOTMsNyBAQAogICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOwogICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uOwogICAgICAgICBpbnQgbWF4RGVxdWV1ZUJ1ZmZlcnM7CisgICAgICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBpbnQ+IHJvdGF0aW9uOwogICAgIH07CiAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPiBtT3V0cHV0U3VyZmFjZTsKIApAQCAtMzE1LDYgKzMyMSw3IEBACiAgICAgaW5saW5lIGJvb2wgaGFzQ3J5cHRvT3JEZXNjcmFtYmxlcigpIHsKICAgICAgICAgcmV0dXJuIG1DcnlwdG8gIT0gbnVsbHB0ciB8fCBtRGVzY3JhbWJsZXIgIT0gbnVsbHB0cjsKICAgICB9CisgICAgc3RkOjphdG9taWNfYm9vbCBtU2VuZEVuY3J5cHRlZEluZm9CdWZmZXI7CiB9OwogCiAvLyBDb252ZXJzaW9uIG9mIGEgYzJfc3RhdHVzX3QgdmFsdWUgdG8gYSBzdGF0dXNfdCB2YWx1ZSBtYXkgZGVwZW5kIG9uIHRoZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuY3BwCmluZGV4IGJkZGFhOWYuLmJhNDQwNzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5jcHAKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CiAKICNpbmNsdWRlICJDQ29kZWNCdWZmZXJzLmgiCisjaW5jbHVkZSAiQ29kZWMyTWFwcGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNzYsMjkgKzc3LDM5IEBACiB2b2lkIENDb2RlY0J1ZmZlcnM6OmhhbmRsZUltYWdlRGF0YShjb25zdCBzcDxDb2RlYzJCdWZmZXI+ICZidWZmZXIpIHsKICAgICBzcDxBQnVmZmVyPiBpbWFnZURhdGFDYW5kaWRhdGUgPSBidWZmZXItPmdldEltYWdlRGF0YSgpOwogICAgIGlmIChpbWFnZURhdGFDYW5kaWRhdGUgPT0gbnVsbHB0cikgeworICAgICAgICBpZiAobUZvcm1hdFdpdGhJbWFnZURhdGEpIHsKKyAgICAgICAgICAgIC8vIFdlIHByZXZpb3VzbHkgc2VudCB0aGUgZm9ybWF0IHdpdGggaW1hZ2UgZGF0YSwgc28gdXNlIHRoZSBzYW1lIGZvcm1hdC4KKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0Rm9ybWF0KG1Gb3JtYXRXaXRoSW1hZ2VEYXRhKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHNwPEFCdWZmZXI+IGltYWdlRGF0YTsKLSAgICBpZiAoIW1Gb3JtYXQtPmZpbmRCdWZmZXIoImltYWdlLWRhdGEiLCAmaW1hZ2VEYXRhKQotICAgICAgICAgICAgfHwgaW1hZ2VEYXRhQ2FuZGlkYXRlLT5zaXplKCkgIT0gaW1hZ2VEYXRhLT5zaXplKCkKLSAgICAgICAgICAgIHx8IG1lbWNtcChpbWFnZURhdGFDYW5kaWRhdGUtPmRhdGEoKSwgaW1hZ2VEYXRhLT5kYXRhKCksIGltYWdlRGF0YS0+c2l6ZSgpKSAhPSAwKSB7CisgICAgaWYgKCFtTGFzdEltYWdlRGF0YQorICAgICAgICAgICAgfHwgaW1hZ2VEYXRhQ2FuZGlkYXRlLT5zaXplKCkgIT0gbUxhc3RJbWFnZURhdGEtPnNpemUoKQorICAgICAgICAgICAgfHwgbWVtY21wKGltYWdlRGF0YUNhbmRpZGF0ZS0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgIG1MYXN0SW1hZ2VEYXRhLT5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgbUxhc3RJbWFnZURhdGEtPnNpemUoKSkgIT0gMCkgewogICAgICAgICBBTE9HRCgiWyVzXSB1cGRhdGluZyBpbWFnZS1kYXRhIiwgbU5hbWUpOwotICAgICAgICBzcDxBTWVzc2FnZT4gbmV3Rm9ybWF0ID0gZHVwRm9ybWF0KCk7Ci0gICAgICAgIG5ld0Zvcm1hdC0+c2V0QnVmZmVyKCJpbWFnZS1kYXRhIiwgaW1hZ2VEYXRhQ2FuZGlkYXRlKTsKKyAgICAgICAgbUZvcm1hdFdpdGhJbWFnZURhdGEgPSBkdXBGb3JtYXQoKTsKKyAgICAgICAgbUxhc3RJbWFnZURhdGEgPSBpbWFnZURhdGFDYW5kaWRhdGU7CisgICAgICAgIG1Gb3JtYXRXaXRoSW1hZ2VEYXRhLT5zZXRCdWZmZXIoImltYWdlLWRhdGEiLCBpbWFnZURhdGFDYW5kaWRhdGUpOwogICAgICAgICBNZWRpYUltYWdlMiAqaW1nID0gKE1lZGlhSW1hZ2UyKilpbWFnZURhdGFDYW5kaWRhdGUtPmRhdGEoKTsKICAgICAgICAgaWYgKGltZy0+bU51bVBsYW5lcyA+IDAgJiYgaW1nLT5tVHlwZSAhPSBpbWctPk1FRElBX0lNQUdFX1RZUEVfVU5LTk9XTikgewogICAgICAgICAgICAgaW50MzJfdCBzdHJpZGUgPSBpbWctPm1QbGFuZVswXS5tUm93SW5jOwotICAgICAgICAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfU1RSSURFLCBzdHJpZGUpOworICAgICAgICAgICAgbUZvcm1hdFdpdGhJbWFnZURhdGEtPnNldEludDMyKEtFWV9TVFJJREUsIHN0cmlkZSk7CiAgICAgICAgICAgICBBTE9HRCgiWyVzXSB1cGRhdGluZyBzdHJpZGUgPSAlZCIsIG1OYW1lLCBzdHJpZGUpOwogICAgICAgICAgICAgaWYgKGltZy0+bU51bVBsYW5lcyA+IDEgJiYgc3RyaWRlID4gMCkgewotICAgICAgICAgICAgICAgIGludDMyX3QgdnN0cmlkZSA9IChpbWctPm1QbGFuZVsxXS5tT2Zmc2V0IC0gaW1nLT5tUGxhbmVbMF0ubU9mZnNldCkgLyBzdHJpZGU7Ci0gICAgICAgICAgICAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfU0xJQ0VfSEVJR0hULCB2c3RyaWRlKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldERlbHRhID0KKyAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpaW1nLT5tUGxhbmVbMV0ubU9mZnNldCAtIChpbnQ2NF90KWltZy0+bVBsYW5lWzBdLm1PZmZzZXQ7CisgICAgICAgICAgICAgICAgaW50MzJfdCB2c3RyaWRlID0gaW50MzJfdChvZmZzZXREZWx0YSAvIHN0cmlkZSk7CisgICAgICAgICAgICAgICAgbUZvcm1hdFdpdGhJbWFnZURhdGEtPnNldEludDMyKEtFWV9TTElDRV9IRUlHSFQsIHZzdHJpZGUpOwogICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIHVwZGF0aW5nIHZzdHJpZGUgPSAlZCIsIG1OYW1lLCB2c3RyaWRlKTsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5tUGxhbmVbMF0ubU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2l6ZSgpIC0gaW1nLT5tUGxhbmVbMF0ubU9mZnNldCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgc2V0Rm9ybWF0KG5ld0Zvcm1hdCk7Ci0gICAgICAgIGJ1ZmZlci0+c2V0Rm9ybWF0KG5ld0Zvcm1hdCk7CiAgICAgfQorICAgIGJ1ZmZlci0+c2V0Rm9ybWF0KG1Gb3JtYXRXaXRoSW1hZ2VEYXRhKTsKIH0KIAogLy8gSW5wdXRCdWZmZXJzCkBAIC0xNTYsOCArMTY3LDcgQEAKICAgICBzZXRTa2lwQ3V0QnVmZmVyKGRlbGF5LCBwYWRkaW5nKTsKIH0KIAotdm9pZCBPdXRwdXRCdWZmZXJzOjp1cGRhdGVTa2lwQ3V0QnVmZmVyKAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgYm9vbCBub3RpZnkpIHsKK3ZvaWQgT3V0cHV0QnVmZmVyczo6dXBkYXRlU2tpcEN1dEJ1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgewogICAgIEFTdHJpbmcgbWVkaWFUeXBlOwogICAgIGlmIChmb3JtYXQtPmZpbmRTdHJpbmcoS0VZX01JTUUsICZtZWRpYVR5cGUpCiAgICAgICAgICAgICAmJiBtZWRpYVR5cGUgPT0gTUlNRVRZUEVfQVVESU9fUkFXKSB7CkBAIC0xNjgsOSArMTc4LDYgQEAKICAgICAgICAgICAgIHVwZGF0ZVNraXBDdXRCdWZmZXIoc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50KTsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAobm90aWZ5KSB7Ci0gICAgICAgIG1VbnJlcG9ydGVkRm9ybWF0ID0gbnVsbHB0cjsKLSAgICB9CiB9CiAKIHZvaWQgT3V0cHV0QnVmZmVyczo6c3VibWl0KGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpIHsKQEAgLTE5NCw3ICsyMDEsNiBAQAogICAgIG1SZW9yZGVyU3Rhc2guY2xlYXIoKTsKICAgICBtRGVwdGggPSAwOwogICAgIG1LZXkgPSBDMkNvbmZpZzo6T1JESU5BTDsKLSAgICBtVW5yZXBvcnRlZEZvcm1hdCA9IG51bGxwdHI7CiB9CiAKIHZvaWQgT3V0cHV0QnVmZmVyczo6Zmx1c2hTdGFzaCgpIHsKQEAgLTI3MCwyNSArMjc2LDE1IEBACiAgICAgKmMyQnVmZmVyID0gZW50cnkuYnVmZmVyOwogICAgIHNwPEFNZXNzYWdlPiBvdXRwdXRGb3JtYXQgPSBlbnRyeS5mb3JtYXQ7CiAKLSAgICAvLyBUaGUgb3V0cHV0IGZvcm1hdCBjYW4gYmUgcHJvY2Vzc2VkIHdpdGhvdXQgYSByZWdpc3RlcmVkIHNsb3QuCi0gICAgaWYgKG91dHB1dEZvcm1hdCkgewotICAgICAgICB1cGRhdGVTa2lwQ3V0QnVmZmVyKG91dHB1dEZvcm1hdCwgZW50cnkubm90aWZ5KTsKLSAgICB9Ci0KLSAgICBpZiAoZW50cnkubm90aWZ5KSB7Ci0gICAgICAgIGlmIChvdXRwdXRGb3JtYXQpIHsKLSAgICAgICAgICAgIHNldEZvcm1hdChvdXRwdXRGb3JtYXQpOwotICAgICAgICB9IGVsc2UgaWYgKG1VbnJlcG9ydGVkRm9ybWF0KSB7Ci0gICAgICAgICAgICBvdXRwdXRGb3JtYXQgPSBtVW5yZXBvcnRlZEZvcm1hdDsKLSAgICAgICAgICAgIHNldEZvcm1hdChvdXRwdXRGb3JtYXQpOwotICAgICAgICB9Ci0gICAgICAgIG1VbnJlcG9ydGVkRm9ybWF0ID0gbnVsbHB0cjsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAob3V0cHV0Rm9ybWF0KSB7Ci0gICAgICAgICAgICBtVW5yZXBvcnRlZEZvcm1hdCA9IG91dHB1dEZvcm1hdDsKLSAgICAgICAgfSBlbHNlIGlmICghbVVucmVwb3J0ZWRGb3JtYXQpIHsKLSAgICAgICAgICAgIG1VbnJlcG9ydGVkRm9ybWF0ID0gbUZvcm1hdDsKLSAgICAgICAgfQorICAgIGlmIChlbnRyeS5ub3RpZnkgJiYgbUZvcm1hdCAhPSBvdXRwdXRGb3JtYXQpIHsKKyAgICAgICAgdXBkYXRlU2tpcEN1dEJ1ZmZlcihvdXRwdXRGb3JtYXQpOworICAgICAgICAvLyBUcmlnZ2VyIGltYWdlIGRhdGEgcHJvY2Vzc2luZyB0byB0aGUgbmV3IGZvcm1hdAorICAgICAgICBtTGFzdEltYWdlRGF0YS5jbGVhcigpOworICAgICAgICBBTE9HVigiWyVzXSBwb3BGcm9tU3Rhc2hBbmRSZWdpc3Rlcjogb3V0cHV0IGZvcm1hdCByZWZlcmVuY2UgY2hhbmdlZDogJXAgLT4gJXAiLAorICAgICAgICAgICAgICAgIG1OYW1lLCBtRm9ybWF0LmdldCgpLCBvdXRwdXRGb3JtYXQuZ2V0KCkpOworICAgICAgICBBTE9HRCgiWyVzXSBwb3BGcm9tU3Rhc2hBbmRSZWdpc3RlcjogYXQgJWxsZHVzLCBvdXRwdXQgZm9ybWF0IGNoYW5nZWQgdG8gJXMiLAorICAgICAgICAgICAgICAgIG1OYW1lLCAobG9uZyBsb25nKWVudHJ5LnRpbWVzdGFtcCwgb3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICBzZXRGb3JtYXQob3V0cHV0Rm9ybWF0KTsKICAgICB9CiAKICAgICAvLyBGbHVzaGluZyBtUmVvcmRlclN0YXNoIGJlY2F1c2Ugbm8gb3RoZXIgYnVmZmVycyBzaG91bGQgY29tZSBhZnRlciBvdXRwdXQKQEAgLTI5OSwxMCArMjk1LDYgQEAKICAgICB9CiAKICAgICBpZiAoIWVudHJ5Lm5vdGlmeSkgewotICAgICAgICBpZiAob3V0cHV0Rm9ybWF0KSB7Ci0gICAgICAgICAgICBBTE9HRCgiWyVzXSBwb3BGcm9tU3Rhc2hBbmRSZWdpc3Rlcjogb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIHRvICVzIiwKLSAgICAgICAgICAgICAgICAgICAgbU5hbWUsIG91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgfQogICAgICAgICBtUGVuZGluZy5wb3BfZnJvbnQoKTsKICAgICAgICAgcmV0dXJuIERJU0NBUkQ7CiAgICAgfQpAQCAtMzE5LDEwICszMTEsNyBAQAogICAgIC8vIEFwcGVuZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmcm9udCBzdGFzaCBlbnRyeSB0byBvdXRCdWZmZXIuCiAgICAgKCpvdXRCdWZmZXIpLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCBlbnRyeS50aW1lc3RhbXApOwogICAgICgqb3V0QnVmZmVyKS0+bWV0YSgpLT5zZXRJbnQzMigiZmxhZ3MiLCBlbnRyeS5mbGFncyk7Ci0gICAgaWYgKG91dHB1dEZvcm1hdCkgewotICAgICAgICBBTE9HRCgiWyVzXSBwb3BGcm9tU3Rhc2hBbmRSZWdpc3Rlcjogb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIHRvICVzIiwKLSAgICAgICAgICAgICAgICBtTmFtZSwgb3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwotICAgIH0KKyAgICAoKm91dEJ1ZmZlciktPm1ldGEoKS0+c2V0SW50NjQoImZyYW1lSW5kZXgiLCBlbnRyeS5vcmRpbmFsLmZyYW1lSW5kZXgucGVla2xsKCkpOwogICAgIEFMT0dWKCJbJXNdIHBvcEZyb21TdGFzaEFuZFJlZ2lzdGVyOiAiCiAgICAgICAgICAgIm91dCBidWZmZXIgaW5kZXggPSAlenUgWyVwXSA9PiAlcCArICV6dSAoJWxsZCkiLAogICAgICAgICAgIG1OYW1lLCAqaW5kZXgsIG91dEJ1ZmZlci0+Z2V0KCksCkBAIC0xMDE0LDE4ICsxMDAzLDMyIEBACiAgICAgLy8gdHJhY2sgb2YgdGhlIGZsdXNoZWQgd29yay4KIH0KIAorc3RhdGljIHVpbnQzMl90IGV4dHJhY3RQaXhlbEZvcm1hdChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIGludDMyX3QgZnJhbWV3b3JrQ29sb3JGb3JtYXQgPSAwOworICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoImFuZHJvaWQuX2NvbG9yLWZvcm1hdCIsICZmcmFtZXdvcmtDb2xvckZvcm1hdCkpIHsKKyAgICAgICAgcmV0dXJuIFBJWEVMX0ZPUk1BVF9VTktOT1dOOworICAgIH0KKyAgICB1aW50MzJfdCBwaXhlbEZvcm1hdCA9IFBJWEVMX0ZPUk1BVF9VTktOT1dOOworICAgIGlmIChDMk1hcHBlcjo6bWFwUGl4ZWxGb3JtYXRGcmFtZXdvcmtUb0NvZGVjKGZyYW1ld29ya0NvbG9yRm9ybWF0LCAmcGl4ZWxGb3JtYXQpKSB7CisgICAgICAgIHJldHVybiBwaXhlbEZvcm1hdDsKKyAgICB9CisgICAgcmV0dXJuIFBJWEVMX0ZPUk1BVF9VTktOT1dOOworfQorCiBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPiBHcmFwaGljSW5wdXRCdWZmZXJzOjp0b0FycmF5TW9kZShzaXplX3Qgc2l6ZSkgewogICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnNBcnJheT4gYXJyYXkoCiAgICAgICAgICAgICBuZXcgSW5wdXRCdWZmZXJzQXJyYXkobUNvbXBvbmVudE5hbWUuY19zdHIoKSwgIjJELUJCLUlucHV0W05dIikpOwogICAgIGFycmF5LT5zZXRQb29sKG1Qb29sKTsKICAgICBhcnJheS0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgIHVpbnQzMl90IHBpeGVsRm9ybWF0ID0gZXh0cmFjdFBpeGVsRm9ybWF0KG1Gb3JtYXQpOwogICAgIGFycmF5LT5pbml0aWFsaXplKAogICAgICAgICAgICAgbUltcGwsCiAgICAgICAgICAgICBzaXplLAotICAgICAgICAgICAgW3Bvb2wgPSBtUG9vbCwgZm9ybWF0ID0gbUZvcm1hdCwgbGJwID0gbUxvY2FsQnVmZmVyUG9vbF0oKSAtPiBzcDxDb2RlYzJCdWZmZXI+IHsKKyAgICAgICAgICAgIFtwb29sID0gbVBvb2wsIGZvcm1hdCA9IG1Gb3JtYXQsIGxicCA9IG1Mb2NhbEJ1ZmZlclBvb2wsIHBpeGVsRm9ybWF0XSgpCisgICAgICAgICAgICAgICAgICAgIC0+IHNwPENvZGVjMkJ1ZmZlcj4gewogICAgICAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKICAgICAgICAgICAgICAgICByZXR1cm4gQWxsb2NhdGVHcmFwaGljQnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgcG9vbCwgZm9ybWF0LCBIQUxfUElYRUxfRk9STUFUX1lWMTIsIHVzYWdlLCBsYnApOworICAgICAgICAgICAgICAgICAgICAgICAgcG9vbCwgZm9ybWF0LCBwaXhlbEZvcm1hdCwgdXNhZ2UsIGxicCk7CiAgICAgICAgICAgICB9KTsKICAgICByZXR1cm4gc3RkOjptb3ZlKGFycmF5KTsKIH0KQEAgLTEwMzgsNyArMTA0MSw3IEBACiAgICAgLy8gVE9ETzogcmVhZCB1c2FnZSBmcm9tIGludGYKICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CiAgICAgcmV0dXJuIEFsbG9jYXRlR3JhcGhpY0J1ZmZlcigKLSAgICAgICAgICAgIG1Qb29sLCBtRm9ybWF0LCBIQUxfUElYRUxfRk9STUFUX1lWMTIsIHVzYWdlLCBtTG9jYWxCdWZmZXJQb29sKTsKKyAgICAgICAgICAgIG1Qb29sLCBtRm9ybWF0LCBleHRyYWN0UGl4ZWxGb3JtYXQobUZvcm1hdCksIHVzYWdlLCBtTG9jYWxCdWZmZXJQb29sKTsKIH0KIAogLy8gT3V0cHV0QnVmZmVyc0FycmF5CkBAIC0xMTc0LDcgKzExNzcsNiBAQAogdm9pZCBPdXRwdXRCdWZmZXJzQXJyYXk6OnRyYW5zZmVyRnJvbShPdXRwdXRCdWZmZXJzKiBzb3VyY2UpIHsKICAgICBtRm9ybWF0ID0gc291cmNlLT5tRm9ybWF0OwogICAgIG1Ta2lwQ3V0QnVmZmVyID0gc291cmNlLT5tU2tpcEN1dEJ1ZmZlcjsKLSAgICBtVW5yZXBvcnRlZEZvcm1hdCA9IHNvdXJjZS0+bVVucmVwb3J0ZWRGb3JtYXQ7CiAgICAgbVBlbmRpbmcgPSBzdGQ6Om1vdmUoc291cmNlLT5tUGVuZGluZyk7CiAgICAgbVJlb3JkZXJTdGFzaCA9IHN0ZDo6bW92ZShzb3VyY2UtPm1SZW9yZGVyU3Rhc2gpOwogICAgIG1EZXB0aCA9IHNvdXJjZS0+bURlcHRoOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmgKaW5kZXggNDc3MmFiNS4uOTk1ZDNhNCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuaAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5oCkBAIC0zMyw4ICszMyw4IEBACiBjbGFzcyBTa2lwQ3V0QnVmZmVyOwogCiBjb25zdGV4cHIgc2l6ZV90IGtMaW5lYXJCdWZmZXJTaXplID0gMTA0ODU3NjsKLS8vIFRoaXMgY2FuIGZpdCA0SyBSR0JBIGZyYW1lLCBhbmQgbW9zdCBsaWtlbHkgY2xpZW50IHdvbid0IG5lZWQgbW9yZSB0aGFuIHRoaXMuCi1jb25zdGV4cHIgc2l6ZV90IGtNYXhMaW5lYXJCdWZmZXJTaXplID0gNDA5NiAqIDIzMDQgKiA0OworLy8gVGhpcyBjYW4gZml0IGFuIDhLIGZyYW1lLgorY29uc3RleHByIHNpemVfdCBrTWF4TGluZWFyQnVmZmVyU2l6ZSA9IDc2ODAgKiA0MzIwICogMjsKIAogLyoqCiAgKiBCYXNlIGNsYXNzIGZvciByZXByZXNlbnRhdGlvbiBvZiBidWZmZXJzIGF0IG9uZSBwb3J0LgpAQCAtODYsNiArODYsOSBAQAogICAgIC8vIEZvcm1hdCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyBNZWRpYUNvZGVjLWZhY2luZyBidWZmZXJzLgogICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwogCisgICAgc3A8QUJ1ZmZlcj4gbUxhc3RJbWFnZURhdGE7CisgICAgc3A8QU1lc3NhZ2U+IG1Gb3JtYXRXaXRoSW1hZ2VEYXRhOworCiBwcml2YXRlOgogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENDb2RlY0J1ZmZlcnMpOwogfTsKQEAgLTIxNSwxMCArMjE4LDggQEAKIAogICAgIC8qKgogICAgICAqIFVwZGF0ZSBTa2lwQ3V0QnVmZmVyIGZyb20gZm9ybWF0LiBUaGUgQHAgZm9ybWF0IG11c3Qgbm90IGJlIG51bGwuCi0gICAgICogQHAgbm90aWZ5IGRldGVybWluZXMgd2hldGhlciB0aGUgZm9ybWF0IGNvbWVzIHdpdGggYSBidWZmZXIgdGhhdCBzaG91bGQKLSAgICAgKiBiZSByZXBvcnRlZCB0byB0aGUgY2xpZW50IG9yIG5vdC4KICAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZVNraXBDdXRCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGJvb2wgbm90aWZ5ID0gdHJ1ZSk7CisgICAgdm9pZCB1cGRhdGVTa2lwQ3V0QnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKIAogICAgIC8qKgogICAgICAqIE91dHB1dCBTdGFzaApAQCAtMzkyLDkgKzM5Myw2IEBACiAKICAgICAvLyBPdXRwdXQgc3Rhc2gKIAotICAgIC8vIE91dHB1dCBmb3JtYXQgdGhhdCBoYXMgbm90IGJlZW4gbWFkZSBhdmFpbGFibGUgdG8gdGhlIGNsaWVudC4KLSAgICBzcDxBTWVzc2FnZT4gbVVucmVwb3J0ZWRGb3JtYXQ7Ci0KICAgICAvLyBTdHJ1Y3QgZm9yIGFuIGVudHJ5IGluIHRoZSBvdXRwdXQgc3Rhc2ggKG1QZW5kaW5nIGFuZCBtUmVvcmRlclN0YXNoKQogICAgIHN0cnVjdCBTdGFzaEVudHJ5IHsKICAgICAgICAgaW5saW5lIFN0YXNoRW50cnkoKQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmNwcAppbmRleCA5NmY4NmU4Li4yN2U4N2U2IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmNwcApAQCAtMTgsMTEgKzE4LDEzIEBACiAjZGVmaW5lIExPR19UQUcgIkNDb2RlY0NvbmZpZyIKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9OYXRpdmVIYW5kbGUuaD4KIAogI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8QzJQYXJhbS5oPgogI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KIAorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KIAogI2luY2x1ZGUgIkNDb2RlY0NvbmZpZy5oIgpAQCAtMjg5LDggKzI5MSw4IEBACiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdldFBhdGhzRm9yRG9tYWluKAogICAgICAgICAgICAgRG9tYWluIGFueSwgRG9tYWluIGFsbCA9IERvbWFpbjo6QUxMKSBjb25zdCB7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXM7Ci0gICAgICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+PiAmZWwgOiBtQ29uZmlnTWFwcGVycykgewotICAgICAgICAgICAgZm9yIChjb25zdCBDb25maWdNYXBwZXIgJmNtIDogZWwuc2Vjb25kKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmW2tleSwgbWFwcGVyc10gOiBtQ29uZmlnTWFwcGVycykgeworICAgICAgICAgICAgZm9yIChjb25zdCBDb25maWdNYXBwZXIgJmNtIDogbWFwcGVycykgewogICAgICAgICAgICAgICAgIEFMT0dWKCJmaWx0ZXJpbmcgJXMgJXggJXggJXggJXgiLCBjbS5wYXRoKCkuY19zdHIoKSwgY20uZG9tYWluKCksIGFueSwKICAgICAgICAgICAgICAgICAgICAgICAgIChjbS5kb21haW4oKSAmIGFueSksIChjbS5kb21haW4oKSAmIGFueSAmIGFsbCkpOwogICAgICAgICAgICAgICAgIGlmICgoY20uZG9tYWluKCkgJiBhbnkpICYmICgoY20uZG9tYWluKCkgJiBhbnkgJiBhbGwpID09IChhbnkgJiBhbGwpKSkgewpAQCAtMzIxLDcgKzMyMyw4IEBACiBDQ29kZWNDb25maWc6OkNDb2RlY0NvbmZpZygpCiAgICAgOiBtSW5wdXRGb3JtYXQobmV3IEFNZXNzYWdlKSwKICAgICAgIG1PdXRwdXRGb3JtYXQobmV3IEFNZXNzYWdlKSwKLSAgICAgIG1Vc2luZ1N1cmZhY2UoZmFsc2UpIHsgfQorICAgICAgbVVzaW5nU3VyZmFjZShmYWxzZSksCisgICAgICBtVHVubmVsZWQoZmFsc2UpIHsgfQogCiB2b2lkIENDb2RlY0NvbmZpZzo6aW5pdGlhbGl6ZVN0YW5kYXJkUGFyYW1zKCkgewogICAgIHR5cGVkZWYgRG9tYWluIEQ7CkBAIC0zNTksNyArMzYyLDEwIEBACiAgICAgICAgIC5saW1pdFRvKEQ6Ok9VVFBVVCAmIEQ6OlJFQUQpKTsKIAogICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0JJVF9SQVRFLCBDMl9QQVJBTUtFWV9CSVRSQVRFLCAidmFsdWUiKQotICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6T1VUUFVUKSk7CisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpDT0RFRCkpOworICAgIC8vIFNvbWUgYXVkaW8gZGVjb2RlcnMgcmVxdWlyZSBiaXRyYXRlIGluZm9ybWF0aW9uIHRvIGJlIHNldAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0JJVF9SQVRFLCBDMl9QQVJBTUtFWV9CSVRSQVRFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIgJiBEOjpDT0RFRCkpOwogICAgIC8vIHdlIGFsc28gbmVlZCB0byBwdXQgdGhlIGJpdHJhdGUgaW4gdGhlIG1heCBiaXRyYXRlIGZpZWxkCiAgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUFYX0JJVF9SQVRFLCBDMl9QQVJBTUtFWV9CSVRSQVRFLCAidmFsdWUiKQogICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6UkVBRCAmIEQ6Ok9VVFBVVCkpOwpAQCAtNDE1LDE5ICs0MjEsMzggQEAKICAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1tYXRyaXgiLCAgICAgICAgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTLCAgICJtYXRyaXgiKQogICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OkNPREVEICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNKSkpOwogCisgICAgLy8gcmVhZCBiYWNrIGRlZmF1bHQgZm9yIGRlY29kZXJzLiBUaGlzIGlzIG5lZWRlZCBpbiBjYXNlIHRoZSBjb21wb25lbnQgZG9lcyBub3Qgc3VwcG9ydAorICAgIC8vIGNvbG9yIGFzcGVjdHMuIEluIHRoYXQgY2FzZSwgdGhlc2UgdmFsdWVzIGdldCBjb3BpZWQgdG8gY29sb3ItKiBrZXlzLgorICAgIC8vIFRSSUNLWTogV2UgcmVhZCB0aGVzZSB2YWx1ZXMgYXQgcmF3IHBvcnQsIHNpbmNlIHRoYXQncyB3aGVyZSB3ZSB3YW50IHRvIHJlYWQgdGhlc2UuCisgICAgYWRkKENvbmZpZ01hcHBlcigiZGVmYXVsdC1jb2xvci1yYW5nZSIsICAgICBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMsICAgInJhbmdlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcgJiBEOjpSRUFEKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjpyYW5nZV90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJkZWZhdWx0LWNvbG9yLXRyYW5zZmVyIiwgIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUywgICAidHJhbnNmZXIiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OlJBVyAmIEQ6OlJFQUQpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnRyYW5zZmVyX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoImRlZmF1bHQtY29sb3ItcHJpbWFyaWVzIiwgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTLCAgICJwcmltYXJpZXMiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OlJBVyAmIEQ6OlJFQUQpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJkZWZhdWx0LWNvbG9yLW1hdHJpeCIsICAgIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUywgICAibWF0cml4IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcgJiBEOjpSRUFEKSk7CisKICAgICAvLyByZWFkIGJhY2sgZmluYWwgZm9yIGRlY29kZXIgb3V0cHV0IChhbHNvLCBjb25maWd1cmUgZmluYWwgYXNwZWN0cyBhcyB3ZWxsLiBUaGlzIHNob3VsZCBiZQogICAgIC8vIG92ZXJ3cml0dGVuIGJhc2VkIG9uIGNvZGVkL2RlZmF1bHQgdmFsdWVzIGlmIGNvbXBvbmVudCBzdXBwb3J0cyBjb2xvciBhc3BlY3RzLCBidXQgaXMgdXNlZAogICAgIC8vIGFzIGZpbmFsIHZhbHVlcyBpZiBjb21wb25lbnQgZG9lcyBub3Qgc3VwcG9ydCBhc3BlY3RzIGF0IGFsbCkKICAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9SQU5HRSwgICAgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAicmFuZ2UiKQotICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OlJBVykKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcgJiBEOjpSRUFEKQogICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjpyYW5nZV90PigpKTsKICAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAidHJhbnNmZXIiKQotICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OlJBVykKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcgJiBEOjpSRUFEKQogICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjp0cmFuc2Zlcl90PigpKTsKICAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1wcmltYXJpZXMiLCAgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAicHJpbWFyaWVzIikKLSAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcpKTsKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcgJiBEOjpSRUFEKSk7CiAgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItbWF0cml4IiwgICAgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgIm1hdHJpeCIpCi0gICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXKSk7CisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXICYgRDo6UkVBRCkpOworCisgICAgLy8gY29uZmlndXJlIHRyYW5zZmVyIHJlcXVlc3QKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci10cmFuc2Zlci1yZXF1ZXN0IiwgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgInRyYW5zZmVyIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcgJiBEOjpDT05GSUcpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnRyYW5zZmVyX3Q+KCkpOwogCiAgICAgLy8gY29uZmlndXJlIHNvdXJjZSBhc3BlY3RzIGZvciBlbmNvZGVycyBhbmQgcmVhZCB0aGVtIGJhY2sgb24gdGhlIGNvZGVkKCEpIHBvcnQuCiAgICAgLy8gVGhpcyBpcyB0byBlbnN1cmUgbXV4aW5nIHRoZSBkZXNpcmVkIGFzcGVjdHMgaW50byB0aGUgY29udGFpbmVyLgpAQCAtNDg4LDcgKzUxMyw3IEBACiAgICAgYWRkKENvbmZpZ01hcHBlcihzdGQ6OnN0cmluZyhLRVlfRkVBVFVSRV8pICsgRkVBVFVSRV9TZWN1cmVQbGF5YmFjaywKICAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1NFQ1VSRV9NT0RFLCAidmFsdWUiKSk7CiAKLSAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9QUkVQRU5EX0hFQURFUlNfVE9fU1lOQ19GUkFNRVMsCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUFJFUEVORF9IRUFERVJfVE9fU1lOQ19GUkFNRVMsCiAgICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9QUkVQRU5EX0hFQURFUl9NT0RFLCAidmFsdWUiKQogICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6VklERU8pCiAgICAgICAgIC53aXRoTWFwcGVycyhbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgewpAQCAtNTEyLDcgKzUzNyw3IEBACiAgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOwogICAgICAgICB9KSk7CiAgICAgLy8gcmVtb3ZlIHdoZW4gY29kZWNzIHN3aXRjaCB0byBQQVJBTUtFWQotICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKEtFWV9QUkVQRU5EX0hFQURFUlNfVE9fU1lOQ19GUkFNRVMsCisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoS0VZX1BSRVBFTkRfSEVBREVSX1RPX1NZTkNfRlJBTUVTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2RpbmcuYWRkLWNzZC10by1zeW5jLWZyYW1lcyIsICJ2YWx1ZSIpCiAgICAgICAgICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6VklERU8pKTsKICAgICAvLyBjb252ZXJ0IHRvIHRpbWVzdGFtcCBiYXNlCkBAIC03MDgsNiArNzMzLDE3IEBACiAgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOwogICAgICAgICB9KSk7CiAKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfUFJPRklMRSwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCwgInByb2ZpbGUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkVOQ09ERVIgJiAoRDo6Q09ORklHIHwgRDo6UEFSQU0pKQorICAgICAgICAud2l0aE1hcHBlcihbbWFwcGVyXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgQzJDb25maWc6OnByb2ZpbGVfdCBjMiA9IFBST0ZJTEVfVU5VU0VEOworICAgICAgICAgICAgaW50MzJfdCBzZGs7CisgICAgICAgICAgICBpZiAobWFwcGVyICYmIHYuZ2V0KCZzZGspICYmIG1hcHBlci0+bWFwUHJvZmlsZShzZGssICZjMikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gUFJPRklMRV9VTlVTRUQ7CisgICAgICAgIH0pKTsKKwogICAgIC8vIGNvbnZlcnQgdG8gZEJGUyBhbmQgYWRkIGRlZmF1bHQKICAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfRFJDX1RBUkdFVF9SRUZFUkVOQ0VfTEVWRUwsIEMyX1BBUkFNS0VZX0RSQ19UQVJHRVRfUkVGRVJFTkNFX0xFVkVMLCAidmFsdWUiKQogICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIgJiAoRDo6Q09ORklHIHwgRDo6UEFSQU0gfCBEOjpSRUFEKSkKQEAgLTc2NSwyMSArODAxLDEzIEBACiAKICAgICAvLyBjb252ZXJ0IHRvIGNvbXByZXNzaW9uIHR5cGUgYW5kIGFkZCBkZWZhdWx0CiAgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTiwgQzJfUEFSQU1LRVlfRFJDX0NPTVBSRVNTSU9OX01PREUsICJ2YWx1ZSIpCi0gICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUiAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSB8IEQ6OlJFQUQpKQotICAgICAgICAud2l0aE1hcHBlcnMoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNKSkKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKICAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CiAgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7CiAgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlksIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09IDEgPyBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZIDogQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9MSUdIVDsKLSAgICAgICAgfSxbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgewotICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKLSAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpKSB7Ci0gICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOwotICAgICAgICAgICAgfQogICAgICAgICB9KSk7CiAKICAgICAvLyBjb252ZXJ0IHRvIGRCRlMgYW5kIGFkZCBkZWZhdWx0CkBAIC0xMDA5LDExICsxMDM3LDE0IEBACiAgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbVBpeGVsQXNwZWN0UmF0aW9JbmZvOjpvdXRwdXQoMHUsIDF1LCAxdSksCiAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1BJWEVMX0FTUEVDVF9SQVRJTyk7CiAgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKG5ldyBDMlN0cmVhbVJvdGF0aW9uSW5mbzo6b3V0cHV0KDB1LCAwKSwgQzJfUEFSQU1LRVlfUk9UQVRJT04pOwotICAgICAgICAgICAgYWRkTG9jYWxQYXJhbShuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQoMHUpLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW0oCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0KDB1KSwKKyAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTKTsKICAgICAgICAgICAgIGFkZExvY2FsUGFyYW08QzJTdHJlYW1EYXRhU3BhY2VJbmZvOjpvdXRwdXQ+KEMyX1BBUkFNS0VZX0RBVEFfU1BBQ0UpOwogICAgICAgICAgICAgYWRkTG9jYWxQYXJhbTxDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dD4oQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPKTsKLSAgICAgICAgICAgIGFkZExvY2FsUGFyYW0obmV3IEMyU3RyZWFtU3VyZmFjZVNjYWxpbmdJbmZvOjpvdXRwdXQoMHUsIFZJREVPX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19GSVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9TVVJGQUNFX1NDQUxJTkdfTU9ERSk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dCgwdSwgVklERU9fU0NBTElOR19NT0RFX1NDQUxFX1RPX0ZJVCksCisgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1NVUkZBQ0VfU0NBTElOR19NT0RFKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGFkZExvY2FsUGFyYW0obmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQoMHUpLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKTsKICAgICAgICAgfQpAQCAtMTA0NSw3ICsxMDc2LDcgQEAKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBrZXlzOwogICAgICAgICAgICAgbVBhcmFtVXBkYXRlci0+Z2V0S2V5c0ZvclBhcmFtSW5kZXgoZGVzYy0+aW5kZXgoKSwgJmtleXMpOwogICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAma2V5IDoga2V5cykgewotICAgICAgICAgICAgICAgIG1WZW5kb3JQYXJhbUluZGljZXMuaW5zZXJ0X29yX2Fzc2lnbihrZXksIGRlc2MtPmluZGV4KCkpOworICAgICAgICAgICAgICAgIG1WZW5kb3JQYXJhbXMuaW5zZXJ0X29yX2Fzc2lnbihrZXksIGRlc2MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTExMiw2ICsxMTQzLDEyIEBACiAgICAgICAgICAgICBpbnNlcnRpb24uZmlyc3QtPnNlY29uZCA9IHN0ZDo6bW92ZShwKTsKICAgICAgICAgfQogICAgIH0KKyAgICBpZiAobUlucHV0U3VyZmFjZQorICAgICAgICAgICAgJiYgKGRvbWFpbiAmIG1PdXRwdXREb21haW4pCisgICAgICAgICAgICAmJiBtSW5wdXRTdXJmYWNlRGF0YXNwYWNlICE9IG1JbnB1dFN1cmZhY2UtPmdldERhdGFzcGFjZSgpKSB7CisgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICBtSW5wdXRTdXJmYWNlRGF0YXNwYWNlID0gbUlucHV0U3VyZmFjZS0+Z2V0RGF0YXNwYWNlKCk7CisgICAgfQogCiAgICAgQUxPR1YoInVwZGF0ZWQgY29uZmlndXJhdGlvbiBoYXMgJXp1IHBhcmFtcyAoJXMpIiwgbUN1cnJlbnRDb25maWcuc2l6ZSgpLAogICAgICAgICAgICAgY2hhbmdlZCA/ICJDSEFOR0VEIiA6ICJubyBjaGFuZ2UiKTsKQEAgLTExODAsOCArMTIxNyw4IEBACiAgICAgICAgIGNvbnN0IFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCAmcmVmbGVjdGVkLAogICAgICAgICBEb21haW4gcG9ydERvbWFpbikgY29uc3QgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgZm9yIChjb25zdCBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4+ICZlbCA6IG1TdGFuZGFyZFBhcmFtcy0+Z2V0S2V5cygpKSB7Ci0gICAgICAgIGZvciAoY29uc3QgQ29uZmlnTWFwcGVyICZjbSA6IGVsLnNlY29uZCkgeworICAgIGZvciAoY29uc3QgYXV0byAmW2tleSwgbWFwcGVyc10gOiBtU3RhbmRhcmRQYXJhbXMtPmdldEtleXMoKSkgeworICAgICAgICBmb3IgKGNvbnN0IENvbmZpZ01hcHBlciAmY20gOiBtYXBwZXJzKSB7CiAgICAgICAgICAgICBpZiAoKGNtLmRvbWFpbigpICYgcG9ydERvbWFpbikgPT0gMCAvLyBpbnB1dC1vdXRwdXQtY29kZWQtcmF3CiAgICAgICAgICAgICAgICAgfHwgKGNtLmRvbWFpbigpICYgbURvbWFpbikgIT0gbURvbWFpbiAvLyBjb21wb25lbnQgZG9tYWluICsga2luZCAodGhlc2UgbXVzdCBtYXRjaCkKICAgICAgICAgICAgICAgICB8fCAoY20uZG9tYWluKCkgJiBJU19SRUFEKSA9PSAwKSB7CkBAIC0xMjA1LDI2ICsxMjQyLDI2IEBACiAgICAgICAgICAgICAgICAgQUxPR0QoInVuZXhwZWN0ZWQgdW50eXBlZCBxdWVyeSB2YWx1ZSBmb3Iga2V5OiAlcyIsIGNtLnBhdGgoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1zZy0+c2V0SXRlbShlbC5maXJzdC5jX3N0cigpLCBpdGVtKTsKKyAgICAgICAgICAgIG1zZy0+c2V0SXRlbShrZXkuY19zdHIoKSwgaXRlbSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBib29sIGlucHV0ID0gKHBvcnREb21haW4gJiBEb21haW46OklTX0lOUFVUKTsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdmVuZG9yS2V5czsKLSAgICBmb3IgKGNvbnN0IHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpWYWx1ZT4gJmVudHJ5IDogcmVmbGVjdGVkKSB7Ci0gICAgICAgIGF1dG8gaXQgPSBtVmVuZG9yUGFyYW1JbmRpY2VzLmZpbmQoZW50cnkuZmlyc3QpOwotICAgICAgICBpZiAoaXQgPT0gbVZlbmRvclBhcmFtSW5kaWNlcy5lbmQoKSkgeworICAgIGZvciAoY29uc3QgYXV0byAmW2tleSwgdmFsdWVdIDogcmVmbGVjdGVkKSB7CisgICAgICAgIGF1dG8gaXQgPSBtVmVuZG9yUGFyYW1zLmZpbmQoa2V5KTsKKyAgICAgICAgaWYgKGl0ID09IG1WZW5kb3JQYXJhbXMuZW5kKCkpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtU3Vic2NyaWJlZEluZGljZXMuY291bnQoaXQtPnNlY29uZCkgPT0gMCkgeworICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleCA9IGl0LT5zZWNvbmQtPmluZGV4KCk7CisgICAgICAgIGlmIChtU3Vic2NyaWJlZEluZGljZXMuY291bnQoaW5kZXgpID09IDApIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIC8vIEZvciB2ZW5kb3IgcGFyYW1ldGVycywgd2Ugb25seSBjYXJlIGFib3V0IGRpcmVjdGlvbgotICAgICAgICBpZiAoKGlucHV0ICYmICFpdC0+c2Vjb25kLmZvcklucHV0KCkpCi0gICAgICAgICAgICAgICAgfHwgKCFpbnB1dCAmJiAhaXQtPnNlY29uZC5mb3JPdXRwdXQoKSkpIHsKKyAgICAgICAgaWYgKChpbnB1dCAmJiAhaW5kZXguZm9ySW5wdXQoKSkKKyAgICAgICAgICAgICAgICB8fCAoIWlucHV0ICYmICFpbmRleC5mb3JPdXRwdXQoKSkpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIGNvbnN0IFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6VmFsdWUgJnZhbHVlID0gZW50cnkuc2Vjb25kOwogICAgICAgICBDMlZhbHVlIGMyVmFsdWU7CiAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZlZhbHVlOwogICAgICAgICBBU3RyaW5nIHN0clZhbHVlOwpAQCAtMTIzNiwxMCArMTI3MywxMCBAQAogICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmZpbmQoJnN0clZhbHVlKSkgewogICAgICAgICAgICAgaXRlbS5zZXQoc3RyVmFsdWUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0QoInVuZXhwZWN0ZWQgdW50eXBlZCBxdWVyeSB2YWx1ZSBmb3Iga2V5OiAlcyIsIGVudHJ5LmZpcnN0LmNfc3RyKCkpOworICAgICAgICAgICAgQUxPR0QoInVuZXhwZWN0ZWQgdW50eXBlZCBxdWVyeSB2YWx1ZSBmb3Iga2V5OiAlcyIsIGtleS5jX3N0cigpKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIG1zZy0+c2V0SXRlbShlbnRyeS5maXJzdC5jX3N0cigpLCBpdGVtKTsKKyAgICAgICAgbXNnLT5zZXRJdGVtKGtleS5jX3N0cigpLCBpdGVtKTsKICAgICB9CiAKICAgICB7IC8vIGNvbnZlcnQgZnJvbSBDb2RlYyAyLjAgcmVjdCB0byBNZWRpYUZvcm1hdCByZWN0IGFuZCBhZGQgY3JvcCByZWN0IGlmIG5vdCBwcmVzZW50CkBAIC0xMjk5LDkgKzEzMzYsNDYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIFJlbW92ZSBLRVlfQUFDX1NCUl9NT0RFIGZyb20gU0RLIG1lc3NhZ2UgaWYgaXQgaXMgb3V0c2lkZSBzdXBwb3J0ZWQgcmFuZ2UKKyAgICAvLyBhcyBTREsgZG9lc24ndCBoYXZlIGEgd2F5IHRvIHNpZ25hbCBkZWZhdWx0IHNiciBtb2RlIGJhc2VkIG9uIHByb2ZpbGUgYW5kCisgICAgLy8gcmVxdWlyZXMgdGhhdCB0aGUga2V5IGlzbid0IHByZXNlbnQgaW4gZm9ybWF0IHRvIHNpZ25hbCB0aGF0CisgICAgaW50IHNick1vZGU7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKEtFWV9BQUNfU0JSX01PREUsICZzYnJNb2RlKSAmJiAoc2JyTW9kZSA8IDAgfHwgc2JyTW9kZSA+IDIpKSB7CisgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZShLRVlfQUFDX1NCUl9NT0RFKSk7CisgICAgfQorCiAgICAgeyAvLyBjb252ZXJ0IGNvbG9yIGluZm8KKyAgICAgICAgLy8gbW92ZSBkZWZhdWx0IGNvbG9yIHRvIGNvbG9yIGFzcGVjdCBpZiBub3QgcmVhZCBmcm9tIHRoZSBjb21wb25lbnQKKyAgICAgICAgaW50MzJfdCB0bXA7CisgICAgICAgIGludDMyX3QgcmFuZ2U7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZGVmYXVsdC1jb2xvci1yYW5nZSIsICZyYW5nZSkpIHsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX0NPTE9SX1JBTkdFLCAmdG1wKSkgeworICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoS0VZX0NPTE9SX1JBTkdFLCByYW5nZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImRlZmF1bHQtY29sb3ItcmFuZ2UiKSk7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCB0cmFuc2ZlcjsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJkZWZhdWx0LWNvbG9yLXRyYW5zZmVyIiwgJnRyYW5zZmVyKSkgeworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfQ09MT1JfVFJBTlNGRVIsICZ0bXApKSB7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihLRVlfQ09MT1JfVFJBTlNGRVIsIHRyYW5zZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiZGVmYXVsdC1jb2xvci10cmFuc2ZlciIpKTsKKyAgICAgICAgfQogICAgICAgICBDMkNvbG9yOjpwcmltYXJpZXNfdCBwcmltYXJpZXM7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZGVmYXVsdC1jb2xvci1wcmltYXJpZXMiLCAoaW50MzJfdCopJnByaW1hcmllcykpIHsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImNvbG9yLXByaW1hcmllcyIsICZ0bXApKSB7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiY29sb3ItcHJpbWFyaWVzIiwgcHJpbWFyaWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiZGVmYXVsdC1jb2xvci1wcmltYXJpZXMiKSk7CisgICAgICAgIH0KICAgICAgICAgQzJDb2xvcjo6bWF0cml4X3QgbWF0cml4OworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImRlZmF1bHQtY29sb3ItbWF0cml4IiwgKGludDMyX3QqKSZtYXRyaXgpKSB7CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJjb2xvci1tYXRyaXgiLCAmdG1wKSkgeworICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImNvbG9yLW1hdHJpeCIsIG1hdHJpeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImRlZmF1bHQtY29sb3ItbWF0cml4IikpOworICAgICAgICB9CisKICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjb2xvci1wcmltYXJpZXMiLCAoaW50MzJfdCopJnByaW1hcmllcykKICAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiY29sb3ItbWF0cml4IiwgKGludDMyX3QqKSZtYXRyaXgpKSB7CiAgICAgICAgICAgICBpbnQzMl90IHN0YW5kYXJkOwpAQCAtMTMxNCw3ICsxMzg4LDYgQEAKICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY29sb3ItbWF0cml4IikpOwogICAgICAgICB9CiAKLQogICAgICAgICAvLyBjYWxjdWxhdGUgZGF0YXNwYWNlIGZvciByYXcgZ3JhcGhpYyBidWZmZXJzIGlmIG5vdCBzcGVjaWZpZWQgYnkgY29tcG9uZW50LCBvciBpZgogICAgICAgICAvLyB1c2luZyBzdXJmYWNlIHdpdGggdW5zcGVjaWZpZWQgYXNwZWN0cyAoYXMgdGhvc2UgbXVzdCBiZSBkZWZhdWx0ZWQgd2hpY2ggbWF5IGNoYW5nZQogICAgICAgICAvLyB0aGUgZGF0YXNwYWNlKQpAQCAtMTM1Miw2ICsxNDI1LDIzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobUlucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YXNwYWNlID0gbUlucHV0U3VyZmFjZS0+Z2V0RGF0YXNwYWNlKCk7CisgICAgICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0RGF0YVNwYWNlVG9WMChkYXRhc3BhY2UpOworICAgICAgICAgICAgaW50MzJfdCBzdGFuZGFyZDsKKyAgICAgICAgICAgIENvbG9yVXRpbHM6OmdldENvbG9yQ29uZmlnRnJvbURhdGFTcGFjZShkYXRhc3BhY2UsICZyYW5nZSwgJnN0YW5kYXJkLCAmdHJhbnNmZXIpOworICAgICAgICAgICAgaWYgKHJhbmdlICE9IDApIHsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKEtFWV9DT0xPUl9SQU5HRSwgcmFuZ2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YW5kYXJkICE9IDApIHsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKEtFWV9DT0xPUl9TVEFOREFSRCwgc3RhbmRhcmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyYW5zZmVyICE9IDApIHsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgdHJhbnNmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYW5kcm9pZC5fZGF0YXNwYWNlIiwgZGF0YXNwYWNlKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIEhEUiBzdGF0aWMgaW5mbwogCiAgICAgICAgIEMySGRyU3RhdGljTWV0YWRhdGFTdHJ1Y3QgaGRyOwpAQCAtMTM5MywyMiArMTQ4MywyMiBAQAogICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1NaW5EaXNwbGF5THVtaW5hbmNlID0gaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UgLyAwLjAwMDEgKyAwLjU7CiAgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubU1heENvbnRlbnRMaWdodExldmVsID0gaGRyLm1heENsbCArIDAuNTsKICAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IGhkci5tYXhGYWxsICsgMC41OwotICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LnJlZC54IikpOwotICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LnJlZC55IikpOwotICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LmdyZWVuLngiKSk7Ci0gICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYuZ3JlZW4ueSIpKTsKLSAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5ibHVlLngiKSk7Ci0gICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYuYmx1ZS55IikpOwotICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LndoaXRlLngiKSk7Ci0gICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYud2hpdGUueSIpKTsKLSAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5tYXgtbHVtaW5hbmNlIikpOwotICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2Lm1pbi1sdW1pbmFuY2UiKSk7Ci0gICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjdGE4NjEubWF4LWNsbCIpKTsKLSAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImN0YTg2MS5tYXgtZmFsbCIpKTsKICAgICAgICAgICAgICAgICBtc2ctPnNldEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoJm1ldGEsIHNpemVvZihtZXRhKSkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBTE9HRCgiZm91bmQgaW52YWxpZCBIRFIgc3RhdGljIG1ldGFkYXRhICVzIiwgbXNnLT5kZWJ1Z1N0cmluZyg4KS5jX3N0cigpKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LnJlZC54IikpOworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYucmVkLnkiKSk7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5ncmVlbi54IikpOworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYuZ3JlZW4ueSIpKTsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LmJsdWUueCIpKTsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LmJsdWUueSIpKTsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LndoaXRlLngiKSk7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni53aGl0ZS55IikpOworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYubWF4LWx1bWluYW5jZSIpKTsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2Lm1pbi1sdW1pbmFuY2UiKSk7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImN0YTg2MS5tYXgtY2xsIikpOworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjdGE4NjEubWF4LWZhbGwiKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE2NDMsOCArMTczMyw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgQUxPR1YoImZpbHRlcmVkICVzIHRvICVzIiwgcGFyYW1zLT5kZWJ1Z1N0cmluZyg0KS5jX3N0cigpLAotICAgICAgICAgICAgZmlsdGVyZWQuZGVidWdTdHJpbmcoNCkuY19zdHIoKSk7CisgICAgQUxPR1YoImZpbHRlciBzcmMgbXNnICVzIiwgcGFyYW1zLT5kZWJ1Z1N0cmluZyg0KS5jX3N0cigpKTsKKyAgICBBTE9HVigiZmlsdGVyIGRzdCBwYXJhbXMgJXMiLCBmaWx0ZXJlZC5kZWJ1Z1N0cmluZyg0KS5jX3N0cigpKTsKICAgICByZXR1cm4gZmlsdGVyZWQ7CiB9CiAKQEAgLTE3NjksOCArMTg1OSw4MSBAQAogc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpzdWJzY3JpYmVUb0FsbFZlbmRvclBhcmFtcygKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlPiAmY29uZmlndXJhYmxlLAogICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nKSB7Ci0gICAgZm9yIChjb25zdCBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIEMyUGFyYW06OkluZGV4PiAmZW50cnkgOiBtVmVuZG9yUGFyYW1JbmRpY2VzKSB7Ci0gICAgICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5pbnNlcnQoZW50cnkuc2Vjb25kKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJltwYXRoLCBkZXNjXSA6IG1WZW5kb3JQYXJhbXMpIHsKKyAgICAgICAgbVN1YnNjcmliZWRJbmRpY2VzLmluc2VydChkZXNjLT5pbmRleCgpKTsKKyAgICB9CisgICAgcmV0dXJuIHN1YnNjcmliZVRvQ29uZmlnVXBkYXRlKGNvbmZpZ3VyYWJsZSwge30sIGJsb2NraW5nKTsKK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpxdWVyeVN1cHBvcnRlZFBhcmFtZXRlcnMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICpuYW1lcykgeworICAgIGlmICghbmFtZXMpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbmFtZXMtPmNsZWFyKCk7CisgICAgLy8gVE9ETzogZXhwYW5kIHRvIHN0YW5kYXJkIHBhcmFtcworICAgIGZvciAoY29uc3QgYXV0byAmW2tleSwgZGVzY10gOiBtVmVuZG9yUGFyYW1zKSB7CisgICAgICAgIG5hbWVzLT5wdXNoX2JhY2soa2V5KTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OmRlc2NyaWJlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBDb2RlY1BhcmFtZXRlckRlc2NyaXB0b3IgKmRlc2MpIHsKKyAgICBpZiAoIWRlc2MpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgLy8gVE9ETzogZXhwYW5kIHRvIHN0YW5kYXJkIHBhcmFtcworICAgIGRlc2MtPm5hbWUgPSBuYW1lOworICAgIHN3aXRjaCAobVBhcmFtVXBkYXRlci0+Z2V0VHlwZUZvcktleShuYW1lKSkgeworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjoKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOgorICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSMzI6CisgICAgICAgICAgICBkZXNjLT50eXBlID0gQU1lc3NhZ2U6OmtUeXBlSW50MzI7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OgorICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UNjQ6CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFI2NDoKKyAgICAgICAgICAgIGRlc2MtPnR5cGUgPSBBTWVzc2FnZTo6a1R5cGVJbnQ2NDsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6CisgICAgICAgICAgICBkZXNjLT50eXBlID0gQU1lc3NhZ2U6OmtUeXBlRmxvYXQ7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlNUUklORzoKKyAgICAgICAgICAgIGRlc2MtPnR5cGUgPSBBTWVzc2FnZTo6a1R5cGVTdHJpbmc7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6CisgICAgICAgICAgICBkZXNjLT50eXBlID0gQU1lc3NhZ2U6OmtUeXBlQnVmZmVyOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIH0KK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpzdWJzY3JpYmVUb1ZlbmRvckNvbmZpZ1VwZGF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlPiAmY29uZmlndXJhYmxlLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5hbWVzLAorICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nKSB7CisgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSA6IG5hbWVzKSB7CisgICAgICAgIGF1dG8gaXQgPSBtVmVuZG9yUGFyYW1zLmZpbmQobmFtZSk7CisgICAgICAgIGlmIChpdCA9PSBtVmVuZG9yUGFyYW1zLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRCgiJXMgaXMgbm90IGEgcmVjb2duaXplZCB2ZW5kb3IgcGFyYW1ldGVyOyBpZ25vcmVkLiIsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtU3Vic2NyaWJlZEluZGljZXMuaW5zZXJ0KGl0LT5zZWNvbmQtPmluZGV4KCkpOworICAgIH0KKyAgICByZXR1cm4gc3Vic2NyaWJlVG9Db25maWdVcGRhdGUoY29uZmlndXJhYmxlLCB7fSwgYmxvY2tpbmcpOworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OnVuc3Vic2NyaWJlRnJvbVZlbmRvckNvbmZpZ1VwZGF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlPiAmY29uZmlndXJhYmxlLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5hbWVzLAorICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nKSB7CisgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSA6IG5hbWVzKSB7CisgICAgICAgIGF1dG8gaXQgPSBtVmVuZG9yUGFyYW1zLmZpbmQobmFtZSk7CisgICAgICAgIGlmIChpdCA9PSBtVmVuZG9yUGFyYW1zLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRCgiJXMgaXMgbm90IGEgcmVjb2duaXplZCB2ZW5kb3IgcGFyYW1ldGVyOyBpZ25vcmVkLiIsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtU3Vic2NyaWJlZEluZGljZXMuZXJhc2UoaXQtPnNlY29uZC0+aW5kZXgoKSk7CiAgICAgfQogICAgIHJldHVybiBzdWJzY3JpYmVUb0NvbmZpZ1VwZGF0ZShjb25maWd1cmFibGUsIHt9LCBibG9ja2luZyk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmgKaW5kZXggMjg5NTc0Ni4uNDE3Yjc3MyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5oCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuaApAQCAtMzUsNiArMzUsOCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7CitzdHJ1Y3QgQ29kZWNQYXJhbWV0ZXJEZXNjcmlwdG9yOworY2xhc3MgTmF0aXZlSGFuZGxlOwogc3RydWN0IFN0YW5kYXJkUGFyYW1zOwogCiAvKioKQEAgLTEyMyw2ICsxMjUsNyBAQAogCiAgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+IG1JbnB1dFN1cmZhY2U7CiAgICAgc3RkOjp1bmlxdWVfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI6OkNvbmZpZz4gbUlTQ29uZmlnOworICAgIGFuZHJvaWRfZGF0YXNwYWNlIG1JbnB1dFN1cmZhY2VEYXRhc3BhY2U7CiAKICAgICAvLy8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gVXBkYXRlZCBhZnRlciBjb25maWd1cmUoKSBhbmQgYmFzZWQgb24gY29uZmlnVXBkYXRlIGluCiAgICAgLy8vIG9uV29ya0RvbmUKQEAgLTEzNiwxMSArMTM5LDE1IEBACiAgICAgLy8vIEZvciBub3cgc3VwcG9ydCBhIHZhbGlkYXRpb24gZnVuY3Rpb24uCiAgICAgc3RkOjptYXA8QzJQYXJhbTo6SW5kZXgsIExvY2FsUGFyYW1WYWxpZGF0b3I+IG1Mb2NhbFBhcmFtczsKIAotICAgIC8vLyBWZW5kb3IgZmllbGQgbmFtZSAtPiBpbmRleCBtYXAuCi0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEMyUGFyYW06OkluZGV4PiBtVmVuZG9yUGFyYW1JbmRpY2VzOworICAgIC8vLyBWZW5kb3IgZmllbGQgbmFtZSAtPiBkZXNjIG1hcC4KKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gbVZlbmRvclBhcmFtczsKIAogICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBtTGFzdENvbmZpZzsKIAorICAgIC8vLyBUdW5uZWxlZCBjb2RlY3MKKyAgICBib29sIG1UdW5uZWxlZDsKKyAgICBzcDxOYXRpdmVIYW5kbGU+IG1TaWRlYmFuZEhhbmRsZTsKKwogICAgIENDb2RlY0NvbmZpZygpOwogCiAgICAgLy8vIGluaXRpYWxpemVzIHRoZSBtZW1iZXJzIHJlcXVpcmVkIHRvIG1hbmFnZSB0aGUgZm9ybWF0OiBkZXNjcmlwdG9ycywgcmVmbGVjdG9yLApAQCAtMzIxLDYgKzMyOCw0MSBAQAogICAgICAgICByZXR1cm4gV2F0Y2hlcjxUPihpbmRleCwgdGhpcyk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUXVlcmllcyBzdXBwb3J0ZWQgcGFyYW1ldGVycyBhbmQgcHV0IHRoZSBrZXlzIHRvIHxuYW1lc3wuCisgICAgICogVE9ETzogY3VycmVudGx5IHRoaXMgbWV0aG9kIHF1ZXJpZXMgdmVuZG9yIHBhcmFtZXRlciBrZXlzIG9ubHkuCisgICAgICoKKyAgICAgKiBccmV0dXJuIE9LIGlmIHN1Y2Nlc3NmdWwuCisgICAgICogICAgICAgICBCQURfVkFMVUUgaWYgfG5hbWVzfCBpcyBudWxscHRyLgorICAgICAqLworICAgIHN0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1ldGVycyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gKm5hbWVzKTsKKworICAgIC8qKgorICAgICAqIERlc2NyaWJlIHRoZSBwYXJhbWV0ZXIgd2l0aCB8bmFtZXwsIGZpbGxpbmcgdGhlIGluZm9ybWF0aW9uIGludG8gfGRlc2N8CisgICAgICogVE9ETzogY3VycmVudGx5IHRoaXMgbWV0aG9kIHdvcmtzIG9ubHkgZm9yIHZlbmRvciBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogXHJldHVybiBPSyBpZiBzdWNjZXNzZnVsLgorICAgICAqICAgICAgICAgQkFEX1ZBTFVFIGlmIHxkZXNjfCBpcyBudWxscHRyLgorICAgICAqICAgICAgICAgTkFNRV9OT1RfRk9VTkQgaWYgfG5hbWV8IGlzIG5vdCBhIHJlY29nbml6ZWQgcGFyYW1ldGVyIG5hbWUuCisgICAgICovCisgICAgc3RhdHVzX3QgZGVzY3JpYmUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIENvZGVjUGFyYW1ldGVyRGVzY3JpcHRvciAqZGVzYyk7CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGNvcnJlc3BvbmRpbmcgaW5kaWNlcyBmb3IgfG5hbWVzfCBhbmQgc3Vic2NyaWJlIHRvIHRoZW0uCisgICAgICovCisgICAgc3RhdHVzX3Qgc3Vic2NyaWJlVG9WZW5kb3JDb25maWdVcGRhdGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb25maWd1cmFibGU+ICZjb25maWd1cmFibGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5hbWVzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZyA9IEMyX0RPTlRfQkxPQ0spOworCisgICAgLyoqCisgICAgICogRmluZCBjb3JyZXNwb25kaW5nIGluZGljZXMgZm9yIHxuYW1lc3wgYW5kIHVuc3Vic2NyaWJlIGZyb20gdGhlbS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCB1bnN1YnNjcmliZUZyb21WZW5kb3JDb25maWdVcGRhdGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb25maWd1cmFibGU+ICZjb25maWd1cmFibGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5hbWVzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZyA9IEMyX0RPTlRfQkxPQ0spOworCiBwcml2YXRlOgogCiAgICAgLy8vIGluaXRpYWxpemVzIHRoZSBzdGFuZGFyZCBNZWRpYUNvZGVjIHRvIENvZGVjIDIuMCBwYXJhbXMgbWFwcGluZwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmNwcAppbmRleCAyNWU3ZGE5Li5mYzRlZTUxIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmNwcApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJDb2RlYzJCdWZmZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvdHlwZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KICNpbmNsdWRlIDxoaWRsbWVtb3J5L0ZyYW1ld29ya1V0aWxzLmg+CkBAIC0yMTEsMjEgKzIxMiwyNCBAQAogICAgICAqIENyZWF0ZXMgYSBDMkdyYXBoaWNWaWV3IDw9PiBNZWRpYUltYWdlIGNvbnZlcnRlcgogICAgICAqCiAgICAgICogXHBhcmFtIHZpZXcgQzJHcmFwaGljVmlldyBvYmplY3QKLSAgICAgKiBccGFyYW0gY29sb3JGb3JtYXQgZGVzaXJlZCBTREsgY29sb3IgZm9ybWF0IGZvciB0aGUgTWVkaWFJbWFnZSAoaWYgdGhpcyBpcyBhIGZsZXhpYmxlIGZvcm1hdCwKLSAgICAgKiAgICAgICAgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHNpbXBseSByZXByZXNlbnQgdGhlIGdyYXBoaWMgdmlldyBhcyBhIGZsZXhpYmxlIFNESyBmb3JtYXQKLSAgICAgKiAgICAgICAgd2l0aG91dCBhIG1lbWNweSkKKyAgICAgKiBccGFyYW0gZm9ybWF0IGJ1ZmZlciBmb3JtYXQKICAgICAgKiBccGFyYW0gY29weSB3aGV0aGVyIHRoZSBjb252ZXJ0ZXIgaXMgdXNlZCBmb3IgY29weSBvciBub3QKICAgICAgKi8KICAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyKAotICAgICAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAmdmlldywgaW50MzJfdCBjb2xvckZvcm1hdCwgYm9vbCBjb3B5KQorICAgICAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAmdmlldywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGJvb2wgY29weSkKICAgICAgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgICAgIG1WaWV3KHZpZXcpLAogICAgICAgICAgIG1XaWR0aCh2aWV3LndpZHRoKCkpLAogICAgICAgICAgIG1IZWlnaHQodmlldy5oZWlnaHQoKSksCi0gICAgICAgICAgbUNvbG9yRm9ybWF0KGNvbG9yRm9ybWF0KSwKICAgICAgICAgICBtQWxsb2NhdGVkRGVwdGgoMCksCiAgICAgICAgICAgbUJhY2tCdWZmZXJTaXplKDApLAogICAgICAgICAgIG1NZWRpYUltYWdlKG5ldyBBQnVmZmVyKHNpemVvZihNZWRpYUltYWdlMikpKSB7CisgICAgICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoS0VZX0NPTE9SX0ZPUk1BVCwgJm1DbGllbnRDb2xvckZvcm1hdCkpIHsKKyAgICAgICAgICAgIG1DbGllbnRDb2xvckZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOworICAgICAgICB9CisgICAgICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoImFuZHJvaWQuX2NvbG9yLWZvcm1hdCIsICZtQ29tcG9uZW50Q29sb3JGb3JtYXQpKSB7CisgICAgICAgICAgICBtQ29tcG9uZW50Q29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKyAgICAgICAgfQogICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CiAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiB2aWV3LmVycm9yKCkgPSAlZCIsIHZpZXcuZXJyb3IoKSk7CiAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOwpAQCAtMjQ2LDY4ICsyNTAsNTcgQEAKICAgICAgICAgdWludDMyX3Qgc3RyaWRlID0gYWxpZ24odmlldy5jcm9wKCkud2lkdGgsIDIpICogZGl2VXAobGF5b3V0LnBsYW5lc1swXS5hbGxvY2F0ZWREZXB0aCwgOHUpOwogICAgICAgICB1aW50MzJfdCB2U3RyaWRlID0gYWxpZ24odmlldy5jcm9wKCkuaGVpZ2h0LCAyKTsKIAorICAgICAgICBib29sIHRyeVdyYXBwaW5nID0gIWNvcHk7CisKICAgICAgICAgc3dpdGNoIChsYXlvdXQudHlwZSkgewotICAgICAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY6CisgICAgICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVjogewogICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1UeXBlID0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfWVVWOwogICAgICAgICAgICAgICAgIGlmIChsYXlvdXQubnVtUGxhbmVzICE9IDMpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogJWQgcGxhbmVzIGZvciBZVVYgbGF5b3V0IiwgbGF5b3V0Lm51bVBsYW5lcyk7CiAgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxheW91dC5wbGFuZXNbMF0uY2hhbm5lbCAhPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9ZCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzFdLmNoYW5uZWwgIT0gQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMl0uY2hhbm5lbCAhPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUgotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1swXS5jb2xTYW1wbGluZyAhPSAxCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzBdLnJvd1NhbXBsaW5nICE9IDEKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMV0uY29sU2FtcGxpbmcgIT0gMgotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1sxXS5yb3dTYW1wbGluZyAhPSAyCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzJdLmNvbFNhbXBsaW5nICE9IDIKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMl0ucm93U2FtcGxpbmcgIT0gMikgewotICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiBub3QgWVVWNDIwIGZvciBZVVYgbGF5b3V0Iik7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm8geVBsYW5lID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm8gdVBsYW5lID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm8gdlBsYW5lID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisgICAgICAgICAgICAgICAgaWYgKHlQbGFuZS5jaGFubmVsICE9IEMyUGxhbmVJbmZvOjpDSEFOTkVMX1kKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHVQbGFuZS5jaGFubmVsICE9IEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NCCisgICAgICAgICAgICAgICAgICAgICAgICB8fCB2UGxhbmUuY2hhbm5lbCAhPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiBub3QgWVVWIGxheW91dCIpOwogICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN3aXRjaCAobUNvbG9yRm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvcHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gbWFwIGRpcmVjdGx5LiBjaGVjayBpZiB0aGUgcGxhbmVzIGFyZSBuZWFyIG9uZSBhbm90aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWluUHRyID0gbVZpZXcuZGF0YSgpWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm1heFB0ciA9IG1WaWV3LmRhdGEoKVswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBsYW5lU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxheW91dC5udW1QbGFuZXM7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBsYW5lSW5mbyAmcGxhbmUgPSBsYXlvdXQucGxhbmVzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG1pbk9mZnNldCA9IHBsYW5lLm1pbk9mZnNldChtV2lkdGgsIG1IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG1heE9mZnNldCA9IHBsYW5lLm1heE9mZnNldChtV2lkdGgsIG1IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWluUHRyID4gbVZpZXcuZGF0YSgpW2ldICsgbWluT2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5QdHIgPSBtVmlldy5kYXRhKClbaV0gKyBtaW5PZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heFB0ciA8IG1WaWV3LmRhdGEoKVtpXSArIG1heE9mZnNldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UHRyID0gbVZpZXcuZGF0YSgpW2ldICsgbWF4T2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lU2l6ZSArPSBzdGQ6OmFicyhwbGFuZS5yb3dJbmMpICogYWxpZ24obUhlaWdodCwgNjQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBwbGFuZS5yb3dTYW1wbGluZyAvIHBsYW5lLmNvbFNhbXBsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkaXZVcChtQWxsb2NhdGVkRGVwdGgsIDh1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1heFB0ciAtIG1pblB0ciArIDEpIDw9IHBsYW5lU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogdGhpcyBpcyByaXNreSBhcyByZWFkaW5nL3dyaXRpbmcgZGF0YSBvdXQgb2YgYm91bmQgcmVzdWx0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgaW4gYW4gdW5kZWZpbmVkIGJlaGF2aW9yLCBidXQgZ3JhbGxvYyBkb2VzIGFzc3VtZSBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICBjb250aWd1b3VzIG1hcHBpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxheW91dC5udW1QbGFuZXM7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQbGFuZUluZm8gJnBsYW5lID0gbGF5b3V0LnBsYW5lc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVtpXS5tT2Zmc2V0ID0gbVZpZXcuZGF0YSgpW2ldIC0gbWluUHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW2ldLm1Db2xJbmMgPSBwbGFuZS5jb2xJbmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbaV0ubVJvd0luYyA9IHBsYW5lLnJvd0luYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVtpXS5tSG9yaXpTdWJzYW1wbGluZyA9IHBsYW5lLmNvbFNhbXBsaW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW2ldLm1WZXJ0U3Vic2FtcGxpbmcgPSBwbGFuZS5yb3dTYW1wbGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV3JhcHBlZCA9IG5ldyBBQnVmZmVyKGNvbnN0X2Nhc3Q8dWludDhfdCAqPihtaW5QdHIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFB0ciAtIG1pblB0ciArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYm9vbCB5dXY0MjA4ODggPSB5UGxhbmUucm93U2FtcGxpbmcgPT0gMSAmJiB5UGxhbmUuY29sU2FtcGxpbmcgPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgdVBsYW5lLnJvd1NhbXBsaW5nID09IDIgJiYgdVBsYW5lLmNvbFNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHZQbGFuZS5yb3dTYW1wbGluZyA9PSAyICYmIHZQbGFuZS5jb2xTYW1wbGluZyA9PSAyOworICAgICAgICAgICAgICAgIGlmICh5dXY0MjA4ODgpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQbGFuZUluZm8gJnBsYW5lID0gbGF5b3V0LnBsYW5lc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGFuZS5hbGxvY2F0ZWREZXB0aCAhPSA4IHx8IHBsYW5lLmJpdERlcHRoICE9IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjA4ODggPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKLQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHl1djQyMDg4OCA9IHl1djQyMDg4OCAmJiB5UGxhbmUuY29sSW5jID09IDEgJiYgdVBsYW5lLnJvd0luYyA9PSB2UGxhbmUucm93SW5jOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQzMl90IGNvcHlGb3JtYXQgPSBtQ2xpZW50Q29sb3JGb3JtYXQ7CisgICAgICAgICAgICAgICAgaWYgKHl1djQyMDg4OCAmJiBtQ2xpZW50Q29sb3JGb3JtYXQgPT0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVQbGFuZS5jb2xJbmMgPT0gMiAmJiB2UGxhbmUuY29sSW5jID09IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB5UGxhbmUucm93SW5jID09IHVQbGFuZS5yb3dJbmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHVQbGFuZS5jb2xJbmMgPT0gMSAmJiB2UGxhbmUuY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB5UGxhbmUucm93SW5jID09IHVQbGFuZS5yb3dJbmMgKiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5Rm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnRfZm10PTB4JXggeTp7Y29sSW5jPSVkIHJvd0luYz0lZH0gdTp7Y29sSW5jPSVkIHJvd0luYz0lZH0gIgorICAgICAgICAgICAgICAgICAgICAgICAgInY6e2NvbEluYz0lZCByb3dJbmM9JWR9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRDb2xvckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHlQbGFuZS5jb2xJbmMsIHlQbGFuZS5yb3dJbmMsCisgICAgICAgICAgICAgICAgICAgICAgICB1UGxhbmUuY29sSW5jLCB1UGxhbmUucm93SW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgdlBsYW5lLmNvbEluYywgdlBsYW5lLnJvd0luYyk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjb3B5Rm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU6CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgogICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hcjoKICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5ZXS5tT2Zmc2V0ID0gMDsKQEAgLTMyNyw2ICszMjAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tUm93SW5jID0gc3RyaWRlIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cnlXcmFwcGluZyAmJiBtQ2xpZW50Q29sb3JGb3JtYXQgIT0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlXcmFwcGluZyA9IHl1djQyMDg4OCAmJiB1UGxhbmUuY29sSW5jID09IDEgJiYgdlBsYW5lLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB5UGxhbmUucm93SW5jID09IHVQbGFuZS5yb3dJbmMgKiAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB2aWV3LmRhdGEoKVswXSA8IHZpZXcuZGF0YSgpWzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB2aWV3LmRhdGEoKVsxXSA8IHZpZXcuZGF0YSgpWzJdOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgpAQCAtMzQ4LDY0ICszNDgsMTY1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVJvd0luYyA9IHN0cmlkZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cnlXcmFwcGluZyAmJiBtQ2xpZW50Q29sb3JGb3JtYXQgIT0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlXcmFwcGluZyA9IHl1djQyMDg4OCAmJiB1UGxhbmUuY29sSW5jID09IDIgJiYgdlBsYW5lLmNvbEluYyA9PSAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB5UGxhbmUucm93SW5jID09IHVQbGFuZS5yb3dJbmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHZpZXcuZGF0YSgpWzBdIDwgdmlldy5kYXRhKClbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHZpZXcuZGF0YSgpWzFdIDwgdmlldy5kYXRhKClbMl07CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogaW5jb21wYWN0aWJsZSBjb2xvciBmb3JtYXQgKCVkKSBmb3IgWVVWIGxheW91dCIsIG1Db2xvckZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVlAwMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubU9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUNvbEluYyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubVJvd0luYyA9IHN0cmlkZSAqIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUhvcml6U3Vic2FtcGxpbmcgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1WZXJ0U3Vic2FtcGxpbmcgPSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubU9mZnNldCA9IHN0cmlkZSAqIHZTdHJpZGUgKiAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Db2xJbmMgPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Sb3dJbmMgPSBzdHJpZGUgKiAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1PZmZzZXQgPSBzdHJpZGUgKiB2U3RyaWRlICogMiArIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubUNvbEluYyA9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVJvd0luYyA9IHN0cmlkZSAqIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubUhvcml6U3Vic2FtcGxpbmcgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1WZXJ0U3Vic2FtcGxpbmcgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyeVdyYXBwaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5V3JhcHBpbmcgPSB5UGxhbmUuYWxsb2NhdGVkRGVwdGggPT0gMTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHVQbGFuZS5hbGxvY2F0ZWREZXB0aCA9PSAxNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdlBsYW5lLmFsbG9jYXRlZERlcHRoID09IDE2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB5UGxhbmUuYml0RGVwdGggPT0gMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHVQbGFuZS5iaXREZXB0aCA9PSAxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdlBsYW5lLmJpdERlcHRoID09IDEwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB5UGxhbmUucmlnaHRTaGlmdCA9PSA2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB1UGxhbmUucmlnaHRTaGlmdCA9PSA2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB2UGxhbmUucmlnaHRTaGlmdCA9PSA2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB5UGxhbmUucm93U2FtcGxpbmcgPT0gMSAmJiB5UGxhbmUuY29sU2FtcGxpbmcgPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdVBsYW5lLnJvd1NhbXBsaW5nID09IDIgJiYgdVBsYW5lLmNvbFNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHZQbGFuZS5yb3dTYW1wbGluZyA9PSAyICYmIHZQbGFuZS5jb2xTYW1wbGluZyA9PSAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB5UGxhbmUuY29sSW5jID09IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHVQbGFuZS5jb2xJbmMgPT0gNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdlBsYW5lLmNvbEluYyA9PSA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB5UGxhbmUucm93SW5jID09IHVQbGFuZS5yb3dJbmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHlQbGFuZS5yb3dJbmMgPT0gdlBsYW5lLnJvd0luYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gZnVsbHkgcGxhbmFyIGZvcm1hdCAtLS0gdGhpcyB3aWxsIGJlIG92ZXJyaWRkZW4gaWYgd3JhcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGtlZXAgaW50ZXJsZWF2ZWQgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbEluYyA9IGRpdlVwKG1BbGxvY2F0ZWREZXB0aCwgOHUpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByb3dJbmMgPSBzdHJpZGUgKiBjb2xJbmMgLyB5UGxhbmUuY29sU2FtcGxpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubU9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUNvbEluYyA9IGNvbEluYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5ZXS5tUm93SW5jID0gcm93SW5jOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Ib3JpelN1YnNhbXBsaW5nID0geVBsYW5lLmNvbFNhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1WZXJ0U3Vic2FtcGxpbmcgPSB5UGxhbmUucm93U2FtcGxpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldCA9IHJvd0luYyAqIHZTdHJpZGUgLyB5UGxhbmUucm93U2FtcGxpbmc7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luYyA9IHN0cmlkZSAqIGNvbEluYyAvIHVQbGFuZS5jb2xTYW1wbGluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Db2xJbmMgPSBjb2xJbmM7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubVJvd0luYyA9IHJvd0luYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tSG9yaXpTdWJzYW1wbGluZyA9IHVQbGFuZS5jb2xTYW1wbGluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tVmVydFN1YnNhbXBsaW5nID0gdVBsYW5lLnJvd1NhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHJvd0luYyAqIHZTdHJpZGUgLyB1UGxhbmUucm93U2FtcGxpbmc7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luYyA9IHN0cmlkZSAqIGNvbEluYyAvIHZQbGFuZS5jb2xTYW1wbGluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1Db2xJbmMgPSBjb2xJbmM7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVJvd0luYyA9IHJvd0luYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tSG9yaXpTdWJzYW1wbGluZyA9IHZQbGFuZS5jb2xTYW1wbGluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tVmVydFN1YnNhbXBsaW5nID0gdlBsYW5lLnJvd1NhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQToKLSAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1lVVkE7Ci0gICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhbiBTREsgWVVWQSBmb3JtYXQKLSAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiBpbmNvbXBhY3RpYmxlIGNvbG9yIGZvcm1hdCAoJWQpIGZvciBZVVZBIGxheW91dCIsIG1Db2xvckZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiB1bnJlY29nbml6ZWQgY29sb3IgZm9ybWF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIoY2xpZW50ICVkIGNvbXBvbmVudCAlZCkgZm9yIFlVVkEgbGF5b3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRDb2xvckZvcm1hdCwgbUNvbXBvbmVudENvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjoKLSAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1JHQjsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1Db2xvckZvcm1hdCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIG1lZGlhIGltYWdlCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UkdCRmxleGlibGU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRCR1I4ODg6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRSR0I4ODg6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6IGluY29tcGFjdGlibGUgY29sb3IgZm9ybWF0ICglZCkgZm9yIFJHQiBsYXlvdXQiLCBtQ29sb3JGb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxheW91dC5udW1QbGFuZXMgIT0gMykgewotICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiAlZCBwbGFuZXMgZm9yIFJHQiBsYXlvdXQiLCBsYXlvdXQubnVtUGxhbmVzKTsKLSAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiB1bnJlY29nbml6ZWQgY29sb3IgZm9ybWF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIoY2xpZW50ICVkIGNvbXBvbmVudCAlZCkgZm9yIFJHQiBsYXlvdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudENvbG9yRm9ybWF0LCBtQ29tcG9uZW50Q29sb3JGb3JtYXQpOworICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBOT19JTklUOworICAgICAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgTWVkaWFJbWFnZSBsYXlvdXQKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQkE6Ci0gICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVR5cGUgPSBNZWRpYUltYWdlMjo6TUVESUFfSU1BR0VfVFlQRV9SR0JBOwotICAgICAgICAgICAgICAgIHN3aXRjaCAobUNvbG9yRm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gbWVkaWEgaW1hZ2UKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRSR0JBRmxleGlibGU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRBQkdSODg4ODoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEFSR0I4ODg4OgotICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJJbmNvbXBhY3RpYmxlIGNvbG9yIGZvcm1hdCAoJWQpIGZvciBSR0JBIGxheW91dCIsIG1Db2xvckZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGF5b3V0Lm51bVBsYW5lcyAhPSA0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6ICVkIHBsYW5lcyBmb3IgUkdCQSBsYXlvdXQiLCBsYXlvdXQubnVtUGxhbmVzKTsKLSAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiB1bnJlY29nbml6ZWQgY29sb3IgZm9ybWF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIoY2xpZW50ICVkIGNvbXBvbmVudCAlZCkgZm9yIFJHQkEgbGF5b3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRDb2xvckZvcm1hdCwgbUNvbXBvbmVudENvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IE1lZGlhSW1hZ2UgbGF5b3V0CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1VOS05PV047Ci0gICAgICAgICAgICAgICAgQUxPR0QoIlVua25vd24gbGF5b3V0Iik7Ci0gICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgaWYgKGxheW91dC5udW1QbGFuZXMgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBsYW5lSW5mbyAmcGxhbmUgPSBsYXlvdXQucGxhbmVzWzBdOworICAgICAgICAgICAgICAgICAgICBpZiAocGxhbmUuY29sSW5jIDwgMCB8fCBwbGFuZS5yb3dJbmMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3B5LW9ubHkgaWYgd2UgaGF2ZSBuZWdhdGl2ZSBjb2xJbmMvcm93SW5jCisgICAgICAgICAgICAgICAgICAgICAgICB0cnlXcmFwcGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVswXS5tT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lWzBdLm1Db2xJbmMgPSBzdGQ6OmFicyhwbGFuZS5jb2xJbmMpOworICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbMF0ubVJvd0luYyA9IHN0ZDo6YWJzKHBsYW5lLnJvd0luYyk7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVswXS5tSG9yaXpTdWJzYW1wbGluZyA9IHBsYW5lLmNvbFNhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbMF0ubVZlcnRTdWJzYW1wbGluZyA9IHBsYW5lLnJvd1NhbXBsaW5nOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6IHVucmVjb2duaXplZCBsYXlvdXQ6IGNvbG9yIGZvcm1hdCAoY2xpZW50ICVkIGNvbXBvbmVudCAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRDb2xvckZvcm1hdCwgbUNvbXBvbmVudENvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyeVdyYXBwaW5nKSB7CisgICAgICAgICAgICAvLyB0cnkgdG8gbWFwIGRpcmVjdGx5LiBjaGVjayBpZiB0aGUgcGxhbmVzIGFyZSBuZWFyIG9uZSBhbm90aGVyCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICptaW5QdHIgPSBtVmlldy5kYXRhKClbMF07CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICptYXhQdHIgPSBtVmlldy5kYXRhKClbMF07CisgICAgICAgICAgICBpbnQzMl90IHBsYW5lU2l6ZSA9IDA7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGF5b3V0Lm51bVBsYW5lczsgKytpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgQzJQbGFuZUluZm8gJnBsYW5lID0gbGF5b3V0LnBsYW5lc1tpXTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHBsYW5lU3RyaWRlID0gc3RkOjphYnMocGxhbmUucm93SW5jIC8gcGxhbmUuY29sSW5jKTsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IG1pbk9mZnNldCA9IHBsYW5lLm1pbk9mZnNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCAvIHBsYW5lLmNvbFNhbXBsaW5nLCBtSGVpZ2h0IC8gcGxhbmUucm93U2FtcGxpbmcpOworICAgICAgICAgICAgICAgIHNzaXplX3QgbWF4T2Zmc2V0ID0gcGxhbmUubWF4T2Zmc2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoIC8gcGxhbmUuY29sU2FtcGxpbmcsIG1IZWlnaHQgLyBwbGFuZS5yb3dTYW1wbGluZyk7CisgICAgICAgICAgICAgICAgaWYgKG1pblB0ciA+IG1WaWV3LmRhdGEoKVtpXSArIG1pbk9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBtaW5QdHIgPSBtVmlldy5kYXRhKClbaV0gKyBtaW5PZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtYXhQdHIgPCBtVmlldy5kYXRhKClbaV0gKyBtYXhPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4UHRyID0gbVZpZXcuZGF0YSgpW2ldICsgbWF4T2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwbGFuZVNpemUgKz0gcGxhbmVTdHJpZGUgKiBkaXZVcChtQWxsb2NhdGVkRGVwdGgsIDh1KQorICAgICAgICAgICAgICAgICAgICAgICAgKiBhbGlnbihtSGVpZ2h0LCA2NCkgLyBwbGFuZS5yb3dTYW1wbGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChtYXhQdHIgLSBtaW5QdHIgKyAxKSA8PSBwbGFuZVNpemUpIHsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogdGhpcyBpcyByaXNreSBhcyByZWFkaW5nL3dyaXRpbmcgZGF0YSBvdXQgb2YgYm91bmQgcmVzdWx0cworICAgICAgICAgICAgICAgIC8vICAgICAgICBpbiBhbiB1bmRlZmluZWQgYmVoYXZpb3IsIGJ1dCBncmFsbG9jIGRvZXMgYXNzdW1lIGEKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgY29udGlndW91cyBtYXBwaW5nCisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxheW91dC5udW1QbGFuZXM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBsYW5lSW5mbyAmcGxhbmUgPSBsYXlvdXQucGxhbmVzW2ldOworICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbaV0ubU9mZnNldCA9IG1WaWV3LmRhdGEoKVtpXSAtIG1pblB0cjsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW2ldLm1Db2xJbmMgPSBwbGFuZS5jb2xJbmM7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVtpXS5tUm93SW5jID0gcGxhbmUucm93SW5jOworICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbaV0ubUhvcml6U3Vic2FtcGxpbmcgPSBwbGFuZS5jb2xTYW1wbGluZzsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW2ldLm1WZXJ0U3Vic2FtcGxpbmcgPSBwbGFuZS5yb3dTYW1wbGluZzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVdyYXBwZWQgPSBuZXcgQUJ1ZmZlcihjb25zdF9jYXN0PHVpbnQ4X3QgKj4obWluUHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFB0ciAtIG1pblB0ciArIDEpOworICAgICAgICAgICAgICAgIEFMT0dWKCJDb252ZXJ0ZXI6IHdyYXBwZWQgKGNhcGFjaXR5PSV6dSkiLCBtV3JhcHBlZC0+Y2FwYWNpdHkoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbWVkaWFJbWFnZS0+bU51bVBsYW5lcyA9IGxheW91dC5udW1QbGFuZXM7CiAgICAgICAgIG1lZGlhSW1hZ2UtPm1XaWR0aCA9IHZpZXcuY3JvcCgpLndpZHRoOwpAQCAtNDI4LDEyICs1MjksMTIgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocGxhbmUuYWxsb2NhdGVkRGVwdGggIT0gbUFsbG9jYXRlZERlcHRoIHx8IHBsYW5lLmJpdERlcHRoICE9IGJpdERlcHRoKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImRpZmZlcmVudCBhbGxvY2F0ZWREZXB0aC9iaXREZXB0aCBwZXIgcGxhbmUgdW5zdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZGlmZmVyZW50IGFsbG9jYXRlZERlcHRoL2JpdERlcHRoIHBlciBwbGFuZSB1bnN1cHBvcnRlZCIpOwogICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnVmZmVyU2l6ZSArPSBzdHJpZGUgKiB2U3RyaWRlCi0gICAgICAgICAgICAgICAgICAgIC8gcGxhbmUucm93U2FtcGxpbmcgLyBwbGFuZS5jb2xTYW1wbGluZzsKKyAgICAgICAgICAgICAgICAgICAgLyBwbGFuZS5yb3dTYW1wbGluZyAvIHBsYW5lLmNvbFNhbXBsaW5nICogZGl2VXAobUFsbG9jYXRlZERlcHRoLCA4dSk7CiAgICAgICAgIH0KIAogICAgICAgICBtQmFja0J1ZmZlclNpemUgPSBidWZmZXJTaXplOwpAQCAtNDg4LDcgKzU4OSw4IEBACiAgICAgY29uc3QgQzJHcmFwaGljVmlldyBtVmlldzsKICAgICB1aW50MzJfdCBtV2lkdGg7CiAgICAgdWludDMyX3QgbUhlaWdodDsKLSAgICBpbnQzMl90IG1Db2xvckZvcm1hdDsgIC8vLzwgU0RLIGNvbG9yIGZvcm1hdCBmb3IgTWVkaWFJbWFnZQorICAgIGludDMyX3QgbUNsaWVudENvbG9yRm9ybWF0OyAgLy8vPCBTREsgY29sb3IgZm9ybWF0IGZvciBNZWRpYUltYWdlCisgICAgaW50MzJfdCBtQ29tcG9uZW50Q29sb3JGb3JtYXQ7ICAvLy88IFNESyBjb2xvciBmb3JtYXQgZnJvbSBjb21wb25lbnQKICAgICBzcDxBQnVmZmVyPiBtV3JhcHBlZDsgIC8vLzwgd3JhcHBlZCBidWZmZXIgKGlmIHdlIGNhbiBtYXAgQzJCdWZmZXIgdG8gYW4gQUJ1ZmZlcikKICAgICB1aW50MzJfdCBtQWxsb2NhdGVkRGVwdGg7CiAgICAgdWludDMyX3QgbUJhY2tCdWZmZXJTaXplOwpAQCAtNTE3LDEwICs2MTksNyBAQAogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiAKLSAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7Ci0gICAgKHZvaWQpZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCk7Ci0KLSAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcih2aWV3LCBjb2xvckZvcm1hdCwgZmFsc2UgLyogY29weSAqLyk7CisgICAgR3JhcGhpY1ZpZXcyTWVkaWFJbWFnZUNvbnZlcnRlciBjb252ZXJ0ZXIodmlldywgZm9ybWF0LCBmYWxzZSAvKiBjb3B5ICovKTsKICAgICBpZiAoY29udmVydGVyLmluaXRDaGVjaygpICE9IE9LKSB7CiAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXIgaW5pdCBmYWlsZWQ6ICVkIiwgY29udmVydGVyLmluaXRDaGVjaygpKTsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC01NzgsNyArNjc3LDIzIEBACiB9CiAKIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gR3JhcGhpY01ldGFkYXRhQnVmZmVyOjphc0MyQnVmZmVyKCkgewotI2lmbmRlZiBfX0xQNjRfXworI2lmZGVmIF9fTFA2NF9fCisgICAgc3RhdGljIHN0ZDo6b25jZV9mbGFnIHNfY2hlY2tPbmNlOworICAgIHN0YXRpYyBib29sIHNfNjRiaXRvbmx5IHtmYWxzZX07CisgICAgc3RkOjpjYWxsX29uY2Uoc19jaGVja09uY2UsIFsmXSgpeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBhYmkzMmxpc3QgPQorICAgICAgICA6OmFuZHJvaWQ6OmJhc2U6OkdldFByb3BlcnR5KCJyby5wcm9kdWN0LmNwdS5hYmlsaXN0MzIiLCAiIik7CisgICAgICAgIGlmIChhYmkzMmxpc3QuZW1wdHkoKSkgeworICAgICAgICAgICAgc182NGJpdG9ubHkgPSB0cnVlOworICAgICAgICB9CisgICAgfSk7CisKKyAgICBpZiAoIXNfNjRiaXRvbmx5KSB7CisgICAgICAgIEFMT0dFKCJHcmFwaGljTWV0YWRhdGFCdWZmZXIgZG9lcyBub3Qgd29yayBpbiAzMis2NCBzeXN0ZW0gaWYgY29tcGlsZWQgYXMgNjQtYml0IG9iamVjdCIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisjZW5kaWYKKwogICAgIFZpZGVvTmF0aXZlTWV0YWRhdGEgKm1ldGEgPSAoVmlkZW9OYXRpdmVNZXRhZGF0YSAqKWJhc2UoKTsKICAgICBBTmF0aXZlV2luZG93QnVmZmVyICpidWZmZXIgPSAoQU5hdGl2ZVdpbmRvd0J1ZmZlciAqKW1ldGEtPnBCdWZmZXI7CiAgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CkBAIC02MTEsMTAgKzcyNiw2IEBACiAgICAgfQogICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlR3JhcGhpY0J1ZmZlcigKICAgICAgICAgICAgIGJsb2NrLT5zaGFyZShDMlJlY3QoYnVmZmVyLT53aWR0aCwgYnVmZmVyLT5oZWlnaHQpLCBDMkZlbmNlKCkpKTsKLSNlbHNlCi0gICAgQUxPR0UoIkdyYXBoaWNNZXRhZGF0YUJ1ZmZlciBkb2VzIG5vdCB3b3JrIG9uIDY0LWJpdCBhcmNoIik7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0jZW5kaWYKIH0KIAogLy8gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIKQEAgLTYzNCwxMCArNzQ1LDcgQEAKICAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKVswXS5tYXAoKS5nZXQoKSkpOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiBob2xkZXI7CiAKLSAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7Ci0gICAgKHZvaWQpZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCk7Ci0KLSAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcigqdmlldywgY29sb3JGb3JtYXQsIGZhbHNlIC8qIGNvcHkgKi8pOworICAgIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgY29udmVydGVyKCp2aWV3LCBmb3JtYXQsIGZhbHNlIC8qIGNvcHkgKi8pOwogICAgIGlmIChjb252ZXJ0ZXIuaW5pdENoZWNrKCkgIT0gT0spIHsKICAgICAgICAgQUxPR0QoIkNvbnZlcnRlciBpbml0IGZhaWxlZDogJWQiLCBjb252ZXJ0ZXIuaW5pdENoZWNrKCkpOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTcyOSwxMiArODM3LDExIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7Ci0gICAgLy8gRklYTUU6IGZvcm1hdCgpIGlzIG5vdCBjb25zdCwgYnV0IHdlIGNhbm5vdCBjaGFuZ2UgaXQsIHNvIGRvIGEgY29uc3QgY2FzdCBoZXJlCi0gICAgY29uc3RfY2FzdDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciAqPih0aGlzKS0+Zm9ybWF0KCktPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KTsKLQogICAgIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgY29udmVydGVyKAotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpWzBdLm1hcCgpLmdldCgpLCBjb2xvckZvcm1hdCwgdHJ1ZSAvKiBjb3B5ICovKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKVswXS5tYXAoKS5nZXQoKSwKKyAgICAgICAgICAgIC8vIEZJWE1FOiBmb3JtYXQoKSBpcyBub3QgY29uc3QsIGJ1dCB3ZSBjYW5ub3QgY2hhbmdlIGl0LCBzbyBkbyBhIGNvbnN0IGNhc3QgaGVyZQorICAgICAgICAgICAgY29uc3RfY2FzdDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciAqPih0aGlzKS0+Zm9ybWF0KCksCisgICAgICAgICAgICB0cnVlIC8qIGNvcHkgKi8pOwogICAgIGlmIChjb252ZXJ0ZXIuaW5pdENoZWNrKCkgIT0gT0spIHsKICAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5OiBjb252ZXJ0ZXIgaW5pdCBmYWlsZWQ6ICVkIiwgY29udmVydGVyLmluaXRDaGVjaygpKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNzUyLDExICs4NTksOSBAQAogICAgICAgICBzZXRSYW5nZSgwLCAwKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKLSAgICBmb3JtYXQoKS0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmY29sb3JGb3JtYXQpOwogCiAgICAgR3JhcGhpY1ZpZXcyTWVkaWFJbWFnZUNvbnZlcnRlciBjb252ZXJ0ZXIoCi0gICAgICAgICAgICBidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKClbMF0ubWFwKCkuZ2V0KCksIGNvbG9yRm9ybWF0LCB0cnVlIC8qIGNvcHkgKi8pOworICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpWzBdLm1hcCgpLmdldCgpLCBmb3JtYXQoKSwgdHJ1ZSAvKiBjb3B5ICovKTsKICAgICBpZiAoY29udmVydGVyLmluaXRDaGVjaygpICE9IE9LKSB7CiAgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y29weTogY29udmVydGVyIGluaXQgZmFpbGVkOiAlZCIsIGNvbnZlcnRlci5pbml0Q2hlY2soKSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuY3BwCmluZGV4IGIxMTIyNDkuLmEyNmY4OWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmNwcApAQCAtMTAzLDExICsxMDMsMTYgQEAKICAgICBjMl9zdGF0dXNfdCBlcnIxID0gaW50Zi0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMoJnBhcmFtRGVzY3MpOwogICAgIGlmIChlcnIxID09IEMyX09LKSB7CiAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiAmZGVzYyA6IHBhcmFtRGVzY3MpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoKHVpbnQzMl90KWRlc2MtPmluZGV4KCkpIHsKLSAgICAgICAgICAgIGNhc2UgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEU6CisgICAgICAgICAgICBDMlBhcmFtOjpUeXBlIHR5cGUgPSBkZXNjLT5pbmRleCgpOworICAgICAgICAgICAgLy8gb25seSBjb25zaWRlciBzdXBwb3J0ZWQgcGFyYW1ldGVycyBvbiByYXcgcG9ydHMKKyAgICAgICAgICAgIGlmICghKGVuY29kZXIgPyB0eXBlLmZvcklucHV0KCkgOiB0eXBlLmZvck91dHB1dCgpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoICh0eXBlLmNvcmVJbmRleCgpKSB7CisgICAgICAgICAgICBjYXNlIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6Q09SRV9JTkRFWDoKICAgICAgICAgICAgICAgICBzdXBwb3J0c0hkcjEwUGx1cyA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFOgorICAgICAgICAgICAgY2FzZSBDMlN0cmVhbUhkclN0YXRpY0luZm86OkNPUkVfSU5ERVg6CiAgICAgICAgICAgICAgICAgc3VwcG9ydHNIZHIgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9GcmFtZVJlYXNzZW1ibGVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9GcmFtZVJlYXNzZW1ibGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjFiZTE3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0ZyYW1lUmVhc3NlbWJsZXIuY3BwCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkZyYW1lUmVhc3NlbWJsZXIiCisKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlICJGcmFtZVJlYXNzZW1ibGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrVG9sZXJhbmNlVXMgPSAxMDAwOyAgLy8gMW1zCisKK0ZyYW1lUmVhc3NlbWJsZXI6OkZyYW1lUmVhc3NlbWJsZXIoKQorICAgIDogbVVzYWdlezAsIDB9LAorICAgICAgbVNhbXBsZVJhdGUoMHUpLAorICAgICAgbUNoYW5uZWxDb3VudCgwdSksCisgICAgICBtRW5jb2RpbmcoQzJDb25maWc6OlBDTV8xNiksCisgICAgICBtQ3VycmVudE9yZGluYWwoezAsIDAsIDB9KSB7Cit9CisKK3ZvaWQgRnJhbWVSZWFzc2VtYmxlcjo6aW5pdCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgdWludDMyX3QgZnJhbWVTaXplLAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgIEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCBlbmNvZGluZykgeworICAgIG1CbG9ja1Bvb2wgPSBwb29sOworICAgIG1Vc2FnZSA9IHVzYWdlOworICAgIG1GcmFtZVNpemUgPSBmcmFtZVNpemU7CisgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CisgICAgbUVuY29kaW5nID0gZW5jb2Rpbmc7Cit9CisKK3ZvaWQgRnJhbWVSZWFzc2VtYmxlcjo6dXBkYXRlRnJhbWVTaXplKHVpbnQzMl90IGZyYW1lU2l6ZSkgeworICAgIGZpbmlzaEN1cnJlbnRCbG9jaygmbVBlbmRpbmdXb3JrKTsKKyAgICBtRnJhbWVTaXplID0gZnJhbWVTaXplOworfQorCit2b2lkIEZyYW1lUmVhc3NlbWJsZXI6OnVwZGF0ZVNhbXBsZVJhdGUodWludDMyX3Qgc2FtcGxlUmF0ZSkgeworICAgIGZpbmlzaEN1cnJlbnRCbG9jaygmbVBlbmRpbmdXb3JrKTsKKyAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7Cit9CisKK3ZvaWQgRnJhbWVSZWFzc2VtYmxlcjo6dXBkYXRlQ2hhbm5lbENvdW50KHVpbnQzMl90IGNoYW5uZWxDb3VudCkgeworICAgIGZpbmlzaEN1cnJlbnRCbG9jaygmbVBlbmRpbmdXb3JrKTsKKyAgICBtQ2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50OworfQorCit2b2lkIEZyYW1lUmVhc3NlbWJsZXI6OnVwZGF0ZVBjbUVuY29kaW5nKEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCBlbmNvZGluZykgeworICAgIGZpbmlzaEN1cnJlbnRCbG9jaygmbVBlbmRpbmdXb3JrKTsKKyAgICBtRW5jb2RpbmcgPSBlbmNvZGluZzsKK30KKwordm9pZCBGcmFtZVJlYXNzZW1ibGVyOjpyZXNldCgpIHsKKyAgICBmbHVzaCgpOworICAgIG1DdXJyZW50T3JkaW5hbCA9IHswLCAwLCAwfTsKKyAgICBtQmxvY2tQb29sLnJlc2V0KCk7CisgICAgbUZyYW1lU2l6ZS5yZXNldCgpOworICAgIG1TYW1wbGVSYXRlID0gMHU7CisgICAgbUNoYW5uZWxDb3VudCA9IDB1OworICAgIG1FbmNvZGluZyA9IEMyQ29uZmlnOjpQQ01fMTY7Cit9CisKK0ZyYW1lUmVhc3NlbWJsZXI6Om9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgcmV0dXJuIG1GcmFtZVNpemUuaGFzX3ZhbHVlKCk7Cit9CisKK2MyX3N0YXR1c190IEZyYW1lUmVhc3NlbWJsZXI6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gKml0ZW1zKSB7CisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID09IDB1CisgICAgICAgICAgICB8fCAhYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpIHsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpdGVtcy0+c3BsaWNlKGl0ZW1zLT5lbmQoKSwgbVBlbmRpbmdXb3JrKTsKKworICAgIC8vIEZpbGwgbUN1cnJlbnRCbG9jaworICAgIGlmIChtQ3VycmVudEJsb2NrKSB7CisgICAgICAgIC8vIEZpcnN0IGNoZWNrIHRoZSB0aW1lc3RhbXAKKyAgICAgICAgYzJfY250cjY0X3QgZW5kVGltZXN0YW1wVXMgPSBtQ3VycmVudE9yZGluYWwudGltZXN0YW1wOworICAgICAgICBlbmRUaW1lc3RhbXBVcyArPSBieXRlc1RvU2FtcGxlcyhtV3JpdGVWaWV3LT5zaXplKCkpICogMTAwMDAwMCAvIG1TYW1wbGVSYXRlOworICAgICAgICBpZiAodGltZVVzIDwgZW5kVGltZXN0YW1wVXMucGVlaygpKSB7CisgICAgICAgICAgICB1aW50NjRfdCBkaWZmVXMgPSAoZW5kVGltZXN0YW1wVXMgLSB0aW1lVXMpLnBlZWt1KCk7CisgICAgICAgICAgICBpZiAoZGlmZlVzID4ga1RvbGVyYW5jZVVzKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHRpbWVzdGFtcCBpcyBnb2luZyBiYWNrIGluIHRpbWUgaW4gbGFyZ2UgYW1vdW50LgorICAgICAgICAgICAgICAgIC8vIFRPRE86IGIvMTQ1NzAyMTM2CisgICAgICAgICAgICAgICAgQUxPR1coInRpbWVzdGFtcCBnb2luZyBiYWNrIGluIHRpbWUhIGZyb20gJWxsZCB0byAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRpbWVzdGFtcFVzLnBlZWtsbCgpLCAobG9uZyBsb25nKXRpbWVVcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7ICAvLyB0aW1lVXMgPj0gZW5kVGltZXN0YW1wVXMucGVlaygpCisgICAgICAgICAgICB1aW50NjRfdCBkaWZmVXMgPSAodGltZVVzIC0gZW5kVGltZXN0YW1wVXMpLnBlZWt1KCk7CisgICAgICAgICAgICBpZiAoZGlmZlVzID4ga1RvbGVyYW5jZVVzKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHRpbWVzdGFtcCBpcyBnb2luZyBmb3J3YXJkOyBhZGQgc2lsZW5jZSBhcyBuZWNlc3NhcnkuCisgICAgICAgICAgICAgICAgc2l6ZV90IGdhcFNhbXBsZXMgPSB1c1RvU2FtcGxlcyhkaWZmVXMpOworICAgICAgICAgICAgICAgIHNpemVfdCByZW1haW5pbmdTYW1wbGVzID0KKyAgICAgICAgICAgICAgICAgICAgKG1Xcml0ZVZpZXctPmNhcGFjaXR5KCkgLSBtV3JpdGVWaWV3LT5zaXplKCkpCisgICAgICAgICAgICAgICAgICAgIC8gbUNoYW5uZWxDb3VudCAvIGJ5dGVzUGVyU2FtcGxlKCk7CisgICAgICAgICAgICAgICAgaWYgKGdhcFNhbXBsZXMgPCByZW1haW5pbmdTYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBnYXBCeXRlcyA9IGdhcFNhbXBsZXMgKiBtQ2hhbm5lbENvdW50ICogYnl0ZXNQZXJTYW1wbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG1Xcml0ZVZpZXctPmJhc2UoKSArIG1Xcml0ZVZpZXctPnNpemUoKSwgMHUsIGdhcEJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgbVdyaXRlVmlldy0+c2V0U2l6ZShtV3JpdGVWaWV3LT5zaXplKCkgKyBnYXBCeXRlcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmluaXNoQ3VycmVudEJsb2NrKGl0ZW1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUN1cnJlbnRCbG9jaykgeworICAgICAgICAvLyBBcHBlbmQgdGhlIGRhdGEgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBibG9jaworICAgICAgICBzaXplX3QgY29weVNpemUgPSBzdGQ6Om1pbigKKyAgICAgICAgICAgICAgICBidWZmZXItPnNpemUoKSwKKyAgICAgICAgICAgICAgICBzaXplX3QobVdyaXRlVmlldy0+Y2FwYWNpdHkoKSAtIG1Xcml0ZVZpZXctPnNpemUoKSkpOworICAgICAgICBtZW1jcHkobVdyaXRlVmlldy0+YmFzZSgpICsgbVdyaXRlVmlldy0+c2l6ZSgpLCBidWZmZXItPmRhdGEoKSwgY29weVNpemUpOworICAgICAgICBidWZmZXItPnNldFJhbmdlKGJ1ZmZlci0+b2Zmc2V0KCkgKyBjb3B5U2l6ZSwgYnVmZmVyLT5zaXplKCkgLSBjb3B5U2l6ZSk7CisgICAgICAgIG1Xcml0ZVZpZXctPnNldFNpemUobVdyaXRlVmlldy0+c2l6ZSgpICsgY29weVNpemUpOworICAgICAgICBpZiAobVdyaXRlVmlldy0+c2l6ZSgpID09IG1Xcml0ZVZpZXctPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgICAgIGZpbmlzaEN1cnJlbnRCbG9jayhpdGVtcyk7CisgICAgICAgIH0KKyAgICAgICAgdGltZVVzICs9IGJ5dGVzVG9TYW1wbGVzKGNvcHlTaXplKSAqIDEwMDAwMDAgLyBtU2FtcGxlUmF0ZTsKKyAgICB9CisKKyAgICBpZiAoYnVmZmVyLT5zaXplKCkgPiAwKSB7CisgICAgICAgIG1DdXJyZW50T3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lVXM7CisgICAgICAgIG1DdXJyZW50T3JkaW5hbC5jdXN0b21PcmRpbmFsID0gdGltZVVzOworICAgIH0KKworICAgIHNpemVfdCBmcmFtZVNpemVCeXRlcyA9IG1GcmFtZVNpemUudmFsdWUoKSAqIG1DaGFubmVsQ291bnQgKiBieXRlc1BlclNhbXBsZSgpOworICAgIHdoaWxlIChidWZmZXItPnNpemUoKSA+IDApIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigKKyAgICAgICAgICAgICAgICBtQ3VycmVudEJsb2NrLAorICAgICAgICAgICAgICAgICJUaGVyZSdzIHJlbWFpbmluZyBkYXRhIGJ1dCB0aGUgcGVuZGluZyBibG9jayBpcyBub3QgZmlsbGVkICYgZmluaXNoZWQiKTsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayhuZXcgQzJXb3JrKTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUJsb2NrUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhmcmFtZVNpemVCeXRlcywgbVVzYWdlLCAmbUN1cnJlbnRCbG9jayk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IGNvcHlTaXplID0gc3RkOjptaW4oYnVmZmVyLT5zaXplKCksIGZyYW1lU2l6ZUJ5dGVzKTsKKyAgICAgICAgbVdyaXRlVmlldyA9IG1DdXJyZW50QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAobVdyaXRlVmlldy0+ZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIG1Xcml0ZVZpZXctPmVycm9yKCk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImJ1ZmZlcj17b2Zmc2V0PSV6dSBzaXplPSV6dSkgY29weVNpemU9JXp1IiwKKyAgICAgICAgICAgICAgICBidWZmZXItPm9mZnNldCgpLCBidWZmZXItPnNpemUoKSwgY29weVNpemUpOworICAgICAgICBtZW1jcHkobVdyaXRlVmlldy0+YmFzZSgpLCBidWZmZXItPmRhdGEoKSwgY29weVNpemUpOworICAgICAgICBtV3JpdGVWaWV3LT5zZXRPZmZzZXQoMHUpOworICAgICAgICBtV3JpdGVWaWV3LT5zZXRTaXplKGNvcHlTaXplKTsKKyAgICAgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpICsgY29weVNpemUsIGJ1ZmZlci0+c2l6ZSgpIC0gY29weVNpemUpOworICAgICAgICBpZiAoY29weVNpemUgPT0gZnJhbWVTaXplQnl0ZXMpIHsKKyAgICAgICAgICAgIGZpbmlzaEN1cnJlbnRCbG9jayhpdGVtcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IGVvcyA9IDA7CisgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImVvcyIsICZlb3MpICYmIGVvcykgeworICAgICAgICBmaW5pc2hDdXJyZW50QmxvY2soaXRlbXMpOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBGcmFtZVJlYXNzZW1ibGVyOjpmbHVzaCgpIHsKKyAgICBtUGVuZGluZ1dvcmsuY2xlYXIoKTsKKyAgICBtV3JpdGVWaWV3LnJlc2V0KCk7CisgICAgbUN1cnJlbnRCbG9jay5yZXNldCgpOworfQorCit1aW50NjRfdCBGcmFtZVJlYXNzZW1ibGVyOjpieXRlc1RvU2FtcGxlcyhzaXplX3QgbnVtQnl0ZXMpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVtQnl0ZXMgLyBtQ2hhbm5lbENvdW50IC8gYnl0ZXNQZXJTYW1wbGUoKTsKK30KKworc2l6ZV90IEZyYW1lUmVhc3NlbWJsZXI6OnVzVG9TYW1wbGVzKHVpbnQ2NF90IHVzKSBjb25zdCB7CisgICAgcmV0dXJuICh1cyAqIG1DaGFubmVsQ291bnQgKiBtU2FtcGxlUmF0ZSAvIDEwMDAwMDApOworfQorCit1aW50MzJfdCBGcmFtZVJlYXNzZW1ibGVyOjpieXRlc1BlclNhbXBsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKG1FbmNvZGluZyA9PSBDMkNvbmZpZzo6UENNXzgpID8gMQorICAgICAgICAgOiAobUVuY29kaW5nID09IEMyQ29uZmlnOjpQQ01fMTYpID8gMgorICAgICAgICAgOiAobUVuY29kaW5nID09IEMyQ29uZmlnOjpQQ01fRkxPQVQpID8gNCA6IDA7Cit9CisKK3ZvaWQgRnJhbWVSZWFzc2VtYmxlcjo6ZmluaXNoQ3VycmVudEJsb2NrKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gKml0ZW1zKSB7CisgICAgaWYgKCFtQ3VycmVudEJsb2NrKSB7CisgICAgICAgIC8vIE5vLW9wCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG1Xcml0ZVZpZXctPnNpemUoKSA8IG1Xcml0ZVZpZXctPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgbWVtc2V0KG1Xcml0ZVZpZXctPmJhc2UoKSArIG1Xcml0ZVZpZXctPnNpemUoKSwgMHUsCisgICAgICAgICAgICAgICAgbVdyaXRlVmlldy0+Y2FwYWNpdHkoKSAtIG1Xcml0ZVZpZXctPnNpemUoKSk7CisgICAgICAgIG1Xcml0ZVZpZXctPnNldFNpemUobVdyaXRlVmlldy0+Y2FwYWNpdHkoKSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmt7c3RkOjptYWtlX3VuaXF1ZTxDMldvcms+KCl9OworICAgIHdvcmstPmlucHV0Lm9yZGluYWwgPSBtQ3VycmVudE9yZGluYWw7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5wdXNoX2JhY2soQzJCdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgICAgIG1DdXJyZW50QmxvY2stPnNoYXJlKDAsIG1DdXJyZW50QmxvY2stPmNhcGFjaXR5KCksIEMyRmVuY2UoKSkpKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKyAgICBpdGVtcy0+cHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICArK21DdXJyZW50T3JkaW5hbC5mcmFtZUluZGV4OworICAgIG1DdXJyZW50T3JkaW5hbC50aW1lc3RhbXAgKz0gbUZyYW1lU2l6ZS52YWx1ZSgpICogMTAwMDAwMCAvIG1TYW1wbGVSYXRlOworICAgIG1DdXJyZW50T3JkaW5hbC5jdXN0b21PcmRpbmFsID0gbUN1cnJlbnRPcmRpbmFsLnRpbWVzdGFtcDsKKyAgICBtQ3VycmVudEJsb2NrLnJlc2V0KCk7CisgICAgbVdyaXRlVmlldy5yZXNldCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0ZyYW1lUmVhc3NlbWJsZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9GcmFtZVJlYXNzZW1ibGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhYzA2ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9GcmFtZVJlYXNzZW1ibGVyLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGUkFNRV9SRUFTU0VNQkxFUl9IXworI2RlZmluZSBGUkFNRV9SRUFTU0VNQkxFUl9IXworCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRnJhbWVSZWFzc2VtYmxlciB7CitwdWJsaWM6CisgICAgRnJhbWVSZWFzc2VtYmxlcigpOworCisgICAgdm9pZCBpbml0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICB1aW50MzJfdCBmcmFtZVNpemUsCisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgQzJDb25maWc6OnBjbV9lbmNvZGluZ190IGVuY29kaW5nKTsKKyAgICB2b2lkIHVwZGF0ZUZyYW1lU2l6ZSh1aW50MzJfdCBmcmFtZVNpemUpOworICAgIHZvaWQgdXBkYXRlU2FtcGxlUmF0ZSh1aW50MzJfdCBzYW1wbGVSYXRlKTsKKyAgICB2b2lkIHVwZGF0ZUNoYW5uZWxDb3VudCh1aW50MzJfdCBjaGFubmVsQ291bnQpOworICAgIHZvaWQgdXBkYXRlUGNtRW5jb2RpbmcoQzJDb25maWc6OnBjbV9lbmNvZGluZ190IGVuY29kaW5nKTsKKyAgICB2b2lkIHJlc2V0KCk7CisgICAgdm9pZCBmbHVzaCgpOworCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0OworCisgICAgYzJfc3RhdHVzX3QgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICppdGVtcyk7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtQmxvY2tQb29sOworICAgIEMyTWVtb3J5VXNhZ2UgbVVzYWdlOworICAgIHN0ZDo6b3B0aW9uYWw8dWludDMyX3Q+IG1GcmFtZVNpemU7CisgICAgdWludDMyX3QgbVNhbXBsZVJhdGU7CisgICAgdWludDMyX3QgbUNoYW5uZWxDb3VudDsKKyAgICBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgbUVuY29kaW5nOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVBlbmRpbmdXb3JrOworICAgIEMyV29ya09yZGluYWxTdHJ1Y3QgbUN1cnJlbnRPcmRpbmFsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBtQ3VycmVudEJsb2NrOworICAgIHN0ZDo6b3B0aW9uYWw8QzJXcml0ZVZpZXc+IG1Xcml0ZVZpZXc7CisKKyAgICB1aW50NjRfdCBieXRlc1RvU2FtcGxlcyhzaXplX3QgbnVtQnl0ZXMpIGNvbnN0OworICAgIHNpemVfdCB1c1RvU2FtcGxlcyh1aW50NjRfdCB1cykgY29uc3Q7CisgICAgdWludDMyX3QgYnl0ZXNQZXJTYW1wbGUoKSBjb25zdDsKKworICAgIHZvaWQgZmluaXNoQ3VycmVudEJsb2NrKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gKml0ZW1zKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gRlJBTUVfUkVBU1NFTUJMRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9JbnB1dFN1cmZhY2VXcmFwcGVyLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vSW5wdXRTdXJmYWNlV3JhcHBlci5oCmluZGV4IDQ3OWFjYjEuLjUwZDYwMGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9JbnB1dFN1cmZhY2VXcmFwcGVyLmgKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0lucHV0U3VyZmFjZVdyYXBwZXIuaApAQCAtMTA2LDYgKzEwNiwxMSBAQAogICAgICAqLwogICAgIHZpcnR1YWwgdm9pZCBvbklucHV0QnVmZmVyRG9uZShjMl9jbnRyNjRfdCAvKiBpbmRleCAqLykge30KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgZGF0YXNwYWNlIGluZm9ybWF0aW9uIGZyb20gR3JhcGhpY0J1ZmZlclNvdXJjZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGFuZHJvaWRfZGF0YXNwYWNlIGdldERhdGFzcGFjZSgpIHsgcmV0dXJuIG1EYXRhU3BhY2U7IH0KKwogcHJvdGVjdGVkOgogICAgIGFuZHJvaWRfZGF0YXNwYWNlIG1EYXRhU3BhY2U7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1BpcGVsaW5lV2F0Y2hlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmNwcAppbmRleCAwZWU5MDU2Li5iYzkxOTdjIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmNwcApAQCAtOTUsNiArOTUsNyBAQAogfQogCiB2b2lkIFBpcGVsaW5lV2F0Y2hlcjo6Zmx1c2goKSB7CisgICAgQUxPR1YoImZsdXNoIik7CiAgICAgbUZyYW1lc0luUGlwZWxpbmUuY2xlYXIoKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmNwcAppbmRleCBmMzkwNTFiLi5kMTRiOWIwIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmNwcApAQCAtMjg4LDYgKzI4OCwyMCBAQAogICAgIH0KIH0KIAorQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmdldFR5cGVGb3JLZXkoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZrZXkpIGNvbnN0IHsKKyAgICBhdXRvIGl0ID0gbU1hcC5maW5kKGtleSk7CisgICAgaWYgKGl0ID09IG1NYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGREZXNjcmlwdG9yOjp0eXBlX3QofjApOworICAgIH0KKworICAgIGlmIChpdC0+c2Vjb25kLmZpZWxkRGVzYykgeworICAgICAgICByZXR1cm4gaXQtPnNlY29uZC5maWVsZERlc2MtPnR5cGUoKTsKKyAgICB9CisgICAgLy8gd2hvbGUgcGFyYW0gaXMgZXhwb3NlZCBhcyBhIGJsb2IKKyAgICByZXR1cm4gQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I7Cit9CisKIHZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjp1cGRhdGVQYXJhbXNGcm9tTWVzc2FnZSgKICAgICAgICAgY29uc3QgRGljdCAmcGFyYW1zLAogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICp2ZWMgLyogbm9ubnVsbCAqLykgY29uc3QgewpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5oCmluZGV4IDc1MmM3ZTQuLjZkY2YyYTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuaAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmgKQEAgLTE3Niw2ICsxNzYsMTQgQEAKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAqa2V5cyAvKiBub25udWxsICovKSBjb25zdDsKIAogICAgIC8qKgorICAgICAqIEdldCBmaWVsZCB0eXBlIGZvciB0aGUgZ2l2ZW4gbmFtZQorICAgICAqCisgICAgICogXHBhcmFtIGtleVtpbl0gICBmaWVsZCBuYW1lCisgICAgICogXHJldHVybiB0eXBlIG9mIHRoZSBmaWVsZCwgb3IgdHlwZV90KH4wKSBpZiBub3QgZm91bmQuCisgICAgICovCisgICAgQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCBnZXRUeXBlRm9yS2V5KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBjb25zdDsKKworICAgIC8qKgogICAgICAqIFVwZGF0ZSBDMlBhcmFtIG9iamVjdHMgZnJvbSBmaWVsZCBuYW1lIGFuZCB2YWx1ZSBpbiBBTWVzc2FnZSBvYmplY3QuCiAgICAgICoKICAgICAgKiBccGFyYW0gcGFyYW1zW2luXSAgICBEaWN0IG9iamVjdCB3aXRoIGZpZWxkIG5hbWUgdG8gdmFsdWUgcGFpcnMuCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DQ29kZWMuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NDb2RlYy5oCmluZGV4IGRiYmI1ZDUuLmVjMTgxMjggMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NDb2RlYy5oCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NDb2RlYy5oCkBAIC02NSw2ICs2NSwxMiBAQAogICAgIHZpcnR1YWwgdm9pZCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlcXVlc3RJRFJGcmFtZSgpIG92ZXJyaWRlOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtZXRlcnMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICpuYW1lcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkZXNjcmliZVBhcmFtZXRlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBDb2RlY1BhcmFtZXRlckRlc2NyaXB0b3IgKmRlc2MpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3Vic2NyaWJlVG9QYXJhbWV0ZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmbmFtZXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5zdWJzY3JpYmVGcm9tUGFyYW1ldGVycyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5hbWVzKSBvdmVycmlkZTsKKwogICAgIHZvaWQgaW5pdGlhdGVSZWxlYXNlSWZTdHVjaygpOwogICAgIHZvaWQgb25Xb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZ3b3JrSXRlbXMpOwogICAgIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUodWludDY0X3QgZnJhbWVJbmRleCwgc2l6ZV90IGFycmF5SW5kZXgpOwpAQCAtMTI2LDYgKzEzMiwxMSBAQAogICAgICAgICAgICAgY29uc3Qgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyAmdGltZW91dCwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOwogCisgICAgc3RhdHVzX3QgY29uZmlndXJlVHVubmVsZWRWaWRlb1BsYXliYWNrKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wLAorICAgICAgICAgICAgc3A8TmF0aXZlSGFuZGxlPiAqc2lkZWJhbmRIYW5kbGUsCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKICAgICBlbnVtIHsKICAgICAgICAga1doYXRBbGxvY2F0ZSwKICAgICAgICAga1doYXRDb25maWd1cmUsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDhkMWE5YzMuLmY5Yzc5NjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xLDkgKzEsMTkgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogImNjb2RlY191bml0X3Rlc3QiLAogCiAgICAgc3JjczogWwogICAgICAgICAiQ0NvZGVjQnVmZmVyc190ZXN0LmNwcCIsCiAgICAgICAgICJDQ29kZWNDb25maWdfdGVzdC5jcHAiLAorICAgICAgICAiRnJhbWVSZWFzc2VtYmxlcl90ZXN0LmNwcCIsCiAgICAgICAgICJSZWZsZWN0ZWRQYXJhbVVwZGF0ZXJfdGVzdC5jcHAiLAogICAgIF0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9DQ29kZWNCdWZmZXJzX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0NDb2RlY0J1ZmZlcnNfdGVzdC5jcHAKaW5kZXggNWJlZTYwNS4uNjZiNzYyMiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0NDb2RlY0J1ZmZlcnNfdGVzdC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0NDb2RlY0J1ZmZlcnNfdGVzdC5jcHAKQEAgLTE4LDIyICsxOCwzMiBAQAogCiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIAorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KIAorI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgogI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyTWFwcGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxSYXdHcmFwaGljT3V0cHV0QnVmZmVycz4gR2V0UmF3R3JhcGhpY091dHB1dEJ1ZmZlcnMoCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzPiBidWZmZXJzID0KKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxSYXdHcmFwaGljT3V0cHV0QnVmZmVycz4oInRlc3QiKTsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0e25ldyBBTWVzc2FnZX07CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfV0lEVEgsIHdpZHRoKTsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9IRUlHSFQsIGhlaWdodCk7CisgICAgYnVmZmVycy0+c2V0Rm9ybWF0KGZvcm1hdCk7CisgICAgcmV0dXJuIGJ1ZmZlcnM7Cit9CisKIFRFU1QoUmF3R3JhcGhpY091dHB1dEJ1ZmZlcnNUZXN0LCBDaGFuZ2VOdW1TbG90cykgewogICAgIGNvbnN0ZXhwciBpbnQzMl90IGtXaWR0aCA9IDM4NDA7CiAgICAgY29uc3RleHByIGludDMyX3Qga0hlaWdodCA9IDIxNjA7CiAKICAgICBzdGQ6OnNoYXJlZF9wdHI8UmF3R3JhcGhpY091dHB1dEJ1ZmZlcnM+IGJ1ZmZlcnMgPQotICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzPigidGVzdCIpOwotICAgIHNwPEFNZXNzYWdlPiBmb3JtYXR7bmV3IEFNZXNzYWdlfTsKLSAgICBmb3JtYXQtPnNldEludDMyKCJ3aWR0aCIsIGtXaWR0aCk7Ci0gICAgZm9ybWF0LT5zZXRJbnQzMigiaGVpZ2h0Iiwga0hlaWdodCk7Ci0gICAgYnVmZmVycy0+c2V0Rm9ybWF0KGZvcm1hdCk7CisgICAgICAgIEdldFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzKGtXaWR0aCwga0hlaWdodCk7CiAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHBvb2w7CiAgICAgQVNTRVJUX0VRKE9LLCBHZXRDb2RlYzJCbG9ja1Bvb2woQzJCbG9ja1Bvb2w6OkJBU0lDX0dSQVBISUMsIG51bGxwdHIsICZwb29sKSk7CkBAIC05Niw0ICsxMDYsNzQ2IEBACiAgICAgfQogfQogCitURVNUKFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzVGVzdCwgRmxleFl1dkNvbG9yRm9ybWF0KSB7CisgICAgY29uc3RleHByIGludDMyX3Qga1dpZHRoID0gMzIwOworICAgIGNvbnN0ZXhwciBpbnQzMl90IGtIZWlnaHQgPSAyNDA7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gZmxleFBpeGVsRm9ybWF0cyh7SEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4fSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gY2xpZW50ID0gQ29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgiZGVmYXVsdCIpOworICAgIGlmIChjbGllbnQpIHsKKyAgICAgICAgLy8gUXVlcnkgdmVuZG9yIGZvcm1hdCBmb3IgRmxleGlibGUgWVVWCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gaGVhcFBhcmFtczsKKyAgICAgICAgQzJTdG9yZUZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yc0luZm8gKnBpeGVsRm9ybWF0SW5mbyA9IG51bGxwdHI7CisgICAgICAgIGlmIChjbGllbnQtPnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICB7fSwKKyAgICAgICAgICAgICAgICAgICAge0MyU3RvcmVGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcnNJbmZvOjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAmaGVhcFBhcmFtcykgPT0gQzJfT0sKKyAgICAgICAgICAgICAgICAmJiBoZWFwUGFyYW1zLnNpemUoKSA9PSAxdSkgeworICAgICAgICAgICAgcGl4ZWxGb3JtYXRJbmZvID0gQzJTdG9yZUZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yc0luZm86OkZyb20oCisgICAgICAgICAgICAgICAgICAgIGhlYXBQYXJhbXNbMF0uZ2V0KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGl4ZWxGb3JtYXRJbmZvID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAocGl4ZWxGb3JtYXRJbmZvICYmICpwaXhlbEZvcm1hdEluZm8pIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGl4ZWxGb3JtYXRJbmZvLT5mbGV4Q291bnQoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgQzJGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvclN0cnVjdCAmZGVzYyA9CisgICAgICAgICAgICAgICAgICAgIHBpeGVsRm9ybWF0SW5mby0+bS52YWx1ZXNbaV07CisgICAgICAgICAgICAgICAgaWYgKGRlc2MuYml0RGVwdGggIT0gOAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGVzYy5zdWJzYW1wbGluZyAhPSBDMkNvbG9yOjpZVVZfNDIwCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMTgwMDc2MTA1KTogc29tZSBkZXZpY2VzIHJlcG9ydCB3cm9uZyBsYXlvdXRzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB8fCBkZXNjLmxheW91dCA9PSBDMkNvbG9yOjpJTlRFUkxFQVZFRF9QQUNLRUQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHx8IGRlc2MubGF5b3V0ID09IEMyQ29sb3I6OklOVEVSTEVBVkVEX0FMSUdORUQKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlc2MubGF5b3V0ID09IEMyQ29sb3I6OlVOS05PV05fTEFZT1VUKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmbGV4UGl4ZWxGb3JtYXRzLnB1c2hfYmFjayhkZXNjLnBpeGVsRm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAodWludDMyX3QgcGl4ZWxGb3JtYXQgOiBmbGV4UGl4ZWxGb3JtYXRzKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSYXdHcmFwaGljT3V0cHV0QnVmZmVycz4gYnVmZmVycyA9CisgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzPigKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZ1ByaW50ZigidGVzdCBwaXhlbCBmb3JtYXQgMHgleCIsIHBpeGVsRm9ybWF0KS5jX3N0cigpKTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0e25ldyBBTWVzc2FnZX07CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX1dJRFRILCBrV2lkdGgpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKEtFWV9IRUlHSFQsIGtIZWlnaHQpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9GT1JNQVQsIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlKTsKKyAgICAgICAgaW50MzJfdCBmd2tQaXhlbEZvcm1hdCA9IDA7CisgICAgICAgIGlmIChDMk1hcHBlcjo6bWFwUGl4ZWxGb3JtYXRDb2RlY1RvRnJhbWV3b3JrKHBpeGVsRm9ybWF0LCAmZndrUGl4ZWxGb3JtYXQpKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJhbmRyb2lkLl9jb2xvci1mb3JtYXQiLCBmd2tQaXhlbEZvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVycy0+c2V0Rm9ybWF0KGZvcm1hdCk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwb29sOworICAgICAgICBBU1NFUlRfRVEoT0ssIEdldENvZGVjMkJsb2NrUG9vbChDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQywgbnVsbHB0ciwgJnBvb2wpKTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOworICAgICAgICBBU1NFUlRfRVEoT0ssIHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgICAgIGtXaWR0aCwga0hlaWdodCwgcGl4ZWxGb3JtYXQsCisgICAgICAgICAgICAgICAgQzJNZW1vcnlVc2FnZXtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSwgJmJsb2NrKSk7CisKKyAgICAgICAgeworICAgICAgICAgICAgQzJHcmFwaGljVmlldyB2aWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0ID0gdmlldy5sYXlvdXQoKTsKKworICAgICAgICAgICAgLy8gVmVyaWZ5IHRoZSBibG9jayBpcyBpbiBZVVY0MjAgZm9ybWF0CisgICAgICAgICAgICBBU1NFUlRfRVEoQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWLCBsYXlvdXQudHlwZSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoM3UsIGxheW91dC5udW1QbGFuZXMpOworICAgICAgICAgICAgY29uc3QgQzJQbGFuZUluZm8mIHlQbGFuZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgICAgICAgICAgY29uc3QgQzJQbGFuZUluZm8mIHVQbGFuZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICAgICAgY29uc3QgQzJQbGFuZUluZm8mIHZQbGFuZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworCisgICAgICAgICAgICAvLyBZIHBsYW5lCisgICAgICAgICAgICBBU1NFUlRfRVEoMXUsIHlQbGFuZS5jb2xTYW1wbGluZyk7CisgICAgICAgICAgICBBU1NFUlRfRVEoMXUsIHlQbGFuZS5yb3dTYW1wbGluZyk7CisgICAgICAgICAgICBBU1NFUlRfRVEoOHUsIHlQbGFuZS5hbGxvY2F0ZWREZXB0aCk7CisgICAgICAgICAgICBBU1NFUlRfRVEoOHUsIHlQbGFuZS5iaXREZXB0aCk7CisgICAgICAgICAgICBBU1NFUlRfRVEoMHUsIHlQbGFuZS5yaWdodFNoaWZ0KTsKKworICAgICAgICAgICAgLy8gVSBwbGFuZQorICAgICAgICAgICAgQVNTRVJUX0VRKDJ1LCB1UGxhbmUuY29sU2FtcGxpbmcpOworICAgICAgICAgICAgQVNTRVJUX0VRKDJ1LCB1UGxhbmUucm93U2FtcGxpbmcpOworICAgICAgICAgICAgQVNTRVJUX0VRKDh1LCB1UGxhbmUuYWxsb2NhdGVkRGVwdGgpOworICAgICAgICAgICAgQVNTRVJUX0VRKDh1LCB1UGxhbmUuYml0RGVwdGgpOworICAgICAgICAgICAgQVNTRVJUX0VRKDB1LCB1UGxhbmUucmlnaHRTaGlmdCk7CisKKyAgICAgICAgICAgIC8vIFYgcGxhbmUKKyAgICAgICAgICAgIEFTU0VSVF9FUSgydSwgdlBsYW5lLmNvbFNhbXBsaW5nKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgydSwgdlBsYW5lLnJvd1NhbXBsaW5nKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSg4dSwgdlBsYW5lLmFsbG9jYXRlZERlcHRoKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSg4dSwgdlBsYW5lLmJpdERlcHRoKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgwdSwgdlBsYW5lLnJpZ2h0U2hpZnQpOworCisgICAgICAgICAgICB1aW50OF90ICp5Um93UHRyID0gdmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgICAgICAgICAgdWludDhfdCAqdVJvd1B0ciA9IHZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnZSb3dQdHIgPSB2aWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisgICAgICAgICAgICBmb3IgKGludDMyX3Qgcm93ID0gMDsgcm93IDwga0hlaWdodDsgKytyb3cpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90ICp5UHRyID0geVJvd1B0cjsKKyAgICAgICAgICAgICAgICB1aW50OF90ICp1UHRyID0gdVJvd1B0cjsKKyAgICAgICAgICAgICAgICB1aW50OF90ICp2UHRyID0gdlJvd1B0cjsKKyAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgY29sID0gMDsgY29sIDwga1dpZHRoOyArK2NvbCkgeworICAgICAgICAgICAgICAgICAgICAqeVB0ciA9ICgocm93ICsgY29sKSAmIDB4RkYpOworICAgICAgICAgICAgICAgICAgICB5UHRyICs9IHlQbGFuZS5jb2xJbmM7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJvdyA8IGtIZWlnaHQgLyAyICYmIGNvbCA8IGtXaWR0aCAvIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICp1UHRyID0gKChyb3cgKyBjb2wgKyAxKSAmIDB4RkYpOworICAgICAgICAgICAgICAgICAgICAgICAgKnZQdHIgPSAoKHJvdyArIGNvbCArIDIpICYgMHhGRik7CisgICAgICAgICAgICAgICAgICAgICAgICB1UHRyICs9IHVQbGFuZS5jb2xJbmM7CisgICAgICAgICAgICAgICAgICAgICAgICB2UHRyICs9IHZQbGFuZS5jb2xJbmM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeVJvd1B0ciArPSB5UGxhbmUucm93SW5jOworICAgICAgICAgICAgICAgIGlmIChyb3cgPCBrSGVpZ2h0IC8gMikgeworICAgICAgICAgICAgICAgICAgICB1Um93UHRyICs9IHVQbGFuZS5yb3dJbmM7CisgICAgICAgICAgICAgICAgICAgIHZSb3dQdHIgKz0gdlBsYW5lLnJvd0luYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGMyQnVmZmVyID0gQzJCdWZmZXI6OkNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2stPnNoYXJlKAorICAgICAgICAgICAgICAgIGJsb2NrLT5jcm9wKCksIEMyRmVuY2V7fSkpOworICAgICAgICBzaXplX3QgaW5kZXg7CisgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGNsaWVudEJ1ZmZlcjsKKyAgICAgICAgQVNTRVJUX0VRKE9LLCBidWZmZXJzLT5yZWdpc3RlckJ1ZmZlcihjMkJ1ZmZlciwgJmluZGV4LCAmY2xpZW50QnVmZmVyKSk7CisgICAgICAgIEFTU0VSVF9ORShudWxscHRyLCBjbGllbnRCdWZmZXIpOworICAgICAgICBzcDxBQnVmZmVyPiBpbWFnZURhdGE7CisgICAgICAgIEFTU0VSVF9UUlVFKGNsaWVudEJ1ZmZlci0+Zm9ybWF0KCktPmZpbmRCdWZmZXIoImltYWdlLWRhdGEiLCAmaW1hZ2VEYXRhKSk7CisgICAgICAgIE1lZGlhSW1hZ2UyICppbWcgPSAoTWVkaWFJbWFnZTIgKilpbWFnZURhdGEtPmRhdGEoKTsKKyAgICAgICAgQVNTRVJUX0VRKE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1lVViwgaW1nLT5tVHlwZSk7CisgICAgICAgIEFTU0VSVF9FUSgzdSwgaW1nLT5tTnVtUGxhbmVzKTsKKyAgICAgICAgQVNTRVJUX0VRKGtXaWR0aCwgaW1nLT5tV2lkdGgpOworICAgICAgICBBU1NFUlRfRVEoa0hlaWdodCwgaW1nLT5tSGVpZ2h0KTsKKyAgICAgICAgQVNTRVJUX0VRKDh1LCBpbWctPm1CaXREZXB0aCk7CisgICAgICAgIEFTU0VSVF9FUSg4dSwgaW1nLT5tQml0RGVwdGhBbGxvY2F0ZWQpOworICAgICAgICBjb25zdCBNZWRpYUltYWdlMjo6UGxhbmVJbmZvICZ5UGxhbmUgPSBpbWctPm1QbGFuZVtNZWRpYUltYWdlMjo6WV07CisgICAgICAgIGNvbnN0IE1lZGlhSW1hZ2UyOjpQbGFuZUluZm8gJnVQbGFuZSA9IGltZy0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXTsKKyAgICAgICAgY29uc3QgTWVkaWFJbWFnZTI6OlBsYW5lSW5mbyAmdlBsYW5lID0gaW1nLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdOworICAgICAgICBBU1NFUlRfRVEoMXUsIHlQbGFuZS5tSG9yaXpTdWJzYW1wbGluZyk7CisgICAgICAgIEFTU0VSVF9FUSgxdSwgeVBsYW5lLm1WZXJ0U3Vic2FtcGxpbmcpOworICAgICAgICBBU1NFUlRfRVEoMnUsIHVQbGFuZS5tSG9yaXpTdWJzYW1wbGluZyk7CisgICAgICAgIEFTU0VSVF9FUSgydSwgdVBsYW5lLm1WZXJ0U3Vic2FtcGxpbmcpOworICAgICAgICBBU1NFUlRfRVEoMnUsIHZQbGFuZS5tSG9yaXpTdWJzYW1wbGluZyk7CisgICAgICAgIEFTU0VSVF9FUSgydSwgdlBsYW5lLm1WZXJ0U3Vic2FtcGxpbmcpOworCisgICAgICAgIHVpbnQ4X3QgKnlSb3dQdHIgPSBjbGllbnRCdWZmZXItPmRhdGEoKSArIHlQbGFuZS5tT2Zmc2V0OworICAgICAgICB1aW50OF90ICp1Um93UHRyID0gY2xpZW50QnVmZmVyLT5kYXRhKCkgKyB1UGxhbmUubU9mZnNldDsKKyAgICAgICAgdWludDhfdCAqdlJvd1B0ciA9IGNsaWVudEJ1ZmZlci0+ZGF0YSgpICsgdlBsYW5lLm1PZmZzZXQ7CisgICAgICAgIGZvciAoaW50MzJfdCByb3cgPSAwOyByb3cgPCBrSGVpZ2h0OyArK3JvdykgeworICAgICAgICAgICAgdWludDhfdCAqeVB0ciA9IHlSb3dQdHI7CisgICAgICAgICAgICB1aW50OF90ICp1UHRyID0gdVJvd1B0cjsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnZQdHIgPSB2Um93UHRyOworICAgICAgICAgICAgZm9yIChpbnQzMl90IGNvbCA9IDA7IGNvbCA8IGtXaWR0aDsgKytjb2wpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoKHJvdyArIGNvbCkgJiAweEZGLCAqeVB0cik7CisgICAgICAgICAgICAgICAgeVB0ciArPSB5UGxhbmUubUNvbEluYzsKKyAgICAgICAgICAgICAgICBpZiAocm93IDwga0hlaWdodCAvIDIgJiYgY29sIDwga1dpZHRoIC8gMikgeworICAgICAgICAgICAgICAgICAgICBBU1NFUlRfRVEoKHJvdyArIGNvbCArIDEpICYgMHhGRiwgKnVQdHIpOworICAgICAgICAgICAgICAgICAgICBBU1NFUlRfRVEoKHJvdyArIGNvbCArIDIpICYgMHhGRiwgKnZQdHIpOworICAgICAgICAgICAgICAgICAgICB1UHRyICs9IHVQbGFuZS5tQ29sSW5jOworICAgICAgICAgICAgICAgICAgICB2UHRyICs9IHZQbGFuZS5tQ29sSW5jOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHlSb3dQdHIgKz0geVBsYW5lLm1Sb3dJbmM7CisgICAgICAgICAgICBpZiAocm93IDwga0hlaWdodCAvIDIpIHsKKyAgICAgICAgICAgICAgICB1Um93UHRyICs9IHVQbGFuZS5tUm93SW5jOworICAgICAgICAgICAgICAgIHZSb3dQdHIgKz0gdlBsYW5lLm1Sb3dJbmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1QoUmF3R3JhcGhpY091dHB1dEJ1ZmZlcnNUZXN0LCBQMDEwQ29sb3JGb3JtYXQpIHsKKyAgICBjb25zdGV4cHIgaW50MzJfdCBrV2lkdGggPSAzMjA7CisgICAgY29uc3RleHByIGludDMyX3Qga0hlaWdodCA9IDI0MDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxSYXdHcmFwaGljT3V0cHV0QnVmZmVycz4gYnVmZmVycyA9CisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8UmF3R3JhcGhpY091dHB1dEJ1ZmZlcnM+KCJ0ZXN0IFAwMTAiKTsKKworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXR7bmV3IEFNZXNzYWdlfTsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9XSURUSCwga1dpZHRoKTsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9IRUlHSFQsIGtIZWlnaHQpOworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX0ZPUk1BVCwgQ09MT1JfRm9ybWF0WVVWUDAxMCk7CisgICAgaW50MzJfdCBmd2tQaXhlbEZvcm1hdCA9IDA7CisgICAgaWYgKEMyTWFwcGVyOjptYXBQaXhlbEZvcm1hdENvZGVjVG9GcmFtZXdvcmsoSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl9QMDEwLCAmZndrUGl4ZWxGb3JtYXQpKSB7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImFuZHJvaWQuX2NvbG9yLWZvcm1hdCIsIGZ3a1BpeGVsRm9ybWF0KTsKKyAgICB9CisgICAgYnVmZmVycy0+c2V0Rm9ybWF0KGZvcm1hdCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHBvb2w7CisgICAgQVNTRVJUX0VRKE9LLCBHZXRDb2RlYzJCbG9ja1Bvb2woQzJCbG9ja1Bvb2w6OkJBU0lDX0dSQVBISUMsIG51bGxwdHIsICZwb29sKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAga1dpZHRoLCBrSGVpZ2h0LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSX1AwMTAsCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdle0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9LCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgR1RFU1RfU0tJUCgpOworICAgIH0KKworICAgIHsKKyAgICAgICAgQzJHcmFwaGljVmlldyB2aWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBDMlBsYW5hckxheW91dCBsYXlvdXQgPSB2aWV3LmxheW91dCgpOworCisgICAgICAgIC8vIFZlcmlmeSB0aGUgYmxvY2sgaXMgaW4gWVVWNDIwIGZvcm1hdAorICAgICAgICBBU1NFUlRfRVEoQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWLCBsYXlvdXQudHlwZSk7CisgICAgICAgIEFTU0VSVF9FUSgzdSwgbGF5b3V0Lm51bVBsYW5lcyk7CisgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvJiB5UGxhbmUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgY29uc3QgQzJQbGFuZUluZm8mIHVQbGFuZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICBjb25zdCBDMlBsYW5lSW5mbyYgdlBsYW5lID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisKKyAgICAgICAgLy8gWSBwbGFuZQorICAgICAgICBBU1NFUlRfRVEoMXUsIHlQbGFuZS5jb2xTYW1wbGluZyk7CisgICAgICAgIEFTU0VSVF9FUSgxdSwgeVBsYW5lLnJvd1NhbXBsaW5nKTsKKyAgICAgICAgQVNTRVJUX0VRKDE2dSwgeVBsYW5lLmFsbG9jYXRlZERlcHRoKTsKKyAgICAgICAgQVNTRVJUX0VRKDEwdSwgeVBsYW5lLmJpdERlcHRoKTsKKyAgICAgICAgQVNTRVJUX0VRKDZ1LCB5UGxhbmUucmlnaHRTaGlmdCk7CisKKyAgICAgICAgLy8gVSBwbGFuZQorICAgICAgICBBU1NFUlRfRVEoMnUsIHVQbGFuZS5jb2xTYW1wbGluZyk7CisgICAgICAgIEFTU0VSVF9FUSgydSwgdVBsYW5lLnJvd1NhbXBsaW5nKTsKKyAgICAgICAgQVNTRVJUX0VRKDE2dSwgdVBsYW5lLmFsbG9jYXRlZERlcHRoKTsKKyAgICAgICAgQVNTRVJUX0VRKDEwdSwgdVBsYW5lLmJpdERlcHRoKTsKKyAgICAgICAgQVNTRVJUX0VRKDZ1LCB1UGxhbmUucmlnaHRTaGlmdCk7CisKKyAgICAgICAgLy8gViBwbGFuZQorICAgICAgICBBU1NFUlRfRVEoMnUsIHZQbGFuZS5jb2xTYW1wbGluZyk7CisgICAgICAgIEFTU0VSVF9FUSgydSwgdlBsYW5lLnJvd1NhbXBsaW5nKTsKKyAgICAgICAgQVNTRVJUX0VRKDE2dSwgdlBsYW5lLmFsbG9jYXRlZERlcHRoKTsKKyAgICAgICAgQVNTRVJUX0VRKDEwdSwgdlBsYW5lLmJpdERlcHRoKTsKKyAgICAgICAgQVNTRVJUX0VRKDZ1LCB2UGxhbmUucmlnaHRTaGlmdCk7CisKKyAgICAgICAgdWludDhfdCAqeVJvd1B0ciA9IHZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgdWludDhfdCAqdVJvd1B0ciA9IHZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgdWludDhfdCAqdlJvd1B0ciA9IHZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICAgICAgZm9yIChpbnQzMl90IHJvdyA9IDA7IHJvdyA8IGtIZWlnaHQ7ICsrcm93KSB7CisgICAgICAgICAgICB1aW50OF90ICp5UHRyID0geVJvd1B0cjsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnVQdHIgPSB1Um93UHRyOworICAgICAgICAgICAgdWludDhfdCAqdlB0ciA9IHZSb3dQdHI7CisgICAgICAgICAgICBmb3IgKGludDMyX3QgY29sID0gMDsgY29sIDwga1dpZHRoOyArK2NvbCkgeworICAgICAgICAgICAgICAgIHlQdHJbMF0gPSAoKHJvdyArIGNvbCkgJiAweDMpIDw8IDY7CisgICAgICAgICAgICAgICAgeVB0clsxXSA9ICgocm93ICsgY29sKSAmIDB4M0ZDKSA+PiAyOworICAgICAgICAgICAgICAgIHlQdHIgKz0geVBsYW5lLmNvbEluYzsKKworICAgICAgICAgICAgICAgIGlmIChyb3cgPCBrSGVpZ2h0IC8gMiAmJiBjb2wgPCBrV2lkdGggLyAyKSB7CisgICAgICAgICAgICAgICAgICAgIHVQdHJbMF0gPSAoKHJvdyArIGNvbCArIDEpICYgMHgzKSA8PCA2OworICAgICAgICAgICAgICAgICAgICB1UHRyWzFdID0gKChyb3cgKyBjb2wgKyAxKSAmIDB4M0ZDKSA+PiAyOworICAgICAgICAgICAgICAgICAgICB2UHRyWzBdID0gKChyb3cgKyBjb2wgKyAyKSAmIDB4MykgPDwgNjsKKyAgICAgICAgICAgICAgICAgICAgdlB0clsxXSA9ICgocm93ICsgY29sICsgMikgJiAweDNGQykgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgdVB0ciArPSB1UGxhbmUuY29sSW5jOworICAgICAgICAgICAgICAgICAgICB2UHRyICs9IHZQbGFuZS5jb2xJbmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgeVJvd1B0ciArPSB5UGxhbmUucm93SW5jOworICAgICAgICAgICAgaWYgKHJvdyA8IGtIZWlnaHQgLyAyKSB7CisgICAgICAgICAgICAgICAgdVJvd1B0ciArPSB1UGxhbmUucm93SW5jOworICAgICAgICAgICAgICAgIHZSb3dQdHIgKz0gdlBsYW5lLnJvd0luYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJCdWZmZXIgPSBDMkJ1ZmZlcjo6Q3JlYXRlR3JhcGhpY0J1ZmZlcihibG9jay0+c2hhcmUoCisgICAgICAgICAgICBibG9jay0+Y3JvcCgpLCBDMkZlbmNle30pKTsKKyAgICBzaXplX3QgaW5kZXg7CisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gY2xpZW50QnVmZmVyOworICAgIEFTU0VSVF9FUShPSywgYnVmZmVycy0+cmVnaXN0ZXJCdWZmZXIoYzJCdWZmZXIsICZpbmRleCwgJmNsaWVudEJ1ZmZlcikpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBjbGllbnRCdWZmZXIpOworICAgIHNwPEFCdWZmZXI+IGltYWdlRGF0YTsKKyAgICBBU1NFUlRfVFJVRShjbGllbnRCdWZmZXItPmZvcm1hdCgpLT5maW5kQnVmZmVyKCJpbWFnZS1kYXRhIiwgJmltYWdlRGF0YSkpOworICAgIE1lZGlhSW1hZ2UyICppbWcgPSAoTWVkaWFJbWFnZTIgKilpbWFnZURhdGEtPmRhdGEoKTsKKyAgICBBU1NFUlRfRVEoTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfWVVWLCBpbWctPm1UeXBlKTsKKyAgICBBU1NFUlRfRVEoM3UsIGltZy0+bU51bVBsYW5lcyk7CisgICAgQVNTRVJUX0VRKGtXaWR0aCwgaW1nLT5tV2lkdGgpOworICAgIEFTU0VSVF9FUShrSGVpZ2h0LCBpbWctPm1IZWlnaHQpOworICAgIEFTU0VSVF9FUSgxMHUsIGltZy0+bUJpdERlcHRoKTsKKyAgICBBU1NFUlRfRVEoMTZ1LCBpbWctPm1CaXREZXB0aEFsbG9jYXRlZCk7CisgICAgY29uc3QgTWVkaWFJbWFnZTI6OlBsYW5lSW5mbyAmeVBsYW5lID0gaW1nLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlldOworICAgIGNvbnN0IE1lZGlhSW1hZ2UyOjpQbGFuZUluZm8gJnVQbGFuZSA9IGltZy0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXTsKKyAgICBjb25zdCBNZWRpYUltYWdlMjo6UGxhbmVJbmZvICZ2UGxhbmUgPSBpbWctPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl07CisgICAgQVNTRVJUX0VRKDF1LCB5UGxhbmUubUhvcml6U3Vic2FtcGxpbmcpOworICAgIEFTU0VSVF9FUSgxdSwgeVBsYW5lLm1WZXJ0U3Vic2FtcGxpbmcpOworICAgIEFTU0VSVF9FUSgydSwgdVBsYW5lLm1Ib3JpelN1YnNhbXBsaW5nKTsKKyAgICBBU1NFUlRfRVEoMnUsIHVQbGFuZS5tVmVydFN1YnNhbXBsaW5nKTsKKyAgICBBU1NFUlRfRVEoMnUsIHZQbGFuZS5tSG9yaXpTdWJzYW1wbGluZyk7CisgICAgQVNTRVJUX0VRKDJ1LCB2UGxhbmUubVZlcnRTdWJzYW1wbGluZyk7CisKKyAgICB1aW50OF90ICp5Um93UHRyID0gY2xpZW50QnVmZmVyLT5kYXRhKCkgKyB5UGxhbmUubU9mZnNldDsKKyAgICB1aW50OF90ICp1Um93UHRyID0gY2xpZW50QnVmZmVyLT5kYXRhKCkgKyB1UGxhbmUubU9mZnNldDsKKyAgICB1aW50OF90ICp2Um93UHRyID0gY2xpZW50QnVmZmVyLT5kYXRhKCkgKyB2UGxhbmUubU9mZnNldDsKKyAgICBmb3IgKGludDMyX3Qgcm93ID0gMDsgcm93IDwga0hlaWdodDsgKytyb3cpIHsKKyAgICAgICAgdWludDhfdCAqeVB0ciA9IHlSb3dQdHI7CisgICAgICAgIHVpbnQ4X3QgKnVQdHIgPSB1Um93UHRyOworICAgICAgICB1aW50OF90ICp2UHRyID0gdlJvd1B0cjsKKyAgICAgICAgZm9yIChpbnQzMl90IGNvbCA9IDA7IGNvbCA8IGtXaWR0aDsgKytjb2wpIHsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgoKHJvdyArIGNvbCkgJiAweDMpIDw8IDYsIHlQdHJbMF0pOworICAgICAgICAgICAgQVNTRVJUX0VRKCgocm93ICsgY29sKSAmIDB4M0ZDKSA+PiAyLCB5UHRyWzFdKTsKKyAgICAgICAgICAgIHlQdHIgKz0geVBsYW5lLm1Db2xJbmM7CisgICAgICAgICAgICBpZiAocm93IDwga0hlaWdodCAvIDIgJiYgY29sIDwga1dpZHRoIC8gMikgeworICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgoKHJvdyArIGNvbCArIDEpICYgMHgzKSA8PCA2LCB1UHRyWzBdKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoKChyb3cgKyBjb2wgKyAxKSAmIDB4M0ZDKSA+PiAyLCB1UHRyWzFdKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoKChyb3cgKyBjb2wgKyAyKSAmIDB4MykgPDwgNiwgdlB0clswXSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKCgocm93ICsgY29sICsgMikgJiAweDNGQykgPj4gMiwgdlB0clsxXSk7CisgICAgICAgICAgICAgICAgdVB0ciArPSB1UGxhbmUubUNvbEluYzsKKyAgICAgICAgICAgICAgICB2UHRyICs9IHZQbGFuZS5tQ29sSW5jOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHlSb3dQdHIgKz0geVBsYW5lLm1Sb3dJbmM7CisgICAgICAgIGlmIChyb3cgPCBrSGVpZ2h0IC8gMikgeworICAgICAgICAgICAgdVJvd1B0ciArPSB1UGxhbmUubVJvd0luYzsKKyAgICAgICAgICAgIHZSb3dQdHIgKz0gdlBsYW5lLm1Sb3dJbmM7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2NsYXNzIFRlc3RHcmFwaGljQWxsb2NhdGlvbiA6IHB1YmxpYyBDMkdyYXBoaWNBbGxvY2F0aW9uIHsKK3B1YmxpYzoKKyAgICBUZXN0R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQsCisgICAgICAgICAgICBzaXplX3QgY2FwYWNpdHksCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IG9mZnNldHMpCisgICAgICAgIDogQzJHcmFwaGljQWxsb2NhdGlvbih3aWR0aCwgaGVpZ2h0KSwKKyAgICAgICAgICBtTGF5b3V0KGxheW91dCksCisgICAgICAgICAgbU1lbW9yeShjYXBhY2l0eSwgMHhBQSksCisgICAgICAgICAgbU9mZnNldHMob2Zmc2V0cykgeworICAgIH0KKworICAgIGMyX3N0YXR1c190IG1hcCgKKyAgICAgICAgICAgIEMyUmVjdCByZWN0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlICpmZW5jZSwKKyAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0ICpsYXlvdXQsIHVpbnQ4X3QgKiphZGRyKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKXJlY3Q7CisgICAgICAgICh2b2lkKXVzYWdlOworICAgICAgICAodm9pZClmZW5jZTsKKyAgICAgICAgKmxheW91dCA9IG1MYXlvdXQ7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUxheW91dC5udW1QbGFuZXM7ICsraSkgeworICAgICAgICAgICAgYWRkcltpXSA9IG1NZW1vcnkuZGF0YSgpICsgbU9mZnNldHNbaV07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHVubWFwKHVpbnQ4X3QgKiosIEMyUmVjdCwgQzJGZW5jZSAqKSBvdmVycmlkZSB7IHJldHVybiBDMl9PSzsgfQorCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAtMTsgfQorCisgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG51bGxwdHI7IH0KKworICAgIGJvb2wgZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNBbGxvY2F0aW9uPiAmb3RoZXIpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG90aGVyLmdldCgpID09IHRoaXM7CisgICAgfQorCitwcml2YXRlOgorICAgIEMyUGxhbmFyTGF5b3V0IG1MYXlvdXQ7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbU1lbW9yeTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90ICo+IG1BZGRyOworICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gbU9mZnNldHM7Cit9OworCitjbGFzcyBMYXlvdXRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnR1cGxlPGJvb2wsIHN0ZDo6c3RyaW5nLCBib29sLCBpbnQzMl90Pj4geworcHJpdmF0ZToKKyAgICBzdGF0aWMgQzJQbGFuYXJMYXlvdXQgWVVWUGxhbmFyTGF5b3V0KGludDMyX3Qgc3RyaWRlKSB7CisgICAgICAgIEMyUGxhbmFyTGF5b3V0IGxheW91dCA9IHsKKyAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVViwKKyAgICAgICAgICAgIDMsICAvKiBudW1QbGFuZXMgKi8KKyAgICAgICAgICAgIDMsICAvKiByb290UGxhbmVzICovCisgICAgICAgICAgICB7fSwgIC8qIHBsYW5lcyAtLS0gdG8gYmUgZmlsbGVkIGJlbG93ICovCisgICAgICAgIH07CisgICAgICAgIGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0geworICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfWSwKKyAgICAgICAgICAgIDEsICAvKiBjb2xJbmMgKi8KKyAgICAgICAgICAgIHN0cmlkZSwgIC8qIHJvd0luYyAqLworICAgICAgICAgICAgMSwgIC8qIGNvbFNhbXBsaW5nICovCisgICAgICAgICAgICAxLCAgLyogcm93U2FtcGxpbmcgKi8KKyAgICAgICAgICAgIDgsICAvKiBhbGxvY2F0ZWREZXB0aCAqLworICAgICAgICAgICAgOCwgIC8qIGJpdERlcHRoICovCisgICAgICAgICAgICAwLCAgLyogcmlnaHRTaGlmdCAqLworICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwKKyAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZLCAgLyogcm9vdEl4ICovCisgICAgICAgICAgICAwLCAgLyogb2Zmc2V0ICovCisgICAgICAgIH07CisgICAgICAgIGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdID0geworICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IsCisgICAgICAgICAgICAxLCAgLyogY29sSW5jICovCisgICAgICAgICAgICBzdHJpZGUgLyAyLCAgLyogcm93SW5jICovCisgICAgICAgICAgICAyLCAgLyogY29sU2FtcGxpbmcgKi8KKyAgICAgICAgICAgIDIsICAvKiByb3dTYW1wbGluZyAqLworICAgICAgICAgICAgOCwgIC8qIGFsbG9jYXRlZERlcHRoICovCisgICAgICAgICAgICA4LCAgLyogYml0RGVwdGggKi8KKyAgICAgICAgICAgIDAsICAvKiByaWdodFNoaWZ0ICovCisgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLAorICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1UsICAvKiByb290SXggKi8KKyAgICAgICAgICAgIDAsICAvKiBvZmZzZXQgKi8KKyAgICAgICAgfTsKKyAgICAgICAgbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0gPSB7CisgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUiwKKyAgICAgICAgICAgIDEsICAvKiBjb2xJbmMgKi8KKyAgICAgICAgICAgIHN0cmlkZSAvIDIsICAvKiByb3dJbmMgKi8KKyAgICAgICAgICAgIDIsICAvKiBjb2xTYW1wbGluZyAqLworICAgICAgICAgICAgMiwgIC8qIHJvd1NhbXBsaW5nICovCisgICAgICAgICAgICA4LCAgLyogYWxsb2NhdGVkRGVwdGggKi8KKyAgICAgICAgICAgIDgsICAvKiBiaXREZXB0aCAqLworICAgICAgICAgICAgMCwgIC8qIHJpZ2h0U2hpZnQgKi8KKyAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsCisgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfViwgIC8qIHJvb3RJeCAqLworICAgICAgICAgICAgMCwgIC8qIG9mZnNldCAqLworICAgICAgICB9OworICAgICAgICByZXR1cm4gbGF5b3V0OworICAgIH0KKworICAgIHN0YXRpYyBDMlBsYW5hckxheW91dCBZVVZTZW1pUGxhbmFyTGF5b3V0KGludDMyX3Qgc3RyaWRlKSB7CisgICAgICAgIEMyUGxhbmFyTGF5b3V0IGxheW91dCA9IHsKKyAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVViwKKyAgICAgICAgICAgIDMsICAvKiBudW1QbGFuZXMgKi8KKyAgICAgICAgICAgIDIsICAvKiByb290UGxhbmVzICovCisgICAgICAgICAgICB7fSwgIC8qIHBsYW5lcyAtLS0gdG8gYmUgZmlsbGVkIGJlbG93ICovCisgICAgICAgIH07CisgICAgICAgIGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0geworICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfWSwKKyAgICAgICAgICAgIDEsICAvKiBjb2xJbmMgKi8KKyAgICAgICAgICAgIHN0cmlkZSwgIC8qIHJvd0luYyAqLworICAgICAgICAgICAgMSwgIC8qIGNvbFNhbXBsaW5nICovCisgICAgICAgICAgICAxLCAgLyogcm93U2FtcGxpbmcgKi8KKyAgICAgICAgICAgIDgsICAvKiBhbGxvY2F0ZWREZXB0aCAqLworICAgICAgICAgICAgOCwgIC8qIGJpdERlcHRoICovCisgICAgICAgICAgICAwLCAgLyogcmlnaHRTaGlmdCAqLworICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwKKyAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZLCAgLyogcm9vdEl4ICovCisgICAgICAgICAgICAwLCAgLyogb2Zmc2V0ICovCisgICAgICAgIH07CisgICAgICAgIGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdID0geworICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IsCisgICAgICAgICAgICAyLCAgLyogY29sSW5jICovCisgICAgICAgICAgICBzdHJpZGUsICAvKiByb3dJbmMgKi8KKyAgICAgICAgICAgIDIsICAvKiBjb2xTYW1wbGluZyAqLworICAgICAgICAgICAgMiwgIC8qIHJvd1NhbXBsaW5nICovCisgICAgICAgICAgICA4LCAgLyogYWxsb2NhdGVkRGVwdGggKi8KKyAgICAgICAgICAgIDgsICAvKiBiaXREZXB0aCAqLworICAgICAgICAgICAgMCwgIC8qIHJpZ2h0U2hpZnQgKi8KKyAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsCisgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfVSwgIC8qIHJvb3RJeCAqLworICAgICAgICAgICAgMCwgIC8qIG9mZnNldCAqLworICAgICAgICB9OworICAgICAgICBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9IHsKKyAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NSLAorICAgICAgICAgICAgMiwgIC8qIGNvbEluYyAqLworICAgICAgICAgICAgc3RyaWRlLCAgLyogcm93SW5jICovCisgICAgICAgICAgICAyLCAgLyogY29sU2FtcGxpbmcgKi8KKyAgICAgICAgICAgIDIsICAvKiByb3dTYW1wbGluZyAqLworICAgICAgICAgICAgOCwgIC8qIGFsbG9jYXRlZERlcHRoICovCisgICAgICAgICAgICA4LCAgLyogYml0RGVwdGggKi8KKyAgICAgICAgICAgIDAsICAvKiByaWdodFNoaWZ0ICovCisgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLAorICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1UsICAvKiByb290SXggKi8KKyAgICAgICAgICAgIDEsICAvKiBvZmZzZXQgKi8KKyAgICAgICAgfTsKKyAgICAgICAgcmV0dXJuIGxheW91dDsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJQbGFuYXJMYXlvdXQgWVZVU2VtaVBsYW5hckxheW91dChpbnQzMl90IHN0cmlkZSkgeworICAgICAgICBDMlBsYW5hckxheW91dCBsYXlvdXQgPSB7CisgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVYsCisgICAgICAgICAgICAzLCAgLyogbnVtUGxhbmVzICovCisgICAgICAgICAgICAyLCAgLyogcm9vdFBsYW5lcyAqLworICAgICAgICAgICAge30sICAvKiBwbGFuZXMgLS0tIHRvIGJlIGZpbGxlZCBiZWxvdyAqLworICAgICAgICB9OworICAgICAgICBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSA9IHsKKyAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX1ksCisgICAgICAgICAgICAxLCAgLyogY29sSW5jICovCisgICAgICAgICAgICBzdHJpZGUsICAvKiByb3dJbmMgKi8KKyAgICAgICAgICAgIDEsICAvKiBjb2xTYW1wbGluZyAqLworICAgICAgICAgICAgMSwgIC8qIHJvd1NhbXBsaW5nICovCisgICAgICAgICAgICA4LCAgLyogYWxsb2NhdGVkRGVwdGggKi8KKyAgICAgICAgICAgIDgsICAvKiBiaXREZXB0aCAqLworICAgICAgICAgICAgMCwgIC8qIHJpZ2h0U2hpZnQgKi8KKyAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsCisgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgIC8qIHJvb3RJeCAqLworICAgICAgICAgICAgMCwgIC8qIG9mZnNldCAqLworICAgICAgICB9OworICAgICAgICBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSA9IHsKKyAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NCLAorICAgICAgICAgICAgMiwgIC8qIGNvbEluYyAqLworICAgICAgICAgICAgc3RyaWRlLCAgLyogcm93SW5jICovCisgICAgICAgICAgICAyLCAgLyogY29sU2FtcGxpbmcgKi8KKyAgICAgICAgICAgIDIsICAvKiByb3dTYW1wbGluZyAqLworICAgICAgICAgICAgOCwgIC8qIGFsbG9jYXRlZERlcHRoICovCisgICAgICAgICAgICA4LCAgLyogYml0RGVwdGggKi8KKyAgICAgICAgICAgIDAsICAvKiByaWdodFNoaWZ0ICovCisgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLAorICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1YsICAvKiByb290SXggKi8KKyAgICAgICAgICAgIDEsICAvKiBvZmZzZXQgKi8KKyAgICAgICAgfTsKKyAgICAgICAgbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0gPSB7CisgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUiwKKyAgICAgICAgICAgIDIsICAvKiBjb2xJbmMgKi8KKyAgICAgICAgICAgIHN0cmlkZSwgIC8qIHJvd0luYyAqLworICAgICAgICAgICAgMiwgIC8qIGNvbFNhbXBsaW5nICovCisgICAgICAgICAgICAyLCAgLyogcm93U2FtcGxpbmcgKi8KKyAgICAgICAgICAgIDgsICAvKiBhbGxvY2F0ZWREZXB0aCAqLworICAgICAgICAgICAgOCwgIC8qIGJpdERlcHRoICovCisgICAgICAgICAgICAwLCAgLyogcmlnaHRTaGlmdCAqLworICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwKKyAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9WLCAgLyogcm9vdEl4ICovCisgICAgICAgICAgICAwLCAgLyogb2Zmc2V0ICovCisgICAgICAgIH07CisgICAgICAgIHJldHVybiBsYXlvdXQ7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gQ3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0LAorICAgICAgICAgICAgc2l6ZV90IGNhcGFjaXR5LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBvZmZzZXRzKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdEdyYXBoaWNBbGxvY2F0aW9uPigKKyAgICAgICAgICAgICAgICB3aWR0aCwKKyAgICAgICAgICAgICAgICBoZWlnaHQsCisgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgICAgICAgICAgICAgIGNhcGFjaXR5LAorICAgICAgICAgICAgICAgIG9mZnNldHMpOworCisgICAgICAgIHJldHVybiBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYyk7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IEdldFBpeGVsVmFsdWUodWludDhfdCB2YWx1ZSwgdWludDMyX3Qgcm93LCB1aW50MzJfdCBjb2wpIHsKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCh2YWx1ZSkgKiByb3cgKyBjb2wpICYgMHhGRjsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBGaWxsUGxhbmUoQzJHcmFwaGljVmlldyAmdmlldywgc2l6ZV90IGluZGV4LCB1aW50OF90IHZhbHVlKSB7CisgICAgICAgIEMyUGxhbmFyTGF5b3V0IGxheW91dCA9IHZpZXcubGF5b3V0KCk7CisKKyAgICAgICAgdWludDhfdCAqcm93UHRyID0gdmlldy5kYXRhKClbaW5kZXhdOworICAgICAgICBDMlBsYW5lSW5mbyBwbGFuZSA9IGxheW91dC5wbGFuZXNbaW5kZXhdOworICAgICAgICBmb3IgKHVpbnQzMl90IHJvdyA9IDA7IHJvdyA8IHZpZXcuaGVpZ2h0KCkgLyBwbGFuZS5yb3dTYW1wbGluZzsgKytyb3cpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmNvbFB0ciA9IHJvd1B0cjsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgY29sID0gMDsgY29sIDwgdmlldy53aWR0aCgpIC8gcGxhbmUuY29sU2FtcGxpbmc7ICsrY29sKSB7CisgICAgICAgICAgICAgICAgKmNvbFB0ciA9IEdldFBpeGVsVmFsdWUodmFsdWUsIHJvdywgY29sKTsKKyAgICAgICAgICAgICAgICBjb2xQdHIgKz0gcGxhbmUuY29sSW5jOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcm93UHRyICs9IHBsYW5lLnJvd0luYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIEZpbGxCbG9jayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaykgeworICAgICAgICBDMkdyYXBoaWNWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisKKyAgICAgICAgRmlsbFBsYW5lKHZpZXcsIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZLCAnWScpOworICAgICAgICBGaWxsUGxhbmUodmlldywgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1UsICdVJyk7CisgICAgICAgIEZpbGxQbGFuZSh2aWV3LCBDMlBsYW5hckxheW91dDo6UExBTkVfViwgJ1YnKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBWZXJpZnlQbGFuZSgKKyAgICAgICAgICAgIGNvbnN0IE1lZGlhSW1hZ2UyICptZWRpYUltYWdlLAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYmFzZSwKKyAgICAgICAgICAgIHVpbnQzMl90IGluZGV4LAorICAgICAgICAgICAgdWludDhfdCB2YWx1ZSwKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nICplcnJvck1zZykgeworICAgICAgICAqZXJyb3JNc2cgPSAiIjsKKyAgICAgICAgTWVkaWFJbWFnZTI6OlBsYW5lSW5mbyBwbGFuZSA9IG1lZGlhSW1hZ2UtPm1QbGFuZVtpbmRleF07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJvd1B0ciA9IGJhc2UgKyBwbGFuZS5tT2Zmc2V0OworICAgICAgICBmb3IgKHVpbnQzMl90IHJvdyA9IDA7IHJvdyA8IG1lZGlhSW1hZ2UtPm1IZWlnaHQgLyBwbGFuZS5tVmVydFN1YnNhbXBsaW5nOyArK3JvdykgeworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY29sUHRyID0gcm93UHRyOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBjb2wgPSAwOyBjb2wgPCBtZWRpYUltYWdlLT5tV2lkdGggLyBwbGFuZS5tSG9yaXpTdWJzYW1wbGluZzsgKytjb2wpIHsKKyAgICAgICAgICAgICAgICBpZiAoR2V0UGl4ZWxWYWx1ZSh2YWx1ZSwgcm93LCBjb2wpICE9ICpjb2xQdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgKmVycm9yTXNnID0gQVN0cmluZ1ByaW50Zigicm93PSV1IGNvbD0ldSBleHBlY3RlZD0lMDJ4IGFjdHVhbD0lMDJ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3csIGNvbCwgR2V0UGl4ZWxWYWx1ZSh2YWx1ZSwgcm93LCBjb2wpLCAqY29sUHRyKS5jX3N0cigpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbFB0ciArPSBwbGFuZS5tQ29sSW5jOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcm93UHRyICs9IHBsYW5lLm1Sb3dJbmM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtXaWR0aCA9IDMyMDsKKyAgICBzdGF0aWMgY29uc3RleHByIGludDMyX3Qga0hlaWdodCA9IDI0MDsKKyAgICBzdGF0aWMgY29uc3RleHByIGludDMyX3Qga0dhcExlbmd0aCA9IGtXaWR0aCAqIGtIZWlnaHQgKiAxMDsKKworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IENyZWF0ZUFuZEZpbGxCdWZmZXJGcm9tUGFyYW0oY29uc3QgUGFyYW1UeXBlICZwYXJhbSkgeworICAgICAgICBib29sIGNvbnRpZ3VvdXMgPSBzdGQ6OmdldDwwPihwYXJhbSk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHBsYW5lT3JkZXJTdHIgPSBzdGQ6OmdldDwxPihwYXJhbSk7CisgICAgICAgIGJvb2wgcGxhbmFyID0gc3RkOjpnZXQ8Mj4ocGFyYW0pOworICAgICAgICBpbnQzMl90IHN0cmlkZSA9IHN0ZDo6Z2V0PDM+KHBhcmFtKTsKKworICAgICAgICBDMlBsYW5hckxheW91dDo6cGxhbmVfaW5kZXhfdCBwbGFuZU9yZGVyWzNdOworICAgICAgICBDMlBsYW5hckxheW91dCBsYXlvdXQ7CisKKyAgICAgICAgaWYgKHBsYW5lT3JkZXJTdHIuc2l6ZSgpICE9IDMpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6cGxhbmVfaW5kZXhfdCBwbGFuZUluZGV4OworICAgICAgICAgICAgc3dpdGNoIChwbGFuZU9yZGVyU3RyW2ldKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnWSc6IHBsYW5lSW5kZXggPSBDMlBsYW5hckxheW91dDo6UExBTkVfWTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnVSc6IHBsYW5lSW5kZXggPSBDMlBsYW5hckxheW91dDo6UExBTkVfVTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnVic6IHBsYW5lSW5kZXggPSBDMlBsYW5hckxheW91dDo6UExBTkVfVjsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGxhbmVPcmRlcltpXSA9IHBsYW5lSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGxhbmFyKSB7CisgICAgICAgICAgICBsYXlvdXQgPSBZVVZQbGFuYXJMYXlvdXQoc3RyaWRlKTsKKyAgICAgICAgfSBlbHNlIHsgIC8vIHNlbWktcGxhbmFyCisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChwbGFuZU9yZGVyW2ldID09IEMyUGxhbmFyTGF5b3V0OjpQTEFORV9VKSB7CisgICAgICAgICAgICAgICAgICAgIGxheW91dCA9IFlVVlNlbWlQbGFuYXJMYXlvdXQoc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwbGFuZU9yZGVyW2ldID09IEMyUGxhbmFyTGF5b3V0OjpQTEFORV9WKSB7CisgICAgICAgICAgICAgICAgICAgIGxheW91dCA9IFlWVVNlbWlQbGFuYXJMYXlvdXQoc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNpemVfdCB5UGxhbmVTaXplID0gc3RyaWRlICoga0hlaWdodDsKKyAgICAgICAgc2l6ZV90IHV2UGxhbmVTaXplID0gc3RyaWRlICoga0hlaWdodCAvIDQ7CisgICAgICAgIHNpemVfdCBjYXBhY2l0eSA9IHlQbGFuZVNpemUgKyB1dlBsYW5lU2l6ZSAqIDI7CisgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gb2Zmc2V0cygzKTsKKworICAgICAgICBpZiAoIWNvbnRpZ3VvdXMpIHsKKyAgICAgICAgICAgIGlmIChwbGFuYXIpIHsKKyAgICAgICAgICAgICAgICBjYXBhY2l0eSArPSBrR2FwTGVuZ3RoICogMjsKKyAgICAgICAgICAgIH0gZWxzZSB7ICAvLyBzZW1pLXBsYW5hcgorICAgICAgICAgICAgICAgIGNhcGFjaXR5ICs9IGtHYXBMZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXRzW3BsYW5lT3JkZXJbMF1dID0gMDsKKyAgICAgICAgc2l6ZV90IHBsYW5lU2l6ZSA9IChwbGFuZU9yZGVyWzBdID09IEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZKSA/IHlQbGFuZVNpemUgOiB1dlBsYW5lU2l6ZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgICAgIG9mZnNldHNbcGxhbmVPcmRlcltpXV0gPSBvZmZzZXRzW3BsYW5lT3JkZXJbaSAtIDFdXSArIHBsYW5lU2l6ZTsKKyAgICAgICAgICAgIGlmICghY29udGlndW91cykgeworICAgICAgICAgICAgICAgIG9mZnNldHNbcGxhbmVPcmRlcltpXV0gKz0ga0dhcExlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBsYW5lU2l6ZSA9IChwbGFuZU9yZGVyW2ldID09IEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZKSA/IHlQbGFuZVNpemUgOiB1dlBsYW5lU2l6ZTsKKyAgICAgICAgICAgIGlmICghcGxhbmFyICAvLyBzZW1pLXBsYW5hcgorICAgICAgICAgICAgICAgICAgICAmJiBwbGFuZU9yZGVyW2kgLSAxXSAhPSBDMlBsYW5hckxheW91dDo6UExBTkVfWQorICAgICAgICAgICAgICAgICAgICAmJiBwbGFuZU9yZGVyW2ldICE9IEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZKSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0c1twbGFuZU9yZGVyW2ldXSA9IG9mZnNldHNbcGxhbmVPcmRlcltpIC0gMV1dICsgMTsKKyAgICAgICAgICAgICAgICBwbGFuZVNpemUgPSB1dlBsYW5lU2l6ZSAqIDIgLSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jayA9IENyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgICAgICBrV2lkdGgsCisgICAgICAgICAgICAgICAga0hlaWdodCwKKyAgICAgICAgICAgICAgICBsYXlvdXQsCisgICAgICAgICAgICAgICAgY2FwYWNpdHksCisgICAgICAgICAgICAgICAgb2Zmc2V0cyk7CisgICAgICAgIEZpbGxCbG9jayhibG9jayk7CisgICAgICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICBibG9jay0+c2hhcmUoYmxvY2stPmNyb3AoKSwgQzJGZW5jZSgpKSk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgVmVyaWZ5Q2xpZW50QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgc3RkOjpzdHJpbmcgKmVycm9yTXNnKSB7CisgICAgICAgICplcnJvck1zZyA9ICIiOworICAgICAgICBzcDxBQnVmZmVyPiBpbWFnZURhdGE7CisgICAgICAgIGlmICghYnVmZmVyLT5mb3JtYXQoKS0+ZmluZEJ1ZmZlcigiaW1hZ2UtZGF0YSIsICZpbWFnZURhdGEpKSB7CisgICAgICAgICAgICAqZXJyb3JNc2cgPSAiTWlzc2luZyBpbWFnZSBkYXRhIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBNZWRpYUltYWdlMiAqbWVkaWFJbWFnZSA9IChNZWRpYUltYWdlMiAqKWltYWdlRGF0YS0+ZGF0YSgpOworICAgICAgICBpZiAobWVkaWFJbWFnZS0+bVR5cGUgIT0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfWVVWKSB7CisgICAgICAgICAgICAqZXJyb3JNc2cgPSBBU3RyaW5nUHJpbnRmKCJVbmV4cGVjdGVkIHR5cGU6ICVkIiwgbWVkaWFJbWFnZS0+bVR5cGUpLmNfc3RyKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgcGxhbmVFcnJvck1zZzsKKyAgICAgICAgaWYgKCFWZXJpZnlQbGFuZShtZWRpYUltYWdlLCBidWZmZXItPmJhc2UoKSwgTWVkaWFJbWFnZTI6OlksICdZJywgJnBsYW5lRXJyb3JNc2cpKSB7CisgICAgICAgICAgICAqZXJyb3JNc2cgPSAiWSBwbGFuZSBkb2VzIG5vdCBtYXRjaDogIiArIHBsYW5lRXJyb3JNc2c7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFWZXJpZnlQbGFuZShtZWRpYUltYWdlLCBidWZmZXItPmJhc2UoKSwgTWVkaWFJbWFnZTI6OlUsICdVJywgJnBsYW5lRXJyb3JNc2cpKSB7CisgICAgICAgICAgICAqZXJyb3JNc2cgPSAiVSBwbGFuZSBkb2VzIG5vdCBtYXRjaDogIiArIHBsYW5lRXJyb3JNc2c7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFWZXJpZnlQbGFuZShtZWRpYUltYWdlLCBidWZmZXItPmJhc2UoKSwgTWVkaWFJbWFnZTI6OlYsICdWJywgJnBsYW5lRXJyb3JNc2cpKSB7CisgICAgICAgICAgICAqZXJyb3JNc2cgPSAiViBwbGFuZSBkb2VzIG5vdCBtYXRjaDogIiArIHBsYW5lRXJyb3JNc2c7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQsIHN0cmlkZTsKKyAgICAgICAgYnVmZmVyLT5mb3JtYXQoKS0+ZmluZEludDMyKEtFWV9XSURUSCwgJndpZHRoKTsKKyAgICAgICAgYnVmZmVyLT5mb3JtYXQoKS0+ZmluZEludDMyKEtFWV9IRUlHSFQsICZoZWlnaHQpOworICAgICAgICBidWZmZXItPmZvcm1hdCgpLT5maW5kSW50MzIoS0VZX1NUUklERSwgJnN0cmlkZSk7CisKKyAgICAgICAgTWVkaWFJbWFnZTIgbGVnYWN5WUxheW91dCA9IHsKKyAgICAgICAgICAgIE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1ksCisgICAgICAgICAgICAxLCAgLy8gbU51bVBsYW5lcworICAgICAgICAgICAgdWludDMyX3Qod2lkdGgpLAorICAgICAgICAgICAgdWludDMyX3QoaGVpZ2h0KSwKKyAgICAgICAgICAgIDgsCisgICAgICAgICAgICA4LAorICAgICAgICAgICAge30sICAvLyBtUGxhbmUKKyAgICAgICAgfTsKKyAgICAgICAgbGVnYWN5WUxheW91dC5tUGxhbmVbTWVkaWFJbWFnZTI6OlldID0geworICAgICAgICAgICAgMCwgIC8vIG1PZmZzZXQKKyAgICAgICAgICAgIDEsICAvLyBtQ29sSW5jCisgICAgICAgICAgICBzdHJpZGUsICAvLyBtUm93SW5jCisgICAgICAgICAgICAxLCAgLy8gbUhvcml6U3Vic2FtcGxpbmcKKyAgICAgICAgICAgIDEsICAvLyBtVmVydFN1YnNhbXBsaW5nCisgICAgICAgIH07CisgICAgICAgIGlmICghVmVyaWZ5UGxhbmUoJmxlZ2FjeVlMYXlvdXQsIGJ1ZmZlci0+ZGF0YSgpLCBNZWRpYUltYWdlMjo6WSwgJ1knLCAmcGxhbmVFcnJvck1zZykpIHsKKyAgICAgICAgICAgICplcnJvck1zZyA9ICJZIHBsYW5lIGJ5IGxlZ2FjeSBsYXlvdXQgZG9lcyBub3QgbWF0Y2g6ICIgKyBwbGFuZUVycm9yTXNnOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworfTsKKworVEVTVF9QKExheW91dFRlc3QsIFZlcmlmeUxheW91dCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxSYXdHcmFwaGljT3V0cHV0QnVmZmVycz4gYnVmZmVycyA9CisgICAgICAgIEdldFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzKGtXaWR0aCwga0hlaWdodCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGMyQnVmZmVyID0gQ3JlYXRlQW5kRmlsbEJ1ZmZlckZyb21QYXJhbShHZXRQYXJhbSgpKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYzJCdWZmZXIpOworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGNsaWVudEJ1ZmZlcjsKKyAgICBzaXplX3QgaW5kZXg7CisgICAgQVNTRVJUX0VRKE9LLCBidWZmZXJzLT5yZWdpc3RlckJ1ZmZlcihjMkJ1ZmZlciwgJmluZGV4LCAmY2xpZW50QnVmZmVyKSk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGNsaWVudEJ1ZmZlcik7CisgICAgc3RkOjpzdHJpbmcgZXJyb3JNc2c7CisgICAgQVNTRVJUX1RSVUUoVmVyaWZ5Q2xpZW50QnVmZmVyKGNsaWVudEJ1ZmZlciwgJmVycm9yTXNnKSkgPDwgZXJyb3JNc2c7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgUmF3R3JhcGhpY091dHB1dEJ1ZmZlcnNUZXN0LAorICAgICAgICBMYXlvdXRUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OkNvbWJpbmUoCisgICAgICAgICAgICA6OnRlc3Rpbmc6OkJvb2woKSwgIC8qIGNvbnRpZ3VvdXMgKi8KKyAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKCJZVVYiLCAiWVZVIiwgIlVWWSIsICJWVVkiKSwKKyAgICAgICAgICAgIDo6dGVzdGluZzo6Qm9vbCgpLCAgLyogcGxhbmFyICovCisgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygzMjAsIDUxMikpLAorICAgICAgICBbXShjb25zdCA6OnRlc3Rpbmc6OlRlc3RQYXJhbUluZm88TGF5b3V0VGVzdDo6UGFyYW1UeXBlPiAmaW5mbykgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29udGlndW91cyA9IHN0ZDo6Z2V0PDA+KGluZm8ucGFyYW0pID8gIkNvbnRpZ3VvdXMiIDogIk5vbmNvbnRpZ3VvdXMiOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgcGxhbmFyID0gc3RkOjpnZXQ8Mj4oaW5mby5wYXJhbSkgPyAiUGxhbmFyIiA6ICJTZW1pUGxhbmFyIjsKKyAgICAgICAgICAgIHJldHVybiBjb250aWd1b3VzCisgICAgICAgICAgICAgICAgICAgICsgc3RkOjpnZXQ8MT4oaW5mby5wYXJhbSkKKyAgICAgICAgICAgICAgICAgICAgKyBwbGFuYXIKKyAgICAgICAgICAgICAgICAgICAgKyBzdGQ6OnRvX3N0cmluZyhzdGQ6OmdldDwzPihpbmZvLnBhcmFtKSk7CisgICAgICAgIH0pOworCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQ0NvZGVjQ29uZmlnX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0NDb2RlY0NvbmZpZ190ZXN0LmNwcAppbmRleCBjOWNhYTAxLi43YzY2MGRjIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQ0NvZGVjQ29uZmlnX3Rlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9DQ29kZWNDb25maWdfdGVzdC5jcHAKQEAgLTIwOCw2ICsyMDgsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMlN0cmVhbVBpeGVsQXNwZWN0UmF0aW9JbmZvOjpvdXRwdXQ+KQogICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogCisgICAgICAgICAgICAgICAgaWYgKGlzRW5jb2RlcikgeworICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Qml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1JbnB1dEJpdHJhdGUsIHZhbHVlKS5hbnkoKX0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRCaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1PdXRwdXRCaXRyYXRlLCB2YWx1ZSkuYW55KCl9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcHk8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0LCBDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJpdHJhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIC8vIFRPRE86IG1vcmUgU0RLIHBhcmFtcwogICAgICAgICAgICAgfQogICAgICAgICBwcml2YXRlOgpAQCAtMjIxLDExICsyMzksMTkgQEAKICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVZlbmRvckludDY0SW5mbzo6b3V0cHV0PiBtSW50NjRPdXRwdXQ7CiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0VmVuZG9yU3RyaW5nSW5mbzo6aW5wdXQ+IG1TdHJpbmdJbnB1dDsKICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpeGVsQXNwZWN0UmF0aW9JbmZvOjpvdXRwdXQ+IG1QaXhlbEFzcGVjdFJhdGlvOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtSW5wdXRCaXRyYXRlOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbU91dHB1dEJpdHJhdGU7CiAKICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICAgICAgICAgICBzdGF0aWMgQzJSIFNldHRlcihib29sLCBDMlA8VD4gJikgewogICAgICAgICAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1FLCB0eXBlbmFtZSBERVA+CisgICAgICAgICAgICBzdGF0aWMgQzJSIENvcHkoYm9vbCwgQzJQPE1FPiAmbWUsIGNvbnN0IEMyUDxERVA+ICZkZXApIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IGRlcC52LnZhbHVlOworICAgICAgICAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH07CiAKICAgICAgICAgSW1wbCBtSW1wbDsKQEAgLTQ1Nyw0ICs0ODMsOTcgQEAKICAgICAgICAgICAgIDw8ICJtSW5wdXRGb3JtYXQgPSAiIDw8IG1Db25maWcubUlucHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCk7CiB9CiAKK1RFU1RfRihDQ29kZWNDb25maWdUZXN0LCBEYXRhc3BhY2VVcGRhdGUpIHsKKyAgICBpbml0KEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sIEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIsIE1JTUVUWVBFX1ZJREVPX0FWQyk7CisKKyAgICBBU1NFUlRfRVEoT0ssIG1Db25maWcuaW5pdGlhbGl6ZShtUmVmbGVjdG9yLCBtQ29uZmlndXJhYmxlKSk7CisgICAgY2xhc3MgSW5wdXRTdXJmYWNlU3R1YiA6IHB1YmxpYyBJbnB1dFN1cmZhY2VXcmFwcGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIH5JbnB1dFN1cmZhY2VTdHViKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworICAgICAgICBzdGF0dXNfdCBjb25uZWN0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJikgb3ZlcnJpZGUgeworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIHZvaWQgZGlzY29ubmVjdCgpIG92ZXJyaWRlIHt9CisgICAgICAgIHN0YXR1c190IHN0YXJ0KCkgb3ZlcnJpZGUgeyByZXR1cm4gT0s7IH0KKyAgICAgICAgc3RhdHVzX3Qgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIG92ZXJyaWRlIHsgcmV0dXJuIE9LOyB9CisgICAgICAgIHN0YXR1c190IGNvbmZpZ3VyZShDb25maWcgJikgb3ZlcnJpZGUgeyByZXR1cm4gT0s7IH0KKyAgICB9OworICAgIG1Db25maWcubUlucHV0U3VyZmFjZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW5wdXRTdXJmYWNlU3R1Yj4oKTsKKworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXR7bmV3IEFNZXNzYWdlfTsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9SQU5HRSwgQ09MT1JfUkFOR0VfTElNSVRFRCk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfU1RBTkRBUkQsIENPTE9SX1NUQU5EQVJEX0JUNzA5KTsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgQ09MT1JfVFJBTlNGRVJfU0RSX1ZJREVPKTsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9CSVRfUkFURSwgMTAwKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gY29uZmlnVXBkYXRlOworICAgIEFTU0VSVF9FUShPSywgbUNvbmZpZy5nZXRDb25maWdVcGRhdGVGcm9tU2RrUGFyYW1zKAorICAgICAgICAgICAgbUNvbmZpZ3VyYWJsZSwgZm9ybWF0LCBEOjpBTEwsIEMyX01BWV9CTE9DSywgJmNvbmZpZ1VwZGF0ZSkpOworICAgIEFTU0VSVF9UUlVFKG1Db25maWcudXBkYXRlQ29uZmlndXJhdGlvbihjb25maWdVcGRhdGUsIEQ6OkFMTCkpOworCisgICAgaW50MzJfdCByYW5nZXswfTsKKyAgICBBU1NFUlRfVFJVRShtQ29uZmlnLm1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfQ09MT1JfUkFOR0UsICZyYW5nZSkpCisgICAgICAgICAgICA8PCAibU91dHB1dEZvcm1hdCA9ICIgPDwgbUNvbmZpZy5tT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCk7CisgICAgRVhQRUNUX0VRKENPTE9SX1JBTkdFX0xJTUlURUQsIHJhbmdlKQorICAgICAgICAgICAgPDwgIm1PdXRwdXRGb3JtYXQgPSAiIDw8IG1Db25maWcubU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpOworCisgICAgaW50MzJfdCBzdGFuZGFyZHswfTsKKyAgICBBU1NFUlRfVFJVRShtQ29uZmlnLm1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfQ09MT1JfU1RBTkRBUkQsICZzdGFuZGFyZCkpCisgICAgICAgICAgICA8PCAibU91dHB1dEZvcm1hdCA9ICIgPDwgbUNvbmZpZy5tT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCk7CisgICAgRVhQRUNUX0VRKENPTE9SX1NUQU5EQVJEX0JUNzA5LCBzdGFuZGFyZCkKKyAgICAgICAgICAgIDw8ICJtT3V0cHV0Rm9ybWF0ID0gIiA8PCBtQ29uZmlnLm1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKTsKKworICAgIGludDMyX3QgdHJhbnNmZXJ7MH07CisgICAgQVNTRVJUX1RSVUUobUNvbmZpZy5tT3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX0NPTE9SX1RSQU5TRkVSLCAmdHJhbnNmZXIpKQorICAgICAgICAgICAgPDwgIm1PdXRwdXRGb3JtYXQgPSAiIDw8IG1Db25maWcubU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpOworICAgIEVYUEVDVF9FUShDT0xPUl9UUkFOU0ZFUl9TRFJfVklERU8sIHRyYW5zZmVyKQorICAgICAgICAgICAgPDwgIm1PdXRwdXRGb3JtYXQgPSAiIDw8IG1Db25maWcubU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpOworCisgICAgbUNvbmZpZy5tSW5wdXRTdXJmYWNlLT5zZXREYXRhU3BhY2UoSEFMX0RBVEFTUEFDRV9CVDIwMjBfUFEpOworCisgICAgLy8gRGF0YXNwYWNlIGZyb20gaW5wdXQgc3VyZmFjZSBzaG91bGQgb3ZlcnJpZGUgdGhlIGNvbmZpZ3VyZWQgc2V0dGluZworICAgIG1Db25maWcudXBkYXRlRm9ybWF0cyhEOjpBTEwpOworCisgICAgQVNTRVJUX1RSVUUobUNvbmZpZy5tT3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX0NPTE9SX1JBTkdFLCAmcmFuZ2UpKQorICAgICAgICAgICAgPDwgIm1PdXRwdXRGb3JtYXQgPSAiIDw8IG1Db25maWcubU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpOworICAgIEVYUEVDVF9FUShDT0xPUl9SQU5HRV9GVUxMLCByYW5nZSkKKyAgICAgICAgICAgIDw8ICJtT3V0cHV0Rm9ybWF0ID0gIiA8PCBtQ29uZmlnLm1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKTsKKworICAgIEFTU0VSVF9UUlVFKG1Db25maWcubU91dHB1dEZvcm1hdC0+ZmluZEludDMyKEtFWV9DT0xPUl9TVEFOREFSRCwgJnN0YW5kYXJkKSkKKyAgICAgICAgICAgIDw8ICJtT3V0cHV0Rm9ybWF0ID0gIiA8PCBtQ29uZmlnLm1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKTsKKyAgICBFWFBFQ1RfRVEoQ09MT1JfU1RBTkRBUkRfQlQyMDIwLCBzdGFuZGFyZCkKKyAgICAgICAgICAgIDw8ICJtT3V0cHV0Rm9ybWF0ID0gIiA8PCBtQ29uZmlnLm1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKTsKKworICAgIEFTU0VSVF9UUlVFKG1Db25maWcubU91dHB1dEZvcm1hdC0+ZmluZEludDMyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgJnRyYW5zZmVyKSkKKyAgICAgICAgICAgIDw8ICJtT3V0cHV0Rm9ybWF0ID0gIiA8PCBtQ29uZmlnLm1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKTsKKyAgICBFWFBFQ1RfRVEoQ09MT1JfVFJBTlNGRVJfU1QyMDg0LCB0cmFuc2ZlcikKKyAgICAgICAgICAgIDw8ICJtT3V0cHV0Rm9ybWF0ID0gIiA8PCBtQ29uZmlnLm1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKTsKKworICAgIC8vIFNpbXVsYXRlIGJpdHJhdGUgdXBkYXRlCisgICAgZm9ybWF0ID0gbmV3IEFNZXNzYWdlOworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX0JJVF9SQVRFLCAyMDApOworICAgIGNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIEFTU0VSVF9FUShPSywgbUNvbmZpZy5nZXRDb25maWdVcGRhdGVGcm9tU2RrUGFyYW1zKAorICAgICAgICAgICAgbUNvbmZpZ3VyYWJsZSwgZm9ybWF0LCBEOjpBTEwsIEMyX01BWV9CTE9DSywgJmNvbmZpZ1VwZGF0ZSkpOworICAgIEFTU0VSVF9FUShPSywgbUNvbmZpZy5zZXRQYXJhbWV0ZXJzKG1Db25maWd1cmFibGUsIGNvbmZpZ1VwZGF0ZSwgQzJfTUFZX0JMT0NLKSk7CisKKyAgICAvLyBDb2xvciBpbmZvcm1hdGlvbiBzaG91bGQgcmVtYWluIHRoZSBzYW1lCisgICAgbUNvbmZpZy51cGRhdGVGb3JtYXRzKEQ6OkFMTCk7CisKKyAgICBBU1NFUlRfVFJVRShtQ29uZmlnLm1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfQ09MT1JfUkFOR0UsICZyYW5nZSkpCisgICAgICAgICAgICA8PCAibU91dHB1dEZvcm1hdCA9ICIgPDwgbUNvbmZpZy5tT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCk7CisgICAgRVhQRUNUX0VRKENPTE9SX1JBTkdFX0ZVTEwsIHJhbmdlKQorICAgICAgICAgICAgPDwgIm1PdXRwdXRGb3JtYXQgPSAiIDw8IG1Db25maWcubU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpOworCisgICAgQVNTRVJUX1RSVUUobUNvbmZpZy5tT3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX0NPTE9SX1NUQU5EQVJELCAmc3RhbmRhcmQpKQorICAgICAgICAgICAgPDwgIm1PdXRwdXRGb3JtYXQgPSAiIDw8IG1Db25maWcubU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpOworICAgIEVYUEVDVF9FUShDT0xPUl9TVEFOREFSRF9CVDIwMjAsIHN0YW5kYXJkKQorICAgICAgICAgICAgPDwgIm1PdXRwdXRGb3JtYXQgPSAiIDw8IG1Db25maWcubU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpOworCisgICAgQVNTRVJUX1RSVUUobUNvbmZpZy5tT3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX0NPTE9SX1RSQU5TRkVSLCAmdHJhbnNmZXIpKQorICAgICAgICAgICAgPDwgIm1PdXRwdXRGb3JtYXQgPSAiIDw8IG1Db25maWcubU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpOworICAgIEVYUEVDVF9FUShDT0xPUl9UUkFOU0ZFUl9TVDIwODQsIHRyYW5zZmVyKQorICAgICAgICAgICAgPDwgIm1PdXRwdXRGb3JtYXQgPSAiIDw8IG1Db25maWcubU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvRnJhbWVSZWFzc2VtYmxlcl90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9GcmFtZVJlYXNzZW1ibGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MzhlZTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvRnJhbWVSZWFzc2VtYmxlcl90ZXN0LmNwcApAQCAtMCwwICsxLDM0MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkZyYW1lUmVhc3NlbWJsZXIuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBzaXplX3QgQnl0ZXNQZXJTYW1wbGUoQzJDb25maWc6OnBjbV9lbmNvZGluZ190IGVuY29kaW5nKSB7CisgICAgcmV0dXJuIGVuY29kaW5nID09IFBDTV84ID8gMQorICAgICAgICAgOiBlbmNvZGluZyA9PSBQQ01fMTYgPyAyCisgICAgICAgICA6IGVuY29kaW5nID09IFBDTV9GTE9BVCA/IDQgOiAwOworfQorCitzdGF0aWMgdWludDY0X3QgRGlmZihjMl9jbnRyNjRfdCBhLCBjMl9jbnRyNjRfdCBiKSB7CisgICAgcmV0dXJuIHN0ZDo6YWJzKChhIC0gYikucGVlaygpKTsKK30KKworY2xhc3MgRnJhbWVSZWFzc2VtYmxlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgQzJNZW1vcnlVc2FnZSBrVXNhZ2U7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrVGltZXN0YW1wVG9sZXJhbmNlVXMgPSAxMDA7CisKKyAgICBGcmFtZVJlYXNzZW1ibGVyVGVzdCgpIHsKKyAgICAgICAgbUluaXRTdGF0dXMgPSBHZXRDb2RlYzJCbG9ja1Bvb2woQzJCbG9ja1Bvb2w6OkJBU0lDX0xJTkVBUiwgbnVsbHB0ciwgJm1Qb29sKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBpbml0U3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbUluaXRTdGF0dXM7IH0KKworICAgIHZvaWQgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgIHNpemVfdCBlbmNvZGVyRnJhbWVTaXplLAorICAgICAgICAgICAgc2l6ZV90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICBzaXplX3QgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgQzJDb25maWc6OnBjbV9lbmNvZGluZ190IGVuY29kaW5nLAorICAgICAgICAgICAgc2l6ZV90IGlucHV0RnJhbWVTaXplSW5CeXRlcywKKyAgICAgICAgICAgIHNpemVfdCBjb3VudCwKKyAgICAgICAgICAgIHNpemVfdCBleHBlY3RlZE91dHB1dFNpemUpIHsKKyAgICAgICAgRnJhbWVSZWFzc2VtYmxlciBmcmFtZVJlYXNzZW1ibGVyOworICAgICAgICBmcmFtZVJlYXNzZW1ibGVyLmluaXQoCisgICAgICAgICAgICAgICAgbVBvb2wsCisgICAgICAgICAgICAgICAga1VzYWdlLAorICAgICAgICAgICAgICAgIGVuY29kZXJGcmFtZVNpemUsCisgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgZW5jb2RpbmcpOworCisgICAgICAgIEFTU0VSVF9UUlVFKGZyYW1lUmVhc3NlbWJsZXIpIDw8ICJGcmFtZVJlYXNzZW1ibGVyIGluaXQgZmFpbGVkIjsKKworICAgICAgICBzaXplX3QgaW5wdXRJbmRleCA9IDAsIG91dHB1dEluZGV4ID0gMDsKKyAgICAgICAgc2l6ZV90IGV4cGVjdENvdW50ID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXIgPSBuZXcgTWVkaWFDb2RlY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFNZXNzYWdlLCBuZXcgQUJ1ZmZlcihpbnB1dEZyYW1lU2l6ZUluQnl0ZXMpKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgaW5wdXRGcmFtZVNpemVJbkJ5dGVzKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgInRpbWVVcyIsCisgICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXggKiAxMDAwMDAwIC8gc2FtcGxlUmF0ZSAvIGNoYW5uZWxDb3VudCAvIEJ5dGVzUGVyU2FtcGxlKGVuY29kaW5nKSk7CisgICAgICAgICAgICBpZiAoaSA9PSBjb3VudCAtIDEpIHsKKyAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImVvcyIsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpbnB1dEZyYW1lU2l6ZUluQnl0ZXM7ICsraiwgKytpbnB1dEluZGV4KSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5iYXNlKClbal0gPSAoaW5wdXRJbmRleCAmIDB4RkYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgICAgIEFTU0VSVF9FUShDMl9PSywgZnJhbWVSZWFzc2VtYmxlci5wcm9jZXNzKGJ1ZmZlciwgJml0ZW1zKSk7CisgICAgICAgICAgICB3aGlsZSAoIWl0ZW1zLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrID0gc3RkOjptb3ZlKCppdGVtcy5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBpdGVtcy5lcmFzZShpdGVtcy5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAvLyBWZXJpZnkgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgdWludDY0X3QgZXhwZWN0ZWRUaW1lVXMgPQorICAgICAgICAgICAgICAgICAgICBvdXRwdXRJbmRleCAqIDEwMDAwMDAgLyBzYW1wbGVSYXRlIC8gY2hhbm5lbENvdW50IC8gQnl0ZXNQZXJTYW1wbGUoZW5jb2RpbmcpOworICAgICAgICAgICAgICAgIEVYUEVDVF9HRSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGtUaW1lc3RhbXBUb2xlcmFuY2VVcywKKyAgICAgICAgICAgICAgICAgICAgICAgIERpZmYoZXhwZWN0ZWRUaW1lVXMsIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgImV4cGVjdGVkIHRpbWVzdGFtcDogIiA8PCBleHBlY3RlZFRpbWVVcworICAgICAgICAgICAgICAgICAgICA8PCAiIGFjdHVhbCB0aW1lc3RhbXA6ICIgPDwgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKQorICAgICAgICAgICAgICAgICAgICA8PCAiIG91dHB1dCBpbmRleDogIiA8PCBvdXRwdXRJbmRleDsKKworICAgICAgICAgICAgICAgIC8vIFZlcmlmeSBidWZmZXIKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoMXUsIHdvcmstPmlucHV0LmJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IHdvcmstPmlucHV0LmJ1ZmZlcnMuZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoQzJCdWZmZXJEYXRhOjpMSU5FQVIsIGJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKDF1LCBidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5zaXplKCkpOworICAgICAgICAgICAgICAgIEMyUmVhZFZpZXcgdmlldyA9IGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKEMyX09LLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShlbmNvZGVyRnJhbWVTaXplICogQnl0ZXNQZXJTYW1wbGUoZW5jb2RpbmcpLCB2aWV3LmNhcGFjaXR5KCkpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgdmlldy5jYXBhY2l0eSgpOyArK2osICsrb3V0cHV0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUob3V0cHV0SW5kZXggPCBpbnB1dEluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlucHV0SW5kZXggPT0gaW5wdXRGcmFtZVNpemVJbkJ5dGVzICogY291bnQpOworICAgICAgICAgICAgICAgICAgICB1aW50OF90IGV4cGVjdGVkID0gb3V0cHV0SW5kZXggPCBpbnB1dEluZGV4ID8gKG91dHB1dEluZGV4ICYgMHhGRikgOiAwOworICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0Q291bnQgPCAxMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKytleHBlY3RDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZCwgdmlldy5kYXRhKClbal0pIDw8ICJvdXRwdXQgaW5kZXggPSAiIDw8IG91dHB1dEluZGV4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQVNTRVJUX0VRKGlucHV0RnJhbWVTaXplSW5CeXRlcyAqIGNvdW50LCBpbnB1dEluZGV4KTsKKyAgICAgICAgc2l6ZV90IGVuY29kZXJGcmFtZVNpemVJbkJ5dGVzID0KKyAgICAgICAgICAgIGVuY29kZXJGcmFtZVNpemUgKiBjaGFubmVsQ291bnQgKiBCeXRlc1BlclNhbXBsZShlbmNvZGluZyk7CisgICAgICAgIEFTU0VSVF9FUSgwLCBvdXRwdXRJbmRleCAlIGVuY29kZXJGcmFtZVNpemVJbkJ5dGVzKQorICAgICAgICAgICAgPDwgIm91dHB1dCBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YgZnJhbWUgc2l6ZTogb3V0cHV0IHNpemUgPSAiIDw8IG91dHB1dEluZGV4CisgICAgICAgICAgICA8PCAiIGZyYW1lIHNpemUgPSAiIDw8IGVuY29kZXJGcmFtZVNpemVJbkJ5dGVzOworICAgICAgICBBU1NFUlRfRVEoZXhwZWN0ZWRPdXRwdXRTaXplLCBvdXRwdXRJbmRleCkKKyAgICAgICAgICAgIDw8ICJvdXRwdXQgc2l6ZSBtdXN0IGJlIHNtYWxsZXN0IG11bHRpcGxlIG9mIGZyYW1lIHNpemUsICIKKyAgICAgICAgICAgIDw8ICJlcXVhbCB0byBvciBsYXJnZXIgdGhhbiBpbnB1dCBzaXplLiBvdXRwdXQgc2l6ZSA9ICIgPDwgb3V0cHV0SW5kZXgKKyAgICAgICAgICAgIDw8ICIgaW5wdXQgc2l6ZSA9ICIgPDwgaW5wdXRJbmRleCA8PCAiIGZyYW1lIHNpemUgPSAiIDw8IGVuY29kZXJGcmFtZVNpemVJbkJ5dGVzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBtSW5pdFN0YXR1czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1Qb29sOworfTsKKworY29uc3QgQzJNZW1vcnlVc2FnZSBGcmFtZVJlYXNzZW1ibGVyVGVzdDo6a1VzYWdle0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OworCisvLyBQdXNoIGZyYW1lcyB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgZW5jb2RlciByZXF1ZXN0ZWQuCitURVNUX0YoRnJhbWVSZWFzc2VtYmxlclRlc3QsIFB1c2hFeGFjdEZyYW1lU2l6ZSkgeworICAgIEFTU0VSVF9FUShPSywgaW5pdFN0YXR1cygpKTsKKyAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgIFBDTV84LAorICAgICAgICAgICAgMTAyNCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAyNCBzYW1wbGVzICogMSBjaGFubmVsICogMSBieXRlcy9zYW1wbGUgKi8sCisgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgIDEwMjQwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTAgKiAxMDI0IGJ5dGVzL2ZyYW1lICovKTsKKyAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgIFBDTV8xNiwKKyAgICAgICAgICAgIDIwNDggLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjQgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDIgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAyMDQ4MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogMjA0OCBieXRlcy9mcmFtZSAqLyk7CisgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICBQQ01fRkxPQVQsCisgICAgICAgICAgICA0MDk2IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDI0IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiA0IGJ5dGVzL3NhbXBsZSAqLywKKyAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgNDA5NjAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMCAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8pOworfQorCisvLyBQdXNoIGZyYW1lcyB3aXRoIGhhbGYgdGhlIHNpemUgdGhhdCB0aGUgZW5jb2RlciByZXF1ZXN0ZWQuCitURVNUX0YoRnJhbWVSZWFzc2VtYmxlclRlc3QsIFB1c2hIYWxmRnJhbWVTaXplKSB7CisgICAgQVNTRVJUX0VRKE9LLCBpbml0U3RhdHVzKCkpOworICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgUENNXzgsCisgICAgICAgICAgICA1MTIgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDUxMiBzYW1wbGVzICogMSBjaGFubmVsICogMSBieXRlcyBwZXIgc2FtcGxlICovLAorICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICA1MTIwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNSAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8pOworICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgUENNXzE2LAorICAgICAgICAgICAgMTAyNCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gNTEyIHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAyIGJ5dGVzIHBlciBzYW1wbGUgKi8sCisgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgIDEwMjQwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNSAqIDIwNDggYnl0ZXMvZnJhbWUgKi8pOworICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgUENNX0ZMT0FULAorICAgICAgICAgICAgMjA0OCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gNTEyIHNhbXBsZXMgKiAxIGNoYW5uZWwgKiA0IGJ5dGVzIHBlciBzYW1wbGUgKi8sCisgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgIDIwNDgwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNSAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8pOworfQorCisvLyBQdXNoIGZyYW1lcyB3aXRoIHR3aWNlIHRoZSBzaXplIHRoYXQgdGhlIGVuY29kZXIgcmVxdWVzdGVkLgorVEVTVF9GKEZyYW1lUmVhc3NlbWJsZXJUZXN0LCBQdXNoRG91YmxlRnJhbWVTaXplKSB7CisgICAgQVNTRVJUX0VRKE9LLCBpbml0U3RhdHVzKCkpOworICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgUENNXzgsCisgICAgICAgICAgICAyMDQ4IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAyMDQ4IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAxIGJ5dGVzIHBlciBzYW1wbGUgKi8sCisgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgIDIwNDgwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjAgKiAxMDI0IGJ5dGVzL2ZyYW1lICovKTsKKyAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgIFBDTV8xNiwKKyAgICAgICAgICAgIDQwOTYgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDIwNDggc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDIgYnl0ZXMgcGVyIHNhbXBsZSAqLywKKyAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgNDA5NjAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAyMCAqIDIwNDggYnl0ZXMvZnJhbWUgKi8pOworICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgUENNX0ZMT0FULAorICAgICAgICAgICAgODE5MiAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMjA0OCBzYW1wbGVzICogMSBjaGFubmVsICogNCBieXRlcyBwZXIgc2FtcGxlICovLAorICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICA4MTkyMCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDIwICogNDA5NiBieXRlcy9mcmFtZSAqLyk7Cit9CisKKy8vIFB1c2ggZnJhbWVzIHdpdGggYSBsaXR0bGUgYml0IGxhcmdlciAoKzUgc2FtcGxlcykgdGhhbiB0aGUgcmVxdWVzdGVkIHNpemUuCitURVNUX0YoRnJhbWVSZWFzc2VtYmxlclRlc3QsIFB1c2hMaXR0bGVMYXJnZXJGcmFtZVNpemUpIHsKKyAgICBBU1NFUlRfRVEoT0ssIGluaXRTdGF0dXMoKSk7CisgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICBQQ01fOCwKKyAgICAgICAgICAgIDEwMjkgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjkgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDEgYnl0ZXMgcGVyIHNhbXBsZSAqLywKKyAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgMTEyNjQgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMSAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8pOworICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgUENNXzE2LAorICAgICAgICAgICAgMjA1OCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAyOSBzYW1wbGVzICogMSBjaGFubmVsICogMiBieXRlcyBwZXIgc2FtcGxlICovLAorICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAyMjUyOCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDExICogMjA0OCBieXRlcy9mcmFtZSAqLyk7CisgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICBQQ01fRkxPQVQsCisgICAgICAgICAgICA0MTE2IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDI5IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiA0IGJ5dGVzIHBlciBzYW1wbGUgKi8sCisgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgIDQ1MDU2IC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTEgKiA0MDk2IGJ5dGVzL2ZyYW1lICovKTsKK30KKworLy8gUHVzaCBmcmFtZXMgd2l0aCBhIGxpdHRsZSBiaXQgc21hbGxlciAoLTUgc2FtcGxlcykgdGhhbiB0aGUgcmVxdWVzdGVkIHNpemUuCitURVNUX0YoRnJhbWVSZWFzc2VtYmxlclRlc3QsIFB1c2hMaXR0bGVTbWFsbGVyRnJhbWVTaXplKSB7CisgICAgQVNTRVJUX0VRKE9LLCBpbml0U3RhdHVzKCkpOworICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgUENNXzgsCisgICAgICAgICAgICAxMDE5IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDE5IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAxIGJ5dGVzIHBlciBzYW1wbGUgKi8sCisgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgIDEwMjQwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTAgKiAxMDI0IGJ5dGVzL2ZyYW1lICovKTsKKyAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgIFBDTV8xNiwKKyAgICAgICAgICAgIDIwMzggLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMTkgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDIgYnl0ZXMgcGVyIHNhbXBsZSAqLywKKyAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgMjA0ODAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMCAqIDIwNDggYnl0ZXMvZnJhbWUgKi8pOworICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgUENNX0ZMT0FULAorICAgICAgICAgICAgNDA3NiAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAxOSBzYW1wbGVzICogMSBjaGFubmVsICogNCBieXRlcyBwZXIgc2FtcGxlICovLAorICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICA0MDk2MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogNDA5NiBieXRlcy9mcmFtZSAqLyk7Cit9CisKKy8vIFB1c2ggc2luZ2xlLWJ5dGUgZnJhbWVzCitURVNUX0YoRnJhbWVSZWFzc2VtYmxlclRlc3QsIFB1c2hTaW5nbGVCeXRlKSB7CisgICAgQVNTRVJUX0VRKE9LLCBpbml0U3RhdHVzKCkpOworICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgUENNXzgsCisgICAgICAgICAgICAxIC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgKi8sCisgICAgICAgICAgICAxMDAwMDAgLyogY291bnQgKi8sCisgICAgICAgICAgICAxMDAzNTIgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSA5OCAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8pOworICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgUENNXzE2LAorICAgICAgICAgICAgMSAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzICovLAorICAgICAgICAgICAgMTAwMDAwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgMTAwMzUyIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNDkgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovKTsKKyAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgIFBDTV9GTE9BVCwKKyAgICAgICAgICAgIDEgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgIDEwMDAwMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgIDEwMjQwMCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDI1ICogNDA5NiBieXRlcy9mcmFtZSAqLyk7Cit9CisKKy8vIFB1c2ggb25lIGJpZyBjaHVuay4KK1RFU1RfRihGcmFtZVJlYXNzZW1ibGVyVGVzdCwgUHVzaEJpZ0NodW5rKSB7CisgICAgQVNTRVJUX0VRKE9LLCBpbml0U3RhdHVzKCkpOworICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgUENNXzgsCisgICAgICAgICAgICAxMDAwMDAgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgIDEgLyogY291bnQgKi8sCisgICAgICAgICAgICAxMDAzNTIgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSA5OCAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8pOworICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgUENNXzE2LAorICAgICAgICAgICAgMTAwMDAwIC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgKi8sCisgICAgICAgICAgICAxIC8qIGNvdW50ICovLAorICAgICAgICAgICAgMTAwMzUyIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNDkgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovKTsKKyAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgIFBDTV9GTE9BVCwKKyAgICAgICAgICAgIDEwMDAwMCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzICovLAorICAgICAgICAgICAgMSAvKiBjb3VudCAqLywKKyAgICAgICAgICAgIDEwMjQwMCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDI1ICogNDA5NiBieXRlcy9mcmFtZSAqLyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0FuZHJvaWQuYnAKaW5kZXggNjI4NzIyMS4uMmY0ZDZiMSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0FuZHJvaWQuYnAKQEAgLTEsNCArMSwxMyBAQAotY2NfbGlicmFyeV9zaGFyZWQgeworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKQEAgLTI0LDExICszMywxMyBAQAogICAgICAgICAibGliY29kZWMyX3ZuZGsiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhcmVjdCIsCiAgICAgICAgICJsaWJ5dXZfc3RhdGljIiwKICAgICBdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQnVmZmVyVXRpbHMuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmNwcAppbmRleCBiZjJhMDdlLi4wOTY2OTg4IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQnVmZmVyVXRpbHMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaXN0PgogI2luY2x1ZGUgPG11dGV4PgogCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZV9idWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAKQEAgLTEyMSwzMiArMTIyLDY5IEBACiAgICAgaWYgKHZpZXcuY3JvcCgpLndpZHRoICE9IGltZy0+bVdpZHRoIHx8IHZpZXcuY3JvcCgpLmhlaWdodCAhPSBpbWctPm1IZWlnaHQpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgaWYgKChJc05WMTIodmlldykgJiYgSXNJNDIwKGltZykpIHx8IChJc0k0MjAodmlldykgJiYgSXNOVjEyKGltZykpKSB7Ci0gICAgICAgIC8vIFRha2Ugc2hvcnRjdXRzIHRvIHVzZSBsaWJ5dXYgZnVuY3Rpb25zIGJldHdlZW4gTlYxMiBhbmQgSTQyMCBjb252ZXJzaW9uLgotICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfeSA9IHZpZXcuZGF0YSgpWzBdOwotICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfdSA9IHZpZXcuZGF0YSgpWzFdOwotICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfdiA9IHZpZXcuZGF0YSgpWzJdOwotICAgICAgICBpbnQzMl90IHNyY19zdHJpZGVfeSA9IHZpZXcubGF5b3V0KCkucGxhbmVzWzBdLnJvd0luYzsKLSAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlX3UgPSB2aWV3LmxheW91dCgpLnBsYW5lc1sxXS5yb3dJbmM7Ci0gICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZV92ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMl0ucm93SW5jOwotICAgICAgICB1aW50OF90KiBkc3RfeSA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVswXS5tT2Zmc2V0OwotICAgICAgICB1aW50OF90KiBkc3RfdSA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVsxXS5tT2Zmc2V0OwotICAgICAgICB1aW50OF90KiBkc3RfdiA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVsyXS5tT2Zmc2V0OwotICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGVfeSA9IGltZy0+bVBsYW5lWzBdLm1Sb3dJbmM7Ci0gICAgICAgIGludDMyX3QgZHN0X3N0cmlkZV91ID0gaW1nLT5tUGxhbmVbMV0ubVJvd0luYzsKLSAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlX3YgPSBpbWctPm1QbGFuZVsyXS5tUm93SW5jOwotICAgICAgICBpZiAoSXNOVjEyKHZpZXcpICYmIElzSTQyMChpbWcpKSB7CisgICAgY29uc3QgdWludDhfdCogc3JjX3kgPSB2aWV3LmRhdGEoKVswXTsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfdSA9IHZpZXcuZGF0YSgpWzFdOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY192ID0gdmlldy5kYXRhKClbMl07CisgICAgaW50MzJfdCBzcmNfc3RyaWRlX3kgPSB2aWV3LmxheW91dCgpLnBsYW5lc1swXS5yb3dJbmM7CisgICAgaW50MzJfdCBzcmNfc3RyaWRlX3UgPSB2aWV3LmxheW91dCgpLnBsYW5lc1sxXS5yb3dJbmM7CisgICAgaW50MzJfdCBzcmNfc3RyaWRlX3YgPSB2aWV3LmxheW91dCgpLnBsYW5lc1syXS5yb3dJbmM7CisgICAgdWludDhfdCogZHN0X3kgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMF0ubU9mZnNldDsKKyAgICB1aW50OF90KiBkc3RfdSA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVsxXS5tT2Zmc2V0OworICAgIHVpbnQ4X3QqIGRzdF92ID0gaW1nQmFzZSArIGltZy0+bVBsYW5lWzJdLm1PZmZzZXQ7CisgICAgaW50MzJfdCBkc3Rfc3RyaWRlX3kgPSBpbWctPm1QbGFuZVswXS5tUm93SW5jOworICAgIGludDMyX3QgZHN0X3N0cmlkZV91ID0gaW1nLT5tUGxhbmVbMV0ubVJvd0luYzsKKyAgICBpbnQzMl90IGRzdF9zdHJpZGVfdiA9IGltZy0+bVBsYW5lWzJdLm1Sb3dJbmM7CisgICAgaW50IHdpZHRoID0gdmlldy5jcm9wKCkud2lkdGg7CisgICAgaW50IGhlaWdodCA9IHZpZXcuY3JvcCgpLmhlaWdodDsKKworICAgIGlmIChJc05WMTIodmlldykpIHsKKyAgICAgICAgaWYgKElzTlYxMihpbWcpKSB7CisgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfeSwgc3JjX3N0cmlkZV95LCBkc3RfeSwgZHN0X3N0cmlkZV95LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY191LCBzcmNfc3RyaWRlX3UsIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHdpZHRoLCBoZWlnaHQgLyAyKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfSBlbHNlIGlmIChJc05WMjEoaW1nKSkgeworICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMjFUb05WMTIoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHdpZHRoLCBoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKElzSTQyMChpbWcpKSB7CiAgICAgICAgICAgICBpZiAoIWxpYnl1djo6TlYxMlRvSTQyMChzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdSwgc3JjX3N0cmlkZV91LCBkc3RfeSwgZHN0X3N0cmlkZV95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3UsIGRzdF9zdHJpZGVfdSwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgdmlldy5jcm9wKCkud2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmNyb3AoKS5oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfdSwgZHN0X3N0cmlkZV91LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCwgaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoSXNOVjIxKHZpZXcpKSB7CisgICAgICAgIGlmIChJc05WMTIoaW1nKSkgeworICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMjFUb05WMTIoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3YsIHNyY19zdHJpZGVfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHdpZHRoLCBoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKElzTlYyMShpbWcpKSB7CisgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfeSwgc3JjX3N0cmlkZV95LCBkc3RfeSwgZHN0X3N0cmlkZV95LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY192LCBzcmNfc3RyaWRlX3YsIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHdpZHRoLCBoZWlnaHQgLyAyKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfSBlbHNlIGlmIChJc0k0MjAoaW1nKSkgeworICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMjFUb0k0MjAoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3YsIHNyY19zdHJpZGVfdiwgZHN0X3ksIGRzdF9zdHJpZGVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF91LCBkc3Rfc3RyaWRlX3UsIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHdpZHRoLCBoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChJc0k0MjAodmlldykpIHsKKyAgICAgICAgaWYgKElzTlYxMihpbWcpKSB7CiAgICAgICAgICAgICBpZiAoIWxpYnl1djo6STQyMFRvTlYxMihzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdSwgc3JjX3N0cmlkZV91LCBzcmNfdiwgc3JjX3N0cmlkZV92LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3ksIGRzdF9zdHJpZGVfeSwgZHN0X3UsIGRzdF9zdHJpZGVfdSwgdmlldy5jcm9wKCkud2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmNyb3AoKS5oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfeSwgZHN0X3N0cmlkZV95LCBkc3RfdSwgZHN0X3N0cmlkZV91LCB3aWR0aCwgaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChJc05WMjEoaW1nKSkgeworICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Okk0MjBUb05WMjEoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwgc3JjX3YsIHNyY19zdHJpZGVfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHdpZHRoLCBoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKElzSTQyMChpbWcpKSB7CisgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfeSwgc3JjX3N0cmlkZV95LCBkc3RfeSwgZHN0X3N0cmlkZV95LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY191LCBzcmNfc3RyaWRlX3UsIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7CisgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfdiwgc3JjX3N0cmlkZV92LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpOworICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBfSW1hZ2VDb3B5PHRydWU+KHZpZXcsIGltZywgaW1nQmFzZSk7CkBAIC0xNTYsMzIgKzE5NCw2OCBAQAogICAgIGlmICh2aWV3LmNyb3AoKS53aWR0aCAhPSBpbWctPm1XaWR0aCB8fCB2aWV3LmNyb3AoKS5oZWlnaHQgIT0gaW1nLT5tSGVpZ2h0KSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGlmICgoSXNOVjEyKGltZykgJiYgSXNJNDIwKHZpZXcpKSB8fCAoSXNJNDIwKGltZykgJiYgSXNOVjEyKHZpZXcpKSkgewotICAgICAgICAvLyBUYWtlIHNob3J0Y3V0cyB0byB1c2UgbGlieXV2IGZ1bmN0aW9ucyBiZXR3ZWVuIE5WMTIgYW5kIEk0MjAgY29udmVyc2lvbi4KLSAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3kgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMF0ubU9mZnNldDsKLSAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3UgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMV0ubU9mZnNldDsKLSAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3YgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMl0ubU9mZnNldDsKLSAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlX3kgPSBpbWctPm1QbGFuZVswXS5tUm93SW5jOwotICAgICAgICBpbnQzMl90IHNyY19zdHJpZGVfdSA9IGltZy0+bVBsYW5lWzFdLm1Sb3dJbmM7Ci0gICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZV92ID0gaW1nLT5tUGxhbmVbMl0ubVJvd0luYzsKLSAgICAgICAgdWludDhfdCogZHN0X3kgPSB2aWV3LmRhdGEoKVswXTsKLSAgICAgICAgdWludDhfdCogZHN0X3UgPSB2aWV3LmRhdGEoKVsxXTsKLSAgICAgICAgdWludDhfdCogZHN0X3YgPSB2aWV3LmRhdGEoKVsyXTsKLSAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlX3kgPSB2aWV3LmxheW91dCgpLnBsYW5lc1swXS5yb3dJbmM7Ci0gICAgICAgIGludDMyX3QgZHN0X3N0cmlkZV91ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMV0ucm93SW5jOwotICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGVfdiA9IHZpZXcubGF5b3V0KCkucGxhbmVzWzJdLnJvd0luYzsKLSAgICAgICAgaWYgKElzTlYxMihpbWcpICYmIElzSTQyMCh2aWV3KSkgeworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY195ID0gaW1nQmFzZSArIGltZy0+bVBsYW5lWzBdLm1PZmZzZXQ7CisgICAgY29uc3QgdWludDhfdCogc3JjX3UgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMV0ubU9mZnNldDsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfdiA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVsyXS5tT2Zmc2V0OworICAgIGludDMyX3Qgc3JjX3N0cmlkZV95ID0gaW1nLT5tUGxhbmVbMF0ubVJvd0luYzsKKyAgICBpbnQzMl90IHNyY19zdHJpZGVfdSA9IGltZy0+bVBsYW5lWzFdLm1Sb3dJbmM7CisgICAgaW50MzJfdCBzcmNfc3RyaWRlX3YgPSBpbWctPm1QbGFuZVsyXS5tUm93SW5jOworICAgIHVpbnQ4X3QqIGRzdF95ID0gdmlldy5kYXRhKClbMF07CisgICAgdWludDhfdCogZHN0X3UgPSB2aWV3LmRhdGEoKVsxXTsKKyAgICB1aW50OF90KiBkc3RfdiA9IHZpZXcuZGF0YSgpWzJdOworICAgIGludDMyX3QgZHN0X3N0cmlkZV95ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMF0ucm93SW5jOworICAgIGludDMyX3QgZHN0X3N0cmlkZV91ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMV0ucm93SW5jOworICAgIGludDMyX3QgZHN0X3N0cmlkZV92ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMl0ucm93SW5jOworICAgIGludCB3aWR0aCA9IHZpZXcuY3JvcCgpLndpZHRoOworICAgIGludCBoZWlnaHQgPSB2aWV3LmNyb3AoKS5oZWlnaHQ7CisgICAgaWYgKElzTlYxMihpbWcpKSB7CisgICAgICAgIGlmIChJc05WMTIodmlldykpIHsKKyAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY195LCBzcmNfc3RyaWRlX3ksIGRzdF95LCBkc3Rfc3RyaWRlX3ksIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgbGlieXV2OjpDb3B5UGxhbmUoc3JjX3UsIHNyY19zdHJpZGVfdSwgZHN0X3UsIGRzdF9zdHJpZGVfdSwgd2lkdGgsIGhlaWdodCAvIDIpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9IGVsc2UgaWYgKElzTlYyMSh2aWV3KSkgeworICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMjFUb05WMTIoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHdpZHRoLCBoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKElzSTQyMCh2aWV3KSkgewogICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMTJUb0k0MjAoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwgZHN0X3ksIGRzdF9zdHJpZGVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF91LCBkc3Rfc3RyaWRlX3UsIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHZpZXcud2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuaGVpZ2h0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfdSwgZHN0X3N0cmlkZV91LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCwgaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoSXNOVjIxKGltZykpIHsKKyAgICAgICAgaWYgKElzTlYxMih2aWV3KSkgeworICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMjFUb05WMTIoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3YsIHNyY19zdHJpZGVfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHdpZHRoLCBoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKElzTlYyMSh2aWV3KSkgeworICAgICAgICAgICAgbGlieXV2OjpDb3B5UGxhbmUoc3JjX3ksIHNyY19zdHJpZGVfeSwgZHN0X3ksIGRzdF9zdHJpZGVfeSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfdiwgc3JjX3N0cmlkZV92LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCwgaGVpZ2h0IC8gMik7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0gZWxzZSBpZiAoSXNJNDIwKHZpZXcpKSB7CisgICAgICAgICAgICBpZiAoIWxpYnl1djo6TlYyMVRvSTQyMChzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdiwgc3JjX3N0cmlkZV92LCBkc3RfeSwgZHN0X3N0cmlkZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3UsIGRzdF9zdHJpZGVfdSwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgd2lkdGgsIGhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKElzSTQyMChpbWcpKSB7CisgICAgICAgIGlmIChJc05WMTIodmlldykpIHsKICAgICAgICAgICAgIGlmICghbGlieXV2OjpJNDIwVG9OVjEyKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY191LCBzcmNfc3RyaWRlX3UsIHNyY192LCBzcmNfc3RyaWRlX3YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfeSwgZHN0X3N0cmlkZV95LCBkc3RfdSwgZHN0X3N0cmlkZV91LCB2aWV3LndpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmhlaWdodCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3ksIGRzdF9zdHJpZGVfeSwgZHN0X3UsIGRzdF9zdHJpZGVfdSwgd2lkdGgsIGhlaWdodCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoSXNOVjIxKHZpZXcpKSB7CisgICAgICAgICAgICBpZiAoIWxpYnl1djo6STQyMFRvTlYyMShzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdSwgc3JjX3N0cmlkZV91LCBzcmNfdiwgc3JjX3N0cmlkZV92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3ksIGRzdF9zdHJpZGVfeSwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgd2lkdGgsIGhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoSXNJNDIwKHZpZXcpKSB7CisgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfeSwgc3JjX3N0cmlkZV95LCBkc3RfeSwgZHN0X3N0cmlkZV95LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY191LCBzcmNfc3RyaWRlX3UsIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7CisgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfdiwgc3JjX3N0cmlkZV92LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpOworICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBfSW1hZ2VDb3B5PGZhbHNlPih2aWV3LCBpbWcsIGltZ0Jhc2UpOwpAQCAtMjI1LDYgKzI5OSwyMCBAQAogICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0ub2Zmc2V0ID09IDEpOwogfQogCitib29sIElzTlYyMShjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KSB7CisgICAgaWYgKCFJc1lVVjQyMCh2aWV3KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSB2aWV3LmxheW91dCgpOworICAgIHJldHVybiAobGF5b3V0LnJvb3RQbGFuZXMgPT0gMgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sSW5jID09IDIKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLnJvb3RJeCA9PSBsYXlvdXQuUExBTkVfVgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0ub2Zmc2V0ID09IDEKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmNvbEluYyA9PSAyCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5yb290SXggPT0gbGF5b3V0LlBMQU5FX1YKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLm9mZnNldCA9PSAwKTsKK30KKwogYm9vbCBJc0k0MjAoY29uc3QgQzJHcmFwaGljVmlldyAmdmlldykgewogICAgIGlmICghSXNZVVY0MjAodmlldykpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjU4LDcgKzM0NiwxNiBAQAogICAgIH0KICAgICByZXR1cm4gKGltZy0+bVBsYW5lWzFdLm1Db2xJbmMgPT0gMgogICAgICAgICAgICAgJiYgaW1nLT5tUGxhbmVbMl0ubUNvbEluYyA9PSAyCi0gICAgICAgICAgICAmJiAoaW1nLT5tUGxhbmVbMl0ubU9mZnNldCAtIGltZy0+bVBsYW5lWzFdLm1PZmZzZXQgPT0gMSkpOworICAgICAgICAgICAgJiYgKGltZy0+bVBsYW5lWzJdLm1PZmZzZXQgPT0gaW1nLT5tUGxhbmVbMV0ubU9mZnNldCArIDEpKTsKK30KKworYm9vbCBJc05WMjEoY29uc3QgTWVkaWFJbWFnZTIgKmltZykgeworICAgIGlmICghSXNZVVY0MjAoaW1nKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiAoaW1nLT5tUGxhbmVbMV0ubUNvbEluYyA9PSAyCisgICAgICAgICAgICAmJiBpbWctPm1QbGFuZVsyXS5tQ29sSW5jID09IDIKKyAgICAgICAgICAgICYmIChpbWctPm1QbGFuZVsxXS5tT2Zmc2V0ID09IGltZy0+bVBsYW5lWzJdLm1PZmZzZXQgKyAxKSk7CiB9CiAKIGJvb2wgSXNJNDIwKGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpIHsKQEAgLTI3MCw2ICszNjcsNzYgQEAKICAgICAgICAgICAgICYmIGltZy0+bVBsYW5lWzJdLm1PZmZzZXQgPiBpbWctPm1QbGFuZVsxXS5tT2Zmc2V0KTsKIH0KIAorRmxleExheW91dCBHZXRZdXY0MjBGbGV4aWJsZUxheW91dCgpIHsKKyAgICBzdGF0aWMgRmxleExheW91dCBzTGF5b3V0ID0gW117CisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGRlc2MgPSB7CisgICAgICAgICAgICAxNiwgIC8vIHdpZHRoCisgICAgICAgICAgICAxNiwgIC8vIGhlaWdodAorICAgICAgICAgICAgMSwgICAvLyBsYXllcnMKKyAgICAgICAgICAgIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfWThDYjhDcjhfNDIwLAorICAgICAgICAgICAgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9SRUFEX09GVEVOIHwgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9XUklURV9PRlRFTiwKKyAgICAgICAgICAgIDAsICAgLy8gc3RyaWRlCisgICAgICAgICAgICAwLCAgIC8vIHJmdTAKKyAgICAgICAgICAgIDAsICAgLy8gcmZ1MQorICAgICAgICB9OworICAgICAgICBBSGFyZHdhcmVCdWZmZXIgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIGludCByZXQgPSBBSGFyZHdhcmVCdWZmZXJfYWxsb2NhdGUoJmRlc2MsICZidWZmZXIpOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBGTEVYX0xBWU9VVF9VTktOT1dOOworICAgICAgICB9CisgICAgICAgIGNsYXNzIEF1dG9DbG9zZXIgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBBdXRvQ2xvc2VyKEFIYXJkd2FyZUJ1ZmZlciAqYnVmZmVyKSA6IG1CdWZmZXIoYnVmZmVyKSwgbUxvY2tlZChmYWxzZSkge30KKyAgICAgICAgICAgIH5BdXRvQ2xvc2VyKCkgeworICAgICAgICAgICAgICAgIGlmIChtTG9ja2VkKSB7CisgICAgICAgICAgICAgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl91bmxvY2sobUJ1ZmZlciwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9yZWxlYXNlKG1CdWZmZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHNldExvY2tlZCgpIHsgbUxvY2tlZCA9IHRydWU7IH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgQUhhcmR3YXJlQnVmZmVyICptQnVmZmVyOworICAgICAgICAgICAgYm9vbCBtTG9ja2VkOworICAgICAgICB9IGF1dG9DbG9zZXIoYnVmZmVyKTsKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX1BsYW5lcyBwbGFuZXM7CisgICAgICAgIHJldCA9IEFIYXJkd2FyZUJ1ZmZlcl9sb2NrUGxhbmVzKAorICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQURfT0ZURU4gfCBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1dSSVRFX09GVEVOLAorICAgICAgICAgICAgICAgIC0xLCAgICAgICAvLyBmZW5jZQorICAgICAgICAgICAgICAgIG51bGxwdHIsICAvLyByZWN0CisgICAgICAgICAgICAgICAgJnBsYW5lcyk7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgQUhhcmR3YXJlQnVmZmVyX3JlbGVhc2UoYnVmZmVyKTsKKyAgICAgICAgICAgIHJldHVybiBGTEVYX0xBWU9VVF9VTktOT1dOOworICAgICAgICB9CisgICAgICAgIGF1dG9DbG9zZXIuc2V0TG9ja2VkKCk7CisgICAgICAgIGlmIChwbGFuZXMucGxhbmVDb3VudCAhPSAzKSB7CisgICAgICAgICAgICByZXR1cm4gRkxFWF9MQVlPVVRfVU5LTk9XTjsKKyAgICAgICAgfQorICAgICAgICBpZiAocGxhbmVzLnBsYW5lc1swXS5waXhlbFN0cmlkZSAhPSAxKSB7CisgICAgICAgICAgICByZXR1cm4gRkxFWF9MQVlPVVRfVU5LTk9XTjsKKyAgICAgICAgfQorICAgICAgICBpZiAocGxhbmVzLnBsYW5lc1sxXS5waXhlbFN0cmlkZSA9PSAxICYmIHBsYW5lcy5wbGFuZXNbMl0ucGl4ZWxTdHJpZGUgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIEZMRVhfTEFZT1VUX1BMQU5BUjsKKyAgICAgICAgfQorICAgICAgICBpZiAocGxhbmVzLnBsYW5lc1sxXS5waXhlbFN0cmlkZSA9PSAyICYmIHBsYW5lcy5wbGFuZXNbMl0ucGl4ZWxTdHJpZGUgPT0gMikgeworICAgICAgICAgICAgc3NpemVfdCB1dkRpc3QgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4ocGxhbmVzLnBsYW5lc1syXS5kYXRhKSAtCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdCAqPihwbGFuZXMucGxhbmVzWzFdLmRhdGEpOworICAgICAgICAgICAgaWYgKHV2RGlzdCA9PSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZMRVhfTEFZT1VUX1NFTUlQTEFOQVJfVVY7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHV2RGlzdCA9PSAtMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBGTEVYX0xBWU9VVF9TRU1JUExBTkFSX1ZVOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEZMRVhfTEFZT1VUX1VOS05PV047CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEZMRVhfTEFZT1VUX1VOS05PV047CisgICAgfSgpOworICAgIHJldHVybiBzTGF5b3V0OworfQorCiBNZWRpYUltYWdlMiBDcmVhdGVZVVY0MjBQbGFuYXJNZWRpYUltYWdlMigKICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCB2c3RyaWRlKSB7CiAgICAgcmV0dXJuIE1lZGlhSW1hZ2UyIHsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmgKaW5kZXggYWZhZGYwMC4uYWYyOWU4MSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmgKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmgKQEAgLTk2LDYgKzk2LDExIEBACiBib29sIElzTlYxMihjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KTsKIAogLyoqCisgKiBSZXR1cm5zIHRydWUgaWZmIGEgdmlldyBoYXMgYSBOVjIxIGxheW91dC4KKyAqLworYm9vbCBJc05WMjEoY29uc3QgQzJHcmFwaGljVmlldyAmdmlldyk7CisKKy8qKgogICogUmV0dXJucyB0cnVlIGlmZiBhIHZpZXcgaGFzIGEgSTQyMCBsYXlvdXQuCiAgKi8KIGJvb2wgSXNJNDIwKGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcpOwpAQCAtMTExLDEwICsxMTYsMjYgQEAKIGJvb2wgSXNOVjEyKGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpOwogCiAvKioKKyAqIFJldHVybnMgdHJ1ZSBpZmYgYSBNZWRpYUltYWdlMiBoYXMgYSBOVjIxIGxheW91dC4KKyAqLworYm9vbCBJc05WMjEoY29uc3QgTWVkaWFJbWFnZTIgKmltZyk7CisKKy8qKgogICogUmV0dXJucyB0cnVlIGlmZiBhIE1lZGlhSW1hZ2UyIGhhcyBhIEk0MjAgbGF5b3V0LgogICovCiBib29sIElzSTQyMChjb25zdCBNZWRpYUltYWdlMiAqaW1nKTsKIAorZW51bSBGbGV4TGF5b3V0IHsKKyAgICBGTEVYX0xBWU9VVF9VTktOT1dOLAorICAgIEZMRVhfTEFZT1VUX1BMQU5BUiwKKyAgICBGTEVYX0xBWU9VVF9TRU1JUExBTkFSX1VWLAorICAgIEZMRVhfTEFZT1VUX1NFTUlQTEFOQVJfVlUsCit9OworLyoqCisgKiBSZXR1cm5zIGxheW91dCBvZiBZQ0JDUl80MjBfODg4IHBpeGVsIGZvcm1hdC4KKyAqLworRmxleExheW91dCBHZXRZdXY0MjBGbGV4aWJsZUxheW91dCgpOworCiAvKioKICAqIEEgcmF3IG1lbW9yeSBibG9jayB0byB1c2UgZm9yIGludGVybmFsIGJ1ZmZlcnMuCiAgKgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmNwcAppbmRleCA5MDNkYjZjLi4wMGJmODRmIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmNwcApAQCAtMzExLDYgKzMxMSw4IEBACiAgICAgeyBDMkNvbmZpZzo6UENNXzgsIGtBdWRpb0VuY29kaW5nUGNtOGJpdCB9LAogICAgIHsgQzJDb25maWc6OlBDTV8xNiwga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCB9LAogICAgIHsgQzJDb25maWc6OlBDTV9GTE9BVCwga0F1ZGlvRW5jb2RpbmdQY21GbG9hdCB9LAorICAgIHsgQzJDb25maWc6OlBDTV8yNCwga0F1ZGlvRW5jb2RpbmdQY20yNGJpdFBhY2tlZCB9LAorICAgIHsgQzJDb25maWc6OlBDTV8zMiwga0F1ZGlvRW5jb2RpbmdQY20zMmJpdCB9LAogfTsKIAogQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc1ZwOUxldmVscyA9IHsKQEAgLTk1OCwxNyArOTYwLDE2IEBACiAgICAgICAgICAgICAqYzJWYWx1ZSA9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOgotICAgICAgICAgICAgKmMyVmFsdWUgPSBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODg7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXI6CiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKLSAgICAgICAgICAgICpjMlZhbHVlID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgICAgICAgICAgKmMyVmFsdWUgPSBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODg7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgc29tZSBzb3J0IG9mIHBhc3N0aHJvdWdoCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAvLyBQYXNzdGhyb3VnaAorICAgICAgICAgICAgKmMyVmFsdWUgPSB1aW50MzJfdChmcmFtZXdvcmtWYWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiB9CiAKQEAgLTk3OSwxMSArOTgwLDE2IEBACiAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOgogICAgICAgICAgICAgKmZyYW1ld29ya1ZhbHVlID0gQ09MT1JfRm9ybWF0U3VyZmFjZTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWVYxMjoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMl9TUDoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDUkNCXzQyMF9TUDoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMl9JOgogICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4ODoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lWMTI6CiAgICAgICAgICAgICAqZnJhbWV3b3JrVmFsdWUgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgLy8gUGFzc3Rocm91Z2gKKyAgICAgICAgICAgICpmcmFtZXdvcmtWYWx1ZSA9IGludDMyX3QoYzJWYWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGZjZTZlMjEuLjhlYmI2YzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogImNvZGVjMl9jb3JlX3BhcmFtX3Rlc3QiLAogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJQYXJhbV90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwCmluZGV4IDU2NGQ0ZDIuLmJiODEzMGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwCkBAIC05Niw3ICs5Niw3IEBACiAgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKICAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOyAgLy8gPD0gbmVlZGVkIGZvciBDMkZpZWxkRGVzY3JpcHRvcgogICAgIGNvbnN0IHN0YXRpYyBGRDo6dHlwZV90IFRZUEUgPSAoRkQ6OnR5cGVfdCkoQ09SRV9JTkRFWCB8IEZEOjpTVFJVQ1RfRkxBRyk7Ci19OworfSBDMl9QQUNLOwogCiBERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihDMlNpemVTdHJ1Y3QpCiAKQEAgLTExMSwxMSArMTExLDEzIEBACiAKIHN0cnVjdCBDMlRlc3RTdHJ1Y3RfQSB7CiAgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICAvLyA0LWJ5dGUgcGFkZGluZwogICAgIGludDY0X3Qgc2lnbmVkNjRbMl07CiAgICAgdWludDMyX3QgdW5zaWduZWQzMlsxXTsKKyAgICAvLyA0LWJ5dGUgcGFkZGluZwogICAgIHVpbnQ2NF90IHVuc2lnbmVkNjQ7CiAgICAgZmxvYXQgZnAzMjsKLSAgICBDMlNpemVTdHJ1Y3Qgc3pbM107CisgICAgQzJTaXplU3RydWN0IHN6WzNdOyAvLyA4LWJ5dGUgc3RydWN0dXJlLCBidXQgNC1ieXRlIGFsaWduZWQKICAgICB1aW50OF90IGJsb2JbMTAwXTsKICAgICBjaGFyIHN0cmluZ1sxMDBdOwogICAgIGJvb2wgeWVzTm9bMTAwXTsKQEAgLTEyNCwyMSArMTI2LDIxIEBACiAgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKICAgICAvLyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXhUZXN0IH07CiAgICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfQSBfdHlwZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKTsKIAogY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9BOjpGaWVsZExpc3QoKSB7CiAgICAgcmV0dXJuIF9GSUVMRF9MSVNUOwogfQogY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9BOjpfRklFTERfTElTVCA9CiAgICAgeyB7IEZEOjpJTlQzMiwgICAgMSwgInMzMiIsICAgMCwgNCB9LAotICAgICAgeyBGRDo6SU5UNjQsICAgIDIsICJzNjQiLCAgIDQsIDggfSwKLSAgICAgIHsgRkQ6OlVJTlQzMiwgICAxLCAidTMyIiwgIDIwLCA0IH0sCi0gICAgICB7IEZEOjpVSU5UNjQsICAgMSwgInU2NCIsICAyNCwgOCB9LAotICAgICAgeyBGRDo6RkxPQVQsICAgIDEsICJmcCIsICAgMzIsIDQgfSwKLSAgICAgIHsgQzJTaXplU3RydWN0OjpUWVBFLCAzLCAic2l6ZSIsIDM2LCA4IH0sCi0gICAgICB7IEZEOjpCTE9CLCAgIDEwMCwgImJsb2IiLCA2MCwgMSB9LAotICAgICAgeyBGRDo6U1RSSU5HLCAxMDAsICJzdHIiLCAxNjAsIDEgfSwKLSAgICAgIHsgRkQ6OkJMT0IsICAgMTAwLCAieS1uIiwgMjYwLCAxIH0gfTsKKyAgICAgIHsgRkQ6OklOVDY0LCAgICAyLCAiczY0IiwgICA4LCA4IH0sCisgICAgICB7IEZEOjpVSU5UMzIsICAgMSwgInUzMiIsICAyNCwgNCB9LAorICAgICAgeyBGRDo6VUlOVDY0LCAgIDEsICJ1NjQiLCAgMzIsIDggfSwKKyAgICAgIHsgRkQ6OkZMT0FULCAgICAxLCAiZnAiLCAgIDQwLCA0IH0sCisgICAgICB7IEMyU2l6ZVN0cnVjdDo6VFlQRSwgMywgInNpemUiLCA0NCwgOCB9LAorICAgICAgeyBGRDo6QkxPQiwgICAxMDAsICJibG9iIiwgNjgsIDEgfSwKKyAgICAgIHsgRkQ6OlNUUklORywgMTAwLCAic3RyIiwgMTY4LCAxIH0sCisgICAgICB7IEZEOjpCTE9CLCAgIDEwMCwgInktbiIsIDI2OCwgMSB9IH07CiAKIFRFU1RfUChDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgVmVyaWZ5U3RydWN0KSB7CiAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IEdldFBhcmFtKCksIGV4cGVjdGVkID0gQzJUZXN0U3RydWN0X0E6Ol9GSUVMRF9MSVNUOwpAQCAtMTk4LDExICsyMDAsMTMgQEAKIAogc3RydWN0IEMyVGVzdEFTdHJ1Y3QgewogICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgLy8gNC1ieXRlIHBhZGRpbmcKICAgICBpbnQ2NF90IHNpZ25lZDY0WzJdOwogICAgIHVpbnQzMl90IHVuc2lnbmVkMzJbMV07CisgICAgLy8gNC1ieXRlIHBhZGRpbmcKICAgICB1aW50NjRfdCB1bnNpZ25lZDY0OwogICAgIGZsb2F0IGZwMzI7Ci0gICAgQzJTaXplU3RydWN0IHN6WzNdOworICAgIEMyU2l6ZVN0cnVjdCBzelszXTsgLy8gOC1ieXRlIHN0cnVjdHVyZSwgYnV0IDQtYnl0ZSBhbGlnbmVkCiAgICAgdWludDhfdCBibG9iWzEwMF07CiAgICAgY2hhciBzdHJpbmdbMTAwXTsKICAgICBib29sIHllc05vWzEwMF07CkBAIC0yMjksMTEgKzIzMywxMyBAQAogCiBzdHJ1Y3QgQzJUZXN0QlN0cnVjdCB7CiAgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICAvLyA0LWJ5dGUgcGFkZGluZwogICAgIGludDY0X3Qgc2lnbmVkNjRbMl07CiAgICAgdWludDMyX3QgdW5zaWduZWQzMlsxXTsKKyAgICAvLyA0LWJ5dGUgcGFkZGluZwogICAgIHVpbnQ2NF90IHVuc2lnbmVkNjQ7CiAgICAgZmxvYXQgZnAzMjsKLSAgICBDMlNpemVTdHJ1Y3Qgc3pbM107CisgICAgQzJTaXplU3RydWN0IHN6WzNdOyAvLyA4LWJ5dGUgc3RydWN0dXJlLCBidXQgNC1ieXRlIGFsaWduZWQKICAgICB1aW50OF90IGJsb2JbMTAwXTsKICAgICBjaGFyIHN0cmluZ1sxMDBdOwogICAgIGJvb2wgeWVzTm9bMTAwXTsKQEAgLTI4Niw3ICsyOTIsNyBAQAogICAgICAgICBpZiAoZmllbGRzLnNpemUoKSA+IDEpIHsKICAgICAgICAgICAgIEVYUEVDVF9FUSgydSwgZmllbGRzLnNpemUoKSk7CiAgICAgICAgICAgICBFWFBFQ1RfRVEoQzJGaWVsZERlc2NyaXB0b3IoRkQ6OklOVDMyLCAxLCAiczMyIiwgMCwgNCksIGZpZWxkc1swXSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoQzJGaWVsZERlc2NyaXB0b3IodGhpcy0+RmxleFR5cGUsIDAsICJmbGV4IiwgNCwgdGhpcy0+RkxFWF9TSVpFKSwKKyAgICAgICAgICAgIEVYUEVDVF9FUShDMkZpZWxkRGVzY3JpcHRvcih0aGlzLT5GbGV4VHlwZSwgMCwgImZsZXgiLCBhbGlnbm9mKFR5cGVQYXJhbSkgLyogb2Zmc2V0ICovLCB0aGlzLT5GTEVYX1NJWkUpLAogICAgICAgICAgICAgICAgICAgICAgIGZpZWxkc1sxXSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOwpAQCAtMzkyLDYgKzM5OCw3IEBACiAKIHN0cnVjdCBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NCB7CiAgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICAvLyA0LWJ5dGUgcGFkZGluZwogICAgIGludDY0X3QgbVNpZ25lZDY0RmxleFtdOwogCiAgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKQEAgLTQwNiw3ICs0MTMsNyBAQAogfQogY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4RW5kUzY0OjpfRklFTERfTElTVCA9IHsKICAgICB7IEZEOjpJTlQzMiwgMSwgInMzMiIsIDAsIDQgfSwKLSAgICB7IEZEOjpJTlQ2NCwgMCwgImZsZXgiLCA0LCA4IH0sCisgICAgeyBGRDo6SU5UNjQsIDAsICJmbGV4IiwgOCwgOCB9LAogfTsKIAogc3RydWN0IEMyVGVzdEZsZXhTNjRTdHJ1Y3QgewpAQCAtNDE5LDYgKzQyNiw3IEBACiAKIHN0cnVjdCBDMlRlc3RGbGV4RW5kUzY0U3RydWN0IHsKICAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIC8vIDQtYnl0ZSBwYWRkaW5nCiAgICAgaW50NjRfdCBtRmxleFNpZ25lZDY0W107CiAgICAgQzJUZXN0RmxleEVuZFM2NFN0cnVjdCgpIHt9CiAKQEAgLTQ2OCw3ICs0NzYsNyBAQAogICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemUsIEZMRVhfU0laRSA9IDggfTsKICAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZSBfdHlwZTsKICAgICAvLyB0eXBlZGVmIEMyU2l6ZVN0cnVjdCBGbGV4VHlwZTsKLX07Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKTsKIAogY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZTo6RmllbGRMaXN0KCkgewogICAgIHJldHVybiBfRklFTERfTElTVDsKQEAgLTUzOSwxNCArNTQ3LDE0IEBACiBURVNUX0YoQzJQYXJhbVRlc3QsIEZpZWxkSWQpIHsKICAgICAvLyBwb2ludGVyIGNvbnN0cnVjdG9yCiAgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5zaWduZWQzMikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+c2lnbmVkNjQpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyMCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT51bnNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+dW5zaWduZWQ2NCkpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPmZwMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzNiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5zeikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDYwLCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPmJsb2IpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNjAsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+c3RyaW5nKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjYwLCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnllc05vKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI0LCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnVuc2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT51bnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+ZnAzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQ0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnN6KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNjgsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+YmxvYikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2OCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5zdHJpbmcpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNjgsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+eWVzTm8pKTsKIAogICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplU3RydWN0KikwKS0+c2lnbmVkMzIpKTsKICAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCopMCktPm1GbGV4U2l6ZSkpOwpAQCAtNTU2LDE0ICs1NjQsMTQgQEAKIAogICAgIC8vIG1lbWJlciBwb2ludGVyIGNvbnN0cnVjdG9yCiAgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDY0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjp1bnNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjQsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjp1bnNpZ25lZDY0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpmcDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzYsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzeikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDYwLCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6YmxvYikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2MCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnN0cmluZykpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2MCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6Onllc05vKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjQsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjp1bnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjp1bnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpmcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDQsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzeikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDY4LCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6YmxvYikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2OCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2OCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6Onllc05vKSk7CiAKICAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QqKTAsICZDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdDo6c2lnbmVkMzIpKTsKICAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QqKTAsICZDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdDo6bUZsZXhTaXplKSk7CkBAIC01NzMsMTQgKzU4MSwxNCBAQAogCiAgICAgLy8gbWVtYmVyIHBvaW50ZXIgc2FucyB0eXBlIHBvaW50ZXIKICAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpzaWduZWQ2NCkpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDIwLCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNCwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjp1bnNpZ25lZDY0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6ZnAzMikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDM2LCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnN6KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNjAsIDEpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6YmxvYikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2MCwgMSksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpzdHJpbmcpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNjAsIDEpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6eWVzTm8pKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg4LCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjQsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0MCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpmcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDQsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2OCwgMSksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTY4LCAxKSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2OCwgMSksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjp5ZXNObykpOwogCiAgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjpzaWduZWQzMikpOwogICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdDo6bUZsZXhTaXplKSk7CkBAIC01OTQsMTQgKzYwMiwxNCBAQAogCiAgICAgLy8gcG9pbnRlciBjb25zdHJ1Y3RvciBpbiBDMlBhcmFtCiAgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5zaWduZWQzMikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnNpZ25lZDY0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjgsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+dW5zaWduZWQzMikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnVuc2lnbmVkNjQpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0MCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5mcDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+c3opKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2OCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5ibG9iKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTY4LCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnN0cmluZykpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2OCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT55ZXNObykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQwLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0OCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5mcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNTIsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg3NiwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5ibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTc2LCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI3NiwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT55ZXNObykpOwogCiAgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVJbmZvKikwKS0+bS5zaWduZWQzMikpOwogICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RGbGV4RW5kU2l6ZUluZm8qKTApLT5tLm1GbGV4U2l6ZSkpOwpAQCAtNjExLDE0ICs2MTksMTQgQEAKIAogICAgIC8vIG1lbWJlciBwb2ludGVyIGluIEMyUGFyYW0KICAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg4LCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6c2lnbmVkMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnNpZ25lZDY0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjgsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjp1bnNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjp1bnNpZ25lZDY0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpmcDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDQsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpzeikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDY4LCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6YmxvYikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2OCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnN0cmluZykpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2OCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86Onllc05vKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTYsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpzaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQwLCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6dW5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQ4LCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6ZnAzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDUyLCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg3NiwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OmJsb2IpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNzYsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpzdHJpbmcpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNzYsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjp5ZXNObykpOwogCiAgICAgLy8gTk9URTogY2Fubm90IHVzZSBhIG1lbWJlciBwb2ludGVyIGZvciBmbGV4IHBhcmFtcyBkdWUgdG8gaW50cm9kdWN0aW9uIG9mICdtJwogICAgIC8vIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZUluZm86Om0uc2lnbmVkMzIpKTsKQEAgLTIzMjgsNiArMjMzNiwxNyBAQAogICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShibG9iVmFsdWUtPm0udmFsdWUpLCB1aW50OF90W10+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50OF90W10iKTsKICAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChibG9iVmFsdWUtPm0udmFsdWUsICJBQkNEXDAiLCA2KSk7CiAgICAgICAgIEVYUEVDVF9FUSg2dSwgYmxvYlZhbHVlLT5mbGV4Q291bnQoKSk7CisgICAgICAgIGJsb2JWYWx1ZS0+c2V0RmxleENvdW50KDd1KTsgLy8gaW5jcmVhc2luZyB0aGUgY291bnQgZG9lcyBub3QgY2hhbmdlIGl0CisgICAgICAgIEVYUEVDVF9FUSg2dSwgYmxvYlZhbHVlLT5mbGV4Q291bnQoKSk7CisgICAgICAgIGJsb2JWYWx1ZS0+c2V0RmxleENvdW50KDJ1KTsgLy8gZGVjcmVhc2luZyB0aGUgY291bnQgY2hhbmdlcyBpdCB0byBpdAorICAgICAgICBFWFBFQ1RfRVEoMnUsIGJsb2JWYWx1ZS0+ZmxleENvdW50KCkpOworICAgICAgICBibG9iVmFsdWUtPnNldEZsZXhDb3VudCgwdSk7IC8vIGNhbiBkZWNyZWFzZSB0byAwIGFuZCBibG9iIHJlbWFpbnMgdmFsaWQKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBibG9iVmFsdWUtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmJsb2JWYWx1ZSk7CisgICAgICAgIGJsb2JWYWx1ZS0+aW52YWxpZGF0ZSgpOyAvLyBmbGV4IHBhcmFtcyBjYW4gYmUgaW52YWxpZGF0ZWQgPT4gcmVzdWx0cyBpbiAwIHNpemUKKyAgICAgICAgRVhQRUNUX0ZBTFNFKCpibG9iVmFsdWUpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJsb2JWYWx1ZS0+c2l6ZSgpKTsKKwogICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gYmxvYlZhbHVlLT5GaWVsZExpc3QoKTsKICAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKICAgICAgICAgRVhQRUNUX0VRKEZEOjpCTE9CLCBmaWVsZHMuY2JlZ2luKCktPnR5cGUoKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJVdGlsVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJVdGlsVGVzdC5jcHAKaW5kZXggNTljZDMxMy4uMmQ2NmRmMSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3Rlc3RzL0MyVXRpbFRlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlV0aWxUZXN0LmNwcApAQCAtNzgsNyArNzgsNyBAQAogICAgICAgeyAidmFsdWUyIiwgRW51bTNWYWx1ZTIgfSwKICAgICAgIHsgInZhbHVlNCIsIEVudW0zVmFsdWU0IH0sCiAgICAgICB7ICJpbnZhbGlkIiwgSW52YWxpZCB9IH0pOwotICAgIEVudW0zIGUzOworICAgIEVudW0zIGUzKEludmFsaWQpOwogICAgIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0ZvcihlMyk7CiAKICAgICAvLyB1cHBlciBjYXNlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvdm5kay9DMkJ1ZmZlclRlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL3ZuZGsvQzJCdWZmZXJUZXN0LmNwcAppbmRleCA3ODA5OTRhLi4wY2ZiNDY1IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdGVzdHMvdm5kay9DMkJ1ZmZlclRlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy92bmRrL0MyQnVmZmVyVGVzdC5jcHAKQEAgLTE2LDExICsxNiwxMiBAQAogCiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIAotI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CiAjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CiAjaW5jbHVkZSA8QzJCdWZmZXIuaD4KICNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgogI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgogCiAjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CiAKQEAgLTIzMywxMCArMjM0LDEwIEBACiBwdWJsaWM6CiAgICAgQzJCdWZmZXJUZXN0KCkKICAgICAgICAgOiBtQmxvY2tQb29sSWQoQzJCbG9ja1Bvb2w6OlBMQVRGT1JNX1NUQVJUKSwKLSAgICAgICAgICBtTGluZWFyQWxsb2NhdG9yKHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0b3JJb24+KCdpJykpLAogICAgICAgICAgIG1TaXplKDB1KSwKICAgICAgICAgICBtQWRkcihudWxscHRyKSwKICAgICAgICAgICBtR3JhcGhpY0FsbG9jYXRvcihzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdG9yR3JhbGxvYz4oJ2cnKSkgeworICAgICAgICBnZXRMaW5lYXJBbGxvY2F0b3IoJm1MaW5lYXJBbGxvY2F0b3IpOwogICAgIH0KIAogICAgIH5DMkJ1ZmZlclRlc3QoKSA9IGRlZmF1bHQ7CkBAIC0zMjksNiArMzMwLDExIEBACiAgICAgfQogCiBwcml2YXRlOgorICAgIHZvaWQgZ2V0TGluZWFyQWxsb2NhdG9yKHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4qIG1MaW5lYXJBbGxvY2F0b3IpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0gYW5kcm9pZDo6R2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgICAgICBBU1NFUlRfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLCBtTGluZWFyQWxsb2NhdG9yKSwgQzJfT0spOworICAgIH0KKwogICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xJZDsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1MaW5lYXJBbGxvY2F0b3I7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gbUxpbmVhckFsbG9jYXRpb247CkBAIC03NjUsNCArNzcxLDU0IEBACiAgICAgfQogfQogCitURVNUX0YoQzJCdWZmZXJUZXN0LCBJbmZvQnVmZmVyVGVzdCkgeworICAgIGNvbnN0ZXhwciBzaXplX3Qga0NhcGFjaXR5ID0gNTI0Mjg4dTsKKworICAgIC8vIGFsbG9jYXRlIGEgbGluZWFyIGJsb2NrCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBsaW5lYXJQb29sKG1ha2VMaW5lYXJCbG9ja1Bvb2woKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGxpbmVhckJsb2NrOworICAgIEFTU0VSVF9FUShDMl9PSywgbGluZWFyUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIGtDYXBhY2l0eSwKKyAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgJmxpbmVhckJsb2NrKSk7CisKKyAgICBDMkluZm9CdWZmZXIgaW5mbyA9IEMySW5mb0J1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKAorICAgICAgICAgICAga1BhcmFtSW5kZXhOdW1iZXIxLCBsaW5lYXJCbG9jay0+c2hhcmUoMTAyNCwga0NhcGFjaXR5IC8gMiwgQzJGZW5jZSgpKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mb0J1ZmZlcj4gc3BJbmZvKG5ldyBDMkluZm9CdWZmZXIoaW5mbykpOworICAgIEFTU0VSVF9FUShrUGFyYW1JbmRleE51bWJlcjEsIHNwSW5mby0+aW5kZXgoKS5jb3JlSW5kZXgoKSk7CisgICAgQVNTRVJUX1RSVUUoc3BJbmZvLT5pbmRleCgpLmlzR2xvYmFsKCkpOworICAgIEFTU0VSVF9FUShDMlBhcmFtOjpJTkZPLCBzcEluZm8tPmluZGV4KCkua2luZCgpKTsKKyAgICBBU1NFUlRfRVEoQzJCdWZmZXJEYXRhOjpMSU5FQVIsIHNwSW5mby0+ZGF0YSgpLnR5cGUoKSk7CisgICAgQVNTRVJUX0VRKDEwMjQsIHNwSW5mby0+ZGF0YSgpLmxpbmVhckJsb2NrcygpWzBdLm9mZnNldCgpKTsKKyAgICBBU1NFUlRfRVEoa0NhcGFjaXR5IC8gMiwgc3BJbmZvLT5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0uc2l6ZSgpKTsKKyAgICAvLyBoYW5kbGVzIG11c3QgYWN0dWFsbHkgYmUgaWRlbnRpY2FsIGFmdGVyIHNoYXJpbmcgaW50byBhbiBpbmZvIGJ1ZmZlcgorICAgIEFTU0VSVF9FUShsaW5lYXJCbG9jay0+aGFuZGxlKCksIHNwSW5mby0+ZGF0YSgpLmxpbmVhckJsb2NrcygpWzBdLmhhbmRsZSgpKTsKKyAgICBBU1NFUlRfRVEobGluZWFyUG9vbC0+Z2V0QWxsb2NhdG9ySWQoKSwgc3BJbmZvLT5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0uZ2V0QWxsb2NhdG9ySWQoKSk7CisKKyAgICBDMkluZm9CdWZmZXIgc3RyZWFtSW5mbyA9IGluZm8uYXNTdHJlYW0oZmFsc2UgLyogb3V0cHV0ICovLCAgMXUpOworICAgIEFTU0VSVF9FUShrUGFyYW1JbmRleE51bWJlcjEsIHN0cmVhbUluZm8uaW5kZXgoKS5jb3JlSW5kZXgoKSk7CisgICAgQVNTRVJUX1RSVUUoc3RyZWFtSW5mby5pbmRleCgpLmZvclN0cmVhbSgpKTsKKyAgICBBU1NFUlRfVFJVRShzdHJlYW1JbmZvLmluZGV4KCkuZm9ySW5wdXQoKSk7CisgICAgQVNTRVJUX0VRKDF1LCBzdHJlYW1JbmZvLmluZGV4KCkuc3RyZWFtKCkpOworICAgIEFTU0VSVF9FUShDMlBhcmFtOjpJTkZPLCBzdHJlYW1JbmZvLmluZGV4KCkua2luZCgpKTsKKyAgICBBU1NFUlRfRVEoQzJCdWZmZXJEYXRhOjpMSU5FQVIsIHN0cmVhbUluZm8uZGF0YSgpLnR5cGUoKSk7CisgICAgQVNTRVJUX0VRKDEwMjQsIHN0cmVhbUluZm8uZGF0YSgpLmxpbmVhckJsb2NrcygpWzBdLm9mZnNldCgpKTsKKyAgICBBU1NFUlRfRVEoa0NhcGFjaXR5IC8gMiwgc3RyZWFtSW5mby5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0uc2l6ZSgpKTsKKyAgICAvLyBoYW5kbGVzIG11c3QgYWN0dWFsbHkgYmUgaWRlbnRpY2FsIGFmdGVyIHNoYXJpbmcgaW50byBhbiBpbmZvIGJ1ZmZlcgorICAgIEFTU0VSVF9FUShsaW5lYXJCbG9jay0+aGFuZGxlKCksIHN0cmVhbUluZm8uZGF0YSgpLmxpbmVhckJsb2NrcygpWzBdLmhhbmRsZSgpKTsKKyAgICBBU1NFUlRfRVEobGluZWFyUG9vbC0+Z2V0QWxsb2NhdG9ySWQoKSwgc3RyZWFtSW5mby5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0uZ2V0QWxsb2NhdG9ySWQoKSk7CisKKyAgICBDMkluZm9CdWZmZXIgcG9ydEluZm8gPSBzdHJlYW1JbmZvLmFzUG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgQVNTRVJUX0VRKGtQYXJhbUluZGV4TnVtYmVyMSwgcG9ydEluZm8uaW5kZXgoKS5jb3JlSW5kZXgoKSk7CisgICAgQVNTRVJUX1RSVUUocG9ydEluZm8uaW5kZXgoKS5mb3JQb3J0KCkpOworICAgIEFTU0VSVF9UUlVFKHBvcnRJbmZvLmluZGV4KCkuZm9yT3V0cHV0KCkpOworICAgIEFTU0VSVF9FUShDMlBhcmFtOjpJTkZPLCBwb3J0SW5mby5pbmRleCgpLmtpbmQoKSk7CisgICAgQVNTRVJUX0VRKEMyQnVmZmVyRGF0YTo6TElORUFSLCBwb3J0SW5mby5kYXRhKCkudHlwZSgpKTsKKyAgICBBU1NFUlRfRVEoMTAyNCwgcG9ydEluZm8uZGF0YSgpLmxpbmVhckJsb2NrcygpWzBdLm9mZnNldCgpKTsKKyAgICBBU1NFUlRfRVEoa0NhcGFjaXR5IC8gMiwgcG9ydEluZm8uZGF0YSgpLmxpbmVhckJsb2NrcygpWzBdLnNpemUoKSk7CisgICAgLy8gaGFuZGxlcyBtdXN0IGFjdHVhbGx5IGJlIGlkZW50aWNhbCBhZnRlciBzaGFyaW5nIGludG8gYW4gaW5mbyBidWZmZXIKKyAgICBBU1NFUlRfRVEobGluZWFyQmxvY2stPmhhbmRsZSgpLCBwb3J0SW5mby5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0uaGFuZGxlKCkpOworICAgIEFTU0VSVF9FUShsaW5lYXJQb29sLT5nZXRBbGxvY2F0b3JJZCgpLCBwb3J0SW5mby5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0uZ2V0QWxsb2NhdG9ySWQoKSk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvdm5kay9BbmRyb2lkLmJwCmluZGV4IDZmN2FjY2UuLjA0MDFjMWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9pbnRlcm5hbCIsCiAKQEAgLTEzLDcgKzIyLDcgQEAKIAogLy8gISEhRE8gTk9UIERFUEVORCBPTiBUSElTIFNIQVJFRCBMSUJSQVJZIERJUkVDVExZISEhCiAvLyB1c2UgbGliY29kZWMyLWltcGwtZGVmYXVsdHMgaW5zdGVhZAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl92bmRrIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKQEAgLTI2LDYgKzM1LDcgQEAKICAgICAgICAgIkMyQWxsb2NhdG9yR3JhbGxvYy5jcHAiLAogICAgICAgICAiQzJCdWZmZXIuY3BwIiwKICAgICAgICAgIkMyQ29uZmlnLmNwcCIsCisgICAgICAgICJDMkRtYUJ1ZkFsbG9jYXRvci5jcHAiLAogICAgICAgICAiQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmNwcCIsCiAgICAgICAgICJDMlN0b3JlLmNwcCIsCiAgICAgICAgICJwbGF0Zm9ybS9DMkJxQnVmZmVyLmNwcCIsCkBAIC02NCw2ICs3NCw3IEBACiAgICAgICAgICJsaWJoYXJkd2FyZSIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAgICJsaWJpb24iLAorICAgICAgICAibGliZG1hYnVmaGVhcCIsCiAgICAgICAgICJsaWJmbXEiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCkBAIC0xMTAsNCArMTIxLDMgQEAKIAogICAgIC8vIFRPRE86IHNlcGFyYXRlIGludGVybmFsIGhlYWRlcnMgc28gdGhleSBjYW4gYmUgZXhwb3NlZCBoZXJlCiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yQmxvYi5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvckJsb2IuY3BwCmluZGV4IDUwYzllNTkuLjYzNDBjYmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yQmxvYi5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JCbG9iLmNwcApAQCAtMTcsNiArMTcsOCBAQAogLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQzJBbGxvY2F0b3JCbG9iIgogCisjaW5jbHVkZSA8c2V0PgorCiAjaW5jbHVkZSA8QzJBbGxvY2F0b3JCbG9iLmg+CiAjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KIApAQCAtNjcsNiArNjksMTAgQEAKIHByaXZhdGU6CiAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IG1HcmFwaGljQWxsb2NhdGlvbjsKICAgICBjb25zdCBDMkFsbG9jYXRvcjo6aWRfdCBtQWxsb2NhdG9ySWQ7CisKKyAgICBzdGQ6Om11dGV4IG1NYXBMb2NrOworICAgIHN0ZDo6bXVsdGlzZXQ8c3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90Pj4gbU1hcHBlZE9mZnNldFNpemU7CisgICAgdWludDhfdCAqbU1hcHBlZEFkZHI7CiB9OwogCiBDMkFsbG9jYXRpb25CbG9iOjpDMkFsbG9jYXRpb25CbG9iKApAQCAtNzQsMjAgKzgwLDc0IEBACiAgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkKQogICAgICAgOiBDMkxpbmVhckFsbG9jYXRpb24oY2FwYWNpdHkpLAogICAgICAgICBtR3JhcGhpY0FsbG9jYXRpb24oc3RkOjptb3ZlKGdyYXBoaWNBbGxvY2F0aW9uKSksCi0gICAgICAgIG1BbGxvY2F0b3JJZChhbGxvY2F0b3JJZCkge30KKyAgICAgICAgbUFsbG9jYXRvcklkKGFsbG9jYXRvcklkKSwKKyAgICAgICAgbU1hcHBlZEFkZHIobnVsbHB0cikge30KIAotQzJBbGxvY2F0aW9uQmxvYjo6fkMyQWxsb2NhdGlvbkJsb2IoKSB7fQorQzJBbGxvY2F0aW9uQmxvYjo6fkMyQWxsb2NhdGlvbkJsb2IoKSB7CisgICAgaWYgKG1NYXBwZWRBZGRyKSB7CisgICAgICAgIEMyUmVjdCByZWN0KGNhcGFjaXR5KCksIGtMaW5lYXJCdWZmZXJIZWlnaHQpOworICAgICAgICBtR3JhcGhpY0FsbG9jYXRpb24tPnVubWFwKCZtTWFwcGVkQWRkciwgcmVjdCwgbnVsbHB0cik7CisgICAgfQorfQogCiBjMl9zdGF0dXNfdCBDMkFsbG9jYXRpb25CbG9iOjptYXAoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGZW5jZSogZmVuY2UsIHZvaWQqKiBhZGRyIC8qIG5vbm51bGwgKi8pIHsKKyAgICAqYWRkciA9IG51bGxwdHI7CisgICAgaWYgKHNpemUgPiBjYXBhY2l0eSgpIHx8IG9mZnNldCA+IGNhcGFjaXR5KCkgfHwgb2Zmc2V0ID4gY2FwYWNpdHkoKSAtIHNpemUpIHsKKyAgICAgICAgQUxPR1YoIkMyQWxsb2NhdGlvbkJsb2I6IG1hcDogYmFkIG9mZnNldCAvIHNpemU6IG9mZnNldD0lenUgc2l6ZT0lenUgY2FwYWNpdHk9JXUiLAorICAgICAgICAgICAgICAgIG9mZnNldCwgc2l6ZSwgY2FwYWNpdHkoKSk7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTWFwTG9jayk7CisgICAgaWYgKG1NYXBwZWRBZGRyKSB7CisgICAgICAgICphZGRyID0gbU1hcHBlZEFkZHIgKyBvZmZzZXQ7CisgICAgICAgIG1NYXBwZWRPZmZzZXRTaXplLmluc2VydCh7b2Zmc2V0LCBzaXplfSk7CisgICAgICAgIEFMT0dWKCJDMkFsbG9jYXRpb25CbG9iOiBtYXBwZWQgZnJvbSBleGlzdGluZyBtYXBwaW5nOiBvZmZzZXQ9JXp1IHNpemU9JXp1IGNhcGFjaXR5PSV1IiwKKyAgICAgICAgICAgICAgICBvZmZzZXQsIHNpemUsIGNhcGFjaXR5KCkpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQogICAgIEMyUGxhbmFyTGF5b3V0IGxheW91dDsKLSAgICBDMlJlY3QgcmVjdCA9IEMyUmVjdChzaXplLCBrTGluZWFyQnVmZmVySGVpZ2h0KS5hdChvZmZzZXQsIDB1KTsKLSAgICByZXR1cm4gbUdyYXBoaWNBbGxvY2F0aW9uLT5tYXAocmVjdCwgdXNhZ2UsIGZlbmNlLCAmbGF5b3V0LCByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqKj4oYWRkcikpOworICAgIEMyUmVjdCByZWN0ID0gQzJSZWN0KGNhcGFjaXR5KCksIGtMaW5lYXJCdWZmZXJIZWlnaHQpOworICAgIGMyX3N0YXR1c190IGVyciA9IG1HcmFwaGljQWxsb2NhdGlvbi0+bWFwKHJlY3QsIHVzYWdlLCBmZW5jZSwgJmxheW91dCwgJm1NYXBwZWRBZGRyKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dWKCJDMkFsbG9jYXRpb25CbG9iOiBtYXAgZmFpbGVkOiBvZmZzZXQ9JXp1IHNpemU9JXp1IGNhcGFjaXR5PSV1IGVycj0lZCIsCisgICAgICAgICAgICAgICAgb2Zmc2V0LCBzaXplLCBjYXBhY2l0eSgpLCBlcnIpOworICAgICAgICBtTWFwcGVkQWRkciA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgICphZGRyID0gbU1hcHBlZEFkZHIgKyBvZmZzZXQ7CisgICAgbU1hcHBlZE9mZnNldFNpemUuaW5zZXJ0KHtvZmZzZXQsIHNpemV9KTsKKyAgICBBTE9HVigiQzJBbGxvY2F0aW9uQmxvYjogbmV3IG1hcCBzdWNjZWVkZWQ6IG9mZnNldD0lenUgc2l6ZT0lenUgY2FwYWNpdHk9JXUiLAorICAgICAgICAgICAgb2Zmc2V0LCBzaXplLCBjYXBhY2l0eSgpKTsKKyAgICByZXR1cm4gQzJfT0s7CiB9CiAKIGMyX3N0YXR1c190IEMyQWxsb2NhdGlvbkJsb2I6OnVubWFwKHZvaWQqIGFkZHIsIHNpemVfdCBzaXplLCBDMkZlbmNlKiBmZW5jZUZkKSB7Ci0gICAgQzJSZWN0IHJlY3Qoc2l6ZSwga0xpbmVhckJ1ZmZlckhlaWdodCk7Ci0gICAgcmV0dXJuIG1HcmFwaGljQWxsb2NhdGlvbi0+dW5tYXAocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kio+KCZhZGRyKSwgcmVjdCwgZmVuY2VGZCk7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NYXBMb2NrKTsKKyAgICB1aW50OF90ICp1OEFkZHIgPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+KGFkZHIpOworICAgIGlmICh1OEFkZHIgPCBtTWFwcGVkQWRkciB8fCBtTWFwcGVkQWRkciArIGNhcGFjaXR5KCkgPCB1OEFkZHIgKyBzaXplKSB7CisgICAgICAgIEFMT0dWKCJDMkFsbG9jYXRpb25CbG9iOiB1bm1hcDogQmFkIGFkZHIgLyBzaXplOiBhZGRyPSVwIHNpemU9JXp1IGNhcGFjaXR5PSV1IiwKKyAgICAgICAgICAgICAgICBhZGRyLCBzaXplLCBjYXBhY2l0eSgpKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisgICAgYXV0byBpdCA9IG1NYXBwZWRPZmZzZXRTaXplLmZpbmQoc3RkOjptYWtlX3BhaXIodThBZGRyIC0gbU1hcHBlZEFkZHIsIHNpemUpKTsKKyAgICBpZiAoaXQgPT0gbU1hcHBlZE9mZnNldFNpemUuZW5kKCkpIHsKKyAgICAgICAgQUxPR1YoIkMyQWxsb2NhdGlvbkJsb2I6IHVucmVjb2duaXplZCBtYXA6IGFkZHI9JXAgc2l6ZT0lenUgY2FwYWNpdHk9JXUiLAorICAgICAgICAgICAgICAgIGFkZHIsIHNpemUsIGNhcGFjaXR5KCkpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICBtTWFwcGVkT2Zmc2V0U2l6ZS5lcmFzZShpdCk7CisgICAgaWYgKCFtTWFwcGVkT2Zmc2V0U2l6ZS5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dWKCJDMkFsbG9jYXRpb25CbG9iOiBzdGlsbCBtYWludGFpbiBtYXBwaW5nOiBhZGRyPSVwIHNpemU9JXp1IGNhcGFjaXR5PSV1IiwKKyAgICAgICAgICAgICAgICBhZGRyLCBzaXplLCBjYXBhY2l0eSgpKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBDMlJlY3QgcmVjdChjYXBhY2l0eSgpLCBrTGluZWFyQnVmZmVySGVpZ2h0KTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtR3JhcGhpY0FsbG9jYXRpb24tPnVubWFwKCZtTWFwcGVkQWRkciwgcmVjdCwgZmVuY2VGZCk7CisgICAgQUxPR1YoIkMyQWxsb2NhdGlvbkJsb2I6IGxhc3QgdW5tYXA6IGFkZHI9JXAgc2l6ZT0lenUgY2FwYWNpdHk9JXUgZXJyPSVkIiwKKyAgICAgICAgICAgIGFkZHIsIHNpemUsIGNhcGFjaXR5KCksIGVycik7CisgICAgbU1hcHBlZEFkZHIgPSBudWxscHRyOworICAgIHJldHVybiBlcnI7CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEJMT0IgQUxMT0NBVE9SID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCkBAIC0xNzUsMTIgKzIzNSwxMiBAQAogfQogCiAvLyBzdGF0aWMKLWJvb2wgQzJBbGxvY2F0b3JCbG9iOjppc1ZhbGlkKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSB7Citib29sIEMyQWxsb2NhdG9yQmxvYjo6Q2hlY2tIYW5kbGUoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pIHsKICAgICBzaXplX3QgY2FwYWNpdHk7CiAgICAgLy8gRGlzdGluZ3Vpc2ggQzJIYW5kbGUgcHVyZWx5IGFsbG9jYXRlZCBieSBDMkFsbG9jYXRvckdyYWxsb2MsIG9yIG9uZSBhbGxvY2F0ZWQgdGhyb3VnaAogICAgIC8vIEMyQWxsb2NhdG9yQmxvYiwgYnkgY2hlY2tpbmcgdGhlIGhhbmRsZSdzIGhlaWdodCBpcyAxLCBhbmQgaXRzIGZvcm1hdCBpcwogICAgIC8vIFBpeGVsRm9ybWF0OjpCTE9CIGJ5IEdldENhcGFjaXR5RnJvbUhhbmRsZSgpLgotICAgIHJldHVybiBDMkFsbG9jYXRvckdyYWxsb2M6OmlzVmFsaWQobykgJiYgR2V0Q2FwYWNpdHlGcm9tSGFuZGxlKG8sICZjYXBhY2l0eSkgPT0gQzJfT0s7CisgICAgcmV0dXJuIEMyQWxsb2NhdG9yR3JhbGxvYzo6Q2hlY2tIYW5kbGUobykgJiYgR2V0Q2FwYWNpdHlGcm9tSGFuZGxlKG8sICZjYXBhY2l0eSkgPT0gQzJfT0s7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvckdyYWxsb2MuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JHcmFsbG9jLmNwcAppbmRleCBlMWUxMzc3Li5iZWU2YjdmIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvckdyYWxsb2MuY3BwCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yR3JhbGxvYy5jcHAKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+CiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlckFsbG9jYXRvci5oPgogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXJNYXBwZXIuaD4KKyNpbmNsdWRlIDx1aS9SZWN0Lmg+CiAKICNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KICNpbmNsdWRlIDxDMkJ1ZmZlci5oPgpAQCAtMTAzLDcgKzEwNCw3IEBACiAgICAgY29uc3Qgc3RhdGljIHVpbnQzMl90IE1BR0lDID0gJ1x4YzJnclx4MDAnOwogCiAgICAgc3RhdGljCi0gICAgY29uc3QgRXh0cmFEYXRhKiBnZXRFeHRyYURhdGEoY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSkgeworICAgIGNvbnN0IEV4dHJhRGF0YSogR2V0RXh0cmFEYXRhKGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUpIHsKICAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyCiAgICAgICAgICAgICAgICAgfHwgbmF0aXZlX2hhbmRsZV9pc19pbnZhbGlkKGhhbmRsZSkKICAgICAgICAgICAgICAgICB8fCBoYW5kbGUtPm51bUludHMgPCBOVU1fSU5UUykgewpAQCAtMTE0LDIzICsxMTUsMjMgQEAKICAgICB9CiAKICAgICBzdGF0aWMKLSAgICBFeHRyYURhdGEgKmdldEV4dHJhRGF0YShDMkhhbmRsZSAqY29uc3QgaGFuZGxlKSB7Ci0gICAgICAgIHJldHVybiBjb25zdF9jYXN0PEV4dHJhRGF0YSAqPihnZXRFeHRyYURhdGEoY29uc3RfY2FzdDxjb25zdCBDMkhhbmRsZSAqY29uc3Q+KGhhbmRsZSkpKTsKKyAgICBFeHRyYURhdGEgKkdldEV4dHJhRGF0YShDMkhhbmRsZSAqY29uc3QgaGFuZGxlKSB7CisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PEV4dHJhRGF0YSAqPihHZXRFeHRyYURhdGEoY29uc3RfY2FzdDxjb25zdCBDMkhhbmRsZSAqY29uc3Q+KGhhbmRsZSkpKTsKICAgICB9CiAKIHB1YmxpYzoKICAgICB2b2lkIGdldElnYnBEYXRhKHVpbnQzMl90ICpnZW5lcmF0aW9uLCB1aW50NjRfdCAqaWdicF9pZCwgdWludDMyX3QgKmlnYnBfc2xvdCkgY29uc3QgewotICAgICAgICBjb25zdCBFeHRyYURhdGEgKmVkID0gZ2V0RXh0cmFEYXRhKHRoaXMpOworICAgICAgICBjb25zdCBFeHRyYURhdGEgKmVkID0gR2V0RXh0cmFEYXRhKHRoaXMpOwogICAgICAgICAqZ2VuZXJhdGlvbiA9IGVkLT5nZW5lcmF0aW9uOwogICAgICAgICAqaWdicF9pZCA9IHVuc2lnbmVkKGVkLT5pZ2JwX2lkX2xvKSB8IHVpbnQ2NF90KHVuc2lnbmVkKGVkLT5pZ2JwX2lkX2hpKSkgPDwgMzI7CiAgICAgICAgICppZ2JwX3Nsb3QgPSBlZC0+aWdicF9zbG90OwogICAgIH0KIAotICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgQzJIYW5kbGUgKmNvbnN0IG8pIHsKKyAgICBzdGF0aWMgYm9vbCBJc1ZhbGlkKGNvbnN0IEMySGFuZGxlICpjb25zdCBvKSB7CiAgICAgICAgIGlmIChvID09IG51bGxwdHIpIHsgLy8gbnVsbCBoYW5kbGUgaXMgYWx3YXlzIHZhbGlkCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBjb25zdCBFeHRyYURhdGEgKnhkID0gZ2V0RXh0cmFEYXRhKG8pOworICAgICAgICBjb25zdCBFeHRyYURhdGEgKnhkID0gR2V0RXh0cmFEYXRhKG8pOwogICAgICAgICAvLyB3ZSBjYW5ub3QgdmFsaWRhdGUgd2lkdGgvaGVpZ2h0L2Zvcm1hdC91c2FnZSB3aXRob3V0IGFjY2Vzc2luZyBncmFsbG9jIGRyaXZlcgogICAgICAgICByZXR1cm4geGQgIT0gbnVsbHB0ciAmJiB4ZC0+bWFnaWMgPT0gTUFHSUM7CiAgICAgfQpAQCAtMTUyLDcgKzE1Myw3IEBACiAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqcmVzID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoaGFuZGxlLT5udW1GZHMsIGhhbmRsZS0+bnVtSW50cyArIE5VTV9JTlRTKTsKICAgICAgICAgaWYgKHJlcyAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICBtZW1jcHkoJnJlcy0+ZGF0YSwgJmhhbmRsZS0+ZGF0YSwgc2l6ZW9mKGludCkgKiAoaGFuZGxlLT5udW1GZHMgKyBoYW5kbGUtPm51bUludHMpKTsKLSAgICAgICAgICAgICpnZXRFeHRyYURhdGEocmVzKSA9IHhkOworICAgICAgICAgICAgKkdldEV4dHJhRGF0YShyZXMpID0geGQ7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8QzJIYW5kbGVHcmFsbG9jICo+KHJlcyk7CiAgICAgfQpAQCAtMTgwLDEwICsxODEsMTAgQEAKICAgICBzdGF0aWMgYm9vbCBNaWdyYXRlTmF0aXZlSGFuZGxlKAogICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsCiAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBpZ2JwX2lkLCB1aW50MzJfdCBpZ2JwX3Nsb3QpIHsKLSAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyIHx8ICFpc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyIHx8ICFJc1ZhbGlkKGhhbmRsZSkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBFeHRyYURhdGEgKmVkID0gZ2V0RXh0cmFEYXRhKGhhbmRsZSk7CisgICAgICAgIEV4dHJhRGF0YSAqZWQgPSBHZXRFeHRyYURhdGEoaGFuZGxlKTsKICAgICAgICAgaWYgKCFlZCkgcmV0dXJuIGZhbHNlOwogICAgICAgICBlZC0+Z2VuZXJhdGlvbiA9IGdlbmVyYXRpb247CiAgICAgICAgIGVkLT5pZ2JwX2lkX2xvID0gdWludDMyX3QoaWdicF9pZCAmIDB4RkZGRkZGRkYpOwpAQCAtMTk1LDcgKzE5Niw3IEBACiAKICAgICBzdGF0aWMgbmF0aXZlX2hhbmRsZV90KiBVbndyYXBOYXRpdmVIYW5kbGUoCiAgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlKSB7Ci0gICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqeGQgPSBnZXRFeHRyYURhdGEoaGFuZGxlKTsKKyAgICAgICAgY29uc3QgRXh0cmFEYXRhICp4ZCA9IEdldEV4dHJhRGF0YShoYW5kbGUpOwogICAgICAgICBpZiAoeGQgPT0gbnVsbHB0ciB8fCB4ZC0+bWFnaWMgIT0gTUFHSUMpIHsKICAgICAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgICAgICB9CkBAIC0yMTEsNyArMjEyLDcgQEAKICAgICAgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwgdWludDMyX3QgKmZvcm1hdCwKICAgICAgICAgICAgIHVpbnQ2NF90ICp1c2FnZSwgdWludDMyX3QgKnN0cmlkZSwKICAgICAgICAgICAgIHVpbnQzMl90ICpnZW5lcmF0aW9uLCB1aW50NjRfdCAqaWdicF9pZCwgdWludDMyX3QgKmlnYnBfc2xvdCkgewotICAgICAgICBjb25zdCBFeHRyYURhdGEgKnhkID0gZ2V0RXh0cmFEYXRhKGhhbmRsZSk7CisgICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqeGQgPSBHZXRFeHRyYURhdGEoaGFuZGxlKTsKICAgICAgICAgaWYgKHhkID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgICAgICB9CkBAIC0yNTMsNyArMjU0LDcgQEAKICAgICB2aXJ0dWFsIH5DMkFsbG9jYXRpb25HcmFsbG9jKCkgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG1hcCgKLSAgICAgICAgICAgIEMyUmVjdCByZWN0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlICpmZW5jZSwKKyAgICAgICAgICAgIEMyUmVjdCBjMlJlY3QsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlLAogICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQgKmxheW91dCAvKiBub25udWxsICovLCB1aW50OF90ICoqYWRkciAvKiBub25udWxsICovKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHVubWFwKAogICAgICAgICAgICAgdWludDhfdCAqKmFkZHIgLyogbm9ubnVsbCAqLywgQzJSZWN0IHJlY3QsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovKSBvdmVycmlkZTsKQEAgLTMzNiw4ICszMzcsMTIgQEAKIH0KIAogYzJfc3RhdHVzX3QgQzJBbGxvY2F0aW9uR3JhbGxvYzo6bWFwKAotICAgICAgICBDMlJlY3QgcmVjdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsCisgICAgICAgIEMyUmVjdCBjMlJlY3QsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlLAogICAgICAgICBDMlBsYW5hckxheW91dCAqbGF5b3V0IC8qIG5vbm51bGwgKi8sIHVpbnQ4X3QgKiphZGRyIC8qIG5vbm51bGwgKi8pIHsKKyAgICBjb25zdCBSZWN0IHJlY3R7KGludDMyX3QpYzJSZWN0LmxlZnQsIChpbnQzMl90KWMyUmVjdC50b3AsCisgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KShjMlJlY3QubGVmdCArIGMyUmVjdC53aWR0aCkgLyogcmlnaHQgKi8sCisgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KShjMlJlY3QudG9wICsgYzJSZWN0LmhlaWdodCkgLyogYm90dG9tICovfTsKKwogICAgIHVpbnQ2NF90IGdyYWxsb2NVc2FnZSA9IHN0YXRpY19jYXN0PEMyQW5kcm9pZE1lbW9yeVVzYWdlPih1c2FnZSkuYXNHcmFsbG9jVXNhZ2UoKTsKICAgICBBTE9HVigibWFwcGluZyBidWZmZXIgd2l0aCB1c2FnZSAlI2xseCA9PiAlI2xseCIsCiAgICAgICAgICAgKGxvbmcgbG9uZyl1c2FnZS5leHBlY3RlZCwgKGxvbmcgbG9uZylncmFsbG9jVXNhZ2UpOwpAQCAtMzg2LDEwICszOTEsNyBAQAogICAgICAgICAgICAgdm9pZCAqcG9pbnRlciA9IG51bGxwdHI7CiAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCkubG9jaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4obUJ1ZmZlciksIGdyYWxsb2NVc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAoaW50MzJfdClyZWN0LmxlZnQsIChpbnQzMl90KXJlY3QudG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb2ludGVyKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4obUJ1ZmZlciksIGdyYWxsb2NVc2FnZSwgcmVjdCwgJnBvaW50ZXIpOwogICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdHJhbnNhY3Rpb246IGxvY2soUkdCQV8xMDEwMTAyKSIpOwogICAgICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CkBAIC00NjQsMTAgKzQ2Niw3IEBACiAgICAgICAgICAgICB2b2lkICpwb2ludGVyID0gbnVsbHB0cjsKICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKS5sb2NrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KG1CdWZmZXIpLCBncmFsbG9jVXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgKGludDMyX3QpcmVjdC5sZWZ0LCAoaW50MzJfdClyZWN0LnRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClyZWN0LndpZHRoLCAoaW50MzJfdClyZWN0LmhlaWdodCB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9pbnRlcik7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4obUJ1ZmZlciksIGdyYWxsb2NVc2FnZSwgcmVjdCwgJnBvaW50ZXIpOwogICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdHJhbnNhY3Rpb246IGxvY2soUkdCQV84ODg4KSIpOwogICAgICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CkBAIC01MjQsMTAgKzUyMyw3IEBACiAgICAgICAgICAgICB2b2lkICpwb2ludGVyID0gbnVsbHB0cjsKICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKS5sb2NrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KG1CdWZmZXIpLCBncmFsbG9jVXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgKGludDMyX3QpcmVjdC5sZWZ0LCAoaW50MzJfdClyZWN0LnRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClyZWN0LndpZHRoLCAoaW50MzJfdClyZWN0LmhlaWdodCB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9pbnRlcik7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4obUJ1ZmZlciksIGdyYWxsb2NVc2FnZSwgcmVjdCwgJnBvaW50ZXIpOwogICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdHJhbnNhY3Rpb246IGxvY2soQkxPQikiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOwpAQCAtNTM2LDIwICs1MzIsMzMgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oUGl4ZWxGb3JtYXQ0OjpZQ0JDUl80MjJfU1ApOgorICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoCisgICAgICAgIGNhc2Ugc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFBpeGVsRm9ybWF0NDo6WUNSQ0JfNDIwX1NQKToKKyAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaAorICAgICAgICBjYXNlIHN0YXRpY19jYXN0PHVpbnQzMl90PihQaXhlbEZvcm1hdDQ6OllDQkNSXzQyMl9JKToKKyAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaAogICAgICAgICBjYXNlIHN0YXRpY19jYXN0PHVpbnQzMl90PihQaXhlbEZvcm1hdDQ6OllDQkNSXzQyMF84ODgpOgogICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoCi0gICAgICAgIGNhc2Ugc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFBpeGVsRm9ybWF0NDo6WVYxMik6Ci0gICAgICAgICAgICAvLyBmYWxsLXRocm91Z2gKLSAgICAgICAgZGVmYXVsdDogeworICAgICAgICBjYXNlIHN0YXRpY19jYXN0PHVpbnQzMl90PihQaXhlbEZvcm1hdDQ6OllWMTIpOiB7CiAgICAgICAgICAgICBhbmRyb2lkX3ljYmNyIHljYmNyTGF5b3V0OwogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKS5sb2NrWUNiQ3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KG1CdWZmZXIpLCBncmFsbG9jVXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB7IChpbnQzMl90KXJlY3QubGVmdCwgKGludDMyX3QpcmVjdC50b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmeWNiY3JMYXlvdXQpOworICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KG1CdWZmZXIpLCBncmFsbG9jVXNhZ2UsIHJlY3QsICZ5Y2JjckxheW91dCk7CiAgICAgICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogbG9ja1lDYkNyIik7CisgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogbG9ja1lDYkNyIChlcnI9JWQpIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF5Y2JjckxheW91dC55IHx8ICF5Y2JjckxheW91dC5jYiB8fCAheWNiY3JMYXlvdXQuY3IKKyAgICAgICAgICAgICAgICAgICAgfHwgeWNiY3JMYXlvdXQueXN0cmlkZSA9PSAwCisgICAgICAgICAgICAgICAgICAgIHx8IHljYmNyTGF5b3V0LmNzdHJpZGUgPT0gMAorICAgICAgICAgICAgICAgICAgICB8fCB5Y2JjckxheW91dC5jaHJvbWFfc3RlcCA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImludmFsaWQgbGF5b3V0OiBsb2NrWUNiQ3IgKHk9JXMgY2I9JXMgY3I9JXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgInlzdHJpZGU9JXp1IGNzdHJpZGU9JXp1IGNocm9tYV9zdGVwPSV6dSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgeWNiY3JMYXlvdXQueSA/ICIobm9uLW51bGwpIiA6ICIobnVsbCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgeWNiY3JMYXlvdXQuY2IgPyAiKG5vbi1udWxsKSIgOiAiKG51bGwpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHljYmNyTGF5b3V0LmNyID8gIihub24tbnVsbCkiIDogIihudWxsKSIsCisgICAgICAgICAgICAgICAgICAgICAgICB5Y2JjckxheW91dC55c3RyaWRlLCB5Y2JjckxheW91dC5jc3RyaWRlLCB5Y2JjckxheW91dC5jaHJvbWFfc3RlcCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKICAgICAgICAgICAgIH0KIApAQCAtNjExLDYgKzYyMCwxNjEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisKKyAgICAgICAgY2FzZSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oUGl4ZWxGb3JtYXQ0OjpZQ0JDUl9QMDEwKTogeworICAgICAgICAgICAgdm9pZCAqcG9pbnRlciA9IG51bGxwdHI7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKS5sb2NrKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwgZ3JhbGxvY1VzYWdlLCByZWN0LCAmcG9pbnRlcik7CisgICAgICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogbG9jayhZQ0JDUl9QMDEwKSIpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSA9ICh1aW50OF90ICopcG9pbnRlcjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdID0gKHVpbnQ4X3QgKilwb2ludGVyICsgbVN0cmlkZSAqIDIgKiByZWN0LmhlaWdodCgpOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0gPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSArIDI7CisgICAgICAgICAgICBsYXlvdXQtPnR5cGUgPSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY7CisgICAgICAgICAgICBsYXlvdXQtPm51bVBsYW5lcyA9IDM7CisgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAyOworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX1ksICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oMiAqIG1TdHJpZGUpLCAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICA2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TElUVExFX0VORCwgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NCLCAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oMiAqIG1TdHJpZGUpLCAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICA2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TElUVExFX0VORCwgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfVSwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NSLCAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oMiAqIG1TdHJpZGUpLCAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICA2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TElUVExFX0VORCwgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfVSwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHdoYXQgaXQgaXMsIGJ1dCBsZXQncyB0cnkgdG8gbG9jayBpdC4KKyAgICAgICAgICAgIGFuZHJvaWRfeWNiY3IgeWNiY3JMYXlvdXQ7CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpLmxvY2tZQ2JDcigKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPihtQnVmZmVyKSwgZ3JhbGxvY1VzYWdlLCByZWN0LCAmeWNiY3JMYXlvdXQpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSyAmJiB5Y2JjckxheW91dC55ICYmIHljYmNyTGF5b3V0LmNiICYmIHljYmNyTGF5b3V0LmNyCisgICAgICAgICAgICAgICAgICAgICYmIHljYmNyTGF5b3V0LnlzdHJpZGUgPiAwCisgICAgICAgICAgICAgICAgICAgICYmIHljYmNyTGF5b3V0LmNzdHJpZGUgPiAwCisgICAgICAgICAgICAgICAgICAgICYmIHljYmNyTGF5b3V0LmNocm9tYV9zdGVwID4gMCkgeworICAgICAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0gKHVpbnQ4X3QgKil5Y2JjckxheW91dC55OworICAgICAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdID0gKHVpbnQ4X3QgKil5Y2JjckxheW91dC5jYjsKKyAgICAgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9ICh1aW50OF90ICopeWNiY3JMYXlvdXQuY3I7CisgICAgICAgICAgICAgICAgbGF5b3V0LT50eXBlID0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOworICAgICAgICAgICAgICAgIGxheW91dC0+bnVtUGxhbmVzID0gMzsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAzOworICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfWSwgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXljYmNyTGF5b3V0LnlzdHJpZGUsICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSB7CisgICAgICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NCLCAgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXljYmNyTGF5b3V0LmNocm9tYV9zdGVwLCAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpeWNiY3JMYXlvdXQuY3N0cmlkZSwgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfVSwgICAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQ1IsICAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpeWNiY3JMYXlvdXQuY2hyb21hX3N0ZXAsIC8vIGNvbEluYworICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCl5Y2JjckxheW91dC5jc3RyaWRlLCAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9WLCAgICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgLy8gaGFuZGxlIGludGVybGVhdmVkIGZvcm1hdHMKKyAgICAgICAgICAgICAgICBpbnRwdHJfdCB1dk9mZnNldCA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdIC0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgICAgICAgICAgaWYgKHV2T2Zmc2V0ID4gMCAmJiB1dk9mZnNldCA8IChpbnRwdHJfdCl5Y2JjckxheW91dC5jaHJvbWFfc3RlcCkgeworICAgICAgICAgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAyOworICAgICAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ucm9vdEl4ID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1U7CisgICAgICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXS5vZmZzZXQgPSB1dk9mZnNldDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHV2T2Zmc2V0IDwgMCAmJiB1dk9mZnNldCA+IC0oaW50cHRyX3QpeWNiY3JMYXlvdXQuY2hyb21hX3N0ZXApIHsKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMjsKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvb3RJeCA9IEMyUGxhbmFyTGF5b3V0OjpQTEFORV9WOworICAgICAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ub2Zmc2V0ID0gLXV2T2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gV2UgcmVhbGx5IGRvbid0IGtub3cgd2hhdCB0aGlzIGlzOyBsb2NrIHRoZSBidWZmZXIgYW5kIHBhc3MgaXQgdGhyb3VnaCAtLS0KKyAgICAgICAgICAgIC8vIHRoZSBjbGllbnQgbWF5IGtub3cgaG93IHRvIGludGVycHJldCBpdC4KKyAgICAgICAgICAgIHZvaWQgKnBvaW50ZXIgPSBudWxscHRyOworICAgICAgICAgICAgZXJyID0gR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCkubG9jaygKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4obUJ1ZmZlciksIGdyYWxsb2NVc2FnZSwgcmVjdCwgJnBvaW50ZXIpOworICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdHJhbnNhY3Rpb246IGxvY2soPz8/ICV4KSIsIG1Gb3JtYXQpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRyWzBdID0gKHVpbnQ4X3QgKilwb2ludGVyOworICAgICAgICAgICAgbGF5b3V0LT50eXBlID0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfVU5LTk9XTjsKKyAgICAgICAgICAgIGxheW91dC0+bnVtUGxhbmVzID0gMTsKKyAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDE7CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1swXSA9IHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBDSEFOTkVMX1VOS05PV04/CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OmNoYW5uZWxfdCgweEZGKSwgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICBpbnQzMl90KG1TdHJpZGUpLCAgICAgICAgICAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgIH0KICAgICBtTG9ja2VkID0gdHJ1ZTsKIApAQCAtNzg0LDggKzk0OCw5IEBACiAgICAgcmV0dXJuIG1JbXBsLT5zdGF0dXMoKTsKIH0KIAotYm9vbCBDMkFsbG9jYXRvckdyYWxsb2M6OmlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pIHsKLSAgICByZXR1cm4gQzJIYW5kbGVHcmFsbG9jOjppc1ZhbGlkKG8pOworLy8gc3RhdGljCitib29sIEMyQWxsb2NhdG9yR3JhbGxvYzo6Q2hlY2tIYW5kbGUoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pIHsKKyAgICByZXR1cm4gQzJIYW5kbGVHcmFsbG9jOjpJc1ZhbGlkKG8pOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvcklvbi5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvcklvbi5jcHAKaW5kZXggNmQyN2EwMi4uYTg1MjhkZiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JJb24uY3BwCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9ySW9uLmNwcApAQCAtMzAsMTAgKzMwLDE1IEBACiAjaW5jbHVkZSA8QzJFcnJub1V0aWxzLmg+CiAjaW5jbHVkZSA8QzJIYW5kbGVJb25JbnRlcm5hbC5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBuYW1lc3BhY2UgewogICAgIGNvbnN0ZXhwciBzaXplX3QgVVNBR0VfTFJVX0NBQ0hFX1NJWkUgPSAxMDI0OworCisgICAgLy8gbWF4IHBhZGRpbmcgYWZ0ZXIgaW9uL2RtYWJ1ZiBhbGxvY2F0aW9ucyBpbiBieXRlcworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBNQVhfUEFERElORyA9IDB4ODAwMDsgLy8gMzJLQgogfQogCiAvKiBzaXplX3QgPD0+IGludChsbyksIGludChoaSkgY29udmVyc2lvbnMgKi8KQEAgLTczLDcgKzc4LDcgQEAKIH07CiAKIC8vIHN0YXRpYwotYm9vbCBDMkhhbmRsZUlvbjo6aXNWYWxpZChjb25zdCBDMkhhbmRsZSAqIGNvbnN0IG8pIHsKK2Jvb2wgQzJIYW5kbGVJb246OklzVmFsaWQoY29uc3QgQzJIYW5kbGUgKiBjb25zdCBvKSB7CiAgICAgaWYgKCFvIHx8IG1lbWNtcChvLCAmY0hlYWRlciwgc2l6ZW9mKGNIZWFkZXIpKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMzc2LDE0ICszODEsMzQgQEAKICAgICAgICAgdW5zaWduZWQgaGVhcE1hc2ssIHVuc2lnbmVkIGZsYWdzLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCkgewogICAgIGludCBidWZmZXJGZCA9IC0xOwogICAgIGlvbl91c2VyX2hhbmRsZV90IGJ1ZmZlciA9IC0xOwotICAgIHNpemVfdCBhbGlnbmVkU2l6ZSA9IGFsaWduID09IDAgPyBzaXplIDogKHNpemUgKyBhbGlnbiAtIDEpICYgfihhbGlnbiAtIDEpOworICAgIC8vIE5PVEU6IHJlYWQgdGhpcyBwcm9wZXJ0eSBkaXJlY3RseSBmcm9tIHRoZSBwcm9wZXJ0eSBhcyB0aGlzIGNvZGUgaGFzIHRvIHJ1biBvbgorICAgIC8vIEFuZHJvaWQgUSwgYnV0IHRoZSBzeXNwcm9wIHdhcyBvbmx5IGludHJvZHVjZWQgaW4gQW5kcm9pZCBTLgorICAgIHN0YXRpYyBzaXplX3Qgc1BhZGRpbmcgPQorICAgICAgICBiYXNlOjpHZXRVaW50UHJvcGVydHkoIm1lZGlhLmMyLmRtYWJ1Zi5wYWRkaW5nIiwgKHVpbnQzMl90KTAsIE1BWF9QQURESU5HKTsKKyAgICBpZiAoc1BhZGRpbmcgPiBTSVpFX01BWCAtIHNpemUpIHsKKyAgICAgICAgQUxPR0QoImlvbl9hbGxvYzogc2l6ZSAlI3p4IGNhbm5vdCBhY2NvbW1vZGF0ZSBwYWRkaW5nICUjengiLCBzaXplLCBzUGFkZGluZyk7CisgICAgICAgIC8vIHVzZSBJbXBsVjIgYXMgdGhlcmUgaXMgbm8gYWxsb2NhdGlvbiBhbnl3YXlzCisgICAgICAgIHJldHVybiBuZXcgSW1wbFYyKGlvbkZkLCBzaXplLCAtMSwgaWQsIC1FTk9NRU0pOworICAgIH0KKworICAgIHNpemVfdCBhbGxvY1NpemUgPSBzaXplICsgc1BhZGRpbmc7CisgICAgaWYgKGFsaWduKSB7CisgICAgICAgIGlmIChhbGlnbiAtIDEgPiBTSVpFX01BWCAtIGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgQUxPR0QoImlvbl9hbGxvYzogc2l6ZSAlI3p4IGNhbm5vdCBhY2NvbW1vZGF0ZSBwYWRkaW5nICUjenggYW5kIGFsaWdubWVudCAlI3p4IiwKKyAgICAgICAgICAgICAgICAgIHNpemUsIHNQYWRkaW5nLCBhbGlnbik7CisgICAgICAgICAgICAvLyB1c2UgSW1wbFYyIGFzIHRoZXJlIGlzIG5vIGFsbG9jYXRpb24gYW55d2F5cworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbXBsVjIoaW9uRmQsIHNpemUsIC0xLCBpZCwgLUVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgYWxsb2NTaXplICs9IGFsaWduIC0gMTsKKyAgICAgICAgYWxsb2NTaXplICY9IH4oYWxpZ24gLSAxKTsKKyAgICB9CiAgICAgaW50IHJldDsKIAogICAgIGlmIChpb25faXNfbGVnYWN5KGlvbkZkKSkgewotICAgICAgICByZXQgPSBpb25fYWxsb2MoaW9uRmQsIGFsaWduZWRTaXplLCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzLCAmYnVmZmVyKTsKKyAgICAgICAgcmV0ID0gaW9uX2FsbG9jKGlvbkZkLCBhbGxvY1NpemUsIGFsaWduLCBoZWFwTWFzaywgZmxhZ3MsICZidWZmZXIpOwogICAgICAgICBBTE9HVigiaW9uX2FsbG9jKGlvbkZkID0gJWQsIHNpemUgPSAlenUsIGFsaWduID0gJXp1LCBwcm90ID0gJWQsIGZsYWdzID0gJWQpICIKICAgICAgICAgICAgICAgInJldHVybmVkICglZCkgOyBidWZmZXIgPSAlZCIsCi0gICAgICAgICAgICAgIGlvbkZkLCBhbGlnbmVkU2l6ZSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgcmV0LCBidWZmZXIpOworICAgICAgICAgICAgICBpb25GZCwgYWxsb2NTaXplLCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzLCByZXQsIGJ1ZmZlcik7CiAgICAgICAgIGlmIChyZXQgPT0gMCkgewogICAgICAgICAgICAgLy8gZ2V0IGJ1ZmZlciBmZCBmb3IgbmF0aXZlIGhhbmRsZSBjb25zdHJ1Y3RvcgogICAgICAgICAgICAgcmV0ID0gaW9uX3NoYXJlKGlvbkZkLCBidWZmZXIsICZidWZmZXJGZCk7CkBAIC0zOTIsMTUgKzQxNywxNSBAQAogICAgICAgICAgICAgICAgIGJ1ZmZlciA9IC0xOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgSW1wbChpb25GZCwgYWxpZ25lZFNpemUsIGJ1ZmZlckZkLCBidWZmZXIsIGlkLCByZXQpOworICAgICAgICByZXR1cm4gbmV3IEltcGwoaW9uRmQsIGFsbG9jU2l6ZSwgYnVmZmVyRmQsIGJ1ZmZlciwgaWQsIHJldCk7CiAKICAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBpb25fYWxsb2NfZmQoaW9uRmQsIGFsaWduZWRTaXplLCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzLCAmYnVmZmVyRmQpOworICAgICAgICByZXQgPSBpb25fYWxsb2NfZmQoaW9uRmQsIGFsbG9jU2l6ZSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgJmJ1ZmZlckZkKTsKICAgICAgICAgQUxPR1YoImlvbl9hbGxvY19mZChpb25GZCA9ICVkLCBzaXplID0gJXp1LCBhbGlnbiA9ICV6dSwgcHJvdCA9ICVkLCBmbGFncyA9ICVkKSAiCiAgICAgICAgICAgICAgICJyZXR1cm5lZCAoJWQpIDsgYnVmZmVyRmQgPSAlZCIsCi0gICAgICAgICAgICAgIGlvbkZkLCBhbGlnbmVkU2l6ZSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgcmV0LCBidWZmZXJGZCk7CisgICAgICAgICAgICAgIGlvbkZkLCBhbGxvY1NpemUsIGFsaWduLCBoZWFwTWFzaywgZmxhZ3MsIHJldCwgYnVmZmVyRmQpOwogCi0gICAgICAgIHJldHVybiBuZXcgSW1wbFYyKGlvbkZkLCBhbGlnbmVkU2l6ZSwgYnVmZmVyRmQsIGlkLCByZXQpOworICAgICAgICByZXR1cm4gbmV3IEltcGxWMihpb25GZCwgYWxsb2NTaXplLCBidWZmZXJGZCwgaWQsIHJldCk7CiAgICAgfQogfQogCkBAIC01NzksNyArNjA0LDcgQEAKICAgICAgICAgcmV0dXJuIG1Jbml0OwogICAgIH0KIAotICAgIGlmICghQzJIYW5kbGVJb246OmlzVmFsaWQoaGFuZGxlKSkgeworICAgIGlmICghQzJIYW5kbGVJb246OklzVmFsaWQoaGFuZGxlKSkgewogICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtNTk2LDkgKzYyMSw4IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotYm9vbCBDMkFsbG9jYXRvcklvbjo6aXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3QgbykgewotICAgIHJldHVybiBDMkhhbmRsZUlvbjo6aXNWYWxpZChvKTsKK2Jvb2wgQzJBbGxvY2F0b3JJb246OkNoZWNrSGFuZGxlKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSB7CisgICAgcmV0dXJuIEMySGFuZGxlSW9uOjpJc1ZhbGlkKG8pOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQnVmZmVyLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQnVmZmVyLmNwcAppbmRleCAwYjA4ZjMxLi4xNDMzNTVmIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdm5kay9DMkJ1ZmZlci5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJCdWZmZXIuY3BwCkBAIC0xMDYsNiArMTA2LDcgQEAKIGNsYXNzIEJ1ZmZlckRhdGFCdWRkeSA6IHB1YmxpYyBDMkJ1ZmZlckRhdGEgewogICAgIHVzaW5nIEMyQnVmZmVyRGF0YTo6QzJCdWZmZXJEYXRhOwogICAgIGZyaWVuZCBjbGFzcyA6OkMyQnVmZmVyOworICAgIGZyaWVuZCBjbGFzcyA6OkMySW5mb0J1ZmZlcjsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZQpAQCAtMzk2LDI2ICszOTcsMTggQEAKIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKAogICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKSB7CiAgICAgLy8gVE9ETzogZ2V0IHByb3BlciBhbGxvY2F0b3I/IGFuZCBtdXRleD8KLSAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9yPiBzQWxsb2NhdG9yID0gW117Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yOwotICAgICAgICBpZiAoYW5kcm9pZDo6R2V0UHJlZmVycmVkTGluZWFyQWxsb2NhdG9ySWQoYW5kcm9pZDo6R2V0Q29kZWMyUG9vbE1hc2soKSkgPT0KLSAgICAgICAgICAgICAgICBhbmRyb2lkOjpDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJMT0IpIHsKLSAgICAgICAgICAgIGFsbG9jYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJBbGxvY2F0b3JCbG9iPihhbmRyb2lkOjpDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJMT0IpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWxsb2NhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxDMkFsbG9jYXRvcklvbj4oYW5kcm9pZDo6QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT04pOwotICAgICAgICB9CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gc0FsbG9jYXRvciA9IFtdeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IGFsbG9jYXRvclN0b3JlID0gYW5kcm9pZDo6R2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgICAgICBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIsICZhbGxvY2F0b3IpOworCiAgICAgICAgIHJldHVybiBhbGxvY2F0b3I7CiAgICAgfSgpOwogCiAgICAgaWYgKHNBbGxvY2F0b3IgPT0gbnVsbHB0cikKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgICBib29sIGlzVmFsaWRIYW5kbGUgPSBmYWxzZTsKLSAgICBpZiAoc0FsbG9jYXRvci0+Z2V0SWQoKSA9PSBhbmRyb2lkOjpDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJMT0IpIHsKLSAgICAgICAgaXNWYWxpZEhhbmRsZSA9IEMyQWxsb2NhdG9yQmxvYjo6aXNWYWxpZChoYW5kbGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlzVmFsaWRIYW5kbGUgPSBDMkFsbG9jYXRvcklvbjo6aXNWYWxpZChoYW5kbGUpOwotICAgIH0KKyAgICBib29sIGlzVmFsaWRIYW5kbGUgPSBzQWxsb2NhdG9yLT5jaGVja0hhbmRsZShoYW5kbGUpOwogCiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gYWxsb2M7CiAgICAgaWYgKGlzVmFsaWRIYW5kbGUpIHsKQEAgLTQzMSwyNiArNDI0LDE4IEBACiBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jaygKICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNIYW5kbGUsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmRhdGEpIHsKICAgICAvLyBUT0RPOiBnZXQgcHJvcGVyIGFsbG9jYXRvcj8gYW5kIG11dGV4PwotICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJBbGxvY2F0b3I+IHNBbGxvY2F0b3IgPSBbXXsKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3I7Ci0gICAgICAgIGlmIChhbmRyb2lkOjpHZXRQcmVmZXJyZWRMaW5lYXJBbGxvY2F0b3JJZChhbmRyb2lkOjpHZXRDb2RlYzJQb29sTWFzaygpKSA9PQotICAgICAgICAgICAgICAgIGFuZHJvaWQ6OkMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QkxPQikgewotICAgICAgICAgICAgYWxsb2NhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxDMkFsbG9jYXRvckJsb2I+KGFuZHJvaWQ6OkMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QkxPQik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhbGxvY2F0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyQWxsb2NhdG9ySW9uPihhbmRyb2lkOjpDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTik7Ci0gICAgICAgIH0KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBzQWxsb2NhdG9yID0gW117CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gYWxsb2NhdG9yU3RvcmUgPSBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgICAgIGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUiwgJmFsbG9jYXRvcik7CisKICAgICAgICAgcmV0dXJuIGFsbG9jYXRvcjsKICAgICB9KCk7CiAKICAgICBpZiAoc0FsbG9jYXRvciA9PSBudWxscHRyKQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKIAotICAgIGJvb2wgaXNWYWxpZEhhbmRsZSA9IGZhbHNlOwotICAgIGlmIChzQWxsb2NhdG9yLT5nZXRJZCgpID09IGFuZHJvaWQ6OkMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QkxPQikgewotICAgICAgICBpc1ZhbGlkSGFuZGxlID0gQzJBbGxvY2F0b3JCbG9iOjppc1ZhbGlkKGNIYW5kbGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlzVmFsaWRIYW5kbGUgPSBDMkFsbG9jYXRvcklvbjo6aXNWYWxpZChjSGFuZGxlKTsKLSAgICB9CisgICAgYm9vbCBpc1ZhbGlkSGFuZGxlID0gc0FsbG9jYXRvci0+Y2hlY2tIYW5kbGUoY0hhbmRsZSk7CiAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBhbGxvYzsKICAgICBpZiAoaXNWYWxpZEhhbmRsZSkgewpAQCAtMTE0OCw3ICsxMTMzLDcgQEAKICAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9yR3JhbGxvYz4gc0FsbG9jYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJBbGxvY2F0b3JHcmFsbG9jPigwKTsKIAogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKLSAgICBpZiAoQzJBbGxvY2F0b3JHcmFsbG9jOjppc1ZhbGlkKGNIYW5kbGUpKSB7CisgICAgaWYgKHNBbGxvY2F0b3ItPmlzVmFsaWQoY0hhbmRsZSkpIHsKICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gc0FsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihjSGFuZGxlLCAmYWxsb2MpOwogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CiAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbERhdGE+KGRhdGEpOwpAQCAtMTE4NSw2ICsxMTcwLDcgQEAKICAgICB0eXBlX3QgbVR5cGU7CiAgICAgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiBtTGluZWFyQmxvY2tzOwogICAgIHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+IG1HcmFwaGljQmxvY2tzOworICAgIGZyaWVuZCBjbGFzcyBDMkluZm9CdWZmZXI7CiB9OwogCiBDMkJ1ZmZlckRhdGE6OkMyQnVmZmVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpIDogbUltcGwobmV3IEltcGwoYmxvY2tzKSkge30KQEAgLTEyMDAsNiArMTE4NiwzNSBAQAogICAgIHJldHVybiBtSW1wbC0+Z3JhcGhpY0Jsb2NrcygpOwogfQogCitDMkluZm9CdWZmZXI6OkMySW5mb0J1ZmZlcigKKyAgICBDMlBhcmFtOjpJbmRleCBpbmRleCwgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKQorICAgIDogbUluZGV4KGluZGV4KSwgbURhdGEoQnVmZmVyRGF0YUJ1ZGR5KGJsb2NrcykpIHsKK30KKworQzJJbmZvQnVmZmVyOjpDMkluZm9CdWZmZXIoCisgICAgQzJQYXJhbTo6SW5kZXggaW5kZXgsIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpCisgICAgOiBtSW5kZXgoaW5kZXgpLCBtRGF0YShCdWZmZXJEYXRhQnVkZHkoYmxvY2tzKSkgeworfQorCitDMkluZm9CdWZmZXI6OkMySW5mb0J1ZmZlcigKKyAgICBDMlBhcmFtOjpJbmRleCBpbmRleCwgY29uc3QgQzJCdWZmZXJEYXRhICZkYXRhKQorICAgIDogbUluZGV4KGluZGV4KSwgbURhdGEoZGF0YSkgeworfQorCisvLyBzdGF0aWMKK0MySW5mb0J1ZmZlciBDMkluZm9CdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4LCBjb25zdCBDMkNvbnN0TGluZWFyQmxvY2sgJmJsb2NrKSB7CisgICAgcmV0dXJuIEMySW5mb0J1ZmZlcihpbmRleC5jb3JlSW5kZXgoKSB8IEMyUGFyYW06OkluZGV4OjpLSU5EX0lORk8gfCBDMlBhcmFtOjpJbmRleDo6RElSX0dMT0JBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgYmxvY2sgfSk7Cit9CisKKy8vIHN0YXRpYworQzJJbmZvQnVmZmVyIEMySW5mb0J1ZmZlcjo6Q3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4LCBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrICZibG9jaykgeworICAgIHJldHVybiBDMkluZm9CdWZmZXIoaW5kZXguY29yZUluZGV4KCkgfCBDMlBhcmFtOjpJbmRleDo6S0lORF9JTkZPIHwgQzJQYXJhbTo6SW5kZXg6OkRJUl9HTE9CQUwsCisgICAgICAgICAgICAgICAgICAgICAgICB7IGJsb2NrIH0pOworfQorCiBjbGFzcyBDMkJ1ZmZlcjo6SW1wbCB7CiBwdWJsaWM6CiAgICAgSW1wbChDMkJ1ZmZlciAqdGhpeiwgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKQpAQCAtMTMzMCw0ICsxMzQ1LDMgQEAKIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gQzJCdWZmZXI6OkNyZWF0ZUdyYXBoaWNCdWZmZXIoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2spIHsKICAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPihuZXcgQzJCdWZmZXIoeyBibG9jayB9KSk7CiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQ29uZmlnLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQ29uZmlnLmNwcAppbmRleCAzNDY4MGE3Li5lOTIyM2ZiIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdm5kay9DMkNvbmZpZy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJDb25maWcuY3BwCkBAIC0xNDIsNiArMTQyLDE0IEBACiAgICAgICAgIHsgImF2MS0wIiwgQzJDb25maWc6OlBST0ZJTEVfQVYxXzAgfSwKICAgICAgICAgeyAiYXYxLTEiLCBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMSB9LAogICAgICAgICB7ICJhdjEtMiIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8yIH0sCisgICAgICAgIHsgInZwOC0wIiwgQzJDb25maWc6OlBST0ZJTEVfVlA4XzAgfSwKKyAgICAgICAgeyAidnA4LTEiLCBDMkNvbmZpZzo6UFJPRklMRV9WUDhfMSB9LAorICAgICAgICB7ICJ2cDgtMiIsIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOF8yIH0sCisgICAgICAgIHsgInZwOC0zIiwgQzJDb25maWc6OlBST0ZJTEVfVlA4XzMgfSwKKyAgICAgICAgeyAibXBlZ2gtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX01QRUdIX01BSU4gfSwKKyAgICAgICAgeyAibXBlZ2gtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX01QRUdIX0hJR0ggfSwKKyAgICAgICAgeyAibXBlZ2gtbGMiLCBDMkNvbmZpZzo6UFJPRklMRV9NUEVHSF9MQyB9LAorICAgICAgICB7ICJtcGVnaC1iYXNlbGluZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QRUdIX0JBU0VMSU5FIH0sCiB9KSkKIAogREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihDMkNvbmZpZzo6bGV2ZWxfdCwgKHsKQEAgLTI0OCw2ICsyNTYsMTEgQEAKICAgICAgICAgeyAiYXYxLTcuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfN18xIH0sCiAgICAgICAgIHsgImF2MS03LjIiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzdfMiB9LAogICAgICAgICB7ICJhdjEtNy4zIiwgQzJDb25maWc6OkxFVkVMX0FWMV83XzMgfSwKKyAgICAgICAgeyAibXBlZ2gtMSIsIEMyQ29uZmlnOjpMRVZFTF9NUEVHSF8xIH0sCisgICAgICAgIHsgIm1wZWdoLTIiLCBDMkNvbmZpZzo6TEVWRUxfTVBFR0hfMiB9LAorICAgICAgICB7ICJtcGVnaC0zIiwgQzJDb25maWc6OkxFVkVMX01QRUdIXzMgfSwKKyAgICAgICAgeyAibXBlZ2gtNCIsIEMyQ29uZmlnOjpMRVZFTF9NUEVHSF80IH0sCisgICAgICAgIHsgIm1wZWdoLTUiLCBDMkNvbmZpZzo6TEVWRUxfTVBFR0hfNSB9LAogfSkpCiAKIERFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoQzJCdWZmZXJEYXRhOjp0eXBlX3QsICh7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMkRtYUJ1ZkFsbG9jYXRvci5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkRtYUJ1ZkFsbG9jYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ4NTUyYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyRG1hQnVmQWxsb2NhdG9yLmNwcApAQCAtMCwwICsxLDQyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJEbWFCdWZBbGxvY2F0b3IiCisKKyNpbmNsdWRlIDxCdWZmZXJBbGxvY2F0b3IvQnVmZmVyQWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJEbWFCdWZBbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxDMkVycm5vVXRpbHMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lvbi5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+ICAvLyBnZXRwYWdlc2l6ZSwgc2l6ZV90LCBjbG9zZSwgZHVwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworICAgIGNvbnN0ZXhwciBzaXplX3QgVVNBR0VfTFJVX0NBQ0hFX1NJWkUgPSAxMDI0OworCisgICAgLy8gbWF4IHBhZGRpbmcgYWZ0ZXIgaW9uL2RtYWJ1ZiBhbGxvY2F0aW9ucyBpbiBieXRlcworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBNQVhfUEFERElORyA9IDB4ODAwMDsgLy8gMzJLQgorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gQlVGRkVSIEhBTkRMRSA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qKgorICogQnVmZmVyIGhhbmRsZQorICoKKyAqIFN0b3JlcyBkbWFidWYgZmQgJiBtZXRhZGF0YQorICoKKyAqIFRoaXMgaGFuZGxlIHdpbGwgbm90IGNhcHR1cmUgbWFwcGVkIGZkLXMgYXMgdXBkYXRpbmcgdGhhdCB3b3VsZCByZXF1aXJlIGEKKyAqIGdsb2JhbCBtdXRleC4KKyAqLworCitzdHJ1Y3QgQzJIYW5kbGVCdWYgOiBwdWJsaWMgQzJIYW5kbGUgeworICAgIEMySGFuZGxlQnVmKGludCBidWZmZXJGZCwgc2l6ZV90IHNpemUpCisgICAgICAgIDogQzJIYW5kbGUoY0hlYWRlciksCisgICAgICAgICAgbUZkc3tidWZmZXJGZH0sCisgICAgICAgICAgbUludHN7aW50KHNpemUgJiAweEZGRkZGRkZGKSwgaW50KCh1aW50NjRfdChzaXplKSA+PiAzMikgJiAweEZGRkZGRkZGKSwga01hZ2ljfSB7fQorCisgICAgc3RhdGljIGJvb2wgSXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3Qgbyk7CisKKyAgICBpbnQgYnVmZmVyRmQoKSBjb25zdCB7IHJldHVybiBtRmRzLm1CdWZmZXI7IH0KKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHNpemVfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUxvKSkgfCBzaXplX3QodWludDY0X3QodW5zaWduZWQobUludHMubVNpemVIaSkpIDw8IDMyKTsKKyAgICB9CisKKyAgIHByb3RlY3RlZDoKKyAgICBzdHJ1Y3QgeworICAgICAgICBpbnQgbUJ1ZmZlcjsgIC8vIGRtYWJ1ZiBmZAorICAgIH0gbUZkczsKKyAgICBzdHJ1Y3QgeworICAgICAgICBpbnQgbVNpemVMbzsgIC8vIGxvdyAzMi1iaXRzIG9mIHNpemUKKyAgICAgICAgaW50IG1TaXplSGk7ICAvLyBoaWdoIDMyLWJpdHMgb2Ygc2l6ZQorICAgICAgICBpbnQgbU1hZ2ljOworICAgIH0gbUludHM7CisKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiBDMkhhbmRsZUJ1ZiBfdHlwZTsKKyAgICBlbnVtIHsKKyAgICAgICAga01hZ2ljID0gJ1x4YzJpb1x4MDAnLAorICAgICAgICBudW1GZHMgPSBzaXplb2YobUZkcykgLyBzaXplb2YoaW50KSwKKyAgICAgICAgbnVtSW50cyA9IHNpemVvZihtSW50cykgLyBzaXplb2YoaW50KSwKKyAgICAgICAgdmVyc2lvbiA9IHNpemVvZihDMkhhbmRsZSkKKyAgICB9OworICAgIC8vIGNvbnN0ZXhwciBzdGF0aWMgQzJIYW5kbGUgY0hlYWRlciA9IHsgdmVyc2lvbiwgbnVtRmRzLCBudW1JbnRzLCB7fSB9OworICAgIGNvbnN0IHN0YXRpYyBDMkhhbmRsZSBjSGVhZGVyOworfTsKKworY29uc3QgQzJIYW5kbGUgQzJIYW5kbGVCdWY6OmNIZWFkZXIgPSB7CisgICAgICAgIEMySGFuZGxlQnVmOjp2ZXJzaW9uLCBDMkhhbmRsZUJ1Zjo6bnVtRmRzLCBDMkhhbmRsZUJ1Zjo6bnVtSW50cywge319OworCisvLyBzdGF0aWMKK2Jvb2wgQzJIYW5kbGVCdWY6OklzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pIHsKKyAgICBpZiAoIW8gfHwgbWVtY21wKG8sICZjSGVhZGVyLCBzaXplb2YoY0hlYWRlcikpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3QgQzJIYW5kbGVCdWYqIG90aGVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgQzJIYW5kbGVCdWYqPihvKTsKKyAgICByZXR1cm4gb3RoZXItPm1JbnRzLm1NYWdpYyA9PSBrTWFnaWM7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PSBETUFCVUYgQUxMT0NBVElPTiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2NsYXNzIEMyRG1hQnVmQWxsb2NhdGlvbiA6IHB1YmxpYyBDMkxpbmVhckFsbG9jYXRpb24geworICAgcHVibGljOgorICAgIC8qIEludGVyZmFjZSBtZXRob2RzICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBtYXAoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UqIGZlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBhZGRyIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgdW5tYXAodm9pZCogYWRkciwgc2l6ZV90IHNpemUsIEMyRmVuY2UqIGZlbmNlRmQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgfkMyRG1hQnVmQWxsb2NhdGlvbigpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgY29uc3QgQzJIYW5kbGUqIGhhbmRsZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgaWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4mIG90aGVyKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIGludGVybmFsIG1ldGhvZHMKKyAgICBDMkRtYUJ1ZkFsbG9jYXRpb24oQnVmZmVyQWxsb2NhdG9yJiBhbGxvYywgc2l6ZV90IHNpemUsIEMyU3RyaW5nIGhlYXBfbmFtZSwgdW5zaWduZWQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGlkKTsKKyAgICBDMkRtYUJ1ZkFsbG9jYXRpb24oc2l6ZV90IHNpemUsIGludCBzaGFyZUZkLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCk7CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdDsKKworICAgcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbWFwSW50ZXJuYWwoc2l6ZV90IG1hcFNpemUsIHNpemVfdCBtYXBPZmZzZXQsIHNpemVfdCBhbGlnbm1lbnRCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm90LCBpbnQgZmxhZ3MsIHZvaWQqKiBiYXNlLCB2b2lkKiogYWRkcikgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICAgICAgKmJhc2UgPSBtbWFwKG51bGxwdHIsIG1hcFNpemUsIHByb3QsIGZsYWdzLCBtSGFuZGxlLmJ1ZmZlckZkKCksIG1hcE9mZnNldCk7CisgICAgICAgIEFMT0dWKCJtbWFwKHNpemUgPSAlenUsIHByb3QgPSAlZCwgZmxhZ3MgPSAlZCwgbWFwRmQgPSAlZCwgb2Zmc2V0ID0gJXp1KSAiCisgICAgICAgICAgICAgICJyZXR1cm5lZCAoJWQpIiwKKyAgICAgICAgICAgICAgbWFwU2l6ZSwgcHJvdCwgZmxhZ3MsIG1IYW5kbGUuYnVmZmVyRmQoKSwgbWFwT2Zmc2V0LCBlcnJubyk7CisgICAgICAgIGlmICgqYmFzZSA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgICAgICAqYmFzZSA9ICphZGRyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGVyciA9IGMyX21hcF9lcnJubzxFSU5WQUw+KGVycm5vKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICphZGRyID0gKHVpbnQ4X3QqKSpiYXNlICsgYWxpZ25tZW50Qnl0ZXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBtSWQ7CisgICAgQzJIYW5kbGVCdWYgbUhhbmRsZTsKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBzdHJ1Y3QgTWFwcGluZyB7CisgICAgICAgIHZvaWQqIGFkZHI7CisgICAgICAgIHNpemVfdCBhbGlnbm1lbnRCeXRlczsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgfTsKKyAgICBzdGQ6Omxpc3Q8TWFwcGluZz4gbU1hcHBpbmdzOworCisgICAgLy8gVE9ETzogd2UgY291bGQgbWFrZSB0aGlzIGVuY2Fwc3VsYXRlIHNoYXJlZF9wdHIgYW5kIGNvcGlhYmxlCisgICAgQzJfRE9fTk9UX0NPUFkoQzJEbWFCdWZBbGxvY2F0aW9uKTsKK307CisKK2MyX3N0YXR1c190IEMyRG1hQnVmQWxsb2NhdGlvbjo6bWFwKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlKiBmZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBhZGRyKSB7CisgICAgKHZvaWQpZmVuY2U7ICAvLyBUT0RPOiB3YWl0IGZvciBmZW5jZQorICAgICphZGRyID0gbnVsbHB0cjsKKyAgICBpZiAoIW1NYXBwaW5ncy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dWKCJtdWx0aXBsZSBtYXAiKTsKKyAgICAgICAgLy8gVE9ETzogdGVjaG5pY2FsbHkgd2Ugc2hvdWxkIHJldHVybiBEVVBMSUNBVEUgaGVyZSwgYnV0IG91ciBibG9jayB2aWV3cworICAgICAgICAvLyBkb24ndCBhY3R1YWxseSB1bm1hcCwgc28gd2UgZW5kIHVwIHJlbWFwcGluZyB0aGUgYnVmZmVyIG11bHRpcGxlIHRpbWVzLgorICAgICAgICAvLworICAgICAgICAvLyByZXR1cm4gQzJfRFVQTElDQVRFOworICAgIH0KKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgaW50IHByb3QgPSBQUk9UX05PTkU7CisgICAgaW50IGZsYWdzID0gTUFQX1NIQVJFRDsKKyAgICBpZiAodXNhZ2UuZXhwZWN0ZWQgJiBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCkgeworICAgICAgICBwcm90IHw9IFBST1RfUkVBRDsKKyAgICB9CisgICAgaWYgKHVzYWdlLmV4cGVjdGVkICYgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFKSB7CisgICAgICAgIHByb3QgfD0gUFJPVF9XUklURTsKKyAgICB9CisKKyAgICBzaXplX3QgYWxpZ25tZW50Qnl0ZXMgPSBvZmZzZXQgJSBQQUdFX1NJWkU7CisgICAgc2l6ZV90IG1hcE9mZnNldCA9IG9mZnNldCAtIGFsaWdubWVudEJ5dGVzOworICAgIHNpemVfdCBtYXBTaXplID0gc2l6ZSArIGFsaWdubWVudEJ5dGVzOworICAgIE1hcHBpbmcgbWFwID0ge251bGxwdHIsIGFsaWdubWVudEJ5dGVzLCBtYXBTaXplfTsKKworICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgICAgICBtYXBJbnRlcm5hbChtYXBTaXplLCBtYXBPZmZzZXQsIGFsaWdubWVudEJ5dGVzLCBwcm90LCBmbGFncywgJihtYXAuYWRkciksIGFkZHIpOworICAgIGlmIChtYXAuYWRkcikgeworICAgICAgICBtTWFwcGluZ3MucHVzaF9iYWNrKG1hcCk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK2MyX3N0YXR1c190IEMyRG1hQnVmQWxsb2NhdGlvbjo6dW5tYXAodm9pZCogYWRkciwgc2l6ZV90IHNpemUsIEMyRmVuY2UqIGZlbmNlKSB7CisgICAgaWYgKG1NYXBwaW5ncy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dEKCJ0cmllZCB0byB1bm1hcCB1bm1hcHBlZCBidWZmZXIiKTsKKyAgICAgICAgcmV0dXJuIEMyX05PVF9GT1VORDsKKyAgICB9CisgICAgZm9yIChhdXRvIGl0ID0gbU1hcHBpbmdzLmJlZ2luKCk7IGl0ICE9IG1NYXBwaW5ncy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoYWRkciAhPSAodWludDhfdCopaXQtPmFkZHIgKyBpdC0+YWxpZ25tZW50Qnl0ZXMgfHwKKyAgICAgICAgICAgIHNpemUgKyBpdC0+YWxpZ25tZW50Qnl0ZXMgIT0gaXQtPnNpemUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGludCBlcnIgPSBtdW5tYXAoaXQtPmFkZHIsIGl0LT5zaXplKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRCgibXVubWFwIGZhaWxlZCIpOworICAgICAgICAgICAgcmV0dXJuIGMyX21hcF9lcnJubzxFSU5WQUw+KGVycm5vKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmVuY2UpIHsKKyAgICAgICAgICAgICpmZW5jZSA9IEMyRmVuY2UoKTsgIC8vIG5vdCB1c2luZyBmZW5jZXMKKyAgICAgICAgfQorICAgICAgICAodm9pZCltTWFwcGluZ3MuZXJhc2UoaXQpOworICAgICAgICBBTE9HVigic3VjY2Vzc2Z1bGx5IHVubWFwcGVkOiAlZCIsIG1IYW5kbGUuYnVmZmVyRmQoKSk7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgQUxPR0QoInVubWFwIGZhaWxlZCB0byBmaW5kIHNwZWNpZmllZCBtYXAiKTsKKyAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworfQorCitjMl9zdGF0dXNfdCBDMkRtYUJ1ZkFsbG9jYXRpb246OnN0YXR1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXQ7Cit9CisKK0MyQWxsb2NhdG9yOjppZF90IEMyRG1hQnVmQWxsb2NhdGlvbjo6Z2V0QWxsb2NhdG9ySWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JZDsKK30KKworYm9vbCBDMkRtYUJ1ZkFsbG9jYXRpb246OmVxdWFscyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiYgb3RoZXIpIGNvbnN0IHsKKyAgICBpZiAoIW90aGVyIHx8IG90aGVyLT5nZXRBbGxvY2F0b3JJZCgpICE9IGdldEFsbG9jYXRvcklkKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBnZXQgdXNlciBoYW5kbGUgdG8gY29tcGFyZSBvYmplY3RzCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyRG1hQnVmQWxsb2NhdGlvbj4gb3RoZXJBc0J1ZiA9CisgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJEbWFCdWZBbGxvY2F0aW9uPihvdGhlcik7CisgICAgcmV0dXJuIG1IYW5kbGUuYnVmZmVyRmQoKSA9PSBvdGhlckFzQnVmLT5tSGFuZGxlLmJ1ZmZlckZkKCk7Cit9CisKK2NvbnN0IEMySGFuZGxlKiBDMkRtYUJ1ZkFsbG9jYXRpb246OmhhbmRsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gJm1IYW5kbGU7Cit9CisKK0MyRG1hQnVmQWxsb2NhdGlvbjo6fkMyRG1hQnVmQWxsb2NhdGlvbigpIHsKKyAgICBpZiAoIW1NYXBwaW5ncy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dEKCJEYW5nbGluZyBtYXBwaW5ncyEiKTsKKyAgICAgICAgZm9yIChjb25zdCBNYXBwaW5nJiBtYXAgOiBtTWFwcGluZ3MpIHsKKyAgICAgICAgICAgIGludCBlcnIgPSBtdW5tYXAobWFwLmFkZHIsIG1hcC5zaXplKTsKKyAgICAgICAgICAgIGlmIChlcnIpIEFMT0dEKCJtdW5tYXAgZmFpbGVkIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1Jbml0ID09IEMyX09LKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoJm1IYW5kbGUpOworICAgIH0KK30KKworQzJEbWFCdWZBbGxvY2F0aW9uOjpDMkRtYUJ1ZkFsbG9jYXRpb24oQnVmZmVyQWxsb2NhdG9yJiBhbGxvYywgc2l6ZV90IHNpemUsIEMyU3RyaW5nIGhlYXBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCkKKyAgICA6IEMyTGluZWFyQWxsb2NhdGlvbihzaXplKSwgbUhhbmRsZSgtMSwgMCkgeworICAgIGludCBidWZmZXJGZCA9IC0xOworICAgIGludCByZXQgPSAwOworCisgICAgYnVmZmVyRmQgPSBhbGxvYy5BbGxvYyhoZWFwX25hbWUsIHNpemUsIGZsYWdzKTsKKyAgICBpZiAoYnVmZmVyRmQgPCAwKSB7CisgICAgICAgIHJldCA9IGJ1ZmZlckZkOworICAgIH0KKworICAgIC8vIHRoaXMgbWF5IGJlIGEgbm9uLXdvcmtpbmcgaGFuZGxlIGlmIGJ1ZmZlckZkIGlzIG5lZ2F0aXZlCisgICAgbUhhbmRsZSA9IEMySGFuZGxlQnVmKGJ1ZmZlckZkLCBzaXplKTsKKyAgICBtSWQgPSBpZDsKKyAgICBtSW5pdCA9IGMyX3N0YXR1c190KGMyX21hcF9lcnJubzxFTk9NRU0sIEVBQ0NFUywgRUlOVkFMPihyZXQpKTsKK30KKworQzJEbWFCdWZBbGxvY2F0aW9uOjpDMkRtYUJ1ZkFsbG9jYXRpb24oc2l6ZV90IHNpemUsIGludCBzaGFyZUZkLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCkKKyAgICA6IEMyTGluZWFyQWxsb2NhdGlvbihzaXplKSwgbUhhbmRsZSgtMSwgMCkgeworICAgIG1IYW5kbGUgPSBDMkhhbmRsZUJ1ZihzaGFyZUZkLCBzaXplKTsKKyAgICBtSWQgPSBpZDsKKyAgICBtSW5pdCA9IGMyX3N0YXR1c190KGMyX21hcF9lcnJubzxFTk9NRU0sIEVBQ0NFUywgRUlOVkFMPigwKSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PSBETUFCVUYgQUxMT0NBVE9SID09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworQzJEbWFCdWZBbGxvY2F0b3I6OkMyRG1hQnVmQWxsb2NhdG9yKGlkX3QgaWQpIDogbUluaXQoQzJfT0spIHsKKyAgICBDMk1lbW9yeVVzYWdlIG1pblVzYWdlID0gezAsIDB9OworICAgIEMyTWVtb3J5VXNhZ2UgbWF4VXNhZ2UgPSB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX07CisgICAgVHJhaXRzIHRyYWl0cyA9IHsiYW5kcm9pZC5hbGxvY2F0b3IuZG1hYnVmIiwgaWQsIExJTkVBUiwgbWluVXNhZ2UsIG1heFVzYWdlfTsKKyAgICBtVHJhaXRzID0gc3RkOjptYWtlX3NoYXJlZDxUcmFpdHM+KHRyYWl0cyk7Cit9CisKK0MyQWxsb2NhdG9yOjppZF90IEMyRG1hQnVmQWxsb2NhdG9yOjpnZXRJZCgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICByZXR1cm4gbVRyYWl0cy0+aWQ7Cit9CisKK0MyU3RyaW5nIEMyRG1hQnVmQWxsb2NhdG9yOjpnZXROYW1lKCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Vc2FnZU1hcHBlckxvY2spOworICAgIHJldHVybiBtVHJhaXRzLT5uYW1lOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4gQzJEbWFCdWZBbGxvY2F0b3I6OmdldFRyYWl0cygpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICByZXR1cm4gbVRyYWl0czsKK30KKwordm9pZCBDMkRtYUJ1ZkFsbG9jYXRvcjo6c2V0VXNhZ2VNYXBwZXIoY29uc3QgVXNhZ2VNYXBwZXJGbiYgbWFwcGVyIF9fdW51c2VkLCB1aW50NjRfdCBtaW5Vc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IG1heFVzYWdlLCB1aW50NjRfdCBibG9ja1NpemUpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICBtVXNhZ2VNYXBwZXJDYWNoZS5jbGVhcigpOworICAgIG1Vc2FnZU1hcHBlckxydS5jbGVhcigpOworICAgIG1Vc2FnZU1hcHBlciA9IG1hcHBlcjsKKyAgICBUcmFpdHMgdHJhaXRzID0ge21UcmFpdHMtPm5hbWUsIG1UcmFpdHMtPmlkLCBMSU5FQVIsIEMyTWVtb3J5VXNhZ2UobWluVXNhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgQzJNZW1vcnlVc2FnZShtYXhVc2FnZSl9OworICAgIG1UcmFpdHMgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRyYWl0cz4odHJhaXRzKTsKKyAgICBtQmxvY2tTaXplID0gYmxvY2tTaXplOworfQorCitzdGQ6OnNpemVfdCBDMkRtYUJ1ZkFsbG9jYXRvcjo6TWFwcGVyS2V5SGFzaDo6b3BlcmF0b3IoKShjb25zdCBNYXBwZXJLZXkmIGspIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpoYXNoPHVpbnQ2NF90Pnt9KGsuZmlyc3QpIF4gc3RkOjpoYXNoPHNpemVfdD57fShrLnNlY29uZCk7Cit9CisKK2MyX3N0YXR1c190IEMyRG1hQnVmQWxsb2NhdG9yOjptYXBVc2FnZShDMk1lbW9yeVVzYWdlIHVzYWdlLCBzaXplX3QgY2FwYWNpdHksIEMyU3RyaW5nKiBoZWFwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQqIGZsYWdzKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVzYWdlTWFwcGVyTG9jayk7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfT0s7CisgICAgLy8gYWxpZ24gY2FwYWNpdHkKKyAgICBjYXBhY2l0eSA9IChjYXBhY2l0eSArIG1CbG9ja1NpemUgLSAxKSAmIH4obUJsb2NrU2l6ZSAtIDEpOworICAgIE1hcHBlcktleSBrZXkgPSBzdGQ6Om1ha2VfcGFpcih1c2FnZS5leHBlY3RlZCwgY2FwYWNpdHkpOworICAgIGF1dG8gZW50cnkgPSBtVXNhZ2VNYXBwZXJDYWNoZS5maW5kKGtleSk7CisgICAgaWYgKGVudHJ5ID09IG1Vc2FnZU1hcHBlckNhY2hlLmVuZCgpKSB7CisgICAgICAgIGlmIChtVXNhZ2VNYXBwZXIpIHsKKyAgICAgICAgICAgIHJlcyA9IG1Vc2FnZU1hcHBlcih1c2FnZSwgY2FwYWNpdHksIGhlYXBfbmFtZSwgZmxhZ3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKEMyRG1hQnVmQWxsb2NhdG9yOjpzeXN0ZW1fdW5jYWNoZWRfc3VwcG9ydGVkKCkgJiYKKyAgICAgICAgICAgICAgICAhKHVzYWdlLmV4cGVjdGVkICYgKEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEIHwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFKSkpCisgICAgICAgICAgICAgICAgKmhlYXBfbmFtZSA9ICJzeXN0ZW0tdW5jYWNoZWQiOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICpoZWFwX25hbWUgPSAic3lzdGVtIjsKKyAgICAgICAgICAgICpmbGFncyA9IDA7CisgICAgICAgICAgICByZXMgPSBDMl9OT19JTklUOworICAgICAgICB9CisgICAgICAgIC8vIGFkZCB1c2FnZSB0byBjYWNoZQorICAgICAgICBNYXBwZXJWYWx1ZSB2YWx1ZSA9IHN0ZDo6bWFrZV90dXBsZSgqaGVhcF9uYW1lLCAqZmxhZ3MsIHJlcyk7CisgICAgICAgIG1Vc2FnZU1hcHBlckxydS5lbXBsYWNlX2Zyb250KGtleSwgdmFsdWUpOworICAgICAgICBtVXNhZ2VNYXBwZXJDYWNoZS5lbXBsYWNlKHN0ZDo6bWFrZV9wYWlyKGtleSwgbVVzYWdlTWFwcGVyTHJ1LmJlZ2luKCkpKTsKKyAgICAgICAgaWYgKG1Vc2FnZU1hcHBlckNhY2hlLnNpemUoKSA+IFVTQUdFX0xSVV9DQUNIRV9TSVpFKSB7CisgICAgICAgICAgICAvLyByZW1vdmUgTFJVIGVudHJ5CisgICAgICAgICAgICBNYXBwZXJLZXkgbHJ1S2V5ID0gbVVzYWdlTWFwcGVyTHJ1LmZyb250KCkuZmlyc3Q7CisgICAgICAgICAgICBtVXNhZ2VNYXBwZXJDYWNoZS5lcmFzZShscnVLZXkpOworICAgICAgICAgICAgbVVzYWdlTWFwcGVyTHJ1LnBvcF9iYWNrKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBtb3ZlIGVudHJ5IHRvIE1SVQorICAgICAgICBtVXNhZ2VNYXBwZXJMcnUuc3BsaWNlKG1Vc2FnZU1hcHBlckxydS5iZWdpbigpLCBtVXNhZ2VNYXBwZXJMcnUsIGVudHJ5LT5zZWNvbmQpOworICAgICAgICBjb25zdCBNYXBwZXJWYWx1ZSYgdmFsdWUgPSBlbnRyeS0+c2Vjb25kLT5zZWNvbmQ7CisgICAgICAgIHN0ZDo6dGllKCpoZWFwX25hbWUsICpmbGFncywgcmVzKSA9IHZhbHVlOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitjMl9zdGF0dXNfdCBDMkRtYUJ1ZkFsbG9jYXRvcjo6bmV3TGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgdWludDMyX3QgY2FwYWNpdHksIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+KiBhbGxvY2F0aW9uKSB7CisgICAgaWYgKGFsbG9jYXRpb24gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIGFsbG9jYXRpb24tPnJlc2V0KCk7CisgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisKKyAgICBDMlN0cmluZyBoZWFwX25hbWU7CisgICAgdW5zaWduZWQgZmxhZ3MgPSAwOworICAgIGMyX3N0YXR1c190IHJldCA9IG1hcFVzYWdlKHVzYWdlLCBjYXBhY2l0eSwgJmhlYXBfbmFtZSwgJmZsYWdzKTsKKyAgICBpZiAocmV0ICYmIHJldCAhPSBDMl9OT19JTklUKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gVE9ETzogc2hvdWxkIHdlIHBhZCBiZWZvcmUgbWFwcGluZyB1c2FnZT8KKworICAgIC8vIE5PVEU6IHJlYWQgdGhpcyBwcm9wZXJ0eSBkaXJlY3RseSBmcm9tIHRoZSBwcm9wZXJ0eSBhcyB0aGlzIGNvZGUgaGFzIHRvIHJ1biBvbgorICAgIC8vIEFuZHJvaWQgUSwgYnV0IHRoZSBzeXNwcm9wIHdhcyBvbmx5IGludHJvZHVjZWQgaW4gQW5kcm9pZCBTLgorICAgIHN0YXRpYyBzaXplX3Qgc1BhZGRpbmcgPQorICAgICAgICBiYXNlOjpHZXRVaW50UHJvcGVydHkoIm1lZGlhLmMyLmRtYWJ1Zi5wYWRkaW5nIiwgKHVpbnQzMl90KTAsIE1BWF9QQURESU5HKTsKKyAgICBpZiAoc1BhZGRpbmcgPiBTSVpFX01BWCAtIGNhcGFjaXR5KSB7CisgICAgICAgIC8vIHNpemUgd291bGQgb3ZlcmZsb3cKKyAgICAgICAgQUxPR0QoImRtYWJ1Zl9hbGxvYzogc2l6ZSAjJXggY2Fubm90IGFjY29tbW9kYXRlIHBhZGRpbmcgIyV6eCIsIGNhcGFjaXR5LCBzUGFkZGluZyk7CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgfQorCisgICAgc2l6ZV90IGFsbG9jU2l6ZSA9IChzaXplX3QpY2FwYWNpdHkgKyBzUGFkZGluZzsKKyAgICAvLyBUT0RPOiBzaG91bGQgd2UgYWxpZ24gYWxsb2NhdGlvbiBzaXplIHRvIG1CbG9ja1NpemUgdG8gcmVmbGVjdCB0aGUgdHJ1ZSBhbGxvY2F0aW9uIHNpemU/CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyRG1hQnVmQWxsb2NhdGlvbj4gYWxsb2MgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyRG1hQnVmQWxsb2NhdGlvbj4oCisgICAgICAgICAgICBtQnVmZmVyQWxsb2NhdG9yLCBhbGxvY1NpemUsIGhlYXBfbmFtZSwgZmxhZ3MsIGdldElkKCkpOworICAgIHJldCA9IGFsbG9jLT5zdGF0dXMoKTsKKyAgICBpZiAocmV0ID09IEMyX09LKSB7CisgICAgICAgICphbGxvY2F0aW9uID0gYWxsb2M7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2MyX3N0YXR1c190IEMyRG1hQnVmQWxsb2NhdG9yOjpwcmlvckxpbmVhckFsbG9jYXRpb24oCisgICAgICAgIGNvbnN0IEMySGFuZGxlKiBoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+KiBhbGxvY2F0aW9uKSB7CisgICAgKmFsbG9jYXRpb24gPSBudWxscHRyOworICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorCisgICAgaWYgKCFDMkhhbmRsZUJ1Zjo6SXNWYWxpZChoYW5kbGUpKSB7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gVE9ETzogZ2V0IGNhcGFjaXR5IGFuZCB2YWxpZGF0ZSBpdAorICAgIGNvbnN0IEMySGFuZGxlQnVmKiBoID0gc3RhdGljX2Nhc3Q8Y29uc3QgQzJIYW5kbGVCdWYqPihoYW5kbGUpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkRtYUJ1ZkFsbG9jYXRpb24+IGFsbG9jID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJEbWFCdWZBbGxvY2F0aW9uPihoLT5zaXplKCksIGgtPmJ1ZmZlckZkKCksIGdldElkKCkpOworICAgIGMyX3N0YXR1c190IHJldCA9IGFsbG9jLT5zdGF0dXMoKTsKKyAgICBpZiAocmV0ID09IEMyX09LKSB7CisgICAgICAgICphbGxvY2F0aW9uID0gYWxsb2M7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKAorICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBuYXRpdmVfaGFuZGxlX3QqPihoYW5kbGUpKSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMkRtYUJ1ZkFsbG9jYXRvcjo6Q2hlY2tIYW5kbGUoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pIHsKKyAgICByZXR1cm4gQzJIYW5kbGVCdWY6OklzVmFsaWQobyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmNwcAppbmRleCA0YzMzMGU1Li5iZWUwMjhhIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdm5kay9DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuY3BwCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5jcHAKQEAgLTMzLDcgKzMzLDggQEAKIH0gIC8vIHVubmFtZWQKIAogQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIoY29uc3QgY2hhciAqbGliUGF0aCkKLSAgICA6IG1DcmVhdGVCbG9ja1Bvb2wobnVsbHB0cikgeworICAgIDogbUNyZWF0ZUJsb2NrUG9vbChudWxscHRyKSwKKyAgICAgIG1DcmVhdGVBbGxvY2F0b3IobnVsbHB0cikgewogICAgIG1MaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aCwgUlRMRF9OT1cgfCBSVExEX05PREVMRVRFKTsKICAgICBpZiAobUxpYkhhbmRsZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gbG9hZCBsaWJyYXJ5OiAlcyAoJXMpIiwgbGliUGF0aCwgZGxlcnJvcigpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyU3RvcmUuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJTdG9yZS5jcHAKaW5kZXggZDE2NTI3ZS4uYzA3YzA5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJTdG9yZS5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJTdG9yZS5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxDMkFsbG9jYXRvckJsb2IuaD4KICNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KICNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgorI2luY2x1ZGUgPEMyRG1hQnVmQWxsb2NhdG9yLmg+CiAjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CiAjaW5jbHVkZSA8QzJCcUJ1ZmZlclByaXYuaD4KICNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgpAQCAtODIsNiArODMsNyBAQAogCiAgICAgLy8vIHJldHVybnMgYSBzaGFyZWQtc2luZ2xldG9uIGlvbiBhbGxvY2F0b3IKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGZldGNoSW9uQWxsb2NhdG9yKCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBmZXRjaERtYUJ1ZkFsbG9jYXRvcigpOwogCiAgICAgLy8vIHJldHVybnMgYSBzaGFyZWQtc2luZ2xldG9uIGdyYWxsb2MgYWxsb2NhdG9yCiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBmZXRjaEdyYWxsb2NBbGxvY2F0b3IoKTsKQEAgLTk5LDYgKzEwMSwzNCBAQAogQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbCgpIHsKIH0KIAorc3RhdGljIGJvb2wgdXNpbmdfaW9uKHZvaWQpIHsKKyAgICBzdGF0aWMgaW50IGNhY2hlZF9yZXN1bHQgPSBbXSgpLT5pbnQgeworICAgICAgICBzdHJ1Y3Qgc3RhdCBidWZmZXI7CisgICAgICAgIGludCByZXQgPSAoc3RhdCgiL2Rldi9pb24iLCAmYnVmZmVyKSA9PSAwKTsKKworICAgICAgICBpZiAocHJvcGVydHlfZ2V0X2ludDMyKCJkZWJ1Zy5jMi51c2VfZG1hYnVmaGVhcHMiLCAwKSkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIERvdWJsZSBjaGVjayB0aGF0IHRoZSBzeXN0ZW0gaGVhcCBpcyBwcmVzZW50IHNvIHdlCisgICAgICAgICAgICAgKiBjYW4gZ3JhY2VmdWxseSBmYWlsIGJhY2sgdG8gSU9OIGlmIHdlIGNhbm5vdCBzYXRpc2Z5CisgICAgICAgICAgICAgKiB0aGUgb3ZlcnJpZGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0ID0gKHN0YXQoIi9kZXYvZG1hX2hlYXAvc3lzdGVtIiwgJmJ1ZmZlcikgIT0gMCk7CisgICAgICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgICAgIEFMT0dFKCJkZWJ1Zy5jMi51c2VfZG1hYnVmaGVhcHMgc2V0LCBidXQgbm8gc3lzdGVtIGhlYXAuIElnbm9yaW5nIG92ZXJyaWRlISIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFMT0dEKCJkZWJ1Zy5jMi51c2VfZG1hYnVmaGVhcHMgc2V0LCBmb3JjaW5nIERNQUJVRiBIZWFwcyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIEFMT0dEKCJVc2luZyBJT05cbiIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBBTE9HRCgiVXNpbmcgRE1BQlVGIEhlYXBzXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9KCk7CisKKyAgICByZXR1cm4gKGNhY2hlZF9yZXN1bHQgPT0gMSk7Cit9CisKIGMyX3N0YXR1c190IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OmZldGNoQWxsb2NhdG9yKAogICAgICAgICBpZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICpjb25zdCBhbGxvY2F0b3IpIHsKICAgICBhbGxvY2F0b3ItPnJlc2V0KCk7CkBAIC0xMDcsOCArMTM3LDExIEBACiAgICAgfQogICAgIHN3aXRjaCAoaWQpIHsKICAgICAvLyBUT0RPOiBzaG91bGQgd2UgaW1wbGVtZW50IGEgZ2VuZXJpYyByZWdpc3RyeSBmb3IgYWxsLCBhbmQgdXNlIHRoYXQ/Ci0gICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTjoKLSAgICAgICAgKmFsbG9jYXRvciA9IGZldGNoSW9uQWxsb2NhdG9yKCk7CisgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTjogLyogYWxzbyA6OkRNQUJVRkhFQVAgKi8KKyAgICAgICAgaWYgKHVzaW5nX2lvbigpKQorICAgICAgICAgICAgKmFsbG9jYXRvciA9IGZldGNoSW9uQWxsb2NhdG9yKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICphbGxvY2F0b3IgPSBmZXRjaERtYUJ1ZkFsbG9jYXRvcigpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DOgpAQCAtMTQyLDcgKzE3NSw5IEBACiBuYW1lc3BhY2UgewogCiBzdGQ6Om11dGV4IGdJb25BbGxvY2F0b3JNdXRleDsKK3N0ZDo6bXV0ZXggZ0RtYUJ1ZkFsbG9jYXRvck11dGV4Owogc3RkOjp3ZWFrX3B0cjxDMkFsbG9jYXRvcklvbj4gZ0lvbkFsbG9jYXRvcjsKK3N0ZDo6d2Vha19wdHI8QzJEbWFCdWZBbGxvY2F0b3I+IGdEbWFCdWZBbGxvY2F0b3I7CiAKIHZvaWQgVXNlQ29tcG9uZW50U3RvcmVGb3JJb25BbGxvY2F0b3IoCiAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcklvbj4gYWxsb2NhdG9yLApAQCAtMTk3LDYgKzIzMiw2NSBAQAogICAgIGFsbG9jYXRvci0+c2V0VXNhZ2VNYXBwZXIobWFwcGVyLCBtaW5Vc2FnZSwgbWF4VXNhZ2UsIGJsb2NrU2l6ZSk7CiB9CiAKK3ZvaWQgVXNlQ29tcG9uZW50U3RvcmVGb3JEbWFCdWZBbGxvY2F0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyRG1hQnVmQWxsb2NhdG9yPiBhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSkgeworICAgIEMyRG1hQnVmQWxsb2NhdG9yOjpVc2FnZU1hcHBlckZuIG1hcHBlcjsKKyAgICBjb25zdCBzaXplX3QgbWF4SGVhcE5hbWVMZW4gPSAxMjg7CisgICAgdWludDY0X3QgbWluVXNhZ2UgPSAwOworICAgIHVpbnQ2NF90IG1heFVzYWdlID0gQzJNZW1vcnlVc2FnZShDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFKS5leHBlY3RlZDsKKyAgICBzaXplX3QgYmxvY2tTaXplID0gZ2V0cGFnZXNpemUoKTsKKworICAgIC8vIHF1ZXJ5IG1pbiBhbmQgbWF4IHVzYWdlIGFzIHdlbGwgYXMgYmxvY2sgc2l6ZSB2aWEgc3VwcG9ydGVkIHZhbHVlcworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0b3JlRG1hQnVmVXNhZ2VJbmZvPiB1c2FnZUluZm87CisgICAgdXNhZ2VJbmZvID0gQzJTdG9yZURtYUJ1ZlVzYWdlSW5mbzo6QWxsb2NVbmlxdWUobWF4SGVhcE5hbWVMZW4pOworCisgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiBxdWVyeSA9IHsKKyAgICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UG9zc2libGUoQzJQYXJhbUZpZWxkOjpNYWtlKCp1c2FnZUluZm8sIHVzYWdlSW5mby0+bS51c2FnZSkpLAorICAgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQb3NzaWJsZSgKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbUZpZWxkOjpNYWtlKCp1c2FnZUluZm8sIHVzYWdlSW5mby0+bS5jYXBhY2l0eSkpLAorICAgIH07CisgICAgYzJfc3RhdHVzX3QgcmVzID0gc3RvcmUtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKHF1ZXJ5KTsKKyAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgIGlmIChxdWVyeVswXS5zdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMmIGZzdiA9IHF1ZXJ5WzBdLnZhbHVlczsKKyAgICAgICAgICAgIGlmIChmc3YudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUyAmJiAhZnN2LnZhbHVlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbWluVXNhZ2UgPSBmc3YudmFsdWVzWzBdLnU2NDsKKyAgICAgICAgICAgICAgICBtYXhVc2FnZSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChDMlZhbHVlOjpQcmltaXRpdmUgdiA6IGZzdi52YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4VXNhZ2UgfD0gdi51NjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChxdWVyeVsxXS5zdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMmIGZzdiA9IHF1ZXJ5WzFdLnZhbHVlczsKKyAgICAgICAgICAgIGlmIChmc3YudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpSQU5HRSAmJiBmc3YucmFuZ2Uuc3RlcC51MzIgPiAwKSB7CisgICAgICAgICAgICAgICAgYmxvY2tTaXplID0gZnN2LnJhbmdlLnN0ZXAudTMyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbWFwcGVyID0gW3N0b3JlXShDMk1lbW9yeVVzYWdlIHVzYWdlLCBzaXplX3QgY2FwYWNpdHksIEMyU3RyaW5nKiBoZWFwTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCogZmxhZ3MpIC0+IGMyX3N0YXR1c190IHsKKyAgICAgICAgICAgIGlmIChjYXBhY2l0eSA+IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdG9yZURtYUJ1ZlVzYWdlSW5mbz4gdXNhZ2VJbmZvOworICAgICAgICAgICAgdXNhZ2VJbmZvID0gQzJTdG9yZURtYUJ1ZlVzYWdlSW5mbzo6QWxsb2NVbmlxdWUobWF4SGVhcE5hbWVMZW4sIHVzYWdlLmV4cGVjdGVkLCBjYXBhY2l0eSk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7ICAvLyBUT0RPOiByZW1vdmUKKworICAgICAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0gc3RvcmUtPmNvbmZpZ19zbSh7Jip1c2FnZUluZm99LCAmZmFpbHVyZXMpOworICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICpoZWFwTmFtZSA9IEMyU3RyaW5nKHVzYWdlSW5mby0+bS5oZWFwTmFtZSk7CisgICAgICAgICAgICAgICAgKmZsYWdzID0gdXNhZ2VJbmZvLT5tLmFsbG9jRmxhZ3M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH07CisgICAgfQorCisgICAgYWxsb2NhdG9yLT5zZXRVc2FnZU1hcHBlcihtYXBwZXIsIG1pblVzYWdlLCBtYXhVc2FnZSwgYmxvY2tTaXplKTsKK30KKwogfQogCiB2b2lkIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OnNldENvbXBvbmVudFN0b3JlKHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSkgewpAQCAtMjMzLDYgKzMyNywyMiBAQAogICAgIHJldHVybiBhbGxvY2F0b3I7CiB9CiAKK3N0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6ZmV0Y2hEbWFCdWZBbGxvY2F0b3IoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ0RtYUJ1ZkFsbG9jYXRvck11dGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJEbWFCdWZBbGxvY2F0b3I+IGFsbG9jYXRvciA9IGdEbWFCdWZBbGxvY2F0b3IubG9jaygpOworICAgIGlmIChhbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gY29tcG9uZW50U3RvcmU7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKF9tQ29tcG9uZW50U3RvcmVSZWFkTG9jayk7CisgICAgICAgICAgICBjb21wb25lbnRTdG9yZSA9IF9tQ29tcG9uZW50U3RvcmU7CisgICAgICAgIH0KKyAgICAgICAgYWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxDMkRtYUJ1ZkFsbG9jYXRvcj4oQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpETUFCVUZIRUFQKTsKKyAgICAgICAgVXNlQ29tcG9uZW50U3RvcmVGb3JEbWFCdWZBbGxvY2F0b3IoYWxsb2NhdG9yLCBjb21wb25lbnRTdG9yZSk7CisgICAgICAgIGdEbWFCdWZBbGxvY2F0b3IgPSBhbGxvY2F0b3I7CisgICAgfQorICAgIHJldHVybiBhbGxvY2F0b3I7Cit9CisKIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6ZmV0Y2hCbG9iQWxsb2NhdG9yKCkgewogICAgIHN0YXRpYyBzdGQ6Om11dGV4IG11dGV4OwogICAgIHN0YXRpYyBzdGQ6OndlYWtfcHRyPEMyQWxsb2NhdG9yPiBibG9iQWxsb2NhdG9yOwpAQCAtMzM1LDcgKzQ0NSw3IEBACiAKICAgICBjMl9zdGF0dXNfdCBfY3JlYXRlQmxvY2tQb29sKAogICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90IGFsbG9jYXRvcklkLAotICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+PiBjb21wb25lbnRzLAogICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgcG9vbElkLAogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCkgewogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gYWxsb2NhdG9yU3RvcmUgPQpAQCAtMzQ3LDcgKzQ1Nyw3IEBACiAgICAgICAgICAgICBhbGxvY2F0b3JJZCA9IEdldFByZWZlcnJlZExpbmVhckFsbG9jYXRvcklkKEdldENvZGVjMlBvb2xNYXNrKCkpOwogICAgICAgICB9CiAgICAgICAgIHN3aXRjaChhbGxvY2F0b3JJZCkgewotICAgICAgICAgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTjoKKyAgICAgICAgICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT046IC8qIGFsc28gOjpETUFCVUZIRUFQICovCiAgICAgICAgICAgICAgICAgcmVzID0gYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKAogICAgICAgICAgICAgICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT04sICZhbGxvY2F0b3IpOwogICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKQEAgLTM1Niw3ICs0NjYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yLCBwb29sSWQpOwogICAgICAgICAgICAgICAgICAgICAqcG9vbCA9IHB0cjsKICAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbHNbcG9vbElkXSA9IHB0cjsKLSAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXSA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXS5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5iZWdpbigpLCBjb21wb25lbnRzLmVuZCgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QkxPQjoKQEAgLTM2OCw3ICs0ODAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yLCBwb29sSWQpOwogICAgICAgICAgICAgICAgICAgICAqcG9vbCA9IHB0cjsKICAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbHNbcG9vbElkXSA9IHB0cjsKLSAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXSA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXS5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5iZWdpbigpLCBjb21wb25lbnRzLmVuZCgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQzoKQEAgLTM4MCw3ICs0OTQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4oYWxsb2NhdG9yLCBwb29sSWQpOwogICAgICAgICAgICAgICAgICAgICAqcG9vbCA9IHB0cjsKICAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbHNbcG9vbElkXSA9IHB0cjsKLSAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXSA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXS5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5iZWdpbigpLCBjb21wb25lbnRzLmVuZCgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUU6CkBAIC0zOTIsNyArNTA4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvciwgcG9vbElkKTsKICAgICAgICAgICAgICAgICAgICAgKnBvb2wgPSBwdHI7CiAgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xzW3Bvb2xJZF0gPSBwdHI7Ci0gICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRzW3Bvb2xJZF0gPSBjb21wb25lbnQ7CisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRzW3Bvb2xJZF0uaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXS5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYmVnaW4oKSwgY29tcG9uZW50cy5lbmQoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTQwMyw3ICs1MjEsOSBAQAogICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKICAgICAgICAgICAgICAgICAgICAgKnBvb2wgPSBwdHI7CiAgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xzW3Bvb2xJZF0gPSBwdHI7Ci0gICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRzW3Bvb2xJZF0gPSBjb21wb25lbnQ7CisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRzW3Bvb2xJZF0uaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXS5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYmVnaW4oKSwgY29tcG9uZW50cy5lbmQoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC00MTIsOSArNTMyLDkgQEAKIAogICAgIGMyX3N0YXR1c190IGNyZWF0ZUJsb2NrUG9vbCgKICAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdCBhbGxvY2F0b3JJZCwKLSAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50Pj4gY29tcG9uZW50cywKICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpIHsKLSAgICAgICAgcmV0dXJuIF9jcmVhdGVCbG9ja1Bvb2woYWxsb2NhdG9ySWQsIGNvbXBvbmVudCwgbUJsb2NrUG9vbFNlcUlkKyssIHBvb2wpOworICAgICAgICByZXR1cm4gX2NyZWF0ZUJsb2NrUG9vbChhbGxvY2F0b3JJZCwgY29tcG9uZW50cywgbUJsb2NrUG9vbFNlcUlkKyssIHBvb2wpOwogICAgIH0KIAogICAgIGJvb2wgZ2V0QmxvY2tQb29sKApAQCAtNDMwLDggKzU1MCwxMyBAQAogICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xzLmVyYXNlKGl0KTsKICAgICAgICAgICAgICAgICBtQ29tcG9uZW50cy5lcmFzZShibG9ja1Bvb2xJZCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGF1dG8gZm91bmQgPSBtQ29tcG9uZW50cy5maW5kKGJsb2NrUG9vbElkKTsKLSAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50ID09IGZvdW5kLT5zZWNvbmQubG9jaygpKSB7CisgICAgICAgICAgICAgICAgYXV0byBmb3VuZCA9IHN0ZDo6ZmluZF9pZigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRzW2Jsb2NrUG9vbElkXS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbYmxvY2tQb29sSWRdLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudF0oY29uc3Qgc3RkOjp3ZWFrX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gJnB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQgPT0gcHRyLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGlmIChmb3VuZCAhPSBtQ29tcG9uZW50c1tibG9ja1Bvb2xJZF0uZW5kKCkpIHsKICAgICAgICAgICAgICAgICAgICAgKnBvb2wgPSBwdHI7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KQEAgLTQ0NCw3ICs1NjksNyBAQAogICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xTZXFJZDsKIAogICAgIHN0ZDo6bWFwPEMyQmxvY2tQb29sOjpsb2NhbF9pZF90LCBzdGQ6OndlYWtfcHRyPEMyQmxvY2tQb29sPj4gbUJsb2NrUG9vbHM7Ci0gICAgc3RkOjptYXA8QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QsIHN0ZDo6d2Vha19wdHI8Y29uc3QgQzJDb21wb25lbnQ+PiBtQ29tcG9uZW50czsKKyAgICBzdGQ6Om1hcDxDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCwgc3RkOjp2ZWN0b3I8c3RkOjp3ZWFrX3B0cjxjb25zdCBDMkNvbXBvbmVudD4+PiBtQ29tcG9uZW50czsKIH07CiAKIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8X0MyQmxvY2tQb29sQ2FjaGU+IHNCbG9ja1Bvb2xDYWNoZSA9CkBAIC00ODQsNyArNjA5LDcgQEAKICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcy4gdGhpcyBpcyB0ZW1wb3JhcnkKICAgICBjYXNlIEMyQmxvY2tQb29sOjpQTEFURk9STV9TVEFSVDoKICAgICAgICAgcmVzID0gc0Jsb2NrUG9vbENhY2hlLT5fY3JlYXRlQmxvY2tQb29sKAotICAgICAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUsIGNvbXBvbmVudCwgaWQsIHBvb2wpOworICAgICAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUsIHtjb21wb25lbnR9LCBpZCwgcG9vbCk7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGJyZWFrOwpAQCAtNDk0LDEyICs2MTksMjIgQEAKIAogYzJfc3RhdHVzX3QgQ3JlYXRlQ29kZWMyQmxvY2tQb29sKAogICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OmlkX3QgYWxsb2NhdG9ySWQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4+ICZjb21wb25lbnRzLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKSB7CisgICAgcG9vbC0+cmVzZXQoKTsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNCbG9ja1Bvb2xDYWNoZU11dGV4KTsKKyAgICByZXR1cm4gc0Jsb2NrUG9vbENhY2hlLT5jcmVhdGVCbG9ja1Bvb2woYWxsb2NhdG9ySWQsIGNvbXBvbmVudHMsIHBvb2wpOworfQorCitjMl9zdGF0dXNfdCBDcmVhdGVDb2RlYzJCbG9ja1Bvb2woCisgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdCBhbGxvY2F0b3JJZCwKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpIHsKICAgICBwb29sLT5yZXNldCgpOwogCiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc0Jsb2NrUG9vbENhY2hlTXV0ZXgpOwotICAgIHJldHVybiBzQmxvY2tQb29sQ2FjaGUtPmNyZWF0ZUJsb2NrUG9vbChhbGxvY2F0b3JJZCwgY29tcG9uZW50LCBwb29sKTsKKyAgICByZXR1cm4gc0Jsb2NrUG9vbENhY2hlLT5jcmVhdGVCbG9ja1Bvb2woYWxsb2NhdG9ySWQsIHtjb21wb25lbnR9LCBwb29sKTsKIH0KIAogY2xhc3MgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlIDogcHVibGljIEMyQ29tcG9uZW50U3RvcmUgewpAQCAtNTI2LDYgKzY2MSwxMiBAQAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcykgb3ZlcnJpZGU7CiAgICAgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7CiAKKyAgICAvLyBGb3IgdGVzdGluZyBvbmx5CisgICAgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxDMlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnRGYWN0b3J5OjpDcmVhdGVDb2RlYzJGYWN0b3J5RnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnRGYWN0b3J5OjpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmM+Pik7CisKICAgICB2aXJ0dWFsIH5DMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKIHByaXZhdGU6CkBAIC01NjYsNiArNzA3LDI0IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIGNvbXBvbmVudCBtb2R1bGUuCisgICAgICAgICAqIE5PVEU6IEZvciB0ZXN0aW5nIG9ubHkKKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIG5hbWVbaW5dICBjb21wb25lbnQgbmFtZS4KKyAgICAgICAgICoKKyAgICAgICAgICogXG5vdGUgT25seSB1c2VkIGJ5IENvbXBvbmVudExvYWRlci4KKyAgICAgICAgICovCisgICAgICAgIENvbXBvbmVudE1vZHVsZSgKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudEZhY3Rvcnk6OkNyZWF0ZUNvZGVjMkZhY3RvcnlGdW5jIGNyZWF0ZUZhY3RvcnksCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnRGYWN0b3J5OjpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmMgZGVzdHJveUZhY3RvcnkpCisgICAgICAgICAgICA6IG1Jbml0KEMyX05PX0lOSVQpLAorICAgICAgICAgICAgICBtTGliSGFuZGxlKG51bGxwdHIpLAorICAgICAgICAgICAgICBjcmVhdGVGYWN0b3J5KGNyZWF0ZUZhY3RvcnkpLAorICAgICAgICAgICAgICBkZXN0cm95RmFjdG9yeShkZXN0cm95RmFjdG9yeSksCisgICAgICAgICAgICAgIG1Db21wb25lbnRGYWN0b3J5KG51bGxwdHIpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgogICAgICAgICAgKiBJbml0aWFsaXplcyBhIGNvbXBvbmVudCBtb2R1bGUgd2l0aCBhIGdpdmVuIGxpYnJhcnkgcGF0aC4gTXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlLgogICAgICAgICAgKgogICAgICAgICAgKiBcbm90ZSBPbmx5IHVzZWQgYnkgQ29tcG9uZW50TG9hZGVyLgpAQCAtNjIxLDcgKzc4MCwxMyBAQAogICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+IGxvY2FsTW9kdWxlID0gbU1vZHVsZS5sb2NrKCk7CiAgICAgICAgICAgICBpZiAobG9jYWxNb2R1bGUgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIGxvY2FsTW9kdWxlID0gc3RkOjptYWtlX3NoYXJlZDxDb21wb25lbnRNb2R1bGU+KCk7CisgICAgICAgICAgICAgICAgaWYobUNyZWF0ZUZhY3RvcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHRlc3Rpbmcgb25seQorICAgICAgICAgICAgICAgICAgICBsb2NhbE1vZHVsZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q29tcG9uZW50TW9kdWxlPihtQ3JlYXRlRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlc3Ryb3lGYWN0b3J5KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2NhbE1vZHVsZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q29tcG9uZW50TW9kdWxlPigpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXMgPSBsb2NhbE1vZHVsZS0+aW5pdChtTGliUGF0aCk7CiAgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgewogICAgICAgICAgICAgICAgICAgICBtTW9kdWxlID0gbG9jYWxNb2R1bGU7CkBAIC02MzcsMTQgKzgwMiwyNyBAQAogICAgICAgICBDb21wb25lbnRMb2FkZXIoc3RkOjpzdHJpbmcgbGliUGF0aCkKICAgICAgICAgICAgIDogbUxpYlBhdGgobGliUGF0aCkge30KIAorICAgICAgICAvLyBGb3IgdGVzdGluZyBvbmx5CisgICAgICAgIENvbXBvbmVudExvYWRlcihzdGQ6OnR1cGxlPEMyU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudEZhY3Rvcnk6OkNyZWF0ZUNvZGVjMkZhY3RvcnlGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudEZhY3Rvcnk6OkRlc3Ryb3lDb2RlYzJGYWN0b3J5RnVuYz4gZnVuYykKKyAgICAgICAgICAgIDogbUxpYlBhdGgoc3RkOjpnZXQ8MD4oZnVuYykpLAorICAgICAgICAgICAgICBtQ3JlYXRlRmFjdG9yeShzdGQ6OmdldDwxPihmdW5jKSksCisgICAgICAgICAgICAgIG1EZXN0cm95RmFjdG9yeShzdGQ6OmdldDwyPihmdW5jKSkge30KKwogICAgIHByaXZhdGU6CiAgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OyAvLy88IG11dGV4IGd1YXJkaW5nIHRoZSBtb2R1bGUKICAgICAgICAgc3RkOjp3ZWFrX3B0cjxDb21wb25lbnRNb2R1bGU+IG1Nb2R1bGU7IC8vLzwgd2VhayByZWZlcmVuY2UgdG8gdGhlIGxvYWRlZCBtb2R1bGUKICAgICAgICAgc3RkOjpzdHJpbmcgbUxpYlBhdGg7IC8vLzwgbGlicmFyeSBwYXRoCisKKyAgICAgICAgLy8gRm9yIHRlc3Rpbmcgb25seQorICAgICAgICBDMkNvbXBvbmVudEZhY3Rvcnk6OkNyZWF0ZUNvZGVjMkZhY3RvcnlGdW5jIG1DcmVhdGVGYWN0b3J5ID0gbnVsbHB0cjsKKyAgICAgICAgQzJDb21wb25lbnRGYWN0b3J5OjpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmMgbURlc3Ryb3lGYWN0b3J5ID0gbnVsbHB0cjsKICAgICB9OwogCiAgICAgc3RydWN0IEludGVyZmFjZSA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0b3JlSW9uVXNhZ2VJbmZvPiBtSW9uVXNhZ2VJbmZvOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdG9yZURtYUJ1ZlVzYWdlSW5mbz4gbURtYUJ1ZlVzYWdlSW5mbzsKIAogICAgICAgICBJbnRlcmZhY2Uoc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiByZWZsZWN0b3IpCiAgICAgICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKHJlZmxlY3RvcikgewpAQCAtNjgwLDcgKzg1OCwxOSBAQAogICAgICAgICAgICAgICAgICAgICBtZS5zZXQoKS5taW5BbGlnbm1lbnQgPSAwOwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBzdGF0aWMgQzJSIHNldERtYUJ1ZlVzYWdlKGJvb2wgLyogbWF5QmxvY2sgKi8sIEMyUDxDMlN0b3JlRG1hQnVmVXNhZ2VJbmZvPiAmbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBsb25nIHVzYWdlID0gKGxvbmcgbG9uZyltZS5nZXQoKS5tLnVzYWdlOworICAgICAgICAgICAgICAgICAgICBpZiAoQzJEbWFCdWZBbGxvY2F0b3I6OnN5c3RlbV91bmNhY2hlZF9zdXBwb3J0ZWQoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgISh1c2FnZSAmIChDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCB8IEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KG1lLnNldCgpLm0uaGVhcE5hbWUsICJzeXN0ZW0tdW5jYWNoZWQiLCBtZS52LmZsZXhDb3VudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkobWUuc2V0KCkubS5oZWFwTmFtZSwgInN5c3RlbSIsIG1lLnYuZmxleENvdW50KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLm0uYWxsb2NGbGFncyA9IDA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgIGFkZFBhcmFtZXRlcigKQEAgLTY5NSw2ICs4ODUsMTggQEAKICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjo6c2V0SW9uVXNhZ2UpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURtYUJ1ZlVzYWdlSW5mbywgImRtYWJ1Zi11c2FnZSIpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyU3RvcmVEbWFCdWZVc2FnZUluZm86OkFsbG9jU2hhcmVkKDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EbWFCdWZVc2FnZUluZm8sIG0udXNhZ2UpLmZsYWdzKHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCB8IEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobURtYUJ1ZlVzYWdlSW5mbywgbS5jYXBhY2l0eSkuaW5SYW5nZSgwLCBVSU5UMzJfTUFYLCAxMDI0KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EbWFCdWZVc2FnZUluZm8sIG0uYWxsb2NGbGFncykuZmxhZ3Moe30pLAorICAgICAgICAgICAgICAgICAgICBDMkYobURtYUJ1ZlVzYWdlSW5mbywgbS5oZWFwTmFtZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI6OnNldERtYUJ1ZlVzYWdlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKICAgICAgICAgfQogICAgIH07CiAKQEAgLTczMSwyNSArOTMzLDMzIEBACiAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1SZWZsZWN0b3I7CiAgICAgSW50ZXJmYWNlIG1JbnRlcmZhY2U7CisKKyAgICAvLyBGb3IgdGVzdGluZyBvbmx5CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxDMlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnRGYWN0b3J5OjpDcmVhdGVDb2RlYzJGYWN0b3J5RnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnRGYWN0b3J5OjpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmM+PiBtQ29kZWMyRmFjdG9yeUZ1bmNzOwogfTsKIAogYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRNb2R1bGU6OmluaXQoCiAgICAgICAgIHN0ZDo6c3RyaW5nIGxpYlBhdGgpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgQUxPR1YoImxvYWRpbmcgZGxsIik7Ci0gICAgbUxpYkhhbmRsZSA9IGRsb3BlbihsaWJQYXRoLmNfc3RyKCksIFJUTERfTk9XfFJUTERfTk9ERUxFVEUpOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUxpYkhhbmRsZSA9PSBudWxscHRyLAotICAgICAgICAgICAgImNvdWxkIG5vdCBkbG9wZW4gJXM6ICVzIiwgbGliUGF0aC5jX3N0cigpLCBkbGVycm9yKCkpOwogCi0gICAgY3JlYXRlRmFjdG9yeSA9Ci0gICAgICAgIChDMkNvbXBvbmVudEZhY3Rvcnk6OkNyZWF0ZUNvZGVjMkZhY3RvcnlGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJDcmVhdGVDb2RlYzJGYWN0b3J5Iik7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihjcmVhdGVGYWN0b3J5ID09IG51bGxwdHIsCi0gICAgICAgICAgICAiY3JlYXRlRmFjdG9yeSBpcyBudWxsIGluICVzIiwgbGliUGF0aC5jX3N0cigpKTsKKyAgICBpZighY3JlYXRlRmFjdG9yeSkgeworICAgICAgICBtTGliSGFuZGxlID0gZGxvcGVuKGxpYlBhdGguY19zdHIoKSwgUlRMRF9OT1d8UlRMRF9OT0RFTEVURSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUxpYkhhbmRsZSA9PSBudWxscHRyLAorICAgICAgICAgICAgICAgICJjb3VsZCBub3QgZGxvcGVuICVzOiAlcyIsIGxpYlBhdGguY19zdHIoKSwgZGxlcnJvcigpKTsKIAotICAgIGRlc3Ryb3lGYWN0b3J5ID0KLSAgICAgICAgKEMyQ29tcG9uZW50RmFjdG9yeTo6RGVzdHJveUNvZGVjMkZhY3RvcnlGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJEZXN0cm95Q29kZWMyRmFjdG9yeSIpOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZGVzdHJveUZhY3RvcnkgPT0gbnVsbHB0ciwKLSAgICAgICAgICAgICJkZXN0cm95RmFjdG9yeSBpcyBudWxsIGluICVzIiwgbGliUGF0aC5jX3N0cigpKTsKKyAgICAgICAgY3JlYXRlRmFjdG9yeSA9CisgICAgICAgICAgICAoQzJDb21wb25lbnRGYWN0b3J5OjpDcmVhdGVDb2RlYzJGYWN0b3J5RnVuYylkbHN5bShtTGliSGFuZGxlLCAiQ3JlYXRlQ29kZWMyRmFjdG9yeSIpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNyZWF0ZUZhY3RvcnkgPT0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAiY3JlYXRlRmFjdG9yeSBpcyBudWxsIGluICVzIiwgbGliUGF0aC5jX3N0cigpKTsKKworICAgICAgICBkZXN0cm95RmFjdG9yeSA9CisgICAgICAgICAgICAoQzJDb21wb25lbnRGYWN0b3J5OjpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIkRlc3Ryb3lDb2RlYzJGYWN0b3J5Iik7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZGVzdHJveUZhY3RvcnkgPT0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAiZGVzdHJveUZhY3RvcnkgaXMgbnVsbCBpbiAlcyIsIGxpYlBhdGguY19zdHIoKSk7CisgICAgfQogCiAgICAgbUNvbXBvbmVudEZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5KCk7CiAgICAgaWYgKG1Db21wb25lbnRGYWN0b3J5ID09IG51bGxwdHIpIHsKQEAgLTc3Miw1OCArOTgyLDEwIEBACiAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6OlRyYWl0cz4gdHJhaXRzKG5ldyAoc3RkOjpub3Rocm93KSBDMkNvbXBvbmVudDo6VHJhaXRzKTsKICAgICBpZiAodHJhaXRzKSB7Ci0gICAgICAgIHRyYWl0cy0+bmFtZSA9IGludGYtPmdldE5hbWUoKTsKLQotICAgICAgICBDMkNvbXBvbmVudEtpbmRTZXR0aW5nIGtpbmQ7Ci0gICAgICAgIEMyQ29tcG9uZW50RG9tYWluU2V0dGluZyBkb21haW47Ci0gICAgICAgIHJlcyA9IGludGYtPnF1ZXJ5X3ZiKHsgJmtpbmQsICZkb21haW4gfSwge30sIEMyX01BWV9CTE9DSywgbnVsbHB0cik7Ci0gICAgICAgIGJvb2wgZml4RG9tYWluID0gcmVzICE9IEMyX09LOwotICAgICAgICBpZiAocmVzID09IEMyX09LKSB7Ci0gICAgICAgICAgICB0cmFpdHMtPmtpbmQgPSBraW5kLnZhbHVlOwotICAgICAgICAgICAgdHJhaXRzLT5kb21haW4gPSBkb21haW4udmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBmYWxsLWJhY2sKLSAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gcXVlcnkgaW50ZXJmYWNlIGZvciBraW5kIGFuZCBkb21haW46ICVkIiwgcmVzKTsKLQotICAgICAgICAgICAgdHJhaXRzLT5raW5kID0KLSAgICAgICAgICAgICAgICAodHJhaXRzLT5uYW1lLmZpbmQoImVuY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgPyBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSIDoKLSAgICAgICAgICAgICAgICAodHJhaXRzLT5uYW1lLmZpbmQoImRlY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgPyBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSIDoKLSAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9PVEhFUjsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQzMl90IG1lZGlhVHlwZUluZGV4ID0KLSAgICAgICAgICAgICAgICB0cmFpdHMtPmtpbmQgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiA/IEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dDo6UEFSQU1fVFlQRQotICAgICAgICAgICAgICAgIDogQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOwotICAgICAgICByZXMgPSBpbnRmLT5xdWVyeV92Yih7fSwgeyBtZWRpYVR5cGVJbmRleCB9LCBDMl9NQVlfQkxPQ0ssICZwYXJhbXMpOwotICAgICAgICBpZiAocmVzICE9IEMyX09LKSB7Ci0gICAgICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIHF1ZXJ5IGludGVyZmFjZTogJWQiLCByZXMpOworICAgICAgICBpZiAoIUMySW50ZXJmYWNlVXRpbHM6OkZpbGxUcmFpdHNGcm9tSW50ZXJmYWNlKHRyYWl0cy5nZXQoKSwgaW50ZikpIHsKKyAgICAgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gZmlsbCB0cmFpdHMgZnJvbSBpbnRlcmZhY2UiKTsKICAgICAgICAgICAgIHJldHVybiBtSW5pdDsKICAgICAgICAgfQotICAgICAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxdSkgewotICAgICAgICAgICAgQUxPR0QoImZhaWxlZCB0byBxdWVyeSBpbnRlcmZhY2U6IHVuZXhwZWN0ZWQgdmVjdG9yIHNpemU6ICV6dSIsIHBhcmFtcy5zaXplKCkpOwotICAgICAgICAgICAgcmV0dXJuIG1Jbml0OwotICAgICAgICB9Ci0gICAgICAgIEMyUG9ydE1lZGlhVHlwZVNldHRpbmcgKm1lZGlhVHlwZUNvbmZpZyA9IEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OkZyb20ocGFyYW1zWzBdLmdldCgpKTsKLSAgICAgICAgaWYgKG1lZGlhVHlwZUNvbmZpZyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIHF1ZXJ5IG1lZGlhIHR5cGUiKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5pdDsKLSAgICAgICAgfQotICAgICAgICB0cmFpdHMtPm1lZGlhVHlwZSA9Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyhtZWRpYVR5cGVDb25maWctPm0udmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJubGVuKG1lZGlhVHlwZUNvbmZpZy0+bS52YWx1ZSwgbWVkaWFUeXBlQ29uZmlnLT5mbGV4Q291bnQoKSkpOwotCi0gICAgICAgIGlmIChmaXhEb21haW4pIHsKLSAgICAgICAgICAgIGlmIChzdHJuY21wKHRyYWl0cy0+bWVkaWFUeXBlLmNfc3RyKCksICJhdWRpby8iLCA2KSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdHJhaXRzLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKHRyYWl0cy0+bWVkaWFUeXBlLmNfc3RyKCksICJ2aWRlby8iLCA2KSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdHJhaXRzLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKHRyYWl0cy0+bWVkaWFUeXBlLmNfc3RyKCksICJpbWFnZS8iLCA2KSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdHJhaXRzLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fT1RIRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KIAogICAgICAgICAvLyBUT0RPOiBnZXQgdGhpcyBwcm9wZXJseSBmcm9tIHRoZSBzdG9yZSBkdXJpbmcgZW1wbGFjZQogICAgICAgICBzd2l0Y2ggKHRyYWl0cy0+ZG9tYWluKSB7CkBAIC04MzMsMjYgKzk5NSw2IEBACiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB0cmFpdHMtPnJhbmsgPSA1MTI7CiAgICAgICAgIH0KLQotICAgICAgICBwYXJhbXMuY2xlYXIoKTsKLSAgICAgICAgcmVzID0gaW50Zi0+cXVlcnlfdmIoe30sIHsgQzJDb21wb25lbnRBbGlhc2VzU2V0dGluZzo6UEFSQU1fVFlQRSB9LCBDMl9NQVlfQkxPQ0ssICZwYXJhbXMpOwotICAgICAgICBpZiAocmVzID09IEMyX09LICYmIHBhcmFtcy5zaXplKCkgPT0gMXUpIHsKLSAgICAgICAgICAgIEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmcgKmFsaWFzZXNTZXR0aW5nID0KLSAgICAgICAgICAgICAgICBDMkNvbXBvbmVudEFsaWFzZXNTZXR0aW5nOjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7Ci0gICAgICAgICAgICBpZiAoYWxpYXNlc1NldHRpbmcpIHsKLSAgICAgICAgICAgICAgICAvLyBTcGxpdCBhbGlhc2VzIG9uICcsJwotICAgICAgICAgICAgICAgIC8vIFRoaXMgbG9va3Mgc2ltcGxlciBpbiBwbGFpbiBDIGFuZCBldmVuIHN0ZDo6c3RyaW5nIHdvdWxkIHN0aWxsIG1ha2UgYSBjb3B5LgotICAgICAgICAgICAgICAgIGNoYXIgKmFsaWFzZXMgPSA6OnN0cm5kdXAoYWxpYXNlc1NldHRpbmctPm0udmFsdWUsIGFsaWFzZXNTZXR0aW5nLT5mbGV4Q291bnQoKSk7Ci0gICAgICAgICAgICAgICAgQUxPR0QoIiclcycgaGFzIGFsaWFzZXM6ICclcyciLCBpbnRmLT5nZXROYW1lKCkuY19zdHIoKSwgYWxpYXNlcyk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGNoYXIgKnRvaywgKnB0ciwgKnN0ciA9IGFsaWFzZXM7ICh0b2sgPSA6OnN0cnRva19yKHN0ciwgIiwiLCAmcHRyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWl0cy0+YWxpYXNlcy5wdXNoX2JhY2sodG9rKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0QoImFkZGluZyBhbGlhczogJyVzJyIsIHRvayk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZyZWUoYWxpYXNlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICB9CiAgICAgbVRyYWl0cyA9IHRyYWl0czsKIApAQCAtOTUwLDYgKzEwOTIsMjIgQEAKICAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF92cDhlbmMuc28iKTsKICAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF92cDlkZWMuc28iKTsKICAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF92cDllbmMuc28iKTsKKworfQorCisvLyBGb3IgdGVzdGluZyBvbmx5CitDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OkMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPEMyU3RyaW5nLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50RmFjdG9yeTo6Q3JlYXRlQ29kZWMyRmFjdG9yeUZ1bmMsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnRGYWN0b3J5OjpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmM+PiBmdW5jcykKKyAgICA6IG1WaXNpdGVkKGZhbHNlKSwKKyAgICAgIG1SZWZsZWN0b3Ioc3RkOjptYWtlX3NoYXJlZDxDMlJlZmxlY3RvckhlbHBlcj4oKSksCisgICAgICBtSW50ZXJmYWNlKG1SZWZsZWN0b3IpLAorICAgICAgbUNvZGVjMkZhY3RvcnlGdW5jcyhmdW5jcykgeworCisgICAgZm9yKGF1dG8gY29uc3QmIGZ1bmM6IG1Db2RlYzJGYWN0b3J5RnVuY3MpIHsKKyAgICAgICAgbUNvbXBvbmVudHMuZW1wbGFjZShzdGQ6OmdldDwwPihmdW5jKSwgZnVuYyk7CisgICAgfQogfQogCiBjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmNvcHlCdWZmZXIoCkBAIC0xMDY5LDQgKzEyMjcsMTEgQEAKICAgICByZXR1cm4gc3RvcmU7CiB9CiAKKy8vIEZvciB0ZXN0aW5nIG9ubHkKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBHZXRUZXN0Q29tcG9uZW50U3RvcmUoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8QzJTdHJpbmcsCisgICAgICAgIEMyQ29tcG9uZW50RmFjdG9yeTo6Q3JlYXRlQ29kZWMyRmFjdG9yeUZ1bmMsCisgICAgICAgIEMyQ29tcG9uZW50RmFjdG9yeTo6RGVzdHJveUNvZGVjMkZhY3RvcnlGdW5jPj4gZnVuY3MpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+KG5ldyBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoZnVuY3MpKTsKK30KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JCbG9iLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9yQmxvYi5oCmluZGV4IDg5Y2U5NDkuLmZjNjdhZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JCbG9iLmgKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvckJsb2IuaApAQCAtNDQsNyArNDQsMTIgQEAKIAogICAgIHZpcnR1YWwgfkMyQWxsb2NhdG9yQmxvYigpIG92ZXJyaWRlOwogCi0gICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3Qgbyk7CisgICAgdmlydHVhbCBib29sIGNoZWNrSGFuZGxlKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBDaGVja0hhbmRsZShvKTsgfQorCisgICAgc3RhdGljIGJvb2wgQ2hlY2tIYW5kbGUoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pOworCisgICAgLy8gZGVwcmVjYXRlZAorICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pIHsgcmV0dXJuIENoZWNrSGFuZGxlKG8pOyB9CiAKIHByaXZhdGU6CiAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRyYWl0cz4gbVRyYWl0czsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JHcmFsbG9jLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9yR3JhbGxvYy5oCmluZGV4IGVlNzUyNGUuLjU3OGNmNzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JHcmFsbG9jLmgKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvckdyYWxsb2MuaApAQCAtODQsNyArODQsMTIgQEAKIAogICAgIHZpcnR1YWwgfkMyQWxsb2NhdG9yR3JhbGxvYygpIG92ZXJyaWRlOwogCi0gICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3Qgbyk7CisgICAgdmlydHVhbCBib29sIGNoZWNrSGFuZGxlKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBDaGVja0hhbmRsZShvKTsgfQorCisgICAgc3RhdGljIGJvb2wgQ2hlY2tIYW5kbGUoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pOworCisgICAgLy8gZGVwcmVjYXRlZAorICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pIHsgcmV0dXJuIENoZWNrSGFuZGxlKG8pOyB9CiAKIHByaXZhdGU6CiAgICAgY2xhc3MgSW1wbDsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JJb24uaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JJb24uaAppbmRleCAxYjIwNTFmLi42YTQ5YjdkIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9ySW9uLmgKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvcklvbi5oCkBAIC01Nyw3ICs1NywxMiBAQAogCiAgICAgdmlydHVhbCB+QzJBbGxvY2F0b3JJb24oKSBvdmVycmlkZTsKIAotICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pOworICAgIHZpcnR1YWwgYm9vbCBjaGVja0hhbmRsZShjb25zdCBDMkhhbmRsZSogY29uc3QgbykgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gQ2hlY2tIYW5kbGUobyk7IH0KKworICAgIHN0YXRpYyBib29sIENoZWNrSGFuZGxlKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKTsKKworICAgIC8vIGRlcHJlY2F0ZWQKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSB7IHJldHVybiBDaGVja0hhbmRsZShvKTsgfQogCiAgICAgLyoqCiAgICAgICogVXBkYXRlcyB0aGUgdXNhZ2UgbWFwcGVyIGZvciBzdWJzZXF1ZW50IG5ldyBhbGxvY2F0aW9ucywgYXMgd2VsbCBhcyB0aGUgc3VwcG9ydGVkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRG1hQnVmQWxsb2NhdG9yLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRG1hQnVmQWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg0YzhjNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJEbWFCdWZBbGxvY2F0b3IuaApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9CVUZfSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9CVUZfSF8KKworI2luY2x1ZGUgPEJ1ZmZlckFsbG9jYXRvci9CdWZmZXJBbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+ICAvLyBzdGF0CisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMkRtYUJ1ZkFsbG9jYXRvciA6IHB1YmxpYyBDMkFsbG9jYXRvciB7CisgICBwdWJsaWM6CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBuZXdMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiogYWxsb2NhdGlvbikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlKiBoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+KiBhbGxvY2F0aW9uKSBvdmVycmlkZTsKKworICAgIEMyRG1hQnVmQWxsb2NhdG9yKGlkX3QgaWQpOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBtSW5pdDsgfQorCisgICAgdmlydHVhbCBib29sIGNoZWNrSGFuZGxlKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBDaGVja0hhbmRsZShvKTsgfQorCisgICAgc3RhdGljIGJvb2wgQ2hlY2tIYW5kbGUoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pOworCisgICAgdmlydHVhbCBpZF90IGdldElkKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRyYWl0cz4gZ2V0VHJhaXRzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBVc2FnZSBtYXBwZXIgZnVuY3Rpb24gdXNlZCBieSB0aGUgYWxsb2NhdG9yCisgICAgLy8gICAodXNhZ2UsIGNhcGFjaXR5KSA9PiAoaGVhcE5hbWUsIGZsYWdzKQorICAgIC8vCisgICAgLy8gY2FwYWNpdHkgaXMgYWxpZ25lZCB0byB0aGUgZGVmYXVsdCBibG9jay1zaXplIChkZWZhdWx0cyB0byBwYWdlIHNpemUpIHRvCisgICAgLy8gcmVkdWNlIGNhY2hpbmcgb3ZlcmhlYWQKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3QoQzJNZW1vcnlVc2FnZSwgc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA9PiAqLyBDMlN0cmluZyosIHVuc2lnbmVkKik+CisgICAgICAgICAgICBVc2FnZU1hcHBlckZuOworCisgICAgLyoqCisgICAgICogVXBkYXRlcyB0aGUgdXNhZ2UgbWFwcGVyIGZvciBzdWJzZXF1ZW50IG5ldyBhbGxvY2F0aW9ucywgYXMgd2VsbCBhcyB0aGUKKyAgICAgKiBzdXBwb3J0ZWQgbWluaW11bSBhbmQgbWF4aW11bSB1c2FnZSBtYXNrcyBhbmQgZGVmYXVsdCBibG9jay1zaXplIHRvIHVzZQorICAgICAqIGZvciB0aGUgbWFwcGVyLgorICAgICAqCisgICAgICogXHBhcmFtIG1hcHBlciAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gbWFwIENvZGVjIDIuMCBidWZmZXIgdXNhZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIGRtYWJ1ZiBoZWFwIG5hbWUgYW5kIGZsYWdzIHJlcXVpcmVkIGJ5IHRoZSBkbWEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiBoZWFwIGRldmljZQorICAgICAqCisgICAgICogXHBhcmFtIG1pblVzYWdlICAgICAgICBNaW5pbXVtIGJ1ZmZlciB1c2FnZSByZXF1aXJlZCBmb3Igc3VwcG9ydGVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9ucyAoZGVmYXVsdHMgdG8gMCkKKyAgICAgKgorICAgICAqIFxwYXJhbSBtYXhVc2FnZSAgICAgICAgTWF4aW11bSBidWZmZXIgdXNhZ2Ugc3VwcG9ydGVkIGJ5IHRoZSBpb24gYWxsb2NhdG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdHMgdG8gU1dfUkVBRCB8IFNXX1dSSVRFKQorICAgICAqCisgICAgICogXHBhcmFtIGJsb2NrU2l6ZSAgICAgICBBbGlnbm1lbnQgdXNlZCBwcmlvciB0byBjYWxsaW5nIHxtYXBwZXJ8IGZvciB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBjYXBhY2l0eS4gVGhpcyBhbHNvIGhlbHBzIHJlZHVjZSB0aGUgc2l6ZSBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUgcmVxdWlyZWQgZm9yIGNhY2hpbmcgbWFwcGVyIHJlc3VsdHMuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdHMgdG8gdGhlIHBhZ2Ugc2l6ZSkKKyAgICAgKi8KKyAgICB2b2lkIHNldFVzYWdlTWFwcGVyKGNvbnN0IFVzYWdlTWFwcGVyRm4mIG1hcHBlciwgdWludDY0X3QgbWluVXNhZ2UsIHVpbnQ2NF90IG1heFVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYmxvY2tTaXplKTsKKworICAgIHN0YXRpYyBib29sIHN5c3RlbV91bmNhY2hlZF9zdXBwb3J0ZWQodm9pZCkgeworICAgICAgICBzdGF0aWMgaW50IGNhY2hlZF9yZXN1bHQgPSAtMTsKKworICAgICAgICBpZiAoY2FjaGVkX3Jlc3VsdCA9PSAtMSkgeworICAgICAgICAgICAgc3RydWN0IHN0YXQgYnVmZmVyOworICAgICAgICAgICAgY2FjaGVkX3Jlc3VsdCA9IChzdGF0KCIvZGV2L2RtYV9oZWFwL3N5c3RlbS11bmNhY2hlZCIsICZidWZmZXIpID09IDApOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoY2FjaGVkX3Jlc3VsdCA9PSAxKTsKKyAgICB9OworCisgICBwcml2YXRlOgorICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIEJ1ZmZlckFsbG9jYXRvciBtQnVmZmVyQWxsb2NhdG9yOworCisgICAgYzJfc3RhdHVzX3QgbWFwVXNhZ2UoQzJNZW1vcnlVc2FnZSB1c2FnZSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgLyogPT4gKi8gQzJTdHJpbmcqIGhlYXBfbmFtZSwgdW5zaWduZWQqIGZsYWdzKTsKKworICAgIC8vIHRoaXMgbG9ja3MgbVRyYWl0cywgbUJsb2NrU2l6ZSwgbVVzYWdlTWFwcGVyLCBtVXNhZ2VNYXBwZXJMcnUgYW5kCisgICAgLy8gbVVzYWdlTWFwcGVyQ2FjaGUKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbVVzYWdlTWFwcGVyTG9jazsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVHJhaXRzPiBtVHJhaXRzOworICAgIHNpemVfdCBtQmxvY2tTaXplOworICAgIFVzYWdlTWFwcGVyRm4gbVVzYWdlTWFwcGVyOworICAgIHR5cGVkZWYgc3RkOjpwYWlyPHVpbnQ2NF90LCBzaXplX3Q+IE1hcHBlcktleTsKKyAgICBzdHJ1Y3QgTWFwcGVyS2V5SGFzaCB7CisgICAgICAgIHN0ZDo6c2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgTWFwcGVyS2V5JikgY29uc3Q7CisgICAgfTsKKyAgICB0eXBlZGVmIHN0ZDo6dHVwbGU8QzJTdHJpbmcsIHVuc2lnbmVkLCBjMl9zdGF0dXNfdD4gTWFwcGVyVmFsdWU7CisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8TWFwcGVyS2V5LCBNYXBwZXJWYWx1ZT4gTWFwcGVyS2V5VmFsdWU7CisgICAgdHlwZWRlZiBzdGQ6Omxpc3Q8TWFwcGVyS2V5VmFsdWU+OjppdGVyYXRvciBNYXBwZXJLZXlWYWx1ZVBvaW50ZXI7CisgICAgc3RkOjpsaXN0PE1hcHBlcktleVZhbHVlPiBtVXNhZ2VNYXBwZXJMcnU7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPE1hcHBlcktleSwgTWFwcGVyS2V5VmFsdWVQb2ludGVyLCBNYXBwZXJLZXlIYXNoPiBtVXNhZ2VNYXBwZXJDYWNoZTsKK307Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9BTExPQ0FUT1JfQlVGX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdXBwb3J0LmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdXBwb3J0LmgKaW5kZXggYTE0ZTBkMy4uZGM4MmU4MiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3VwcG9ydC5oCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJQbGF0Zm9ybVN1cHBvcnQuaApAQCAtNDcsNiArNDcsMTcgQEAKICAgICAgICAgICovCiAgICAgICAgIElPTiA9IFBMQVRGT1JNX1NUQVJULAogCisgICAgICAgIC8qCisgICAgICAgICAqIElEIG9mIHRoZSBETUEtQnVmIEhlYXAgKGlvbiByZXBsYWNlbWVudCkgYmFja2VkIHBsYXRmb3JtIGFsbG9jYXRvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQzJIYW5kbGUgY29uc2lzdHMgb2Y6CisgICAgICAgICAqICAgZmQgIHNoYXJlZCBkbWFidWYgYnVmZmVyIGhhbmRsZQorICAgICAgICAgKiAgIGludCBzaXplIChsbyAzMiBiaXRzKQorICAgICAgICAgKiAgIGludCBzaXplIChoaSAzMiBiaXRzKQorICAgICAgICAgKiAgIGludCBtYWdpYyAnXHhjMmlvXHgwMCcKKyAgICAgICAgICovCisgICAgICAgIERNQUJVRkhFQVAgPSBJT04sCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIElEIG9mIHRoZSBncmFsbG9jIGJhY2tlZCBwbGF0Zm9ybSBhbGxvY2F0b3IuCiAgICAgICAgICAqCkBAIC0xMjcsMTIgKzEzOCwzOCBAQAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKTsKIAogLyoqCisgKiBDcmVhdGVzIGEgYmxvY2sgcG9vbC4KKyAqIFxwYXJhbSBhbGxvY2F0b3JJZCAgdGhlIGFsbG9jYXRvciBJRCB3aGljaCBpcyB1c2VkIHRvIGFsbG9jYXRlIGJsb2NrcworICogXHBhcmFtIGNvbXBvbmVudHMgICAgdGhlIGNvbXBvbmVudHMgdXNpbmcgdGhlIGJsb2NrIHBvb2wKKyAqIFxwYXJhbSBwb29sICAgICAgICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGNyZWF0ZWQgYmxvY2sgcG9vbCBzaGFsbCBiZSBzdG9yZSBvbiBzdWNjZXNzLgorICogICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAqCisgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB0aGUgY29tcG9uZW50IGlzIG51bGwKKyAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGlmIHRoZSBhbGxvY2F0b3IgZG9lcyBub3QgZXhpc3QKKyAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSBhIGJsb2NrIHBvb2wKKyAqLworYzJfc3RhdHVzX3QgQ3JlYXRlQ29kZWMyQmxvY2tQb29sKAorICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OmlkX3QgYWxsb2NhdG9ySWQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4+ICZjb21wb25lbnRzLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKTsKKworLyoqCiAgKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybSBjb21wb25lbnQgc3RvcmUuCiAgKiBccmV0dmFsIG51bGxwdHIgaWYgdGhlIHBsYXRmb3JtIGNvbXBvbmVudCBzdG9yZSBjb3VsZCBub3QgYmUgb2J0YWluZWQKICAqLwogc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKTsKIAogLyoqCisgKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybSBjb21wb25lbnQgc3RvcmUuCisgKiBOT1RFOiBGb3IgdGVzdGluZyBvbmx5CisgKiBccmV0dmFsIG51bGxwdHIgaWYgdGhlIHBsYXRmb3JtIGNvbXBvbmVudCBzdG9yZSBjb3VsZCBub3QgYmUgb2J0YWluZWQKKyAqLworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IEdldFRlc3RDb21wb25lbnRTdG9yZSgKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxDMlN0cmluZywgQzJDb21wb25lbnRGYWN0b3J5OjpDcmVhdGVDb2RlYzJGYWN0b3J5RnVuYywKKyAgICAgICAgQzJDb21wb25lbnRGYWN0b3J5OjpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmM+Pik7CisKKy8qKgogICogU2V0cyB0aGUgcHJlZmVycmVkIGNvbXBvbmVudCBzdG9yZSBpbiB0aGlzIHByb2Nlc3MgZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YgYWNjZXNzaW5nIGl0cwogICogaW50ZXJmYWNlLiBJZiB0aGlzIGlzIG5vdCBjYWxsZWQsIHRoZSBkZWZhdWx0IElDb21wb25lbnRTdG9yZSBIQUwgKGlmIGV4aXN0cykgaXMgdGhlIHByZWZlcnJlZAogICogc3RvcmUgZm9yIHRoaXMgcHVycG9zZS4gSWYgdGhlIGRlZmF1bHQgSUNvbXBvbmVudFN0b3JlIEhBTCBpcyBub3QgcHJlc2VudCwgdGhlIHBsYXRmb3JtCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlVXRpbHMuaAppbmRleCBlOTAzN2U1Li4xM2JkYWMzIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5oCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZVV0aWxzLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgQzJVVElMU19JTlRFUkZBQ0VfVVRJTFNfSF8KICNkZWZpbmUgQzJVVElMU19JTlRFUkZBQ0VfVVRJTFNfSF8KIAorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8QzJQYXJhbS5oPgogI2luY2x1ZGUgPEMyV29yay5oPgogCkBAIC0xMTMwLDYgKzExMzEsMTkgQEAKIAogfTsKIAorLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBDMkNvbXBvbmVudEludGVyZmFjZQorICovCitzdHJ1Y3QgQzJJbnRlcmZhY2VVdGlscyB7CisgICAgLyoqCisgICAgICogQ3JlYXRlIHRyYWl0cyBmcm9tIEMyQ29tcG9uZW50SW50ZXJmYWNlLiBOb3RlIHRoYXQgcmFuayBjYW5ub3QgYmUgcXVlcmllZCBmcm9tIGludGVyZmFjZXMsCisgICAgICogc28gbGVmdCB1bnRvdWNoZWQuCisgICAgICovCisgICAgc3RhdGljIGJvb2wgRmlsbFRyYWl0c0Zyb21JbnRlcmZhY2UoCisgICAgICAgICAgICBDMkNvbXBvbmVudDo6VHJhaXRzICp0cmFpdHMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKTsKK307CisKICNpbmNsdWRlIDx1dGlsL0MyRGVidWctaW50ZXJmYWNlLmg+CiAKICNlbmRpZiAgLy8gQzJVVElMU19JTlRFUkZBQ0VfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MySGFuZGxlSW9uSW50ZXJuYWwuaCBiL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MySGFuZGxlSW9uSW50ZXJuYWwuaAppbmRleCBjMGUxZDgzLi5jNjc2OThjIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMkhhbmRsZUlvbkludGVybmFsLmgKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJIYW5kbGVJb25JbnRlcm5hbC5oCkBAIC0yOCw3ICsyOCwxMCBAQAogICAgICAgICAgIG1GZHN7IGJ1ZmZlckZkIH0sCiAgICAgICAgICAgbUludHN7IGludChzaXplICYgMHhGRkZGRkZGRiksIGludCgodWludDY0X3Qoc2l6ZSkgPj4gMzIpICYgMHhGRkZGRkZGRiksIGtNYWdpYyB9IHsgfQogCi0gICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSAqIGNvbnN0IG8pOworICAgIHN0YXRpYyBib29sIElzVmFsaWQoY29uc3QgQzJIYW5kbGUgKiBjb25zdCBvKTsKKworICAgIC8vIGRlcHJlY2F0ZWQKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IEMySGFuZGxlICogY29uc3QgbykgeyByZXR1cm4gSXNWYWxpZChvKTsgfQogCiAgICAgaW50IGJ1ZmZlckZkKCkgY29uc3QgeyByZXR1cm4gbUZkcy5tQnVmZmVyOyB9CiAgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9wbGF0Zm9ybS9DMkJxQnVmZmVyLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwCmluZGV4IDYyOTM2ZjYuLmZmZjEyYzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwCkBAIC0yMjMsNyArMjIzLDcgQEAKICAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9yR3JhbGxvYz4gc0FsbG9jYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJBbGxvY2F0b3JHcmFsbG9jPigwKTsKIAogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKLSAgICBpZiAoQzJBbGxvY2F0b3JHcmFsbG9jOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICBpZiAoQzJBbGxvY2F0b3JHcmFsbG9jOjpDaGVja0hhbmRsZShoYW5kbGUpKSB7CiAgICAgICAgIHVpbnQzMl90IHdpZHRoOwogICAgICAgICB1aW50MzJfdCBoZWlnaHQ7CiAgICAgICAgIHVpbnQzMl90IGZvcm1hdDsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZUhlbHBlci5jcHAKaW5kZXggOWViNTJkMi4uMTlkMjI5NSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZUhlbHBlci5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZUhlbHBlci5jcHAKQEAgLTY0NSw2ICs2NDUsNyBAQAogICAgICAgICAgICAgICAgICAgICBsYXRlUmVhZFBhcmFtcy5lbXBsYWNlX2JhY2socCk7CiAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiByZXF1ZXN0KEMyUGFyYW06OkNvcHlBc1JlcXVlc3QoKnApKTsKICAgICAgICAgICAgICAgICAgICAgcCA9IHJlcXVlc3QuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtSXggPSBwLT5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICBwYXJhbVJlcXVlc3RzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUocmVxdWVzdCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MySW50ZXJmYWNlVXRpbHMuY3BwCmluZGV4IDBjMTcyOWIuLmI1YmM2OTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZVV0aWxzLmNwcApAQCAtMjEsNiArMjEsNyBAQAogCiAjZGVmaW5lIEMyX0xPR19WRVJCT1NFCiAKKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgogI2luY2x1ZGUgPEMyRGVidWcuaD4KICNpbmNsdWRlIDxDMlBhcmFtLmg+CiAjaW5jbHVkZSA8QzJQYXJhbURlZi5oPgpAQCAtMzAsNiArMzEsNyBAQAogI2luY2x1ZGUgPGNtYXRoPgogI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KQEAgLTEzMDQsMyArMTMwNiw4MSBAQAogICAgIHJldHVybiBzdGQ6OnZlY3RvcjxJbmZvPihsb2NhdGlvbi5iZWdpbigpLCBsb2NhdGlvbi5lbmQoKSk7CiB9CiAKKy8vc3RhdGljCitib29sIEMySW50ZXJmYWNlVXRpbHM6OkZpbGxUcmFpdHNGcm9tSW50ZXJmYWNlKAorICAgICAgICBDMkNvbXBvbmVudDo6VHJhaXRzICp0cmFpdHMsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpIHsKKyAgICBpZiAoIXRyYWl0cykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHRyYWl0cy0+bmFtZSA9IGludGYtPmdldE5hbWUoKTsKKworICAgIEMyQ29tcG9uZW50S2luZFNldHRpbmcga2luZDsKKyAgICBDMkNvbXBvbmVudERvbWFpblNldHRpbmcgZG9tYWluOworICAgIGMyX3N0YXR1c190IHJlcyA9IGludGYtPnF1ZXJ5X3ZiKHsgJmtpbmQsICZkb21haW4gfSwge30sIEMyX01BWV9CTE9DSywgbnVsbHB0cik7CisgICAgYm9vbCBmaXhEb21haW4gPSByZXMgIT0gQzJfT0s7CisgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICB0cmFpdHMtPmtpbmQgPSBraW5kLnZhbHVlOworICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IGRvbWFpbi52YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBmYWxsLWJhY2sKKyAgICAgICAgQzJfTE9HKERFQlVHKSA8PCAiZmFpbGVkIHRvIHF1ZXJ5IGludGVyZmFjZSBmb3Iga2luZCBhbmQgZG9tYWluOiAiIDw8IHJlczsKKworICAgICAgICB0cmFpdHMtPmtpbmQgPQorICAgICAgICAgICAgKHRyYWl0cy0+bmFtZS5maW5kKCJlbmNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpID8gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiA6CisgICAgICAgICAgICAodHJhaXRzLT5uYW1lLmZpbmQoImRlY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgPyBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSIDoKKyAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX09USEVSOworICAgIH0KKworICAgIHVpbnQzMl90IG1lZGlhVHlwZUluZGV4ID0gdHJhaXRzLT5raW5kID09IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIKKyAgICAgICAgICAgID8gQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0OjpQQVJBTV9UWVBFCisgICAgICAgICAgICA6IEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgIHJlcyA9IGludGYtPnF1ZXJ5X3ZiKHt9LCB7IG1lZGlhVHlwZUluZGV4IH0sIEMyX01BWV9CTE9DSywgJnBhcmFtcyk7CisgICAgaWYgKHJlcyAhPSBDMl9PSykgeworICAgICAgICBDMl9MT0coREVCVUcpIDw8ICJmYWlsZWQgdG8gcXVlcnkgaW50ZXJmYWNlOiAiIDw8IHJlczsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxdSkgeworICAgICAgICBDMl9MT0coREVCVUcpIDw8ICJmYWlsZWQgdG8gcXVlcnkgaW50ZXJmYWNlOiB1bmV4cGVjdGVkIHZlY3RvciBzaXplOiAiIDw8IHBhcmFtcy5zaXplKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQzJQb3J0TWVkaWFUeXBlU2V0dGluZyAqbWVkaWFUeXBlQ29uZmlnID0gQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6RnJvbShwYXJhbXNbMF0uZ2V0KCkpOworICAgIGlmIChtZWRpYVR5cGVDb25maWcgPT0gbnVsbHB0cikgeworICAgICAgICBDMl9MT0coREVCVUcpIDw8ICJmYWlsZWQgdG8gcXVlcnkgbWVkaWEgdHlwZSI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdHJhaXRzLT5tZWRpYVR5cGUgPQorICAgICAgICBzdGQ6OnN0cmluZyhtZWRpYVR5cGVDb25maWctPm0udmFsdWUsCisgICAgICAgICAgICAgICAgICAgIHN0cm5sZW4obWVkaWFUeXBlQ29uZmlnLT5tLnZhbHVlLCBtZWRpYVR5cGVDb25maWctPmZsZXhDb3VudCgpKSk7CisKKyAgICBpZiAoZml4RG9tYWluKSB7CisgICAgICAgIGlmIChzdHJuY21wKHRyYWl0cy0+bWVkaWFUeXBlLmNfc3RyKCksICJhdWRpby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fQVVESU87CisgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCh0cmFpdHMtPm1lZGlhVHlwZS5jX3N0cigpLCAidmlkZW8vIiwgNikgPT0gMCkgeworICAgICAgICAgICAgdHJhaXRzLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPOworICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAodHJhaXRzLT5tZWRpYVR5cGUuY19zdHIoKSwgImltYWdlLyIsIDYpID09IDApIHsKKyAgICAgICAgICAgIHRyYWl0cy0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyYWl0cy0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBhcmFtcy5jbGVhcigpOworICAgIHJlcyA9IGludGYtPnF1ZXJ5X3ZiKHt9LCB7IEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmc6OlBBUkFNX1RZUEUgfSwgQzJfTUFZX0JMT0NLLCAmcGFyYW1zKTsKKyAgICBpZiAocmVzID09IEMyX09LICYmIHBhcmFtcy5zaXplKCkgPT0gMXUpIHsKKyAgICAgICAgQzJDb21wb25lbnRBbGlhc2VzU2V0dGluZyAqYWxpYXNlc1NldHRpbmcgPQorICAgICAgICAgICAgQzJDb21wb25lbnRBbGlhc2VzU2V0dGluZzo6RnJvbShwYXJhbXNbMF0uZ2V0KCkpOworICAgICAgICBpZiAoYWxpYXNlc1NldHRpbmcpIHsKKyAgICAgICAgICAgIHN0ZDo6aXN0cmluZ3N0cmVhbSBpc3MoCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGFsaWFzZXNTZXR0aW5nLT5tLnZhbHVlLCBhbGlhc2VzU2V0dGluZy0+ZmxleENvdW50KCkpKTsKKyAgICAgICAgICAgIEMyX0xPRyhERUJVRykgPDwgaW50Zi0+Z2V0TmFtZSgpIDw8ICIgaGFzIGFsaWFzZXM6ICIgPDwgaXNzLnN0cigpOworCisgICAgICAgICAgICBmb3IgKHN0ZDo6c3RyaW5nIHRvazsgc3RkOjpnZXRsaW5lKGlzcywgdG9rLCAnLCcpOyApIHsKKyAgICAgICAgICAgICAgICB0cmFpdHMtPmFsaWFzZXMucHVzaF9iYWNrKHRvayk7CisgICAgICAgICAgICAgICAgQzJfTE9HKERFQlVHKSA8PCAiYWRkaW5nIGFsaWFzOiAiIDw8IHRvazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJuYi9URVNUX01BUFBJTkcgYi9tZWRpYS9jb2RlY3MvYW1ybmIvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0M2QwOGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1ybmIvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsMTAgQEAKKy8vIG1hcHBpbmdzIGZvciBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYgoreworICAvLyB0ZXN0cyB3aGljaCByZXF1aXJlIGR5bmFtaWMgY29udGVudAorICAvLyBpbnZva2Ugd2l0aDogYXRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorICAvLyBUT0RPKGIvMTQ4MDk0MDU5KTogdW5pdCB0ZXN0cyBub3QgYWxsb3dlZCB0byBkb3dubG9hZCBjb250ZW50CisgICJkeW5hbWljLXByZXN1Ym1pdCI6IFsKKyAgICB7ICJuYW1lIjogIkFtcm5iRGVjb2RlclRlc3QifSwKKyAgICB7ICJuYW1lIjogIkFtcm5iRW5jb2RlclRlc3QifQorICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQuYnAKc2ltaWxhcml0eSBpbmRleCA4MyUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLmJwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQuYnAKaW5kZXggNTlhNzkxZC4uYmFlNjVmMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5icApAQCAtMSwzICsxLDIyIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX2Ftcm5iX2NvbW1vbl9saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfYW1ybmJfY29tbW9uX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL05PVElDRSBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL05PVElDRQpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9OT1RJQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9hYnNfcy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Fic19zLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9hYnNfcy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYWJzX3MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2FkZC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2FkZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYWRkLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9hZGQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2F6X2xzcC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2F6X2xzcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYXpfbHNwLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9hel9sc3AuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljX29wLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNfb3AuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljX29wLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY19vcC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNfb3BfYXJtX2djY192NS5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljX29wX2FybV9nY2NfdjUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljX29wX2FybV9nY2NfdjUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljX29wX2FybV9nY2NfdjUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljX29wX2FybV92NS5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljX29wX2FybV92NS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNfb3BfYXJtX3Y1LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY19vcF9hcm1fdjUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljX29wX2NfZXF1aXZhbGVudC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljX29wX2NfZXF1aXZhbGVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNfb3BfY19lcXVpdmFsZW50LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY19vcF9jX2VxdWl2YWxlbnQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljb3BfbWFsbG9jLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNvcF9tYWxsb2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljb3BfbWFsbG9jLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY29wX21hbGxvYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYml0bm9fdGFiLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYml0bm9fdGFiLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iaXRub190YWIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2JpdG5vX3RhYi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYml0cmVvcmRlcl90YWIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iaXRyZW9yZGVyX3RhYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYml0cmVvcmRlcl90YWIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2JpdHJlb3JkZXJfdGFiLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iaXRzMnBybS5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2JpdHMycHJtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iaXRzMnBybS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYml0czJwcm0uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Nuc3QuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9jbnN0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9jbnN0LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9jbnN0LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9jbnN0X3ZhZC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Nuc3RfdmFkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9jbnN0X3ZhZC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvY25zdF92YWQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2NvcHkuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9jb3B5LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9jb3B5LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9jb3B5LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kX2dhaW5fYy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2RfZ2Fpbl9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kX2dhaW5fYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZF9nYWluX2MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2RfZ2Fpbl9wLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZF9nYWluX3AuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2RfZ2Fpbl9wLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kX2dhaW5fcC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZF9wbHNmLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZF9wbHNmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kX3Bsc2YuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2RfcGxzZi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZGl2XzMyLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZGl2XzMyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kaXZfMzIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Rpdl8zMi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZGl2X3MuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kaXZfcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZGl2X3MuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Rpdl9zLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kdHhfY29tbW9uX2RlZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2R0eF9jb21tb25fZGVmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kdHhfY29tbW9uX2RlZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZHR4X2NvbW1vbl9kZWYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2V4dHJhY3RfaC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2V4dHJhY3RfaC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZXh0cmFjdF9oLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9leHRyYWN0X2guaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2V4dHJhY3RfbC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2V4dHJhY3RfbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZXh0cmFjdF9sLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9leHRyYWN0X2wuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ZyYW1lLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZnJhbWUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ZyYW1lLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9mcmFtZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZnJhbWVfdHlwZV8zZ3BwLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZnJhbWVfdHlwZV8zZ3BwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9mcmFtZV90eXBlXzNncHAuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ZyYW1lX3R5cGVfM2dwcC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZ2NfcHJlZC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2djX3ByZWQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2djX3ByZWQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2djX3ByZWQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2dtZWRfbi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2dtZWRfbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZ21lZF9uLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9nbWVkX24uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2dzbV9hbXJfdHlwZWRlZnMuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9nc21fYW1yX3R5cGVkZWZzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9nc21fYW1yX3R5cGVkZWZzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9nc21fYW1yX3R5cGVkZWZzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9pbnRfbHBjLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvaW50X2xwYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvaW50X2xwYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvaW50X2xwYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvaW50X2xzZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ludF9sc2YuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ludF9sc2YuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ludF9sc2YuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ludl9zcXJ0LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvaW52X3NxcnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ludl9zcXJ0LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9pbnZfc3FydC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9hYnMuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2Ficy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9hYnMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfYWJzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2FkZC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfYWRkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2FkZC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9hZGQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfYWRkX2MuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2FkZF9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2FkZF9jLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2FkZF9jLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2NvbXAuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2NvbXAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfY29tcC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9jb21wLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2RlcG9zaXRfaC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfZGVwb3NpdF9oLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2RlcG9zaXRfaC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9kZXBvc2l0X2guaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfZGVwb3NpdF9sLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9kZXBvc2l0X2wuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfZGVwb3NpdF9sLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2RlcG9zaXRfbC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9leHRyYWN0LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9leHRyYWN0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2V4dHJhY3QuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfZXh0cmFjdC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9tYWMuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX21hYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9tYWMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfbWFjLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX21zdS5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfbXN1LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX21zdS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9tc3UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfbXVsdC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfbXVsdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9tdWx0LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX211bHQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfbmVnYXRlLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9uZWdhdGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfbmVnYXRlLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX25lZ2F0ZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9zaGwuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX3NobC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9zaGwuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfc2hsLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX3Noci5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfc2hyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX3Noci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9zaHIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfc2hyX3IuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX3Nocl9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX3Nocl9yLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX3Nocl9yLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX3N1Yi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfc3ViLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX3N1Yi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9zdWIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xvZzIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sb2cyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sb2cyLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sb2cyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sb2cyX25vcm0uaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sb2cyX25vcm0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xvZzJfbm9ybS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbG9nMl9ub3JtLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sc2Z3dC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xzZnd0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sc2Z3dC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbHNmd3QuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xzcC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xzcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbHNwLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sc3AuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xzcF9hei5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xzcF9hei5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbHNwX2F6LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sc3BfYXouaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xzcF9sc2YuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sc3BfbHNmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sc3BfbHNmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sc3BfbHNmLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sc3BfdGFiLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbHNwX3RhYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbHNwX3RhYi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbHNwX3RhYi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbWFjXzMyLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbWFjXzMyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tYWNfMzIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL21hY18zMi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbW9kZS5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL21vZGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL21vZGUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL21vZGUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL21weV8zMi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL21weV8zMi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbXB5XzMyLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tcHlfMzIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL21weV8zMl8xNi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL21weV8zMl8xNi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbXB5XzMyXzE2LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tcHlfMzJfMTYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL211bHQuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tdWx0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tdWx0LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tdWx0LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tdWx0X3IuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tdWx0X3IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL211bHRfci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbXVsdF9yLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9uX3Byb2MuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9uX3Byb2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL25fcHJvYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbl9wcm9jLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9uZWdhdGUuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9uZWdhdGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL25lZ2F0ZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbmVnYXRlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9ub3JtX2wuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9ub3JtX2wuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL25vcm1fbC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbm9ybV9sLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9ub3JtX3MuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9ub3JtX3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL25vcm1fcy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbm9ybV9zLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9vcGVyXzMyYi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL29wZXJfMzJiLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9vcGVyXzMyYi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvb3Blcl8zMmIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3Bfb2xfd2doLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcF9vbF93Z2guaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3Bfb2xfd2doLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9wX29sX3dnaC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcG93Mi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3BvdzIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3BvdzIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3BvdzIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3ByZWRfbHQuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9wcmVkX2x0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9wcmVkX2x0LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9wcmVkX2x0LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xX3Bsc2YuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xX3Bsc2YuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3FfcGxzZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcV9wbHNmLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xX3Bsc2ZfM190YmwuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xX3Bsc2ZfM190YmwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3FfcGxzZl8zX3RibC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcV9wbHNmXzNfdGJsLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xX3Bsc2ZfNV90YmwuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xX3Bsc2ZfNV90YmwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3FfcGxzZl81X3RibC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcV9wbHNmXzVfdGJsLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xZ2FpbjQ3NV90YWIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xZ2FpbjQ3NV90YWIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3FnYWluNDc1X3RhYi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcWdhaW40NzVfdGFiLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xdWFfZ2Fpbi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3F1YV9nYWluLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xdWFfZ2Fpbi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcXVhX2dhaW4uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3F1YV9nYWluX3RibC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3F1YV9nYWluX3RibC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcXVhX2dhaW5fdGJsLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xdWFfZ2Fpbl90YmwuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3Jlb3JkZXIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9yZW9yZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9yZW9yZGVyLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9yZW9yZGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9yZXNpZHUuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9yZXNpZHUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3Jlc2lkdS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcmVzaWR1LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9yZXZlcnNlX2JpdHMuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9yZXZlcnNlX2JpdHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3JldmVyc2VfYml0cy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcmV2ZXJzZV9iaXRzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9yb3VuZC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3JvdW5kLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9yb3VuZC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcm91bmQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3NldF96ZXJvLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc2V0X3plcm8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3NldF96ZXJvLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zZXRfemVyby5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc2hsLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc2hsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zaGwuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3NobC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc2hyLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc2hyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zaHIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3Noci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc2hyX3IuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zaHJfci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc2hyX3IuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3Nocl9yLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zcXJ0X2wuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zcXJ0X2wuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3NxcnRfbC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc3FydF9sLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zdWIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zdWIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3N1Yi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc3ViLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zeW5fZmlsdC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3N5bl9maWx0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zeW5fZmlsdC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc3luX2ZpbHQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3R5cGVkZWYuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS90eXBlZGVmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS90eXBlZGVmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS90eXBlZGVmLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS92YWQuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS92YWQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3ZhZC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvdmFkLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS92YWQxLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvdmFkMS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvdmFkMS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvdmFkMS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvdmFkMi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3ZhZDIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3ZhZDIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3ZhZDIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3dlaWdodF9hLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvd2VpZ2h0X2EuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3dlaWdodF9hLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS93ZWlnaHRfYS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvd2luZG93X3RhYi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3dpbmRvd190YWIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3dpbmRvd190YWIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3dpbmRvd190YWIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3dtZl90b19ldHMuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS93bWZfdG9fZXRzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS93bWZfdG9fZXRzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS93bWZfdG9fZXRzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2FkZC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9hZGQuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9hZGQuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9hZGQuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9hel9sc3AuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYXpfbHNwLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYXpfbHNwLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYXpfbHNwLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYml0bm9fdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2JpdG5vX3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2JpdG5vX3RhYi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2JpdG5vX3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2JpdHJlb3JkZXJfdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2JpdHJlb3JkZXJfdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYml0cmVvcmRlcl90YWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9iaXRyZW9yZGVyX3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2JpdHMycHJtLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2JpdHMycHJtLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYml0czJwcm0uY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9iaXRzMnBybS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2MyXzlwZl90YWIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYzJfOXBmX3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2MyXzlwZl90YWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9jMl85cGZfdGFiLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvY29weS5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9jb3B5LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvY29weS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2NvcHkuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9kaXZfMzIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZGl2XzMyLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZGl2XzMyLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZGl2XzMyLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZGl2X3MuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZGl2X3MuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9kaXZfcy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2Rpdl9zLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZXh0cmFjdF9oLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2V4dHJhY3RfaC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2V4dHJhY3RfaC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2V4dHJhY3RfaC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2V4dHJhY3RfbC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9leHRyYWN0X2wuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9leHRyYWN0X2wuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9leHRyYWN0X2wuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9nYWluc190YmwuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ2FpbnNfdGJsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ2FpbnNfdGJsLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ2FpbnNfdGJsLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ2NfcHJlZC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9nY19wcmVkLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ2NfcHJlZC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2djX3ByZWQuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9nbWVkX24uY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ21lZF9uLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ21lZF9uLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ21lZF9uLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ3JheV90YmwuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ3JheV90YmwuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ncmF5X3RibC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2dyYXlfdGJsLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ3JpZF90YmwuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ3JpZF90YmwuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ncmlkX3RibC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2dyaWRfdGJsLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvaW50X2xwYy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9pbnRfbHBjLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvaW50X2xwYy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2ludF9scGMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9pbnZfc3FydC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9pbnZfc3FydC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2ludl9zcXJ0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvaW52X3NxcnQuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9pbnZfc3FydF90YmwuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvaW52X3NxcnRfdGJsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvaW52X3NxcnRfdGJsLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvaW52X3NxcnRfdGJsLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9hYnMuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9hYnMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sX2Ficy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfYWJzLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9kZXBvc2l0X2guY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9kZXBvc2l0X2guY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sX2RlcG9zaXRfaC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfZGVwb3NpdF9oLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9kZXBvc2l0X2wuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9kZXBvc2l0X2wuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sX2RlcG9zaXRfbC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfZGVwb3NpdF9sLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9zaHJfci5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sX3Nocl9yLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9zaHJfci5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfc2hyX3IuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sb2cyLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xvZzIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sb2cyLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbG9nMi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xvZzJfbm9ybS5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sb2cyX25vcm0uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sb2cyX25vcm0uY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sb2cyX25vcm0uY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sb2cyX3RibC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sb2cyX3RibC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xvZzJfdGJsLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbG9nMl90YmwuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc2Z3dC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc2Z3dC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzZnd0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNmd3QuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3AuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwX2F6LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcF9hei5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcF9hei5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcF9hei5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcF9sc2YuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwX2xzZi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcF9sc2YuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3BfbHNmLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwX2xzZl90YmwuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwX2xzZl90YmwuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3BfbHNmX3RibC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcF9sc2ZfdGJsLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwX3RhYi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3BfdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwX3RhYi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcF90YWIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9tdWx0X3IuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbXVsdF9yLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbXVsdF9yLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbXVsdF9yLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbmVnYXRlLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL25lZ2F0ZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL25lZ2F0ZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL25lZ2F0ZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL25vcm1fbC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ub3JtX2wuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ub3JtX2wuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ub3JtX2wuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ub3JtX3MuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbm9ybV9zLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbm9ybV9zLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbm9ybV9zLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcGhfZGlzcF90YWIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcGhfZGlzcF90YWIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9waF9kaXNwX3RhYi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3BoX2Rpc3BfdGFiLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcG93Mi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9wb3cyLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcG93Mi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3BvdzIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9wb3cyX3RibC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9wb3cyX3RibC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3BvdzJfdGJsLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcG93Ml90YmwuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9wcmVkX2x0LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3ByZWRfbHQuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9wcmVkX2x0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcHJlZF9sdC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2YuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2YuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2YuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2ZfMy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2ZfMy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZl8zLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmXzMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2ZfM190YmwuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmXzNfdGJsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmXzNfdGJsLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmXzNfdGJsLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmXzUuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmXzUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2ZfNS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZl81LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmXzVfdGJsLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZl81X3RibC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZl81X3RibC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZl81X3RibC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3F1YV9nYWluX3RibC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xdWFfZ2Fpbl90YmwuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xdWFfZ2Fpbl90YmwuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xdWFfZ2Fpbl90YmwuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9yZW9yZGVyLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Jlb3JkZXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9yZW9yZGVyLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcmVvcmRlci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Jlc2lkdS5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9yZXNpZHUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9yZXNpZHUuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9yZXNpZHUuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9yb3VuZC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9yb3VuZC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3JvdW5kLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcm91bmQuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zZXRfemVyby5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zZXRfemVyby5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3NldF96ZXJvLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc2V0X3plcm8uY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zaHIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc2hyLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc2hyLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc2hyLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc2hyX3IuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc2hyX3IuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zaHJfci5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Nocl9yLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc3FydF9sLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3NxcnRfbC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3NxcnRfbC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3NxcnRfbC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3NxcnRfbF90YmwuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc3FydF9sX3RibC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3NxcnRfbF90YmwuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zcXJ0X2xfdGJsLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc3ViLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3N1Yi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3N1Yi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3N1Yi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3N5bl9maWx0LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3N5bl9maWx0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc3luX2ZpbHQuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zeW5fZmlsdC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3ZhZDEuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvdmFkMS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3ZhZDEuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy92YWQxLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvd2VpZ2h0X2EuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvd2VpZ2h0X2EuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy93ZWlnaHRfYS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3dlaWdodF9hLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvd2luZG93X3RhYi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy93aW5kb3dfdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvd2luZG93X3RhYi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3dpbmRvd190YWIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4M2I4MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5icApAQCAtMCwwICsxLDEzOCBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjc19hbXJuYl9kZWNfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZSB0aGF0IHRvb2sgdGhlIGFwcHJvYWNoIG9mCisvLyAnYXBwbHkgZXZlcnkgbGljZW5zZSBmb3VuZCB0byBldmVyeSB0YXJnZXQnLiBXaGlsZSB0aGlzIG1ha2VzIHN1cmUgd2UgcmVzcGVjdAorLy8gZXZlcnkgbGljZW5zZSByZXN0cmljdGlvbiwgaXQgbWF5IG5vdCBiZSBlbnRpcmVseSBjb3JyZWN0LgorLy8KKy8vIGUuZy4gR1BMIGluIGFuIE1JVCBwcm9qZWN0IG1pZ2h0IG9ubHkgYXBwbHkgdG8gdGhlIGNvbnRyaWIvIGRpcmVjdG9yeS4KKy8vCisvLyBQbGVhc2UgY29uc2lkZXIgc3BsaXR0aW5nIHRoZSBzaW5nbGUgbGljZW5zZSBiZWxvdyBpbnRvIG11bHRpcGxlIGxpY2Vuc2VzLAorLy8gdGFraW5nIGNhcmUgbm90IHRvIGxvc2UgYW55IGxpY2Vuc2Vfa2luZCBpbmZvcm1hdGlvbiwgYW5kIG92ZXJyaWRpbmcgdGhlCisvLyBkZWZhdWx0IGxpY2Vuc2UgdXNpbmcgdGhlICdsaWNlbnNlczogWy4uLl0nIHByb3BlcnR5IG9uIHRhcmdldHMgYXMgbmVlZGVkLgorLy8KKy8vIEZvciB1bnVzZWQgZmlsZXMsIGNvbnNpZGVyIGNyZWF0aW5nIGEgJ2ZpbGVHcm91cCcgd2l0aCAiLy92aXNpYmlsaXR5OnByaXZhdGUiCisvLyB0byBhdHRhY2ggdGhlIGxpY2Vuc2UgdG8sIGFuZCBpbmNsdWRpbmcgYSBjb21tZW50IHdoZXRoZXIgdGhlIGZpbGVzIG1heSBiZQorLy8gdXNlZCBpbiB0aGUgY3VycmVudCBwcm9qZWN0LgorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX2Ftcm5iX2RlY19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUJTRCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJuYmRlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvYV9yZWZsLmNwcCIsCisgICAgICAgICJzcmMvYWdjLmNwcCIsCisgICAgICAgICJzcmMvYW1yZGVjb2RlLmNwcCIsCisgICAgICAgICJzcmMvYl9jbl9jb2QuY3BwIiwKKyAgICAgICAgInNyYy9iZ25zY2QuY3BwIiwKKyAgICAgICAgInNyYy9jX2dfYXZlci5jcHAiLAorICAgICAgICAic3JjL2QxMDM1cGYuY3BwIiwKKyAgICAgICAgInNyYy9kMl8xMXBmLmNwcCIsCisgICAgICAgICJzcmMvZDJfOXBmLmNwcCIsCisgICAgICAgICJzcmMvZDNfMTRwZi5jcHAiLAorICAgICAgICAic3JjL2Q0XzE3cGYuY3BwIiwKKyAgICAgICAgInNyYy9kOF8zMXBmLmNwcCIsCisgICAgICAgICJzcmMvZF9nYWluX2MuY3BwIiwKKyAgICAgICAgInNyYy9kX2dhaW5fcC5jcHAiLAorICAgICAgICAic3JjL2RfcGxzZi5jcHAiLAorICAgICAgICAic3JjL2RfcGxzZl8zLmNwcCIsCisgICAgICAgICJzcmMvZF9wbHNmXzUuY3BwIiwKKyAgICAgICAgInNyYy9kZWNfYW1yLmNwcCIsCisgICAgICAgICJzcmMvZGVjX2dhaW4uY3BwIiwKKyAgICAgICAgInNyYy9kZWNfaW5wdXRfZm9ybWF0X3RhYi5jcHAiLAorICAgICAgICAic3JjL2RlY19sYWczLmNwcCIsCisgICAgICAgICJzcmMvZGVjX2xhZzYuY3BwIiwKKyAgICAgICAgInNyYy9kdHhfZGVjLmNwcCIsCisgICAgICAgICJzcmMvZWNfZ2FpbnMuY3BwIiwKKyAgICAgICAgInNyYy9leF9jdHJsLmNwcCIsCisgICAgICAgICJzcmMvaWYyX3RvX2V0cy5jcHAiLAorICAgICAgICAic3JjL2ludF9sc2YuY3BwIiwKKyAgICAgICAgInNyYy9sc3BfYXZnLmNwcCIsCisgICAgICAgICJzcmMvcGhfZGlzcC5jcHAiLAorICAgICAgICAic3JjL3Bvc3RfcHJvLmNwcCIsCisgICAgICAgICJzcmMvcHJlZW1waC5jcHAiLAorICAgICAgICAic3JjL3BzdGZpbHQuY3BwIiwKKyAgICAgICAgInNyYy9xZ2FpbjQ3NV90YWIuY3BwIiwKKyAgICAgICAgInNyYy9zcF9kZWMuY3BwIiwKKyAgICAgICAgInNyYy93bWZfdG9fZXRzLmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ET1NDTF9VTlVTRURfQVJHKHgpPSh2b2lkKSh4KSIsCisgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAorCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgLy9zYW5pdGl6ZTogeworICAgIC8vICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgLy8gICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgLy8gICAgXSwKKyAgICAvL30sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CisKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworY2NfdGVzdCB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjX3Rlc3QiLAorICAgIGd0ZXN0OiBmYWxzZSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsidGVzdC9hbXJuYmRlY190ZXN0LmNwcCJdLAorCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYmRlYyIsCisgICAgICAgICJsaWJzbmRmaWxlIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICAvL3Nhbml0aXplOiB7CisgICAgLy8gICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAvLyAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAvLyAgICBdLAorICAgIC8vfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvTk9USUNFIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvTk9USUNFCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYV9yZWZsLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FfcmVmbC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FfcmVmbC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FfcmVmbC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FfcmVmbC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYV9yZWZsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FfcmVmbC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hX3JlZmwuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYWdjLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FnYy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FnYy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FnYy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FnYy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYWdjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FnYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hZ2MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYW1yZGVjb2RlLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FtcmRlY29kZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FtcmRlY29kZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FtcmRlY29kZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FtcmRlY29kZS5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYW1yZGVjb2RlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FtcmRlY29kZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hbXJkZWNvZGUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYl9jbl9jb2QuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYl9jbl9jb2QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9iX2NuX2NvZC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2JfY25fY29kLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYl9jbl9jb2QuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2JfY25fY29kLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2JfY25fY29kLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2JfY25fY29kLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2JnbnNjZC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9iZ25zY2QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9iZ25zY2QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9iZ25zY2QuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9iZ25zY2QuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2JnbnNjZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9iZ25zY2QuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYmduc2NkLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2NfZ19hdmVyLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2NfZ19hdmVyLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvY19nX2F2ZXIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9jX2dfYXZlci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2NfZ19hdmVyLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9jX2dfYXZlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9jX2dfYXZlci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9jX2dfYXZlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMTAzNXBmLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QxMDM1cGYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMTAzNXBmLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDEwMzVwZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QxMDM1cGYuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QxMDM1cGYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDEwMzVwZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMTAzNXBmLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QyXzExcGYuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDJfMTFwZi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QyXzExcGYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMl8xMXBmLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDJfMTFwZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDJfMTFwZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMl8xMXBmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QyXzExcGYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDJfOXBmLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QyXzlwZi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QyXzlwZi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QyXzlwZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QyXzlwZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDJfOXBmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QyXzlwZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMl85cGYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDNfMTRwZi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kM18xNHBmLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDNfMTRwZi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QzXzE0cGYuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kM18xNHBmLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kM18xNHBmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QzXzE0cGYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDNfMTRwZi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kNF8xN3BmLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2Q0XzE3cGYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kNF8xN3BmLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDRfMTdwZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2Q0XzE3cGYuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2Q0XzE3cGYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDRfMTdwZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kNF8xN3BmLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2Q4XzMxcGYuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDhfMzFwZi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2Q4XzMxcGYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kOF8zMXBmLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDhfMzFwZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDhfMzFwZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kOF8zMXBmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2Q4XzMxcGYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9nYWluX2MuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9nYWluX2MuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX2dhaW5fYy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfZ2Fpbl9jLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9nYWluX3AuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9nYWluX3AuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX2dhaW5fcC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfZ2Fpbl9wLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9wbHNmLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfcGxzZi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfcGxzZi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfcGxzZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfcGxzZl8zLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfcGxzZl8zLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9wbHNmXzMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX3Bsc2ZfMy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfcGxzZl81LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfcGxzZl81LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9wbHNmXzUuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX3Bsc2ZfNS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19hbXIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2Ftci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19hbXIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfYW1yLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2Ftci5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2Ftci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfYW1yLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19hbXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2dhaW4uY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2dhaW4uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfZ2Fpbi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19nYWluLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2dhaW4uaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19nYWluLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19nYWluLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19nYWluLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19pbnB1dF9mb3JtYXRfdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19pbnB1dF9mb3JtYXRfdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2lucHV0X2Zvcm1hdF90YWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfaW5wdXRfZm9ybWF0X3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19sYWczLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19sYWczLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2xhZzMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfbGFnMy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19sYWczLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfbGFnMy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfbGFnMy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfbGFnMy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfbGFnNi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfbGFnNi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19sYWc2LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2xhZzYuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfbGFnNi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2xhZzYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2xhZzYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2xhZzYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZHR4X2RlYy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kdHhfZGVjLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZHR4X2RlYy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2R0eF9kZWMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kdHhfZGVjLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kdHhfZGVjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2R0eF9kZWMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZHR4X2RlYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9lY19nYWlucy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9lY19nYWlucy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2VjX2dhaW5zLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZWNfZ2FpbnMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9lY19nYWlucy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZWNfZ2FpbnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZWNfZ2FpbnMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZWNfZ2FpbnMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZXhfY3RybC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9leF9jdHJsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZXhfY3RybC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2V4X2N0cmwuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9leF9jdHJsLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9leF9jdHJsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2V4X2N0cmwuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZXhfY3RybC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9nc21hbXJfZGVjLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9nc21hbXJfZGVjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2dzbWFtcl9kZWMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZ3NtYW1yX2RlYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9pZjJfdG9fZXRzLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2lmMl90b19ldHMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9pZjJfdG9fZXRzLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvaWYyX3RvX2V0cy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2lmMl90b19ldHMuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2lmMl90b19ldHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvaWYyX3RvX2V0cy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9pZjJfdG9fZXRzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2ludF9sc2YuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvaW50X2xzZi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2ludF9sc2YuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9pbnRfbHNmLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvbHNwX2F2Zy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9sc3BfYXZnLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvbHNwX2F2Zy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2xzcF9hdmcuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9sc3BfYXZnLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9sc3BfYXZnLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2xzcF9hdmcuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvbHNwX2F2Zy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9waF9kaXNwLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3BoX2Rpc3AuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9waF9kaXNwLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcGhfZGlzcC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3BoX2Rpc3AuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3BoX2Rpc3AuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcGhfZGlzcC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9waF9kaXNwLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3Bvc3RfcHJvLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3Bvc3RfcHJvLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcG9zdF9wcm8uY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wb3N0X3Byby5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3Bvc3RfcHJvLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wb3N0X3Byby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wb3N0X3Byby5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wb3N0X3Byby5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wcmVlbXBoLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3ByZWVtcGguY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wcmVlbXBoLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcHJlZW1waC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3ByZWVtcGguaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3ByZWVtcGguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcHJlZW1waC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wcmVlbXBoLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3BzdGZpbHQuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcHN0ZmlsdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3BzdGZpbHQuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wc3RmaWx0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcHN0ZmlsdC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcHN0ZmlsdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wc3RmaWx0LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3BzdGZpbHQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcWdhaW40NzVfdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3FnYWluNDc1X3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3FnYWluNDc1X3RhYi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3FnYWluNDc1X3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3NwX2RlYy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9zcF9kZWMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9zcF9kZWMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9zcF9kZWMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9zcF9kZWMuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3NwX2RlYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9zcF9kZWMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvc3BfZGVjLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3dtZl90b19ldHMuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvd21mX3RvX2V0cy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3dtZl90b19ldHMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy93bWZfdG9fZXRzLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0Ftcm5iRGVjVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW1ybmJEZWNUZXN0RW52aXJvbm1lbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0Ftcm5iRGVjVGVzdEVudmlyb25tZW50LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9BbXJuYkRlY1Rlc3RFbnZpcm9ubWVudC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW1ybmJEZWNvZGVyVGVzdC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW1ybmJEZWNvZGVyVGVzdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9BbXJuYkRlY29kZXJUZXN0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0Ftcm5iRGVjb2RlclRlc3QuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9BbmRyb2lkLmJwCnNpbWlsYXJpdHkgaW5kZXggNzAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9BbmRyb2lkLmJwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW5kcm9pZC5icAppbmRleCA3YTk1Y2ZhLi43NDI1OGUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW5kcm9pZC5icApAQCAtMTQsOSArMTQsMjIgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjc19hbXJuYl9kZWNfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1CU0QKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX2Ftcm5iX2RlY19saWNlbnNlIiwKKyAgICBdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiQW1ybmJEZWNvZGVyVGVzdCIsCiAgICAgZ3Rlc3Q6IHRydWUsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJBbXJuYkRlY29kZXJUZXN0LmNwcCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApzaW1pbGFyaXR5IGluZGV4IDcwJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApjb3B5IHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwKaW5kZXggN2ZmOTczMi4uMWE5ZTY3OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbAorKysgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCkBAIC0xMywxOSArMTMsMTkgQEAKICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgTXAzIERlY29kZXIgdW5pdCB0ZXN0Ij4KLSAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iTXAzRGVjb2RlclRlc3QiIC8+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBBbXItbmIgRGVjb2RlciB1bml0IHRlc3QiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJBbXJuYkRlY29kZXJUZXN0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9Ik1wM0RlY29kZXJUZXN0LT4vZGF0YS9sb2NhbC90bXAvTXAzRGVjb2RlclRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkFtcm5iRGVjb2RlclRlc3QtPi9kYXRhL2xvY2FsL3RtcC9BbXJuYkRlY29kZXJUZXN0IiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKLSAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDNkZWMvdGVzdC9NcDNEZWNvZGVyVGVzdC56aXA/dW56aXA9dHJ1ZSIKLSAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvTXAzRGVjb2RlclRlc3RSZXMvIiAvPgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9BbXJuYkRlY29kZXJUZXN0LnppcD91bnppcD10cnVlIgorICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC9BbXJuYkRlY29kZXJUZXN0UmVzLyIgLz4KICAgICA8L3RhcmdldF9wcmVwYXJlcj4KIAogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgogICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iTXAzRGVjb2RlclRlc3QiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9NcDNEZWNvZGVyVGVzdFJlcy8iIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJBbXJuYkRlY29kZXJUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWZsYWciIHZhbHVlPSItUCAvZGF0YS9sb2NhbC90bXAvQW1ybmJEZWNvZGVyVGVzdFJlcy8iIC8+CiAgICAgPC90ZXN0PgogPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L1JFQURNRS5tZCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwNzNlNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9SRUFETUUubWQKQEAgLTAsMCArMSwzOSBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIEFNUi1OQiBEZWNvZGVyIDoKK1RoZSBBbXItTmIgRGVjb2RlciBUZXN0IFN1aXRlIHZhbGlkYXRlcyB0aGUgYW1ybmIgZGVjb2RlciBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIEFtcm5iRGVjb2RlclRlc3QKK2BgYAorCitUaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LworCitUaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCisKK1RvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvQW1ybmJEZWNvZGVyVGVzdC9BbXJuYkRlY29kZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvQW1ybmJEZWNvZGVyVGVzdC9BbXJuYkRlY29kZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0Ftcm5iRGVjb2RlclRlc3QuemlwKS4gRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgorCitgYGAKK2FkYiBwdXNoIEFtcm5iRGVjb2RlclRlc3RSZXMvLiAvZGF0YS9sb2NhbC90bXAvCitgYGAKKwordXNhZ2U6IEFtcm5iRGVjb2RlclRlc3QgLVAgXDxwYXRoX3RvX2ZvbGRlclw+CitgYGAKK2FkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvQW1ybmJEZWNvZGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvQW1ybmJEZWNvZGVyVGVzdFJlcy8KK2BgYAorQWx0ZXJuYXRpdmVseSwgdGhlIHRlc3QgY2FuIGFsc28gYmUgcnVuIHVzaW5nIGF0ZXN0IGNvbW1hbmQuCisKK2BgYAorYXRlc3QgQW1ybmJEZWNvZGVyVGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9hbXJuYmRlY190ZXN0LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9hbXJuYmRlY190ZXN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L2Ftcm5iZGVjX3Rlc3QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvYW1ybmJkZWNfdGVzdC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTk0N2U5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTQ1IEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX2Ftcm5iX2VuY19saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlIHRoYXQgdG9vayB0aGUgYXBwcm9hY2ggb2YKKy8vICdhcHBseSBldmVyeSBsaWNlbnNlIGZvdW5kIHRvIGV2ZXJ5IHRhcmdldCcuIFdoaWxlIHRoaXMgbWFrZXMgc3VyZSB3ZSByZXNwZWN0CisvLyBldmVyeSBsaWNlbnNlIHJlc3RyaWN0aW9uLCBpdCBtYXkgbm90IGJlIGVudGlyZWx5IGNvcnJlY3QuCisvLworLy8gZS5nLiBHUEwgaW4gYW4gTUlUIHByb2plY3QgbWlnaHQgb25seSBhcHBseSB0byB0aGUgY29udHJpYi8gZGlyZWN0b3J5LgorLy8KKy8vIFBsZWFzZSBjb25zaWRlciBzcGxpdHRpbmcgdGhlIHNpbmdsZSBsaWNlbnNlIGJlbG93IGludG8gbXVsdGlwbGUgbGljZW5zZXMsCisvLyB0YWtpbmcgY2FyZSBub3QgdG8gbG9zZSBhbnkgbGljZW5zZV9raW5kIGluZm9ybWF0aW9uLCBhbmQgb3ZlcnJpZGluZyB0aGUKKy8vIGRlZmF1bHQgbGljZW5zZSB1c2luZyB0aGUgJ2xpY2Vuc2VzOiBbLi4uXScgcHJvcGVydHkgb24gdGFyZ2V0cyBhcyBuZWVkZWQuCisvLworLy8gRm9yIHVudXNlZCBmaWxlcywgY29uc2lkZXIgY3JlYXRpbmcgYSAnZmlsZUdyb3VwJyB3aXRoICIvL3Zpc2liaWxpdHk6cHJpdmF0ZSIKKy8vIHRvIGF0dGFjaCB0aGUgbGljZW5zZSB0bywgYW5kIGluY2x1ZGluZyBhIGNvbW1lbnQgd2hldGhlciB0aGUgZmlsZXMgbWF5IGJlCisvLyB1c2VkIGluIHRoZSBjdXJyZW50IHByb2plY3QuCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfYW1ybmJfZW5jX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQlNEIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy9hbXJlbmNvZGUuY3BwIiwKKyAgICAgICAgInNyYy9hdXRvY29yci5jcHAiLAorICAgICAgICAic3JjL2MxMDM1cGYuY3BwIiwKKyAgICAgICAgInNyYy9jMl8xMXBmLmNwcCIsCisgICAgICAgICJzcmMvYzJfOXBmLmNwcCIsCisgICAgICAgICJzcmMvYzNfMTRwZi5jcHAiLAorICAgICAgICAic3JjL2M0XzE3cGYuY3BwIiwKKyAgICAgICAgInNyYy9jOF8zMXBmLmNwcCIsCisgICAgICAgICJzcmMvY2FsY19jb3IuY3BwIiwKKyAgICAgICAgInNyYy9jYWxjX2VuLmNwcCIsCisgICAgICAgICJzcmMvY2JzZWFyY2guY3BwIiwKKyAgICAgICAgInNyYy9jbF9sdHAuY3BwIiwKKyAgICAgICAgInNyYy9jb2RfYW1yLmNwcCIsCisgICAgICAgICJzcmMvY29udm9sdmUuY3BwIiwKKyAgICAgICAgInNyYy9jb3JfaC5jcHAiLAorICAgICAgICAic3JjL2Nvcl9oX3guY3BwIiwKKyAgICAgICAgInNyYy9jb3JfaF94Mi5jcHAiLAorICAgICAgICAic3JjL2NvcnJ3Z2h0X3RhYi5jcHAiLAorICAgICAgICAic3JjL2R0eF9lbmMuY3BwIiwKKyAgICAgICAgInNyYy9lbmNfbGFnMy5jcHAiLAorICAgICAgICAic3JjL2VuY19sYWc2LmNwcCIsCisgICAgICAgICJzcmMvZW5jX291dHB1dF9mb3JtYXRfdGFiLmNwcCIsCisgICAgICAgICJzcmMvZXRzX3RvX2lmMi5jcHAiLAorICAgICAgICAic3JjL2V0c190b193bWYuY3BwIiwKKyAgICAgICAgInNyYy9nX2FkYXB0LmNwcCIsCisgICAgICAgICJzcmMvZ19jb2RlLmNwcCIsCisgICAgICAgICJzcmMvZ19waXRjaC5jcHAiLAorICAgICAgICAic3JjL2dhaW5fcS5jcHAiLAorICAgICAgICAic3JjL2hwX21heC5jcHAiLAorICAgICAgICAic3JjL2ludGVyXzM2LmNwcCIsCisgICAgICAgICJzcmMvaW50ZXJfMzZfdGFiLmNwcCIsCisgICAgICAgICJzcmMvbF9jb21wLmNwcCIsCisgICAgICAgICJzcmMvbF9leHRyYWN0LmNwcCIsCisgICAgICAgICJzcmMvbF9uZWdhdGUuY3BwIiwKKyAgICAgICAgInNyYy9sYWdfd2luZC5jcHAiLAorICAgICAgICAic3JjL2xhZ193aW5kX3RhYi5jcHAiLAorICAgICAgICAic3JjL2xldmluc29uLmNwcCIsCisgICAgICAgICJzcmMvbHBjLmNwcCIsCisgICAgICAgICJzcmMvb2xfbHRwLmNwcCIsCisgICAgICAgICJzcmMvcF9vbF93Z2guY3BwIiwKKyAgICAgICAgInNyYy9waXRjaF9mci5jcHAiLAorICAgICAgICAic3JjL3BpdGNoX29sLmNwcCIsCisgICAgICAgICJzcmMvcHJlX2JpZy5jcHAiLAorICAgICAgICAic3JjL3ByZV9wcm9jLmNwcCIsCisgICAgICAgICJzcmMvcHJtMmJpdHMuY3BwIiwKKyAgICAgICAgInNyYy9xX2dhaW5fYy5jcHAiLAorICAgICAgICAic3JjL3FfZ2Fpbl9wLmNwcCIsCisgICAgICAgICJzcmMvcWdhaW40NzUuY3BwIiwKKyAgICAgICAgInNyYy9xZ2Fpbjc5NS5jcHAiLAorICAgICAgICAic3JjL3F1YV9nYWluLmNwcCIsCisgICAgICAgICJzcmMvczEwXzhwZi5jcHAiLAorICAgICAgICAic3JjL3NldF9zaWduLmNwcCIsCisgICAgICAgICJzcmMvc2lkX3N5bmMuY3BwIiwKKyAgICAgICAgInNyYy9zcF9lbmMuY3BwIiwKKyAgICAgICAgInNyYy9zcHJlcHJvYy5jcHAiLAorICAgICAgICAic3JjL3Nwc3Rwcm9jLmNwcCIsCisgICAgICAgICJzcmMvdG9uX3N0YWIuY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfaGVhZGVycyJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ET1NDTF9VTlVTRURfQVJHKHgpPSh2b2lkKSh4KSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgLy9hZGRyZXNzaW5nIGIvMjU0MDk3NDQKKyAgICAvL3Nhbml0aXplOiB7CisgICAgLy8gICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAvLyAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAvLyAgICBdLAorICAgIC8vfSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiJdLAorCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJuYmVuY190ZXN0IiwKKyAgICBndGVzdDogZmFsc2UsCisKKyAgICBzcmNzOiBbInRlc3QvYW1ybmJfZW5jX3Rlc3QuY3BwIl0sCisKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfYW1ybmJlbmMiXSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiJdLAorCisgICAgLy9hZGRyZXNzaW5nIGIvMjU0MDk3NDQKKyAgICAvL3Nhbml0aXplOiB7CisgICAgLy8gICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAvLyAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAvLyAgICBdLAorICAgIC8vfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvTk9USUNFIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvTk9USUNFCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9mdXp6ZXIvQW5kcm9pZC5icApzaW1pbGFyaXR5IGluZGV4IDYxJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9BbmRyb2lkLmJwCmNvcHkgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9mdXp6ZXIvQW5kcm9pZC5icAppbmRleCA1NGRlMWNjLi4yYzA0MWI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZnV6emVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMTgsMjAgKzE4LDM1IEBACiAgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQogICovCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjc19hbXJuYl9lbmNfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjc19hbXJuYl9lbmNfbGljZW5zZSIsCisgICAgXSwKK30KKwogY2NfZnV6eiB7Ci0gICAgbmFtZTogImFtcm5iX2RlY19mdXp6ZXIiLAorICAgIG5hbWU6ICJhbXJuYl9lbmNfZnV6emVyIiwKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKwogICAgIHNyY3M6IFsKLSAgICAgICAgImFtcm5iX2RlY19mdXp6ZXIuY3BwIiwKKyAgICAgICAgImFtcm5iX2VuY19mdXp6ZXIuY3BwIiwKICAgICBdLAorCiAgICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCiAgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJlbmMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKICAgICBdLAotICAgIHRhcmdldDogewotICAgICAgICBkYXJ3aW46IHsKLSAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAotICAgICAgICB9LAorCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKICAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9mdXp6ZXIvUkVBRE1FLm1kIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9mdXp6ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOWI0YTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw2MCBAQAorIyBGdXp6ZXIgZm9yIGxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jIGVuY29kZXIKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIEFNUi1OQiBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUKK2NvZGVjIGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK1RoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIG5vdCBoYXJkY29kZWQsIGJ1dCBpbnN0ZWFkIHNlbGVjdGVkIGJhc2VkIG9uCitpbmNvbWluZyBkYXRhLiBUaGlzIGVuc3VyZXMgbW9yZSBjb2RlIHBhdGhzIGFyZSByZWFjaGVkIGJ5IHRoZSBmdXp6ZXIuCisKK0FNUi1XQiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisxLiBPdXRwdXQgRm9ybWF0IChwYXJhbWV0ZXIgbmFtZTogYG91dHB1dEZvcm1hdGApCisyLiBNb2RlIChwYXJhbWV0ZXIgbmFtZTogYG1vZGVgKQorCit8IFBhcmFtZXRlcnwgVmFsaWQgVmFsdWVzfCBDb25maWd1cmVkIFZhbHVlfAorfC0tLS0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS18IC0tLS0tIHwKK3wgYG91dHB1dEZvcm1hdGAgfCAwLiBgQU1SX1RYX1dNRmAgMS4gYEFNUl9UWF9JRjJgIDIuIGBBTVJfVFhfRVRTYCB8IEJpdHMgMCwgMSBhbmQgMiBvZiAxc3QgYnl0ZSBvZiBkYXRhLiB8Cit8IGBtb2RlYCAgIHwgMC4gYE1SNDc1YCAxLiBgTVI1MTVgIDIuIGBNUjU5YCAzLiBgTVI2N2AgIDQuIGBNUjc0IGAgNS4gYE1SNzk1YCA2LiBgTVIxMDJgIDcuIGBNUjEyMmAgOC4gYE1SRFRYYCB8IEJpdHMgMywgNCwgNSBhbmQgNiBvZiAxc3QgYnl0ZSBvZiBkYXRhLiB8CisKK1RoaXMgYWxzbyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiBpcyBhbHdheXMgZGV0ZXJtaW5pc3RpYyBmb3IgYW55IGdpdmVuIGlucHV0LgorCisjIyMjIyBNYXhpbWl6ZSB1dGlsaXphdGlvbiBvZiBpbnB1dCBkYXRhCitUaGUgcGx1Z2luIGZlZWRzIHRoZSBlbnRpcmUgaW5wdXQgZGF0YSB0byB0aGUgY29kZWMgdXNpbmcgYSBsb29wLgorSWYgdGhlIGVuY29kZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIHRoZSBpbnB1dCBpcyBhZHZhbmNlZCBieSB0aGUgZnJhbWUgc2l6ZS4KK0lmIHRoZSBlbmNvZGUgb3BlcmF0aW9uIHdhcyB1bi1zdWNjZXNzZnVsLCB0aGUgaW5wdXQgaXMgc3RpbGwgYWR2YW5jZWQgYnkgZnJhbWUgc2l6ZSBzbwordGhhdCB0aGUgZnV6emVyIGNhbiBwcm9jZWVkIHRvIGZlZWQgdGhlIG5leHQgZnJhbWUuCisKK1RoaXMgZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gdG9sZXJhdGVzIGFueSBraW5kIG9mIGlucHV0IChlbXB0eSwgaHVnZSwKK21hbGZvcm1lZCwgZXRjKSBhbmQgZG9lc250IGBleGl0KClgIG9uIGFueSBpbnB1dCBhbmQgdGhlcmVieSBpbmNyZWFzaW5nIHRoZQorY2hhbmNlIG9mIGlkZW50aWZ5aW5nIHZ1bG5lcmFiaWxpdGllcy4KKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgYW1ybmJfZW5jX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgYW1ybmJfZW5jX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIHBjbSBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9hbXJuYl9lbmNfZnV6emVyL2Ftcm5iX2VuY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCitUbyBydW4gb24gaG9zdAorYGBgCisgICQgJEFORFJPSURfSE9TVF9PVVQvZnV6ei94ODZfNjQvYW1ybmJfZW5jX2Z1enplci9hbXJuYl9lbmNfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIyBSZWZlcmVuY2VzOgorICogaHR0cDovL2xsdm0ub3JnL2RvY3MvTGliRnV6emVyLmh0bWwKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvb3NzLWZ1enoKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvZnV6emVyL2Ftcm5iX2VuY19mdXp6ZXIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9mdXp6ZXIvYW1ybmJfZW5jX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjYmYyNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvZnV6emVyL2Ftcm5iX2VuY19mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsMTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSAiZ3NtYW1yX2VuYy5oIgorCisvLyBDb25zdGFudHMgZm9yIEFNUi1OQgorY29uc3QgaW50MzJfdCBrTnVtSW5wdXRTYW1wbGVzID0gTF9GUkFNRTsgIC8vIDE2MCBzYW1wbGVzCitjb25zdCBpbnQzMl90IGtPdXRwdXRCdWZmZXJTaXplID0gMiAqIGtOdW1JbnB1dFNhbXBsZXMgKiBzaXplb2YoV29yZDE2KTsKK2NvbnN0IE1vZGUga01vZGVzWzldID0ge01SNDc1LCAvKiA0Ljc1IGticHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1SNTE1LCAvKiA1LjE1IGticHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1SNTksICAvKiA1LjkwIGticHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1SNjcsICAvKiA2LjcwIGticHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1SNzQsICAvKiA3LjQwIGticHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1SNzk1LCAvKiA3Ljk1IGticHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1SMTAyLCAvKiAxMC4yIGticHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1SMTIyLCAvKiAxMi4yIGticHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1SRFRYLCAvKiBEVFggICAgICAgKi99OworY29uc3QgV29yZDE2IGtPdXRwdXRGb3JtYXRbM10gPSB7QU1SX1RYX1dNRiwgQU1SX1RYX0lGMiwgQU1SX1RYX0VUU307CisKK2NsYXNzIENvZGVjIHsKKyAgIHB1YmxpYzoKKyAgICBDb2RlYygpID0gZGVmYXVsdDsKKyAgICB+Q29kZWMoKSB7IGRlSW5pdEVuY29kZXIoKTsgfQorICAgIFdvcmQxNiBpbml0RW5jb2Rlcihjb25zdCB1aW50OF90ICpkYXRhKTsKKyAgICB2b2lkIGRlSW5pdEVuY29kZXIoKTsKKyAgICB2b2lkIGVuY29kZUZyYW1lcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgIHByaXZhdGU6CisgICAgdm9pZCAqbUVuY1N0YXRlID0gbnVsbHB0cjsKKyAgICB2b2lkICptU2lkU3RhdGUgPSBudWxscHRyOworfTsKKworV29yZDE2IENvZGVjOjppbml0RW5jb2Rlcihjb25zdCB1aW50OF90ICpkYXRhKSB7CisgICAgcmV0dXJuIEFNUkVuY29kZUluaXQoJm1FbmNTdGF0ZSwgJm1TaWRTdGF0ZSwgKCpkYXRhID4+IDEpICYgMHgwMSAvKiBkdHhfZW5hYmxlIGZsYWcgKi8pOworfQorCit2b2lkIENvZGVjOjpkZUluaXRFbmNvZGVyKCkgeworICAgIGlmIChtRW5jU3RhdGUpIHsKKyAgICAgICAgQU1SRW5jb2RlRXhpdCgmbUVuY1N0YXRlLCAmbVNpZFN0YXRlKTsKKyAgICAgICAgbUVuY1N0YXRlID0gbnVsbHB0cjsKKyAgICAgICAgbVNpZFN0YXRlID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3ZvaWQgQ29kZWM6OmVuY29kZUZyYW1lcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFNUkVuY29kZVJlc2V0KG1FbmNTdGF0ZSwgbVNpZFN0YXRlKTsKKyAgICB1aW50OF90IHN0YXJ0Qnl0ZSA9ICpkYXRhOworICAgIGludCBtb2RlSW5kZXggPSAoKHN0YXJ0Qnl0ZSA+PiAzKSAlIDkpOworICAgIGludCBvdXRwdXRGb3JtYXRJbmRleCA9IChzdGFydEJ5dGUgJSAzKTsKKyAgICBNb2RlIG1vZGUgPSBrTW9kZXNbbW9kZUluZGV4XTsKKyAgICBXb3JkMTYgb3V0cHV0Rm9ybWF0ID0ga091dHB1dEZvcm1hdFtvdXRwdXRGb3JtYXRJbmRleF07CisKKyAgICAvLyBDb25zdW1lIHN0YXJ0Qnl0ZQorICAgIGRhdGErKzsKKyAgICBzaXplLS07CisKKyAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgRnJhbWVfVHlwZV8zR1BQIGZyYW1lVHlwZSA9IChGcmFtZV9UeXBlXzNHUFApbW9kZTsKKworICAgICAgICBXb3JkMTYgaW5wdXRCdWZba051bUlucHV0U2FtcGxlc10gPSB7fTsKKyAgICAgICAgaW50MzJfdCBtaW5TaXplID0gc3RkOjptaW4oc2l6ZSwgc2l6ZW9mKGlucHV0QnVmKSk7CisKKyAgICAgICAgdWludDhfdCBvdXRwdXRCdWZba091dHB1dEJ1ZmZlclNpemVdID0ge307CisgICAgICAgIG1lbWNweShpbnB1dEJ1ZiwgZGF0YSwgbWluU2l6ZSk7CisKKyAgICAgICAgQU1SRW5jb2RlKG1FbmNTdGF0ZSwgbVNpZFN0YXRlLCBtb2RlLCBpbnB1dEJ1Ziwgb3V0cHV0QnVmLCAmZnJhbWVUeXBlLCBvdXRwdXRGb3JtYXQpOworCisgICAgICAgIGRhdGEgKz0gbWluU2l6ZTsKKyAgICAgICAgc2l6ZSAtPSBtaW5TaXplOworICAgIH0KK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplIDwgMSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgQ29kZWMgKmNvZGVjID0gbmV3IENvZGVjKCk7CisgICAgaWYgKCFjb2RlYykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGNvZGVjLT5pbml0RW5jb2RlcihkYXRhKSA9PSAwKSB7CisgICAgICAgIGNvZGVjLT5lbmNvZGVGcmFtZXMoZGF0YSwgc2l6ZSk7CisgICAgfQorICAgIGRlbGV0ZSBjb2RlYzsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2FtcmVuY29kZS5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hbXJlbmNvZGUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hbXJlbmNvZGUuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hbXJlbmNvZGUuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hbXJlbmNvZGUuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2FtcmVuY29kZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hbXJlbmNvZGUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYW1yZW5jb2RlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2F1dG9jb3JyLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2F1dG9jb3JyLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYXV0b2NvcnIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hdXRvY29yci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2F1dG9jb3JyLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hdXRvY29yci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hdXRvY29yci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hdXRvY29yci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMTAzNXBmLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MxMDM1cGYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMTAzNXBmLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzEwMzVwZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MxMDM1cGYuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MxMDM1cGYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzEwMzVwZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMTAzNXBmLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzExcGYuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzJfMTFwZi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzExcGYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMl8xMXBmLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzJfMTFwZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzJfMTFwZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMl8xMXBmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzExcGYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzJfOXBmLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzlwZi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzlwZi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzlwZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzlwZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzJfOXBmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzlwZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMl85cGYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzNfMTRwZi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jM18xNHBmLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzNfMTRwZi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MzXzE0cGYuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jM18xNHBmLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jM18xNHBmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MzXzE0cGYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzNfMTRwZi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jNF8xN3BmLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2M0XzE3cGYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jNF8xN3BmLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzRfMTdwZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2M0XzE3cGYuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2M0XzE3cGYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzRfMTdwZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jNF8xN3BmLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2M4XzMxcGYuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzhfMzFwZi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2M4XzMxcGYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jOF8zMXBmLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzhfMzFwZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzhfMzFwZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jOF8zMXBmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2M4XzMxcGYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2FsY19jb3IuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2FsY19jb3IuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jYWxjX2Nvci5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NhbGNfY29yLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2FsY19jb3IuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NhbGNfY29yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NhbGNfY29yLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NhbGNfY29yLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NhbGNfZW4uY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2FsY19lbi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NhbGNfZW4uY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jYWxjX2VuLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2FsY19lbi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2FsY19lbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jYWxjX2VuLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NhbGNfZW4uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2JzZWFyY2guY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2JzZWFyY2guY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jYnNlYXJjaC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nic2VhcmNoLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2JzZWFyY2guaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nic2VhcmNoLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nic2VhcmNoLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nic2VhcmNoLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NsX2x0cC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jbF9sdHAuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jbF9sdHAuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jbF9sdHAuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jbF9sdHAuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NsX2x0cC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jbF9sdHAuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2xfbHRwLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvZF9hbXIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29kX2Ftci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvZF9hbXIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb2RfYW1yLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29kX2Ftci5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29kX2Ftci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb2RfYW1yLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvZF9hbXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29udm9sdmUuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29udm9sdmUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb252b2x2ZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvbnZvbHZlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29udm9sdmUuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvbnZvbHZlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvbnZvbHZlLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvbnZvbHZlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2guY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3guY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3guaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3guaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3gyLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3gyLmNwcApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94Mi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3gyLmNwcAppbmRleCBiNGZkODY3Li5lMzJlYjRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94Mi5jcHAKKysrIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeDIuY3BwCkBAIC0yNDAsNyArMjQwLDcgQEAKICAgICBXb3JkMTYgajsKICAgICBXb3JkMTYgazsKICAgICBXb3JkMzIgczsKLSAgICBXb3JkMzIgeTMyW0xfQ09ERV07CisgICAgV29yZDMyIHkzMltMX0NPREVde307CiAgICAgV29yZDMyIG1heDsKICAgICBXb3JkMzIgdG90OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94Mi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeDIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeDIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeDIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29ycndnaHRfdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvcnJ3Z2h0X3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvcnJ3Z2h0X3RhYi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvcnJ3Z2h0X3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2R0eF9lbmMuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZHR4X2VuYy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2R0eF9lbmMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9kdHhfZW5jLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZHR4X2VuYy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZHR4X2VuYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9kdHhfZW5jLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2R0eF9lbmMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZW5jX2xhZzMuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZW5jX2xhZzMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9lbmNfbGFnMy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2VuY19sYWczLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZW5jX2xhZzMuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2VuY19sYWczLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2VuY19sYWczLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2VuY19sYWczLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2VuY19sYWc2LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2VuY19sYWc2LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZW5jX2xhZzYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9lbmNfbGFnNi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2VuY19sYWc2LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9lbmNfbGFnNi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9lbmNfbGFnNi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9lbmNfbGFnNi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9lbmNfb3V0cHV0X2Zvcm1hdF90YWIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZW5jX291dHB1dF9mb3JtYXRfdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZW5jX291dHB1dF9mb3JtYXRfdGFiLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZW5jX291dHB1dF9mb3JtYXRfdGFiLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZXRzX3RvX2lmMi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ldHNfdG9faWYyLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZXRzX3RvX2lmMi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2V0c190b19pZjIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ldHNfdG9faWYyLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ldHNfdG9faWYyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2V0c190b19pZjIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZXRzX3RvX2lmMi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ldHNfdG9fd21mLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2V0c190b193bWYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ldHNfdG9fd21mLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZXRzX3RvX3dtZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2V0c190b193bWYuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2V0c190b193bWYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZXRzX3RvX3dtZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ldHNfdG9fd21mLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfYWRhcHQuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19hZGFwdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfYWRhcHQuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nX2FkYXB0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19hZGFwdC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19hZGFwdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nX2FkYXB0LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfYWRhcHQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19jb2RlLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfY29kZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfY29kZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfY29kZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfY29kZS5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19jb2RlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfY29kZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nX2NvZGUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19waXRjaC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nX3BpdGNoLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19waXRjaC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfcGl0Y2guY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nX3BpdGNoLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nX3BpdGNoLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfcGl0Y2guaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19waXRjaC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nYWluX3EuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ2Fpbl9xLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ2Fpbl9xLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ2Fpbl9xLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ2Fpbl9xLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nYWluX3EuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ2Fpbl9xLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dhaW5fcS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nc21hbXJfZW5jLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nc21hbXJfZW5jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dzbWFtcl9lbmMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ3NtYW1yX2VuYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ocF9tYXguY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaHBfbWF4LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaHBfbWF4LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaHBfbWF4LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaHBfbWF4LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ocF9tYXguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaHBfbWF4LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2hwX21heC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9pbnRlcl8zNi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9pbnRlcl8zNi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2ludGVyXzM2LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaW50ZXJfMzYuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9pbnRlcl8zNi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaW50ZXJfMzYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaW50ZXJfMzYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaW50ZXJfMzYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaW50ZXJfMzZfdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2ludGVyXzM2X3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2ludGVyXzM2X3RhYi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2ludGVyXzM2X3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2ludGVyXzM2X3RhYi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaW50ZXJfMzZfdGFiLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2ludGVyXzM2X3RhYi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9pbnRlcl8zNl90YWIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbF9jb21wLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xfY29tcC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xfY29tcC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xfY29tcC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xfZXh0cmFjdC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sX2V4dHJhY3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sX2V4dHJhY3QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sX2V4dHJhY3QuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sX25lZ2F0ZS5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sX25lZ2F0ZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xfbmVnYXRlLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbF9uZWdhdGUuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sYWdfd2luZC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sYWdfd2luZC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xhZ193aW5kLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGFnX3dpbmQuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sYWdfd2luZC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGFnX3dpbmQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGFnX3dpbmQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGFnX3dpbmQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGFnX3dpbmRfdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xhZ193aW5kX3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xhZ193aW5kX3RhYi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xhZ193aW5kX3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xhZ193aW5kX3RhYi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGFnX3dpbmRfdGFiLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xhZ193aW5kX3RhYi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sYWdfd2luZF90YWIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGV2aW5zb24uY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGV2aW5zb24uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sZXZpbnNvbi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xldmluc29uLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGV2aW5zb24uaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xldmluc29uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xldmluc29uLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xldmluc29uLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xwYy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9scGMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9scGMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9scGMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9scGMuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xwYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9scGMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbHBjLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL29sX2x0cC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9vbF9sdHAuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9vbF9sdHAuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9vbF9sdHAuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9vbF9sdHAuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL29sX2x0cC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9vbF9sdHAuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvb2xfbHRwLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Bfb2xfd2doLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Bfb2xfd2doLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcF9vbF93Z2guY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wX29sX3dnaC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BpdGNoX2ZyLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BpdGNoX2ZyLmNwcApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9mci5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BpdGNoX2ZyLmNwcAppbmRleCA1ODRmNzliLi41YTg0NmZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9mci5jcHAKKysrIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcGl0Y2hfZnIuY3BwCkBAIC01NzAsMTQgKzU3MCwxMiBAQAogICAgIFdvcmQxNiBjb3JyW10sICAgICAvKiBpICAgOiBub3JtYWxpemVkIGNvcnJlbGF0aW9uICAqLwogICAgIFdvcmQxNiBmbGFnMywgICAgICAvKiBpICAgOiBzdWJzYW1wbGUgcmVzb2x1dGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzogPTEgLyA2OiA9MCkgICAgICAgICAqLwotICAgIEZsYWcgICAqcE92ZXJmbG93LAotICAgIGVudW0gTW9kZSBtb2RlCisgICAgRmxhZyAgICpwT3ZlcmZsb3cKICkKIHsKICAgICBXb3JkMTYgaTsKICAgICBXb3JkMTYgbWF4OwogICAgIFdvcmQxNiBjb3JyX2ludDsKLSAgICBXb3JkMTYgbWluUGl0Y2g7CiAKICAgICAvKiBUZXN0IHRoZSBmcmFjdGlvbnMgYXJvdW5kIFQwIGFuZCBjaG9vc2UgdGhlIG9uZSB3aGljaCBtYXhpbWl6ZXMgICAqLwogICAgIC8qIHRoZSBpbnRlcnBvbGF0ZWQgbm9ybWFsaXplZCBjb3JyZWxhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01OTUsMjIgKzU5MywxNCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgbWluUGl0Y2ggPSAobW9kZSA9PSBNUjEyMikgPyBQSVRfTUlOX01SMTIyIDogUElUX01JTjsKICAgICBpZiAoZmxhZzMgPT0gMCkKICAgICB7CiAgICAgICAgIC8qIExpbWl0IHRoZSBmcmFjdGlvbiB2YWx1ZSBpbiB0aGUgaW50ZXJ2YWwgWy0yLC0xLDAsMSwyLDNdICovCiAKICAgICAgICAgaWYgKCpmcmFjID09IC0zKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKmxhZyA+IG1pblBpdGNoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpmcmFjID0gMzsKLSAgICAgICAgICAgICAgICAoKmxhZyktLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqZnJhYyA9IC0yOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgKmZyYWMgPSAzOworICAgICAgICAgICAgKCpsYWcpLS07CiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZQpAQCAtNjE5LDI3ICs2MDksMTMgQEAKIAogICAgICAgICBpZiAoKmZyYWMgPT0gLTIpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICgqbGFnID4gbWluUGl0Y2gpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKmZyYWMgPSAxOwotICAgICAgICAgICAgICAgICgqbGFnKS0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpmcmFjID0gLTE7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAqZnJhYyA9IDE7CisgICAgICAgICAgICAoKmxhZyktLTsKICAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgqZnJhYyA9PSAyKQorICAgICAgICBpZiAoKmZyYWMgPT0gMikKICAgICAgICAgewotICAgICAgICAgICAgaWYgKCpsYWcgPCBQSVRfTUFYKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpmcmFjID0gLTE7Ci0gICAgICAgICAgICAgICAgKCpsYWcpKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKmZyYWMgPSAxOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgKmZyYWMgPSAtMTsKKyAgICAgICAgICAgICgqbGFnKSsrOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTU1NywyMCArMTUzMywyMCBAQAogCiAgICAgICAgICAgICAgICAgLyogbm9ybWFsIHNlYXJjaCBpbiBmcmFjdGlvbnMgYXJvdW5kIFQwICovCiAKLSAgICAgICAgICAgICAgICBzZWFyY2hGcmFjKCZsYWcsICZmcmFjLCBsYXN0X2ZyYWMsIGNvcnIsIGZsYWczLCBwT3ZlcmZsb3csIG1vZGUpOworICAgICAgICAgICAgICAgIHNlYXJjaEZyYWMoJmxhZywgJmZyYWMsIGxhc3RfZnJhYywgY29yciwgZmxhZzMsIHBPdmVyZmxvdyk7CiAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgaWYgKGxhZyA9PSAodG1wX2xhZyAtIDIpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qIGxpbWl0IHNlYXJjaCBhcm91bmQgVDAgdG8gdGhlIHJpZ2h0IHNpZGUgKi8KICAgICAgICAgICAgICAgICBmcmFjID0gMDsKLSAgICAgICAgICAgICAgICBzZWFyY2hGcmFjKCZsYWcsICZmcmFjLCBsYXN0X2ZyYWMsIGNvcnIsIGZsYWczLCBwT3ZlcmZsb3csIG1vZGUpOworICAgICAgICAgICAgICAgIHNlYXJjaEZyYWMoJmxhZywgJmZyYWMsIGxhc3RfZnJhYywgY29yciwgZmxhZzMsIHBPdmVyZmxvdyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIGlmIChsYWcgPT0gKHRtcF9sYWcgKyAxKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvKiBsaW1pdCBzZWFyY2ggYXJvdW5kIFQwIHRvIHRoZSBsZWZ0IHNpZGUgKi8KICAgICAgICAgICAgICAgICBsYXN0X2ZyYWMgPSAwOwotICAgICAgICAgICAgICAgIHNlYXJjaEZyYWMoJmxhZywgJmZyYWMsIGxhc3RfZnJhYywgY29yciwgZmxhZzMsIHBPdmVyZmxvdywgbW9kZSk7CisgICAgICAgICAgICAgICAgc2VhcmNoRnJhYygmbGFnLCAmZnJhYywgbGFzdF9mcmFjLCBjb3JyLCBmbGFnMywgcE92ZXJmbG93KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKQEAgLTE1ODAsNyArMTU1Niw3IEBACiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICAgICAgLyogdGVzdCB0aGUgZnJhY3Rpb25zIGFyb3VuZCBUMCAqLwotICAgICAgICAgICAgc2VhcmNoRnJhYygmbGFnLCAmZnJhYywgbGFzdF9mcmFjLCBjb3JyLCBmbGFnMywgcE92ZXJmbG93LCBtb2RlKTsKKyAgICAgICAgICAgIHNlYXJjaEZyYWMoJmxhZywgJmZyYWMsIGxhc3RfZnJhYywgY29yciwgZmxhZzMsIHBPdmVyZmxvdyk7CiAgICAgfQogCiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BpdGNoX2ZyLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9mci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9mci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9mci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9vbC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9vbC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BpdGNoX29sLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcGl0Y2hfb2wuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9vbC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcGl0Y2hfb2wuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcGl0Y2hfb2wuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcGl0Y2hfb2wuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJlX2JpZy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfYmlnLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJlX2JpZy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3ByZV9iaWcuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfYmlnLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfYmlnLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3ByZV9iaWcuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJlX2JpZy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfcHJvYy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfcHJvYy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3ByZV9wcm9jLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJlX3Byb2MuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfcHJvYy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJlX3Byb2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJlX3Byb2MuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJlX3Byb2MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJtMmJpdHMuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJtMmJpdHMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcm0yYml0cy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BybTJiaXRzLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJtMmJpdHMuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BybTJiaXRzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BybTJiaXRzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BybTJiaXRzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FfZ2Fpbl9jLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FfZ2Fpbl9jLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcV9nYWluX2MuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xX2dhaW5fYy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FfZ2Fpbl9jLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xX2dhaW5fYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xX2dhaW5fYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xX2dhaW5fYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xX2dhaW5fcC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xX2dhaW5fcC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FfZ2Fpbl9wLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcV9nYWluX3AuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xX2dhaW5fcC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcV9nYWluX3AuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcV9nYWluX3AuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcV9nYWluX3AuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW40NzUuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW40NzUuY3BwCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FnYWluNDc1LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW40NzUuY3BwCmluZGV4IGY4ZGE1ODkuLjA4YTVjMTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FnYWluNDc1LmNwcAorKysgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xZ2FpbjQ3NS5jcHAKQEAgLTExMDYsNyArMTEwNiw3IEBACiAgICAgLy8gdGhlIHJlYWwsIHF1YW50aXplZCBnYWlucykKICAgICBnY19wcmVkKHByZWRfc3QsIE1SNDc1LCBzZjFfY29kZV9ub3NoYXJwLAogICAgICAgICAgICAgJnNmMV9leHBfZ2NvZGUwLCAmc2YxX2ZyYWNfZ2NvZGUwLAotICAgICAgICAgICAgJnNmMF9leHBfZ2NvZGUwLCAmc2YwX2djb2RlMCk7IC8vIGxhc3QgdHdvIGFyZ3MgYXJlIGR1bW15CisgICAgICAgICAgICAmc2YwX2V4cF9nY29kZTAsICZzZjBfZ2NvZGUwKTsgLy8gbGFzdCB0d28gYXJncyBhcmUgdW51c2VkCiAgICAgc2YxX2djb2RlMCA9IGV4dHJhY3RfbChQb3cyKDE0LCBzZjFfZnJhY19nY29kZTApKTsKIAogICAgIHRtcCA9IGFkZCAodG1wLCAyKTsKQEAgLTE0MjYsNyArMTQyNiw3IEBACiAgICAgICAgdGhlIHJlYWwsIHF1YW50aXplZCBnYWlucykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgZ2NfcHJlZChwcmVkX3N0LCBNUjQ3NSwgc2YxX2NvZGVfbm9zaGFycCwKICAgICAgICAgICAgICZzZjFfZXhwX2djb2RlMCwgJnNmMV9mcmFjX2djb2RlMCwKLSAgICAgICAgICAgICZzZjBfZXhwX2djb2RlMCwgJnNmMF9nY29kZTAsIC8qIGR1bW15IGFyZ3MgKi8KKyAgICAgICAgICAgICZzZjBfZXhwX2djb2RlMCwgJnNmMF9nY29kZTAsIC8qIHVudXNlZCBhcmdzICovCiAgICAgICAgICAgICBwT3ZlcmZsb3cpOwogCiAgICAgc2YxX2djb2RlMCA9IChXb3JkMTYpKFBvdzIoMTQsIHNmMV9mcmFjX2djb2RlMCwgcE92ZXJmbG93KSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xZ2FpbjQ3NS5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW40NzUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW40NzUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW40NzUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW43OTUuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW43OTUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xZ2Fpbjc5NS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FnYWluNzk1LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW43OTUuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FnYWluNzk1LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FnYWluNzk1LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FnYWluNzk1LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3F1YV9nYWluLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3F1YV9nYWluLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcXVhX2dhaW4uY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xdWFfZ2Fpbi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3MxMF84cGYuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvczEwXzhwZi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3MxMF84cGYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zMTBfOHBmLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvczEwXzhwZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvczEwXzhwZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zMTBfOHBmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3MxMF84cGYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc2V0X3NpZ24uY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc2V0X3NpZ24uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zZXRfc2lnbi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NldF9zaWduLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc2V0X3NpZ24uaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NldF9zaWduLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NldF9zaWduLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NldF9zaWduLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NpZF9zeW5jLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NpZF9zeW5jLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc2lkX3N5bmMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zaWRfc3luYy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NpZF9zeW5jLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zaWRfc3luYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zaWRfc3luYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zaWRfc3luYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zcF9lbmMuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3BfZW5jLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3BfZW5jLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3BfZW5jLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3BfZW5jLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zcF9lbmMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3BfZW5jLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NwX2VuYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zcHJlcHJvYy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zcHJlcHJvYy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NwcmVwcm9jLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3ByZXByb2MuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zcHJlcHJvYy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3ByZXByb2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3ByZXByb2MuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3ByZXByb2MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3BzdHByb2MuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3BzdHByb2MuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zcHN0cHJvYy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Nwc3Rwcm9jLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3BzdHByb2MuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Nwc3Rwcm9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Nwc3Rwcm9jLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Nwc3Rwcm9jLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Rvbl9zdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Rvbl9zdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvdG9uX3N0YWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy90b25fc3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Rvbl9zdGFiLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy90b25fc3RhYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy90b25fc3RhYi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy90b25fc3RhYi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW1ybmJFbmNUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbXJuYkVuY1Rlc3RFbnZpcm9ubWVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW1ybmJFbmNUZXN0RW52aXJvbm1lbnQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L0Ftcm5iRW5jVGVzdEVudmlyb25tZW50LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbXJuYkVuY29kZXJUZXN0LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbXJuYkVuY29kZXJUZXN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L0Ftcm5iRW5jb2RlclRlc3QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW1ybmJFbmNvZGVyVGVzdC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L0FuZHJvaWQuYnAKc2ltaWxhcml0eSBpbmRleCA3MCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L0FuZHJvaWQuYnAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbmRyb2lkLmJwCmluZGV4IGU4OTgyZmUuLjdlMzkzZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbmRyb2lkLmJwCkBAIC0xNCw5ICsxNCwyMiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX2Ftcm5iX2VuY19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUJTRAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfYW1ybmJfZW5jX2xpY2Vuc2UiLAorICAgIF0sCit9CisKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJBbXJuYkVuY29kZXJUZXN0IiwKICAgICBndGVzdDogdHJ1ZSwKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkFtcm5iRW5jb2RlclRlc3QuY3BwIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW5kcm9pZFRlc3QueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW5kcm9pZFRlc3QueG1sCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW5kcm9pZFRlc3QueG1sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvUkVBRE1FLm1kIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L1JFQURNRS5tZApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L2Ftcm5iX2VuY190ZXN0LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9hbXJuYl9lbmNfdGVzdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9hbXJuYl9lbmNfdGVzdC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9hbXJuYl9lbmNfdGVzdC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9mdXp6ZXIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9hbXJuYi9mdXp6ZXIvQW5kcm9pZC5icApzaW1pbGFyaXR5IGluZGV4IDcxJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZnV6emVyL0FuZHJvaWQuYnAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9mdXp6ZXIvQW5kcm9pZC5icAppbmRleCA1NGRlMWNjLi44MzNhN2JhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZnV6emVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2Z1enplci9BbmRyb2lkLmJwCkBAIC0xOCw2ICsxOCwxNSBAQAogICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKICAqLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2Z1enogewogICAgIG5hbWU6ICJhbXJuYl9kZWNfZnV6emVyIiwKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKQEAgLTM0LDQgKzQzLDEwIEBACiAgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKICAgICAgICAgfSwKICAgICB9LAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9mdXp6ZXIvUkVBRE1FLm1kIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2Z1enplci9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9mdXp6ZXIvUkVBRE1FLm1kCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZnV6emVyL1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9hbXJuYl9kZWNfZnV6emVyLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9mdXp6ZXIvYW1ybmJfZGVjX2Z1enplci5jcHAKc2ltaWxhcml0eSBpbmRleCA4OSUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9hbXJuYl9kZWNfZnV6emVyLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2Z1enplci9hbXJuYl9kZWNfZnV6emVyLmNwcAppbmRleCBkNGU3ZTVjLi5jN2E3Mzc4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZnV6emVyL2Ftcm5iX2RlY19mdXp6ZXIuY3BwCisrKyBiL21lZGlhL2NvZGVjcy9hbXJuYi9mdXp6ZXIvYW1ybmJfZGVjX2Z1enplci5jcHAKQEAgLTI2LDggKzI2LDEwIEBACiBjb25zdGV4cHIgaW50MzJfdCBrQml0c1BlclNhbXBsZSA9IDE2OwogY29uc3RleHByIGludDMyX3Qga091dHB1dEJ1ZmZlclNpemUgPSBrU2FtcGxlc1BlckZyYW1lICoga0JpdHNQZXJTYW1wbGUgLyA4OwogY29uc3QgYml0c3RyZWFtX2Zvcm1hdCBrQml0U3RyZWFtRm9ybWF0c1syXSA9IHtNSU1FX0lFVEYsIElGMn07Ci1jb25zdCBpbnQzMl90IGtMb2NhbFdtZkRlY0J5dGVzUGVyRnJhbWVbOF0gPSB7MTIsIDEzLCAxNSwgMTcsIDE5LCAyMCwgMjYsIDMxfTsKLWNvbnN0IGludDMyX3Qga0xvY2FsSWYyRGVjQnl0ZXNQZXJGcmFtZVs4XSA9IHsxMywgMTQsIDE2LCAxOCwgMTksIDIxLCAyNiwgMzF9OworY29uc3QgaW50MzJfdCBrTG9jYWxXbWZEZWNCeXRlc1BlckZyYW1lWzE2XSA9IHsxMiwgMTMsIDE1LCAxNywgMTksIDIwLCAyNiwgMzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsICA2LCAgNSwgIDUsICAwLCAgMCwgIDAsICAwfTsKK2NvbnN0IGludDMyX3Qga0xvY2FsSWYyRGVjQnl0ZXNQZXJGcmFtZVsxNl0gPSB7MTMsIDE0LCAxNiwgMTgsIDE5LCAyMSwgMjYsIDMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMywgMTQsIDE2LCAxOCwgMTksIDIxLCAyNiwgMzF9OwogCiBjbGFzcyBDb2RlYyB7CiAgcHVibGljOgpAQCAtNTIsNyArNTQsNyBAQAogICAgIGJpdHN0cmVhbV9mb3JtYXQgYml0c3JlYW1Gb3JtYXQgPSBrQml0U3RyZWFtRm9ybWF0c1tiaXRdOwogICAgIGludDMyX3QgZnJhbWVTaXplID0gMDsKICAgICAvKiBGaW5kIGZyYW1lIHR5cGUgKi8KLSAgICBGcmFtZV9UeXBlXzNHUFAgZnJhbWVUeXBlID0gc3RhdGljX2Nhc3Q8RnJhbWVfVHlwZV8zR1BQPigobW9kZSA+PiAzKSAmIDB4MDcpOworICAgIEZyYW1lX1R5cGVfM0dQUCBmcmFtZVR5cGUgPSBzdGF0aWNfY2FzdDxGcmFtZV9UeXBlXzNHUFA+KChtb2RlID4+IDMpICYgMHgwZik7CiAgICAgKytkYXRhOwogICAgIC0tc2l6ZTsKICAgICBpZiAoYml0KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvcGF0ZW50X2Rpc2NsYWltZXIudHh0IGIvbWVkaWEvY29kZWNzL2Ftcm5iL3BhdGVudF9kaXNjbGFpbWVyLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL3BhdGVudF9kaXNjbGFpbWVyLnR4dApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL3BhdGVudF9kaXNjbGFpbWVyLnR4dApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL0FuZHJvaWQuYnAKc2ltaWxhcml0eSBpbmRleCA2NyUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQuYnAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvQW5kcm9pZC5icAppbmRleCAyMDRjYmUzLi4yMjhlYTgwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwzNSBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjc19hbXJ3Yl9kZWNfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZSB0aGF0IHRvb2sgdGhlIGFwcHJvYWNoIG9mCisvLyAnYXBwbHkgZXZlcnkgbGljZW5zZSBmb3VuZCB0byBldmVyeSB0YXJnZXQnLiBXaGlsZSB0aGlzIG1ha2VzIHN1cmUgd2UgcmVzcGVjdAorLy8gZXZlcnkgbGljZW5zZSByZXN0cmljdGlvbiwgaXQgbWF5IG5vdCBiZSBlbnRpcmVseSBjb3JyZWN0LgorLy8KKy8vIGUuZy4gR1BMIGluIGFuIE1JVCBwcm9qZWN0IG1pZ2h0IG9ubHkgYXBwbHkgdG8gdGhlIGNvbnRyaWIvIGRpcmVjdG9yeS4KKy8vCisvLyBQbGVhc2UgY29uc2lkZXIgc3BsaXR0aW5nIHRoZSBzaW5nbGUgbGljZW5zZSBiZWxvdyBpbnRvIG11bHRpcGxlIGxpY2Vuc2VzLAorLy8gdGFraW5nIGNhcmUgbm90IHRvIGxvc2UgYW55IGxpY2Vuc2Vfa2luZCBpbmZvcm1hdGlvbiwgYW5kIG92ZXJyaWRpbmcgdGhlCisvLyBkZWZhdWx0IGxpY2Vuc2UgdXNpbmcgdGhlICdsaWNlbnNlczogWy4uLl0nIHByb3BlcnR5IG9uIHRhcmdldHMgYXMgbmVlZGVkLgorLy8KKy8vIEZvciB1bnVzZWQgZmlsZXMsIGNvbnNpZGVyIGNyZWF0aW5nIGEgJ2ZpbGVHcm91cCcgd2l0aCAiLy92aXNpYmlsaXR5OnByaXZhdGUiCisvLyB0byBhdHRhY2ggdGhlIGxpY2Vuc2UgdG8sIGFuZCBpbmNsdWRpbmcgYSBjb21tZW50IHdoZXRoZXIgdGhlIGZpbGVzIG1heSBiZQorLy8gdXNlZCBpbiB0aGUgY3VycmVudCBwcm9qZWN0LgorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX2FtcndiX2RlY19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUJTRCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9OT1RJQ0UgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvTk9USUNFCmNvcHkgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9OT1RJQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvVEVTVF9NQVBQSU5HIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3OGQyNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsMTAgQEAKKy8vIG1hcHBpbmdzIGZvciBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YgoreworICAvLyB0ZXN0cyB3aGljaCByZXF1aXJlIGR5bmFtaWMgY29udGVudAorICAvLyBpbnZva2Ugd2l0aDogYXRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorICAvLyBUT0RPKGIvMTQ4MDk0MDU5KTogdW5pdCB0ZXN0cyBub3QgYWxsb3dlZCB0byBkb3dubG9hZCBjb250ZW50CisgICJkeW5hbWljLXByZXN1Ym1pdCI6IFsKKyAgICB7ICJuYW1lIjogIkFtcndiRGVjb2RlclRlc3QifQorCisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9mdXp6ZXIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvZnV6emVyL0FuZHJvaWQuYnAKc2ltaWxhcml0eSBpbmRleCA2NyUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL2Z1enplci9BbmRyb2lkLmJwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL2Z1enplci9BbmRyb2lkLmJwCmluZGV4IDQ2Zjc3ZTMuLjE2ZjA4ZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9mdXp6ZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL2Z1enplci9BbmRyb2lkLmJwCkBAIC0xOCw2ICsxOCwxNyBAQAogICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKICAqLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfYW1yd2JfZGVjX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfYW1yd2JfZGVjX2xpY2Vuc2UiLAorICAgIF0sCit9CisKIGNjX2Z1enogewogICAgIG5hbWU6ICJhbXJ3Yl9kZWNfZnV6emVyIiwKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKQEAgLTMyLDQgKzQzLDEwIEBACiAgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKICAgICAgICAgfSwKICAgICB9LAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9mdXp6ZXIvUkVBRE1FLm1kIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9mdXp6ZXIvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvZnV6emVyL1JFQURNRS5tZApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9mdXp6ZXIvUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvZnV6emVyL2FtcndiX2RlY19mdXp6ZXIuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9mdXp6ZXIvYW1yd2JfZGVjX2Z1enplci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9mdXp6ZXIvYW1yd2JfZGVjX2Z1enplci5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvZnV6emVyL2FtcndiX2RlY19mdXp6ZXIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvaW5jbHVkZS9wdmFtcndiZGVjb2Rlcl9hcGkuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvaW5jbHVkZS9wdmFtcndiZGVjb2Rlcl9hcGkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL2luY2x1ZGUvcHZhbXJ3YmRlY29kZXJfYXBpLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvaW5jbHVkZS9wdmFtcndiZGVjb2Rlcl9hcGkuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3BhdGVudF9kaXNjbGFpbWVyLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CmNvcHkgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvYWdjMl9hbXJfd2IuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvYWdjMl9hbXJfd2IuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2FnYzJfYW1yX3diLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvYWdjMl9hbXJfd2IuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2JhbmRfcGFzc182a183ay5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9iYW5kX3Bhc3NfNmtfN2suY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2JhbmRfcGFzc182a183ay5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2JhbmRfcGFzc182a183ay5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvZGVjX2FjZWxwXzJwX2luXzY0LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2RlY19hY2VscF8ycF9pbl82NC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvZGVjX2FjZWxwXzJwX2luXzY0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvZGVjX2FjZWxwXzJwX2luXzY0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9kZWNfYWNlbHBfNHBfaW5fNjQuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvZGVjX2FjZWxwXzRwX2luXzY0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9kZWNfYWNlbHBfNHBfaW5fNjQuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9kZWNfYWNlbHBfNHBfaW5fNjQuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2RlY19hbGdfY29kZWJvb2suY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvZGVjX2FsZ19jb2RlYm9vay5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvZGVjX2FsZ19jb2RlYm9vay5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2RlY19hbGdfY29kZWJvb2suY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2RlY19nYWluMl9hbXJfd2IuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvZGVjX2dhaW4yX2Ftcl93Yi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvZGVjX2dhaW4yX2Ftcl93Yi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2RlY19nYWluMl9hbXJfd2IuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2RlZW1waGFzaXNfMzIuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvZGVlbXBoYXNpc18zMi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvZGVlbXBoYXNpc18zMi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2RlZW1waGFzaXNfMzIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2R0eC5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvZHR4LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvZHR4LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2R0eC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2R0eF9kZWNvZGVyX2Ftcl93Yi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9kdHhfZGVjb2Rlcl9hbXJfd2IuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2R0eF9kZWNvZGVyX2Ftcl93Yi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2R0eF9kZWNvZGVyX2Ftcl93Yi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvZV9wdl9hbXJ3YmRlYy5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvZV9wdl9hbXJ3YmRlYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2VfcHZfYW1yd2JkZWMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvZV9wdl9hbXJ3YmRlYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2dldF9hbXJfd2JfYml0cy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9nZXRfYW1yX3diX2JpdHMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2dldF9hbXJfd2JfYml0cy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2dldF9hbXJfd2JfYml0cy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvZ2V0X2Ftcl93Yl9iaXRzLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9nZXRfYW1yX3diX2JpdHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9nZXRfYW1yX3diX2JpdHMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvZ2V0X2Ftcl93Yl9iaXRzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvaGlnaHBhc3NfNDAwaHpfYXRfMTJrOC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9oaWdocGFzc180MDBoel9hdF8xMms4LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9oaWdocGFzc180MDBoel9hdF8xMms4LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvaGlnaHBhc3NfNDAwaHpfYXRfMTJrOC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvaGlnaHBhc3NfNTBoel9hdF8xMms4LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2hpZ2hwYXNzXzUwaHpfYXRfMTJrOC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvaGlnaHBhc3NfNTBoel9hdF8xMms4LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvaGlnaHBhc3NfNTBoel9hdF8xMms4LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9ob21pbmdfYW1yX3diX2RlYy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9ob21pbmdfYW1yX3diX2RlYy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvaG9taW5nX2Ftcl93Yl9kZWMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9ob21pbmdfYW1yX3diX2RlYy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvaW50ZXJwb2xhdGVfaXNwLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2ludGVycG9sYXRlX2lzcC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvaW50ZXJwb2xhdGVfaXNwLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvaW50ZXJwb2xhdGVfaXNwLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9pc2ZfZXh0cmFwb2xhdGlvbi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9pc2ZfZXh0cmFwb2xhdGlvbi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvaXNmX2V4dHJhcG9sYXRpb24uY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9pc2ZfZXh0cmFwb2xhdGlvbi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvaXNwX2F6LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2lzcF9hei5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvaXNwX2F6LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvaXNwX2F6LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9pc3BfaXNmLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2lzcF9pc2YuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2lzcF9pc2YuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9pc3BfaXNmLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9sYWdjb25jZWFsLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2xhZ2NvbmNlYWwuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2xhZ2NvbmNlYWwuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9sYWdjb25jZWFsLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9sb3dfcGFzc19maWx0XzdrLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2xvd19wYXNzX2ZpbHRfN2suY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2xvd19wYXNzX2ZpbHRfN2suY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9sb3dfcGFzc19maWx0XzdrLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9tZWRpYW41LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL21lZGlhbjUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL21lZGlhbjUuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9tZWRpYW41LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9taW1lX2lvLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL21pbWVfaW8uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL21pbWVfaW8uY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9taW1lX2lvLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9taW1lX2lvLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9taW1lX2lvLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbWltZV9pby5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9taW1lX2lvLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbm9pc2VfZ2VuX2FtcndiLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL25vaXNlX2dlbl9hbXJ3Yi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbm9pc2VfZ2VuX2FtcndiLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvbm9pc2VfZ2VuX2FtcndiLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9ub3JtYWxpemVfYW1yX3diLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL25vcm1hbGl6ZV9hbXJfd2IuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL25vcm1hbGl6ZV9hbXJfd2IuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9ub3JtYWxpemVfYW1yX3diLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9ub3JtYWxpemVfYW1yX3diLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9ub3JtYWxpemVfYW1yX3diLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbm9ybWFsaXplX2Ftcl93Yi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9ub3JtYWxpemVfYW1yX3diLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvb3ZlcnNhbXBfMTJrOF90b18xNmsuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvb3ZlcnNhbXBfMTJrOF90b18xNmsuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL292ZXJzYW1wXzEyazhfdG9fMTZrLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvb3ZlcnNhbXBfMTJrOF90b18xNmsuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3BoYXNlX2Rpc3BlcnNpb24uY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcGhhc2VfZGlzcGVyc2lvbi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcGhhc2VfZGlzcGVyc2lvbi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3BoYXNlX2Rpc3BlcnNpb24uY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3BpdF9zaHJwLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3BpdF9zaHJwLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9waXRfc2hycC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3BpdF9zaHJwLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wcmVkX2x0NC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wcmVkX2x0NC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHJlZF9sdDQuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wcmVkX2x0NC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHJlZW1waF9hbXJ3Yl9kZWMuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHJlZW1waF9hbXJ3Yl9kZWMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3ByZWVtcGhfYW1yd2JfZGVjLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHJlZW1waF9hbXJ3Yl9kZWMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2X2Ftcl93Yl90eXBlX2RlZnMuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2X2Ftcl93Yl90eXBlX2RlZnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdl9hbXJfd2JfdHlwZV9kZWZzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2X2Ftcl93Yl90eXBlX2RlZnMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiX21hdGhfb3AuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHZhbXJ3Yl9tYXRoX29wLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiX21hdGhfb3AuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdmFtcndiX21hdGhfb3AuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JfbWF0aF9vcC5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHZhbXJ3Yl9tYXRoX29wLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3Yl9tYXRoX29wLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JfbWF0aF9vcC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JkZWNvZGVyLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlci5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JkZWNvZGVyLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlci5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHZhbXJ3YmRlY29kZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdmFtcndiZGVjb2Rlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyX2FjZWxwLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdmFtcndiZGVjb2Rlcl9hY2VscC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyX2FjZWxwLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JkZWNvZGVyX2FjZWxwLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXJfYmFzaWNfb3AuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JkZWNvZGVyX2Jhc2ljX29wLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXJfYmFzaWNfb3AuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHZhbXJ3YmRlY29kZXJfYmFzaWNfb3AuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlcl9iYXNpY19vcF9hcm12NS5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHZhbXJ3YmRlY29kZXJfYmFzaWNfb3BfYXJtdjUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlcl9iYXNpY19vcF9hcm12NS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdmFtcndiZGVjb2Rlcl9iYXNpY19vcF9hcm12NS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyX2Jhc2ljX29wX2NlcXVpdmFsZW50LmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdmFtcndiZGVjb2Rlcl9iYXNpY19vcF9jZXF1aXZhbGVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyX2Jhc2ljX29wX2NlcXVpdmFsZW50LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JkZWNvZGVyX2Jhc2ljX29wX2NlcXVpdmFsZW50LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXJfYmFzaWNfb3BfZ2NjX2FybXY1LmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdmFtcndiZGVjb2Rlcl9iYXNpY19vcF9nY2NfYXJtdjUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlcl9iYXNpY19vcF9nY2NfYXJtdjUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHZhbXJ3YmRlY29kZXJfYmFzaWNfb3BfZ2NjX2FybXY1LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXJfY25zdC5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHZhbXJ3YmRlY29kZXJfY25zdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyX2Nuc3QuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHZhbXJ3YmRlY29kZXJfY25zdC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyX21lbV9mdW5jcy5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHZhbXJ3YmRlY29kZXJfbWVtX2Z1bmNzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXJfbWVtX2Z1bmNzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JkZWNvZGVyX21lbV9mdW5jcy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3FfZ2FpbjJfdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3FfZ2FpbjJfdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9xX2dhaW4yX3RhYi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3FfZ2FpbjJfdGFiLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9xX3B1bHNlLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9xX3B1bHNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcV9wdWxzZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9xX3B1bHNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcWlzZl9ucy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9xaXNmX25zLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9xaXNmX25zLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcWlzZl9ucy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcWlzZl9ucy5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcWlzZl9ucy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3Fpc2ZfbnMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcWlzZl9ucy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3Fpc2ZfbnNfdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3Fpc2ZfbnNfdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9xaXNmX25zX3RhYi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3Fpc2ZfbnNfdGFiLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9xcGlzZl8ycy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9xcGlzZl8ycy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcXBpc2ZfMnMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9xcGlzZl8ycy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcXBpc2ZfMnMuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3FwaXNmXzJzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcXBpc2ZfMnMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcXBpc2ZfMnMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9xcGlzZl8yc190YWIuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcXBpc2ZfMnNfdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9xcGlzZl8yc190YWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9xcGlzZl8yc190YWIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3NjYWxlX3NpZ25hbC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9zY2FsZV9zaWduYWwuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3NjYWxlX3NpZ25hbC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3NjYWxlX3NpZ25hbC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvc3ludGhlc2lzX2Ftcl93Yi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9zeW50aGVzaXNfYW1yX3diLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9zeW50aGVzaXNfYW1yX3diLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvc3ludGhlc2lzX2Ftcl93Yi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvc3ludGhlc2lzX2Ftcl93Yi5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvc3ludGhlc2lzX2Ftcl93Yi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3N5bnRoZXNpc19hbXJfd2IuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvc3ludGhlc2lzX2Ftcl93Yi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3ZvaWNlX2ZhY3Rvci5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy92b2ljZV9mYWN0b3IuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3ZvaWNlX2ZhY3Rvci5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3ZvaWNlX2ZhY3Rvci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvd2Jfc3luX2ZpbHQuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvd2Jfc3luX2ZpbHQuY3BwCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvd2Jfc3luX2ZpbHQuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy93Yl9zeW5fZmlsdC5jcHAKaW5kZXggZTFhZjZkNC4uZjEyODI4ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy93Yl9zeW5fZmlsdC5jcHAKKysrIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvd2Jfc3luX2ZpbHQuY3BwCkBAIC0xODEsMTIgKzE4MSwxNCBAQAogICAgICAgICBMX3RtcDQgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpKzMgIC0gal0sIGFbal0sIExfdG1wNCk7CiAKICAgICAgICAgTF90bXAxID0gc2hsX2ludDMyKExfdG1wMSwgNCk7CisgICAgICAgIExfdG1wMSA9IExfdG1wMSA9PSBJTlQzMl9NSU4gPyBJTlQzMl9NSU4gKyAxIDogTF90bXAxOwogCiAgICAgICAgIHlbKGk8PDIpXSA9IHl5WyhpPDwyKV0gPSBhbXJfd2Jfcm91bmQoLUxfdG1wMSk7CiAKICAgICAgICAgTF90bXAyICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKV0sIGFbMV0sIExfdG1wMik7CiAKICAgICAgICAgTF90bXAyID0gc2hsX2ludDMyKExfdG1wMiwgNCk7CisgICAgICAgIExfdG1wMiA9IExfdG1wMiA9PSBJTlQzMl9NSU4gPyBJTlQzMl9NSU4gKyAxIDogTF90bXAyOwogCiAgICAgICAgIHlbKGk8PDIpKzFdID0geXlbKGk8PDIpKzFdID0gYW1yX3diX3JvdW5kKC1MX3RtcDIpOwogCkBAIC0xOTcsMTIgKzE5OSwxNCBAQAogICAgICAgICBMX3RtcDMgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpICsgMV0sIGFbMV0sIExfdG1wMyk7CiAKICAgICAgICAgTF90bXAzID0gc2hsX2ludDMyKExfdG1wMywgNCk7CisgICAgICAgIExfdG1wMyA9IExfdG1wMyA9PSBJTlQzMl9NSU4gPyBJTlQzMl9NSU4gKyAxIDogTF90bXAzOwogCiAgICAgICAgIHlbKGk8PDIpKzJdID0geXlbKGk8PDIpKzJdID0gYW1yX3diX3JvdW5kKC1MX3RtcDMpOwogCiAgICAgICAgIExfdG1wNCAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikrMl0sIGFbMV0sIExfdG1wNCk7CiAKICAgICAgICAgTF90bXA0ID0gc2hsX2ludDMyKExfdG1wNCwgNCk7CisgICAgICAgIExfdG1wNCA9IExfdG1wNCA9PSBJTlQzMl9NSU4gPyBJTlQzMl9NSU4gKyAxIDogTF90bXA0OwogCiAgICAgICAgIHlbKGk8PDIpKzNdID0geXlbKGk8PDIpKzNdID0gYW1yX3diX3JvdW5kKC1MX3RtcDQpOwogICAgIH0KQEAgLTI3Myw5ICsyNzcsMTAgQEAKIAogICAgICAgICBMX3RtcDEgPj49IDExOyAgICAgIC8qIC00IDogc2lnX2xvW2ldIDw8IDQgKi8KIAotICAgICAgICBMX3RtcDEgKz0gKGludDMyKWV4Y1soaTw8MSldIDw8IGEwOworICAgICAgICBpbnQ2NCBzaWdfdG1wOworICAgICAgICBzaWdfdG1wID0gKGludDY0KUxfdG1wMSArIChpbnQzMikoZXhjWyhpPDwxKV0gPDwgYTApOworICAgICAgICBMX3RtcDEgPSAoaW50MzIpKHNpZ190bXAgLSAoTF90bXAyIDw8IDEpKTsKIAotICAgICAgICBMX3RtcDEgLT0gKExfdG1wMiA8PCAxKTsKICAgICAgICAgLyogc2lnX2hpID0gYml0MTYgdG8gYml0MzEgb2Ygc3ludGhlc2lzICovCiAgICAgICAgIExfdG1wMSA9IHNobF9pbnQzMihMX3RtcDEsIDMpOyAgICAgICAgICAgLyogYWkgaW4gUTEyICovCiAKQEAgLTI5MCw5ICsyOTUsOCBAQAogICAgICAgICBMX3RtcDMgPSBmeHBfbWFjXzE2YnkxNihzaWdfbG9bKGk8PDEpXSwgYVsxXSwgTF90bXAzKTsKICAgICAgICAgTF90bXAzID0gLUxfdG1wMyA+PiAxMTsKIAotICAgICAgICBMX3RtcDMgKz0gKGludDMyKWV4Y1soaTw8MSkrMV0gPDwgYTA7Ci0KLSAgICAgICAgTF90bXAzIC09IChMX3RtcDQgPDwgMSk7CisgICAgICAgIHNpZ190bXAgPSAoaW50NjQpTF90bXAzICsgKGludDMyKShleGNbKGk8PDEpKzFdIDw8IGEwKTsKKyAgICAgICAgTF90bXAzID0gKGludDMyKShzaWdfdG1wIC0gKExfdG1wNCA8PCAxKSk7CiAgICAgICAgIC8qIHNpZ19oaSA9IGJpdDE2IHRvIGJpdDMxIG9mIHN5bnRoZXNpcyAqLwogICAgICAgICBMX3RtcDMgPSBzaGxfaW50MzIoTF90bXAzLCAzKTsgICAgICAgICAgIC8qIGFpIGluIFExMiAqLwogICAgICAgICBzaWdfaGlbKGk8PDEpKzFdID0gKGludDE2KShMX3RtcDMgPj4gMTYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy93ZWlnaHRfYW1yd2JfbHBjLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3dlaWdodF9hbXJ3Yl9scGMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3dlaWdodF9hbXJ3Yl9scGMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy93ZWlnaHRfYW1yd2JfbHBjLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3Rlc3QvQW1yd2JEZWNUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvdGVzdC9BbXJ3YkRlY1Rlc3RFbnZpcm9ubWVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvdGVzdC9BbXJ3YkRlY1Rlc3RFbnZpcm9ubWVudC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3Rlc3QvQW1yd2JEZWNUZXN0RW52aXJvbm1lbnQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3Rlc3QvQW1yd2JEZWNvZGVyVGVzdC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3Rlc3QvQW1yd2JEZWNvZGVyVGVzdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi90ZXN0L0FtcndiRGVjb2RlclRlc3QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3Rlc3QvQW1yd2JEZWNvZGVyVGVzdC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3Rlc3QvQW5kcm9pZC5icApzaW1pbGFyaXR5IGluZGV4IDcxJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvdGVzdC9BbmRyb2lkLmJwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3Rlc3QvQW5kcm9pZC5icAppbmRleCA5NjgyMTVhLi5jYzEyMGQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvdGVzdC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvdGVzdC9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwxOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX2FtcndiX2RlY19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUJTRAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfYW1yd2JfZGVjX2xpY2Vuc2UiLAorICAgIF0sCit9CisKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJBbXJ3YkRlY29kZXJUZXN0IiwKICAgICBndGVzdDogdHJ1ZSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi90ZXN0L0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi90ZXN0L0FuZHJvaWRUZXN0LnhtbApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3Rlc3QvUkVBRE1FLm1kIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy90ZXN0L1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3Rlc3QvUkVBRE1FLm1kCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3Rlc3QvUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvdGVzdC9hbXJ3YmRlY190ZXN0LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvdGVzdC9hbXJ3YmRlY190ZXN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3Rlc3QvYW1yd2JkZWNfdGVzdC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvdGVzdC9hbXJ3YmRlY190ZXN0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNzJlYjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNjYgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfYW1yd2JfZW5jX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjc19hbXJ3Yl9lbmNfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJ3YmVuYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvYXV0b2NvcnIuYyIsCisgICAgICAgICJzcmMvYXpfaXNwLmMiLAorICAgICAgICAic3JjL2JpdHMuYyIsCisgICAgICAgICJzcmMvYzJ0NjRmeC5jIiwKKyAgICAgICAgInNyYy9jNHQ2NGZ4LmMiLAorICAgICAgICAic3JjL2NvbnZvbHZlLmMiLAorICAgICAgICAic3JjL2Nvcl9oX3guYyIsCisgICAgICAgICJzcmMvZGVjaW01NC5jIiwKKyAgICAgICAgInNyYy9kZWVtcGguYyIsCisgICAgICAgICJzcmMvZHR4LmMiLAorICAgICAgICAic3JjL2dfcGl0Y2guYyIsCisgICAgICAgICJzcmMvZ3BjbGlwLmMiLAorICAgICAgICAic3JjL2hvbWluZy5jIiwKKyAgICAgICAgInNyYy9ocDQwMC5jIiwKKyAgICAgICAgInNyYy9ocDUwLmMiLAorICAgICAgICAic3JjL2hwNmsuYyIsCisgICAgICAgICJzcmMvaHBfd3NwLmMiLAorICAgICAgICAic3JjL2ludF9scGMuYyIsCisgICAgICAgICJzcmMvaXNwX2F6LmMiLAorICAgICAgICAic3JjL2lzcF9pc2YuYyIsCisgICAgICAgICJzcmMvbGFnX3dpbmQuYyIsCisgICAgICAgICJzcmMvbGV2aW5zb24uYyIsCisgICAgICAgICJzcmMvbG9nMi5jIiwKKyAgICAgICAgInNyYy9scF9kZWMyLmMiLAorICAgICAgICAic3JjL21hdGhfb3AuYyIsCisgICAgICAgICJzcmMvb3Blcl8zMmIuYyIsCisgICAgICAgICJzcmMvcF9tZWRfb2wuYyIsCisgICAgICAgICJzcmMvcGl0X3NocnAuYyIsCisgICAgICAgICJzcmMvcGl0Y2hfZjQuYyIsCisgICAgICAgICJzcmMvcHJlZF9sdDQuYyIsCisgICAgICAgICJzcmMvcHJlZW1waC5jIiwKKyAgICAgICAgInNyYy9xX2dhaW4yLmMiLAorICAgICAgICAic3JjL3FfcHVsc2UuYyIsCisgICAgICAgICJzcmMvcWlzZl9ucy5jIiwKKyAgICAgICAgInNyYy9xcGlzZl8ycy5jIiwKKyAgICAgICAgInNyYy9yYW5kb20uYyIsCisgICAgICAgICJzcmMvcmVzaWR1LmMiLAorICAgICAgICAic3JjL3NjYWxlLmMiLAorICAgICAgICAic3JjL3N0cmVhbS5jIiwKKyAgICAgICAgInNyYy9zeW5fZmlsdC5jIiwKKyAgICAgICAgInNyYy91cGR0X3Rhci5jIiwKKyAgICAgICAgInNyYy91dGlsLmMiLAorICAgICAgICAic3JjL3ZvQU1SV0JFbmMuYyIsCisgICAgICAgICJzcmMvdm9pY2VmYWMuYyIsCisgICAgICAgICJzcmMvd2JfdmFkLmMiLAorICAgICAgICAic3JjL3dlaWdodF9hLmMiLAorICAgICAgICAic3JjL21lbV9hbGlnbi5jIiwKKyAgICBdLAorCisgICAgYXJjaDogeworICAgICAgICBhcm06IHsKKyAgICAgICAgICAgIHNyY3M6IFsKKyAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvY29udm9sdmVfb3B0LnMiLAorICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9jb3JfaF92ZWNfb3B0LnMiLAorICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9EZWVtcGhfMzJfb3B0LnMiLAorICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9Eb3RfcF9vcHQucyIsCisgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL0ZpbHRfNmtfN2tfb3B0LnMiLAorICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9Ob3JtX0NvcnJfb3B0LnMiLAorICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zIiwKKyAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvcmVzaWR1X2FzbV9vcHQucyIsCisgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL3NjYWxlX3NpZ19vcHQucyIsCisgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL1N5bl9maWx0XzMyX29wdC5zIiwKKyAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvc3luX2ZpbHRfb3B0LnMiLAorICAgICAgICAgICAgXSwKKworICAgICAgICAgICAgY2ZsYWdzOiBbCisgICAgICAgICAgICAgICAgIi1EQVJNIiwKKyAgICAgICAgICAgICAgICAiLURBU01fT1BUIiwKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjL2FzbS9BUk1WNUUiXSwKKworICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fc2V0OiAiYXJtIiwKKworICAgICAgICAgICAgbmVvbjogeworICAgICAgICAgICAgICAgIGV4Y2x1ZGVfc3JjczogWworICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvY29udm9sdmVfb3B0LnMiLAorICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvY29yX2hfdmVjX29wdC5zIiwKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL0RlZW1waF8zMl9vcHQucyIsCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9Eb3RfcF9vcHQucyIsCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9GaWx0XzZrXzdrX29wdC5zIiwKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL05vcm1fQ29ycl9vcHQucyIsCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zIiwKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL3Jlc2lkdV9hc21fb3B0LnMiLAorICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvc2NhbGVfc2lnX29wdC5zIiwKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL1N5bl9maWx0XzMyX29wdC5zIiwKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL3N5bl9maWx0X29wdC5zIiwKKyAgICAgICAgICAgICAgICBdLAorCisgICAgICAgICAgICAgICAgc3JjczogWworICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9jb252b2x2ZV9uZW9uLnMiLAorICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9jb3JfaF92ZWNfbmVvbi5zIiwKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvRGVlbXBoXzMyX25lb24ucyIsCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L0RvdF9wX25lb24ucyIsCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L0ZpbHRfNmtfN2tfbmVvbi5zIiwKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvTm9ybV9Db3JyX25lb24ucyIsCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L3ByZWRfbHQ0XzFfbmVvbi5zIiwKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvcmVzaWR1X2FzbV9uZW9uLnMiLAorICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9zY2FsZV9zaWdfbmVvbi5zIiwKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvU3luX2ZpbHRfMzJfbmVvbi5zIiwKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvc3luX2ZpbHRfbmVvbi5zIiwKKyAgICAgICAgICAgICAgICBdLAorCisgICAgICAgICAgICAgICAgLy8gZG9uJ3QgYWN0dWFsbHkgZ2VuZXJhdGUgbmVvbiBpbnN0cnVjdGlvbnMsIHNlZSBidWcgMjY5MzI5ODAKKyAgICAgICAgICAgICAgICBjZmxhZ3M6IFsKKyAgICAgICAgICAgICAgICAgICAgIi1EQVJNVjciLAorICAgICAgICAgICAgICAgICAgICAiLW1mcHU9dmZwdjMiLAorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RSIsCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3IiwKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgfSwKKworICAgICAgICB9LAorICAgIH0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmMiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIGNmbGFnczogWyItV2Vycm9yIl0sCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmNvcHkgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL05PVElDRSBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9OT1RJQ0UKY29weSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQU1SV0JfRV9TQU1QTEUuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvU2FtcGxlQ29kZS9BTVJXQl9FX1NBTVBMRS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BTVJXQl9FX1NBTVBMRS5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL1NhbXBsZUNvZGUvQU1SV0JfRV9TQU1QTEUuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9TYW1wbGVDb2RlL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDQ4MzY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9TYW1wbGVDb2RlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0NyBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjc19hbXJ3Yl9lbmNfU2FtcGxlQ29kZV9saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfYW1yd2JfZW5jX1NhbXBsZUNvZGVfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkFNUldCRW5jVGVzdCIsCisgICAgZ3Rlc3Q6IGZhbHNlLAorCisgICAgc3JjczogWyJBTVJXQl9FX1NBTVBMRS5jIl0sCisKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCisgICAgYXJjaDogeworICAgICAgICBhcm06IHsKKyAgICAgICAgICAgIGluc3RydWN0aW9uX3NldDogImFybSIsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1yd2JlbmMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvU2FtcGxlQ29kZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL1NhbXBsZUNvZGUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvTk9USUNFIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9TYW1wbGVDb2RlL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvTk9USUNFCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL1NhbXBsZUNvZGUvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL1RFU1RfTUFQUElORyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NWU4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDEwIEBACisvLyBtYXBwaW5ncyBmb3IgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMKK3sKKyAgLy8gdGVzdHMgd2hpY2ggcmVxdWlyZSBkeW5hbWljIGNvbnRlbnQKKyAgLy8gaW52b2tlIHdpdGg6IGF0ZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKKyAgLy8gVE9ETyhiLzE0ODA5NDA1OSk6IHVuaXQgdGVzdHMgbm90IGFsbG93ZWQgdG8gZG93bmxvYWQgY29udGVudAorICAiZHluYW1pYy1wcmVzdWJtaXQiOiBbCisgICAgeyAibmFtZSI6ICJBbXJ3YkVuY29kZXJUZXN0In0KKworICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvZG9jL3ZvQU1SV0JFbmNvZGVyU0RLLnBkZiBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvZG9jL3ZvQU1SV0JFbmNvZGVyU0RLLnBkZgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2RvYy92b0FNUldCRW5jb2RlclNESy5wZGYKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvZG9jL3ZvQU1SV0JFbmNvZGVyU0RLLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2Z1enplci9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9mdXp6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzRmYTRmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX2FtcndiX2VuY19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX2FtcndiX2VuY19saWNlbnNlIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiYW1yd2JfZW5jX2Z1enplciIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJhbXJ3Yl9lbmNfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1yd2JlbmMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiIsCisgICAgXSwKKworICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvZnV6emVyL1JFQURNRS5tZCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDdmYmZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNjAgQEAKKyMgRnV6emVyIGZvciBsaWJzdGFnZWZyaWdodF9hbXJ3YmVuYyBlbmNvZGVyCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBBTVItV0IgaXMgZGVzaWduZWQgYmFzZWQgb24gdGhlIHVuZGVyc3RhbmRpbmcgb2YgdGhlCitjb2RlYyBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSBub3QgaGFyZGNvZGVkLCBidXQgaW5zdGVhZCBzZWxlY3RlZCBiYXNlZCBvbgoraW5jb21pbmcgZGF0YS4gVGhpcyBlbnN1cmVzIG1vcmUgY29kZSBwYXRocyBhcmUgcmVhY2hlZCBieSB0aGUgZnV6emVyLgorCitBTVItV0Igc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorMS4gRnJhbWUgVHlwZSAocGFyYW1ldGVyIG5hbWU6IGBmcmFtZVR5cGVgKQorMi4gTW9kZSAocGFyYW1ldGVyIG5hbWU6IGBtb2RlYCkKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGBmcmFtZVR5cGVgIHwgMC4gYFZPQU1SV0JfREVGQVVMVGAgMS4gYFZPQU1SV0JfSVRVYCAyLiBgVk9BTVJXQl9SRkMzMjY3YCB8IEJpdHMgMCwgMSBhbmQgMiBvZiAxc3QgYnl0ZSBvZiBkYXRhLiB8Cit8IGBtb2RlYCAgIHwgMC4gYFZPQU1SV0JfTUQ2NmAgMS4gYFZPQU1SV0JfTUQ4ODVgIDIuIGBWT0FNUldCX01EMTI2NWAgMy4gYFZPQU1SV0JfTUQxNDI1YCAgNC4gYFZPQU1SV0JfTUQxNTg1IGAgNS4gYFZPQU1SV0JfTUQxODI1YCA2LiBgVk9BTVJXQl9NRDE5ODVgIDcuIGBWT0FNUldCX01EMjMwNWAgOC4gYFZPQU1SV0JfTUQyMzg1YCA5LiBgVk9BTVJXQl9OX01PREVTYCB8IEJpdHMgNCwgNSwgNiBhbmQgNyBvZiAxc3QgYnl0ZSBvZiBkYXRhLiB8CisKK1RoaXMgYWxzbyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiBpcyBhbHdheXMgZGV0ZXJtaW5pc3RpYyBmb3IgYW55IGdpdmVuIGlucHV0LgorCisjIyMjIyBNYXhpbWl6ZSB1dGlsaXphdGlvbiBvZiBpbnB1dCBkYXRhCitUaGUgcGx1Z2luIGZlZWRzIHRoZSBlbnRpcmUgaW5wdXQgZGF0YSB0byB0aGUgY29kZWMgdXNpbmcgYSBsb29wLgorSWYgdGhlIGVuY29kZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIHRoZSBpbnB1dCBpcyBhZHZhbmNlZCBieSB0aGUgZnJhbWUgc2l6ZS4KK0lmIHRoZSBlbmNvZGUgb3BlcmF0aW9uIHdhcyB1bi1zdWNjZXNzZnVsLCB0aGUgaW5wdXQgaXMgc3RpbGwgYWR2YW5jZWQgYnkgZnJhbWUgc2l6ZSBzbwordGhhdCB0aGUgZnV6emVyIGNhbiBwcm9jZWVkIHRvIGZlZWQgdGhlIG5leHQgZnJhbWUuCisKK1RoaXMgZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gdG9sZXJhdGVzIGFueSBraW5kIG9mIGlucHV0IChlbXB0eSwgaHVnZSwKK21hbGZvcm1lZCwgZXRjKSBhbmQgZG9lc250IGBleGl0KClgIG9uIGFueSBpbnB1dCBhbmQgdGhlcmVieSBpbmNyZWFzaW5nIHRoZQorY2hhbmNlIG9mIGlkZW50aWZ5aW5nIHZ1bG5lcmFiaWxpdGllcy4KKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgYW1yd2JfZW5jX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgYW1yd2JfZW5jX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIHBjbSBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9hbXJ3Yl9lbmNfZnV6emVyL2FtcndiX2VuY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCitUbyBydW4gb24gaG9zdAorYGBgCisgICQgJEFORFJPSURfSE9TVF9PVVQvZnV6ei94ODZfNjQvYW1yd2JfZW5jX2Z1enplci9hbXJ3Yl9lbmNfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIyBSZWZlcmVuY2VzOgorICogaHR0cDovL2xsdm0ub3JnL2RvY3MvTGliRnV6emVyLmh0bWwKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvb3NzLWZ1enoKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvZnV6emVyL2FtcndiX2VuY19mdXp6ZXIuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9mdXp6ZXIvYW1yd2JfZW5jX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3M2ExZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvZnV6emVyL2FtcndiX2VuY19mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsMTQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSAiY21uTWVtb3J5LmgiCisjaW5jbHVkZSAidm9BTVJXQi5oIgorI2luY2x1ZGUgImNuc3QuaCIKKwordHlwZWRlZiBpbnQoVk9fQVBJICpWT0dFVEFVRElPRU5DQVBJKShWT19BVURJT19DT0RFQ0FQSSAqcEVuY0hhbmRsZSk7Citjb25zdCBpbnQzMl90IGtJbnB1dEJ1ZmZlclNpemUgPSBMX0ZSQU1FMTZrICogc2l6ZW9mKGludDE2X3QpICogMjsKK2NvbnN0IGludDMyX3Qga091dHB1dEJ1ZmZlclNpemUgPSAyICoga0lucHV0QnVmZmVyU2l6ZTsKK2NvbnN0IGludDMyX3Qga01vZGVzW10gPSB7Vk9BTVJXQl9NRDY2IC8qIDYuNjBrYnBzICovLCAgICBWT0FNUldCX01EODg1IC8qIDguODVrYnBzICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWT0FNUldCX01EMTI2NSAvKiAxMi42NWticHMgKi8sIFZPQU1SV0JfTUQxNDI1IC8qIDE0LjI1a2JwcyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVk9BTVJXQl9NRDE1ODUgLyogMTUuODVrYnBzICovLCBWT0FNUldCX01EMTgyNSAvKiAxOC4yNWticHMgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZPQU1SV0JfTUQxOTg1IC8qIDE5Ljg1a2JwcyAqLywgVk9BTVJXQl9NRDIzMDUgLyogMjMuMDVrYnBzICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWT0FNUldCX01EMjM4NSAvKiAyMy44NWticHMgKi8sIFZPQU1SV0JfTl9NT0RFUyAvKiBJbnZhbGlkIE1vZGUgKi99OworY29uc3QgVk9BTVJXQkZSQU1FVFlQRSBrRnJhbWVUeXBlc1tdID0ge1ZPQU1SV0JfREVGQVVMVCwgVk9BTVJXQl9JVFUsIFZPQU1SV0JfUkZDMzI2N307CisKK2NsYXNzIENvZGVjIHsKKyAgIHB1YmxpYzoKKyAgICBDb2RlYygpID0gZGVmYXVsdDsKKyAgICB+Q29kZWMoKSB7IGRlSW5pdEVuY29kZXIoKTsgfQorICAgIGJvb2wgaW5pdEVuY29kZXIoY29uc3QgdWludDhfdCAqZGF0YSk7CisgICAgdm9pZCBkZUluaXRFbmNvZGVyKCk7CisgICAgdm9pZCBlbmNvZGVGcmFtZXMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICBwcml2YXRlOgorICAgIFZPX0FVRElPX0NPREVDQVBJICptQXBpSGFuZGxlID0gbnVsbHB0cjsKKyAgICBWT19NRU1fT1BFUkFUT1IgKm1NZW1PcGVyYXRvciA9IG51bGxwdHI7CisgICAgVk9fSEFORExFIG1FbmNvZGVySGFuZGxlID0gbnVsbHB0cjsKK307CisKK2Jvb2wgQ29kZWM6OmluaXRFbmNvZGVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEpIHsKKyAgICB1aW50OF90IHN0YXJ0Qnl0ZSA9ICpkYXRhOworICAgIGludDMyX3QgbW9kZSA9IGtNb2Rlc1soc3RhcnRCeXRlID4+IDQpICUgMTBdOworICAgIFZPQU1SV0JGUkFNRVRZUEUgZnJhbWVUeXBlID0ga0ZyYW1lVHlwZXNbc3RhcnRCeXRlICUgM107CisgICAgbU1lbU9wZXJhdG9yID0gbmV3IFZPX01FTV9PUEVSQVRPUjsKKyAgICBpZiAoIW1NZW1PcGVyYXRvcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbU1lbU9wZXJhdG9yLT5BbGxvYyA9IGNtbk1lbUFsbG9jOworICAgIG1NZW1PcGVyYXRvci0+Q29weSA9IGNtbk1lbUNvcHk7CisgICAgbU1lbU9wZXJhdG9yLT5GcmVlID0gY21uTWVtRnJlZTsKKyAgICBtTWVtT3BlcmF0b3ItPlNldCA9IGNtbk1lbVNldDsKKyAgICBtTWVtT3BlcmF0b3ItPkNoZWNrID0gY21uTWVtQ2hlY2s7CisKKyAgICBWT19DT0RFQ19JTklUX1VTRVJEQVRBIHVzZXJEYXRhOworICAgIG1lbXNldCgmdXNlckRhdGEsIDAsIHNpemVvZih1c2VyRGF0YSkpOworICAgIHVzZXJEYXRhLm1lbWZsYWcgPSBWT19JTUZfVVNFUk1FTU9QRVJBVE9SOworICAgIHVzZXJEYXRhLm1lbURhdGEgPSAoVk9fUFRSKW1NZW1PcGVyYXRvcjsKKworICAgIG1BcGlIYW5kbGUgPSBuZXcgVk9fQVVESU9fQ09ERUNBUEk7CisgICAgaWYgKCFtQXBpSGFuZGxlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKFZPX0VSUl9OT05FICE9IHZvR2V0QU1SV0JFbmNBUEkobUFwaUhhbmRsZSkpIHsKKyAgICAgICAgLy8gRmFpbGVkIHRvIGdldCBhcGkgaGFuZGxlCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKFZPX0VSUl9OT05FICE9IG1BcGlIYW5kbGUtPkluaXQoJm1FbmNvZGVySGFuZGxlLCBWT19BVURJT19Db2RpbmdBTVJXQiwgJnVzZXJEYXRhKSkgeworICAgICAgICAvLyBGYWlsZWQgdG8gaW5pdCBBTVJXQiBlbmNvZGVyCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKFZPX0VSUl9OT05FICE9IG1BcGlIYW5kbGUtPlNldFBhcmFtKG1FbmNvZGVySGFuZGxlLCBWT19QSURfQU1SV0JfRlJBTUVUWVBFLCAmZnJhbWVUeXBlKSkgeworICAgICAgICAvLyBGYWlsZWQgdG8gc2V0IEFNUldCIGVuY29kZXIgZnJhbWUgdHlwZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChWT19FUlJfTk9ORSAhPSBtQXBpSGFuZGxlLT5TZXRQYXJhbShtRW5jb2RlckhhbmRsZSwgVk9fUElEX0FNUldCX01PREUsICZtb2RlKSkgeworICAgICAgICAvLyBGYWlsZWQgdG8gc2V0IEFNUldCIGVuY29kZXIgbW9kZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENvZGVjOjpkZUluaXRFbmNvZGVyKCkgeworICAgIGlmIChtRW5jb2RlckhhbmRsZSkgeworICAgICAgICBtQXBpSGFuZGxlLT5VbmluaXQobUVuY29kZXJIYW5kbGUpOworICAgICAgICBtRW5jb2RlckhhbmRsZSA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtQXBpSGFuZGxlKSB7CisgICAgICAgIGRlbGV0ZSBtQXBpSGFuZGxlOworICAgICAgICBtQXBpSGFuZGxlID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1NZW1PcGVyYXRvcikgeworICAgICAgICBkZWxldGUgbU1lbU9wZXJhdG9yOworICAgICAgICBtTWVtT3BlcmF0b3IgPSBudWxscHRyOworICAgIH0KK30KKwordm9pZCBDb2RlYzo6ZW5jb2RlRnJhbWVzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgZG8geworICAgICAgICBpbnQzMl90IG1pblNpemUgPSBzdGQ6Om1pbigoaW50MzJfdClzaXplLCBrSW5wdXRCdWZmZXJTaXplKTsKKyAgICAgICAgdWludDhfdCBvdXRwdXRCdWZba091dHB1dEJ1ZmZlclNpemVdID0ge307CisgICAgICAgIFZPX0NPREVDQlVGRkVSIGluRGF0YTsKKyAgICAgICAgVk9fQ09ERUNCVUZGRVIgb3V0RGF0YTsKKyAgICAgICAgVk9fQVVESU9fT1VUUFVUSU5GTyBvdXRGb3JtYXQ7CisgICAgICAgIGluRGF0YS5CdWZmZXIgPSAodW5zaWduZWQgY2hhciAqKWRhdGE7CisgICAgICAgIGluRGF0YS5MZW5ndGggPSBtaW5TaXplOworICAgICAgICBvdXREYXRhLkJ1ZmZlciA9IG91dHB1dEJ1ZjsKKyAgICAgICAgbUFwaUhhbmRsZS0+U2V0SW5wdXREYXRhKG1FbmNvZGVySGFuZGxlLCAmaW5EYXRhKTsKKyAgICAgICAgbUFwaUhhbmRsZS0+R2V0T3V0cHV0RGF0YShtRW5jb2RlckhhbmRsZSwgJm91dERhdGEsICZvdXRGb3JtYXQpOworICAgICAgICBkYXRhICs9IG1pblNpemU7CisgICAgICAgIHNpemUgLT0gbWluU2l6ZTsKKyAgICB9IHdoaWxlIChzaXplID4gMCk7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8IDEpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIENvZGVjICpjb2RlYyA9IG5ldyBDb2RlYygpOworICAgIGlmICghY29kZWMpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChjb2RlYy0+aW5pdEVuY29kZXIoZGF0YSkpIHsKKyAgICAgICAgLy8gQ29uc3VtZSBmaXJzdCBieXRlCisgICAgICAgICsrZGF0YTsKKyAgICAgICAgLS1zaXplOworICAgICAgICBjb2RlYy0+ZW5jb2RlRnJhbWVzKGRhdGEsIHNpemUpOworICAgIH0KKyAgICBkZWxldGUgY29kZWM7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2FjZWxwLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9hY2VscC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2FjZWxwLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL2FjZWxwLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvYmFzaWNfb3AuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL2Jhc2ljX29wLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvYmFzaWNfb3AuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvYmFzaWNfb3AuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9iaXRzLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9iaXRzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvYml0cy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9iaXRzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvY25zdC5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvY25zdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2Nuc3QuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvY25zdC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2NvZF9tYWluLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9jb2RfbWFpbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2NvZF9tYWluLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL2NvZF9tYWluLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvZHR4LmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9kdHguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9kdHguaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvZHR4LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvZ3JpZDEwMC50YWIgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9ncmlkMTAwLnRhYgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9ncmlkMTAwLnRhYgpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvZ3JpZDEwMC50YWIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvaGFtX3dpbmQudGFiIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvaGFtX3dpbmQudGFiCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2hhbV93aW5kLnRhYgpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvaGFtX3dpbmQudGFiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2hvbWluZy50YWIgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9ob21pbmcudGFiCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2hvbWluZy50YWIKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL2hvbWluZy50YWIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvaXNwX2lzZi50YWIgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9pc3BfaXNmLnRhYgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9pc3BfaXNmLnRhYgpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvaXNwX2lzZi50YWIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbGFnX3dpbmQudGFiIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvbGFnX3dpbmQudGFiCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2xhZ193aW5kLnRhYgpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvbGFnX3dpbmQudGFiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2xvZzIuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL2xvZzIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9sb2cyLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL2xvZzIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9sb2cyX3RhYi5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvbG9nMl90YWIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9sb2cyX3RhYi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9sb2cyX3RhYi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL21haW4uaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL21haW4uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9tYWluLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL21haW4uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9tYXRoX29wLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9tYXRoX29wLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbWF0aF9vcC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9tYXRoX29wLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbWVtX2FsaWduLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9tZW1fYWxpZ24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9tZW1fYWxpZ24uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvbWVtX2FsaWduLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbWltZV9pby50YWIgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9taW1lX2lvLnRhYgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9taW1lX2lvLnRhYgpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvbWltZV9pby50YWIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvb3Blcl8zMmIuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL29wZXJfMzJiLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvb3Blcl8zMmIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvb3Blcl8zMmIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9wX21lZF9vLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9wX21lZF9vLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcF9tZWRfby5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9wX21lZF9vLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcF9tZWRfb2wudGFiIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvcF9tZWRfb2wudGFiCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3BfbWVkX29sLnRhYgpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvcF9tZWRfb2wudGFiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3FfZ2FpbjIudGFiIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvcV9nYWluMi50YWIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcV9nYWluMi50YWIKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL3FfZ2FpbjIudGFiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3FfcHVsc2UuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL3FfcHVsc2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9xX3B1bHNlLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL3FfcHVsc2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9xaXNmX25zLnRhYiBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL3Fpc2ZfbnMudGFiCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3Fpc2ZfbnMudGFiCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9xaXNmX25zLnRhYgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9xcGlzZl8ycy50YWIgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9xcGlzZl8ycy50YWIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcXBpc2ZfMnMudGFiCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9xcGlzZl8ycy50YWIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvc3RyZWFtLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9zdHJlYW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9zdHJlYW0uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvc3RyZWFtLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvdHlwZWRlZi5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvdHlwZWRlZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3R5cGVkZWYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvdHlwZWRlZi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3R5cGVkZWZzLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy90eXBlZGVmcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3R5cGVkZWZzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL3R5cGVkZWZzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvd2JfdmFkLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy93Yl92YWQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy93Yl92YWQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvd2JfdmFkLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvd2JfdmFkX2MuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL3diX3ZhZF9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvd2JfdmFkX2MuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvd2JfdmFkX2MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3BhdGVudF9kaXNjbGFpbWVyLnR4dCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3BhdGVudF9kaXNjbGFpbWVyLnR4dApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0RlZW1waF8zMl9vcHQucyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvRGVlbXBoXzMyX29wdC5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRGVlbXBoXzMyX29wdC5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL0RlZW1waF8zMl9vcHQucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0RvdF9wX29wdC5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY1RS9Eb3RfcF9vcHQucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0RvdF9wX29wdC5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL0RvdF9wX29wdC5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRmlsdF82a183a19vcHQucyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvRmlsdF82a183a19vcHQucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0ZpbHRfNmtfN2tfb3B0LnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvRmlsdF82a183a19vcHQucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL05vcm1fQ29ycl9vcHQucyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvTm9ybV9Db3JyX29wdC5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvTm9ybV9Db3JyX29wdC5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL05vcm1fQ29ycl9vcHQucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL1N5bl9maWx0XzMyX29wdC5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY1RS9TeW5fZmlsdF8zMl9vcHQucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL1N5bl9maWx0XzMyX29wdC5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL1N5bl9maWx0XzMyX29wdC5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvY29udm9sdmVfb3B0LnMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL2NvbnZvbHZlX29wdC5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvY29udm9sdmVfb3B0LnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvY29udm9sdmVfb3B0LnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9jb3JfaF92ZWNfb3B0LnMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL2Nvcl9oX3ZlY19vcHQucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL2Nvcl9oX3ZlY19vcHQucwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY1RS9jb3JfaF92ZWNfb3B0LnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcHJlZF9sdDRfMV9vcHQucwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcmVzaWR1X2FzbV9vcHQucyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvcmVzaWR1X2FzbV9vcHQucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3Jlc2lkdV9hc21fb3B0LnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvcmVzaWR1X2FzbV9vcHQucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3NjYWxlX3NpZ19vcHQucyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvc2NhbGVfc2lnX29wdC5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvc2NhbGVfc2lnX29wdC5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL3NjYWxlX3NpZ19vcHQucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3N5bl9maWx0X29wdC5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY1RS9zeW5fZmlsdF9vcHQucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3N5bl9maWx0X29wdC5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL3N5bl9maWx0X29wdC5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9EZWVtcGhfMzJfbmVvbi5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L0RlZW1waF8zMl9uZW9uLnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0RlZW1waF8zMl9uZW9uLnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9EZWVtcGhfMzJfbmVvbi5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9Eb3RfcF9uZW9uLnMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjcvRG90X3BfbmVvbi5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9Eb3RfcF9uZW9uLnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9Eb3RfcF9uZW9uLnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0ZpbHRfNmtfN2tfbmVvbi5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L0ZpbHRfNmtfN2tfbmVvbi5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9GaWx0XzZrXzdrX25lb24ucwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L0ZpbHRfNmtfN2tfbmVvbi5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9Ob3JtX0NvcnJfbmVvbi5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L05vcm1fQ29ycl9uZW9uLnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L05vcm1fQ29ycl9uZW9uLnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9Ob3JtX0NvcnJfbmVvbi5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9TeW5fZmlsdF8zMl9uZW9uLnMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjcvU3luX2ZpbHRfMzJfbmVvbi5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9TeW5fZmlsdF8zMl9uZW9uLnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9TeW5fZmlsdF8zMl9uZW9uLnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L2NvbnZvbHZlX25lb24ucyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9jb252b2x2ZV9uZW9uLnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L2NvbnZvbHZlX25lb24ucwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L2NvbnZvbHZlX25lb24ucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvY29yX2hfdmVjX25lb24ucyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9jb3JfaF92ZWNfbmVvbi5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9jb3JfaF92ZWNfbmVvbi5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjcvY29yX2hfdmVjX25lb24ucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvcHJlZF9sdDRfMV9uZW9uLnMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjcvcHJlZF9sdDRfMV9uZW9uLnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3ByZWRfbHQ0XzFfbmVvbi5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjcvcHJlZF9sdDRfMV9uZW9uLnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3Jlc2lkdV9hc21fbmVvbi5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L3Jlc2lkdV9hc21fbmVvbi5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9yZXNpZHVfYXNtX25lb24ucwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L3Jlc2lkdV9hc21fbmVvbi5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9zY2FsZV9zaWdfbmVvbi5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L3NjYWxlX3NpZ19uZW9uLnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3NjYWxlX3NpZ19uZW9uLnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9zY2FsZV9zaWdfbmVvbi5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9zeW5fZmlsdF9uZW9uLnMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjcvc3luX2ZpbHRfbmVvbi5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9zeW5fZmlsdF9uZW9uLnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9zeW5fZmlsdF9uZW9uLnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXV0b2NvcnIuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2F1dG9jb3JyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXV0b2NvcnIuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXV0b2NvcnIuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hel9pc3AuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2F6X2lzcC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2F6X2lzcC5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hel9pc3AuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9iaXRzLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9iaXRzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYml0cy5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9iaXRzLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYzJ0NjRmeC5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYzJ0NjRmeC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2MydDY0ZnguYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYzJ0NjRmeC5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2M0dDY0ZnguYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2M0dDY0ZnguYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jNHQ2NGZ4LmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2M0dDY0ZnguYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jb252b2x2ZS5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvY29udm9sdmUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jb252b2x2ZS5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9jb252b2x2ZS5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2Nvcl9oX3guYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2Nvcl9oX3guYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jb3JfaF94LmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2Nvcl9oX3guYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9kZWNpbTU0LmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9kZWNpbTU0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZGVjaW01NC5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9kZWNpbTU0LmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZGVlbXBoLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9kZWVtcGguYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9kZWVtcGguYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvZGVlbXBoLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZHR4LmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9kdHguYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9kdHguYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvZHR4LmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZ19waXRjaC5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvZ19waXRjaC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2dfcGl0Y2guYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvZ19waXRjaC5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2dwY2xpcC5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvZ3BjbGlwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZ3BjbGlwLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2dwY2xpcC5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hvbWluZy5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvaG9taW5nLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaG9taW5nLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2hvbWluZy5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwNDAwLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9ocDQwMC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwNDAwLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2hwNDAwLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHA1MC5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvaHA1MC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwNTAuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvaHA1MC5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwNmsuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2hwNmsuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ocDZrLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2hwNmsuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ocF93c3AuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2hwX3dzcC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwX3dzcC5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9ocF93c3AuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pbnRfbHBjLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9pbnRfbHBjLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaW50X2xwYy5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9pbnRfbHBjLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaXNwX2F6LmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9pc3BfYXouYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pc3BfYXouYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvaXNwX2F6LmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaXNwX2lzZi5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvaXNwX2lzZi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2lzcF9pc2YuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvaXNwX2lzZi5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2xhZ193aW5kLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9sYWdfd2luZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2xhZ193aW5kLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2xhZ193aW5kLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbGV2aW5zb24uYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2xldmluc29uLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbGV2aW5zb24uYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvbGV2aW5zb24uYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9sb2cyLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9sb2cyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbG9nMi5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9sb2cyLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbHBfZGVjMi5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvbHBfZGVjMi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2xwX2RlYzIuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvbHBfZGVjMi5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL21hdGhfb3AuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL21hdGhfb3AuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9tYXRoX29wLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL21hdGhfb3AuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9tZW1fYWxpZ24uYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL21lbV9hbGlnbi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL21lbV9hbGlnbi5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9tZW1fYWxpZ24uYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9vcGVyXzMyYi5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvb3Blcl8zMmIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9vcGVyXzMyYi5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9vcGVyXzMyYi5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BfbWVkX29sLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9wX21lZF9vbC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BfbWVkX29sLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3BfbWVkX29sLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcGl0X3NocnAuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3BpdF9zaHJwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcGl0X3NocnAuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcGl0X3NocnAuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9waXRjaF9mNC5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcGl0Y2hfZjQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9waXRjaF9mNC5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9waXRjaF9mNC5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ByZWRfbHQ0LmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9wcmVkX2x0NC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ByZWRfbHQ0LmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3ByZWRfbHQ0LmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcHJlZW1waC5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcHJlZW1waC5jCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcHJlZW1waC5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9wcmVlbXBoLmMKaW5kZXggNzBjODY1MC4uYTQzODQxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9wcmVlbXBoLmMKKysrIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcHJlZW1waC5jCkBAIC0yNCw2ICsyNCw3IEBACiAKICNpbmNsdWRlICJ0eXBlZGVmLmgiCiAjaW5jbHVkZSAiYmFzaWNfb3AuaCIKKyNpbmNsdWRlIDxzdGRpbnQuaD4KIAogdm9pZCBQcmVlbXBoKAogICAgICAgICBXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBpbnB1dCBzaWduYWwgb3ZlcndyaXR0ZW4gYnkgdGhlIG91dHB1dCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xX2dhaW4yLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9xX2dhaW4yLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcV9nYWluMi5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9xX2dhaW4yLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcV9wdWxzZS5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcV9wdWxzZS5jCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcV9wdWxzZS5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9xX3B1bHNlLmMKaW5kZXggZmUwYmRkYS4uNjU3YjZmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xX3B1bHNlLmMKKysrIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcV9wdWxzZS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSAicV9wdWxzZS5oIgogCiAjZGVmaW5lIE5CX1BPUyAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zIGluIHRyYWNrLCBtYXNrIGZvciBzaWduIGJpdCAqLworI2RlZmluZSBVTlVTRURfVkFSIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCiAKIFdvcmQzMiBxdWFudF8xcF9OMSggICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmV0dXJuIE4rMSBiaXRzICAgICAgICAgICAgICovCiAgICAgICAgIFdvcmQxNiBwb3MsICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAgICAgICAqLwpAQCAtMTg4LDcgKzE4OSw3IEBACiAgICAgICAgIFdvcmQxNiBwb3NbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAxLi40ICAqLwogICAgICAgICBXb3JkMTYgTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24gKi8KIHsKLSAgICBXb3JkMTYgbmJfcG9zLCBtYXNrIF9fdW51c2VkLCBuXzEsIHRtcDsKKyAgICBXb3JkMTYgbmJfcG9zLCBtYXNrIFVOVVNFRF9WQVIsIG5fMSwgdG1wOwogICAgIFdvcmQxNiBwb3NBWzRdLCBwb3NCWzRdOwogICAgIFdvcmQzMiBpLCBqLCBrLCBpbmRleDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xaXNmX25zLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9xaXNmX25zLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcWlzZl9ucy5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9xaXNmX25zLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcXBpc2ZfMnMuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3FwaXNmXzJzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcXBpc2ZfMnMuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcXBpc2ZfMnMuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9yYW5kb20uYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3JhbmRvbS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3JhbmRvbS5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9yYW5kb20uYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9yZXNpZHUuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3Jlc2lkdS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3Jlc2lkdS5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9yZXNpZHUuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zY2FsZS5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvc2NhbGUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zY2FsZS5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9zY2FsZS5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3N0cmVhbS5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvc3RyZWFtLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc3RyZWFtLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3N0cmVhbS5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3N5bl9maWx0LmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9zeW5fZmlsdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3N5bl9maWx0LmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3N5bl9maWx0LmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdXBkdF90YXIuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3VwZHRfdGFyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdXBkdF90YXIuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvdXBkdF90YXIuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy91dGlsLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy91dGlsLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdXRpbC5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy91dGlsLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdm9BTVJXQkVuYy5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvdm9BTVJXQkVuYy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ZvQU1SV0JFbmMuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvdm9BTVJXQkVuYy5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ZvaWNlZmFjLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy92b2ljZWZhYy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ZvaWNlZmFjLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3ZvaWNlZmFjLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvd2JfdmFkLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy93Yl92YWQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy93Yl92YWQuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvd2JfdmFkLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvd2VpZ2h0X2EuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3dlaWdodF9hLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvd2VpZ2h0X2EuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvd2VpZ2h0X2EuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3Rlc3QvQW1yd2JFbmNUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvdGVzdC9BbXJ3YkVuY1Rlc3RFbnZpcm9ubWVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvdGVzdC9BbXJ3YkVuY1Rlc3RFbnZpcm9ubWVudC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3Rlc3QvQW1yd2JFbmNUZXN0RW52aXJvbm1lbnQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3Rlc3QvQW1yd2JFbmNvZGVyVGVzdC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3Rlc3QvQW1yd2JFbmNvZGVyVGVzdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy90ZXN0L0FtcndiRW5jb2RlclRlc3QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3Rlc3QvQW1yd2JFbmNvZGVyVGVzdC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3Rlc3QvQW5kcm9pZC5icApzaW1pbGFyaXR5IGluZGV4IDc0JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvdGVzdC9BbmRyb2lkLmJwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3Rlc3QvQW5kcm9pZC5icAppbmRleCA3MDQyYmM1Li5lNGI3NzcxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvdGVzdC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvdGVzdC9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwxNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX2FtcndiX2VuY19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX2FtcndiX2VuY19saWNlbnNlIiwKKyAgICBdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiQW1yd2JFbmNvZGVyVGVzdCIsCiAgICAgZ3Rlc3Q6IHRydWUsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3Rlc3QvQW5kcm9pZFRlc3QueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvdGVzdC9BbmRyb2lkVGVzdC54bWwKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvdGVzdC9BbmRyb2lkVGVzdC54bWwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy90ZXN0L1JFQURNRS5tZCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvdGVzdC9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy90ZXN0L1JFQURNRS5tZApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy90ZXN0L1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2c3MTEvZGVjb2Rlci9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2c3MTEvZGVjb2Rlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZjdlZDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJjb2RlY3NfZzcxMWRlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImc3MTFEZWNBbGF3LmNwcCIsCisgICAgICAgICJnNzExRGVjTWxhdy5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKKworICAgIGNmbGFnczogWyItV2Vycm9yIl0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisgICAgYXBleF9hdmFpbGFibGU6IFsiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyJdLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL2c3MTFEZWMuaCBiL21lZGlhL2NvZGVjcy9nNzExL2RlY29kZXIvZzcxMURlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMzU3YTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL2c3MTFEZWMuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBHNzExX0RFQ19IXworI2RlZmluZSBHNzExX0RFQ19IXworCisvKioKKyAqIEBmaWxlIGc3MTFEZWMuaAorICogQGJyaWVmIGc3MTEgRGVjb2RlciBBUEk6IERlY29kZUFMYXcgYW5kIERlY29kZU1MYXcKKyAqLworCisvKiogRGVjb2RlcyBpbnB1dCBieXRlcyBvZiBzaXplIGluU2l6ZSBhY2NvcmRpbmcgdG8gQUxBVworICoKKyAqIEBwYXJhbSBbaW5dIG91dCA8dHQ+aW50MTZfdCo8L3R0Pjogb3V0cHV0IGJ1ZmZlciB0byBiZSBmaWxsZWQgd2l0aCBkZWNvZGVkIGJ5dGVzLgorICogQHBhcmFtIFtpbl0gaW4gPHR0PmNvbnN0IHVpbnQ4X3QqPC90dD46IGlucHV0IGJ1ZmZlciBjb250YWluaW5nIGJ5dGVzIHRvIGJlIGRlY29kZWQuCisgKiBAcGFyYW0gW2luXSBpblNpemUgPHR0PnNpemVfdDwvdHQ+OiBzaXplIG9mIHRoZSBpbnB1dCBidWZmZXIuCisgKi8KK3ZvaWQgRGVjb2RlQUxhdyhpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKTsKKworLyoqIERlY29kZXMgaW5wdXQgYnl0ZXMgb2Ygc2l6ZSBpblNpemUgYWNjb3JkaW5nIHRvIE1MQVcKKyAqCisgKiBAcGFyYW0gW2luXSBvdXQgPHR0PmludDE2X3QqPC90dD46IG91dHB1dCBidWZmZXIgdG8gYmUgZmlsbGVkIHdpdGggZGVjb2RlZCBieXRlcy4KKyAqIEBwYXJhbSBbaW5dIGluIDx0dD5jb25zdCB1aW50OF90KjwvdHQ+OiBpbnB1dCBidWZmZXIgY29udGFpbmluZyBieXRlcyB0byBiZSBkZWNvZGVkLgorICogQHBhcmFtIFtpbl0gaW5TaXplIDx0dD5zaXplX3Q8L3R0Pjogc2l6ZSBvZiB0aGUgaW5wdXQgYnVmZmVyLgorICovCit2b2lkIERlY29kZU1MYXcoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSk7CisKKyNlbmRpZiAgLy8gRzcxMV9ERUNPREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL2c3MTFEZWNBbGF3LmNwcCBiL21lZGlhL2NvZGVjcy9nNzExL2RlY29kZXIvZzcxMURlY0FsYXcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MWE3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL2c3MTFEZWNBbGF3LmNwcApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit2b2lkIERlY29kZUFMYXcoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgeworICBpZiAob3V0ICE9IG51bGxwdHIgJiYgaW4gIT0gbnVsbHB0cikgeworICAgIHdoaWxlIChpblNpemUgPiAwKSB7CisgICAgICBpblNpemUtLTsKKyAgICAgIGludDMyX3QgeCA9ICppbisrOworCisgICAgICBpbnQzMl90IGl4ID0geCBeIDB4NTU7CisgICAgICBpeCAmPSAweDdmOworCisgICAgICBpbnQzMl90IGlleHAgPSBpeCA+PiA0OworICAgICAgaW50MzJfdCBtYW50ID0gaXggJiAweDBmOworCisgICAgICBpZiAoaWV4cCA+IDApIHsKKyAgICAgICAgbWFudCArPSAxNjsKKyAgICAgIH0KKworICAgICAgbWFudCA9IChtYW50IDw8IDQpICsgODsKKworICAgICAgaWYgKGlleHAgPiAxKSB7CisgICAgICAgIG1hbnQgPSBtYW50IDw8IChpZXhwIC0gMSk7CisgICAgICB9CisKKyAgICAgICpvdXQrKyA9ICh4ID4gMTI3KSA/IG1hbnQgOiAtbWFudDsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9nNzExL2RlY29kZXIvZzcxMURlY01sYXcuY3BwIGIvbWVkaWEvY29kZWNzL2c3MTEvZGVjb2Rlci9nNzExRGVjTWxhdy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIyY2FlYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9nNzExL2RlY29kZXIvZzcxMURlY01sYXcuY3BwCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3ZvaWQgRGVjb2RlTUxhdyhpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7CisgIGlmIChvdXQgIT0gbnVsbHB0ciAmJiBpbiAhPSBudWxscHRyKSB7CisgICAgd2hpbGUgKGluU2l6ZSA+IDApIHsKKyAgICAgIGluU2l6ZS0tOworICAgICAgaW50MzJfdCB4ID0gKmluKys7CisKKyAgICAgIGludDMyX3QgbWFudGlzc2EgPSB+eDsKKyAgICAgIGludDMyX3QgZXhwb25lbnQgPSAobWFudGlzc2EgPj4gNCkgJiA3OworICAgICAgaW50MzJfdCBzZWdtZW50ID0gZXhwb25lbnQgKyAxOworICAgICAgbWFudGlzc2EgJj0gMHgwZjsKKworICAgICAgaW50MzJfdCBzdGVwID0gNCA8PCBzZWdtZW50OworCisgICAgICBpbnQzMl90IGFicyA9ICgweDgwbCA8PCBleHBvbmVudCkgKyBzdGVwICogbWFudGlzc2EgKyBzdGVwIC8gMiAtIDQgKiAzMzsKKworICAgICAgKm91dCsrID0gKHggPCAweDgwKSA/IC1hYnMgOiBhYnM7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9nNzExL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NmNjZTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiZzcxMWFsYXdfZGVjX2Z1enplciIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAiZzcxMV9kZWNfZnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiY29kZWNzX2c3MTFkZWMiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREFMQVciLAorICAgIF0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiZzcxMW1sYXdfZGVjX2Z1enplciIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAiZzcxMV9kZWNfZnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiY29kZWNzX2c3MTFkZWMiLAorICAgIF0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2c3MTEvZnV6emVyL1JFQURNRS5tZCBiL21lZGlhL2NvZGVjcy9nNzExL2Z1enplci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMxYzM2YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9nNzExL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw0OSBAQAorIyBGdXp6ZXIgZm9yIGxpYnN0YWdlZnJpZ2h0X2c3MTFkZWMgZGVjb2RlcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgRzcxMSBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUKK2NvZGVjIGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK0c3MTEgc3VwcG9ydHMgdHdvIHR5cGVzIG9mIGRlY29kaW5nOgorMS4gRGVjb2RlQUxhdworMi4gRGVjb2RlTUxhdworCitUaGVzZSB0d28gZGVjb2RlciBBUEkncyBhcmUgZnV6emVkIHNlcGFyYXRlbHkgdXNpbmcgZzcxMWFsYXdfZGVjX2Z1enplciBhbmQKK2c3MTFtbGF3X2RlY19mdXp6ZXIgcmVzcGVjdGl2ZWx5LgorCisjIyMjIyBNYXhpbWl6ZSB1dGlsaXphdGlvbiBvZiBpbnB1dCBkYXRhCitUaGUgcGx1Z2luIGZlZWRzIHRoZSBlbnRpcmUgaW5wdXQgZGF0YSB0byB0aGUgY29kZWMgYXMgZXhwZWN0ZWQgYnkgZGVjb2RlciBBUEkuCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIGc3MTFhbGF3X2RlY19mdXp6ZXIgYW5kIGc3MTFtbGF3X2RlY19mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIGc3MTFhbGF3X2RlY19mdXp6ZXIKKyAgJCBtbSAtaiQobnByb2MpIGc3MTFtbGF3X2RlY19mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBnNzExIGZpbGVzIHRvIHRoYXQgZm9sZGVyCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L2c3MTFhbGF3X2RlY19mdXp6ZXIvZzcxMWFsYXdfZGVjX2Z1enplciBDT1JQVVNfRElSCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvZzcxMW1sYXdfZGVjX2Z1enplci9nNzExbWxhd19kZWNfZnV6emVyIENPUlBVU19ESVIKK2BgYAorVG8gcnVuIG9uIGhvc3QKK2BgYAorICAkICRBTkRST0lEX0hPU1RfT1VUL2Z1enoveDg2XzY0L2c3MTFhbGF3X2RlY19mdXp6ZXIvZzcxMWFsYXdfZGVjX2Z1enplciBDT1JQVVNfRElSCisgICQgJEFORFJPSURfSE9TVF9PVVQvZnV6ei94ODZfNjQvZzcxMW1sYXdfZGVjX2Z1enplci9nNzExbWxhd19kZWNfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIyBSZWZlcmVuY2VzOgorICogaHR0cDovL2xsdm0ub3JnL2RvY3MvTGliRnV6emVyLmh0bWwKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvb3NzLWZ1enoKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9nNzExL2Z1enplci9nNzExX2RlY19mdXp6ZXIuY3BwIGIvbWVkaWEvY29kZWNzL2c3MTEvZnV6emVyL2c3MTFfZGVjX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRmYmNmNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9nNzExL2Z1enplci9nNzExX2RlY19mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZzcxMURlYy5oIgorCitjbGFzcyBDb2RlYyB7CisgcHVibGljOgorICBDb2RlYygpID0gZGVmYXVsdDsKKyAgfkNvZGVjKCkgPSBkZWZhdWx0OworICB2b2lkIGRlY29kZUZyYW1lcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7Cit9OworCit2b2lkIENvZGVjOjpkZWNvZGVGcmFtZXMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgc2l6ZV90IG91dHB1dEJ1ZmZlclNpemUgPSBzaXplb2YoaW50MTZfdCkgKiBzaXplOworICBpbnQxNl90ICpvdXQgPSBuZXcgaW50MTZfdFtvdXRwdXRCdWZmZXJTaXplXTsKKyAgaWYgKCFvdXQpIHsKKyAgICByZXR1cm47CisgIH0KKyNpZmRlZiBBTEFXCisgIERlY29kZUFMYXcob3V0LCBkYXRhLCBzaXplKTsKKyNlbHNlCisgIERlY29kZU1MYXcob3V0LCBkYXRhLCBzaXplKTsKKyNlbmRpZgorICBkZWxldGVbXSBvdXQ7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKHNpemUgPCAxKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQ29kZWMgKmNvZGVjID0gbmV3IENvZGVjKCk7CisgIGlmICghY29kZWMpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBjb2RlYy0+ZGVjb2RlRnJhbWVzKGRhdGEsIHNpemUpOworICBkZWxldGUgY29kZWM7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL1RFU1RfTUFQUElORyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzZmYxYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9URVNUX01BUFBJTkcKQEAgLTAsMCArMSwxOCBAQAorLy8gbWFwcGluZ3MgZm9yIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzCit7CisgIC8vIHRlc3RzIHdoaWNoIHJlcXVpcmUgZHluYW1pYyBjb250ZW50CisgIC8vIGludm9rZSB3aXRoOiBhdGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCisgIC8vIFRPRE8oYi8xNDgwOTQwNTkpOiB1bml0IHRlc3RzIG5vdCBhbGxvd2VkIHRvIGRvd25sb2FkIGNvbnRlbnQKKyAgImR5bmFtaWMtcHJlc3VibWl0IjogWworCisgICAgLy8gdGhlIGRlY29kZXIgcmVwb3J0cyBzb21ldGhpbmcgYmFkIGFib3V0IGFuIHVuZXhwZWN0ZWQgbmV3bGluZSBpbiB0aGUgKmNvbmZpZyBmaWxlCisgICAgLy8gYW5kIHRoZSBjb25maWcgZmlsZSBsb29rcyBsaWtlIHRoZSBBbmRyb2lkVGVzdC54bWwgZmlsZSB0aGF0IHdlIHB1dCBpbiB0aGVyZS4KKyAgICAvLyBJIGRvbid0IGdldCB0aGlzIGZyb20gdGhlIEVuY29kZXIgLS0gYW5kIEkgZG9uJ3Qgc2VlIGFueSBzdWJzdGFudGl2ZSBkaWZmZXJlbmNlCisgICAgLy8gYmV0d2VlbiBkZWNvZGUgYW5kIGVuY29kZSBBbmRyb2lkVGVzdC54bWwgZmlsZXMgLS0gZXhjZXB0IHRoYXQgZW5jb2RlIGRvZXMgTk9UCisgICAgLy8gZmluaXNoIHdpdGggYSBuZXdsaW5lLgorICAgIC8vIHN0cmFuZ2UuCisgICAgeyAibmFtZSI6ICJNcGVnNEgyNjNEZWNvZGVyVGVzdCJ9LAorICAgIHsgIm5hbWUiOiAiTXBlZzRIMjYzRW5jb2RlclRlc3QifQorCisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzhkMGUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzYgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfbTR2X2gyNjNfZGVjX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjc19tNHZfaDI2M19kZWNfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmxvZyJdLAorCisgICAgc3JjczogWworICAgICAgICAic3JjL2JpdHN0cmVhbS5jcHAiLAorICAgICAgICAic3JjL2Jsb2NrX2lkY3QuY3BwIiwKKyAgICAgICAgInNyYy9jYWxfZGNfc2NhbGVyLmNwcCIsCisgICAgICAgICJzcmMvY29tYmluZWRfZGVjb2RlLmNwcCIsCisgICAgICAgICJzcmMvY29uY2VhbC5jcHAiLAorICAgICAgICAic3JjL2RhdGFwYXJ0X2RlY29kZS5jcHAiLAorICAgICAgICAic3JjL2RjYWNfcHJlZGljdGlvbi5jcHAiLAorICAgICAgICAic3JjL2RlY19wcmVkX2ludHJhX2RjLmNwcCIsCisgICAgICAgICJzcmMvZ2V0X3ByZWRfYWR2X2JfYWRkLmNwcCIsCisgICAgICAgICJzcmMvZ2V0X3ByZWRfb3V0c2lkZS5jcHAiLAorICAgICAgICAic3JjL2lkY3QuY3BwIiwKKyAgICAgICAgInNyYy9pZGN0X3ZjYS5jcHAiLAorICAgICAgICAic3JjL21iX21vdGlvbl9jb21wLmNwcCIsCisgICAgICAgICJzcmMvbWJfdXRpbHMuY3BwIiwKKyAgICAgICAgInNyYy9wYWNrZXRfdXRpbC5jcHAiLAorICAgICAgICAic3JjL3Bvc3RfZmlsdGVyLmNwcCIsCisgICAgICAgICJzcmMvcHZkZWNfYXBpLmNwcCIsCisgICAgICAgICJzcmMvc2NhbGluZ190YWIuY3BwIiwKKyAgICAgICAgInNyYy92bGNfZGVjb2RlLmNwcCIsCisgICAgICAgICJzcmMvdmxjX2RlcXVhbnQuY3BwIiwKKyAgICAgICAgInNyYy92bGNfdGFiLmNwcCIsCisgICAgICAgICJzcmMvdm9wLmNwcCIsCisgICAgICAgICJzcmMvemlnemFnX3RhYi5jcHAiLAorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9OT1RJQ0UgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9OT1RJQ0UKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL2luY2x1ZGUvbTR2aDI2M19kZWNvZGVyX3B2X3R5cGVzLmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL2luY2x1ZGUvbTR2aDI2M19kZWNvZGVyX3B2X3R5cGVzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvaW5jbHVkZS9tNHZoMjYzX2RlY29kZXJfcHZfdHlwZXMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9pbmNsdWRlL200dmgyNjNfZGVjb2Rlcl9wdl90eXBlcy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL2luY2x1ZGUvbXA0ZGVjX2FwaS5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9pbmNsdWRlL21wNGRlY19hcGkuaApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL2luY2x1ZGUvbXA0ZGVjX2FwaS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL2luY2x1ZGUvbXA0ZGVjX2FwaS5oCmluZGV4IDFmNDA0Y2UuLjA2YWVlMDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvaW5jbHVkZS9tcDRkZWNfYXBpLmgKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9pbmNsdWRlL21wNGRlY19hcGkuaApAQCAtNDIsMTMgKzQyLDYgQEAKICNkZWZpbmUgT1NDTF9FWFBPUlRfUkVGIC8qIGVtcHR5ICovCiAjZW5kaWYKIAotLyogZmxhZyBmb3IgcG9zdC1wcm9jZXNzaW5nICA0LzI1LzAwICovCi0KLSNpZmRlZiBERUNfTk9QT1NUUFJPQwotI3VuZGVmIFBWX1BPU1RQUk9DX09OICAgLyogZW5hYmxlIGNvbXBpbGF0aW9uIG9mIHBvc3QtcHJvY2Vzc2luZyBjb2RlICovCi0jZWxzZQotI2RlZmluZSBQVl9QT1NUUFJPQ19PTgotI2VuZGlmCiAKICNkZWZpbmUgUFZfTk9fUE9TVF9QUk9DIDAKICNkZWZpbmUgUFZfREVCTE9DSyAxCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL2luY2x1ZGUvdmlzdWFsX2hlYWRlci5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9pbmNsdWRlL3Zpc3VhbF9oZWFkZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9pbmNsdWRlL3Zpc3VhbF9oZWFkZXIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9pbmNsdWRlL3Zpc3VhbF9oZWFkZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYml0c3RyZWFtLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2JpdHN0cmVhbS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2JpdHN0cmVhbS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2JpdHN0cmVhbS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2JpdHN0cmVhbS5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYml0c3RyZWFtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2JpdHN0cmVhbS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9iaXRzdHJlYW0uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9ibG9ja19pZGN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9ibG9ja19pZGN0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKaW5kZXggM2QxMDA4Ni4uYmM3MDhlMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKQEAgLTUwNiw2ICs1MDYsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA7IEZ1bmN0aW9uIENvZGUgRk9SIGlkY3Ryb3cKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0cm93KAogICAgIGludDE2ICpibGssIHVpbnQ4ICpwcmVkLCB1aW50OCAqZHN0LCBpbnQgd2lkdGgKICkKQEAgLTgyOCw2ICs4MjksNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA7IEZ1bmN0aW9uIENvZGUgRk9SIGlkY3Rjb2wKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0Y29sKAogICAgIGludDE2ICpibGsKICkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NhbF9kY19zY2FsZXIuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY2FsX2RjX3NjYWxlci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NhbF9kY19zY2FsZXIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jYWxfZGNfc2NhbGVyLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY29tYmluZWRfZGVjb2RlLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NvbWJpbmVkX2RlY29kZS5jcHAKc2ltaWxhcml0eSBpbmRleCA4OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY29tYmluZWRfZGVjb2RlLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY29tYmluZWRfZGVjb2RlLmNwcAppbmRleCA2NDk5MjMzLi43MmNiZTgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jb21iaW5lZF9kZWNvZGUuY3BwCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NvbWJpbmVkX2RlY29kZS5jcHAKQEAgLTU0NCwzMCArNTQ0LDEyIEBACiAgICAgaW50MTYgRENfY29lZmY7CiAgICAgUFZfU1RBVFVTIHN0YXR1czsKIAotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgLyogcG9zdC1wcm9jZXNzaW5nICovCi0gICAgdWludDggKnBwX21vZFs2XTsKLSAgICBpbnQgVG90YWxNQiA9IHZpZGVvLT5uVG90YWxNQjsKLSAgICBpbnQgTUJfaW5fd2lkdGggPSB2aWRlby0+bk1CUGVyUm93OwotI2VuZGlmCiAgICAgaW50IHlfcG9zID0gdmlkZW8tPm1ibnVtX3JvdzsKICAgICBpbnQgeF9wb3MgPSB2aWRlby0+bWJudW1fY29sOwogICAgIGludDMyIG9mZnNldCA9IChpbnQzMikoeV9wb3MgPDwgNCkgKiB3aWR0aCArICh4X3BvcyA8PCA0KTsKIAogICAgIC8qIERlY29kZSBlYWNoIDgtYnktOCBibG9ja3MuIGNvbXAgMCB+IDMgYXJlIGx1bWluYW5jZSBibG9ja3MsIDQgfiA1ICovCiAgICAgLyogIGFyZSBjaHJvbWluYW5jZSBibG9ja3MuICAgMDQvMDMvMjAwMC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICB7Ci0gICAgICAgIC8qKiBwb3N0LXByb2Nlc3NpbmcgKioqLwotICAgICAgICBwcF9tb2RbMF0gPSB2aWRlby0+cHN0cHJjVHlwQ3VyICsgKHlfcG9zIDw8IDEpICogKE1CX2luX3dpZHRoIDw8IDEpICsgKHhfcG9zIDw8IDEpOwotICAgICAgICBwcF9tb2RbMV0gPSBwcF9tb2RbMF0gKyAxOwotICAgICAgICBwcF9tb2RbMl0gPSBwcF9tb2RbMF0gKyAoTUJfaW5fd2lkdGggPDwgMSk7Ci0gICAgICAgIHBwX21vZFszXSA9IHBwX21vZFsyXSArIDE7Ci0gICAgICAgIHBwX21vZFs0XSA9IHZpZGVvLT5wc3RwcmNUeXBDdXIgKyAoVG90YWxNQiA8PCAyKSArIG1ibnVtOwotICAgICAgICBwcF9tb2RbNV0gPSBwcF9tb2RbNF0gKyBUb3RhbE1COwotICAgIH0KLSNlbmRpZgogCiAgICAgLyogIG9zY2xfbWVtc2V0KG1ibG9jay0+YmxvY2ssIDAsIHNpemVvZih0eXBlTUJTdG9yZSkpOyAgICBBdWcgOSwyMDA1ICovCiAKQEAgLTY0NSwxMCArNjI3LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5vX2NvZWZmW2NvbXBdID0gbmNvZWZmc1tjb21wXTsKIAotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kW2NvbXBdID0gKHVpbnQ4KSBQb3N0UHJvY1NlbWFwaG9yZShkYXRhQmxvY2spOwotI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgTUJsb2NrSURDVCh2aWRlbyk7CiAgICAgfQpAQCAtNjc3LDIwICs2NTUsNiBAQAogICAgICAgICAgICAgICAgIEJsb2NrSURDVChjX2NvbXAgKyAoY29tcCYyKSood2lkdGggPDwgMikgKyA4Kihjb21wJjEpLCBtYmxvY2stPnByZWRfYmxvY2sgKyAoY29tcCYyKSo2NCArIDgqKGNvbXAmMSksIG1ibG9jay0+YmxvY2tbY29tcF0sIHdpZHRoLCBuY29lZmZzW2NvbXBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPmJpdG1hcGNvbFtjb21wXSwgbWJsb2NrLT5iaXRtYXByb3dbY29tcF0pOwogCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgICAgICAvKiBmb3IgaW50ZXIganVzdCB0ZXN0IGZvciByaW5naW5nICovCi0gICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgICAgICpwcF9tb2RbY29tcF0gPSAodWludDgpKChuY29lZmZzW2NvbXBdID4gMykgPyA0IDogMCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBubyBJRENUIGZvciBhbGwgemVyb3MgYmxvY2tzICAwMy8yOC8yMDAyICovCi0gICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgIEJsb2NrSURDVCgpOyAgICAgICAgICAgICAgICAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgICAgICpwcF9tb2RbY29tcF0gPSAwOwotI2VuZGlmCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNzA3LDIwICs2NzEsNiBAQAogICAgICAgICAgICAgQmxvY2tJRENUKHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeF9wb3MgPDwgMiksIG1ibG9jay0+cHJlZF9ibG9jayArIDI1NiwgbWJsb2NrLT5ibG9ja1s0XSwgd2lkdGggPj4gMSwgbmNvZWZmc1s0XSwKICAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPmJpdG1hcGNvbFs0XSwgbWJsb2NrLT5iaXRtYXByb3dbNF0pOwogCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgIC8qIGZvciBpbnRlciBqdXN0IHRlc3QgZm9yIHJpbmdpbmcgKi8KLSAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICpwcF9tb2RbNF0gPSAodWludDgpKChuY29lZmZzWzRdID4gMykgPyA0IDogMCk7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIG5vIElEQ1QgZm9yIGFsbCB6ZXJvcyBibG9ja3MgIDAzLzI4LzIwMDIgKi8KLSAgICAgICAgICAgIC8qICAgICAgICAgICAgICBCbG9ja0lEQ1QoKTsgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgKnBwX21vZFs0XSA9IDA7Ci0jZW5kaWYKICAgICAgICAgfQogICAgICAgICAoKkRDKVs1XSA9IG1pZF9ncmF5OwogICAgICAgICBpZiAoQ0JQICYgMSkKQEAgLTczMSwyMCArNjgxLDYgQEAKICAgICAgICAgICAgIEJsb2NrSURDVCh2aWRlby0+Y3VyclZvcC0+dkNoYW4gKyAob2Zmc2V0ID4+IDIpICsgKHhfcG9zIDw8IDIpLCBtYmxvY2stPnByZWRfYmxvY2sgKyAyNjQsIG1ibG9jay0+YmxvY2tbNV0sIHdpZHRoID4+IDEsIG5jb2VmZnNbNV0sCiAgICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbNV0sIG1ibG9jay0+Yml0bWFwcm93WzVdKTsKIAotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICAvKiBmb3IgaW50ZXIganVzdCB0ZXN0IGZvciByaW5naW5nICovCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kWzVdID0gKHVpbnQ4KSgobmNvZWZmc1s1XSA+IDMpID8gNCA6IDApOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBubyBJRENUIGZvciBhbGwgemVyb3MgYmxvY2tzICAwMy8yOC8yMDAyICovCi0gICAgICAgICAgICAvKiAgICAgICAgICAgICAgQmxvY2tJRENUKCk7ICAgICAgICAgICAgICAgICovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICpwcF9tb2RbNV0gPSAwOwotI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgdmlkZW8tPlFQTUJbbWJudW1dID0gUVA7ICAvKiByZXN0b3JlIHRoZSBRUCB2YWx1ZXMgIEFOTkVYX1QqLwogI2Vsc2UKQEAgLTc1OSwyMCArNjk1LDYgQEAKICAgICAgICAgICAgICAgICBCbG9ja0lEQ1QoY19jb21wICsgKGNvbXAmMikqKHdpZHRoIDw8IDIpICsgOCooY29tcCYxKSwgbWJsb2NrLT5wcmVkX2Jsb2NrICsgKGNvbXAmMikqNjQgKyA4Kihjb21wJjEpLCBtYmxvY2stPmJsb2NrW2NvbXBdLCB3aWR0aCwgbmNvZWZmc1tjb21wXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbY29tcF0sIG1ibG9jay0+Yml0bWFwcm93W2NvbXBdKTsKIAotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICAgICAgLyogZm9yIGludGVyIGp1c3QgdGVzdCBmb3IgcmluZ2luZyAqLwotICAgICAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICAgICAqcHBfbW9kW2NvbXBdID0gKHVpbnQ4KSgobmNvZWZmc1tjb21wXSA+IDMpID8gNCA6IDApOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogbm8gSURDVCBmb3IgYWxsIHplcm9zIGJsb2NrcyAgMDMvMjgvMjAwMiAqLwotICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICBCbG9ja0lEQ1QoKTsgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICAgICAqcHBfbW9kW2NvbXBdID0gMDsKLSNlbmRpZgogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTc4NSwyMCArNzA3LDExIEBACiAgICAgICAgICAgICBCbG9ja0lEQ1QodmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKG9mZnNldCA+PiAyKSArICh4X3BvcyA8PCAyKSwgbWJsb2NrLT5wcmVkX2Jsb2NrICsgMjU2LCBtYmxvY2stPmJsb2NrWzRdLCB3aWR0aCA+PiAxLCBuY29lZmZzWzRdLAogICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sWzRdLCBtYmxvY2stPmJpdG1hcHJvd1s0XSk7CiAKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgLyogZm9yIGludGVyIGp1c3QgdGVzdCBmb3IgcmluZ2luZyAqLwotICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgKnBwX21vZFs0XSA9ICh1aW50OCkoKG5jb2VmZnNbNF0gPiAzKSA/IDQgOiAwKTsKLSNlbmRpZgogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgLyogbm8gSURDVCBmb3IgYWxsIHplcm9zIGJsb2NrcyAgMDMvMjgvMjAwMiAqLwogICAgICAgICAgICAgLyogICAgICAgICAgICAgIEJsb2NrSURDVCgpOyAgICAgICAgICAgICAgICAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kWzRdID0gMDsKLSNlbmRpZgogICAgICAgICB9CiAgICAgICAgICgqREMpWzVdID0gbWlkX2dyYXk7CiAgICAgICAgIGlmIChDQlAgJiAxKQpAQCAtODA5LDIwICs3MjIsMTEgQEAKICAgICAgICAgICAgIEJsb2NrSURDVCh2aWRlby0+Y3VyclZvcC0+dkNoYW4gKyAob2Zmc2V0ID4+IDIpICsgKHhfcG9zIDw8IDIpLCBtYmxvY2stPnByZWRfYmxvY2sgKyAyNjQsIG1ibG9jay0+YmxvY2tbNV0sIHdpZHRoID4+IDEsIG5jb2VmZnNbNV0sCiAgICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbNV0sIG1ibG9jay0+Yml0bWFwcm93WzVdKTsKIAotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICAvKiBmb3IgaW50ZXIganVzdCB0ZXN0IGZvciByaW5naW5nICovCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kWzVdID0gKHVpbnQ4KSgobmNvZWZmc1s1XSA+IDMpID8gNCA6IDApOwotI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CiAgICAgICAgICAgICAvKiBubyBJRENUIGZvciBhbGwgemVyb3MgYmxvY2tzICAwMy8yOC8yMDAyICovCiAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgQmxvY2tJRENUKCk7ICAgICAgICAgICAgICAgICovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICpwcF9tb2RbNV0gPSAwOwotI2VuZGlmCiAjZW5kaWYgIC8vIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NvbmNlYWwuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY29uY2VhbC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NvbmNlYWwuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jb25jZWFsLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGF0YXBhcnRfZGVjb2RlLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RhdGFwYXJ0X2RlY29kZS5jcHAKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGF0YXBhcnRfZGVjb2RlLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGF0YXBhcnRfZGVjb2RlLmNwcAppbmRleCAwMGRiMDRiLi42MDcxZjQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kYXRhcGFydF9kZWNvZGUuY3BwCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RhdGFwYXJ0X2RlY29kZS5jcHAKQEAgLTYzNSwyOSArNjM1LDkgQEAKICAgICBpbnQgUVBfdG1wID0gUVA7CiAKICAgICBpbnQgeV9wb3MgPSB2aWRlby0+bWJudW1fcm93OwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgdWludDggKnBwX21vZFs2XTsKLSAgICBpbnQgVG90YWxNQiA9IHZpZGVvLT5uVG90YWxNQjsKLSAgICBpbnQgTUJfaW5fd2lkdGggPSB2aWRlby0+bk1CUGVyUm93OwotI2VuZGlmCiAKIAogCi0gICAgLyoqKioqCi0gICAgKiAgICAgRGVjb2Rpbmcgb2YgdGhlIDYgYmxvY2tzIChkZXBlbmRpbmcgb24gdHJhbnNwYXJlbnQgcGF0dGVybikKLSAgICAqKioqKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgIHsKLSAgICAgICAgLyoqIHBvc3QtcHJvY2Vzc2luZyAqKiovCi0gICAgICAgIHBwX21vZFswXSA9IHZpZGVvLT5wc3RwcmNUeXBDdXIgKyAoeV9wb3MgPDwgMSkgKiAoTUJfaW5fd2lkdGggPDwgMSkgKyAoeF9wb3MgPDwgMSk7Ci0gICAgICAgIHBwX21vZFsxXSA9IHBwX21vZFswXSArIDE7Ci0gICAgICAgIHBwX21vZFsyXSA9IHBwX21vZFswXSArIChNQl9pbl93aWR0aCA8PCAxKTsKLSAgICAgICAgcHBfbW9kWzNdID0gcHBfbW9kWzJdICsgMTsKLSAgICAgICAgcHBfbW9kWzRdID0gdmlkZW8tPnBzdHByY1R5cEN1ciArIChUb3RhbE1CIDw8IDIpICsgbWJudW07Ci0gICAgICAgIHBwX21vZFs1XSA9IHBwX21vZFs0XSArIFRvdGFsTUI7Ci0gICAgfQotI2VuZGlmCiAKICAgICAvKiAgb3NjbF9tZW1zZXQobWJsb2NrLT5ibG9jaywgMCwgc2l6ZW9mKHR5cGVNQlN0b3JlKSk7ICAgIEF1ZyA5LDIwMDUgKi8KIApAQCAtNjk4LDEwICs2NzgsNiBAQAogICAgICAgICAgICAgLyogIG1vZGlmaWVkIHRvIG5ldyBzZW1hcGhvcmUgZm9yIHBvc3QtcHJvYyAqLwogICAgICAgICAgICAgLy8gRnV0dXJlIHdvcms6OiBjYW4gYmUgY29tYmluZWQgaW4gdGhlIGRlcXVhbnQgZnVuY3Rpb24KICAgICAgICAgICAgIC8vIEB0b2RvIERlYmxvY2tpbmcgU2VtYXBob3JlIGZvciBJTlRSQSBibG9jawotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kW2NvbXBdID0gKHVpbnQ4KSBQb3N0UHJvY1NlbWFwaG9yZShkYXRhQmxvY2spOwotI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgTUJsb2NrSURDVCh2aWRlbyk7CiAgICAgfQpAQCAtNzM4LDEwICs3MTQsNiBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKiAgQHRvZG8gRGVibG9ja2luZyBTZW1hcGhvcmUgZm9yIElOVFJBIGJsb2NrLCBmb3IgaW50ZXIganVzdCB0ZXN0IGZvciByaW5naW5nICAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kW2NvbXBdID0gKHVpbnQ4KSgobmNvZWZmc1tjb21wXSA+IDMpID8gNCA6IDApOwotI2VuZGlmCiAgICAgICAgIH0KIAogICAgICAgICAoKkRDKVs0XSA9IG1pZF9ncmF5OwpAQCAtNzYwLDEwICs3MzIsNiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBuY29lZmZzWzRdID0gMDsKICAgICAgICAgfQotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgKnBwX21vZFs0XSA9ICh1aW50OCkoKG5jb2VmZnNbNF0gPiAzKSA/IDQgOiAwKTsKLSNlbmRpZgogICAgICAgICAoKkRDKVs1XSA9IG1pZF9ncmF5OwogICAgICAgICBpZiAoQ0JQICYgMSkKICAgICAgICAgewpAQCAtNzgwLDEwICs3NDgsNiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBuY29lZmZzWzVdID0gMDsKICAgICAgICAgfQotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgKnBwX21vZFs1XSA9ICh1aW50OCkoKG5jb2VmZnNbNV0gPiAzKSA/IDQgOiAwKTsKLSNlbmRpZgogCiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGNhY19wcmVkaWN0aW9uLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RjYWNfcHJlZGljdGlvbi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RjYWNfcHJlZGljdGlvbi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RjYWNfcHJlZGljdGlvbi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RlY19wcmVkX2ludHJhX2RjLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RlY19wcmVkX2ludHJhX2RjLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGVjX3ByZWRfaW50cmFfZGMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kZWNfcHJlZF9pbnRyYV9kYy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2dldF9wcmVkX2Fkdl9iX2FkZC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9nZXRfcHJlZF9hZHZfYl9hZGQuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9nZXRfcHJlZF9hZHZfYl9hZGQuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9nZXRfcHJlZF9hZHZfYl9hZGQuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9nZXRfcHJlZF9vdXRzaWRlLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2dldF9wcmVkX291dHNpZGUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9nZXRfcHJlZF9vdXRzaWRlLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZ2V0X3ByZWRfb3V0c2lkZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2lkY3QuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvaWRjdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2lkY3QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9pZGN0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvaWRjdC5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvaWRjdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9pZGN0LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2lkY3QuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvaWRjdF92Y2EuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvaWRjdF92Y2EuY3BwCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2lkY3RfdmNhLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvaWRjdF92Y2EuY3BwCmluZGV4IGYzNWNlNGYuLmRiYWY1ZDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2lkY3RfdmNhLmNwcAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9pZGN0X3ZjYS5jcHAKQEAgLTM3LDYgKzM3LDcgQEAKICAgICByZXR1cm4gOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Ryb3cxKGludDE2ICpibGssIHVpbnQ4ICpwcmVkLCB1aW50OCAqZHN0LCBpbnQgd2lkdGgpCiB7CiAgICAgLyogc2hvcnRjdXQgKi8KQEAgLTk0LDYgKzk1LDcgQEAKICAgICByZXR1cm47CiB9CiAKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdHJvdzIoaW50MTYgKmJsaywgdWludDggKnByZWQsIHVpbnQ4ICpkc3QsIGludCB3aWR0aCkKIHsKICAgICBpbnQzMiB4MCwgeDEsIHgyLCB4NCwgeDU7CkBAIC0xNTUsNiArMTU3LDcgQEAKICAgICByZXR1cm4gOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Rjb2wyKGludDE2ICpibGspCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MywgeDUsIHg3Oy8vLCB4ODsKQEAgLTE4Miw2ICsxODUsNyBAQAogICAgIHJldHVybiA7CiB9CiAKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdHJvdzMoaW50MTYgKmJsaywgdWludDggKnByZWQsIHVpbnQ4ICpkc3QsIGludCB3aWR0aCkKIHsKICAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwpAQCAtMjU0LDYgKzI1OCw3IEBACiAgICAgcmV0dXJuIDsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0Y29sMyhpbnQxNiAqYmxrKQogewogICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CkBAIC0yOTEsNiArMjk2LDcgQEAKIH0KIAogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Ryb3c0KGludDE2ICpibGssIHVpbnQ4ICpwcmVkLCB1aW50OCAqZHN0LCBpbnQgd2lkdGgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKQEAgLTM2OCw2ICszNzQsNyBAQAogICAgIHJldHVybiA7CiB9CiAKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdGNvbDQoaW50MTYgKmJsaykKIHsKICAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwpAQCAtNDQ1LDYgKzQ1Miw3IEBACiAgICAgcmV0dXJuOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Ryb3cyX2ludHJhKGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDQsIHg1LCB0ZW1wOwpAQCAtNTAyLDYgKzUxMCw3IEBACiAgICAgcmV0dXJuIDsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0cm93M19pbnRyYShpbnQxNiAqYmxrLCBQSVhFTCAqY29tcCwgaW50IHdpZHRoKQogewogICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDgsIHRlbXA7CkBAIC01NzUsNiArNTg0LDcgQEAKICAgICByZXR1cm4gOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Ryb3c0X2ludHJhKGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4OCwgdGVtcDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21heF9sZXZlbC5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbWF4X2xldmVsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21heF9sZXZlbC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tYXhfbGV2ZWwuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbWJfbW90aW9uX2NvbXAuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbWJfbW90aW9uX2NvbXAuY3BwCnNpbWlsYXJpdHkgaW5kZXggODclCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21iX21vdGlvbl9jb21wLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbWJfbW90aW9uX2NvbXAuY3BwCmluZGV4IDg3NzcyM2QuLjc5NzYwZjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21iX21vdGlvbl9jb21wLmNwcAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tYl9tb3Rpb25fY29tcC5jcHAKQEAgLTE1NCwxNCArMTU0LDYgQEAKICAgICBpbnQgeHByZWQsIHlwcmVkOwogICAgIGludCB4c3VtOwogICAgIGludCByb3VuZDE7Ci0jaWZkZWYgUFZfUE9TVFBST0NfT04gLy8gMi8xNC8yMDAxICAgICAgCi0gICAgLyogVG90YWwgbnVtYmVyIG9mIHBpeGVscyBpbiB0aGUgVk9MICovCi0gICAgaW50MzIgc2l6ZSA9IChpbnQzMikgdmlkZW8tPm5Ub3RhbE1CIDw8IDg7Ci0gICAgdWludDggKnBwX2RlY195LCAqcHBfZGVjX3U7Ci0gICAgaW50IGxsWzRdOwotICAgIGludCB0bXAgPSAwOwotICAgIHVpbnQ4IG1za19kZWJsb2NrID0gMDsKLSNlbmRpZgogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC00MDQsNDMgKzM5Niw2IEBACiAgICAgLyogQ2FsbCBmdW5jdGlvbiB0byBzZXQgZGUtYmxvY2tpbmcgYW5kIGRlLXJpbmdpbmcgKi8KICAgICAvKiAgIHNlbWFwaG9yZXMgZm9yIGx1bWluYW5jZSAgICAgICAgICAgICAgICAgICAgICAqLwogCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICB7Ci0gICAgICAgIGlmIChtb2RlJklOVEVSXzFWTUFTSykKLSAgICAgICAgewotICAgICAgICAgICAgcHBfZGVjX3kgPSB2aWRlby0+cHN0cHJjVHlwQ3VyICsgaW12OwotICAgICAgICAgICAgbGxbMF0gPSAxOwotICAgICAgICAgICAgbGxbMV0gPSBtdndpZHRoIC0gMTsKLSAgICAgICAgICAgIGxsWzJdID0gMTsKLSAgICAgICAgICAgIGxsWzNdID0gLW12d2lkdGggLSAxOwotICAgICAgICAgICAgbXNrX2RlYmxvY2sgPSBwcF9zZW1hcGhvcmVfbHVtYSh4cHJlZCwgeXByZWQsIHBwX2RlY195LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+cHN0cHJjVHlwUHJ2LCBsbCwgJnRtcCwgcHhbMF0sIHB5WzBdLCBtdndpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTsKLQotICAgICAgICAgICAgcHBfZGVjX3UgPSB2aWRlby0+cHN0cHJjVHlwQ3VyICsgKHNpemUgPj4gNikgKwotICAgICAgICAgICAgICAgICAgICAgICAoKGltdiArICh4cG9zID4+IDMpKSA+PiAyKTsKLQotICAgICAgICAgICAgcHBfc2VtYXBob3JlX2Nocm9tYV9pbnRlcih4cHJlZCwgeXByZWQsIHBwX2RlY191LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+cHN0cHJjVHlwUHJ2LCBkeCwgZHksIG12d2lkdGgsIGhlaWdodCwgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wLCBtc2tfZGVibG9jayk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBQb3N0LXByb2Nlc3NpbmcgbW9kZSAoTUJNX0lOVEVSOCkgKi8KLSAgICAgICAgICAgIC8qIGRlYmxvY2tpbmcgYW5kIGRlcmluZ2luZykgKi8KLSAgICAgICAgICAgIHBwX2RlY195ID0gdmlkZW8tPnBzdHByY1R5cEN1ciArIGltdjsKLSAgICAgICAgICAgICpwcF9kZWNfeSA9IDQ7Ci0gICAgICAgICAgICAqKHBwX2RlY195ICsgMSkgPSA0OwotICAgICAgICAgICAgKihwcF9kZWNfeSArIG12d2lkdGgpID0gNDsKLSAgICAgICAgICAgICoocHBfZGVjX3kgKyBtdndpZHRoICsgMSkgPSA0OwotICAgICAgICAgICAgcHBfZGVjX3UgPSB2aWRlby0+cHN0cHJjVHlwQ3VyICsgKHNpemUgPj4gNikgKwotICAgICAgICAgICAgICAgICAgICAgICAoKGltdiArICh4cG9zID4+IDMpKSA+PiAyKTsKLSAgICAgICAgICAgICpwcF9kZWNfdSA9IDQ7Ci0gICAgICAgICAgICBwcF9kZWNfdVtzaXplPj44XSA9IDQ7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKIAogCiAgICAgLyogeHByZWQgYW5kIHlwcmVkIGNhbGN1bGF0aW9uIGZvciBDaHJvbWluYW5jZSBpcyAqLwpAQCAtNTY2LDEzICs1MjEsNiBAQAogICAgIFBJWEVMICpjdl9jb21wLCAqY3ZfcHJldjsKICAgICBpbnQgd2lkdGgsIHdpZHRoX3V2OwogICAgIGludDMyIG9mZnNldDsKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTiAvLyAyLzE0LzIwMDEgICAgICAKLSAgICBpbnQgaW12OwotICAgIGludDMyIHNpemUgPSAoaW50MzIpIHZpZGVvLT5uVG90YWxNQiA8PCA4OwotICAgIHVpbnQ4ICpwcF9kZWNfeSwgKnBwX2RlY191OwotICAgIHVpbnQ4ICpwcF9wcmV2MTsKLSAgICBpbnQgbXZ3aWR0aCA9IHZpZGVvLT5uTUJQZXJSb3cgPDwgMTsKLSNlbmRpZgogCiAgICAgd2lkdGggPSB2aWRlby0+d2lkdGg7CiAgICAgd2lkdGhfdXYgID0gd2lkdGggPj4gMTsKQEAgLTYwOSwyOCArNTU3LDYgQEAKICAgICBQdXRTS0lQUEVEX0IoY3ZfY29tcCwgY3ZfcHJldiwgd2lkdGhfdXYpOwogCiAgICAgLyogIDEwLzI0LzIwMDAgcG9zdF9wcm9jZXNzaW5nIHNlbWFwaG9yZSBnZW5lcmF0aW9uICovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04gLy8gMi8xNC8yMDAxCi0gICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgewotICAgICAgICBpbXYgPSAob2Zmc2V0ID4+IDYpIC0gKHhwb3MgPj4gNikgKyAoeHBvcyA+PiAzKTsKLSAgICAgICAgLyogUG9zdC1wcm9jZXNzaW5nIG1vZGUgKGNvcHkgcHJldmlvdXMgTUIpICovCi0gICAgICAgIHBwX3ByZXYxID0gdmlkZW8tPnBzdHByY1R5cFBydiArIGltdjsKLSAgICAgICAgcHBfZGVjX3kgPSB2aWRlby0+cHN0cHJjVHlwQ3VyICsgaW12OwotICAgICAgICAqcHBfZGVjX3kgPSAqcHBfcHJldjE7Ci0gICAgICAgICoocHBfZGVjX3kgKyAxKSA9ICoocHBfcHJldjEgKyAxKTsKLSAgICAgICAgKihwcF9kZWNfeSArIG12d2lkdGgpID0gKihwcF9wcmV2MSArIG12d2lkdGgpOwotICAgICAgICAqKHBwX2RlY195ICsgbXZ3aWR0aCArIDEpID0gKihwcF9wcmV2MSArIG12d2lkdGggKyAxKTsKLQotICAgICAgICAvKiBjaHJvbWluYW5jZSAqLwotICAgICAgICAvKjQqTUJfaW5fd2lkdGgqTUJfaW5faGVpZ2h0Ki8KLSAgICAgICAgcHBfcHJldjEgPSB2aWRlby0+cHN0cHJjVHlwUHJ2ICsgKHNpemUgPj4gNikgKwotICAgICAgICAgICAgICAgICAgICgoaW12ICsgKHhwb3MgPj4gMykpID4+IDIpOwotICAgICAgICBwcF9kZWNfdSA9IHZpZGVvLT5wc3RwcmNUeXBDdXIgKyAoc2l6ZSA+PiA2KSArCi0gICAgICAgICAgICAgICAgICAgKChpbXYgKyAoeHBvcyA+PiAzKSkgPj4gMik7Ci0gICAgICAgICpwcF9kZWNfdSA9ICpwcF9wcmV2MTsKLSAgICAgICAgcHBfZGVjX3Vbc2l6ZT4+OF0gPSBwcF9wcmV2MVtzaXplPj44XTsKLSAgICB9Ci0jZW5kaWYKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICA7IFJldHVybiBub3RoaW5nIG9yIGRhdGEgb3IgZGF0YSBwb2ludGVyCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tYl91dGlscy5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tYl91dGlscy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21iX3V0aWxzLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbWJfdXRpbHMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tYnR5cGVfbW9kZS5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbWJ0eXBlX21vZGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbWJ0eXBlX21vZGUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbWJ0eXBlX21vZGUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbW90aW9uX2NvbXAuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21vdGlvbl9jb21wLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21vdGlvbl9jb21wLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21vdGlvbl9jb21wLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21wNGRlY19saWIuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21wNGRlY19saWIuaApzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tcDRkZWNfbGliLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21wNGRlY19saWIuaAppbmRleCA5Y2Q0ZWRjLi5jZTZmOWMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tcDRkZWNfbGliLmgKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbXA0ZGVjX2xpYi5oCkBAIC0xNzAsMzcgKzE3MCw2IEBACiAKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAvKiBkZWZpbmVkIGluIHBwX3NlbWFwaG9yZV9jaHJvbWFfaW50ZXIuYyAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgdm9pZCBwcF9zZW1hcGhvcmVfY2hyb21hX2ludGVyKAotICAgICAgICBpbnQgeHByZWQsICAgICAgLyogaSAqLwotICAgICAgICBpbnQgeXByZWQsICAgICAgLyogaSAqLwotICAgICAgICB1aW50OCAgICpwcF9kZWNfdSwgIC8qIGkvbyAqLwotICAgICAgICB1aW50OCAgICpwc3RwcmNUeXBQcnYsICAvKiBpICovCi0gICAgICAgIGludCBkeCwgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IGR5LCAgICAgLyogaSAqLwotICAgICAgICBpbnQgbXZ3aWR0aCwgICAgLyogaSAqLwotICAgICAgICBpbnQgaGVpZ2h0LCAgICAgLyogaSAqLwotICAgICAgICBpbnQzMiAgIHNpemUsICAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IG12X2xvYywgICAgIC8qIGkgKi8KLSAgICAgICAgdWludDggICBtc2tfZGVibG9jayAvKiBpICovCi0gICAgKTsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIC8qIGRlZmluZWQgaW4gcHBfc2VtYXBob3JlX2x1bWEuYyAqLwotICAgIHVpbnQ4IHBwX3NlbWFwaG9yZV9sdW1hKAotICAgICAgICBpbnQgeHByZWQsICAgICAgLyogaSAqLwotICAgICAgICBpbnQgeXByZWQsICAgICAgLyogaSAqLwotICAgICAgICB1aW50OCAgICpwcF9kZWNfeSwgIC8qIGkvbyAqLwotICAgICAgICB1aW50OCAgICpwc3RwcmNUeXBQcnYsICAvKiBpICovCi0gICAgICAgIGludCAqbGwsICAgICAgICAvKiBpICovCi0gICAgICAgIGludCAqbXZfbG9jLCAgICAvKiBpL28gKi8KLSAgICAgICAgaW50IGR4LCAgICAgLyogaSAqLwotICAgICAgICBpbnQgZHksICAgICAvKiBpICovCi0gICAgICAgIGludCBtdndpZHRoLCAgICAvKiBpICovCi0gICAgICAgIGludCB3aWR0aCwgICAgICAvKiBpICovCi0gICAgICAgIGludCBoZWlnaHQgICAgICAvKiBpICovCi0gICAgKTsKLSNlbmRpZgogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgIC8qIGRlZmluZWQgaW4gZ2V0X3ByZWRfYWR2X21iX2FkZC5jICovCiAgICAgaW50IEdldFByZWRBZHZhbmNlZE1CKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbXA0ZGVmLmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tcDRkZWYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbXA0ZGVmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21wNGRlZi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tcDRsaWJfaW50LmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tcDRsaWJfaW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21wNGxpYl9pbnQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbXA0bGliX2ludC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wYWNrZXRfdXRpbC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wYWNrZXRfdXRpbC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3BhY2tldF91dGlsLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcGFja2V0X3V0aWwuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wb3N0X2ZpbHRlci5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wb3N0X2ZpbHRlci5jcHAKc2ltaWxhcml0eSBpbmRleCA3MyUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcG9zdF9maWx0ZXIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wb3N0X2ZpbHRlci5jcHAKaW5kZXggYjM2MDUwYy4uMzdhMDNhMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcG9zdF9maWx0ZXIuY3BwCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3Bvc3RfZmlsdGVyLmNwcApAQCAtMjQsMTUyICsyNCw2IEBACiBjb25zdCBzdGF0aWMgaW50IFNUUkVOR1RIX3RhYltdID0gezAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDcsIDgsIDgsIDgsIDksIDksIDksIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTJ9OwogI2VuZGlmCiAKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZVTkNUSU9OIENPREUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBQb3N0RmlsdGVyKAotICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8sCi0gICAgaW50IGZpbHRlcl90eXBlLAotICAgIHVpbnQ4ICpvdXRwdXQpCi17Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHVpbnQ4ICpwcF9tb2Q7Ci0gICAgaW50MTYgKlFQX3N0b3JlOwotICAgIGludCBjb21iaW5lZF93aXRoX2RlYmxvY2tfZmlsdGVyOwotICAgIGludCBuVG90YWxNQiA9IHZpZGVvLT5uVG90YWxNQjsKLSAgICBpbnQgd2lkdGgsIGhlaWdodDsKLSAgICBpbnQzMiBzaXplOwotICAgIGludCBzb2Z0RGVibG9ja2luZzsKLSAgICB1aW50OCAqZGVjb2RlZEZyYW1lID0gdmlkZW8tPnZpZGVvRGVjQ29udHJvbHMtPm91dHB1dEZyYW1lOwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgd2lkdGggPSB2aWRlby0+d2lkdGg7Ci0gICAgaGVpZ2h0ID0gdmlkZW8tPmhlaWdodDsKLSAgICBzaXplID0gKGludDMyKXdpZHRoICogaGVpZ2h0OwotCi0gICAgb3NjbF9tZW1jcHkob3V0cHV0LCBkZWNvZGVkRnJhbWUsIHNpemUpOwotICAgIG9zY2xfbWVtY3B5KG91dHB1dCArIHNpemUsIGRlY29kZWRGcmFtZSArIHNpemUsIChzaXplID4+IDIpKTsKLSAgICBvc2NsX21lbWNweShvdXRwdXQgKyBzaXplICsgKHNpemUgPj4gMiksIGRlY29kZWRGcmFtZSArIHNpemUgKyAoc2l6ZSA+PiAyKSwgKHNpemUgPj4gMikpOwotCi0gICAgaWYgKGZpbHRlcl90eXBlID09IDApCi0gICAgICAgIHJldHVybjsKLQotICAgIC8qIFRoZSBzb2Z0RGVjb2RpbmcgY3V0b2ZmIGNvcnJlc3BvbmRzIHRvIH45MzAwMCBicHMgZm9yIFFDSUYgMTVmcHMgY2xpcCAgKi8KLSAgICBpZiAoUFZHZXREZWNCaXRyYXRlKHZpZGVvLT52aWRlb0RlY0NvbnRyb2xzKSA+ICgxMDAqdmlkZW8tPmZyYW1lUmF0ZSooc2l6ZSA+PiAxMikpKSAgLy8gTUNfc29mRGVibG9jawotICAgICAgICBzb2Z0RGVibG9ja2luZyA9IEZBTFNFOwotICAgIGVsc2UKLSAgICAgICAgc29mdERlYmxvY2tpbmcgPSBUUlVFOwotCi0gICAgY29tYmluZWRfd2l0aF9kZWJsb2NrX2ZpbHRlciA9IGZpbHRlcl90eXBlICYgUFZfREVCTE9DSzsKLSAgICBRUF9zdG9yZSA9IHZpZGVvLT5RUE1COwotCi0gICAgLyogTHVtYSAqLwotICAgIHBwX21vZCA9IHZpZGVvLT5wc3RwcmNUeXBDdXI7Ci0KLSAgICBpZiAoKGZpbHRlcl90eXBlICYgUFZfREVCTE9DSykgJiYgKGZpbHRlcl90eXBlICYgUFZfREVSSU5HKSkKLSAgICB7Ci0gICAgICAgIENvbWJpbmVkSG9yelZlcnRSaW5nRmlsdGVyKG91dHB1dCwgd2lkdGgsIGhlaWdodCwgUVBfc3RvcmUsIDAsIHBwX21vZCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChmaWx0ZXJfdHlwZSAmIFBWX0RFQkxPQ0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzb2Z0RGVibG9ja2luZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb21iaW5lZEhvcnpWZXJ0RmlsdGVyKG91dHB1dCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQX3N0b3JlLCAwLCBwcF9tb2QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbWJpbmVkSG9yelZlcnRGaWx0ZXJfTm9Tb2Z0RGVibG9ja2luZyhvdXRwdXQsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQX3N0b3JlLCAwLCBwcF9tb2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChmaWx0ZXJfdHlwZSAmIFBWX0RFUklORykKLSAgICAgICAgewotICAgICAgICAgICAgRGVyaW5naW5nX0x1bWEob3V0cHV0LCB3aWR0aCwgaGVpZ2h0LCBRUF9zdG9yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkX3dpdGhfZGVibG9ja19maWx0ZXIsIHBwX21vZCk7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENocm9tYSAqLwotCi0gICAgcHBfbW9kICs9IChuVG90YWxNQiA8PCAyKTsKLSAgICBvdXRwdXQgKz0gc2l6ZTsKLQotICAgIGlmICgoZmlsdGVyX3R5cGUgJiBQVl9ERUJMT0NLKSAmJiAoZmlsdGVyX3R5cGUgJiBQVl9ERVJJTkcpKQotICAgIHsKLSAgICAgICAgQ29tYmluZWRIb3J6VmVydFJpbmdGaWx0ZXIob3V0cHV0LCAoaW50KSh3aWR0aCA+PiAxKSwgKGludCkoaGVpZ2h0ID4+IDEpLCBRUF9zdG9yZSwgKGludCkgMSwgcHBfbW9kKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKGZpbHRlcl90eXBlICYgUFZfREVCTE9DSykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNvZnREZWJsb2NraW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbWJpbmVkSG9yelZlcnRGaWx0ZXIob3V0cHV0LCAoaW50KSh3aWR0aCA+PiAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGhlaWdodCA+PiAxKSwgUVBfc3RvcmUsIChpbnQpIDEsIHBwX21vZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29tYmluZWRIb3J6VmVydEZpbHRlcl9Ob1NvZnREZWJsb2NraW5nKG91dHB1dCwgKGludCkod2lkdGggPj4gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGhlaWdodCA+PiAxKSwgUVBfc3RvcmUsIChpbnQpIDEsIHBwX21vZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZpbHRlcl90eXBlICYgUFZfREVSSU5HKQotICAgICAgICB7Ci0gICAgICAgICAgICBEZXJpbmdpbmdfQ2hyb21hKG91dHB1dCwgKGludCkod2lkdGggPj4gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGhlaWdodCA+PiAxKSwgUVBfc3RvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkX3dpdGhfZGVibG9ja19maWx0ZXIsIHBwX21vZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcF9tb2QgKz0gblRvdGFsTUI7Ci0gICAgb3V0cHV0ICs9IChzaXplID4+IDIpOwotCi0gICAgaWYgKChmaWx0ZXJfdHlwZSAmIFBWX0RFQkxPQ0spICYmIChmaWx0ZXJfdHlwZSAmIFBWX0RFUklORykpCi0gICAgewotICAgICAgICBDb21iaW5lZEhvcnpWZXJ0UmluZ0ZpbHRlcihvdXRwdXQsIChpbnQpKHdpZHRoID4+IDEpLCAoaW50KShoZWlnaHQgPj4gMSksIFFQX3N0b3JlLCAoaW50KSAxLCBwcF9tb2QpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoZmlsdGVyX3R5cGUgJiBQVl9ERUJMT0NLKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc29mdERlYmxvY2tpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29tYmluZWRIb3J6VmVydEZpbHRlcihvdXRwdXQsIChpbnQpKHdpZHRoID4+IDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaGVpZ2h0ID4+IDEpLCBRUF9zdG9yZSwgKGludCkgMSwgcHBfbW9kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb21iaW5lZEhvcnpWZXJ0RmlsdGVyX05vU29mdERlYmxvY2tpbmcob3V0cHV0LCAoaW50KSh3aWR0aCA+PiAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaGVpZ2h0ID4+IDEpLCBRUF9zdG9yZSwgKGludCkgMSwgcHBfbW9kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZmlsdGVyX3R5cGUgJiBQVl9ERVJJTkcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERlcmluZ2luZ19DaHJvbWEob3V0cHV0LCAoaW50KSh3aWR0aCA+PiAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaGVpZ2h0ID4+IDEpLCBRUF9zdG9yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZWRfd2l0aF9kZWJsb2NrX2ZpbHRlciwgcHBfbW9kKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qICBzd2FwIGN1cnJlbnQgcHBfbW9kIHRvIHByZXZfZnJhbWUgcHBfbW9kICovCi0gICAgcHBfbW9kID0gdmlkZW8tPnBzdHByY1R5cEN1cjsKLSAgICB2aWRlby0+cHN0cHJjVHlwQ3VyID0gdmlkZW8tPnBzdHByY1R5cFBydjsKLSAgICB2aWRlby0+cHN0cHJjVHlwUHJ2ID0gcHBfbW9kOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybjsKLX0KLSNlbmRpZgogCiAKICNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3Bvc3RfcHJvYy5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcG9zdF9wcm9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3Bvc3RfcHJvYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wb3N0X3Byb2MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcAppbmRleCA5YzBmY2ZhLi5iMDgyOGU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wdmRlY19hcGkuY3BwCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAKQEAgLTUxMiw2MCArNTEyLDYgQEAKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKHNpemVvZihNT1QpICogOCAqIG5Ub3RhbE1CKTsKICNlbmRpZgogCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAvKiBBbGxvY2F0aW5nIHNwYWNlIGZvciBwb3N0LXByb2Nlc3NpbmcgTW9kZSAqLwotI2lmZGVmIERFQ19JTlRFUk5BTF9NRU1PUllfT1BUCi0gICAgdmlkZW8tPnBzdHByY1R5cEN1ciA9IElNRU1fcHN0cHJjVHlwQ3VyOwotICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIgKiA2KTsKLSAgICBpZiAodmlkZW8tPnBzdHByY1R5cEN1ciA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5wc3RwcmNUeXBDdXIsIDAsIDQqblRvdGFsTUIgKyAyKm5Ub3RhbE1CKTsKLSAgICB9Ci0KLSAgICB2aWRlby0+cHN0cHJjVHlwUHJ2ID0gSU1FTV9wc3RwcmNUeXBQcnY7Ci0gICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQiAqIDYpOwotICAgIGlmICh2aWRlby0+cHN0cHJjVHlwUHJ2ID09IE5VTEwpCi0gICAgewotICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgb3NjbF9tZW1zZXQodmlkZW8tPnBzdHByY1R5cFBydiwgMCwgblRvdGFsTUIqNik7Ci0gICAgfQotCi0jZWxzZQotICAgIGlmIChuVG90YWxNQiA+IElOVDMyX01BWCAvIDYpIHsKLSAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotICAgIH0KLSAgICB2aWRlby0+cHN0cHJjVHlwQ3VyID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CICogNik7Ci0gICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQiAqIDYpOwotICAgIGlmICh2aWRlby0+cHN0cHJjVHlwQ3VyID09IE5VTEwpCi0gICAgewotICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgb3NjbF9tZW1zZXQodmlkZW8tPnBzdHByY1R5cEN1ciwgMCwgNCpuVG90YWxNQiArIDIqblRvdGFsTUIpOwotICAgIH0KLQotICAgIHZpZGVvLT5wc3RwcmNUeXBQcnYgPSAodWludDggKikgb3NjbF9tYWxsb2MoblRvdGFsTUIgKiA2KTsKLSAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CICogNik7Ci0gICAgaWYgKHZpZGVvLT5wc3RwcmNUeXBQcnYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+cHN0cHJjVHlwUHJ2LCAwLCBuVG90YWxNQio2KTsKLSAgICB9Ci0KLSNlbmRpZgotCi0jZW5kaWYKIAogICAgIC8qIGluaXRpYWxpemUgdGhlIGRlY29kZXIgbGlicmFyeSAqLwogICAgIHZpZGVvLT5wcmV2Vm9wLT5wcmVkaWN0aW9uVHlwZSA9IElfVk9QOwpAQCAtNjMxLDEwICs1NzcsNiBAQAogI2lmZGVmIERFQ19JTlRFUk5BTF9NRU1PUllfT1BUCiAgICAgaWYgKHZpZGVvKQogICAgIHsKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICB2aWRlby0+cHN0cHJjVHlwQ3VyID0gTlVMTDsKLSAgICAgICAgdmlkZW8tPnBzdHByY1R5cFBydiA9IE5VTEw7Ci0jZW5kaWYKIAogICAgICAgICB2aWRlby0+YWNQcmVkRmxhZyAgICAgICA9IE5VTEw7CiAgICAgICAgIHZpZGVvLT5zbGljZU5vICAgICAgICAgID0gTlVMTDsKQEAgLTY5OSwxMCArNjQxLDYgQEAKIAogICAgIGlmICh2aWRlbykKICAgICB7Ci0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgaWYgKHZpZGVvLT5wc3RwcmNUeXBDdXIpIG9zY2xfZnJlZSh2aWRlby0+cHN0cHJjVHlwQ3VyKTsKLSAgICAgICAgaWYgKHZpZGVvLT5wc3RwcmNUeXBQcnYpIG9zY2xfZnJlZSh2aWRlby0+cHN0cHJjVHlwUHJ2KTsKLSNlbmRpZgogICAgICAgICBpZiAodmlkZW8tPnByZWREQykgb3NjbF9mcmVlKHZpZGVvLT5wcmVkREMpOwogICAgICAgICB2aWRlby0+cHJlZERDQUNfcm93ID0gTlVMTDsKICAgICAgICAgaWYgKHZpZGVvLT5wcmVkRENBQ19jb2wpIG9zY2xfZnJlZSh2aWRlby0+cHJlZERDQUNfY29sKTsKQEAgLTgzMCw3ICs3NjgsMTAgQEAKIE9TQ0xfRVhQT1JUX1JFRiB2b2lkIFBWU2V0UG9zdFByb2NUeXBlKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIGludCBtb2RlKQogewogICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKLSAgICB2aWRlby0+cG9zdEZpbHRlclR5cGUgPSBtb2RlOworICAgIGlmIChtb2RlICE9IDApIHsKKyAgICAgICAgQUxPR0UoIlBvc3QgcHJvY2Vzc2luZyBmaWx0ZXJzIGFyZSBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorICAgIHZpZGVvLT5wb3N0RmlsdGVyVHlwZSA9IDA7CiB9CiAKIApAQCAtMTYyMSw0MyArMTU2Miw4IEBACiB2b2lkIFBWRGVjUG9zdFByb2Nlc3MoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKm91dHB1dFlVVikKIHsKICAgICB1aW50OCAqb3V0cHV0QnVmZmVyOwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKikgZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKLSAgICBpbnQzMiB0bXB2YXI7Ci0gICAgaWYgKG91dHB1dFlVVikKLSAgICB7Ci0gICAgICAgIG91dHB1dEJ1ZmZlciA9IG91dHB1dFlVVjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0QnVmZmVyID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0QnVmZmVyID0gZGVjQ3RybC0+b3V0cHV0RnJhbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlKQotICAgIHsKLSAgICAgICAgLyogUG9zdC1wcm9jZXNzaW5nLCAgKi8KLSAgICAgICAgUG9zdEZpbHRlcih2aWRlbywgdmlkZW8tPnBvc3RGaWx0ZXJUeXBlLCBvdXRwdXRCdWZmZXIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAob3V0cHV0WVVWKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb3B5IGRlY29kZWQgZnJhbWUgdG8gdGhlIG91dHB1dCBidWZmZXIuICovCi0gICAgICAgICAgICB0bXB2YXIgPSAoaW50MzIpdmlkZW8tPndpZHRoICogdmlkZW8tPmhlaWdodDsKLSAgICAgICAgICAgIG9zY2xfbWVtY3B5KG91dHB1dEJ1ZmZlciwgZGVjQ3RybC0+b3V0cHV0RnJhbWUsIHRtcHZhciozIC8gMik7ICAgICAgICAgICAvKiAgMy8zLzAxICovCi0gICAgICAgIH0KLSAgICB9Ci0jZWxzZQogICAgIG91dHB1dEJ1ZmZlciA9IGRlY0N0cmwtPm91dHB1dEZyYW1lOwogICAgIG91dHB1dFlVVjsKLSNlbmRpZgogICAgIGRlY0N0cmwtPm91dHB1dEZyYW1lID0gb3V0cHV0QnVmZmVyOwogICAgIHJldHVybjsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3NjYWxpbmcuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3NjYWxpbmcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvc2NhbGluZy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9zY2FsaW5nLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3NjYWxpbmdfdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3NjYWxpbmdfdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvc2NhbGluZ190YWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9zY2FsaW5nX3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY19kZWNfdGFiLmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfZGVjX3RhYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfZGVjX3RhYi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfZGVjX3RhYi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfZGVjb2RlLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY19kZWNvZGUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfZGVjb2RlLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdmxjX2RlY29kZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY19kZWNvZGUuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY19kZWNvZGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdmxjX2RlY29kZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfZGVjb2RlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY19kZXF1YW50LmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY19kZXF1YW50LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdmxjX2RlcXVhbnQuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfZGVxdWFudC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY190YWIuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdmxjX3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY190YWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfdGFiLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdm9wLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZvcC5jcHAKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdm9wLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdm9wLmNwcAppbmRleCBhMTFmNTVlLi43YjMyNDk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92b3AuY3BwCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZvcC5jcHAKQEAgLTI0LDcgKzI0LDYgQEAKIAogI2RlZmluZSBPU0NMX0RJU0FCTEVfV0FSTklOR19DT05WX1BPU1NJQkxFX0xPU1NfT0ZfREFUQQogCi0jaWZkZWYgUFZfU1VQUE9SVF9NQUlOX1BST0ZJTEUKIC8qIElOVFJBICovCiBjb25zdCBzdGF0aWMgaW50IG1wZWdfaXFtYXRfZGVmW05DT0VGRl9CTE9DS10gPQogewpAQCAtNTAsNyArNDksNiBAQAogICAgIDIyLCAyMywgMjQsIDI2LCAyNywgMjgsIDMwLCAzMSwKICAgICAyMywgMjQsIDI1LCAyNywgMjgsIDMwLCAzMSwgMzMKIH07Ci0jZW5kaWYKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgRnVuY3Rpb24gOiBDYWxjTnVtQml0cygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTg2LDkgKzg0LDcgQEAKICAgICBCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtOwogICAgIHVpbnQzMiB0bXB2YXIsIHZvbF9zaGFwZTsKICAgICB1aW50MzIgc3RhcnRDb2RlOwotI2lmZGVmIFBWX1NVUFBPUlRfTUFJTl9QUk9GSUxFCiAgICAgaW50ICpxbWF0LCBpLCBqOwotI2VuZGlmCiAgICAgaW50IHZlcnNpb25faWQgPSAxOwogI2lmZGVmIFBWX1RPTEVSQVRFX1ZPTF9FUlJPUlMKICAgICB1aW50MzIgcHJvZmlsZSA9IDB4MDE7CkBAIC0zMTcsNyArMzEzLDggQEAKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0bXB2YXIgIT0gMHgwMSkgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgICAgICAvLyBTaW1wbGUgYW5kIGFkdmFuY2VkIHNpbXBsZSAoZm9yIHF1YW50LXR5cGUgMSkKKyAgICAgICAgICAgIGlmICh0bXB2YXIgIT0gMHgwMSAmJiB0bXB2YXIgIT0gMHgxMSkgcmV0dXJuIFBWX0ZBSUw7CiAgICAgICAgIH0KIAogICAgICAgICAvKiB2ZXJzaW9uIGlkIHNwZWNpZmllZD8gKi8KQEAgLTQ4Niw3ICs0ODMsNiBAQAogICAgICAgICBjdXJyVm9sLT5xdWFudFR5cGUgPSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKICAgICAgICAgaWYgKGN1cnJWb2wtPnF1YW50VHlwZSkKICAgICAgICAgewotI2lmZGVmIFBWX1NVUFBPUlRfTUFJTl9QUk9GSUxFCiAgICAgICAgICAgICAvKiBsb2FkIHF1YW50aXphdGlvbiBtYXRyaWNlcy4gICA1LzIyLzIwMDAgKi8KICAgICAgICAgICAgIC8qIGxvYWRfaW50cmFfcXVhbnRfbWF0ICgxIGJpdCkgKi8KICAgICAgICAgICAgIHFtYXQgPSBjdXJyVm9sLT5pcW1hdDsKQEAgLTUwMSw2ICs0OTcsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgd2hpbGUgKChxbWF0WyooemlnemFnX2luditpKV0gIT0gMCkgJiYgKCsraSA8IDY0KSk7CiAKKyAgICAgICAgICAgICAgICAvKiBxbWF0cml4IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbm9uLXplcm8gdmFsdWUsIHdoaWNoIG1lYW5zCisgICAgICAgICAgICAgICAgICAgaSB3b3VsZCBiZSBub24temVybyBpbiB2YWxpZCBjYXNlcyAqLworICAgICAgICAgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBmb3IgKGogPSBpOyBqIDwgNjQ7IGorKykKICAgICAgICAgICAgICAgICAgICAgcW1hdFsqKHppZ3phZ19pbnYraildID0gcW1hdFsqKHppZ3phZ19pbnYraS0xKV07CiAgICAgICAgICAgICB9CkBAIC01MjQsNiArNTI3LDEzIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHdoaWxlICgocW1hdFsqKHppZ3phZ19pbnYraSldICE9IDApICYmICgrK2kgPCA2NCkpOwogCisgICAgICAgICAgICAgICAgLyogcW1hdHJpeCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIHZhbHVlLCB3aGljaCBtZWFucworICAgICAgICAgICAgICAgICAgIGkgd291bGQgYmUgbm9uLXplcm8gaW4gdmFsaWQgY2FzZXMgKi8KKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgZm9yIChqID0gaTsgaiA8IDY0OyBqKyspCiAgICAgICAgICAgICAgICAgICAgIHFtYXRbKih6aWd6YWdfaW52K2opXSA9IHFtYXRbKih6aWd6YWdfaW52K2ktMSldOwogICAgICAgICAgICAgfQpAQCAtNTMxLDkgKzU0MSw2IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgb3NjbF9tZW1jcHkocW1hdCwgbXBlZ19ucW1hdF9kZWYsIDY0KnNpemVvZihpbnQpKTsKICAgICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKLSNlbmRpZgogICAgICAgICB9CiAKICAgICAgICAgaWYgKHZlcnNpb25faWQgIT0gMSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ppZ3phZy5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvemlnemFnLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ppZ3phZy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy96aWd6YWcuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvemlnemFnX3RhYi5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy96aWd6YWdfdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvemlnemFnX3RhYi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ppZ3phZ190YWIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZWQ2NmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZC5icApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX200dl9oMjYzX2RlY19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX200dl9oMjYzX2RlY19saWNlbnNlIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiTXBlZzRIMjYzRGVjb2RlclRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgdGVzdF9zdWl0ZXM6IFsKKyAgICAgICAgImRldmljZS10ZXN0cyIsCisgICAgICAgICJtdHMiLAorICAgIF0sCisKKyAgICAvLyBTdXBwb3J0IG11bHRpbGliIHZhcmlhbnRzICh1c2luZyBkaWZmZXJlbnQgc3VmZml4IHBlciBzdWItYXJjaGl0ZWN0dXJlKSwgd2hpY2ggaXMgbmVlZGVkIG9uCisgICAgLy8gYnVpbGQgdGFyZ2V0cyB3aXRoIHNlY29uZGFyeSBhcmNoaXRlY3R1cmVzLCBhcyB0aGUgTVRTIHRlc3Qgc3VpdGUgcGFja2FnaW5nIGxvZ2ljIGZsYXR0ZW5zCisgICAgLy8gYWxsIHRlc3QgYXJ0aWZhY3RzIGludG8gYSBzaW5nbGUgYHRlc3RjYXNlc2AgZGlyZWN0b3J5LgorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJib3RoIiwKKyAgICBtdWx0aWxpYjogeworICAgICAgICBsaWIzMjogeworICAgICAgICAgICAgc3VmZml4OiAiMzIiLAorICAgICAgICB9LAorICAgICAgICBsaWI2NDogeworICAgICAgICAgICAgc3VmZml4OiAiNjQiLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJNcGVnNEgyNjNEZWNvZGVyVGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCnNpbWlsYXJpdHkgaW5kZXggODklCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwKaW5kZXggNDdlMTBjYS4uOGJiNGQxYyAxMDA3NTUKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCkBAIC0xNSwxMSArMTUsMTIgQEAKIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgTXBlZzRIMjYzIERlY29kZXIgdW5pdCB0ZXN0cyI+CiAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9Ik1wZWc0SDI2M0RlY29kZXJUZXN0IiAvPgotICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5GaWxlUHVzaGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iTXBlZzRIMjYzRGVjb2RlclRlc3QtPi9kYXRhL2xvY2FsL3RtcC9NcGVnNEgyNjNEZWNvZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJhcHBlbmQtYml0bmVzcyIgdmFsdWU9InRydWUiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgotICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9NcGVnNEgyNjNEZWNvZGVyLnppcD91bnppcD10cnVlIgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9NcGVnNEgyNjNEZWNvZGVyLTEuMS56aXA/dW56aXA9dHJ1ZSIKICAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvTXBlZzRIMjYzRGVjb2RlclRlc3RSZXMvIiAvPgogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvTXBlZzRIMjYzRGVjb2RlclRlc3QuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L01wZWc0SDI2M0RlY29kZXJUZXN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvTXBlZzRIMjYzRGVjb2RlclRlc3QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvTXBlZzRIMjYzRGVjb2RlclRlc3QuY3BwCmluZGV4IDk2N2MxZWEuLjUzZDY2ZWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9NcGVnNEgyNjNEZWNvZGVyVGVzdC5jcHAKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L01wZWc0SDI2M0RlY29kZXJUZXN0LmNwcApAQCAtNDA0LDYgKzQwNCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInN3aXJsXzM1MngyODhfaDI2My5oMjYzIiwgInN3aXJsXzM1MngyODhfaDI2My5pbmZvIiwgZmFsc2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfMzUyeDI4OF9oMjYzLmgyNjMiLCAiYmJiXzM1MngyODhfaDI2My5pbmZvIiwgZmFsc2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfMzUyeDI4OF9tcGVnNC5tNHYiLCAiYmJiXzM1MngyODhfbXBlZzQuaW5mbyIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJxdHlwZTBfbXBlZzQubTR2IiwgInF0eXBlMF9tcGVnNC5pbmZvIiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInF0eXBlMV9tcGVnNC5tNHYiLCAicXR5cGUxX21wZWc0LmluZm8iLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgicXR5cGUxX3FtYXRyaXhfbXBlZzQubTR2IiwgInF0eXBlMV9xbWF0cml4X21wZWc0LmluZm8iLCB0cnVlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgic3dpcmxfMTI4eDEyOF9tcGVnNC5tNHYiLCAic3dpcmxfMTI4eDEyOF9tcGVnNC5pbmZvIiwgdHJ1ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInN3aXJsXzEzMHgxMzJfbXBlZzQubTR2IiwgInN3aXJsXzEzMHgxMzJfbXBlZzQuaW5mbyIsIHRydWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJzd2lybF8xMzJ4MTMwX21wZWc0Lm00diIsICJzd2lybF8xMzJ4MTMwX21wZWc0LmluZm8iLCB0cnVlKSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9NcGVnNEgyNjNEZWNvZGVyVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvTXBlZzRIMjYzRGVjb2RlclRlc3RFbnZpcm9ubWVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvTXBlZzRIMjYzRGVjb2RlclRlc3RFbnZpcm9ubWVudC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvTXBlZzRIMjYzRGVjb2RlclRlc3RFbnZpcm9ubWVudC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvUkVBRE1FLm1kIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDkwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvUkVBRE1FLm1kCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvUkVBRE1FLm1kCmluZGV4IDdlNGFlYTEuLjM4YWM1NjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9SRUFETUUubWQKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L1JFQURNRS5tZApAQCAtMjIsNyArMjIsOCBAQAogYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9NcGVnNEgyNjNEZWNvZGVyVGVzdC9NcGVnNEgyNjNEZWNvZGVyVGVzdCAvZGF0YS9sb2NhbC90bXAvCiBgYGAKIAotVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9NcGVnNEgyNjNEZWNvZGVyLnppcCkuIERvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvTXBlZzRIMjYzRGVjb2Rlci0xLjEuemlwKS4KK0Rvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KIAogYGBgCiBhZGIgcHVzaCBNcGVnNEgyNjNEZWNvZGVyIC9kYXRhL2xvY2FsL3RtcC8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzAzNDA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTA3IEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX200dl9oMjYzX2VuY19saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlIHRoYXQgdG9vayB0aGUgYXBwcm9hY2ggb2YKKy8vICdhcHBseSBldmVyeSBsaWNlbnNlIGZvdW5kIHRvIGV2ZXJ5IHRhcmdldCcuIFdoaWxlIHRoaXMgbWFrZXMgc3VyZSB3ZSByZXNwZWN0CisvLyBldmVyeSBsaWNlbnNlIHJlc3RyaWN0aW9uLCBpdCBtYXkgbm90IGJlIGVudGlyZWx5IGNvcnJlY3QuCisvLworLy8gZS5nLiBHUEwgaW4gYW4gTUlUIHByb2plY3QgbWlnaHQgb25seSBhcHBseSB0byB0aGUgY29udHJpYi8gZGlyZWN0b3J5LgorLy8KKy8vIFBsZWFzZSBjb25zaWRlciBzcGxpdHRpbmcgdGhlIHNpbmdsZSBsaWNlbnNlIGJlbG93IGludG8gbXVsdGlwbGUgbGljZW5zZXMsCisvLyB0YWtpbmcgY2FyZSBub3QgdG8gbG9zZSBhbnkgbGljZW5zZV9raW5kIGluZm9ybWF0aW9uLCBhbmQgb3ZlcnJpZGluZyB0aGUKKy8vIGRlZmF1bHQgbGljZW5zZSB1c2luZyB0aGUgJ2xpY2Vuc2VzOiBbLi4uXScgcHJvcGVydHkgb24gdGFyZ2V0cyBhcyBuZWVkZWQuCisvLworLy8gRm9yIHVudXNlZCBmaWxlcywgY29uc2lkZXIgY3JlYXRpbmcgYSAnZmlsZUdyb3VwJyB3aXRoICIvL3Zpc2liaWxpdHk6cHJpdmF0ZSIKKy8vIHRvIGF0dGFjaCB0aGUgbGljZW5zZSB0bywgYW5kIGluY2x1ZGluZyBhIGNvbW1lbnQgd2hldGhlciB0aGUgZmlsZXMgbWF5IGJlCisvLyB1c2VkIGluIHRoZSBjdXJyZW50IHByb2plY3QuCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfbTR2X2gyNjNfZW5jX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQlNEIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X200dmgyNjNlbmMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy9iaXRzdHJlYW1faW8uY3BwIiwKKyAgICAgICAgInNyYy9jb21iaW5lZF9lbmNvZGUuY3BwIiwgInNyYy9kYXRhcGFydF9lbmNvZGUuY3BwIiwKKyAgICAgICAgInNyYy9kY3QuY3BwIiwKKyAgICAgICAgInNyYy9maW5kaGFsZnBlbC5jcHAiLAorICAgICAgICAic3JjL2Zhc3Rjb2RlbWIuY3BwIiwKKyAgICAgICAgInNyYy9mYXN0aWRjdC5jcHAiLAorICAgICAgICAic3JjL2Zhc3RxdWFudC5jcHAiLAorICAgICAgICAic3JjL21lX3V0aWxzLmNwcCIsCisgICAgICAgICJzcmMvbXA0ZW5jX2FwaS5jcHAiLAorICAgICAgICAic3JjL3JhdGVfY29udHJvbC5jcHAiLAorICAgICAgICAic3JjL21vdGlvbl9lc3QuY3BwIiwKKyAgICAgICAgInNyYy9tb3Rpb25fY29tcC5jcHAiLAorICAgICAgICAic3JjL3NhZC5jcHAiLAorICAgICAgICAic3JjL3NhZF9oYWxmcGVsLmNwcCIsCisgICAgICAgICJzcmMvdmxjX2VuY29kZS5jcHAiLAorICAgICAgICAic3JjL3ZvcC5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQlhfUkMiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KKworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jX3Rlc3QiLAorICAgIGd0ZXN0OiBmYWxzZSwKKworICAgIHNyY3M6IFsidGVzdC9tNHZfaDI2M19lbmNfdGVzdC5jcHAiXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURCWF9SQyIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorCisgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9OT1RJQ0UgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9OT1RJQ0UKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL2luY2x1ZGUvY3ZlaS5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9pbmNsdWRlL2N2ZWkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9pbmNsdWRlL2N2ZWkuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9pbmNsdWRlL2N2ZWkuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9pbmNsdWRlL21wNGVuY19hcGkuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9tcDRlbmNfYXBpLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9tcDRlbmNfYXBpLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9tcDRlbmNfYXBpLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2JpdHN0cmVhbV9pby5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9iaXRzdHJlYW1faW8uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9iaXRzdHJlYW1faW8uY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9iaXRzdHJlYW1faW8uY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9iaXRzdHJlYW1faW8uaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2JpdHN0cmVhbV9pby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9iaXRzdHJlYW1faW8uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvYml0c3RyZWFtX2lvLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2NvbWJpbmVkX2VuY29kZS5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9jb21iaW5lZF9lbmNvZGUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9jb21iaW5lZF9lbmNvZGUuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9jb21iaW5lZF9lbmNvZGUuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kYXRhcGFydF9lbmNvZGUuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGF0YXBhcnRfZW5jb2RlLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGF0YXBhcnRfZW5jb2RlLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGF0YXBhcnRfZW5jb2RlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0LmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3QuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0X2lubGluZS5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0X2lubGluZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3RfaW5saW5lLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdF9pbmxpbmUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGNvZGVtYi5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0Y29kZW1iLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGNvZGVtYi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3Rjb2RlbWIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0Y29kZW1iLmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0Y29kZW1iLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3Rjb2RlbWIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGNvZGVtYi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0aWRjdC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0aWRjdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3RpZGN0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGlkY3QuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0cXVhbnQuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdHF1YW50LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdHF1YW50LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdHF1YW50LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdHF1YW50X2lubGluZS5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdHF1YW50X2lubGluZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0cXVhbnRfaW5saW5lLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3RxdWFudF9pbmxpbmUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmluZGhhbGZwZWwuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmluZGhhbGZwZWwuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9maW5kaGFsZnBlbC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2ZpbmRoYWxmcGVsLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbTR2ZW5jX29zY2wuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL200dmVuY19vc2NsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL200dmVuY19vc2NsLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL200dmVuY19vc2NsLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21lX3V0aWxzLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21lX3V0aWxzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbWVfdXRpbHMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tZV91dGlscy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21vdGlvbl9jb21wLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21vdGlvbl9jb21wLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbW90aW9uX2NvbXAuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tb3Rpb25fY29tcC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21vdGlvbl9lc3QuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbW90aW9uX2VzdC5jcHAKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbW90aW9uX2VzdC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21vdGlvbl9lc3QuY3BwCmluZGV4IDlkZWIwMjMuLjk5N2I3OGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21vdGlvbl9lc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21vdGlvbl9lc3QuY3BwCkBAIC0xNTc2LDcgKzE1NzYsNyBAQAogCiAgICAgLyogZmluZCB0aGUgbGFzdCByZWZyZXNoIE1CICovCiAgICAgaW5keCA9IDA7Ci0gICAgd2hpbGUgKGluZHggPCB0b3RhbE1CICYmIGludHJhQXJyYXlbaW5keF0gPT0gMSkKKyAgICB3aGlsZSAoaW50cmFBcnJheVtpbmR4XSA9PSAxICYmIGluZHggPCB0b3RhbE1CKQogICAgICAgICBpbmR4Kys7CiAKICAgICAvKiBhZGQgbW9yZSAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGRlZi5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZGVmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGRlZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRkZWYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZW5jX2FwaS5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfYXBpLmNwcApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfYXBpLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZW5jX2FwaS5jcHAKaW5kZXggMzBlNGZkYS4uNDU1NTIwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZW5jX2FwaS5jcHAKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZW5jX2FwaS5jcHAKQEAgLTQ5MSw5ICs0OTEsNiBAQAogICAgIH0KICAgICBmb3IgKGkgPSAwOyBpIDwgZW5jUGFyYW1zLT5uTGF5ZXJzOyBpKyspCiAgICAgewotICAgICAgICBpZiAoZW5jT3B0aW9uLT5lbmNIZWlnaHRbaV0gPT0gMCB8fCBlbmNPcHRpb24tPmVuY1dpZHRoW2ldID09IDAgfHwKLSAgICAgICAgICAgICAgICBlbmNPcHRpb24tPmVuY0hlaWdodFtpXSAlIDE2ICE9IDAgfHwgZW5jT3B0aW9uLT5lbmNXaWR0aFtpXSAlIDE2ICE9IDApCi0gICAgICAgICAgICBnb3RvIENMRUFOX1VQOwogICAgICAgICBlbmNQYXJhbXMtPkxheWVySGVpZ2h0W2ldID0gZW5jT3B0aW9uLT5lbmNIZWlnaHRbaV07CiAgICAgICAgIGVuY1BhcmFtcy0+TGF5ZXJXaWR0aFtpXSA9IGVuY09wdGlvbi0+ZW5jV2lkdGhbaV07CiAgICAgfQpAQCAtNTI3LDExICs1MjQsOSBAQAogICAgIH0KIAogICAgIC8qIGNoZWNrIGJpdCByYXRlICovCi0gICAgLyogc2V0IG1heCBiaXQgcmF0ZSAqLwogICAgIGZvciAoaSA9IDA7IGkgPCBlbmNQYXJhbXMtPm5MYXllcnM7IGkrKykKICAgICB7CiAgICAgICAgIGVuY1BhcmFtcy0+TGF5ZXJCaXRSYXRlW2ldID0gZW5jT3B0aW9uLT5iaXRSYXRlW2ldOwotICAgICAgICBlbmNQYXJhbXMtPkxheWVyTWF4Qml0UmF0ZVtpXSA9IGVuY09wdGlvbi0+Yml0UmF0ZVtpXTsKICAgICB9CiAgICAgaWYgKGVuY1BhcmFtcy0+bkxheWVycyA+IDEpCiAgICAgewpAQCAtMTU4Miw3ICsxNTc3LDcgQEAKICAgICAgICAgaWYgKGN1cnJMYXllciA9PSAwKQogICAgICAgICB7CiAgICAgICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcCA9IHRlbXBGb3J3UmVmVm9wOyAvKiBGb3IgUC1Wb3AgYmFzZSBvbmx5ICovCi0gICAgICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cmVmU2VsZWN0Q29kZSA9IHRlbXBSZWZTZWxDb2RlOworICAgICAgICAgICAgaWYgKHZpZGVvLT5mb3J3YXJkUmVmVm9wICE9IE5VTEwpIHZpZGVvLT5mb3J3YXJkUmVmVm9wLT5yZWZTZWxlY3RDb2RlID0gdGVtcFJlZlNlbENvZGU7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gc3RhdHVzOwpAQCAtMzMwNSw2ICszMzAwLDMgQEAKIH0KIAogI2VuZGlmIC8qICNpZm5kZWYgT1JJR0lOQUxfVkVSU0lPTiAqLwotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZW5jX2xpYi5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZW5jX2xpYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfbGliLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGVuY19saWIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0bGliX2ludC5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0bGliX2ludC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRsaWJfaW50LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGxpYl9pbnQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvcmF0ZV9jb250cm9sLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9oYWxmcGVsLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9oYWxmcGVsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2hhbGZwZWwuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaGFsZnBlbC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9oYWxmcGVsX2lubGluZS5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2hhbGZwZWxfaW5saW5lLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9oYWxmcGVsX2lubGluZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaGFsZnBlbF9pbmxpbmUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2lubGluZS5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2lubGluZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaW5saW5lLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9pbmxpbmUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX21iX29mZnNldC5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX21iX29mZnNldC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfbWJfb2Zmc2V0LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9tYl9vZmZzZXQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY190YWIuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNfdGFiLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNfdGFiLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNfdGFiLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNvZGUuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY29kZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNvZGUuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY29kZS5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY29kZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNvZGUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY29kZV9pbmxpbmUuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNvZGVfaW5saW5lLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNvZGVfaW5saW5lLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNvZGVfaW5saW5lLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZvcC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92b3AuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92b3AuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92b3AuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9BbmRyb2lkLmJwCnNpbWlsYXJpdHkgaW5kZXggNjklCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9BbmRyb2lkLmJwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvQW5kcm9pZC5icAppbmRleCBiOWE4MTE3Li4yYjVlNDljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvQW5kcm9pZC5icApAQCAtMTQsOSArMTQsMjIgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjc19tNHZfaDI2M19lbmNfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1CU0QKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX200dl9oMjYzX2VuY19saWNlbnNlIiwKKyAgICBdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiTXBlZzRIMjYzRW5jb2RlclRlc3QiLAogICAgIGd0ZXN0OiB0cnVlLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAogCiAgICAgc3JjcyA6IFsgIk1wZWc0SDI2M0VuY29kZXJUZXN0LmNwcCIgXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9BbmRyb2lkVGVzdC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9BbmRyb2lkVGVzdC54bWwKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9BbmRyb2lkVGVzdC54bWwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9NcGVnNEgyNjNFbmNvZGVyVGVzdC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvTXBlZzRIMjYzRW5jb2RlclRlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvTXBlZzRIMjYzRW5jb2RlclRlc3QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvTXBlZzRIMjYzRW5jb2RlclRlc3QuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvTXBlZzRIMjYzRW5jb2RlclRlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L01wZWc0SDI2M0VuY29kZXJUZXN0RW52aXJvbm1lbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L01wZWc0SDI2M0VuY29kZXJUZXN0RW52aXJvbm1lbnQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L01wZWc0SDI2M0VuY29kZXJUZXN0RW52aXJvbm1lbnQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L1JFQURNRS5tZCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9SRUFETUUubWQKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9SRUFETUUubWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9tNHZfaDI2M19lbmNfdGVzdC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvbTR2X2gyNjNfZW5jX3Rlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvbTR2X2gyNjNfZW5jX3Rlc3QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvbTR2X2gyNjNfZW5jX3Rlc3QuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA1MmMxMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDEyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJtcGVnNF9oMjYzX2RlY19mdXp6X2RlZmF1bHRzIiwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAibXBlZzRfaDI2M19kZWNfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKKyAgICBdLAorCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibXBlZzRfZGVjX2Z1enplciIsCisKKyAgICBkZWZhdWx0czogWworICAgICAgICAibXBlZzRfaDI2M19kZWNfZnV6el9kZWZhdWx0cyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURNUEVHNCIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImgyNjNfZGVjX2Z1enplciIsCisKKyAgICBkZWZhdWx0czogWworICAgICAgICAibXBlZzRfaDI2M19kZWNfZnV6el9kZWZhdWx0cyIsCisgICAgXSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJtcGVnNF9oMjYzX2VuY19mdXp6X2RlZmF1bHRzIiwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWyJtcGVnNF9oMjYzX2VuY19mdXp6ZXIuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X200dmgyNjNlbmMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibXBlZzRfZW5jX2Z1enplciIsCisKKyAgICBkZWZhdWx0czogWworICAgICAgICAibXBlZzRfaDI2M19lbmNfZnV6el9kZWZhdWx0cyIsCisgICAgXSwKKworICAgIGNmbGFnczogWyItRE1QRUc0Il0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJoMjYzX2VuY19mdXp6ZXIiLAorCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgIm1wZWc0X2gyNjNfZW5jX2Z1enpfZGVmYXVsdHMiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL1JFQURNRS5tZCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNGZmOTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL1JFQURNRS5tZApAQCAtMCwwICsxLDE1OCBAQAorIyBGdXp6ZXIgZm9yIGxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMgZGVjb2RlcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgTVBFRzQvSDI2MyBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUKK2NvZGVjIGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK0RpY3QgZmlsZXMgKGRpY3Rpb25hcnkgZmlsZXMpIGFyZSBjcmVhdGVkIGZvciBNUEVHNCBhbmQgSDI2MyB0byBlbnN1cmUgdGhhdCB0aGUgcmVxdWlyZWQgc3RhcnQKK2J5dGVzIGFyZSBwcmVzZW50IGluIGV2ZXJ5IGlucHV0IGZpbGUgdGhhdCBnb2VzIHRvIHRoZSBmdXp6ZXIuCitUaGlzIGVuc3VyZXMgdGhhdCBkZWNvZGVyIGRvZXMgbm90IHJlamVjdCBhbnkgaW5wdXQgZmlsZSBpbiB0aGUgZmlyc3QgY2hlY2sKKworIyMjIyMgTWF4aW1pemUgdXRpbGl6YXRpb24gb2YgaW5wdXQgZGF0YQorVGhlIHBsdWdpbiBmZWVkcyB0aGUgZW50aXJlIGlucHV0IGRhdGEgdG8gdGhlIGNvZGVjIHVzaW5nIGEgbG9vcC4KKyAqIElmIHRoZSBkZWNvZGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCB0aGUgaW5wdXQgaXMgYWR2YW5jZWQgYnkgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZAorICAgaW4gdGhlIGRlY29kZSBjYWxsLgorICogSWYgdGhlIGRlY29kZSBvcGVyYXRpb24gd2FzIHVuLXN1Y2Nlc3NmdWwsIHRoZSBpbnB1dCBpcyBhZHZhbmNlZCBieSAxIGJ5dGUgc28gdGhhdCB0aGUgZnV6emVyCisgICBjYW4gcHJvY2VlZCB0byBmZWVkIHRoZSBuZXh0IGZyYW1lLgorCitUaGlzIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIHRvbGVyYXRlcyBhbnkga2luZCBvZiBpbnB1dCAoZW1wdHksIGh1Z2UsIG1hbGZvcm1lZCwgZXRjKQorYW5kIGRvZXNudCBgZXhpdCgpYCBvbiBhbnkgaW5wdXQgYW5kIHRoZXJlYnkgaW5jcmVhc2luZyB0aGUgY2hhbmNlIG9mIGlkZW50aWZ5aW5nIHZ1bG5lcmFiaWxpdGllcy4KKworIyMjIyMgT3RoZXIgY29uc2lkZXJhdGlvbnMKKyAqIFR3byBmdXp6ZXIgYmluYXJpZXMgLSBtcGVnNF9kZWNfZnV6emVyIGFuZCBoMjYzX2RlY19mdXp6ZXIgYXJlIGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgcHJlc2VuY2UKKyAgIG9mIGEgZmxhZyAtICdNUEVHNCcKKyAqIFRoZSBudW1iZXIgb2YgZGVjb2RlIGNhbGxzIGFyZSBrZXB0IHRvIGEgbWF4aW11bSBvZiAxMDAgc28gdGhhdCB0aGUgZnV6emVyIGRvZXMgbm90IHRpbWVvdXQuCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG1wZWc0X2RlY19mdXp6ZXIgYW5kIGgyNjNfZGVjX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIG1wZWc0X2RlY19mdXp6ZXIKKyAgJCBtbSAtaiQobnByb2MpIGgyNjNfZGVjX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIE1QRUc0IG9yIEgyNjMgZmlsZXMgdG8gdGhhdCBmb2xkZXIKK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbXBlZzRfZGVjX2Z1enplci9tcGVnNF9kZWNfZnV6emVyIENPUlBVU19ESVIKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9oMjYzX2RlY19mdXp6ZXIvaDI2M19kZWNfZnV6emVyIENPUlBVU19ESVIKK2BgYAorVG8gcnVuIG9uIGhvc3QKK2BgYAorICAkICRBTkRST0lEX0hPU1RfT1VUL2Z1enoveDg2XzY0L21wZWc0X2RlY19mdXp6ZXIvbXBlZzRfZGVjX2Z1enplciBDT1JQVVNfRElSCisgICQgJEFORFJPSURfSE9TVF9PVVQvZnV6ei94ODZfNjQvaDI2M19kZWNfZnV6emVyL2gyNjNfZGVjX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyBGdXp6ZXIgZm9yIGxpYnN0YWdlZnJpZ2h0X200dmgyNjNlbmMgZW5jb2RlcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgTVBFRzQvSDI2MyBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUKK2NvZGVjIGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK1RoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIG5vdCBoYXJkY29kZWQsIGJ1dCBpbnN0ZWFkIHNlbGVjdGVkIGJhc2VkIG9uCitpbmNvbWluZyBkYXRhLiBUaGlzIGVuc3VyZXMgbW9yZSBjb2RlIHBhdGhzIGFyZSByZWFjaGVkIGJ5IHRoZSBmdXp6ZXIuCisKK01QRUc0L0gyNjMgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorMS4gRnJhbWUgV2lkdGggKHBhcmFtZXRlciBuYW1lOiBgZW5jV2lkdGhgKQorMi4gRnJhbWUgSGVpZ2h0IChwYXJhbWV0ZXIgbmFtZTogYGVuY0hlaWdodGApCiszLiBSYXRlIGNvbnRyb2wgbW9kZSAocGFyYW1ldGVyIG5hbWU6IGByY1R5cGVgKQorNC4gTnVtYmVyIG9mIGJ5dGVzIHBlciBwYWNrZXQgKHBhcmFtZXRlciBuYW1lOiBgcGFja2V0U2l6ZWApCis1LiBRcCBmb3IgSS1Wb3AocGFyYW1ldGVyIG5hbWU6IGBpUXVhbnRgKQorNi4gUXAgZm9yIFAtVm9wIChwYXJhbWV0ZXIgbmFtZTogYHBRdWFudGApCis3LiBFbmFibGUgUlZMQyBtb2RlIChwYXJhbWV0ZXIgbmFtZTogYHJ2bGNFbmFibGVgKQorOC4gUXVhbnRpemF0aW9uIG1vZGUgKHBhcmFtZXRlciBuYW1lOiBgcXVhbnRUeXBlYCkKKzkuIERpc2FibGUgZnJhbWUgc2tpcHBpbmcgKHBhcmFtZXRlciBuYW1lOiBgbm9GcmFtZVNraXBwZWRgKQorMTAuIEVuYWJsZSBzY2VuZSBjaGFuZ2UgZGV0ZWN0aW9uIChwYXJhbWV0ZXIgbmFtZTogYHNjZW5lRGV0ZWN0YCkKKzExLiBOdW1iZXIgb2YgaW50cmEgTUJzIGluIFAtZnJhbWUocGFyYW1ldGVyIG5hbWU6IGBudW1JbnRyYU1CYCkKKzEyLiBTZWFyY2ggcmFuZ2Ugb2YgTUUgKHBhcmFtZXRlciBuYW1lOiBgc2VhcmNoUmFuZ2VgKQorMTMuIEVuYWJsZSA4eDggTUUgYW5kIE1DIChwYXJhbWV0ZXIgbmFtZTogYG12OHg4RW5hYmxlYCkKKzE0LiBFbmFibGUgQUMgcHJlZGljdGlvbiAocGFyYW1ldGVyIG5hbWU6IGB1c2VBQ1ByZWRgKQorMTUuIFRocmVzaG9sZCBmb3IgaW50cmEgREMgVkxDIChwYXJhbWV0ZXIgbmFtZTogYGludHJhRENWbGNUaGApCisxNi4gRW5jb2RpbmcgTW9kZSAocGFyYW1ldGVyIG5hbWU6IGBlbmNNb2RlYCkKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGByY1R5cGVgIHwgMC4gYENPTlNUQU5UX1FgIDEuIGBDQlJfMWAgMi4gYFZCUl8xYCAzLiBgQ0JSXzJgIDQuIGBWQlJfMmAgNS4gYENCUl9MT1dERUxBWWAgfCBBbGwgdGhlIGJpdHMgb2YgNnRoIGJ5dGUgb2YgZGF0YSBtb2R1bHVzIDYgfAorfCBgcGFja2V0U2l6ZWAgfCBJbiB0aGUgcmFuZ2UgYDAgdG8gMjU1YCB8IEFsbCB0aGUgYml0cyBvZiA3dGggYnl0ZSBvZiBkYXRhIHwKK3wgYGlRdWFudGAgfCBJbiB0aGUgcmFuZ2UgYDEgdG8gMzFgIHwgQWxsIHRoZSBiaXRzIG9mIDh0aCBieXRlIG9mIGRhdGEgfAorfCBgcFF1YW50YCB8IEluIHRoZSByYW5nZSBgMSB0byAzMWAgfCBBbGwgdGhlIGJpdHMgb2YgOXRoIGJ5dGUgb2YgZGF0YSB8Cit8IGBydmxjRW5hYmxlYCB8IDAuIGBQVl9PRkZgIDEuIGBQVl9PTmAgfCBiaXQgMCBvZiAxMHRoIGJ5dGUgb2YgZGF0YSB8Cit8IGBxdWFudFR5cGVgIHwgMC4gYDBgIDEuIGAxYCB8IGJpdCAwIG9mIDExdGggYnl0ZSBvZiBkYXRhIHwKK3wgYG5vRnJhbWVTa2lwcGVkYCB8IDAuIGBQVl9PRkZgIDEuIGBQVl9PTmAgfCBiaXQgMCBvZiAxMnRoIGJ5dGUgb2YgZGF0YSB8Cit8IGBzY2VuZURldGVjdGAgfCAwLiBgUFZfT0ZGYCAxLiBgUFZfT05gIHwgYml0IDAgb2YgMTN0aCBieXRlIG9mIGRhdGEgfAorfCBgbnVtSW50cmFNQmAgfCBJbiB0aGUgcmFuZ2UgYDAgdG8gN2AgfCBiaXQgMCwgMSBhbmQgMiBvZiAxNHRoIGJ5dGUgb2YgZGF0YSB8Cit8IGBzZWFyY2hSYW5nZWAgfCBJbiB0aGUgcmFuZ2UgYDAgdG8gMzFgIHwgYml0IDAsIDEsIDIsIDMgYW5kIDQgb2YgMTV0aCBieXRlIG9mIGRhdGEgfAorfCBgbXY4eDhFbmFibGVgIHwgMC4gYFBWX09GRmAgMS4gYFBWX09OYCB8IGJpdCAwIG9mIDE2dGggYnl0ZSBvZiBkYXRhIHwKK3wgYHVzZUFDUHJlZGAgfCAwLiBgUFZfT0ZGYCAxLiBgUFZfT05gIHwgYml0IDAgb2YgMTd0aCBieXRlIG9mIGRhdGEgfAorfCBgaW50cmFEQ1ZsY1RoYCB8IEluIHRoZSByYW5nZSBgMCB0byA3YCB8IGJpdCAwLCAxIGFuZCAyIG9mIDE4dGggYnl0ZSBvZiBkYXRhIHwKKworRm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIG9ubHkgZm9yIG1wZWc0X2VuY19mdXp6ZXIKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGBlbmNXaWR0aGAgfCBJbiB0aGUgcmFuZ2UgYDAgdG8gMTAyMzlgIHwgQWxsIHRoZSBiaXRzIG9mIDFzdCBhbmQgMm5kIGJ5dGUgb2YgZGF0YSB8Cit8IGBlbmNIZWlnaHRgIHwgSW4gdGhlIHJhbmdlIGAwIHRvIDEwMjM5YCB8IEFsbCB0aGUgYml0cyBvZiAzcmQgYW5kIDR0aCBieXRlIG9mIGRhdGEgfAorfCBgZW5jTW9kZWAgfCAwLiBgSDI2M19NT0RFYCAxLiBgSDI2M19NT0RFX1dJVEhfRVJSX1JFU2AgMi4gYERBVEFfUEFSVElUSU9OSU5HX01PREVgIDMuIGBDT01CSU5FX01PREVfTk9fRVJSX1JFU2AgNC4gYENPTUJJTkVfTU9ERV9XSVRIX0VSUl9SRVNgIHwgQWxsIHRoZSBiaXRzIG9mIDE5dGggYnl0ZSBvZiBkYXRhIG1vZHVsdXMgNSB8CisKK0ZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBvbmx5IGZvciBoMjYzX2VuY19mdXp6ZXIKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGBlbmNXaWR0aGAgfCAwLiBgMTI4YCAxLiBgMTc2YCAyLiBgMzUyYCAzLiBgNzA0YCA0LiBgMTQwOGAgfCBBbGwgdGhlIGJpdHMgb2YgMXN0IGJ5dGUgb2YgZGF0YSBtb2R1bHVzIDV8Cit8IGBlbmNIZWlnaHRgIHwgMC4gYDk2YCAxLiBgMTQ0YCAyLiBgMjg4YCAzLiBgNTc2YCA0LiBgMTE1MiBgIHwgQWxsIHRoZSBiaXRzIG9mIDNyZCBieXRlIG9mIGRhdGEgbW9kdWx1cyA1fAorfCBgZW5jTW9kZWAgfCAwLiBgU0hPUlRfSEVBREVSYCAxLiBgU0hPUlRfSEVBREVSX1dJVEhfRVJSX1JFU2AgfCBBbGwgdGhlIGJpdHMgb2YgMTl0aCBieXRlIG9mIGRhdGEgbW9kdWx1cyAyIHwKKworVGhpcyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIGlzIGFsd2F5cyBkZXRlcm1pbmlzdGljIGZvciBhbnkgZ2l2ZW4gaW5wdXQuCisKKyMjIyMjIE1heGltaXplIHV0aWxpemF0aW9uIG9mIGlucHV0IGRhdGEKK1RoZSBwbHVnaW4gZmVlZHMgdGhlIGVudGlyZSBpbnB1dCBkYXRhIHRvIHRoZSBjb2RlYyB1c2luZyBhIGxvb3AuCitJZiB0aGUgZW5jb2RlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgdGhlIGlucHV0IGlzIGFkdmFuY2VkIGJ5IHRoZSBmcmFtZSBzaXplLgorSWYgdGhlIGVuY29kZSBvcGVyYXRpb24gd2FzIHVuLXN1Y2Nlc3NmdWwsIHRoZSBpbnB1dCBpcyBzdGlsbCBhZHZhbmNlZCBieSBmcmFtZSBzaXplIHNvCit0aGF0IHRoZSBmdXp6ZXIgY2FuIHByb2NlZWQgdG8gZmVlZCB0aGUgbmV4dCBmcmFtZS4KKworVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiB0b2xlcmF0ZXMgYW55IGtpbmQgb2YgaW5wdXQgKGVtcHR5LCBodWdlLAorbWFsZm9ybWVkLCBldGMpIGFuZCBkb2VzbnQgYGV4aXQoKWAgb24gYW55IGlucHV0IGFuZCB0aGVyZWJ5IGluY3JlYXNpbmcgdGhlCitjaGFuY2Ugb2YgaWRlbnRpZnlpbmcgdnVsbmVyYWJpbGl0aWVzLgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBtcGVnNF9lbmNfZnV6emVyIGFuZCBoMjYzX2VuY19mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIG1wZWc0X2VuY19mdXp6ZXIKKyAgJCBtbSAtaiQobnByb2MpIGgyNjNfZW5jX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIHl1diBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9tNHZfaDI2M19lbmNfZnV6emVyL200dl9oMjYzX2VuY19mdXp6ZXIgQ09SUFVTX0RJUgorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L2gyNjNfZW5jX2Z1enplci9oMjYzX2VuY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCitUbyBydW4gb24gaG9zdAorYGBgCisgICQgJEFORFJPSURfSE9TVF9PVVQvZnV6ei94ODZfNjQvbXBlZzRfZW5jX2Z1enplci9tcGVnNF9lbmNfZnV6emVyIENPUlBVU19ESVIKKyAgJCAkQU5EUk9JRF9IT1NUX09VVC9mdXp6L3g4Nl82NC9oMjYzX2VuY19mdXp6ZXIvaDI2M19lbmNfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIyBSZWZlcmVuY2VzOgorICogaHR0cDovL2xsdm0ub3JnL2RvY3MvTGliRnV6emVyLmh0bWwKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvb3NzLWZ1enoKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvaDI2M19kZWNfZnV6emVyLmRpY3QgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL2gyNjNfZGVjX2Z1enplci5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MWQzN2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL2gyNjNfZGVjX2Z1enplci5kaWN0CkBAIC0wLDAgKzEsMiBAQAorIyBTdGFydCBjb2RlIChieXRlcyAwLTMpCitrdzE9Ilx4MDBceDAwXHg4MFx4MDIiCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL21wZWc0X2RlY19mdXp6ZXIuZGljdCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfZGVjX2Z1enplci5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MjQxYTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL21wZWc0X2RlY19mdXp6ZXIuZGljdApAQCAtMCwwICsxLDIgQEAKKyMgU3RhcnQgY29kZSAoYnl0ZXMgMC0zKQora3cxPSJceDAwXHgwMFx4MDFceEIwIgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9tcGVnNF9oMjYzX2RlY19mdXp6ZXIuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9tcGVnNF9oMjYzX2RlY19mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMmM4MjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL21wZWc0X2gyNjNfZGVjX2Z1enplci5jcHAKQEAgLTAsMCArMSwyMDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworI2luY2x1ZGUgIm1wNGRlY19hcGkuaCIKKyNkZWZpbmUgTVBFRzRfTUFYX1dJRFRIIDE5MjAKKyNkZWZpbmUgTVBFRzRfTUFYX0hFSUdIVCAxMDgwCisjZGVmaW5lIEgyNjNfTUFYX1dJRFRIIDM1MgorI2RlZmluZSBIMjYzX01BWF9IRUlHSFQgMjg4CisjZGVmaW5lIERFRkFVTFRfV0lEVEggMzUyCisjZGVmaW5lIERFRkFVTFRfSEVJR0hUIDI4OAorCitjb25zdGV4cHIgc2l6ZV90IGtNYXhOdW1EZWNvZGVDYWxscyA9IDEwMDsKK2NvbnN0ZXhwciB1aW50OF90IGtOdW1PdXRwdXRCdWZmZXJzID0gMjsKK2NvbnN0ZXhwciBpbnQga0xheWVyID0gMTsKKworc3RydWN0IHRhZ3ZpZGVvRGVjQ29udHJvbHM7CisKKy8qID09IGNlaWwobnVtIC8gZGVuKSAqIGRlbi4gVCBtdXN0IGJlIGludGVnZXIgdHlwZSwgYWxpZ25tZW50IG11c3QgYmUgcG9zaXRpdmUgcG93ZXIgb2YgMiAqLwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+CitpbmxpbmUgc3RhdGljIGNvbnN0IFQgYWxpZ24oY29uc3QgVCAmbnVtLCBjb25zdCBVICZkZW4pIHsKKyAgcmV0dXJuIChudW0gKyAoVCkoZGVuIC0gMSkpICYgKFQpIH4oZGVuIC0gMSk7Cit9CisKK2NsYXNzIENvZGVjIHsKKyBwdWJsaWM6CisgIENvZGVjKCkgPSBkZWZhdWx0OworICB+Q29kZWMoKSB7IGRlSW5pdERlY29kZXIoKTsgfQorICBib29sIGluaXREZWNvZGVyKCk7CisgIGJvb2wgYWxsb2NPdXRwdXRCdWZmZXIoc2l6ZV90IG91dHB1dEJ1ZmZlclNpemUpOworICB2b2lkIGZyZWVPdXRwdXRCdWZmZXIoKTsKKyAgdm9pZCBoYW5kbGVSZXNvbHV0aW9uQ2hhbmdlKCk7CisgIHZvaWQgZGVjb2RlRnJhbWVzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgdm9pZCBkZUluaXREZWNvZGVyKCk7CisKKyBwcml2YXRlOgorICB0YWd2aWRlb0RlY0NvbnRyb2xzICptRGVjSGFuZGxlID0gbnVsbHB0cjsKKyAgdWludDhfdCAqbU91dHB1dEJ1ZmZlcltrTnVtT3V0cHV0QnVmZmVyc107CisgIGJvb2wgbUluaXRpYWxpemVkID0gZmFsc2U7CisgIGJvb2wgbUZyYW1lc0NvbmZpZ3VyZWQgPSBmYWxzZTsKKyNpZmRlZiBNUEVHNAorICBNUDREZWNvZGluZ01vZGUgbUlucHV0TW9kZSA9IE1QRUc0X01PREU7CisgIHNpemVfdCBtTWF4V2lkdGggPSBNUEVHNF9NQVhfV0lEVEg7CisgIHNpemVfdCBtTWF4SGVpZ2h0ID0gTVBFRzRfTUFYX0hFSUdIVDsKKyNlbHNlCisgIE1QNERlY29kaW5nTW9kZSBtSW5wdXRNb2RlID0gSDI2M19NT0RFOworICBzaXplX3QgbU1heFdpZHRoID0gSDI2M19NQVhfV0lEVEg7CisgIHNpemVfdCBtTWF4SGVpZ2h0ID0gSDI2M19NQVhfSEVJR0hUOworI2VuZGlmCisgIHVpbnQzMl90IG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKKyAgdWludDMyX3QgbVdpZHRoID0gREVGQVVMVF9XSURUSDsKKyAgdWludDMyX3QgbUhlaWdodCA9IERFRkFVTFRfSEVJR0hUOworfTsKKworYm9vbCBDb2RlYzo6aW5pdERlY29kZXIoKSB7CisgIG1EZWNIYW5kbGUgPSBuZXcgdGFndmlkZW9EZWNDb250cm9sczsKKyAgaWYgKCFtRGVjSGFuZGxlKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1lbXNldChtRGVjSGFuZGxlLCAwLCBzaXplb2YodGFndmlkZW9EZWNDb250cm9scykpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb2RlYzo6YWxsb2NPdXRwdXRCdWZmZXIoc2l6ZV90IG91dHB1dEJ1ZmZlclNpemUpIHsKKyAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwga051bU91dHB1dEJ1ZmZlcnM7ICsraSkgeworICAgIGlmICghbU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgbU91dHB1dEJ1ZmZlcltpXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4obWFsbG9jKG91dHB1dEJ1ZmZlclNpemUpKTsKKyAgICAgIGlmICghbU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENvZGVjOjpmcmVlT3V0cHV0QnVmZmVyKCkgeworICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7CisgICAgaWYgKG1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgIGZyZWUobU91dHB1dEJ1ZmZlcltpXSk7CisgICAgICBtT3V0cHV0QnVmZmVyW2ldID0gbnVsbHB0cjsKKyAgICB9CisgIH0KK30KKwordm9pZCBDb2RlYzo6aGFuZGxlUmVzb2x1dGlvbkNoYW5nZSgpIHsKKyAgaW50MzJfdCBkaXNwV2lkdGgsIGRpc3BIZWlnaHQ7CisgIFBWR2V0VmlkZW9EaW1lbnNpb25zKG1EZWNIYW5kbGUsICZkaXNwV2lkdGgsICZkaXNwSGVpZ2h0KTsKKworICBpbnQzMl90IGJ1ZldpZHRoLCBidWZIZWlnaHQ7CisgIFBWR2V0QnVmZmVyRGltZW5zaW9ucyhtRGVjSGFuZGxlLCAmYnVmV2lkdGgsICZidWZIZWlnaHQpOworCisgIGlmIChkaXNwV2lkdGggIT0gbVdpZHRoIHx8IGRpc3BIZWlnaHQgIT0gbUhlaWdodCkgeworICAgIG1XaWR0aCA9IGRpc3BXaWR0aDsKKyAgICBtSGVpZ2h0ID0gZGlzcEhlaWdodDsKKyAgfQorfQorCit2b2lkIENvZGVjOjpkZWNvZGVGcmFtZXMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgc2l6ZV90IG91dHB1dEJ1ZmZlclNpemUgPSBhbGlnbihtTWF4V2lkdGgsIDE2KSAqIGFsaWduKG1NYXhIZWlnaHQsIDE2KSAqIDMgLyAyOworICB1aW50OF90ICpzdGFydF9jb2RlID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGRhdGEpOworICBzdGF0aWMgY29uc3QgdWludDhfdCB2b2xJbmZvW10gPSB7MHgwMCwgMHgwMCwgMHgwMSwgMHhCMH07CisgIGJvb2wgdm9sSGVhZGVyID0gbWVtY21wKHN0YXJ0X2NvZGUsIHZvbEluZm8sIDQpID09IDA7CisgIGlmICh2b2xIZWFkZXIpIHsKKyAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIobURlY0hhbmRsZSk7CisgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgIH0KKworICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgIHVpbnQ4X3QgKnZvbERhdGFbMV17fTsKKyAgICBpbnQzMl90IHZvbFNpemUgPSAwOworCisgICAgaWYgKHZvbEhlYWRlcikgeyAvKiByZW1vdmVkIHNvbWUgY29kZWMgY29uZmlnIHBhcnQgKi8KKyAgICAgIHZvbERhdGFbMF0gPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZGF0YSk7CisgICAgICB2b2xTaXplID0gc2l6ZTsKKyAgICB9CisKKyAgICBpZiAoIVBWSW5pdFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlLCB2b2xEYXRhLCAmdm9sU2l6ZSwga0xheWVyLCBtTWF4V2lkdGgsIG1NYXhIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0TW9kZSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICBNUDREZWNvZGluZ01vZGUgYWN0dWFsTW9kZSA9IFBWR2V0RGVjQml0c3RyZWFtTW9kZShtRGVjSGFuZGxlKTsKKyAgICBpZiAobUlucHV0TW9kZSAhPSBhY3R1YWxNb2RlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgUFZTZXRQb3N0UHJvY1R5cGUobURlY0hhbmRsZSwgMCk7CisgIH0KKyAgc2l6ZV90IHlGcmFtZVNpemUgPSBzaXplb2YodWludDgpICogbURlY0hhbmRsZS0+c2l6ZTsKKyAgaWYgKG91dHB1dEJ1ZmZlclNpemUgPCB5RnJhbWVTaXplICogMyAvIDIpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFhbGxvY091dHB1dEJ1ZmZlcihvdXRwdXRCdWZmZXJTaXplKSkgeworICAgIHJldHVybjsKKyAgfQorICBzaXplX3QgbnVtRGVjb2RlQ2FsbHMgPSAwOworICB3aGlsZSAoKHNpemUgPiAwKSAmJiAobnVtRGVjb2RlQ2FsbHMgPCBrTWF4TnVtRGVjb2RlQ2FsbHMpKSB7CisgICAgaWYgKCFtRnJhbWVzQ29uZmlndXJlZCkgeworICAgICAgUFZTZXRSZWZlcmVuY2VZVVYobURlY0hhbmRsZSwgbU91dHB1dEJ1ZmZlclsxXSk7CisgICAgICBtRnJhbWVzQ29uZmlndXJlZCA9IHRydWU7CisgICAgfQorCisgICAgLy8gTmVlZCB0byBjaGVjayBpZiBoZWFkZXIgY29udGFpbnMgbmV3IGluZm8sIGUuZy4sIHdpZHRoL2hlaWdodCwgZXRjLgorICAgIFZvcEhlYWRlckluZm8gaGVhZGVyX2luZm87CisgICAgdWludDMyX3QgdXNlRXh0VGltZXN0YW1wID0gKG51bURlY29kZUNhbGxzID09IDApOworICAgIGludDMyX3QgdGVtcFNpemUgPSAoaW50MzJfdClzaXplOworICAgIHVpbnQ4X3QgKmJpdHN0cmVhbVRtcCA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihkYXRhKTsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIGlmIChQVkRlY29kZVZvcEhlYWRlcihtRGVjSGFuZGxlLCAmYml0c3RyZWFtVG1wLCAmdGltZXN0YW1wLCAmdGVtcFNpemUsICZoZWFkZXJfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZUV4dFRpbWVzdGFtcCwgbU91dHB1dEJ1ZmZlclttTnVtU2FtcGxlc091dHB1dCAmIDFdKSAhPSBQVl9UUlVFKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaGFuZGxlUmVzb2x1dGlvbkNoYW5nZSgpOworCisgICAgUFZEZWNvZGVWb3BCb2R5KG1EZWNIYW5kbGUsICZ0ZW1wU2l6ZSk7CisgICAgdWludDMyX3QgYnl0ZXNDb25zdW1lZCA9IDE7CisgICAgaWYgKHNpemUgPiB0ZW1wU2l6ZSkgeworICAgICAgYnl0ZXNDb25zdW1lZCA9IHNpemUgLSB0ZW1wU2l6ZTsKKyAgICB9CisgICAgZGF0YSArPSBieXRlc0NvbnN1bWVkOworICAgIHNpemUgLT0gYnl0ZXNDb25zdW1lZDsKKyAgICArK21OdW1TYW1wbGVzT3V0cHV0OworICAgICsrbnVtRGVjb2RlQ2FsbHM7CisgIH0KKyAgZnJlZU91dHB1dEJ1ZmZlcigpOworfQorCit2b2lkIENvZGVjOjpkZUluaXREZWNvZGVyKCkgeworICBQVkNsZWFuVXBWaWRlb0RlY29kZXIobURlY0hhbmRsZSk7CisgIGRlbGV0ZSBtRGVjSGFuZGxlOworICBtRGVjSGFuZGxlID0gbnVsbHB0cjsKKyAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgIGZyZWVPdXRwdXRCdWZmZXIoKTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoc2l6ZSA8IDQpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDb2RlYyAqY29kZWMgPSBuZXcgQ29kZWMoKTsKKyAgaWYgKCFjb2RlYykgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChjb2RlYy0+aW5pdERlY29kZXIoKSkgeworICAgIGNvZGVjLT5kZWNvZGVGcmFtZXMoZGF0YSwgc2l6ZSk7CisgIH0KKyAgZGVsZXRlIGNvZGVjOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfaDI2M19lbmNfZnV6emVyLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfaDI2M19lbmNfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjMzMjVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9tcGVnNF9oMjYzX2VuY19mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSAibXA0ZW5jX2FwaS5oIgorCitjb25zdGV4cHIgaW50OF90IGtJRFJGcmFtZVJlZnJlc2hJbnRlcnZhbEluU2VjID0gMTsKK2NvbnN0ZXhwciBNUDRSYXRlQ29udHJvbFR5cGUga3JjVHlwZVtdID0ge0NPTlNUQU5UX1EsIENCUl8xLCBWQlJfMSwgQ0JSXzIsIFZCUl8yLCBDQlJfTE9XREVMQVl9OworI2lmZGVmIE1QRUc0Citjb25zdGV4cHIgTVA0RW5jb2RpbmdNb2RlIGtFbmNvZGluZ01vZGVbXSA9IHtTSE9SVF9IRUFERVIsIFNIT1JUX0hFQURFUl9XSVRIX0VSUl9SRVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRBX1BBUlRJVElPTklOR19NT0RFLCBDT01CSU5FX01PREVfTk9fRVJSX1JFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTUJJTkVfTU9ERV9XSVRIX0VSUl9SRVN9OworY29uc3RleHByIHNpemVfdCBrTWF4V2lkdGggPSAxMDI0MDsKK2NvbnN0ZXhwciBzaXplX3Qga01heEhlaWdodCA9IDEwMjQwOworI2Vsc2UKK2NvbnN0ZXhwciBNUDRFbmNvZGluZ01vZGUga0VuY29kaW5nTW9kZVtdID0ge0gyNjNfTU9ERSwgSDI2M19NT0RFX1dJVEhfRVJSX1JFU307Citjb25zdGV4cHIgaW50IGtXaWR0aFtdID0gezEyOCwgMTc2LCAzNTIsIDcwNCwgMTQwOH07Citjb25zdGV4cHIgaW50IGtIZWlnaHRbXSA9IHs5NiwgMTQ0LCAyODgsIDU3NiwgMTE1Mn07Citjb25zdGV4cHIgc2l6ZV90IGtXaWR0aE51bSA9IHN0ZDo6c2l6ZShrV2lkdGgpOworY29uc3RleHByIHNpemVfdCBrSGVpZ2h0TnVtID0gc3RkOjpzaXplKGtIZWlnaHQpOworI2VuZGlmCisKK2NvbnN0ZXhwciBzaXplX3Qga3JjVHlwZU51bSA9IHN0ZDo6c2l6ZShrcmNUeXBlKTsKK2NvbnN0ZXhwciBzaXplX3Qga0VuY29kaW5nTW9kZU51bSA9IHN0ZDo6c2l6ZShrRW5jb2RpbmdNb2RlKTsKK2NvbnN0ZXhwciBzaXplX3Qga01heFFQID0gNTE7CisKK2VudW0geworICAgIElEWF9XRF9CWVRFXzEsCisgICAgSURYX1dEX0JZVEVfMiwKKyAgICBJRFhfSFRfQllURV8xLAorICAgIElEWF9IVF9CWVRFXzIsCisgICAgSURYX0ZSQU1FX1JBVEUsCisgICAgSURYX1JDX1RZUEUsCisgICAgSURYX1BBQ0tFVF9TSVpFLAorICAgIElEWF9JX0ZSQU1FX1FQLAorICAgIElEWF9QX0ZSQU1FX1FQLAorICAgIElEWF9FTkFCTEVfUlZMQywKKyAgICBJRFhfUVVBTlRfVFlQRSwKKyAgICBJRFhfTk9fRlJBTUVfU0tJUFBFRF9GTEFHLAorICAgIElEWF9FTkFCTEVfU0NFTkVfREVURUNULAorICAgIElEWF9OVU1fSU5UUkFfTUIsCisgICAgSURYX1NFQVJDSF9SQU5HRSwKKyAgICBJRFhfRU5BQkxFX01WXzh4OCwKKyAgICBJRFhfVVNFX0FDX1BSRUQsCisgICAgSURYX0lOVFJBX0RDX1ZMQ19USFJFU0hPTEQsCisgICAgSURYX0VOQ19NT0RFLAorICAgIElEWF9MQVNUCit9OworCitjbGFzcyBDb2RlYyB7CisgICBwdWJsaWM6CisgICAgQ29kZWMoKSA9IGRlZmF1bHQ7CisgICAgfkNvZGVjKCkgeyBkZUluaXRFbmNvZGVyKCk7IH0KKyAgICBib29sIGluaXRFbmNvZGVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEpOworICAgIHZvaWQgZW5jb2RlRnJhbWVzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkIGRlSW5pdEVuY29kZXIoKTsKKworICAgcHJpdmF0ZToKKyAgICBpbnQzMl90IG1GcmFtZVdpZHRoID0gMzUyOworICAgIGludDMyX3QgbUZyYW1lSGVpZ2h0ID0gMjg4OworICAgIGZsb2F0IG1GcmFtZVJhdGUgPSAyNS4wZjsKKyAgICBWaWRlb0VuY09wdGlvbnMgKm1FbmNvZGVIYW5kbGUgPSBudWxscHRyOworICAgIFZpZGVvRW5jQ29udHJvbHMgKm1FbmNvZGVDb250cm9sID0gbnVsbHB0cjsKK307CisKK2Jvb2wgQ29kZWM6OmluaXRFbmNvZGVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEpIHsKKyAgICBtRW5jb2RlSGFuZGxlID0gbmV3IFZpZGVvRW5jT3B0aW9uczsKKyAgICBpZiAoIW1FbmNvZGVIYW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1zZXQobUVuY29kZUhhbmRsZSwgMCwgc2l6ZW9mKFZpZGVvRW5jT3B0aW9ucykpOworICAgIG1FbmNvZGVDb250cm9sID0gbmV3IFZpZGVvRW5jQ29udHJvbHM7CisgICAgaWYgKCFtRW5jb2RlQ29udHJvbCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1lbXNldChtRW5jb2RlQ29udHJvbCwgMCwgc2l6ZW9mKFZpZGVvRW5jQ29udHJvbHMpKTsKKyAgICBQVkdldERlZmF1bHRFbmNPcHRpb24obUVuY29kZUhhbmRsZSwgMCk7CisKKyNpZmRlZiBNUEVHNAorICAgIG1GcmFtZVdpZHRoID0gKChkYXRhW0lEWF9XRF9CWVRFXzFdIDw8IDgpIHwgZGF0YVtJRFhfV0RfQllURV8yXSkgJSBrTWF4V2lkdGg7CisgICAgbUZyYW1lSGVpZ2h0ID0gKChkYXRhW0lEWF9IVF9CWVRFXzFdIDw8IDgpIHwgZGF0YVtJRFhfSFRfQllURV8yXSkgJSBrTWF4SGVpZ2h0OworI2Vsc2UKKyAgICBtRnJhbWVXaWR0aCA9IGtXaWR0aFtkYXRhW0lEWF9XRF9CWVRFXzFdICUga1dpZHRoTnVtXTsKKyAgICBtRnJhbWVIZWlnaHQgPSBrSGVpZ2h0W2RhdGFbSURYX0hUX0JZVEVfMV0gJSBrSGVpZ2h0TnVtXTsKKyNlbmRpZgorICAgIG1GcmFtZVJhdGUgPSBkYXRhW0lEWF9GUkFNRV9SQVRFXTsKKyAgICBtRW5jb2RlSGFuZGxlLT5yY1R5cGUgPSBrcmNUeXBlW2RhdGFbSURYX1JDX1RZUEVdICUga3JjVHlwZU51bV07CisgICAgbUVuY29kZUhhbmRsZS0+cHJvZmlsZV9sZXZlbCA9IENPUkVfUFJPRklMRV9MRVZFTDI7CisgICAgbUVuY29kZUhhbmRsZS0+cGFja2V0U2l6ZSA9IGRhdGFbSURYX1BBQ0tFVF9TSVpFXTsKKyAgICBtRW5jb2RlSGFuZGxlLT5pUXVhbnRbMF0gPSAoZGF0YVtJRFhfSV9GUkFNRV9RUF0gJSBrTWF4UVApICsgMTsKKyAgICBtRW5jb2RlSGFuZGxlLT5wUXVhbnRbMF0gPSAoZGF0YVtJRFhfUF9GUkFNRV9RUF0gJSBrTWF4UVApICsgMTsKKyAgICBtRW5jb2RlSGFuZGxlLT5ydmxjRW5hYmxlID0gKGRhdGFbSURYX0VOQUJMRV9SVkxDXSAmIDB4MDEpID8gUFZfT0ZGIDogUFZfT047CisgICAgbUVuY29kZUhhbmRsZS0+cXVhbnRUeXBlWzBdID0gKGRhdGFbSURYX1FVQU5UX1RZUEVdICYgMHgwMSkgPyAwIDogMTsKKyAgICBtRW5jb2RlSGFuZGxlLT5ub0ZyYW1lU2tpcHBlZCA9IChkYXRhW0lEWF9OT19GUkFNRV9TS0lQUEVEX0ZMQUddICYgMHgwMSkgPyBQVl9PRkYgOiBQVl9PTjsKKyAgICBtRW5jb2RlSGFuZGxlLT5zY2VuZURldGVjdCA9IChkYXRhW0lEWF9FTkFCTEVfU0NFTkVfREVURUNUXSAmIDB4MDEpID8gUFZfT0ZGIDogUFZfT047CisgICAgbUVuY29kZUhhbmRsZS0+bnVtSW50cmFNQiA9IGRhdGFbSURYX05VTV9JTlRSQV9NQl0gJiAweDA3OworICAgIG1FbmNvZGVIYW5kbGUtPnNlYXJjaFJhbmdlID0gZGF0YVtJRFhfU0VBUkNIX1JBTkdFXSAmIDB4MUY7CisgICAgbUVuY29kZUhhbmRsZS0+bXY4eDhFbmFibGUgPSAoZGF0YVtJRFhfRU5BQkxFX01WXzh4OF0gJiAweDAxKSA/IFBWX09GRiA6IFBWX09OOworICAgIG1FbmNvZGVIYW5kbGUtPnVzZUFDUHJlZCA9IChkYXRhW0lEWF9VU0VfQUNfUFJFRF0gJiAweDAxKSA/IFBWX09GRiA6IFBWX09OOworICAgIG1FbmNvZGVIYW5kbGUtPmludHJhRENWbGNUaCA9IGRhdGFbSURYX0lOVFJBX0RDX1ZMQ19USFJFU0hPTERdICYgMHgwNzsKKyAgICBtRW5jb2RlSGFuZGxlLT5lbmNNb2RlID0ga0VuY29kaW5nTW9kZVtkYXRhW0lEWF9FTkNfTU9ERV0gJSBrRW5jb2RpbmdNb2RlTnVtXTsKKyAgICBtRW5jb2RlSGFuZGxlLT5lbmNXaWR0aFswXSA9IG1GcmFtZVdpZHRoOworICAgIG1FbmNvZGVIYW5kbGUtPmVuY0hlaWdodFswXSA9IG1GcmFtZUhlaWdodDsKKyAgICBtRW5jb2RlSGFuZGxlLT5lbmNGcmFtZVJhdGVbMF0gPSBtRnJhbWVSYXRlOworICAgIG1FbmNvZGVIYW5kbGUtPnRpY2tQZXJTcmMgPSBtRW5jb2RlSGFuZGxlLT50aW1lSW5jUmVzIC8gbUZyYW1lUmF0ZTsKKyAgICBtRW5jb2RlSGFuZGxlLT5pbnRyYVBlcmlvZCA9IChrSURSRnJhbWVSZWZyZXNoSW50ZXJ2YWxJblNlYyAqIG1GcmFtZVJhdGUpOworICAgIGlmICghUFZJbml0VmlkZW9FbmNvZGVyKG1FbmNvZGVDb250cm9sLCBtRW5jb2RlSGFuZGxlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENvZGVjOjpkZUluaXRFbmNvZGVyKCkgeworICAgIGlmIChtRW5jb2RlQ29udHJvbCkgeworICAgICAgICBQVkNsZWFuVXBWaWRlb0VuY29kZXIobUVuY29kZUNvbnRyb2wpOworICAgICAgICBkZWxldGUgbUVuY29kZUNvbnRyb2w7CisgICAgICAgIG1FbmNvZGVDb250cm9sID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1FbmNvZGVIYW5kbGUpIHsKKyAgICAgICAgZGVsZXRlIG1FbmNvZGVIYW5kbGU7CisgICAgICAgIG1FbmNvZGVIYW5kbGUgPSBudWxscHRyOworICAgIH0KK30KKwordm9pZCBDb2RlYzo6ZW5jb2RlRnJhbWVzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgc2l6ZV90IGlucHV0QnVmZmVyU2l6ZSA9IChtRnJhbWVXaWR0aCAqIG1GcmFtZUhlaWdodCAqIDMpIC8gMjsKKyAgICBzaXplX3Qgb3V0cHV0QnVmZmVyU2l6ZSA9IGlucHV0QnVmZmVyU2l6ZSAqIDI7CisgICAgdWludDhfdCAqb3V0cHV0QnVmZmVyID0gbmV3IHVpbnQ4X3Rbb3V0cHV0QnVmZmVyU2l6ZV07CisgICAgdWludDhfdCAqaW5wdXRCdWZmZXIgPSBuZXcgdWludDhfdFtpbnB1dEJ1ZmZlclNpemVdOworCisgICAgLy8gR2V0IFZPTCBoZWFkZXIuCisgICAgaW50MzJfdCBzaXplT3V0cHV0QnVmZmVyID0gb3V0cHV0QnVmZmVyU2l6ZTsKKyAgICBQVkdldFZvbEhlYWRlcihtRW5jb2RlQ29udHJvbCwgb3V0cHV0QnVmZmVyLCAmc2l6ZU91dHB1dEJ1ZmZlciwgMCk7CisKKyAgICBzaXplX3QgbnVtRnJhbWUgPSAwOworICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICBzaXplX3QgYnl0ZXNDb25zdW1lZCA9IHN0ZDo6bWluKHNpemUsIGlucHV0QnVmZmVyU2l6ZSk7CisgICAgICAgIG1lbWNweShpbnB1dEJ1ZmZlciwgZGF0YSwgYnl0ZXNDb25zdW1lZCk7CisgICAgICAgIGlmIChieXRlc0NvbnN1bWVkIDwgaW5wdXRCdWZmZXJTaXplKSB7CisgICAgICAgICAgICBtZW1zZXQoaW5wdXRCdWZmZXIgKyBieXRlc0NvbnN1bWVkLCBkYXRhWzBdLCBpbnB1dEJ1ZmZlclNpemUgLSBieXRlc0NvbnN1bWVkKTsKKyAgICAgICAgfQorICAgICAgICBWaWRlb0VuY0ZyYW1lSU8gdmlkZW9Jbnt9LCB2aWRlb091dHt9OworICAgICAgICB2aWRlb0luLmhlaWdodCA9IG1GcmFtZUhlaWdodDsKKyAgICAgICAgdmlkZW9Jbi5waXRjaCA9IG1GcmFtZVdpZHRoOworICAgICAgICB2aWRlb0luLnRpbWVzdGFtcCA9IChudW1GcmFtZSAqIDEwMDApIC8gbUZyYW1lUmF0ZTsKKyAgICAgICAgdmlkZW9Jbi55Q2hhbiA9IGlucHV0QnVmZmVyOworICAgICAgICB2aWRlb0luLnVDaGFuID0gdmlkZW9Jbi55Q2hhbiArIHZpZGVvSW4uaGVpZ2h0ICogdmlkZW9Jbi5waXRjaDsKKyAgICAgICAgdmlkZW9Jbi52Q2hhbiA9IHZpZGVvSW4udUNoYW4gKyAoKHZpZGVvSW4uaGVpZ2h0ICogdmlkZW9Jbi5waXRjaCkgPj4gMik7CisgICAgICAgIHVpbnQzMl90IG1vZFRpbWVNcyA9IDA7CisgICAgICAgIGludDMyX3QgZGF0YUxlbmd0aCA9IG91dHB1dEJ1ZmZlclNpemU7CisgICAgICAgIGludDMyX3QgbkxheWVyID0gMDsKKyAgICAgICAgUFZFbmNvZGVWaWRlb0ZyYW1lKG1FbmNvZGVDb250cm9sLCAmdmlkZW9JbiwgJnZpZGVvT3V0LCAmbW9kVGltZU1zLCBvdXRwdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YUxlbmd0aCwgJm5MYXllcik7CisgICAgICAgIE1QNEhpbnRUcmFjayBoaW50VHJhY2s7CisgICAgICAgIFBWR2V0SGludFRyYWNrKG1FbmNvZGVDb250cm9sLCAmaGludFRyYWNrKTsKKyAgICAgICAgUFZHZXRPdmVycnVuQnVmZmVyKG1FbmNvZGVDb250cm9sKTsKKyAgICAgICAgKytudW1GcmFtZTsKKyAgICAgICAgZGF0YSArPSBieXRlc0NvbnN1bWVkOworICAgICAgICBzaXplIC09IGJ5dGVzQ29uc3VtZWQ7CisgICAgfQorICAgIGRlbGV0ZVtdIGlucHV0QnVmZmVyOworICAgIGRlbGV0ZVtdIG91dHB1dEJ1ZmZlcjsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplIDwgSURYX0xBU1QpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIENvZGVjICpjb2RlYyA9IG5ldyBDb2RlYygpOworICAgIGlmICghY29kZWMpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChjb2RlYy0+aW5pdEVuY29kZXIoZGF0YSkpIHsKKyAgICAgICAgZGF0YSArPSBJRFhfTEFTVDsKKyAgICAgICAgc2l6ZSAtPSBJRFhfTEFTVDsKKyAgICAgICAgY29kZWMtPmVuY29kZUZyYW1lcyhkYXRhLCBzaXplKTsKKyAgICB9CisgICAgZGVsZXRlIGNvZGVjOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9wYXRlbnRfZGlzY2xhaW1lci50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9wYXRlbnRfZGlzY2xhaW1lci50eHQKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9wYXRlbnRfZGlzY2xhaW1lci50eHQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTViOGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTU4IEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfbXAzZGVjX2xpY2Vuc2UiXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZSB0aGF0IHRvb2sgdGhlIGFwcHJvYWNoIG9mCisvLyAnYXBwbHkgZXZlcnkgbGljZW5zZSBmb3VuZCB0byBldmVyeSB0YXJnZXQnLiBXaGlsZSB0aGlzIG1ha2VzIHN1cmUgd2UgcmVzcGVjdAorLy8gZXZlcnkgbGljZW5zZSByZXN0cmljdGlvbiwgaXQgbWF5IG5vdCBiZSBlbnRpcmVseSBjb3JyZWN0LgorLy8KKy8vIGUuZy4gR1BMIGluIGFuIE1JVCBwcm9qZWN0IG1pZ2h0IG9ubHkgYXBwbHkgdG8gdGhlIGNvbnRyaWIvIGRpcmVjdG9yeS4KKy8vCisvLyBQbGVhc2UgY29uc2lkZXIgc3BsaXR0aW5nIHRoZSBzaW5nbGUgbGljZW5zZSBiZWxvdyBpbnRvIG11bHRpcGxlIGxpY2Vuc2VzLAorLy8gdGFraW5nIGNhcmUgbm90IHRvIGxvc2UgYW55IGxpY2Vuc2Vfa2luZCBpbmZvcm1hdGlvbiwgYW5kIG92ZXJyaWRpbmcgdGhlCisvLyBkZWZhdWx0IGxpY2Vuc2UgdXNpbmcgdGhlICdsaWNlbnNlczogWy4uLl0nIHByb3BlcnR5IG9uIHRhcmdldHMgYXMgbmVlZGVkLgorLy8KKy8vIEZvciB1bnVzZWQgZmlsZXMsIGNvbnNpZGVyIGNyZWF0aW5nIGEgJ2ZpbGVHcm91cCcgd2l0aCAiLy92aXNpYmlsaXR5OnByaXZhdGUiCisvLyB0byBhdHRhY2ggdGhlIGxpY2Vuc2UgdG8sIGFuZCBpbmNsdWRpbmcgYSBjb21tZW50IHdoZXRoZXIgdGhlIGZpbGVzIG1heSBiZQorLy8gdXNlZCBpbiB0aGUgY3VycmVudCBwcm9qZWN0LgorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX21wM2RlY19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUJTRCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXAzZGVjX2hlYWRlcnMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGhvc3Rfc3VwcG9ydGVkOnRydWUsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgICAgICJzcmMiLAorICAgIF0sCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tcDNkZWMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorCisgICAgaG9zdF9zdXBwb3J0ZWQ6dHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvcHZtcDNfbm9ybWFsaXplLmNwcCIsCisgICAgICAgICJzcmMvcHZtcDNfYWxpYXNfcmVkdWN0aW9uLmNwcCIsCisgICAgICAgICJzcmMvcHZtcDNfY3JjLmNwcCIsCisgICAgICAgICJzcmMvcHZtcDNfZGVjb2RlX2hlYWRlci5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2RlY29kZV9odWZmX2N3LmNwcCIsCisgICAgICAgICJzcmMvcHZtcDNfZ2V0Yml0cy5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2RlcXVhbnRpemVfc2FtcGxlLmNwcCIsCisgICAgICAgICJzcmMvcHZtcDNfZnJhbWVkZWNvZGVyLmNwcCIsCisgICAgICAgICJzcmMvcHZtcDNfZ2V0X21haW5fZGF0YV9zaXplLmNwcCIsCisgICAgICAgICJzcmMvcHZtcDNfZ2V0X3NpZGVfaW5mby5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2dldF9zY2FsZV9mYWN0b3JzLmNwcCIsCisgICAgICAgICJzcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2RhdGEuY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZmFjdG9ycy5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX21wZWcyX3N0ZXJlb19wcm9jLmNwcCIsCisgICAgICAgICJzcmMvcHZtcDNfaHVmZm1hbl9kZWNvZGluZy5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2h1ZmZtYW5fcGFyc2luZy5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX3RhYmxlcy5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2ltZGN0X3N5bnRoLmNwcCIsCisgICAgICAgICJzcmMvcHZtcDNfbWRjdF82LmNwcCIsCisgICAgICAgICJzcmMvcHZtcDNfZGN0XzYuY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19wb2x5X3BoYXNlX3N5bnRoZXNpcy5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2VxdWFsaXplci5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX3NlZWtfc3luY2guY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19zdGVyZW9fcHJvYy5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX3Jlb3JkZXIuY3BwIiwKKworICAgICAgICAic3JjL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93LmNwcCIsCisgICAgICAgICJzcmMvcHZtcDNfbWRjdF8xOC5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2RjdF85LmNwcCIsCisgICAgICAgICJzcmMvcHZtcDNfZGN0XzE2LmNwcCIsCisgICAgXSwKKworICAgIGFyY2g6IHsKKyAgICAgICAgYXJtOiB7CisgICAgICAgICAgICBleGNsdWRlX3NyY3M6IFsKKyAgICAgICAgICAgICAgICAic3JjL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93LmNwcCIsCisgICAgICAgICAgICAgICAgInNyYy9wdm1wM19tZGN0XzE4LmNwcCIsCisgICAgICAgICAgICAgICAgInNyYy9wdm1wM19kY3RfOS5jcHAiLAorICAgICAgICAgICAgICAgICJzcmMvcHZtcDNfZGN0XzE2LmNwcCIsCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgc3JjczogWworICAgICAgICAgICAgICAgICJzcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2djYy5zIiwKKyAgICAgICAgICAgICAgICAic3JjL2FzbS9wdm1wM19tZGN0XzE4X2djYy5zIiwKKyAgICAgICAgICAgICAgICAic3JjL2FzbS9wdm1wM19kY3RfOV9nY2MucyIsCisgICAgICAgICAgICAgICAgInNyYy9hc20vcHZtcDNfZGN0XzE2X2djYy5zIiwKKyAgICAgICAgICAgIF0sCisKKyAgICAgICAgICAgIGluc3RydWN0aW9uX3NldDogImFybSIsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKKworICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiXSwKKworICAgIGhlYWRlcl9saWJzOiBbImxpYnN0YWdlZnJpZ2h0X21wM2RlY19oZWFkZXJzIl0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJsaWJzdGFnZWZyaWdodF9tcDNkZWNfaGVhZGVycyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE9TQ0xfVU5VU0VEX0FSRyh4KT0odm9pZCkoeCkiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CisKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworY2NfdGVzdCB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wM2RlY190ZXN0IiwKKyAgICBndGVzdDogZmFsc2UsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0L21wM2RlY190ZXN0LmNwcCIsCisgICAgICAgICJ0ZXN0L21wM3JlYWRlci5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJzcmMiLAorICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcDNkZWMiLAorICAgICAgICAibGlic25kZmlsZSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYmF1ZGlvdXRpbHMiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjcy9tcDNkZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvTk9USUNFIGIvbWVkaWEvY29kZWNzL21wM2RlYy9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvTk9USUNFCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL21wM2RlYy9URVNUX01BUFBJTkcgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWY0MzE3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL21wM2RlYy9URVNUX01BUFBJTkcKQEAgLTAsMCArMSw5IEBACisvLyBtYXBwaW5ncyBmb3IgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjCit7CisgIC8vIHRlc3RzIHdoaWNoIHJlcXVpcmUgZHluYW1pYyBjb250ZW50CisgIC8vIGludm9rZSB3aXRoOiBhdGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCisgIC8vIFRPRE8oYi8xNDgwOTQwNTkpOiB1bml0IHRlc3RzIG5vdCBhbGxvd2VkIHRvIGRvd25sb2FkIGNvbnRlbnQKKyAgImR5bmFtaWMtcHJlc3VibWl0IjogWworICAgIHsgIm5hbWUiOiAiTXAzRGVjb2RlclRlc3QifQorICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL2Z1enplci9BbmRyb2lkLmJwCnNpbWlsYXJpdHkgaW5kZXggNjElCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZnV6emVyL0FuZHJvaWQuYnAKY29weSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL2Z1enplci9BbmRyb2lkLmJwCmluZGV4IDU0ZGUxY2MuLjUxNGE4YTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9mdXp6ZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL2Z1enplci9BbmRyb2lkLmJwCkBAIC0xOCwyMCArMTgsMzEgQEAKICAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCiAgKi8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX21wM2RlY19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfbXAzZGVjX2xpY2Vuc2UiXSwKK30KKwogY2NfZnV6eiB7Ci0gICAgbmFtZTogImFtcm5iX2RlY19mdXp6ZXIiLAorICAgIG5hbWU6ICJtcDNfZGVjX2Z1enplciIsCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgc3JjczogWwotICAgICAgICAiYW1ybmJfZGVjX2Z1enplci5jcHAiLAotICAgIF0sCisKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKLSAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcDNkZWMiLAogICAgIF0sCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIGRhcndpbjogewotICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCi0gICAgICAgIH0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtcDNfZGVjX2Z1enplci5jcHAiLAorICAgIF0sCisKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAogICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbXAzZGVjL2Z1enplci9SRUFETUUubWQgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL2Z1enplci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlkZDVjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tcDNkZWMvZnV6emVyL1JFQURNRS5tZApAQCAtMCwwICsxLDU2IEBACisjIEZ1enplciBmb3IgbGlic3RhZ2VmcmlnaHRfbXAzZGVjIGRlY29kZXIKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIG1wMyBkZWNvZGVyIGlzIGRlc2lnbmVkIGJhc2VkIG9uIHRoZSB1bmRlcnN0YW5kaW5nIG9mIHRoZQorY29kZWMgYW5kIHRyaWVzIHRvIGFjaGlldmUgdGhlIGZvbGxvd2luZzoKKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorCitUaGlzIGZ1enplciBtYWtlcyB1c2Ugb2YgdGhlIGZvbGxvd2luZyBjb25maWcgcGFyYW1ldGVyczoKKzEuIEVxdWFsaXplciB0eXBlIChwYXJhbWV0ZXIgbmFtZTogYGVxdWFsaXplclR5cGVgKQorCit8IFBhcmFtZXRlcnwgVmFsaWQgVmFsdWVzfCBDb25maWd1cmVkIFZhbHVlfAorfC0tLS0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS18IC0tLS0tIHwKK3wgYGVxdWFsaXplclR5cGVgIHwgMC4gYGZsYXQgYCAxLiBgYmFzc19ib29zdCBgIDIuIGByb2NrIGAgMy4gYHBvcCBgIDQuIGBqYXp6IGAgNS4gYGNsYXNzaWNhbCBgIDYuIGB0YWxrIGAgNy4gYGZsYXRfIGAgfCBCaXRzIDAsIDEgYW5kIDIgb2YgZmlyc3QgYnl0ZSBvZiBpbnB1dCBzdHJlYW0gfAorfCBgY3JjRW5hYmxlZGAgfCAwLiBgZmFsc2UgYCAxLiBgdHJ1ZSBgfCBCaXQgMCBvZiBzZWNvbmQgYnl0ZSBvZiBpbnB1dCBzdHJlYW0gfAorCisjIyMjIyBNYXhpbWl6ZSB1dGlsaXphdGlvbiBvZiBpbnB1dCBkYXRhCitUaGUgcGx1Z2luIGZlZWRzIHRoZSBlbnRpcmUgaW5wdXQgZGF0YSB0byB0aGUgY29kZWMgdXNpbmcgYSBsb29wLgorICogSWYgdGhlIGRlY29kZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIHRoZSBpbnB1dCBpcyBhZHZhbmNlZCBieSB0aGUgbnVtYmVyCisgICBvZiBieXRlcyB1c2VkIGJ5IHRoZSBkZWNvZGVyLgorICogSWYgdGhlIGRlY29kZSBvcGVyYXRpb24gd2FzIHVuLXN1Y2Nlc3NmdWwsIHRoZSBpbnB1dCBpcyBhZHZhbmNlZCBieSAxIGJ5dGUKKyAgIHRpbGwgaXQgcmVhY2hlcyBhIHZhbGlkIGZyYW1lIG9yIGVuZCBvZiBzdHJlYW0uCisKK1RoaXMgZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gdG9sZXJhdGVzIGFueSBraW5kIG9mIGlucHV0IChlbXB0eSwgaHVnZSwKK21hbGZvcm1lZCwgZXRjKSBhbmQgZG9lc250IGBleGl0KClgIG9uIGFueSBpbnB1dCBhbmQgdGhlcmVieSBpbmNyZWFzaW5nIHRoZQorY2hhbmNlIG9mIGlkZW50aWZ5aW5nIHZ1bG5lcmFiaWxpdGllcy4KKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgbXAzX2RlY19mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIG1wM19kZWNfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgbXAzIGZpbGVzIHRvIHRoYXQgZm9sZGVyLgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9tcDNfZGVjX2Z1enplci9tcDNfZGVjX2Z1enplciBDT1JQVVNfRElSCitgYGAKK1RvIHJ1biBvbiBob3N0CitgYGAKKyAgJCAkQU5EUk9JRF9IT1NUX09VVC9mdXp6L3g4Nl82NC9tcDNfZGVjX2Z1enplci9tcDNfZGVjX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyMgUmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sCisgKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbXAzZGVjL2Z1enplci9tcDNfZGVjX2Z1enplci5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL2Z1enplci9tcDNfZGVjX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3YzhjNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tcDNkZWMvZnV6emVyL21wM19kZWNfZnV6emVyLmNwcApAQCAtMCwwICsxLDIzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxwdm1wM2RlY29kZXJfYXBpLmg+CisKK2NvbnN0ZXhwciBpbnQga01heEZyYW1lU2FtcGxlcyA9IDQ2MDg7Citjb25zdGV4cHIgaW50IGtNYXhDaGFubmVscyA9IDI7Citjb25zdGV4cHIgZV9lcXVhbGl6YXRpb24ga0VxdWFsaXplclR5cGVzW10gPSB7ZmxhdCwgYmFzc19ib29zdCwgcm9jaywgcG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphenosIGNsYXNzaWNhbCwgIHRhbGssIGZsYXRffTsKKworc3RhdGljIGJvb2wgcGFyc2VNcDNIZWFkZXIodWludDMyX3QgaGVhZGVyLCBzaXplX3QgKmZyYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X3NhbXBsaW5nX3JhdGUgPSBudWxscHRyLCB1aW50MzJfdCAqb3V0X2NoYW5uZWxzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfYml0cmF0ZSA9IG51bGxwdHIsIHVpbnQzMl90ICpvdXRfbnVtX3NhbXBsZXMgPSBudWxscHRyKSB7CisgICpmcmFtZV9zaXplID0gMDsKKyAgaWYgKG91dF9zYW1wbGluZ19yYXRlKSAqb3V0X3NhbXBsaW5nX3JhdGUgPSAwOworICBpZiAob3V0X2NoYW5uZWxzKSAqb3V0X2NoYW5uZWxzID0gMDsKKyAgaWYgKG91dF9iaXRyYXRlKSAqb3V0X2JpdHJhdGUgPSAwOworICBpZiAob3V0X251bV9zYW1wbGVzKSAqb3V0X251bV9zYW1wbGVzID0gMDsKKworICBpZiAoKGhlYWRlciAmIDB4ZmZlMDAwMDApICE9IDB4ZmZlMDAwMDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdW5zaWduZWQgdmVyc2lvbiA9IChoZWFkZXIgPj4gMTkpICYgMzsKKyAgaWYgKHZlcnNpb24gPT0gMHgwMSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICB1bnNpZ25lZCBsYXllciA9IChoZWFkZXIgPj4gMTcpICYgMzsKKyAgaWYgKGxheWVyID09IDB4MDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdW5zaWduZWQgYml0cmF0ZV9pbmRleCA9IChoZWFkZXIgPj4gMTIpICYgMHgwZjsKKyAgaWYgKGJpdHJhdGVfaW5kZXggPT0gMCB8fCBiaXRyYXRlX2luZGV4ID09IDB4MGYpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdW5zaWduZWQgc2FtcGxpbmdfcmF0ZV9pbmRleCA9IChoZWFkZXIgPj4gMTApICYgMzsKKyAgaWYgKHNhbXBsaW5nX3JhdGVfaW5kZXggPT0gMykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBzdGF0aWMgY29uc3QgaW50IGtTYW1wbGluZ1JhdGVWMVtdID0gezQ0MTAwLCA0ODAwMCwgMzIwMDB9OworICBpbnQgc2FtcGxpbmdfcmF0ZSA9IGtTYW1wbGluZ1JhdGVWMVtzYW1wbGluZ19yYXRlX2luZGV4XTsKKyAgaWYgKHZlcnNpb24gPT0gMiAvKiBWMiAqLykgeworICAgIHNhbXBsaW5nX3JhdGUgLz0gMjsKKyAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDAgLyogVjIuNSAqLykgeworICAgIHNhbXBsaW5nX3JhdGUgLz0gNDsKKyAgfQorCisgIHVuc2lnbmVkIHBhZGRpbmcgPSAoaGVhZGVyID4+IDkpICYgMTsKKworICBpZiAobGF5ZXIgPT0gMykgeyAgLy8gbGF5ZXIgSQorICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMVtdID0gezMyLCAgNjQsICA5NiwgIDEyOCwgMTYwLCAxOTIsIDIyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTYsIDI4OCwgMzIwLCAzNTIsIDM4NCwgNDE2LCA0NDh9OworICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMltdID0gezMyLCAgNDgsICA1NiwgIDY0LCAgODAsICA5NiwgIDExMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsIDE0NCwgMTYwLCAxNzYsIDE5MiwgMjI0LCAyNTZ9OworCisgICAgaW50IGJpdHJhdGUgPQorICAgICAgICAodmVyc2lvbiA9PSAzIC8qIFYxICovKSA/IGtCaXRyYXRlVjFbYml0cmF0ZV9pbmRleCAtIDFdIDoga0JpdHJhdGVWMltiaXRyYXRlX2luZGV4IC0gMV07CisKKyAgICBpZiAob3V0X2JpdHJhdGUpIHsKKyAgICAgICpvdXRfYml0cmF0ZSA9IGJpdHJhdGU7CisgICAgfQorICAgICpmcmFtZV9zaXplID0gKDEyMDAwICogYml0cmF0ZSAvIHNhbXBsaW5nX3JhdGUgKyBwYWRkaW5nKSAqIDQ7CisgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgKm91dF9udW1fc2FtcGxlcyA9IDM4NDsKKyAgICB9CisgIH0gZWxzZSB7ICAvLyBsYXllciBJSSBvciBJSUkKKyAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFMMltdID0gezMyLCAgNDgsICA1NiwgIDY0LCAgODAsICA5NiwgIDExMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAsIDM4NH07CisgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxTDNbXSA9IHszMiwgIDQwLCAgNDgsICA1NiwgIDY0LCAgODAsICA5NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMH07CisgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYyW10gPSB7OCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwfTsKKyAgICBpbnQgYml0cmF0ZTsKKyAgICBpZiAodmVyc2lvbiA9PSAzIC8qIFYxICovKSB7CisgICAgICBiaXRyYXRlID0KKyAgICAgICAgICAobGF5ZXIgPT0gMiAvKiBMMiAqLykgPyBrQml0cmF0ZVYxTDJbYml0cmF0ZV9pbmRleCAtIDFdIDoga0JpdHJhdGVWMUwzW2JpdHJhdGVfaW5kZXggLSAxXTsKKworICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAqb3V0X251bV9zYW1wbGVzID0gMTE1MjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeyAgLy8gVjIgKG9yIDIuNSkKKyAgICAgIGJpdHJhdGUgPSBrQml0cmF0ZVYyW2JpdHJhdGVfaW5kZXggLSAxXTsKKyAgICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IChsYXllciA9PSAxIC8qIEwzICovKSA/IDU3NiA6IDExNTI7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG91dF9iaXRyYXRlKSB7CisgICAgICAqb3V0X2JpdHJhdGUgPSBiaXRyYXRlOworICAgIH0KKworICAgIGlmICh2ZXJzaW9uID09IDMgLyogVjEgKi8pIHsKKyAgICAgICpmcmFtZV9zaXplID0gMTQ0MDAwICogYml0cmF0ZSAvIHNhbXBsaW5nX3JhdGUgKyBwYWRkaW5nOworICAgIH0gZWxzZSB7ICAvLyBWMiBvciBWMi41CisgICAgICBzaXplX3QgdG1wID0gKGxheWVyID09IDEgLyogTDMgKi8pID8gNzIwMDAgOiAxNDQwMDA7CisgICAgICAqZnJhbWVfc2l6ZSA9IHRtcCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZzsKKyAgICB9CisgIH0KKworICBpZiAob3V0X3NhbXBsaW5nX3JhdGUpIHsKKyAgICAqb3V0X3NhbXBsaW5nX3JhdGUgPSBzYW1wbGluZ19yYXRlOworICB9CisKKyAgaWYgKG91dF9jaGFubmVscykgeworICAgIGludCBjaGFubmVsX21vZGUgPSAoaGVhZGVyID4+IDYpICYgMzsKKyAgICAqb3V0X2NoYW5uZWxzID0gKGNoYW5uZWxfbW9kZSA9PSAzKSA/IDEgOiAyOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBVMzJfQVQoY29uc3QgdWludDhfdCAqcHRyKSB7CisgIHJldHVybiBwdHJbMF0gPDwgMjQgfCBwdHJbMV0gPDwgMTYgfCBwdHJbMl0gPDwgOCB8IHB0clszXTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tIZWFkZXIodWludDggKmhlYWRlciwgc2l6ZV90IGluU2l6ZSkgeworICBzaXplX3QgZnJhbWVTaXplOworICBzaXplX3QgdG90YWxJblNpemUgPSAwOworICBib29sIGlzVmFsaWRCdWZmZXIgPSBmYWxzZTsKKworICB3aGlsZSAodG90YWxJblNpemUgKyA0IDwgaW5TaXplKSB7CisgICAgaXNWYWxpZEJ1ZmZlciA9IHRydWU7CisgICAgdWludDMyX3QgdmFsID0gVTMyX0FUKGhlYWRlciArIHRvdGFsSW5TaXplKTsKKyAgICBpZiAoIXBhcnNlTXAzSGVhZGVyKHZhbCwgJmZyYW1lU2l6ZSwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdG90YWxJblNpemUgKz0gZnJhbWVTaXplOworICB9CisKKyAgcmV0dXJuIChpc1ZhbGlkQnVmZmVyKTsKK30KKworY2xhc3MgQ29kZWMgeworIHB1YmxpYzoKKyAgQ29kZWMoKSA9IGRlZmF1bHQ7CisgIH5Db2RlYygpIHsgZGVJbml0RGVjb2RlcigpOyB9CisKKyAgYm9vbCBpbml0RGVjb2RlcigpOworICB2b2lkIGRlY29kZUZyYW1lcyh1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgIHZvaWQgZGVJbml0RGVjb2RlcigpOworCisgcHJpdmF0ZToKKyAgdFBWTVAzRGVjb2RlckV4dGVybmFsICptQ29uZmlnID0gbnVsbHB0cjsKKyAgdm9pZCAqbURlY29kZXJCdWYgPSBudWxscHRyOworfTsKKworYm9vbCBDb2RlYzo6aW5pdERlY29kZXIoKSB7CisgIG1Db25maWcgPSBuZXcgdFBWTVAzRGVjb2RlckV4dGVybmFse307CisgIGlmICghbUNvbmZpZykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBzaXplX3QgZGVjb2RlckJ1ZlNpemUgPSBwdm1wM19kZWNvZGVyTWVtUmVxdWlyZW1lbnRzKCk7CisgIG1EZWNvZGVyQnVmID0gbWFsbG9jKGRlY29kZXJCdWZTaXplKTsKKyAgaWYgKCFtRGVjb2RlckJ1ZikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBtZW1zZXQobURlY29kZXJCdWYsIDB4MCwgZGVjb2RlckJ1ZlNpemUpOworICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENvZGVjOjpkZWNvZGVGcmFtZXModWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgdWludDhfdCBlcXVhbGl6ZXJUeXBlVmFsdWUgPSAoZGF0YVswXSAmIDB4Nyk7CisgIG1Db25maWctPmVxdWFsaXplclR5cGUgPSBrRXF1YWxpemVyVHlwZXNbZXF1YWxpemVyVHlwZVZhbHVlXTsKKyAgbUNvbmZpZy0+Y3JjRW5hYmxlZCA9IGRhdGFbMV0gJiAweDE7CisKKyAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgYm9vbCBzdGF0dXMgPSBjaGVja0hlYWRlcihkYXRhLCBzaXplKTsKKyAgICBpZiAoIXN0YXR1cykgeworICAgICAgc2l6ZS0tOworICAgICAgZGF0YSsrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIHNpemVfdCBvdXRCdWZTaXplID0ga01heEZyYW1lU2FtcGxlcyAqIGtNYXhDaGFubmVsczsKKyAgICBzaXplX3QgdXNlZEJ5dGVzID0gMDsKKyAgICBpbnQxNl90IG91dHB1dEJ1ZltvdXRCdWZTaXplXTsKKyAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlckN1cnJlbnRMZW5ndGggPSBzaXplOworICAgIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCA9IDA7CisgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJNYXhMZW5ndGggPSAwOworICAgIG1Db25maWctPnBJbnB1dEJ1ZmZlciA9IGRhdGE7CisgICAgbUNvbmZpZy0+cE91dHB1dEJ1ZmZlciA9IG91dHB1dEJ1ZjsKKyAgICBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgPSBvdXRCdWZTaXplIC8gc2l6ZW9mKGludDE2X3QpOworCisgICAgRVJST1JfQ09ERSBkZWNvZGVyRXJyOworICAgIGRlY29kZXJFcnIgPSBwdm1wM19mcmFtZWRlY29kZXIobUNvbmZpZywgbURlY29kZXJCdWYpOworICAgIGlmIChkZWNvZGVyRXJyICE9IE5PX0RFQ09ESU5HX0VSUk9SKSB7CisgICAgICBzaXplLS07CisgICAgICBkYXRhKys7CisgICAgfSBlbHNlIHsKKyAgICAgIHVzZWRCeXRlcyA9IHN0ZDo6bWluKChpbnQzMl90KXNpemUsIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCk7CisgICAgICBzaXplIC09IHVzZWRCeXRlczsKKyAgICAgIGRhdGEgKz0gdXNlZEJ5dGVzOworICAgIH0KKyAgfQorfQorCit2b2lkIENvZGVjOjpkZUluaXREZWNvZGVyKCkgeworICBpZiAobURlY29kZXJCdWYpIHsKKyAgICBmcmVlKG1EZWNvZGVyQnVmKTsKKyAgICBtRGVjb2RlckJ1ZiA9IG51bGxwdHI7CisgIH0KKyAgZGVsZXRlIG1Db25maWc7CisgIG1Db25maWcgPSBudWxscHRyOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmIChzaXplIDwgNCkgeworICAgIHJldHVybiAwOworICB9CisgIENvZGVjICpjb2RlYyA9IG5ldyBDb2RlYygpOworICBpZiAoIWNvZGVjKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGNvZGVjLT5pbml0RGVjb2RlcigpKSB7CisgICAgY29kZWMtPmRlY29kZUZyYW1lcyhjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZGF0YSksIHNpemUpOworICB9CisgIGRlbGV0ZSBjb2RlYzsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL2luY2x1ZGUvbXAzX2RlY29kZXJfc2VsZWN0aW9uLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL2luY2x1ZGUvbXAzX2RlY29kZXJfc2VsZWN0aW9uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvaW5jbHVkZS9tcDNfZGVjb2Rlcl9zZWxlY3Rpb24uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9pbmNsdWRlL21wM19kZWNvZGVyX3NlbGVjdGlvbi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL2luY2x1ZGUvcHZtcDNfYXVkaW9fdHlwZV9kZWZzLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL2luY2x1ZGUvcHZtcDNfYXVkaW9fdHlwZV9kZWZzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvaW5jbHVkZS9wdm1wM19hdWRpb190eXBlX2RlZnMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9pbmNsdWRlL3B2bXAzX2F1ZGlvX3R5cGVfZGVmcy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL2luY2x1ZGUvcHZtcDNkZWNvZGVyX2FwaS5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9pbmNsdWRlL3B2bXAzZGVjb2Rlcl9hcGkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9pbmNsdWRlL3B2bXAzZGVjb2Rlcl9hcGkuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9pbmNsdWRlL3B2bXAzZGVjb2Rlcl9hcGkuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3BhdGVudF9kaXNjbGFpbWVyLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfZGN0XzE2X2djYy5zIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX2RjdF8xNl9nY2MucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX2RjdF8xNl9nY2MucwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX2RjdF8xNl9nY2MucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX2RjdF85X2djYy5zIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX2RjdF85X2djYy5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfZGN0XzlfZ2NjLnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19kY3RfOV9nY2MucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX21kY3RfMThfZ2NjLnMgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfbWRjdF8xOF9nY2MucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX21kY3RfMThfZ2NjLnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19tZGN0XzE4X2djYy5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3dfZ2NjLnMgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3dfZ2NjLnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd19nY2MucwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2djYy5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9tcDNfbWVtX2Z1bmNzLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9tcDNfbWVtX2Z1bmNzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL21wM19tZW1fZnVuY3MuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvbXAzX21lbV9mdW5jcy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNfaHVmZm1hbi5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZfbXAzX2h1ZmZtYW4uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZfbXAzX2h1ZmZtYW4uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZfbXAzX2h1ZmZtYW4uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZfbXAzZGVjX2Z4ZF9vcC5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZfbXAzZGVjX2Z4ZF9vcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3AuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZfbXAzZGVjX2Z4ZF9vcF9hcm0uaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3BfYXJtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3BfYXJtLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3BfYXJtLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3BfYXJtX2djYy5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZfbXAzZGVjX2Z4ZF9vcF9hcm1fZ2NjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3BfYXJtX2djYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX2FybV9nY2MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZfbXAzZGVjX2Z4ZF9vcF9jX2VxdWl2YWxlbnQuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3BfY19lcXVpdmFsZW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3BfY19lcXVpdmFsZW50LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3BfY19lcXVpdmFsZW50LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3BfbXNjX2V2Yy5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZfbXAzZGVjX2Z4ZF9vcF9tc2NfZXZjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3BfbXNjX2V2Yy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX21zY19ldmMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfYWxpYXNfcmVkdWN0aW9uLmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2FsaWFzX3JlZHVjdGlvbi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2FsaWFzX3JlZHVjdGlvbi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2FsaWFzX3JlZHVjdGlvbi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2FsaWFzX3JlZHVjdGlvbi5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfYWxpYXNfcmVkdWN0aW9uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2FsaWFzX3JlZHVjdGlvbi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19hbGlhc19yZWR1Y3Rpb24uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfY3JjLmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2NyYy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2NyYy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2NyYy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2NyYy5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfY3JjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2NyYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19jcmMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGN0XzE2LmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF8xNi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF8xNi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF8xNi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF8xNi5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGN0XzE2LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF8xNi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kY3RfMTYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGN0XzYuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGN0XzYuY3BwCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF82LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGN0XzYuY3BwCmluZGV4IDFmODAxOGEuLmMzMDY4NzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF82LmNwcAorKysgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kY3RfNi5jcHAKQEAgLTExMSw2ICsxMTEsNyBAQAogOyBGVU5DVElPTiBDT0RFCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCiB2b2lkIHB2bXAzX2RjdF82KGludDMyIHZlY1tdKQogewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kY3RfOS5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kY3RfOS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF85LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGN0XzkuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNfZGVmcy5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVjX2RlZnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVjX2RlZnMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVjX2RlZnMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVjb2RlX2hlYWRlci5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNvZGVfaGVhZGVyLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVjb2RlX2hlYWRlci5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlY29kZV9oZWFkZXIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNvZGVfaGVhZGVyLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNvZGVfaGVhZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlY29kZV9oZWFkZXIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVjb2RlX2hlYWRlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNvZGVfaHVmZl9jdy5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNvZGVfaHVmZl9jdy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlY29kZV9odWZmX2N3LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVjb2RlX2h1ZmZfY3cuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNvZGVfaHVmZl9jdy5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVjb2RlX2h1ZmZfY3cuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVjb2RlX2h1ZmZfY3cuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVjb2RlX2h1ZmZfY3cuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVxdWFudGl6ZV9zYW1wbGUuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVxdWFudGl6ZV9zYW1wbGUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZXF1YW50aXplX3NhbXBsZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlcXVhbnRpemVfc2FtcGxlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVxdWFudGl6ZV9zYW1wbGUuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlcXVhbnRpemVfc2FtcGxlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlcXVhbnRpemVfc2FtcGxlLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlcXVhbnRpemVfc2FtcGxlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2VxdWFsaXplci5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19lcXVhbGl6ZXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19lcXVhbGl6ZXIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19lcXVhbGl6ZXIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19lcXVhbGl6ZXIuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2VxdWFsaXplci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19lcXVhbGl6ZXIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZXF1YWxpemVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2ZyYW1lZGVjb2Rlci5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19mcmFtZWRlY29kZXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2ZyYW1lZGVjb2Rlci5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2ZyYW1lZGVjb2Rlci5jcHAKaW5kZXggNWNmMWVkMy4uYTVjN2Y1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZnJhbWVkZWNvZGVyLmNwcAorKysgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19mcmFtZWRlY29kZXIuY3BwCkBAIC0yMTksMTEgKzIxOSw2IEBACiAKICAgICBpZiAoaW5mby0+ZXJyb3JfcHJvdGVjdGlvbikKICAgICB7Ci0gICAgICAgIGlmICghYml0c0F2YWlsYWJsZSgmcFZhcnMtPmlucHV0U3RyZWFtLCAxNikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBTSURFX0lORk9fRVJST1I7Ci0gICAgICAgIH0KLQogICAgICAgICAvKgogICAgICAgICAgKiAgR2V0IGNyYyBjb250ZW50CiAgICAgICAgICAqLwpAQCAtNTk4LDEwICs1OTMsMTggQEAKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50MzIgbkJ5dGVzID0gdGVtcDsgbkJ5dGVzICE9IDA7IG5CeXRlcy0tKSAgLyogcmVhZCBtYWluIGRhdGEuICovCisgICAgICAgICAgICBpbnQzMiB0bXAxID0gKihwdHIrKyk7CisgICAgICAgICAgICBmb3IgKGludDMyIG5CeXRlcyA9IHRlbXAgPj4gMTsgbkJ5dGVzICE9IDA7IG5CeXRlcy0tKSAgLyogcmVhZCBtYWluIGRhdGEuICovCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50MzIgdG1wID0gKihwdHIrKyk7Ci0gICAgICAgICAgICAgICAgZmlsbERhdGFCdWYoJnBWYXJzLT5tYWluRGF0YVN0cmVhbSwgdG1wKTsKKyAgICAgICAgICAgICAgICBpbnQzMiB0bXAyID0gKihwdHIrKyk7CisgICAgICAgICAgICAgICAgZmlsbERhdGFCdWYoJnBWYXJzLT5tYWluRGF0YVN0cmVhbSwgdG1wMSk7CisgICAgICAgICAgICAgICAgZmlsbERhdGFCdWYoJnBWYXJzLT5tYWluRGF0YVN0cmVhbSwgdG1wMik7CisgICAgICAgICAgICAgICAgdG1wMSA9ICoocHRyKyspOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGVtcCYxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbGxEYXRhQnVmKCZwVmFycy0+bWFpbkRhdGFTdHJlYW0sIHRtcDEpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKiBhZGp1c3QgY2lyY3VsYXIgYnVmZmVyIGNvdW50ZXIgKi8KQEAgLTYxMCw5ICs2MTMsMTQgQEAKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgZm9yIChpbnQzMiBuQnl0ZXMgPSB0ZW1wOyBuQnl0ZXMgIT0gMDsgbkJ5dGVzLS0pICAvKiByZWFkIG1haW4gZGF0YS4gKi8KKyAgICAgICAgZm9yIChpbnQzMiBuQnl0ZXMgPSB0ZW1wID4+IDE7IG5CeXRlcyAhPSAwOyBuQnl0ZXMtLSkgIC8qIHJlYWQgbWFpbiBkYXRhLiAqLwogICAgICAgICB7CiAgICAgICAgICAgICBmaWxsRGF0YUJ1ZigmcFZhcnMtPm1haW5EYXRhU3RyZWFtLCAqKHBWYXJzLT5pbnB1dFN0cmVhbS5wQnVmZmVyICsgbW9kdWxlKG9mZnNldCsrICAsIEJVRlNJWkUpKSk7CisgICAgICAgICAgICBmaWxsRGF0YUJ1ZigmcFZhcnMtPm1haW5EYXRhU3RyZWFtLCAqKHBWYXJzLT5pbnB1dFN0cmVhbS5wQnVmZmVyICsgbW9kdWxlKG9mZnNldCsrICAsIEJVRlNJWkUpKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRlbXAmMSkKKyAgICAgICAgeworICAgICAgICAgICAgZmlsbERhdGFCdWYoJnBWYXJzLT5tYWluRGF0YVN0cmVhbSwgKihwVmFycy0+aW5wdXRTdHJlYW0ucEJ1ZmZlciArIG1vZHVsZShvZmZzZXQgICwgQlVGU0laRSkpKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZnJhbWVkZWNvZGVyLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19mcmFtZWRlY29kZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZnJhbWVkZWNvZGVyLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2ZyYW1lZGVjb2Rlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfbWFpbl9kYXRhX3NpemUuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X21haW5fZGF0YV9zaXplLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X21haW5fZGF0YV9zaXplLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X21haW5fZGF0YV9zaXplLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X21haW5fZGF0YV9zaXplLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfbWFpbl9kYXRhX3NpemUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X21haW5fZGF0YV9zaXplLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9tYWluX2RhdGFfc2l6ZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfc2NhbGVfZmFjdG9ycy5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfc2NhbGVfZmFjdG9ycy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9zY2FsZV9mYWN0b3JzLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NjYWxlX2ZhY3RvcnMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfc2NhbGVfZmFjdG9ycy5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NjYWxlX2ZhY3RvcnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NjYWxlX2ZhY3RvcnMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NjYWxlX2ZhY3RvcnMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NpZGVfaW5mby5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfc2lkZV9pbmZvLmNwcApzaW1pbGFyaXR5IGluZGV4IDg3JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfc2lkZV9pbmZvLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NpZGVfaW5mby5jcHAKaW5kZXggMWEzZmNhNS4uZDY0NDIwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NpZGVfaW5mby5jcHAKKysrIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NpZGVfaW5mby5jcHAKQEAgLTczLDcgKzczLDYgQEAKIAogI2luY2x1ZGUgInB2bXAzX2dldF9zaWRlX2luZm8uaCIKICNpbmNsdWRlICJwdm1wM19jcmMuaCIKLSNpbmNsdWRlICJwdm1wM19nZXRiaXRzLmgiCiAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMjYsMjIgKzEyNSwxMiBAQAogICAgIHsKICAgICAgICAgaWYgKHN0ZXJlbyA9PSAxKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWJpdHNBdmFpbGFibGUoaW5wdXRTdHJlYW0sIDE0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU0lERV9JTkZPX0VSUk9SOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICB0bXAgPSBnZXRiaXRzX2NyYyhpbnB1dFN0cmVhbSwgMTQsIGNyYywgaW5mby0+ZXJyb3JfcHJvdGVjdGlvbik7CiAgICAgICAgICAgICBzaS0+bWFpbl9kYXRhX2JlZ2luID0gKHRtcCA8PCAxOCkgPj4gMjM7ICAgIC8qIDkgKi8KICAgICAgICAgICAgIHNpLT5wcml2YXRlX2JpdHMgICAgPSAodG1wIDw8IDI3KSA+PiAyNzsgICAgLyogNSAqLwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgICAgaWYgKCFiaXRzQXZhaWxhYmxlKGlucHV0U3RyZWFtLCAxMikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNJREVfSU5GT19FUlJPUjsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgdG1wID0gZ2V0Yml0c19jcmMoaW5wdXRTdHJlYW0sIDEyLCBjcmMsIGluZm8tPmVycm9yX3Byb3RlY3Rpb24pOwogICAgICAgICAgICAgc2ktPm1haW5fZGF0YV9iZWdpbiA9ICh0bXAgPDwgMjApID4+IDIzOyAgICAvKiA5ICovCiAgICAgICAgICAgICBzaS0+cHJpdmF0ZV9iaXRzICAgID0gKHRtcCA8PCAyOSkgPj4gMjk7ICAgIC8qIDMgKi8KQEAgLTE1MCwxMSArMTM5LDYgQEAKIAogICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzdGVyZW87IGNoKyspCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghYml0c0F2YWlsYWJsZShpbnB1dFN0cmVhbSwgNCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNJREVfSU5GT19FUlJPUjsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgdG1wID0gZ2V0Yml0c19jcmMoaW5wdXRTdHJlYW0sIDQsIGNyYywgaW5mby0+ZXJyb3JfcHJvdGVjdGlvbik7CiAgICAgICAgICAgICBzaS0+Y2hbY2hdLnNjZnNpWzBdID0gKHRtcCA8PCAyOCkgPj4gMzE7ICAgIC8qIDEgKi8KICAgICAgICAgICAgIHNpLT5jaFtjaF0uc2Nmc2lbMV0gPSAodG1wIDw8IDI5KSA+PiAzMTsgICAgLyogMSAqLwpAQCAtMTY2LDExICsxNTAsNiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzdGVyZW87IGNoKyspCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFiaXRzQXZhaWxhYmxlKGlucHV0U3RyZWFtLCAzNCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0lERV9JTkZPX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3Jhbltncl0ucGFydDJfM19sZW5ndGggICAgPSBnZXRiaXRzX2NyYyhpbnB1dFN0cmVhbSwgMTIsIGNyYywgaW5mby0+ZXJyb3JfcHJvdGVjdGlvbik7CiAgICAgICAgICAgICAgICAgdG1wID0gZ2V0Yml0c19jcmMoaW5wdXRTdHJlYW0sIDIyLCBjcmMsIGluZm8tPmVycm9yX3Byb3RlY3Rpb24pOwogCkBAIC0xODEsMTEgKzE2MCw2IEBACiAKICAgICAgICAgICAgICAgICBpZiAoc2ktPmNoW2NoXS5ncmFuW2dyXS53aW5kb3dfc3dpdGNoaW5nX2ZsYWcpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWJpdHNBdmFpbGFibGUoaW5wdXRTdHJlYW0sIDIyKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNJREVfSU5GT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGdldGJpdHNfY3JjKGlucHV0U3RyZWFtLCAyMiwgY3JjLCBpbmZvLT5lcnJvcl9wcm90ZWN0aW9uKTsKIAogICAgICAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bZ3JdLmJsb2NrX3R5cGUgICAgICAgPSAodG1wIDw8IDEwKSA+PiAzMDsgICAvKiAyICovOwpAQCAtMjE4LDExICsxOTIsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWJpdHNBdmFpbGFibGUoaW5wdXRTdHJlYW0sIDIyKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNJREVfSU5GT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGdldGJpdHNfY3JjKGlucHV0U3RyZWFtLCAyMiwgY3JjLCBpbmZvLT5lcnJvcl9wcm90ZWN0aW9uKTsKIAogICAgICAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bZ3JdLnRhYmxlX3NlbGVjdFswXSA9ICh0bXAgPDwgMTApID4+IDI3OyAgIC8qIDUgKi87CkBAIC0yMzUsMTEgKzIwNCw2IEBACiAgICAgICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3Jhbltncl0uYmxvY2tfdHlwZSAgICAgID0gMDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoIWJpdHNBdmFpbGFibGUoaW5wdXRTdHJlYW0sIDMpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNJREVfSU5GT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICB0bXAgPSBnZXRiaXRzX2NyYyhpbnB1dFN0cmVhbSwgMywgY3JjLCBpbmZvLT5lcnJvcl9wcm90ZWN0aW9uKTsKICAgICAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bZ3JdLnByZWZsYWcgICAgICAgICAgICA9ICh0bXAgPDwgMjkpID4+IDMxOyAgICAvKiAxICovCiAgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuW2dyXS5zY2FsZWZhY19zY2FsZSAgICAgPSAodG1wIDw8IDMwKSA+PiAzMTsgICAgLyogMSAqLwpAQCAtMjQ5LDIxICsyMTMsMTEgQEAKICAgICB9CiAgICAgZWxzZSAvKiBMYXllciAzIExTRiAqLwogICAgIHsKLSAgICAgICAgaWYgKCFiaXRzQXZhaWxhYmxlKGlucHV0U3RyZWFtLCA4ICsgc3RlcmVvKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFNJREVfSU5GT19FUlJPUjsKLSAgICAgICAgfQotCiAgICAgICAgIHNpLT5tYWluX2RhdGFfYmVnaW4gPSBnZXRiaXRzX2NyYyhpbnB1dFN0cmVhbSwgICAgICA4LCBjcmMsIGluZm8tPmVycm9yX3Byb3RlY3Rpb24pOwogICAgICAgICBzaS0+cHJpdmF0ZV9iaXRzICAgID0gZ2V0Yml0c19jcmMoaW5wdXRTdHJlYW0sIHN0ZXJlbywgY3JjLCBpbmZvLT5lcnJvcl9wcm90ZWN0aW9uKTsKIAogICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzdGVyZW87IGNoKyspCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghYml0c0F2YWlsYWJsZShpbnB1dFN0cmVhbSwgMzkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBTSURFX0lORk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIHRtcCA9IGdldGJpdHNfY3JjKGlucHV0U3RyZWFtLCAyMSwgY3JjLCBpbmZvLT5lcnJvcl9wcm90ZWN0aW9uKTsKICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3JhblswXS5wYXJ0Ml8zX2xlbmd0aCAgICA9ICh0bXAgPDwgMTEpID4+IDIwOyAgLyogMTIgKi8KICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3JhblswXS5iaWdfdmFsdWVzICAgICAgICA9ICh0bXAgPDwgMjMpID4+IDIzOyAgLyogIDkgKi8KQEAgLTI3NiwxMSArMjMwLDYgQEAKICAgICAgICAgICAgIGlmIChzaS0+Y2hbY2hdLmdyYW5bMF0ud2luZG93X3N3aXRjaGluZ19mbGFnKQogICAgICAgICAgICAgewogCi0gICAgICAgICAgICAgICAgaWYgKCFiaXRzQXZhaWxhYmxlKGlucHV0U3RyZWFtLCAyMikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0lERV9JTkZPX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIHRtcCA9IGdldGJpdHNfY3JjKGlucHV0U3RyZWFtLCAyMiwgY3JjLCBpbmZvLT5lcnJvcl9wcm90ZWN0aW9uKTsKIAogICAgICAgICAgICAgICAgIHNpLT5jaFtjaF0uZ3JhblswXS5ibG9ja190eXBlICAgICAgID0gKHRtcCA8PCAxMCkgPj4gMzA7ICAgLyogMiAqLzsKQEAgLTMxMywxMSArMjYyLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWJpdHNBdmFpbGFibGUoaW5wdXRTdHJlYW0sIDIyKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTSURFX0lORk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgdG1wID0gZ2V0Yml0c19jcmMoaW5wdXRTdHJlYW0sIDIyLCBjcmMsIGluZm8tPmVycm9yX3Byb3RlY3Rpb24pOwogCiAgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuWzBdLnRhYmxlX3NlbGVjdFswXSA9ICh0bXAgPDwgMTApID4+IDI3OyAgIC8qIDUgKi87CkBAIC0zMzAsMTEgKzI3NCw2IEBACiAgICAgICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuWzBdLmJsb2NrX3R5cGUgICAgICA9IDA7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICghYml0c0F2YWlsYWJsZShpbnB1dFN0cmVhbSwgMikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNJREVfSU5GT19FUlJPUjsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgdG1wID0gZ2V0Yml0c19jcmMoaW5wdXRTdHJlYW0sIDIsIGNyYywgaW5mby0+ZXJyb3JfcHJvdGVjdGlvbik7CiAgICAgICAgICAgICBzaS0+Y2hbY2hdLmdyYW5bMF0uc2NhbGVmYWNfc2NhbGUgICAgID0gIHRtcCA+PiAxOyAgLyogMSAqLwogICAgICAgICAgICAgc2ktPmNoW2NoXS5ncmFuWzBdLmNvdW50MXRhYmxlX3NlbGVjdCA9ICB0bXAgJiAxOyAgLyogMSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NpZGVfaW5mby5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NpZGVfaW5mby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfc2lkZV9pbmZvLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9zaWRlX2luZm8uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0Yml0cy5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRiaXRzLmNwcApzaW1pbGFyaXR5IGluZGV4IDc5JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRiaXRzLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0Yml0cy5jcHAKaW5kZXggNGQyNTJlZi4uOGZmNzk1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0Yml0cy5jcHAKKysrIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0Yml0cy5jcHAKQEAgLTExMywxMSArMTEzLDEwIEBACiAKICAgICB1aW50MzIgICAgb2Zmc2V0OwogICAgIHVpbnQzMiAgICBiaXRJbmRleDsKLSAgICB1aW50MzIgICAgYnl0ZXNUb0ZldGNoOwotICAgIHVpbnQ4ICAgICBFbGVtICA9IDA7ICAgICAgICAgLyogTmVlZHMgdG8gYmUgc2FtZSB0eXBlIGFzIHBJbnB1dC0+cEJ1ZmZlciAqLwotICAgIHVpbnQ4ICAgICBFbGVtMSA9IDA7Ci0gICAgdWludDggICAgIEVsZW0yID0gMDsKLSAgICB1aW50OCAgICAgRWxlbTMgPSAwOworICAgIHVpbnQ4ICAgICBFbGVtOyAgICAgICAgIC8qIE5lZWRzIHRvIGJlIHNhbWUgdHlwZSBhcyBwSW5wdXQtPnBCdWZmZXIgKi8KKyAgICB1aW50OCAgICAgRWxlbTE7CisgICAgdWludDggICAgIEVsZW0yOworICAgIHVpbnQ4ICAgICBFbGVtMzsKICAgICB1aW50MzIgICByZXR1cm5WYWx1ZSA9IDA7CiAKICAgICBpZiAoIW5lZWRlZEJpdHMpCkBAIC0xMjcsMjUgKzEyNiwxMCBAQAogCiAgICAgb2Zmc2V0ID0gKHB0Qml0U3RyZWFtLT51c2VkQml0cykgPj4gSU5CVUZfQVJSQVlfSU5ERVhfU0hJRlQ7CiAKLSAgICAvKiBSZW1vdmUgZXh0cmEgaGlnaCBiaXRzIGJ5IHNoaWZ0aW5nIHVwICovCi0gICAgYml0SW5kZXggPSBtb2R1bGUocHRCaXRTdHJlYW0tPnVzZWRCaXRzLCBJTkJVRl9CSVRfV0lEVEgpOwotCi0gICAgYnl0ZXNUb0ZldGNoID0gKGJpdEluZGV4ICsgbmVlZGVkQml0cyArIDcgKSA+PiAzIDsKLQotICAgIHN3aXRjaCAoYnl0ZXNUb0ZldGNoKQotICAgIHsKLSAgICBjYXNlIDQ6Ci0gICAgICAgIEVsZW0zID0gKihwdEJpdFN0cmVhbS0+cEJ1ZmZlciArIG1vZHVsZShvZmZzZXQgKyAzLCBCVUZTSVpFKSk7Ci0gICAgICAgIFtbZmFsbHRocm91Z2hdXTsKLSAgICBjYXNlIDM6Ci0gICAgICAgIEVsZW0yID0gKihwdEJpdFN0cmVhbS0+cEJ1ZmZlciArIG1vZHVsZShvZmZzZXQgKyAyLCBCVUZTSVpFKSk7Ci0gICAgICAgIFtbZmFsbHRocm91Z2hdXTsKLSAgICBjYXNlIDI6Ci0gICAgICAgIEVsZW0xID0gKihwdEJpdFN0cmVhbS0+cEJ1ZmZlciArIG1vZHVsZShvZmZzZXQgKyAxLCBCVUZTSVpFKSk7Ci0gICAgICAgIFtbZmFsbHRocm91Z2hdXTsKLSAgICBjYXNlIDE6Ci0gICAgICAgIEVsZW0gPSAqKHB0Qml0U3RyZWFtLT5wQnVmZmVyICsgbW9kdWxlKG9mZnNldCwgQlVGU0laRSkpOwotICAgIH0KKyAgICBFbGVtICA9ICoocHRCaXRTdHJlYW0tPnBCdWZmZXIgKyBtb2R1bGUob2Zmc2V0ICAsIEJVRlNJWkUpKTsKKyAgICBFbGVtMSA9ICoocHRCaXRTdHJlYW0tPnBCdWZmZXIgKyBtb2R1bGUob2Zmc2V0ICsgMSwgQlVGU0laRSkpOworICAgIEVsZW0yID0gKihwdEJpdFN0cmVhbS0+cEJ1ZmZlciArIG1vZHVsZShvZmZzZXQgKyAyLCBCVUZTSVpFKSk7CisgICAgRWxlbTMgPSAqKHB0Qml0U3RyZWFtLT5wQnVmZmVyICsgbW9kdWxlKG9mZnNldCArIDMsIEJVRlNJWkUpKTsKIAogCiAgICAgcmV0dXJuVmFsdWUgPSAoKCh1aW50MzIpKEVsZW0pKSA8PCAyNCkgfApAQCAtMTUzLDYgKzEzNyw5IEBACiAgICAgICAgICAgICAgICAgICAoKCh1aW50MzIpKEVsZW0yKSkgPDwgOCkgfAogICAgICAgICAgICAgICAgICAgKCh1aW50MzIpKEVsZW0zKSk7CiAKKyAgICAvKiBSZW1vdmUgZXh0cmEgaGlnaCBiaXRzIGJ5IHNoaWZ0aW5nIHVwICovCisgICAgYml0SW5kZXggPSBtb2R1bGUocHRCaXRTdHJlYW0tPnVzZWRCaXRzLCBJTkJVRl9CSVRfV0lEVEgpOworCiAgICAgLyogVGhpcyBsaW5lIGlzIGZhc3RlciB0aGFuIHRvIG1hc2sgb2ZmIHRoZSBoaWdoIGJpdHMuICovCiAgICAgcmV0dXJuVmFsdWUgPDw9IGJpdEluZGV4OwogCkBAIC0xNzQsMzIgKzE2MSwyMiBAQAogCiAgICAgdWludDMyICAgIG9mZnNldDsKICAgICB1aW50MzIgICAgYml0SW5kZXg7Ci0gICAgdWludDMyICAgIGJ5dGVzVG9GZXRjaDsKLSAgICB1aW50OCAgICBFbGVtICA9IDA7ICAgICAgICAgLyogTmVlZHMgdG8gYmUgc2FtZSB0eXBlIGFzIHBJbnB1dC0+cEJ1ZmZlciAqLwotICAgIHVpbnQ4ICAgIEVsZW0xID0gMDsKKyAgICB1aW50OCAgICBFbGVtOyAgICAgICAgIC8qIE5lZWRzIHRvIGJlIHNhbWUgdHlwZSBhcyBwSW5wdXQtPnBCdWZmZXIgKi8KKyAgICB1aW50OCAgICBFbGVtMTsKICAgICB1aW50MTYgICByZXR1cm5WYWx1ZTsKIAogICAgIG9mZnNldCA9IChwdEJpdFN0cmVhbS0+dXNlZEJpdHMpID4+IElOQlVGX0FSUkFZX0lOREVYX1NISUZUOwogCi0gICAgLyogUmVtb3ZlIGV4dHJhIGhpZ2ggYml0cyBieSBzaGlmdGluZyB1cCAqLwotICAgIGJpdEluZGV4ID0gbW9kdWxlKHB0Qml0U3RyZWFtLT51c2VkQml0cywgSU5CVUZfQklUX1dJRFRIKTsKLQotICAgIGJ5dGVzVG9GZXRjaCA9IChiaXRJbmRleCArIG5lZWRlZEJpdHMgKyA3ICkgPj4gMyA7Ci0KLSAgICBpZiAoYnl0ZXNUb0ZldGNoID4gMSkKLSAgICB7Ci0gICAgICAgIEVsZW0gPSAqKHB0Qml0U3RyZWFtLT5wQnVmZmVyICsgbW9kdWxlKG9mZnNldCwgQlVGU0laRSkpOwotICAgICAgICBFbGVtMSA9ICoocHRCaXRTdHJlYW0tPnBCdWZmZXIgKyBtb2R1bGUob2Zmc2V0ICsgMSwgQlVGU0laRSkpOwotICAgIH0KLSAgICBlbHNlIGlmIChieXRlc1RvRmV0Y2ggPiAwKQotICAgIHsKLSAgICAgICAgRWxlbSA9ICoocHRCaXRTdHJlYW0tPnBCdWZmZXIgKyBtb2R1bGUob2Zmc2V0LCBCVUZTSVpFKSk7Ci0gICAgfQorICAgIEVsZW0gID0gKihwdEJpdFN0cmVhbS0+cEJ1ZmZlciArIG1vZHVsZShvZmZzZXQgICwgQlVGU0laRSkpOworICAgIEVsZW0xID0gKihwdEJpdFN0cmVhbS0+cEJ1ZmZlciArIG1vZHVsZShvZmZzZXQgKyAxLCBCVUZTSVpFKSk7CiAKIAogICAgIHJldHVyblZhbHVlID0gKCgodWludDE2KShFbGVtKSkgPDwgOCkgfAogICAgICAgICAgICAgICAgICAgKCh1aW50MTYpKEVsZW0xKSk7CiAKKyAgICAvKiBSZW1vdmUgZXh0cmEgaGlnaCBiaXRzIGJ5IHNoaWZ0aW5nIHVwICovCisgICAgYml0SW5kZXggPSBtb2R1bGUocHRCaXRTdHJlYW0tPnVzZWRCaXRzLCBJTkJVRl9CSVRfV0lEVEgpOworCiAgICAgcHRCaXRTdHJlYW0tPnVzZWRCaXRzICs9IG5lZWRlZEJpdHM7CiAgICAgLyogVGhpcyBsaW5lIGlzIGZhc3RlciB0aGFuIHRvIG1hc2sgb2ZmIHRoZSBoaWdoIGJpdHMuICovCiAgICAgcmV0dXJuVmFsdWUgPSAocmV0dXJuVmFsdWUgPDwgKGJpdEluZGV4KSk7CkBAIC0yMjAsNDAgKzE5NywyNSBAQAogCiAgICAgdWludDMyICAgIG9mZnNldDsKICAgICB1aW50MzIgICAgYml0SW5kZXg7Ci0gICAgdWludDMyICAgIGJ5dGVzVG9GZXRjaDsKLSAgICB1aW50OCAgICAgRWxlbSAgPSAwOyAgICAgICAgIC8qIE5lZWRzIHRvIGJlIHNhbWUgdHlwZSBhcyBwSW5wdXQtPnBCdWZmZXIgKi8KLSAgICB1aW50OCAgICAgRWxlbTEgPSAwOwotICAgIHVpbnQ4ICAgICBFbGVtMiA9IDA7CisgICAgdWludDggICAgIEVsZW07ICAgICAgICAgLyogTmVlZHMgdG8gYmUgc2FtZSB0eXBlIGFzIHBJbnB1dC0+cEJ1ZmZlciAqLworICAgIHVpbnQ4ICAgICBFbGVtMTsKKyAgICB1aW50OCAgICAgRWxlbTI7CiAgICAgdWludDMyICAgcmV0dXJuVmFsdWU7CiAKICAgICBvZmZzZXQgPSAocHRCaXRTdHJlYW0tPnVzZWRCaXRzKSA+PiBJTkJVRl9BUlJBWV9JTkRFWF9TSElGVDsKIAotICAgIC8qIFJlbW92ZSBleHRyYSBoaWdoIGJpdHMgYnkgc2hpZnRpbmcgdXAgKi8KLSAgICBiaXRJbmRleCA9IG1vZHVsZShwdEJpdFN0cmVhbS0+dXNlZEJpdHMsIElOQlVGX0JJVF9XSURUSCk7Ci0KLSAgICBieXRlc1RvRmV0Y2ggPSAoYml0SW5kZXggKyBuZWVkZWRCaXRzICsgNyApID4+IDMgOwotCi0gICAgaWYgKGJ5dGVzVG9GZXRjaCA+IDIpCi0gICAgewotICAgICAgICBFbGVtICA9ICoocHRCaXRTdHJlYW0tPnBCdWZmZXIgKyBtb2R1bGUob2Zmc2V0LCBCVUZTSVpFKSk7Ci0gICAgICAgIEVsZW0xID0gKihwdEJpdFN0cmVhbS0+cEJ1ZmZlciArIG1vZHVsZShvZmZzZXQgKyAxLCBCVUZTSVpFKSk7Ci0gICAgICAgIEVsZW0yID0gKihwdEJpdFN0cmVhbS0+cEJ1ZmZlciArIG1vZHVsZShvZmZzZXQgKyAyLCBCVUZTSVpFKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGJ5dGVzVG9GZXRjaCA+IDEpCi0gICAgewotICAgICAgICBFbGVtICA9ICoocHRCaXRTdHJlYW0tPnBCdWZmZXIgKyBtb2R1bGUob2Zmc2V0LCBCVUZTSVpFKSk7Ci0gICAgICAgIEVsZW0xID0gKihwdEJpdFN0cmVhbS0+cEJ1ZmZlciArIG1vZHVsZShvZmZzZXQgKyAxLCBCVUZTSVpFKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGJ5dGVzVG9GZXRjaCA+IDApCi0gICAgewotICAgICAgICBFbGVtID0gKihwdEJpdFN0cmVhbS0+cEJ1ZmZlciArIG1vZHVsZShvZmZzZXQsIEJVRlNJWkUpKTsKLSAgICB9CisgICAgRWxlbSAgPSAqKHB0Qml0U3RyZWFtLT5wQnVmZmVyICsgbW9kdWxlKG9mZnNldCAgLCBCVUZTSVpFKSk7CisgICAgRWxlbTEgPSAqKHB0Qml0U3RyZWFtLT5wQnVmZmVyICsgbW9kdWxlKG9mZnNldCArIDEsIEJVRlNJWkUpKTsKKyAgICBFbGVtMiA9ICoocHRCaXRTdHJlYW0tPnBCdWZmZXIgKyBtb2R1bGUob2Zmc2V0ICsgMiwgQlVGU0laRSkpOwogCiAKICAgICByZXR1cm5WYWx1ZSA9ICgoKHVpbnQzMikoRWxlbSkpIDw8IDE2KSB8CiAgICAgICAgICAgICAgICAgICAoKCh1aW50MzIpKEVsZW0xKSkgPDwgOCkgfAogICAgICAgICAgICAgICAgICAgKCh1aW50MzIpKEVsZW0yKSk7CiAKKyAgICAvKiBSZW1vdmUgZXh0cmEgaGlnaCBiaXRzIGJ5IHNoaWZ0aW5nIHVwICovCisgICAgYml0SW5kZXggPSBtb2R1bGUocHRCaXRTdHJlYW0tPnVzZWRCaXRzLCBJTkJVRl9CSVRfV0lEVEgpOworCiAgICAgcHRCaXRTdHJlYW0tPnVzZWRCaXRzICs9IG5lZWRlZEJpdHM7CiAgICAgLyogVGhpcyBsaW5lIGlzIGZhc3RlciB0aGFuIHRvIG1hc2sgb2ZmIHRoZSBoaWdoIGJpdHMuICovCiAgICAgcmV0dXJuVmFsdWUgPSAweEZGRkZGRiAmIChyZXR1cm5WYWx1ZSA8PCAoYml0SW5kZXgpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldGJpdHMuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldGJpdHMuaApzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRiaXRzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldGJpdHMuaAppbmRleCBiMDRmZTZkLi5iMDU4YjAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRiaXRzLmgKKysrIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0Yml0cy5oCkBAIC0xMDQsMTEgKzEwNCw2IEBACiA7IEZ1bmN0aW9uIFByb3RvdHlwZSBkZWNsYXJhdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBiaXRzQXZhaWxhYmxlKHRtcDNCaXRzICppbnB1dFN0cmVhbSwgdWludDMyIG5lZWRlZEJpdHMpCi17Ci0gICAgcmV0dXJuIChpbnB1dFN0cmVhbS0+aW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoIDw8IDMpID49IChuZWVkZWRCaXRzICsgaW5wdXRTdHJlYW0tPnVzZWRCaXRzKTsKLX0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA7IEVORAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19odWZmbWFuX2RlY29kaW5nLmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2h1ZmZtYW5fZGVjb2RpbmcuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19odWZmbWFuX2RlY29kaW5nLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfaHVmZm1hbl9kZWNvZGluZy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2h1ZmZtYW5fcGFyc2luZy5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19odWZmbWFuX3BhcnNpbmcuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19odWZmbWFuX3BhcnNpbmcuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19odWZmbWFuX3BhcnNpbmcuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19pbWRjdF9zeW50aC5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19pbWRjdF9zeW50aC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2ltZGN0X3N5bnRoLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfaW1kY3Rfc3ludGguY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19pbWRjdF9zeW50aC5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfaW1kY3Rfc3ludGguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfaW1kY3Rfc3ludGguaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfaW1kY3Rfc3ludGguaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbWRjdF8xOC5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tZGN0XzE4LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbWRjdF8xOC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21kY3RfMTguY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tZGN0XzE4LmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tZGN0XzE4LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21kY3RfMTguaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbWRjdF8xOC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tZGN0XzYuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbWRjdF82LmNwcApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tZGN0XzYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tZGN0XzYuY3BwCmluZGV4IDhkODBlOGYuLjFiYTA4MGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21kY3RfNi5jcHAKKysrIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbWRjdF82LmNwcApAQCAtMTE4LDcgKzExOCw3IEBACiA7IEZVTkNUSU9OIENPREUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQogdm9pZCBwdm1wM19tZGN0XzYoaW50MzIgdmVjW10sIGludDMyICpoaXN0b3J5KQogewogICAgIGludDMyIGk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tZGN0XzYuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21kY3RfNi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tZGN0XzYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbWRjdF82LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9kYXRhLmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9kYXRhLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2RhdGEuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZGF0YS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9kYXRhLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZGF0YS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZGF0YS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZGF0YS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZmFjdG9ycy5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZmFjdG9ycy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9mYWN0b3JzLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2ZhY3RvcnMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZmFjdG9ycy5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2ZhY3RvcnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2ZhY3RvcnMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2ZhY3RvcnMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfc3RlcmVvX3Byb2MuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfc3RlcmVvX3Byb2MuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9zdGVyZW9fcHJvYy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX3N0ZXJlb19wcm9jLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfc3RlcmVvX3Byb2MuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX3N0ZXJlb19wcm9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX3N0ZXJlb19wcm9jLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX3N0ZXJlb19wcm9jLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX25vcm1hbGl6ZS5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19ub3JtYWxpemUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19ub3JtYWxpemUuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19ub3JtYWxpemUuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19ub3JtYWxpemUuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX25vcm1hbGl6ZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19ub3JtYWxpemUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbm9ybWFsaXplLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3BvbHlfcGhhc2Vfc3ludGhlc2lzLmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3BvbHlfcGhhc2Vfc3ludGhlc2lzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcG9seV9waGFzZV9zeW50aGVzaXMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19wb2x5X3BoYXNlX3N5bnRoZXNpcy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3BvbHlfcGhhc2Vfc3ludGhlc2lzLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19wb2x5X3BoYXNlX3N5bnRoZXNpcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19wb2x5X3BoYXNlX3N5bnRoZXNpcy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19wb2x5X3BoYXNlX3N5bnRoZXNpcy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvdy5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvdy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3cuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvdy5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3cuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3cuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3cuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcmVvcmRlci5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19yZW9yZGVyLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcmVvcmRlci5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3Jlb3JkZXIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19yZW9yZGVyLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19yZW9yZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3Jlb3JkZXIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcmVvcmRlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19zZWVrX3N5bmNoLmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3NlZWtfc3luY2guY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19zZWVrX3N5bmNoLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfc2Vla19zeW5jaC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3NlZWtfc3luY2guaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3NlZWtfc3luY2guaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfc2Vla19zeW5jaC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19zZWVrX3N5bmNoLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3N0ZXJlb19wcm9jLmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3N0ZXJlb19wcm9jLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfc3RlcmVvX3Byb2MuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19zdGVyZW9fcHJvYy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3N0ZXJlb19wcm9jLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19zdGVyZW9fcHJvYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19zdGVyZW9fcHJvYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19zdGVyZW9fcHJvYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM190YWJsZXMuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfdGFibGVzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfdGFibGVzLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfdGFibGVzLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfdGFibGVzLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM190YWJsZXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfdGFibGVzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3RhYmxlcy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9zX2h1ZmZjb2RldGFiLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9zX2h1ZmZjb2RldGFiLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3NfaHVmZmNvZGV0YWIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvc19odWZmY29kZXRhYi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9zX21wM2JpdHMuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3NfbXAzYml0cy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9zX21wM2JpdHMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvc19tcDNiaXRzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3NfdG1wM2RlY19jaGFuLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9zX3RtcDNkZWNfY2hhbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9zX3RtcDNkZWNfY2hhbi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9zX3RtcDNkZWNfY2hhbi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9zX3RtcDNkZWNfZmlsZS5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvc190bXAzZGVjX2ZpbGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvc190bXAzZGVjX2ZpbGUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvc190bXAzZGVjX2ZpbGUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZC5icApzaW1pbGFyaXR5IGluZGV4IDcxJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZC5icApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWQuYnAKaW5kZXggMGZmOGIxMi4uZjEwYjZhZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWQuYnAKQEAgLTE0LDkgKzE0LDIwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfbXAzZGVjX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQlNECisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX21wM2RlY19saWNlbnNlIl0sCit9CisKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJNcDNEZWNvZGVyVGVzdCIsCiAgICAgZ3Rlc3Q6IHRydWUsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJtcDNyZWFkZXIuY3BwIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwKaW5kZXggN2ZmOTczMi4uMjk5NTJlYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbAorKysgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCkBAIC0xOSw3ICsxOSw3IEBACiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9Ik1wM0RlY29kZXJUZXN0LT4vZGF0YS9sb2NhbC90bXAvTXAzRGVjb2RlclRlc3QiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgotICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0LnppcD91bnppcD10cnVlIgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0LTEuMi56aXA/dW56aXA9dHJ1ZSIKICAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvTXAzRGVjb2RlclRlc3RSZXMvIiAvPgogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvTXAzRGVjb2RlclRlc3QuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvTXAzRGVjb2RlclRlc3QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3Rlc3QvTXAzRGVjb2RlclRlc3QuY3BwCmluZGV4IDk5NTUzZWMuLjkxMzI2YTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9NcDNEZWNvZGVyVGVzdC5jcHAKKysrIGIvbWVkaWEvY29kZWNzL21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0LmNwcApAQCAtMTg1LDYgKzE4NSw4IEBACiBJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoTXAzRGVjb2RlclRlc3RBbGwsIE1wM0RlY29kZXJUZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKCgiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjLm1wMyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zLm1wMyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYnVnXzEzNjA1Mzg4NS5tcDMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImJiYl8yY2hfNDRrSHpfbGFtZV9jcmMubXAzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJiYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzIikpKTsKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvTXAzRGVjb2RlclRlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0RW52aXJvbm1lbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0RW52aXJvbm1lbnQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0RW52aXJvbm1lbnQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L1JFQURNRS5tZCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvdGVzdC9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9SRUFETUUubWQKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvdGVzdC9SRUFETUUubWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9tcDNkZWNfdGVzdC5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3Rlc3QvbXAzZGVjX3Rlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvbXAzZGVjX3Rlc3QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3Rlc3QvbXAzZGVjX3Rlc3QuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvbXAzcmVhZGVyLmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvdGVzdC9tcDNyZWFkZXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvbXAzcmVhZGVyLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy90ZXN0L21wM3JlYWRlci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9tcDNyZWFkZXIuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvdGVzdC9tcDNyZWFkZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L21wM3JlYWRlci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3Rlc3QvbXAzcmVhZGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvQW5kcm9pZC5icAppbmRleCA3YzRlNjJmLi43NTEzY2IxIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9BbmRyb2lkLmJwCkBAIC0xMiw2ICsxMiwxNSBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJleHRyYWN0b3ItZGVmYXVsdHMiLAogCkBAIC0yMSw3ICszMCw2IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhbmRrIzI5IiwKICAgICBdLAogCiAgICAgLy8gZXh0cmFjdG9ycyBhcmUgc3VwcG9zZWQgdG8gd29yayBvbiBRKDI5KQpAQCAtMzksNiArNDcsMjEgQEAKIAogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGFuZHJvaWQ6IHsKKyAgICAgICAgICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICAgICAgICAgImxpYm1lZGlhbmRrIzI5IiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgICAgIGhvc3Q6IHsKKyAgICAgICAgICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgICAgICAgICAibGlibWVkaWFuZGtfZm9ybWF0IiwKKyAgICAgICAgICAgICAgICAibGlibWVkaWFfbmRrZm9ybWF0cHJpdiIsCisgICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgIH0sCisKICAgICBzYW5pdGl6ZTogewogICAgICAgICBjZmk6IHRydWUsCiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCkBAIC00Niw0ICs2OSw0IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgIH0sCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAKaW5kZXggNjBkM2FlMS4uN2JmM2ExMyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMjAgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2V4dHJhY3RvcnNfYWFjX2xpY2Vuc2UiXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfZXh0cmFjdG9yc19hYWNfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmFhY2V4dHJhY3RvciIsCiAgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWRlZmF1bHRzIl0sCkBAIC0xMCw0ICsyNywxMSBAQAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icAppbmRleCA0OWM5NTY3Li43MTIzNjBkIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMCBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfZXh0cmFjdG9yc19hbXJfbGljZW5zZSJdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9leHRyYWN0b3JzX2Ftcl9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliYW1yZXh0cmFjdG9yIiwKICAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZGVmYXVsdHMiXSwKQEAgLTgsNCArMjUsMTAgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCiAKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwCmluZGV4IDgyNmMxYTAuLjlhMmE3NmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwCkBAIC0xLDYgKzEsMjUgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9leHRyYWN0b3JzX2ZsYWNfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfZXh0cmFjdG9yc19mbGFjX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJmbGFjZXh0cmFjdG9yIiwKLSAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZGVmYXVsdHMiXSwKKyAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZGVmYXVsdHMiLCAibGliYmluZGVyX25ka19ob3N0X3VzZXIiXSwKIAogICAgIHNyY3M6IFsiRkxBQ0V4dHJhY3Rvci5jcHAiXSwKIApAQCAtMjEsNCArNDAsMTIgQEAKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZTgyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvQW5kcm9pZC5icApAQCAtMCwwICsxLDMyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiZXh0cmFjdG9yLWZ1enplcmJhc2UtZGVmYXVsdHMiLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJtZWRpYW5ka19mb3JtYXQiLAorICAgICAgICAibGlibWVkaWFfbmRrZm9ybWF0cHJpdiIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgIF0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImV4dHJhY3Rvci1mdXp6ZXItZGVmYXVsdHMiLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1mdXp6ZXJiYXNlLWRlZmF1bHRzIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliZXh0cmFjdG9yZnV6emVyYmFzZSIsCisgICAgXSwKKworICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJtcGVnMi1leHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIl0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMiIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fd2l0aG91dF9pbWVtb3J5IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMmV4dHJhY3RvciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKKyAgICAgICAgImxpYm1wZWcyZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhc0AxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmV4dHJhY3RvcmZ1enplcmJhc2UiLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1mdXp6ZXJiYXNlLWRlZmF1bHRzIl0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJFeHRyYWN0b3JGdXp6ZXJCYXNlLmNwcCIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIm1wNF9leHRyYWN0b3JfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIl0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtcDRfZXh0cmFjdG9yX2Z1enplci5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy9tcDQiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCisgICAgICAgICJsaWJtcDRleHRyYWN0b3IiLAorICAgIF0sCisKKyAgICBkaWN0aW9uYXJ5OiAibXA0X2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCIsCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJ3YXZfZXh0cmFjdG9yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAid2F2X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvd2F2IiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmZpZm8iLAorICAgICAgICAibGlid2F2ZXh0cmFjdG9yIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJhbXJfZXh0cmFjdG9yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiYW1yX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvYW1yIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmFtcmV4dHJhY3RvciIsCisgICAgXSwKKworICAgIGRpY3Rpb25hcnk6ICJhbXJfZXh0cmFjdG9yX2Z1enplci5kaWN0IiwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIm1rdl9leHRyYWN0b3JfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIl0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJta3ZfZXh0cmFjdG9yX2Z1enplci5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy9ta3YiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlid2VibSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mbGFjZGVjIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAorICAgICAgICAibGlibWt2ZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYkZMQUMiLAorICAgIF0sCisKKyAgICBkaWN0aW9uYXJ5OiAibWt2X2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCIsCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJvZ2dfZXh0cmFjdG9yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAib2dnX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvb2dnIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAorICAgICAgICAibGlidm9yYmlzaWRlYyIsCisgICAgICAgICJsaWJvZ2dleHRyYWN0b3IiLAorICAgIF0sCisKKyAgICBkaWN0aW9uYXJ5OiAib2dnX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCIsCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtcGVnMnBzX2V4dHJhY3Rvcl9mdXp6ZXIiLAorICAgIGRlZmF1bHRzOiBbIm1wZWcyLWV4dHJhY3Rvci1mdXp6ZXItZGVmYXVsdHMiXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIm1wZWcyX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1QRUcyUFMiLAorICAgIF0sCisKKyAgICBkaWN0aW9uYXJ5OiAibXBlZzJwc19leHRyYWN0b3JfZnV6emVyLmRpY3QiLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibXBlZzJ0c19leHRyYWN0b3JfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWyJtcGVnMi1leHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtcGVnMl9leHRyYWN0b3JfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIGRpY3Rpb25hcnk6ICJtcGVnMnRzX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCIsCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtcDNfZXh0cmFjdG9yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAibXAzX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvbXAzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmZpZm8iLAorICAgICAgICAibGlibXAzZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2lkMyIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImFhY19leHRyYWN0b3JfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIl0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJhYWNfZXh0cmFjdG9yX2Z1enplci5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy9hYWMiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYWFjZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJmbGFjX2V4dHJhY3Rvcl9mdXp6ZXIiLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1mdXp6ZXItZGVmYXVsdHMiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImZsYWNfZXh0cmFjdG9yX2Z1enplci5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy9mbGFjIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAorICAgICAgICAibGliRkxBQyIsCisgICAgICAgICJsaWJmbGFjZXh0cmFjdG9yIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAorICAgIF0sCisKKyAgICBkaWN0aW9uYXJ5OiAiZmxhY19leHRyYWN0b3JfZnV6emVyLmRpY3QiLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL0V4dHJhY3RvckZ1enplckJhc2UuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL0V4dHJhY3RvckZ1enplckJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZTg0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvRXh0cmFjdG9yRnV6emVyQmFzZS5jcHAKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkV4dHJhY3RvckZ1enplckJhc2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJFeHRyYWN0b3JGdXp6ZXJCYXNlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitib29sIEV4dHJhY3RvckZ1enplckJhc2U6OnNldERhdGFTb3VyY2UoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbUJ1ZmZlclNvdXJjZSA9IG5ldyBCdWZmZXJTb3VyY2UoZGF0YSwgc2l6ZSk7CisgIG1EYXRhU291cmNlID0gcmVpbnRlcnByZXRfY2FzdDxEYXRhU291cmNlKj4obUJ1ZmZlclNvdXJjZS5nZXQoKSk7CisgIGlmICghbURhdGFTb3VyY2UpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRXh0cmFjdG9yRnV6emVyQmFzZTo6Z2V0RXh0cmFjdG9yRGVmKCkgeworICBmbG9hdCBjb25maWRlbmNlOworICB2b2lkKiBtZXRhID0gbnVsbHB0cjsKKyAgRnJlZU1ldGFGdW5jIGZyZWVNZXRhID0gbnVsbHB0cjsKKworICBFeHRyYWN0b3JEZWYgZXh0cmFjdG9yRGVmID0gR0VURVhUUkFDVE9SREVGKCk7CisgIGlmIChleHRyYWN0b3JEZWYuZGVmX3ZlcnNpb24gPT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YxKSB7CisgICAgZXh0cmFjdG9yRGVmLnUudjIuc25pZmYobURhdGFTb3VyY2UtPndyYXAoKSwgJmNvbmZpZGVuY2UsICZtZXRhLCAmZnJlZU1ldGEpOworICB9IGVsc2UgaWYgKGV4dHJhY3RvckRlZi5kZWZfdmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIpIHsKKyAgICBleHRyYWN0b3JEZWYudS52My5zbmlmZihtRGF0YVNvdXJjZS0+d3JhcCgpLCAmY29uZmlkZW5jZSwgJm1ldGEsICZmcmVlTWV0YSk7CisgIH0KKworICBpZiAobWV0YSAhPSBudWxscHRyICYmIGZyZWVNZXRhICE9IG51bGxwdHIpIHsKKyAgICBmcmVlTWV0YShtZXRhKTsKKyAgfQorfQorCit2b2lkIEV4dHJhY3RvckZ1enplckJhc2U6OmV4dHJhY3RUcmFja3MoKSB7CisgIE1lZGlhQnVmZmVyR3JvdXAqIGJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXAoKTsKKyAgaWYgKCFidWZmZXJHcm91cCkgeworICAgIHJldHVybjsKKyAgfQorICBzaXplX3QgdHJhY2tDb3VudCA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgIGZvciAoc2l6ZV90IHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgdHJhY2tDb3VudDsgKyt0cmFja0luZGV4KSB7CisgICAgTWVkaWFUcmFja0hlbHBlciogdHJhY2sgPSBtRXh0cmFjdG9yLT5nZXRUcmFjayh0cmFja0luZGV4KTsKKyAgICBpZiAoIXRyYWNrKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgZXh0cmFjdFRyYWNrKHRyYWNrLCBidWZmZXJHcm91cCk7CisgICAgZGVsZXRlIHRyYWNrOworICB9CisgIGRlbGV0ZSBidWZmZXJHcm91cDsKK30KKwordm9pZCBFeHRyYWN0b3JGdXp6ZXJCYXNlOjpleHRyYWN0VHJhY2soTWVkaWFUcmFja0hlbHBlciogdHJhY2ssIE1lZGlhQnVmZmVyR3JvdXAqIGJ1ZmZlckdyb3VwKSB7CisgIENNZWRpYVRyYWNrKiBjVHJhY2sgPSB3cmFwKHRyYWNrKTsKKyAgaWYgKCFjVHJhY2spIHsKKyAgICByZXR1cm47CisgIH0KKworICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBjVHJhY2stPnN0YXJ0KHRyYWNrLCBidWZmZXJHcm91cC0+d3JhcCgpKTsKKyAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICBmcmVlKGNUcmFjayk7CisgICAgcmV0dXJuOworICB9CisKKyAgZG8geworICAgIE1lZGlhQnVmZmVySGVscGVyKiBidWZmZXIgPSBudWxscHRyOworICAgIHN0YXR1cyA9IHRyYWNrLT5yZWFkKCZidWZmZXIpOworICAgIGlmIChidWZmZXIpIHsKKyAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgIH0KKyAgfSB3aGlsZSAoc3RhdHVzID09IEFNRURJQV9PSyk7CisKKyAgY1RyYWNrLT5zdG9wKHRyYWNrKTsKKyAgZnJlZShjVHJhY2spOworfQorCit2b2lkIEV4dHJhY3RvckZ1enplckJhc2U6OmdldFRyYWNrc01ldGFkYXRhKCkgeworICBBTWVkaWFGb3JtYXQqIGZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgdWludDMyX3QgZmxhZ3MgPSBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcjo6a0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YTsKKworICBzaXplX3QgdHJhY2tDb3VudCA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgIGZvciAoc2l6ZV90IHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgdHJhY2tDb3VudDsgKyt0cmFja0luZGV4KSB7CisgICAgbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YShmb3JtYXQsIHRyYWNrSW5kZXgsIGZsYWdzKTsKKyAgfQorCisgIEFNZWRpYUZvcm1hdF9kZWxldGUoZm9ybWF0KTsKK30KKwordm9pZCBFeHRyYWN0b3JGdXp6ZXJCYXNlOjpnZXRNZXRhZGF0YSgpIHsKKyAgQU1lZGlhRm9ybWF0KiBmb3JtYXQgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgIG1FeHRyYWN0b3ItPmdldE1ldGFEYXRhKGZvcm1hdCk7CisgIEFNZWRpYUZvcm1hdF9kZWxldGUoZm9ybWF0KTsKK30KKwordm9pZCBFeHRyYWN0b3JGdXp6ZXJCYXNlOjpzZXREYXRhU291cmNlRmxhZ3ModWludDMyX3QgZmxhZ3MpIHsKKyAgbUJ1ZmZlclNvdXJjZS0+c2V0RmxhZ3MoZmxhZ3MpOworfQorCit2b2lkIEV4dHJhY3RvckZ1enplckJhc2U6OnNlZWtBbmRFeHRyYWN0VHJhY2tzKCkgeworICBNZWRpYUJ1ZmZlckdyb3VwKiBidWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwKCk7CisgIGlmICghYnVmZmVyR3JvdXApIHsKKyAgICByZXR1cm47CisgIH0KKyAgc2l6ZV90IHRyYWNrQ291bnQgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICBmb3IgKHNpemVfdCB0cmFja0luZGV4ID0gMDsgdHJhY2tJbmRleCA8IHRyYWNrQ291bnQ7ICsrdHJhY2tJbmRleCkgeworICAgIE1lZGlhVHJhY2tIZWxwZXIqIHRyYWNrID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2sodHJhY2tJbmRleCk7CisgICAgaWYgKCF0cmFjaykgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgQU1lZGlhRm9ybWF0KiB0cmFja01ldGFEYXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIGludDY0X3QgdHJhY2tEdXJhdGlvbiA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcjo6a0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YTsKKyAgICBtRXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKHRyYWNrTWV0YURhdGEsIHRyYWNrSW5kZXgsIGZsYWdzKTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0SW50NjQodHJhY2tNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJnRyYWNrRHVyYXRpb24pOworCisgICAgc2Vla0FuZEV4dHJhY3RUcmFjayh0cmFjaywgYnVmZmVyR3JvdXAsIHRyYWNrRHVyYXRpb24pOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUodHJhY2tNZXRhRGF0YSk7CisgICAgZGVsZXRlIHRyYWNrOworICB9CisgIGRlbGV0ZSBidWZmZXJHcm91cDsKK30KKwordm9pZCBFeHRyYWN0b3JGdXp6ZXJCYXNlOjpzZWVrQW5kRXh0cmFjdFRyYWNrKE1lZGlhVHJhY2tIZWxwZXIqIHRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVyR3JvdXAqIGJ1ZmZlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdHJhY2tEdXJhdGlvbikgeworICBDTWVkaWFUcmFjayogY1RyYWNrID0gd3JhcCh0cmFjayk7CisgIGlmICghY1RyYWNrKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gY1RyYWNrLT5zdGFydCh0cmFjaywgYnVmZmVyR3JvdXAtPndyYXAoKSk7CisgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgZnJlZShjVHJhY2spOworICAgIHJldHVybjsKKyAgfQorCisgIGludDMyX3Qgc2Vla0NvdW50ID0gMDsKKyAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gc2Vla1RvVGltZVN0YW1wOworICB3aGlsZSAoc2Vla0NvdW50IDw9IGtGdXp6ZXJNYXhTZWVrUG9pbnRzQ291bnQpIHsKKyAgICAvKiBUaGlzIGVuc3VyZXMga0Z1enplck1heFNlZWtQb2ludHNDb3VudCBzZWVrIHBvaW50cyBhcmUgd2l0aGluIHRoZSBjbGlwRHVyYXRpb24gYW5kIDEgc2VlaworICAgICAqIHBvaW50IGlzIG91dHNpZGUgb2YgdGhlIGNsaXBEdXJhdGlvbi4KKyAgICAgKi8KKyAgICBpbnQ2NF90IHRpbWVTdGFtcCA9IChzZWVrQ291bnQgKiB0cmFja0R1cmF0aW9uKSAvIChrRnV6emVyTWF4U2Vla1BvaW50c0NvdW50IC0gMSk7CisgICAgc2Vla1RvVGltZVN0YW1wLnB1c2hfYmFjayh0aW1lU3RhbXApOworICAgIHNlZWtDb3VudCsrOworICB9CisKKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHNlZWtPcHRpb25zOworICBzZWVrT3B0aW9ucy5wdXNoX2JhY2soQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFSyB8IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCk7CisgIHNlZWtPcHRpb25zLnB1c2hfYmFjayhDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLIHwgQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkMpOworICBzZWVrT3B0aW9ucy5wdXNoX2JhY2soQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFSyB8IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7CisgIHNlZWtPcHRpb25zLnB1c2hfYmFjayhDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLIHwgQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkMpOworICBzZWVrT3B0aW9ucy5wdXNoX2JhY2soQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFSyB8IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfRlJBTUVfSU5ERVgpOworCisgIGZvciAodWludDMyX3Qgc2Vla09wdGlvbiA6IHNlZWtPcHRpb25zKSB7CisgICAgZm9yIChpbnQ2NF90IHNlZWtQdHMgOiBzZWVrVG9UaW1lU3RhbXApIHsKKyAgICAgIE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zKiBvcHRpb25zID0KKyAgICAgICAgICBuZXcgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnMoc2Vla09wdGlvbiwgc2Vla1B0cyk7CisgICAgICBNZWRpYUJ1ZmZlckhlbHBlciogYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgIHRyYWNrLT5yZWFkKCZidWZmZXIsIG9wdGlvbnMpOworICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgIH0KKyAgICAgIGRlbGV0ZSBvcHRpb25zOworICAgIH0KKyAgfQorCisgIGNUcmFjay0+c3RvcCh0cmFjayk7CisgIGZyZWUoY1RyYWNrKTsKK30KKwordm9pZCBFeHRyYWN0b3JGdXp6ZXJCYXNlOjpwcm9jZXNzRGF0YShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoc2V0RGF0YVNvdXJjZShkYXRhLCBzaXplKSkgeworICAgIGlmIChjcmVhdGVFeHRyYWN0b3IoKSkgeworICAgICAgZ2V0RXh0cmFjdG9yRGVmKCk7CisgICAgICBnZXRNZXRhZGF0YSgpOworICAgICAgZXh0cmFjdFRyYWNrcygpOworICAgICAgZ2V0VHJhY2tzTWV0YWRhdGEoKTsKKyAgICAgIHNlZWtBbmRFeHRyYWN0VHJhY2tzKCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvUkVBRE1FLm1kIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjIzYjVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL1JFQURNRS5tZApAQCAtMCwwICsxLDMyNiBAQAorIyBGdXp6ZXIgZm9yIGV4dHJhY3RvcnMKKworIyMgVGFibGUgb2YgY29udGVudHMKKysgW2xpYmV4dHJhY3RvcmZ1enplcmJhc2VdKCNFeHRyYWN0b3JGdXp6ZXJCYXNlKQorKyBbbGlibXA0ZXh0cmFjdG9yXSgjbXA0RXh0cmFjdG9yRnV6emVyKQorKyBbbGlid2F2ZXh0cmFjdG9yXSgjd2F2RXh0cmFjdG9yRnV6emVyKQorKyBbbGliYW1yZXh0cmFjdG9yXSgjYW1yRXh0cmFjdG9yRnV6emVyKQorKyBbbGlibWt2ZXh0cmFjdG9yXSgjbWt2RXh0cmFjdG9yRnV6emVyKQorKyBbbGlib2dnZXh0cmFjdG9yXSgjb2dnRXh0cmFjdG9yRnV6emVyKQorKyBbbGlibXBlZzJleHRyYWN0b3JdKCNtcGVnMkV4dHJhY3RvckZ1enplcikKKysgW2xpYm1wM2V4dHJhY3Rvcl0oI21wM0V4dHJhY3RvckZ1enplcikKKysgW2xpYmFhY2V4dHJhY3Rvcl0oI2FhY0V4dHJhY3RvckZ1enplcikKKysgW2xpYmZsYWNleHRyYWN0b3JdKCNmbGFjRXh0cmFjdG9yKQorCisjIDxhIG5hbWU9IkV4dHJhY3RvckZ1enplckJhc2UiPjwvYT4gRnV6emVyIGZvciBsaWJleHRyYWN0b3JmdXp6ZXJiYXNlCitBbGwgdGhlIGV4dHJhY3RvcnMgaGF2ZSBhIGNvbW1vbiBBUEkgLSBjcmVhdGluZyBhIGRhdGEgc291cmNlLCBleHRyYWN0aW9uCitvZiBhbGwgdGhlIHRyYWNrcywgZXRjLiBUaGVzZSBjb21tb24gQVBJcyBoYXZlIGJlZW4gYWJzdHJhY3RlZCBpbiBhIGJhc2UgY2xhc3MKK2NhbGxlZCBgRXh0cmFjdG9yRnV6emVyQmFzZWAgdG8gZW5zdXJlIGNvZGUgaXMgcmV1c2VkIGJldHdlZW4gZnV6emVyIHBsdWdpbnMuCisKK0FkZGl0aW9uYWxseSwgYEV4dHJhY3RvckZ1enplckJhc2VgIGFsc28gaGFzIHN1cHBvcnQgZm9yIG1lbW9yeSBiYXNlZCBidWZmZXIKK2BCdWZmZXJTb3VyY2VgIHNpbmNlIHRoZSBmdXp6aW5nIGVuZ2luZSBmZWVkcyBkYXRhIHVzaW5nIG1lbW9yeSBidWZmZXJzIGFuZAordXNhZ2Ugb2Ygc3RhbmRhcmQgZGF0YSBzb3VyY2Ugb2JqZWN0cyBsaWtlIEZpbGVTb3VyY2UsIEhUVFBTb3VyY2UsIGV0Yy4gaXMKK25vdCBmZWFzaWJsZS4KKworIyA8YSBuYW1lPSJtcDRFeHRyYWN0b3JGdXp6ZXIiPjwvYT4gRnV6emVyIGZvciBsaWJtcDRleHRyYWN0b3IKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIE1QNCBleHRyYWN0b3IgdXNlcyB0aGUgYEV4dHJhY3RvckZ1enplckJhc2VgIGNsYXNzIGFuZAoraW1wbGVtZW50cyBvbmx5IHRoZSBgY3JlYXRlRXh0cmFjdG9yYCB0byBjcmVhdGUgdGhlIE1QNCBleHRyYWN0b3IgY2xhc3MuCisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK0RpY3QgZmlsZSAoZGljdGlvbmFyeSBmaWxlKSBpcyBjcmVhdGVkIGZvciBNUDQgdG8gZW5zdXJlIHRoYXQgdGhlIHJlcXVpcmVkIE1QNAorYXRvbXMgYXJlIHByZXNlbnQgaW4gZXZlcnkgaW5wdXQgZmlsZSB0aGF0IGdvZXMgdG8gdGhlIGZ1enplci4KK1RoaXMgZW5zdXJlcyB0aGF0IGxhcmdlciBjb2RlIGdldHMgY292ZXJlZCBhcyBhIHJhbmdlIG9mIE1QNCBhdG9tcyB3aWxsIGJlCitwcmVzZW50IGluIHRoZSBpbnB1dCBkYXRhLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG1wNF9leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBtcDRfZXh0cmFjdG9yX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIE1QNCBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9tcDRfZXh0cmFjdG9yX2Z1enplci9tcDRfZXh0cmFjdG9yX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyA8YSBuYW1lPSJ3YXZFeHRyYWN0b3JGdXp6ZXIiPjwvYT4gRnV6emVyIGZvciBsaWJ3YXZleHRyYWN0b3IKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIFdBViBleHRyYWN0b3IgdXNlcyB0aGUgYEV4dHJhY3RvckZ1enplckJhc2VgIGNsYXNzIGFuZAoraW1wbGVtZW50cyBvbmx5IHRoZSBgY3JlYXRlRXh0cmFjdG9yYCB0byBjcmVhdGUgdGhlIFdBViBleHRyYWN0b3IgY2xhc3MuCisKKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgd2F2X2V4dHJhY3Rvcl9mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIHdhdl9leHRyYWN0b3JfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgd2F2IGZpbGVzIHRvIHRoYXQgZm9sZGVyCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L3dhdl9leHRyYWN0b3JfZnV6emVyL3dhdl9leHRyYWN0b3JfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIDxhIG5hbWU9ImFtckV4dHJhY3RvckZ1enplciI+PC9hPiBGdXp6ZXIgZm9yIGxpYmFtcmV4dHJhY3RvcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgQU1SIGV4dHJhY3RvciB1c2VzIHRoZSBgRXh0cmFjdG9yRnV6emVyQmFzZWAgY2xhc3MgYW5kCitpbXBsZW1lbnRzIG9ubHkgdGhlIGBjcmVhdGVFeHRyYWN0b3JgIHRvIGNyZWF0ZSB0aGUgQU1SIGV4dHJhY3RvciBjbGFzcy4KKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorRGljdCBmaWxlIChkaWN0aW9uYXJ5IGZpbGUpIGlzIGNyZWF0ZWQgZm9yIEFNUiB0byBlbnN1cmUgdGhhdCB0aGUgcmVxdWlyZWQgc3RhcnQKK2J5dGVzIGFyZSBwcmVzZW50IGluIGV2ZXJ5IGlucHV0IGZpbGUgdGhhdCBnb2VzIHRvIHRoZSBmdXp6ZXIuCitUaGlzIGVuc3VyZXMgdGhhdCBsYXJnZXIgY29kZSBnZXRzIGNvdmVyZWQuCisKKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgYW1yX2V4dHJhY3Rvcl9mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIGFtcl9leHRyYWN0b3JfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgQU1SIGZpbGVzIHRvIHRoYXQgZm9sZGVyCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L2Ftcl9leHRyYWN0b3JfZnV6emVyL2Ftcl9leHRyYWN0b3JfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIDxhIG5hbWU9Im1rdkV4dHJhY3RvckZ1enplciI+PC9hPiBGdXp6ZXIgZm9yIGxpYm1rdmV4dHJhY3RvcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgTUtWIGV4dHJhY3RvciB1c2VzIHRoZSBgRXh0cmFjdG9yRnV6emVyQmFzZWAgY2xhc3MgYW5kCitpbXBsZW1lbnRzIG9ubHkgdGhlIGBjcmVhdGVFeHRyYWN0b3JgIHRvIGNyZWF0ZSB0aGUgTUtWIGV4dHJhY3RvciBjbGFzcy4KKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorRGljdCBmaWxlIChkaWN0aW9uYXJ5IGZpbGUpIGlzIGNyZWF0ZWQgZm9yIE1LViB0byBlbnN1cmUgdGhhdCB0aGUgcmVxdWlyZWQgZWxlbWVudAorSUQncyBhcmUgcHJlc2VudCBpbiBldmVyeSBpbnB1dCBmaWxlIHRoYXQgZ29lcyB0byB0aGUgZnV6emVyLgorVGhpcyBlbnN1cmVzIHRoYXQgbGFyZ2VyIGNvZGUgZ2V0cyBjb3ZlcmVkLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG1rdl9leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBta3ZfZXh0cmFjdG9yX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIG1rdiBmaWxlcyB0byB0aGF0IGZvbGRlci4KK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbWt2X2V4dHJhY3Rvcl9mdXp6ZXIvbWt2X2V4dHJhY3Rvcl9mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMgPGEgbmFtZT0ib2dnRXh0cmFjdG9yRnV6emVyIj48L2E+IEZ1enplciBmb3IgbGlib2dnZXh0cmFjdG9yCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBPR0cgZXh0cmFjdG9yIHVzZXMgdGhlIGBFeHRyYWN0b3JGdXp6ZXJCYXNlYCBjbGFzcyBhbmQKK2ltcGxlbWVudHMgb25seSB0aGUgYGNyZWF0ZUV4dHJhY3RvcmAgdG8gY3JlYXRlIHRoZSBPR0cgZXh0cmFjdG9yIG9iamVjdC4KKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorRGljdCBmaWxlIChkaWN0aW9uYXJ5IGZpbGUpIGlzIGNyZWF0ZWQgZm9yIE9HRyB0byBlbnN1cmUgdGhhdCB0aGUgcmVxdWlyZWQgc3RhcnQKK2J5dGVzIGFyZSBwcmVzZW50IGluIGV2ZXJ5IGlucHV0IGZpbGUgdGhhdCBnb2VzIHRvIHRoZSBmdXp6ZXIuCitUaGlzIGVuc3VyZXMgdGhhdCBsYXJnZXIgY29kZSBnZXRzIGNvdmVyZWQuCisKKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgb2dnX2V4dHJhY3Rvcl9mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIG9nZ19leHRyYWN0b3JfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgb2dnIGZpbGVzIHRvIHRoYXQgZm9sZGVyLgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9vZ2dfZXh0cmFjdG9yX2Z1enplci9vZ2dfZXh0cmFjdG9yX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyA8YSBuYW1lPSJtcGVnMkV4dHJhY3RvckZ1enplciI+PC9hPiBGdXp6ZXIgZm9yIGxpYm1wZWcyZXh0cmFjdG9yCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2lucyBmb3IgTVBFRzItUFMgYW5kIE1QRUcyLVRTIGV4dHJhY3RvciB1c2UgdGhlIGBFeHRyYWN0b3JGdXp6ZXJCYXNlYCBjbGFzcyBhbmQKK2ltcGxlbWVudCBvbmx5IHRoZSBgY3JlYXRlRXh0cmFjdG9yYCB0byBjcmVhdGUgdGhlIE1QRUcyLVBTIG9yIE1QRUcyLVRTIGV4dHJhY3Rvcgorb2JqZWN0IHJlc3BlY3RpdmVseS4KKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorRGljdCBmaWxlcyAoZGljdGlvbmFyeSBmaWxlcykgYXJlIGNyZWF0ZWQgZm9yIE1QRUcyLVBTIGFuZCBNUEVHMi1UUyB0byBlbnN1cmUgdGhhdCB0aGUKK3JlcXVpcmVkIHN0YXJ0IGJ5dGVzIGFyZSBwcmVzZW50IGluIGV2ZXJ5IGlucHV0IGZpbGUgdGhhdCBnb2VzIHRvIHRoZSBmdXp6ZXIuCitUaGlzIGVuc3VyZXMgdGhhdCBsYXJnZXIgY29kZSBnZXRzIGNvdmVyZWQuCisKKyMjIyMjIE90aGVyIGNvbnNpZGVyYXRpb25zCitUd28gZnV6emVyIGJpbmFyaWVzIC0gbXBlZzJwc19leHRyYWN0b3JfZnV6emVyIGFuZCBtcGVnMnRzX2V4dHJhY3Rvcl9mdXp6ZXIgYXJlCitnZW5lcmF0ZWQgYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIGEgZmxhZyAtIGBNUEVHMlBTYAorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG1wZWcycHNfZXh0cmFjdG9yX2Z1enplciBhbmQgbXBlZzJ0c19leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBtcGVnMnBzX2V4dHJhY3Rvcl9mdXp6ZXIKKyAgJCBtbSAtaiQobnByb2MpIG1wZWcydHNfZXh0cmFjdG9yX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIG1wZWcyIGZpbGVzIHRvIHRoYXQgZm9sZGVyCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L21wZWcycHNfZXh0cmFjdG9yX2Z1enplci9tcGVnMnBzX2V4dHJhY3Rvcl9mdXp6ZXIgQ09SUFVTX0RJUgorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L21wZWcydHNfZXh0cmFjdG9yX2Z1enplci9tcGVnMnRzX2V4dHJhY3Rvcl9mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMgPGEgbmFtZT0ibXAzRXh0cmFjdG9yRnV6emVyIj48L2E+IEZ1enplciBmb3IgbGlibXAzZXh0cmFjdG9yCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBNUDMgZXh0cmFjdG9yIHVzZXMgdGhlIGBFeHRyYWN0b3JGdXp6ZXJCYXNlYCBjbGFzcyBhbmQKK2ltcGxlbWVudHMgb25seSB0aGUgYGNyZWF0ZUV4dHJhY3RvcmAgdG8gY3JlYXRlIHRoZSBNUDMgZXh0cmFjdG9yIGNsYXNzLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG1wM19leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBtcDNfZXh0cmFjdG9yX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIG1wMyBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9tcDNfZXh0cmFjdG9yX2Z1enplci9tcDNfZXh0cmFjdG9yX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyA8YSBuYW1lPSJhYWNFeHRyYWN0b3JGdXp6ZXIiPjwvYT4gRnV6emVyIGZvciBsaWJhYWNleHRyYWN0b3IKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIEFBQyBleHRyYWN0b3IgdXNlcyB0aGUgYEV4dHJhY3RvckZ1enplckJhc2VgIGNsYXNzIGFuZAoraW1wbGVtZW50cyBvbmx5IHRoZSBgY3JlYXRlRXh0cmFjdG9yYCB0byBjcmVhdGUgdGhlIEFBQyBleHRyYWN0b3IgY2xhc3MuCisKKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgYWFjX2V4dHJhY3Rvcl9mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIGFhY19leHRyYWN0b3JfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgYWFjIGZpbGVzIHRvIHRoYXQgZm9sZGVyCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L2FhY19leHRyYWN0b3JfZnV6emVyL2FhY19leHRyYWN0b3JfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIDxhIG5hbWU9ImZsYWNFeHRyYWN0b3IiPjwvYT4gRnV6emVyIGZvciBsaWJmbGFjZXh0cmFjdG9yCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBGTEFDIGV4dHJhY3RvciB1c2VzIHRoZSBgRXh0cmFjdG9yRnV6emVyQmFzZWAgY2xhc3MgYW5kCitpbXBsZW1lbnRzIG9ubHkgdGhlIGBjcmVhdGVFeHRyYWN0b3JgIHRvIGNyZWF0ZSB0aGUgRkxBQyBleHRyYWN0b3Igb2JqZWN0LgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitEaWN0IGZpbGUgKGRpY3Rpb25hcnkgZmlsZSkgaXMgY3JlYXRlZCBmb3IgRkxBQyB0byBlbnN1cmUgdGhhdCB0aGUgcmVxdWlyZWQgc3RhcnQKK2J5dGVzIGFyZSBwcmVzZW50IGluIGV2ZXJ5IGlucHV0IGZpbGUgdGhhdCBnb2VzIHRvIHRoZSBmdXp6ZXIuCitUaGlzIGVuc3VyZXMgdGhhdCBsYXJnZXIgY29kZSBnZXRzIGNvdmVyZWQuCisKKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgZmxhY19leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBmbGFjX2V4dHJhY3Rvcl9mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBmbGFjIGZpbGVzIHRvIHRoYXQgZm9sZGVyCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L2ZsYWNfZXh0cmFjdG9yX2Z1enplci9mbGFjX2V4dHJhY3Rvcl9mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2FhY19leHRyYWN0b3JfZnV6emVyLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9hYWNfZXh0cmFjdG9yX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhNmNjOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9hYWNfZXh0cmFjdG9yX2Z1enplci5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpbmNsdWRlICJBQUNFeHRyYWN0b3IuaCIKKworI2luY2x1ZGUgIkV4dHJhY3RvckZ1enplckJhc2UuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIEFhY0V4dHJhY3RvciA6IHB1YmxpYyBFeHRyYWN0b3JGdXp6ZXJCYXNlIHsKKyBwdWJsaWM6CisgIEFhY0V4dHJhY3RvcigpID0gZGVmYXVsdDsKKyAgfkFhY0V4dHJhY3RvcigpID0gZGVmYXVsdDsKKworICBib29sIGNyZWF0ZUV4dHJhY3RvcigpOworfTsKKworYm9vbCBBYWNFeHRyYWN0b3I6OmNyZWF0ZUV4dHJhY3RvcigpIHsKKyAgbUV4dHJhY3RvciA9IG5ldyBBQUNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIobURhdGFTb3VyY2UtPndyYXAoKSksIDApOworICBpZiAoIW1FeHRyYWN0b3IpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbUV4dHJhY3Rvci0+bmFtZSgpOworICByZXR1cm4gdHJ1ZTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoKCFkYXRhKSB8fCAoc2l6ZSA9PSAwKSkgeworICAgIHJldHVybiAwOworICB9CisgIEFhY0V4dHJhY3RvciogZXh0cmFjdG9yID0gbmV3IEFhY0V4dHJhY3RvcigpOworICBpZiAoZXh0cmFjdG9yKSB7CisgICAgZXh0cmFjdG9yLT5wcm9jZXNzRGF0YShkYXRhLCBzaXplKTsKKyAgICBkZWxldGUgZXh0cmFjdG9yOworICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2Ftcl9leHRyYWN0b3JfZnV6emVyLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9hbXJfZXh0cmFjdG9yX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5ZTFhNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9hbXJfZXh0cmFjdG9yX2Z1enplci5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpbmNsdWRlICJFeHRyYWN0b3JGdXp6ZXJCYXNlLmgiCisKKyNpbmNsdWRlICJBTVJFeHRyYWN0b3IuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIEFtckV4dHJhY3RvciA6IHB1YmxpYyBFeHRyYWN0b3JGdXp6ZXJCYXNlIHsKKyBwdWJsaWM6CisgIEFtckV4dHJhY3RvcigpID0gZGVmYXVsdDsKKyAgfkFtckV4dHJhY3RvcigpID0gZGVmYXVsdDsKKworICBib29sIGNyZWF0ZUV4dHJhY3RvcigpOworfTsKKworYm9vbCBBbXJFeHRyYWN0b3I6OmNyZWF0ZUV4dHJhY3RvcigpIHsKKyAgbUV4dHJhY3RvciA9IG5ldyBBTVJFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIobURhdGFTb3VyY2UtPndyYXAoKSkpOworICBpZiAoIW1FeHRyYWN0b3IpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbUV4dHJhY3Rvci0+bmFtZSgpOworICByZXR1cm4gdHJ1ZTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoKCFkYXRhKSB8fCAoc2l6ZSA9PSAwKSkgeworICAgIHJldHVybiAwOworICB9CisgIEFtckV4dHJhY3RvciogZXh0cmFjdG9yID0gbmV3IEFtckV4dHJhY3RvcigpOworICBpZiAoZXh0cmFjdG9yKSB7CisgICAgZXh0cmFjdG9yLT5wcm9jZXNzRGF0YShkYXRhLCBzaXplKTsKKyAgICBkZWxldGUgZXh0cmFjdG9yOworICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2Ftcl9leHRyYWN0b3JfZnV6emVyLmRpY3QgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvYW1yX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzU3MjZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2Ftcl9leHRyYWN0b3JfZnV6emVyLmRpY3QKQEAgLTAsMCArMSwyIEBACisjIFN0YXJ0IGNvZGUKK2t3MT0iIyFBTVIiCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvZmxhY19leHRyYWN0b3JfZnV6emVyLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9mbGFjX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MzRkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvZmxhY19leHRyYWN0b3JfZnV6emVyLmNwcApAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworI2luY2x1ZGUgIkV4dHJhY3RvckZ1enplckJhc2UuaCIKKworI2luY2x1ZGUgIkZMQUNFeHRyYWN0b3IuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIEZsYWNFeHRyYWN0b3IgOiBwdWJsaWMgRXh0cmFjdG9yRnV6emVyQmFzZSB7CisgcHVibGljOgorICBGbGFjRXh0cmFjdG9yKCkgPSBkZWZhdWx0OworICB+RmxhY0V4dHJhY3RvcigpID0gZGVmYXVsdDsKKworICBib29sIGNyZWF0ZUV4dHJhY3RvcigpOworfTsKKworYm9vbCBGbGFjRXh0cmFjdG9yOjpjcmVhdGVFeHRyYWN0b3IoKSB7CisgIG1FeHRyYWN0b3IgPSBuZXcgRkxBQ0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihtRGF0YVNvdXJjZS0+d3JhcCgpKSk7CisgIGlmICghbUV4dHJhY3RvcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBtRXh0cmFjdG9yLT5uYW1lKCk7CisgIHJldHVybiB0cnVlOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmICgoIWRhdGEpIHx8IChzaXplID09IDApKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgRmxhY0V4dHJhY3RvciogZXh0cmFjdG9yID0gbmV3IEZsYWNFeHRyYWN0b3IoKTsKKyAgaWYgKGV4dHJhY3RvcikgeworICAgIGV4dHJhY3Rvci0+cHJvY2Vzc0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgZGVsZXRlIGV4dHJhY3RvcjsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9mbGFjX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9mbGFjX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2FkNDRmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2ZsYWNfZXh0cmFjdG9yX2Z1enplci5kaWN0CkBAIC0wLDAgKzEsMyBAQAorIyBTdGFydCBjb2RlIChieXRlcyAwLTMpCisjIFRoZSBiZWxvdyA0IGJ5dGVzIGNvcnJlc3BvbmQgdG8gImZMYUMiIGluIEFTQ0lJCitrdzE9Ilx4NjZceDRDXHg2MVx4NDMiCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvaW5jbHVkZS9FeHRyYWN0b3JGdXp6ZXJCYXNlLmggYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvaW5jbHVkZS9FeHRyYWN0b3JGdXp6ZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyYTFjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9pbmNsdWRlL0V4dHJhY3RvckZ1enplckJhc2UuaApAQCAtMCwwICsxLDEzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpZm5kZWYgX19FWFRSQUNUT1JfRlVaWkVSX0JBU0VfSF9fCisjZGVmaW5lIF9fRVhUUkFDVE9SX0ZVWlpFUl9CQVNFX0hfXworCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworZXh0ZXJuICJDIiB7CithbmRyb2lkOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCk7Cit9CisKK2NvbnN0ZXhwciBpbnQzMl90IGtGdXp6ZXJNYXhTZWVrUG9pbnRzQ291bnQgPSA1OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEV4dHJhY3RvckZ1enplckJhc2UgeworIHB1YmxpYzoKKyAgRXh0cmFjdG9yRnV6emVyQmFzZSgpID0gZGVmYXVsdDsKKyAgdmlydHVhbCB+RXh0cmFjdG9yRnV6emVyQmFzZSgpIHsKKyAgICBpZiAobUV4dHJhY3RvcikgeworICAgICAgZGVsZXRlIG1FeHRyYWN0b3I7CisgICAgICBtRXh0cmFjdG9yID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1CdWZmZXJTb3VyY2UpIHsKKyAgICAgIG1CdWZmZXJTb3VyY2UuY2xlYXIoKTsKKyAgICAgIG1CdWZmZXJTb3VyY2UgPSBudWxscHRyOworICAgIH0KKyAgfQorCisgIC8qKiBGdW5jdGlvbiB0byBjcmVhdGUgdGhlIG1lZGlhIGV4dHJhY3RvciBjb21wb25lbnQuCisgICAgKiBUbyBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVyaXZlZCBjbGFzcy4KKyAgICAqLworICB2aXJ0dWFsIGJvb2wgY3JlYXRlRXh0cmFjdG9yKCkgPSAwOworCisgIC8qKiBQYXJlbnQgY2xhc3MgZnVuY3Rpb25zIHRvIGJlIHJldXNlZCBieSBkZXJpdmVkIGNsYXNzLgorICAgICogVGhlc2UgYXJlIGNvbW1vbiBmb3IgYWxsIG1lZGlhIGV4dHJhY3RvciBjb21wb25lbnRzLgorICAgICovCisgIGJvb2wgc2V0RGF0YVNvdXJjZShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgdm9pZCBnZXRFeHRyYWN0b3JEZWYoKTsKKworICB2b2lkIGV4dHJhY3RUcmFja3MoKTsKKworICB2b2lkIGdldE1ldGFkYXRhKCk7CisKKyAgdm9pZCBnZXRUcmFja3NNZXRhZGF0YSgpOworCisgIHZvaWQgc2V0RGF0YVNvdXJjZUZsYWdzKHVpbnQzMl90IGZsYWdzKTsKKworICB2b2lkIHNlZWtBbmRFeHRyYWN0VHJhY2tzKCk7CisKKyAgdm9pZCBwcm9jZXNzRGF0YShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyBwcm90ZWN0ZWQ6CisgIGNsYXNzIEJ1ZmZlclNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKKyAgIHB1YmxpYzoKKyAgICBCdWZmZXJTb3VyY2UoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgOiBtRGF0YShkYXRhKSwgbUxlbmd0aChsZW5ndGgpIHt9CisgICAgdmlydHVhbCB+QnVmZmVyU291cmNlKCkgeyBtRGF0YSA9IG51bGxwdHI7IH0KKworICAgIHZvaWQgc2V0RmxhZ3ModWludDMyX3QgZmxhZ3MpIHsgbUZsYWdzID0gZmxhZ3M7IH0KKworICAgIHVpbnQzMl90IGZsYWdzKCkgeyByZXR1cm4gbUZsYWdzOyB9CisKKyAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCB7IHJldHVybiBtRGF0YSAhPSBudWxscHRyID8gT0sgOiBOT19JTklUOyB9CisKKyAgICBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAgIGlmICghbURhdGEpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICB9CisKKyAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICBpZiAoKG9mZnNldCA+PSBzdGF0aWNfY2FzdDxvZmY2NF90PihtTGVuZ3RoKSkgfHwgKG9mZnNldCA8IDApKSB7CisgICAgICAgIHJldHVybiAwOyAgLy8gcmVhZCBiZXlvbmQgYm91bmRzLgorICAgICAgfQorICAgICAgc2l6ZV90IG51bUF2YWlsYWJsZSA9IG1MZW5ndGggLSBzdGF0aWNfY2FzdDxzaXplX3Q+KG9mZnNldCk7CisgICAgICBpZiAoc2l6ZSA+IG51bUF2YWlsYWJsZSkgeworICAgICAgICBzaXplID0gbnVtQXZhaWxhYmxlOworICAgICAgfQorICAgICAgcmV0dXJuIHJlYWRBdF9sKG9mZnNldCwgZGF0YSwgc2l6ZSk7CisgICAgfQorCisgICAgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90KiBzaXplKSB7CisgICAgICBpZiAoIW1EYXRhKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgfQorCisgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgKnNpemUgPSBzdGF0aWNfY2FzdDxvZmY2NF90PihtTGVuZ3RoKTsKKyAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgIHByb3RlY3RlZDoKKyAgICBzc2l6ZV90IHJlYWRBdF9sKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgICAgdm9pZCogcmVzdWx0ID0gbWVtY3B5KGRhdGEsIG1EYXRhICsgb2Zmc2V0LCBzaXplKTsKKyAgICAgIHJldHVybiByZXN1bHQgIT0gbnVsbHB0ciA/IHNpemUgOiAwOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QqIG1EYXRhID0gbnVsbHB0cjsKKyAgICBzaXplX3QgbUxlbmd0aCA9IDA7CisgICAgTXV0ZXggbUxvY2s7CisgICAgdWludDMyX3QgbUZsYWdzID0gMDsKKworICAgcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhCdWZmZXJTb3VyY2UpOworICB9OworCisgIHNwPEJ1ZmZlclNvdXJjZT4gbUJ1ZmZlclNvdXJjZTsKKyAgRGF0YVNvdXJjZSogbURhdGFTb3VyY2UgPSBudWxscHRyOworICBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciogbUV4dHJhY3RvciA9IG51bGxwdHI7CisKKyAgdmlydHVhbCB2b2lkIGV4dHJhY3RUcmFjayhNZWRpYVRyYWNrSGVscGVyKiB0cmFjaywgTWVkaWFCdWZmZXJHcm91cCogYnVmZmVyR3JvdXApOworICB2aXJ0dWFsIHZvaWQgc2Vla0FuZEV4dHJhY3RUcmFjayhNZWRpYVRyYWNrSGVscGVyKiB0cmFjaywgTWVkaWFCdWZmZXJHcm91cCogYnVmZmVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdHJhY2tEdXJhdGlvbik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIF9fRVhUUkFDVE9SX0ZVWlpFUl9CQVNFX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21rdl9leHRyYWN0b3JfZnV6emVyLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9ta3ZfZXh0cmFjdG9yX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlYjkzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9ta3ZfZXh0cmFjdG9yX2Z1enplci5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpbmNsdWRlICJFeHRyYWN0b3JGdXp6ZXJCYXNlLmgiCisKKyNpbmNsdWRlICJNYXRyb3NrYUV4dHJhY3Rvci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgTUtWRXh0cmFjdG9yIDogcHVibGljIEV4dHJhY3RvckZ1enplckJhc2UgeworIHB1YmxpYzoKKyAgTUtWRXh0cmFjdG9yKCkgPSBkZWZhdWx0OworICB+TUtWRXh0cmFjdG9yKCkgPSBkZWZhdWx0OworCisgIGJvb2wgY3JlYXRlRXh0cmFjdG9yKCk7Cit9OworCitib29sIE1LVkV4dHJhY3Rvcjo6Y3JlYXRlRXh0cmFjdG9yKCkgeworICBtRXh0cmFjdG9yID0gbmV3IE1hdHJvc2thRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpKTsKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBNS1ZFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyBNS1ZFeHRyYWN0b3IoKTsKKyAgaWYgKGV4dHJhY3RvcikgeworICAgIGV4dHJhY3Rvci0+cHJvY2Vzc0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgZGVsZXRlIGV4dHJhY3RvcjsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9ta3ZfZXh0cmFjdG9yX2Z1enplci5kaWN0IGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21rdl9leHRyYWN0b3JfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4MTVkYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9ta3ZfZXh0cmFjdG9yX2Z1enplci5kaWN0CkBAIC0wLDAgKzEsMjQ0IEBACisjIEVsZW1lbnRzIElEJ3MKK2t3MT0iXHg0Mlx4ODYiCitrdzI9Ilx4NDJceEY3Igora3czPSJceDQyXHhGMiIKK2t3ND0iXHg0Mlx4RjMiCitrdzU9Ilx4NDJceDg3Igora3c2PSJceDQyXHg4NSIKK2t3Nz0iXHgxOFx4NTNceDgwXHg2NyIKK2t3OD0iXHgxMVx4NERceDlCXHg3NCIKK2t3OT0iXHg0RFx4QkIiCitrdzEwPSJceDUzXHhBQiIKK2t3MTE9Ilx4NTNceEFDIgora3cxMj0iXHgxNVx4NDlceEE5XHg2NiIKK2t3MTM9Ilx4NzNceEE0Igora3cxND0iXHg3M1x4ODQiCitrdzE1PSJceDNDXHhCOVx4MjMiCitrdzE2PSJceDNDXHg4M1x4QUIiCitrdzE3PSJceDNDXHhCOVx4MjMiCitrdzE4PSJceDNFXHg4M1x4QkIiCitrdzE5PSJceDQ0XHg0NCIKK2t3MjA9Ilx4NjlceDI0Igora3cyMT0iXHg2OVx4RkMiCitrdzIyPSJceDY5XHhCRiIKK2t3MjM9Ilx4NjlceEE1Igora3cyND0iXHgyQVx4RDdceEIxIgora3cyNT0iXHg0NFx4ODkiCitrdzI2PSJceDQ0XHg2MSIKK2t3Mjc9Ilx4N0JceEE5Igora3cyOD0iXHg0RFx4ODAiCitrdzI5PSJceDU3XHg0MSIKK2t3MzA9Ilx4MUZceDQzXHhCNlx4NzUiCitrdzMxPSJceEU3Igora3czMj0iXHg1OFx4NTQiCitrdzMzPSJceDU4XHhENyIKK2t3MzQ9Ilx4QTciCitrdzM1PSJceEFCIgora3czNj0iXHhBMyIKK2t3Mzc9Ilx4QTAiCitrdzM4PSJceEExIgora3czOT0iXHhBMiIKK2t3NDA9Ilx4NzVceEExIgora3c0MT0iXHgyQVx4RDdceEIxIgora3c0Mj0iXHhBNiIKK2t3NDM9Ilx4RUUiCitrdzQ0PSJceEE1Igora3c0NT0iXHg5QSIKK2t3NDY9Ilx4RkEiCitrdzQ3PSJceEZCIgora3c0OD0iXHhGRCIKK2t3NDk9Ilx4QTQiCitrdzUwPSJceDc1XHhBMiIKK2t3NTE9Ilx4OEUiCitrdzUyPSJceEU4Igora3c1Mz0iXHhDQyIKK2t3NTQ9Ilx4Q0QiCitrdzU1PSJceENCIgora3c1Nj0iXHhDRSIKK2t3NTc9Ilx4Q0YiCitrdzU4PSJceEM4Igora3c1OT0iXHhDOSIKK2t3NjA9Ilx4Q0EiCitrdzYxPSJceEFGIgora3c2Mj0iXHgxNlx4NTRceEFFXHg2QiIKK2t3NjM9Ilx4QUUiCitrdzY0PSJceEQ3Igora3c2NT0iXHg3M1x4QzUiCitrdzY2PSJceDgzIgora3c2Nz0iXHhCOSIKK2t3Njg9Ilx4ODgiCitrdzY5PSJceDU1XHhBQSIKK2t3NzA9Ilx4OUMiCitrdzcxPSJceDZEXHhFNyIKK2t3NzI9Ilx4NkRceEY4Igora3c3Mz0iXHgyM1x4RTNceDgzIgora3c3ND0iXHgyM1x4NEVceDdBIgora3c3NT0iXHgyM1x4MzFceDRGIgora3c3Nj0iXHg1M1x4N0YiCitrdzc3PSJceDU1XHhFRSIKK2t3Nzg9Ilx4NTNceDZFIgora3c3OT0iXHgyMlx4QjVceDlDIgora3c4MD0iXHgyMlx4QjVceDlEIgora3c4MT0iXHg4NiIKK2t3ODI9Ilx4NjNceEEyIgora3c4Mz0iXHgyNVx4ODZceDg4Igora3c4ND0iXHgyNlx4QjJceDQwIgora3c4NT0iXHhBQSIKK2t3ODY9Ilx4NkZceEFCIgora3c4Nz0iXHg1Nlx4QUEiCitrdzg4PSJceDU2XHhCQiIKK2t3ODk9Ilx4NjZceDI0Igora3c5MD0iXHg2Nlx4RkMiCitrdzkxPSJceDY2XHhCRiIKK2t3OTI9Ilx4RTAiCitrdzkzPSJceDlBIgora3c5ND0iXHg5RCIKK2t3OTU9Ilx4NTNceEI4Igora3c5Nj0iXHg1M1x4QzAiCitrdzk3PSJceDUzXHhCOSIKK2t3OTg9Ilx4QjAiCitrdzk5PSJceEJBIgora3cxMDA9Ilx4NTRceEFBIgora3cxMDE9Ilx4NTRceEJCIgora3cxMDI9Ilx4NTRceENDIgora3cxMDM9Ilx4NTRceEREIgora3cxMDQ9Ilx4NTRceEIwIgora3cxMDU9Ilx4NTRceEJBIgora3cxMDY9Ilx4NTRceEIyIgora3cxMDc9Ilx4NTRceEIzIgora3cxMDg9Ilx4MkVceEI1XHgyNCIKK2t3MTA5PSJceDJGXHhCNVx4MjMiCitrdzExMD0iXHgyM1x4ODNceEUzIgora3cxMTE9Ilx4NTVceEIwIgora3cxMTI9Ilx4NTVceEIxIgora3cxMTM9Ilx4NTVceEIyIgora3cxMTQ9Ilx4NTVceEIzIgora3cxMTU9Ilx4NTVceEI0Igora3cxMTY9Ilx4NTVceEI1Igora3cxMTc9Ilx4NTVceEI2Igora3cxMTg9Ilx4NTVceEI3Igora3cxMTk9Ilx4NTVceEI4Igora3cxMjA9Ilx4NTVceEI5Igora3cxMjE9Ilx4NTVceEJBIgora3cxMjI9Ilx4NTVceEJCIgora3cxMjM9Ilx4NTVceEJDIgora3cxMjQ9Ilx4NTVceEJEIgora3cxMjU9Ilx4NTVceEQwIgora3cxMjY9Ilx4NTVceEQxIgora3cxMjc9Ilx4NTVceEQyIgora3cxMjg9Ilx4NTVceEQzIgora3cxMjk9Ilx4NTVceEQ0Igora3cxMzA9Ilx4NTVceEQ1Igora3cxMzE9Ilx4NTVceEQ2Igora3cxMzI9Ilx4NTVceEQ3Igora3cxMzM9Ilx4NTVceEQ4Igora3cxMzQ9Ilx4NTVceEQ5Igora3cxMzU9Ilx4NTVceERBIgora3cxMzY9Ilx4NzZceDcwIgora3cxMzc9Ilx4NzZceDcxIgora3cxMzg9Ilx4NzZceDcyIgora3cxMzk9Ilx4NzZceDczIgora3cxNDA9Ilx4NzZceDc0Igora3cxNDE9Ilx4NzZceDc1Igora3cxNDI9Ilx4RTEiCitrdzE0Mz0iXHhCNSIKK2t3MTQ0PSJceDc4XHhCNSIKK2t3MTQ1PSJceDlGIgora3cxNDY9Ilx4N0RceDdCIgora3cxNDc9Ilx4NjJceDY0Igora3cxNDg9Ilx4RTIiCitrdzE0OT0iXHhFMyIKK2t3MTUwPSJceEU0Igora3cxNTE9Ilx4RTUiCitrdzE1Mj0iXHhFNiIKK2t3MTUzPSJceEU5Igora3cxNTQ9Ilx4RUQiCitrdzE1NT0iXHhDMCIKK2t3MTU2PSJceEMxIgora3cxNTc9Ilx4QzYiCitrdzE1OD0iXHhDNyIKK2t3MTU5PSJceEM0Igora3cxNjA9Ilx4NkRceDgwIgora3cxNjE9Ilx4NjJceDQwIgora3cxNjI9Ilx4NTBceDMxIgora3cxNjM9Ilx4NTBceDMyIgora3cxNjQ9Ilx4NTBceDMzIgora3cxNjU9Ilx4NTBceDM0Igora3cxNjY9Ilx4NTBceDM1Igora3cxNjc9Ilx4NDJceDU0Igora3cxNjg9Ilx4NDJceDU1Igora3cxNjk9Ilx4NDdceEUxIgora3cxNzA9Ilx4NDdceEUyIgora3cxNzE9Ilx4NDdceEU3Igora3cxNzI9Ilx4NDdceEU4Igora3cxNzM9Ilx4NDdceEUzIgora3cxNzQ9Ilx4NDdceEU0Igora3cxNzU9Ilx4NDdceEU1Igora3cxNzY9Ilx4NDdceEU2Igora3cxNzc9Ilx4MUNceDUzXHhCQlx4NkIiCitrdzE3OD0iXHhCQiIKK2t3MTc5PSJceEIzIgora3cxODA9Ilx4QjciCitrdzE4MT0iXHhGNyIKK2t3MTgyPSJceEYxIgora3cxODM9Ilx4RjAiCitrdzE4ND0iXHhCMiIKK2t3MTg1PSJceDUzXHg3OCIKK2t3MTg2PSJceEVBIgora3cxODc9Ilx4REIiCitrdzE4OD0iXHg5NiIKK2t3MTg5PSJceDk3Igora3cxOTA9Ilx4NTNceDVGIgora3cxOTE9Ilx4RUIiCitrdzE5Mj0iXHgxOVx4NDFceEE0XHg2OSIKK2t3MTkzPSJceDQ2XHg3RSIKK2t3MTk0PSJceDQ2XHg2RSIKK2t3MTk1PSJceDQ2XHg2MCIKK2t3MTk2PSJceDQ2XHg1QyIKK2t3MTk3PSJceDQ2XHhBRSIKK2t3MTk4PSJceDQ2XHg3NSIKK2t3MTk5PSJceDQ2XHg2MSIKK2t3MjAwPSJceDQ2XHg2MiIKK2t3MjAxPSJceDEwXHg0M1x4QTdceDcwIgora3cyMDI9Ilx4NDVceEI5Igora3cyMDM9Ilx4NDVceEJDIgora3cyMDQ9Ilx4NDVceEJEIgora3cyMDU9Ilx4NDVceERCIgora3cyMDY9Ilx4NDVceEREIgora3cyMDc9Ilx4QjYiCitrdzIwOD0iXHg3M1x4QzQiCitrdzIwOT0iXHg1Nlx4NTQiCitrdzIxMD0iXHg5MSIKK2t3MjExPSJceDkyIgora3cyMTI9Ilx4OTgiCitrdzIxMz0iXHg0NVx4OTgiCitrdzIxND0iXHg2RVx4NjciCitrdzIxNT0iXHg2RVx4QkMiCitrdzIxNj0iXHg2M1x4QzMiCitrdzIxNz0iXHg4RiIKK2t3MjE4PSJceDg5Igora3cyMTk9Ilx4ODAiCitrdzIyMD0iXHg4NSIKK2t3MjIxPSJceDQzXHg3QyIKK2t3MjIyPSJceDQzXHg3RCIKK2t3MjIzPSJceDQzXHg3RSIKK2t3MjI0PSJceDY5XHg0NCIKK2t3MjI1PSJceDY5XHg1NSIKK2t3MjI2PSJceDQ1XHgwRCIKK2t3MjI3PSJceDY5XHgxMSIKK2t3MjI4PSJceDY5XHgyMiIKK2t3MjI5PSJceDY5XHgzMyIKK2t3MjMwPSJceDEyXHg1NFx4QzNceDY3Igora3cyMzE9Ilx4NzNceDczIgora3cyMzI9Ilx4NjNceEMwIgora3cyMzM9Ilx4NjhceENBIgora3cyMzQ9Ilx4NjNceENBIgora3cyMzU9Ilx4NjNceEM1Igora3cyMzY9Ilx4NjNceEM5Igora3cyMzc9Ilx4NjdceEM4Igora3cyMzg9Ilx4NDVceEEzIgora3cyMzk9Ilx4NDRceDdBIgora3cyNDA9Ilx4NDRceDdCIgora3cyNDE9Ilx4NDRceDg0Igora3cyNDI9Ilx4NDRceDg3Igora3cyNDM9Ilx4NDRceDg1IgpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wM19leHRyYWN0b3JfZnV6emVyLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcDNfZXh0cmFjdG9yX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE0N2MxOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcDNfZXh0cmFjdG9yX2Z1enplci5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpbmNsdWRlICJFeHRyYWN0b3JGdXp6ZXJCYXNlLmgiCisKKyNpbmNsdWRlICJNUDNFeHRyYWN0b3IuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIE1wM0V4dHJhY3RvciA6IHB1YmxpYyBFeHRyYWN0b3JGdXp6ZXJCYXNlIHsKKyBwdWJsaWM6CisgIE1wM0V4dHJhY3RvcigpID0gZGVmYXVsdDsKKyAgfk1wM0V4dHJhY3RvcigpID0gZGVmYXVsdDsKKworICBib29sIGNyZWF0ZUV4dHJhY3RvcigpOworfTsKKworYm9vbCBNcDNFeHRyYWN0b3I6OmNyZWF0ZUV4dHJhY3RvcigpIHsKKyAgbUV4dHJhY3RvciA9IG5ldyBNUDNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIobURhdGFTb3VyY2UtPndyYXAoKSksIG51bGxwdHIpOworICBpZiAoIW1FeHRyYWN0b3IpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbUV4dHJhY3Rvci0+bmFtZSgpOworICByZXR1cm4gdHJ1ZTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoKCFkYXRhKSB8fCAoc2l6ZSA9PSAwKSkgeworICAgIHJldHVybiAwOworICB9CisgIE1wM0V4dHJhY3RvciogZXh0cmFjdG9yID0gbmV3IE1wM0V4dHJhY3RvcigpOworICBpZiAoZXh0cmFjdG9yKSB7CisgICAgZXh0cmFjdG9yLT5wcm9jZXNzRGF0YShkYXRhLCBzaXplKTsKKyAgICBkZWxldGUgZXh0cmFjdG9yOworICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wNF9leHRyYWN0b3JfZnV6emVyLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcDRfZXh0cmFjdG9yX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkwMzUxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcDRfZXh0cmFjdG9yX2Z1enplci5jcHAKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpbmNsdWRlICJFeHRyYWN0b3JGdXp6ZXJCYXNlLmgiCisKKyNpbmNsdWRlICJNUEVHNEV4dHJhY3Rvci5oIgorI2luY2x1ZGUgIlNhbXBsZVRhYmxlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBNUDRFeHRyYWN0b3IgOiBwdWJsaWMgRXh0cmFjdG9yRnV6emVyQmFzZSB7CisgcHVibGljOgorICBNUDRFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH5NUDRFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKTsKK307CisKK2Jvb2wgTVA0RXh0cmFjdG9yOjpjcmVhdGVFeHRyYWN0b3IoKSB7CisgIG1FeHRyYWN0b3IgPSBuZXcgTVBFRzRFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIobURhdGFTb3VyY2UtPndyYXAoKSkpOworICBpZiAoIW1FeHRyYWN0b3IpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbUV4dHJhY3Rvci0+bmFtZSgpOworICBzZXREYXRhU291cmNlRmxhZ3MoRGF0YVNvdXJjZUJhc2U6OmtXYW50c1ByZWZldGNoaW5nIHwgRGF0YVNvdXJjZUJhc2U6OmtJc0NhY2hpbmdEYXRhU291cmNlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBNUDRFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyBNUDRFeHRyYWN0b3IoKTsKKyAgaWYgKGV4dHJhY3RvcikgeworICAgIGV4dHJhY3Rvci0+cHJvY2Vzc0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgZGVsZXRlIGV4dHJhY3RvcjsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcDRfZXh0cmFjdG9yX2Z1enplci5kaWN0IGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wNF9leHRyYWN0b3JfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4MzY0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcDRfZXh0cmFjdG9yX2Z1enplci5kaWN0CkBAIC0wLDAgKzEsMjQ4IEBACisjIE1QNCBBdG9tcy9Cb3hlcwora3cxPSJmdHlwIgora3cyPSJmcmVlIgora3czPSJtZGF0Igora3c0PSJtb292Igora3c1PSJtdmhkIgora3c2PSJ0cmFrIgora3c3PSJ0a2hkIgora3c4PSJlZHRzIgora3c5PSJlbHN0Igora3cxMD0ibWRpYSIKK2t3MTE9Im1kaGQiCitrdzEyPSJoZGxyIgora3cxMz0ibWluZiIKK2t3MTQ9InZtaGQiCitrdzE1PSJkaW5mIgora3cxNj0iZHJlZiIKK2t3MTc9InVybCAiCitrdzE4PSJzdGJsIgora3cxOT0ic3RzZCIKK2t3MjA9ImF2YzEiCitrdzIxPSJhdmNDIgora3cyMj0ic3R0cyIKK2t3MjM9InN0c3MiCitrdzI0PSJjdHRzIgora3cyNT0ic3RzYyIKK2t3MjY9InN0c3oiCitrdzI3PSJzdGNvIgora3cyOD0ibXA0YSIKK2t3Mjk9ImVzZHMiCitrdzMwPSJ1ZHRhIgora3czMT0ibWV0YSIKK2t3MzI9Imlsc3QiCitrdzMzPSJzYW1yIgora3czND0ic2F3YiIKK2t3MzU9ImVjLTMiCitrdzM2PSJtcDR2Igora3czNz0iczI2MyIKK2t3Mzg9ImgyNjMiCitrdzM5PSJIMjYzIgora3c0MD0iYXZjMSIKK2t3NDE9Imh2YzEiCitrdzQyPSJoZXYxIgora3c0Mz0iYWMtNCIKK2t3NDQ9Ik9wdXMiCitrdzQ1PSJ0d29zIgora3c0Nj0ic293dCIKK2t3NDc9ImFsYWMiCitrdzQ4PSJmTGFDIgora3c0OT0iYXYwMSIKK2t3NTA9Ii5tcDMiCitrdzUxPSJrZXlzIgora3c1Mj0iY3BydCIKK2t3NTM9ImNvdnIiCitrdzU0PSJtdmV4Igora3c1NT0ibW9vZiIKK2t3NTY9InRyYWYiCitrdzU3PSJtZnJhIgora3c1OD0ic2luZiIKK2t3NTk9InNjaGkiCitrdzYwPSJ3YXZlIgora3c2MT0ic2NobSIKK2t3NjI9ImNiYzEiCitrdzYzPSJjYmNzIgora3c2ND0iY2VuYyIKK2t3NjU9ImNlbnMiCitrdzY2PSJmcm1hIgora3c2Nz0idGVuYyIKK2t3Njg9InRyZWYiCitrdzY5PSJ0aG1iIgora3c3MD0icHNzaCIKK2t3NzE9Im1ldHQiCitrdzcyPSJlbmNhIgora3c3Mz0iZW5jdiIKK2t3NzQ9ImNvNjQiCitrdzc1PSJzdHoyIgora3c3Nj0iXHhBOXh5eiIKK2t3Nzc9ImJ0cnQiCitrdzc4PSJodmNDIgora3c3OT0iYXYxQyIKK2t3ODA9ImQyNjMiCitrdzgxPSJpbG9jIgora3c4Mj0iaWluZiIKK2t3ODM9ImlwcnAiCitrdzg0PSJwaXRtIgora3c4NT0iaWRhdCIKK2t3ODY9ImlyZWYiCitrdzg3PSJpcHJvIgora3c4OD0ibWVhbiIKK2t3ODk9Im5hbWUiCitrdzkwPSJkYXRhIgora3c5MT0ibWVoZCIKK2t3OTI9InRleHQiCitrdzkzPSJzYnRsIgora3c5ND0idHJleCIKK2t3OTU9InR4M2ciCitrdzk2PSJjb2xyIgora3c5Nz0idGl0bCIKK2t3OTg9InBlcmYiCitrdzk5PSJhdXRoIgora3cxMDA9ImducmUiCitrdzEwMT0iYWxibSIKK2t3MTAyPSJ5cnJjIgora3cxMDM9IklEMzIiCitrdzEwND0iLS0tLSIKK2t3MTA1PSJzaWR4Igora3cxMDY9ImFjLTMiCitrdzEwNz0icXQgICIKK2t3MTA4PSJtaWYxIgora3cxMDk9ImhlaWMiCitrdzExMD0iZGFjNCIKK2t3MTExPSJkZWMzIgora3cxMTI9ImRhYzMiCitrdzExMz0iXHhBOWFsYiIKK2t3MTE0PSJceEE5QVJUIgora3cxMTU9ImFBUlQiCitrdzExNj0iXHhBOWRheSIKK2t3MTE3PSJceEE5bmFtIgora3cxMTg9Ilx4QTl3cnQiCitrdzExOT0iXHhBOWdlbiIKK2t3MTIwPSJjcGlsIgora3cxMjE9InRya24iCitrdzEyMj0iZGlzayIKK2t3MTIzPSJuY2x4Igora3cxMjQ9Im5jbGMiCitrdzEyNT0idGZoZCIKK2t3MTI2PSJ0cnVuIgora3cxMjc9InNhaXoiCitrdzEyOD0ic2FpbyIKK2t3MTI5PSJzZW5jIgora3cxMzA9Imlzb20iCitrdzEzMT0iaXNvMiIKK2t3MTMyPSIzZ3A0Igora3cxMzM9Im1wNDEiCitrdzEzND0ibXA0MiIKK2t3MTM1PSJkYXNoIgora3cxMzY9Im52cjEiCitrdzEzNz0iTVNOViIKK2t3MTM4PSJ3bWYgIgora3cxMzk9IjNnMmEiCitrdzE0MD0iM2cyYiIKK2t3MTQxPSJtc2YxIgora3cxNDI9ImhldmMiCitrdzE0Mz0icGRpbiIKK2t3MTQ0PSJ0cmdyIgora3cxNDU9InNtaGQiCitrdzE0Nj0iaG1oZCIKK2t3MTQ3PSJubWhkIgora3cxNDg9ImNzbGciCitrdzE0OT0ic3RzaCIKK2t3MTUwPSJwYWRiIgora3cxNTE9InN0ZHAiCitrdzE1Mj0ic2R0cCIKK2t3MTUzPSJzYmdwIgora3cxNTQ9InNncGQiCitrdzE1NT0ic3VicyIKK2t3MTU2PSJsZXZhIgora3cxNTc9Im1maGQiCitrdzE1OD0idGZkdCIKK2t3MTU5PSJ0ZnJhIgora3cxNjA9Im1mcm8iCitrdzE2MT0ic2tpcCIKK2t3MTYyPSJ0c2VsIgora3cxNjM9InN0cmsiCitrdzE2ND0ic3RyaSIKK2t3MTY1PSJzdHJkIgora3cxNjY9InhtbCAiCitrdzE2Nz0iYnhtbCIKK2t3MTY4PSJmaWluIgora3cxNjk9InBhZW4iCitrdzE3MD0iZmlyZSIKK2t3MTcxPSJmcGFyIgora3cxNzI9ImZlY3IiCitrdzE3Mz0ic2VnciIKK2t3MTc0PSJnaXRuIgora3cxNzU9Im1lY28iCitrdzE3Nj0ibWVyZSIKK2t3MTc3PSJzdHlwIgora3cxNzg9InNzaXgiCitrdzE3OT0icHJmdCIKK2t3MTgwPSJoaW50Igora3cxODE9ImNkc2MiCitrdzE4Mj0iaGluZCIKK2t3MTgzPSJ2ZGVwIgora3cxODQ9InZwbHgiCitrdzE4NT0ibXNyYyIKK2t3MTg2PSJ1cm4gIgora3cxODc9ImVuY3QiCitrdzE4OD0iZW5jcyIKK2t3MTg5PSJyaW5mIgora3cxOTA9InNycHAiCitrdzE5MT0ic3RzZyIKK2t3MTkyPSJzdHZpIgora3cxOTM9InRpbXMiCitrdzE5ND0idHNybyIKK2t3MTk1PSJzbnJvIgora3cxOTY9InJ0cCAiCitrdzE5Nz0ic3J0cCIKK2t3MTk4PSJydHBvIgora3cxOTk9ImhudGkiCitrdzIwMD0ic2RwICIKK2t3MjAxPSJ0cnB5Igora3cyMDI9Im51bXAiCitrdzIwMz0idHB5bCIKK2t3MjA0PSJ0b3RsIgora3cyMDU9Im5wY2siCitrdzIwNj0idHBheSIKK2t3MjA3PSJtYXhyIgora3cyMDg9ImRtZWQiCitrdzIwOT0iZGltbSIKK2t3MjEwPSJkcmVwIgora3cyMTE9InRtaW4iCitrdzIxMj0idG1heCIKK2t3MjEzPSJwbWF4Igora3cyMTQ9ImRtYXgiCitrdzIxNT0icGF5dCIKK2t3MjE2PSJmZHAgIgora3cyMTc9ImZkc2EiCitrdzIxOD0iZmRwYSIKK2t3MjE5PSJleHRyIgora3cyMjA9ImZlY2kiCitrdzIyMT0icm0ydCIKK2t3MjIyPSJzbTJ0Igora3cyMjM9InRQQVQiCitrdzIyND0idFBNVCIKK2t3MjI1PSJ0T0QgIgora3cyMjY9InRzdGkiCitrdzIyNz0iaXN0bSIKK2t3MjI4PSJwbTJ0Igora3cyMjk9InJydHAiCitrdzIzMD0icnNzciIKK2t3MjMxPSJyc2NyIgora3cyMzI9InJzcnAiCitrdzIzMz0icnNzciIKK2t3MjM0PSJjY2lkIgora3cyMzU9InNyb2MiCitrdzIzNj0icHJ0cCIKK2t3MjM3PSJyb2xsIgora3cyMzg9InJhc2giCitrdzIzOT0iYWxzdCIKK2t3MjQwPSJyYXAgIgora3cyNDE9InRlbGUiCitrdzI0Mj0ibXA3MSIKK2t3MjQzPSJpc28zIgora3cyNDQ9ImlzbzQiCitrdzI0NT0iaXNvNSIKK2t3MjQ2PSJyZXN2Igora3cyNDc9ImlzbzYiCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXBlZzJfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXBlZzJfZXh0cmFjdG9yX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwZWY2NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcGVnMl9leHRyYWN0b3JfZnV6emVyLmNwcApAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworI2luY2x1ZGUgIkV4dHJhY3RvckZ1enplckJhc2UuaCIKKworI2lmZGVmIE1QRUcyUFMKKyNpbmNsdWRlICJNUEVHMlBTRXh0cmFjdG9yLmgiCisjZWxzZQorI2luY2x1ZGUgIk1QRUcyVFNFeHRyYWN0b3IuaCIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgTVBFRzJFeHRyYWN0b3IgOiBwdWJsaWMgRXh0cmFjdG9yRnV6emVyQmFzZSB7CisgcHVibGljOgorICBNUEVHMkV4dHJhY3RvcigpID0gZGVmYXVsdDsKKyAgfk1QRUcyRXh0cmFjdG9yKCkgPSBkZWZhdWx0OworCisgIGJvb2wgY3JlYXRlRXh0cmFjdG9yKCk7Cit9OworCitib29sIE1QRUcyRXh0cmFjdG9yOjpjcmVhdGVFeHRyYWN0b3IoKSB7CisjaWZkZWYgTVBFRzJQUworICBtRXh0cmFjdG9yID0gbmV3IE1QRUcyUFNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIobURhdGFTb3VyY2UtPndyYXAoKSkpOworI2Vsc2UKKyAgbUV4dHJhY3RvciA9IG5ldyBNUEVHMlRTRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpKTsKKyNlbmRpZgorICBpZiAoIW1FeHRyYWN0b3IpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbUV4dHJhY3Rvci0+bmFtZSgpOworICByZXR1cm4gdHJ1ZTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoKCFkYXRhKSB8fCAoc2l6ZSA9PSAwKSkgeworICAgIHJldHVybiAwOworICB9CisgIE1QRUcyRXh0cmFjdG9yKiBleHRyYWN0b3IgPSBuZXcgTVBFRzJFeHRyYWN0b3IoKTsKKyAgaWYgKGV4dHJhY3RvcikgeworICAgIGV4dHJhY3Rvci0+cHJvY2Vzc0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgZGVsZXRlIGV4dHJhY3RvcjsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcGVnMnBzX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcGVnMnBzX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWQzOTBhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wZWcycHNfZXh0cmFjdG9yX2Z1enplci5kaWN0CkBAIC0wLDAgKzEsMiBAQAorIyBTdGFydCBjb2RlIChieXRlcyAwLTMpCitrdzE9Ilx4MDBceDAwXHgwMVx4QkEiCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXBlZzJ0c19leHRyYWN0b3JfZnV6emVyLmRpY3QgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXBlZzJ0c19leHRyYWN0b3JfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2YTFlYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcGVnMnRzX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApAQCAtMCwwICsxLDIgQEAKKyMgU3RhcnQgYnl0ZQora3cxPSJceDQ3IgpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL29nZ19leHRyYWN0b3JfZnV6emVyLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9vZ2dfZXh0cmFjdG9yX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQyZmNjNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9vZ2dfZXh0cmFjdG9yX2Z1enplci5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpbmNsdWRlICJFeHRyYWN0b3JGdXp6ZXJCYXNlLmgiCisKKyNpbmNsdWRlICJPZ2dFeHRyYWN0b3IuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIE9HR0V4dHJhY3RvciA6IHB1YmxpYyBFeHRyYWN0b3JGdXp6ZXJCYXNlIHsKKyBwdWJsaWM6CisgIE9HR0V4dHJhY3RvcigpID0gZGVmYXVsdDsKKyAgfk9HR0V4dHJhY3RvcigpID0gZGVmYXVsdDsKKworICBib29sIGNyZWF0ZUV4dHJhY3RvcigpOworfTsKKworYm9vbCBPR0dFeHRyYWN0b3I6OmNyZWF0ZUV4dHJhY3RvcigpIHsKKyAgbUV4dHJhY3RvciA9IG5ldyBPZ2dFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIobURhdGFTb3VyY2UtPndyYXAoKSkpOworICBpZiAoIW1FeHRyYWN0b3IpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbUV4dHJhY3Rvci0+bmFtZSgpOworICByZXR1cm4gdHJ1ZTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoKCFkYXRhKSB8fCAoc2l6ZSA9PSAwKSkgeworICAgIHJldHVybiAwOworICB9CisgIE9HR0V4dHJhY3RvciogZXh0cmFjdG9yID0gbmV3IE9HR0V4dHJhY3RvcigpOworICBpZiAoZXh0cmFjdG9yKSB7CisgICAgZXh0cmFjdG9yLT5wcm9jZXNzRGF0YShkYXRhLCBzaXplKTsKKyAgICBkZWxldGUgZXh0cmFjdG9yOworICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL29nZ19leHRyYWN0b3JfZnV6emVyLmRpY3QgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvb2dnX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjJmYzM4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL29nZ19leHRyYWN0b3JfZnV6emVyLmRpY3QKQEAgLTAsMCArMSwzIEBACisjIFN0YXJ0IGNvZGUoYnl0ZXMgMC0zKQorIyBUaGUgYmVsb3cgNCBieXRlcyBjb3JyZXNwb25kIHRvICJPZ2dTIiBpbiBBU0NJSQora3cxPSJceDRGXHg2N1x4NjdceDUzIgpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL3dhdl9leHRyYWN0b3JfZnV6emVyLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy93YXZfZXh0cmFjdG9yX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IxMWViZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy93YXZfZXh0cmFjdG9yX2Z1enplci5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpbmNsdWRlICJFeHRyYWN0b3JGdXp6ZXJCYXNlLmgiCisKKyNpbmNsdWRlICJXQVZFeHRyYWN0b3IuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIHdhdkV4dHJhY3RvciA6IHB1YmxpYyBFeHRyYWN0b3JGdXp6ZXJCYXNlIHsKKyBwdWJsaWM6CisgIHdhdkV4dHJhY3RvcigpID0gZGVmYXVsdDsKKyAgfndhdkV4dHJhY3RvcigpID0gZGVmYXVsdDsKKworICBib29sIGNyZWF0ZUV4dHJhY3RvcigpOworfTsKKworYm9vbCB3YXZFeHRyYWN0b3I6OmNyZWF0ZUV4dHJhY3RvcigpIHsKKyAgbUV4dHJhY3RvciA9IG5ldyBXQVZFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIobURhdGFTb3VyY2UtPndyYXAoKSkpOworICBpZiAoIW1FeHRyYWN0b3IpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbUV4dHJhY3Rvci0+bmFtZSgpOworICByZXR1cm4gdHJ1ZTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoKCFkYXRhKSB8fCAoc2l6ZSA9PSAwKSkgeworICAgIHJldHVybiAwOworICB9CisgIHdhdkV4dHJhY3RvciogZXh0cmFjdG9yID0gbmV3IHdhdkV4dHJhY3RvcigpOworICBpZiAoZXh0cmFjdG9yKSB7CisgICAgZXh0cmFjdG9yLT5wcm9jZXNzRGF0YShkYXRhLCBzaXplKTsKKyAgICBkZWxldGUgZXh0cmFjdG9yOworICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icAppbmRleCBiODI1NWZjLi5mODJmYzQxIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icApAQCAtMSwzICsxLDIyIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfZXh0cmFjdG9yc19taWRpX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2V4dHJhY3RvcnNfbWlkaV9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWlkaWV4dHJhY3RvciIsCiAgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWRlZmF1bHRzIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icAppbmRleCA3YWQ4Y2MxLi44NDBjOWZjIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMCBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfZXh0cmFjdG9yc19ta3ZfbGljZW5zZSJdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9leHRyYWN0b3JzX21rdl9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWt2ZXh0cmFjdG9yIiwKICAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZGVmYXVsdHMiXSwKQEAgLTIxLDQgKzM4LDEyIEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuY3BwCmluZGV4IDI3YmQzNTcuLjRmZDNhNTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKQEAgLTE4ODgsMTMgKzE4ODgsMTIgQEAKIAogICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCB0cmFjay0+R2V0Q29udGVudEVuY29kaW5nQ291bnQoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29udGVudEVuY29kaW5nICplbmNvZGluZyA9IHRyYWNrLT5HZXRDb250ZW50RW5jb2RpbmdCeUluZGV4KGkpOwotICAgICAgICBmb3Ioc2l6ZV90IGogPSAwOyBqIDwgZW5jb2RpbmctPkdldEVuY3J5cHRpb25Db3VudCgpOyBqKyspIHsKKyAgICAgICAgaWYgKGVuY29kaW5nLT5HZXRFbmNyeXB0aW9uQ291bnQoKSA+IDApIHsKICAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29udGVudEVuY29kaW5nOjpDb250ZW50RW5jcnlwdGlvbiAqZW5jcnlwdGlvbjsKLSAgICAgICAgICAgIGVuY3J5cHRpb24gPSBlbmNvZGluZy0+R2V0RW5jcnlwdGlvbkJ5SW5kZXgoaik7CisgICAgICAgICAgICBlbmNyeXB0aW9uID0gZW5jb2RpbmctPkdldEVuY3J5cHRpb25CeUluZGV4KDApOwogICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcih0cmFja0luZm8tPm1NZXRhLAogICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIGVuY3J5cHRpb24tPmtleV9pZCwgZW5jcnlwdGlvbi0+a2V5X2lkX2xlbik7CiAgICAgICAgICAgICB0cmFja0luZm8tPm1FbmNyeXB0ZWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBmb3Ioc2l6ZV90IGogPSAwOyBqIDwgZW5jb2RpbmctPkdldENvbXByZXNzaW9uQ291bnQoKTsgaisrKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icAppbmRleCAxMDJhYzgxLi43NWI5YjdiIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibXAzZXh0cmFjdG9yIiwKICAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZGVmYXVsdHMiXSwKQEAgLTEzLDQgKzIyLDExIEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICBdLAogCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAKaW5kZXggZTQ4ZTFiNy4uN2ZhNmJmZCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMjAgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2V4dHJhY3RvcnNfbXA0X2xpY2Vuc2UiXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfZXh0cmFjdG9yc19tcDRfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm1wNGV4dHJhY3RvciIsCiAgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWRlZmF1bHRzIl0sCkBAIC0xNiw0ICszMywxMiBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAorCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5jcHAKaW5kZXggMDc3MzM4Ny4uMjU5OWMyYyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwCkBAIC01NDYsMTEgKzU0NiwxMSBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoIkltYWdlIGl0ZW0gaWQgJWQgdXNlcyB0aHVtYm5haWwgaXRlbSBpZCAlZCIsIG1SZWZzW2ldLCBtSXRlbUlkKTsKLSAgICAgICAgICAgIEltYWdlSXRlbSAmbWFzdGVySW1hZ2UgPSBpdGVtSWRUb0l0ZW1NYXAuZWRpdFZhbHVlQXQoaXRlbUluZGV4KTsKLSAgICAgICAgICAgIGlmICghbWFzdGVySW1hZ2UudGh1bWJuYWlscy5lbXB0eSgpKSB7CisgICAgICAgICAgICBJbWFnZUl0ZW0gJmltYWdlSXRlbSA9IGl0ZW1JZFRvSXRlbU1hcC5lZGl0VmFsdWVBdChpdGVtSW5kZXgpOworICAgICAgICAgICAgaWYgKCFpbWFnZUl0ZW0udGh1bWJuYWlscy5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coImFscmVhZHkgaGFzIHRodW1ibmFpbHMhIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXN0ZXJJbWFnZS50aHVtYm5haWxzLnB1c2hfYmFjayhtSXRlbUlkKTsKKyAgICAgICAgICAgIGltYWdlSXRlbS50aHVtYm5haWxzLnB1c2hfYmFjayhtSXRlbUlkKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICB9CkBAIC05MjksNyArOTI5LDcgQEAKIAogc3RhdHVzX3QgSXBjb0JveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CiAgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKLSAgICAvLyBwdXNoIGR1bW15IGFzIHRoZSBpbmRleCBpcyAxLWJhc2VkCisgICAgLy8gcHVzaCBhIHBsYWNlaG9sZGVyIGFzIHRoZSBpbmRleCBpcyAxLWJhc2VkCiAgICAgbUl0ZW1Qcm9wZXJ0aWVzLT5wdXNoX2JhY2sobmV3IEl0ZW1Qcm9wZXJ0eSgpKTsKICAgICByZXR1cm4gcGFyc2VDaHVua3Mob2Zmc2V0LCBzaXplKTsKIH0KQEAgLTE2MTQsMTcgKzE2MTQsMTcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICB1aW50MzJfdCBtYXN0ZXJJdGVtSW5kZXggPSBtRGlzcGxheWFibGVzW2ltYWdlSW5kZXhdOworICAgIHVpbnQzMl90IGltYWdlSXRlbUluZGV4ID0gbURpc3BsYXlhYmxlc1tpbWFnZUluZGV4XTsKIAotICAgIGNvbnN0IEltYWdlSXRlbSAmbWFzdGVySW1hZ2UgPSBtSXRlbUlkVG9JdGVtTWFwW21hc3Rlckl0ZW1JbmRleF07Ci0gICAgaWYgKG1hc3RlckltYWdlLnRodW1ibmFpbHMuZW1wdHkoKSkgewotICAgICAgICAqaXRlbUluZGV4ID0gbWFzdGVySXRlbUluZGV4OworICAgIGNvbnN0IEltYWdlSXRlbSAmaW1hZ2VJdGVtID0gbUl0ZW1JZFRvSXRlbU1hcFtpbWFnZUl0ZW1JbmRleF07CisgICAgaWYgKGltYWdlSXRlbS50aHVtYm5haWxzLmVtcHR5KCkpIHsKKyAgICAgICAgKml0ZW1JbmRleCA9IGltYWdlSXRlbUluZGV4OwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgc3NpemVfdCB0aHVtYkl0ZW1JbmRleCA9IG1JdGVtSWRUb0l0ZW1NYXAuaW5kZXhPZktleShtYXN0ZXJJbWFnZS50aHVtYm5haWxzWzBdKTsKKyAgICBzc2l6ZV90IHRodW1iSXRlbUluZGV4ID0gbUl0ZW1JZFRvSXRlbU1hcC5pbmRleE9mS2V5KGltYWdlSXRlbS50aHVtYm5haWxzWzBdKTsKICAgICBpZiAodGh1bWJJdGVtSW5kZXggPCAwKSB7Ci0gICAgICAgIC8vIERvIG5vdCByZXR1cm4gdGhlIG1hc3RlciBpbWFnZSBpbiB0aGlzIGNhc2UsIGZhaWwgaXQgc28gdGhhdCB0aGUKKyAgICAgICAgLy8gRG8gbm90IHJldHVybiB0aGUgaW1hZ2UgaXRlbSBpbiB0aGlzIGNhc2UsIGZhaWwgaXQgc28gdGhhdCB0aGUKICAgICAgICAgLy8gdGh1bWJuYWlsIGV4dHJhY3Rpb24gY29kZSBrbm93cyB3ZSByZWFsbHkgZG9uJ3QgaGF2ZSBpdC4KICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGE5NzZhMmIuLmY3MjVhOGMKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcApAQCAtNjIsNiArNjIsMTYgQEAKIAogI2RlZmluZSBBTEFDX1NQRUNJRklDX0lORk9fU0laRSAoMzYpCiAKKy8vIFRPRE8gOiBSZW1vdmUgdGhlIGRlZmluZXMgb25jZSBtYWlubGluZSBtZWRpYSBpcyBidWlsdCBhZ2FpbnN0IE5ESyA+PSAzMS4KKy8vIFRoZSBtcDQgZXh0cmFjdG9yIGlzIHBhcnQgb2YgbWFpbmxpbmUgYW5kIGJ1aWxkcyBhZ2FpbnN0IE5ESyAyOSBhcyBvZgorLy8gd3JpdGluZy4gVGhlc2Uga2V5cyBhcmUgYXZhaWxhYmxlIG9ubHkgZnJvbSBOREsgMzE6CisjZGVmaW5lIEFNRURJQUZPUk1BVF9LRVlfTVBFR0hfUFJPRklMRV9MRVZFTF9JTkRJQ0FUSU9OIFwKKyAgIm1wZWdoLXByb2ZpbGUtbGV2ZWwtaW5kaWNhdGlvbiIKKyNkZWZpbmUgQU1FRElBRk9STUFUX0tFWV9NUEVHSF9SRUZFUkVOQ0VfQ0hBTk5FTF9MQVlPVVQgXAorICAibXBlZ2gtcmVmZXJlbmNlLWNoYW5uZWwtbGF5b3V0IgorI2RlZmluZSBBTUVESUFGT1JNQVRfS0VZX01QRUdIX0NPTVBBVElCTEVfU0VUUyBcCisgICJtcGVnaC1jb21wYXRpYmxlLXNldHMiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZW51bSB7CkBAIC0xMzksNiArMTQ5LDcgQEAKICAgICBib29sIG1Jc0hFVkM7CiAgICAgYm9vbCBtSXNEb2xieVZpc2lvbjsKICAgICBib29sIG1Jc0FDNDsKKyAgICBib29sIG1Jc01wZWdIID0gZmFsc2U7CiAgICAgYm9vbCBtSXNQY207CiAgICAgc2l6ZV90IG1OQUxMZW5ndGhTaXplOwogCkBAIC0yMDIsOCArMjEzLDggQEAKICAgICAgICAgdWludDMyX3QgZHVyYXRpb247CiAgICAgICAgIGludDMyX3QgY29tcG9zaXRpb25PZmZzZXQ7CiAgICAgICAgIHVpbnQ4X3QgaXZbMTZdOwotICAgICAgICBWZWN0b3I8c2l6ZV90PiBjbGVhcnNpemVzOwotICAgICAgICBWZWN0b3I8c2l6ZV90PiBlbmNyeXB0ZWRzaXplczsKKyAgICAgICAgVmVjdG9yPHVpbnQzMl90PiBjbGVhcnNpemVzOworICAgICAgICBWZWN0b3I8dWludDMyX3Q+IGVuY3J5cHRlZHNpemVzOwogICAgIH07CiAgICAgVmVjdG9yPFNhbXBsZT4gbUN1cnJlbnRTYW1wbGVzOwogICAgIHN0ZDo6bWFwPG9mZjY0X3QsIHVpbnQzMl90PiBtRHJtT2Zmc2V0czsKQEAgLTM3Miw5ICszODMsMTUgQEAKICAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDOwogICAgICAgICBjYXNlIEZPVVJDQygiYXYwMSIpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMTsKKyAgICAgICAgY2FzZSBGT1VSQ0MoInZwMDkiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19WUDk7CiAgICAgICAgIGNhc2UgRk9VUkNDKCIubXAzIik6CiAgICAgICAgIGNhc2UgMHg2RDczMDA1NTogLy8gIm1zIFUiIG1wMyBhdWRpbwogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUc7CisgICAgICAgIGNhc2UgRk9VUkNDKCJtaGExIik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfTUhBMTsKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1obTEiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9NSE0xOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR1coIlVua25vd24gZm91cmNjOiAlYyVjJWMlYyIsCiAgICAgICAgICAgICAgICAgICAgKGZvdXJjYyA+PiAyNCkgJiAweGZmLApAQCAtMTE0OSw3ICsxMTY2LDcgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoIm1vb3YiKSkgewogICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKIAotICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOyAgLy8gUmV0dXJuIGEgZHVtbXkgZXJyb3IuCisgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7ICAvLyBSZXR1cm4gYSBnZW5lcmljIGVycm9yLgogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE3NTgsNiArMTc3NSw4IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCJmTGFDIik6CiAgICAgICAgIGNhc2UgRk9VUkNDKCIubXAzIik6CiAgICAgICAgIGNhc2UgMHg2RDczMDA1NTogLy8gIm1zIFUiIG1wMyBhdWRpbworICAgICAgICBjYXNlIEZPVVJDQygibWhhMSIpOgorICAgICAgICBjYXNlIEZPVVJDQygibWhtMSIpOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobUlzUVQgJiYgZGVwdGggPj0gMSAmJiBtUGF0aFtkZXB0aCAtIDFdID09IEZPVVJDQygid2F2ZSIpKSB7CiAKQEAgLTE3ODcsNyArMTgwNiw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB1aW50MTZfdCBkYXRhX3JlZl9pbmRleCBfX3VudXNlZCA9IFUxNl9BVCgmYnVmZmVyWzZdKTsKKyAgICAgICAgICAgIC8vIHdlIGNhbiBnZXQgZGF0YV9yZWZfaW5kZXggdmFsdWUgZnJvbSBVMTZfQVQoJmJ1ZmZlcls2XSkKICAgICAgICAgICAgIHVpbnQxNl90IHZlcnNpb24gPSBVMTZfQVQoJmJ1ZmZlcls4XSk7CiAgICAgICAgICAgICB1aW50MzJfdCBudW1fY2hhbm5lbHMgPSBVMTZfQVQoJmJ1ZmZlclsxNl0pOwogCkBAIC0xOTU3LDcgKzE5NzYsOTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCJtaGFDIik6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFNlZSBJU09fSUVDXzIzMDA4LTM7MjAxOSBNSEFEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZAorICAgICAgICAgICAgY29uc3RleHByIHVpbnQzMl90IG1oYWNfaGVhZGVyX3NpemUgPSA0IC8qIHNpemUgKi8gKyA0IC8qIGJveHR5cGUgJ21oYUMnICovCisgICAgICAgICAgICAgICAgICAgICsgMSAvKiBjb25maWd1cmF0aW9uVmVyc2lvbiAqLyArIDEgLyogbXBlZ2gzZGFQcm9maWxlTGV2ZWxJbmRpY2F0aW9uICovCisgICAgICAgICAgICAgICAgICAgICsgMSAvKiByZWZlcmVuY2VDaGFubmVsTGF5b3V0ICovICsgMiAvKiBtcGVnaDNkYUNvbmZpZ0xlbmd0aCAqLzsKKyAgICAgICAgICAgIHVpbnQ4X3QgbWhhY19oZWFkZXJbbWhhY19oZWFkZXJfc2l6ZV07CisgICAgICAgICAgICBvZmY2NF90IGRhdGFfb2Zmc2V0ID0gKm9mZnNldDsKIAorICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgPCBzaXplb2YobWhhY19oZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsIG1oYWNfaGVhZGVyLCBzaXplb2YobWhhY19oZWFkZXIpKQorICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihtaGFjX2hlYWRlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vZ2V0IG1wZWdoM2RhUHJvZmlsZUxldmVsSW5kaWNhdGlvbgorICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbXBlZ2gzZGFQcm9maWxlTGV2ZWxJbmRpY2F0aW9uID0gbWhhY19oZWFkZXJbOV07CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NUEVHSF9QUk9GSUxFX0xFVkVMX0lORElDQVRJT04sCisgICAgICAgICAgICAgICAgICAgIG1wZWdoM2RhUHJvZmlsZUxldmVsSW5kaWNhdGlvbik7CisKKyAgICAgICAgICAgICAvL2dldCByZWZlcmVuY2VDaGFubmVsTGF5b3V0CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCByZWZlcmVuY2VDaGFubmVsTGF5b3V0ID0gbWhhY19oZWFkZXJbMTBdOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFR0hfUkVGRVJFTkNFX0NIQU5ORUxfTEFZT1VULAorICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VDaGFubmVsTGF5b3V0KTsKKworICAgICAgICAgICAgLy8gZ2V0IG1wZWdoM2RhQ29uZmlnTGVuZ3RoCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBtaGFjX2NvbmZpZ19zaXplID0gVTE2X0FUKCZtaGFjX2hlYWRlclsxMV0pOworICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgIT0gc2l6ZW9mKG1oYWNfaGVhZGVyKSArIG1oYWNfY29uZmlnX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkYXRhX29mZnNldCArPSBzaXplb2YobWhhY19oZWFkZXIpOworICAgICAgICAgICAgdWludDhfdCBtaGFjX2NvbmZpZ1ttaGFjX2NvbmZpZ19zaXplXTsKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCBtaGFjX2NvbmZpZywgc2l6ZW9mKG1oYWNfY29uZmlnKSkKKyAgICAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YobWhhY19jb25maWcpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIG1oYWNfY29uZmlnLCBzaXplb2YobWhhY19jb25maWcpKTsKKyAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICs9IHNpemVvZihtaGFjX2NvbmZpZyk7CisgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygibWhhUCIpOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBGREFtZF8yIG9mIElTT19JRUNfMjMwMDgtMzsyMDE5IE1IQVByb2ZpbGVBbmRMZXZlbENvbXBhdGliaWxpdHlTZXRCb3gKKyAgICAgICAgICAgIGNvbnN0ZXhwciB1aW50MzJfdCBtaGFwX2hlYWRlcl9zaXplID0gNCAvKiBzaXplICovICsgNCAvKiBib3h0eXBlICdtaGFQJyAqLworICAgICAgICAgICAgICAgICAgICArIDEgLyogbnVtQ29tcGF0aWJsZVNldHMgKi87CisKKyAgICAgICAgICAgIHVpbnQ4X3QgbWhhcF9oZWFkZXJbbWhhcF9oZWFkZXJfc2l6ZV07CisgICAgICAgICAgICBvZmY2NF90IGRhdGFfb2Zmc2V0ID0gKm9mZnNldDsKKworICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgPCAoc3NpemVfdCltaGFwX2hlYWRlcl9zaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsIG1oYXBfaGVhZGVyLCBzaXplb2YobWhhcF9oZWFkZXIpKQorICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihtaGFwX2hlYWRlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG1oYXBfY29tcGF0aWJsZV9zZXRzX3NpemUgPSBudW1Db21wYXRpYmxlU2V0cyAqIHNpemVvZih1aW50OF90KQorICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbWhhcF9jb21wYXRpYmxlX3NldHNfc2l6ZSA9IG1oYXBfaGVhZGVyWzhdOworICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgIT0gc2l6ZW9mKG1oYXBfaGVhZGVyKSArIG1oYXBfY29tcGF0aWJsZV9zZXRzX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkYXRhX29mZnNldCArPSBzaXplb2YobWhhcF9oZWFkZXIpOworICAgICAgICAgICAgdWludDhfdCBtaGFwX2NvbXBhdGlibGVfc2V0c1ttaGFwX2NvbXBhdGlibGVfc2V0c19zaXplXTsKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgbWhhcF9jb21wYXRpYmxlX3NldHMsIHNpemVvZihtaGFwX2NvbXBhdGlibGVfc2V0cykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YobWhhcF9jb21wYXRpYmxlX3NldHMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFR0hfQ09NUEFUSUJMRV9TRVRTLAorICAgICAgICAgICAgICAgICAgICBtaGFwX2NvbXBhdGlibGVfc2V0cywgc2l6ZW9mKG1oYXBfY29tcGF0aWJsZV9zZXRzKSk7CisgICAgICAgICAgICBkYXRhX29mZnNldCArPSBzaXplb2YobWhhcF9jb21wYXRpYmxlX3NldHMpOworICAgICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoIm1wNHYiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoImVuY3YiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoInMyNjMiKToKQEAgLTE5NzIsNiArMjA3OCw3IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCJkdmgxIik6CiAgICAgICAgIGNhc2UgRk9VUkNDKCJkYXYxIik6CiAgICAgICAgIGNhc2UgRk9VUkNDKCJhdjAxIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJ2cDA5Iik6CiAgICAgICAgIHsKICAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzc4XTsKICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAoc3NpemVfdClzaXplb2YoYnVmZmVyKSkgewpAQCAtMTk4NCw3ICsyMDkxLDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfcmVmX2luZGV4IF9fdW51c2VkID0gVTE2X0FUKCZidWZmZXJbNl0pOworICAgICAgICAgICAgLy8gd2UgY2FuIGdldCBkYXRhX3JlZl9pbmRleCB2YWx1ZSBmcm9tIFUxNl9BVCgmYnVmZmVyWzZdKQogICAgICAgICAgICAgdWludDE2X3Qgd2lkdGggPSBVMTZfQVQoJmJ1ZmZlcls2ICsgMThdKTsKICAgICAgICAgICAgIHVpbnQxNl90IGhlaWdodCA9IFUxNl9BVCgmYnVmZmVyWzYgKyAyMF0pOwogCkBAIC0yNDM0LDYgKzI1NDEsOCBAQAogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygidnBjQyIpOgogICAgICAgICBjYXNlIEZPVVJDQygiYXYxQyIpOgogICAgICAgICB7CiAgICAgICAgICAgICBhdXRvIGJ1ZmZlciA9IGhlYXBidWZmZXI8dWludDhfdD4oY2h1bmtfZGF0YV9zaXplKTsKQEAgLTM0MDcsNyArMzUxNiw3IEBACiAgICAgfQogCiAgICAgLy8gc2tpcAotICAgIHVuc2lnbmVkIGJzbW9kIF9fdW51c2VkID0gYnIuZ2V0Qml0cygzKTsKKyAgICBici5za2lwQml0cygzKTsgLy8gYnNtb2QKIAogICAgIHVuc2lnbmVkIGFjbW9kID0gYnIuZ2V0Qml0cygzKTsKICAgICB1bnNpZ25lZCBsZmVvbiA9IGJyLmdldEJpdHMoMSk7CkBAIC0zNzE4LDE5ICszODI3LDE4IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICB9CiAKLSAgICB1aW50NjRfdCBjdGltZSBfX3VudXNlZCwgbXRpbWUgX191bnVzZWQsIGR1cmF0aW9uIF9fdW51c2VkOwogICAgIGludDMyX3QgaWQ7CiAKICAgICBpZiAodmVyc2lvbiA9PSAxKSB7Ci0gICAgICAgIGN0aW1lID0gVTY0X0FUKCZidWZmZXJbNF0pOwotICAgICAgICBtdGltZSA9IFU2NF9BVCgmYnVmZmVyWzEyXSk7CisgICAgICAgIC8vIHdlIGNhbiBnZXQgY3RpbWUgdmFsdWUgZnJvbSBVNjRfQVQoJmJ1ZmZlcls0XSkKKyAgICAgICAgLy8gd2UgY2FuIGdldCBtdGltZSB2YWx1ZSBmcm9tIFU2NF9BVCgmYnVmZmVyWzEyXSkKICAgICAgICAgaWQgPSBVMzJfQVQoJmJ1ZmZlclsyMF0pOwotICAgICAgICBkdXJhdGlvbiA9IFU2NF9BVCgmYnVmZmVyWzI4XSk7CisgICAgICAgIC8vIHdlIGNhbiBnZXQgZHVyYXRpb24gdmFsdWUgZnJvbSBVNjRfQVQoJmJ1ZmZlclsyOF0pCiAgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDApIHsKLSAgICAgICAgY3RpbWUgPSBVMzJfQVQoJmJ1ZmZlcls0XSk7Ci0gICAgICAgIG10aW1lID0gVTMyX0FUKCZidWZmZXJbOF0pOworICAgICAgICAvLyB3ZSBjYW4gZ2V0IGN0aW1lIHZhbHVlIGZyb20gVTMyX0FUKCZidWZmZXJbNF0pCisgICAgICAgIC8vIHdlIGNhbiBnZXQgbXRpbWUgdmFsdWUgZnJvbSBVMzJfQVQoJmJ1ZmZlcls4XSkKICAgICAgICAgaWQgPSBVMzJfQVQoJmJ1ZmZlclsxMl0pOwotICAgICAgICBkdXJhdGlvbiA9IFUzMl9BVCgmYnVmZmVyWzIwXSk7CisgICAgICAgIC8vIHdlIGNhbiBnZXQgZHVyYXRpb24gdmFsdWUgZnJvbSBVMzJfQVQoJmJ1ZmZlclsyMF0pCiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KQEAgLTQzMzcsNiArNDQ0NSwxOCBAQAogICAgICAgICBpZiAoc2l6ZSA8IDUgfHwgcHRyWzBdICE9IDB4ODEpIHsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkpKSB7CisgICAgICAgIHZvaWQgKmRhdGE7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworCisgICAgICAgIGlmIChzaXplIDwgNSB8fCBwdHJbMF0gIT0gMHgwMSkgeyAgLy8gY29uZmlndXJhdGlvblZlcnNpb24gPT0gMQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICAgICB9CiAKICAgICBBTE9HVigidHJhY2stPmVsc3Rfc2hpZnRfc3RhcnRfdGlja3MgOiUiIFBSSXU2NCwgdHJhY2stPmVsc3Rfc2hpZnRfc3RhcnRfdGlja3MpOwpAQCAtNDM5MSw2ICs0NTExLDEwIEBACiAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KQogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7CkBAIC00NDg1LDYgKzQ2MDksOSBAQAogCiAgICAgaWYgKG9iamVjdFR5cGVJbmRpY2F0aW9uID09IDB4NkIgfHwgb2JqZWN0VHlwZUluZGljYXRpb24gPT0gMHg2OSkgewogICAgICAgICAvLyBtcDMgYXVkaW8KKyAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CkBAIC00NTc1LDYgKzQ3MDIsMTAgQEAKICAgICAgICAgaWYgKG9mZnNldCA+PSBjc2Rfc2l6ZSB8fCBjc2Rbb2Zmc2V0XSAhPSAweDAxKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQogICAgICAgICAvLyBmb3JtZXJseSBrS2V5Vm9yYmlzSW5mbwogICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCiAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgJmNzZFtvZmZzZXRdLCBsZW4xKTsKQEAgLTQ2MzgsMTggKzQ3NjksMTcgQEAKICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfU0JSIHx8IG9iamVjdFR5cGUgPT0gQU9UX1BTKSB7Ly9TQlIgc3BlY2lmaWMgY29uZmlnIHBlciAxNDQ5Ni0zIHRibCAxLjEzCiAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgdWludDMyX3QgZXh0RnJlcUluZGV4ID0gYnIuZ2V0Qml0cyg0KTsKLSAgICAgICAgaW50MzJfdCBleHRTYW1wbGVSYXRlIF9fdW51c2VkOwogICAgICAgICBpZiAoZXh0RnJlcUluZGV4ID09IDE1KSB7CiAgICAgICAgICAgICBpZiAoY3NkX3NpemUgPCA4KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMjQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICBleHRTYW1wbGVSYXRlID0gYnIuZ2V0Qml0cygyNCk7CisgICAgICAgICAgICBici5za2lwQml0cygyNCk7IC8vIGV4dFNhbXBsZVJhdGUKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChleHRGcmVxSW5kZXggPT0gMTMgfHwgZXh0RnJlcUluZGV4ID09IDE0KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV4dFNhbXBsZVJhdGUgPSBrU2FtcGxpbmdSYXRlW2V4dEZyZXFJbmRleF07CisgICAgICAgICAgICAvL2V4dFNhbXBsZVJhdGUgPSBrU2FtcGxpbmdSYXRlW2V4dEZyZXFJbmRleF07CiAgICAgICAgIH0KICAgICAgICAgLy9UT0RPOiBzYXZlIHRoZSBleHRlbnNpb24gc2FtcGxpbmcgcmF0ZSB2YWx1ZSBpbiBtZXRhIGRhdGEgPT4KICAgICAgICAgLy8gICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwga0tleUV4dFNhbXBsZVJhdGUsIGV4dFNhbXBsZVJhdGUpOwpAQCAtNDY5MiwxMyArNDgyMiwxMyBAQAogICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19MRCB8fCBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfU0NBTCB8fAogICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPT0gQU9UX0VSX0JTQUMpIHsKICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMikgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZnJhbWVMZW5ndGhGbGFnIF9fdW51c2VkID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgIGJyLnNraXBCaXRzKDEpOyAvLyBmcmFtZUxlbmd0aEZsYWcKIAogICAgICAgICAgICAgY29uc3QgaW50MzJfdCBkZXBlbmRzT25Db3JlQ29kZXIgPSBici5nZXRCaXRzKDEpOwogCiAgICAgICAgICAgICBpZiAoZGVwZW5kc09uQ29yZUNvZGVyICkgewogICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMTQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBjb3JlQ29kZXJEZWxheSBfX3VudXNlZCA9IGJyLmdldEJpdHMoMTQpOworICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDE0KTsgLy8gY29yZUNvZGVyRGVsYXkKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50MzJfdCBleHRlbnNpb25GbGFnID0gLTE7CkBAIC00NzMwLDY0ICs0ODYwLDY0IEBACiAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAzMikgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEVsZW1lbnRJbnN0YW5jZVRhZyBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBQcm9maWxlIF9fdW51c2VkID0gYnIuZ2V0Qml0cygyKTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNhbXBsaW5nRnJlcXVlbmN5SW5kZXggX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDQpOyAvLyBFbGVtZW50SW5zdGFuY2VUYWcKKyAgICAgICAgICAgICAgICBici5za2lwQml0cygyKTsgLy8gUHJvZmlsZQorICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDQpOyAvLyBTYW1wbGluZ0ZyZXF1ZW5jeUluZGV4CiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1Gcm9udENoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1TaWRlQ2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUJhY2tDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDQpOwogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtTGZlQ2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cygyKTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUFzc29jRGF0YUVsZW1lbnRzIF9fdW51c2VkID0gYnIuZ2V0Qml0cygzKTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bVZhbGlkQ2NFbGVtZW50cyBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoMyk7IC8vIE51bUFzc29jRGF0YUVsZW1lbnRzCisgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoNCk7IC8vIE51bVZhbGlkQ2NFbGVtZW50cwogCiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNb25vTWl4ZG93blByZXNlbnQgPSBici5nZXRCaXRzKDEpOwogCiAgICAgICAgICAgICAgICAgaWYgKE1vbm9NaXhkb3duUHJlc2VudCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNb25vTWl4ZG93bkVsZW1lbnROdW1iZXIgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBici5za2lwQml0cyg0KTsgLy8gTW9ub01peGRvd25FbGVtZW50TnVtYmVyCiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAxKSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU3RlcmVvTWl4ZG93blByZXNlbnQgPSBici5nZXRCaXRzKDEpOwogICAgICAgICAgICAgICAgIGlmIChTdGVyZW9NaXhkb3duUHJlc2VudCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTdGVyZW9NaXhkb3duRWxlbWVudE51bWJlciBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDQpOyAvLyBTdGVyZW9NaXhkb3duRWxlbWVudE51bWJlcgogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1hdHJpeE1peGRvd25JbmRleFByZXNlbnQgPSBici5nZXRCaXRzKDEpOwogICAgICAgICAgICAgICAgIGlmIChNYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50ICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAzKSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1hdHJpeE1peGRvd25JbmRleCBfX3VudXNlZCA9IGJyLmdldEJpdHMoMik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgUHNldWRvU3Vycm91bmRFbmFibGUgX191bnVzZWQgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgICAgICBici5za2lwQml0cygyKTsgLy8gTWF0cml4TWl4ZG93bkluZGV4CisgICAgICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDEpOyAvLyBQc2V1ZG9TdXJyb3VuZEVuYWJsZQogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGludCBpOwogICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDUpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgRnJvbnRFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEZyb250RWxlbWVudFRhZ1NlbGVjdCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDQpOyAvLyBGcm9udEVsZW1lbnRUYWdTZWxlY3QKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gRnJvbnRFbGVtZW50SXNDcGUgPyAyIDogMTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bVNpZGVDaGFubmVsRWxlbWVudHM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDUpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU2lkZUVsZW1lbnRJc0NwZSA9IGJyLmdldEJpdHMoMSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU2lkZUVsZW1lbnRUYWdTZWxlY3QgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBici5za2lwQml0cyg0KTsgLy8gU2lkZUVsZW1lbnRUYWdTZWxlY3QKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gU2lkZUVsZW1lbnRJc0NwZSA/IDIgOiAxOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtQmFja0NoYW5uZWxFbGVtZW50czsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBCYWNrRWxlbWVudElzQ3BlID0gYnIuZ2V0Qml0cygxKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBCYWNrRWxlbWVudFRhZ1NlbGVjdCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDQpOyAvLyBCYWNrRWxlbWVudFRhZ1NlbGVjdAogICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSBCYWNrRWxlbWVudElzQ3BlID8gMiA6IDE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNoYW5uZWxzRWZmZWN0aXZlTnVtID0gY2hhbm5lbHNOdW07CiAKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUxmZUNoYW5uZWxFbGVtZW50czsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBMZmVFbGVtZW50VGFnU2VsZWN0IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoNCk7IC8vIExmZUVsZW1lbnRUYWdTZWxlY3QKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR1YoIm1wZWc0IGF1ZGlvIGNoYW5uZWxzTnVtID0gJWQiLCBjaGFubmVsc051bSk7CkBAIC00OTEzLDYgKzUwNDMsOCBAQAogICAgIGJvb2wgc3VjY2VzcyA9IEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7CiAgICAgQ0hFQ0soc3VjY2Vzcyk7CiAKKyAgICBtSXNNcGVnSCA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdIX01IQTEpIHx8CisgICAgICAgICAgICAgICAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9NSE0xKTsKICAgICBtSXNBVkMgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwogICAgIG1Jc0hFVkMgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSB8fAogICAgICAgICAgICAgICAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpOwpAQCAtNTc2Niw3ICs1ODk4LDcgQEAKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gYXBwbHkgc29tZSBzYW5pdHkgKHZzIHN0cmljdCBsZWdhbGl0eSkgY2hlY2tzCisgICAgICAgIC8vIGFwcGx5IHNvbWUgcXVpY2sgKHZzIHN0cmljdCBsZWdhbGl0eSkgY2hlY2tzCiAgICAgICAgIC8vCiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga01heFRydW5TYW1wbGVDb3VudCA9IDEwMDAwOwogICAgICAgICBpZiAoc2FtcGxlQ291bnQgPiBrTWF4VHJ1blNhbXBsZUNvdW50KSB7CkBAIC01OTgyLDEwICs2MTE0LDExIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHVpbnQzMl90IHN5bmNTYW1wbGVJbmRleCA9IHNhbXBsZUluZGV4OwotICAgICAgICAgICAgLy8gYXNzdW1lIGV2ZXJ5IG5vbi1VU0FDIGF1ZGlvIHNhbXBsZSBpcyBhIHN5bmMgc2FtcGxlLiBUaGlzIHdvcmtzIGFyb3VuZAorICAgICAgICAgICAgLy8gYXNzdW1lIGV2ZXJ5IG5vbi1VU0FDL25vbi1NUEVHSCBhdWRpbyBzYW1wbGUgaXMgYSBzeW5jIHNhbXBsZS4KKyAgICAgICAgICAgIC8vIFRoaXMgd29ya3MgYXJvdW5kCiAgICAgICAgICAgICAvLyBzZWVrIGlzc3VlcyB3aXRoIGZpbGVzIHRoYXQgd2VyZSBpbmNvcnJlY3RseSB3cml0dGVuIHdpdGggYW4KICAgICAgICAgICAgIC8vIGVtcHR5IG9yIHNpbmdsZS1zYW1wbGUgc3RzcyBibG9jayBmb3IgdGhlIGF1ZGlvIHRyYWNrCi0gICAgICAgICAgICBpZiAoZXJyID09IE9LICYmICghbUlzQXVkaW8gfHwgbUlzVXNhYykpIHsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0sgJiYgKCFtSXNBdWRpbyB8fCBtSXNVc2FjIHx8IG1Jc01wZWdIKSkgewogICAgICAgICAgICAgICAgIGVyciA9IG1TYW1wbGVUYWJsZS0+ZmluZFN5bmNTYW1wbGVOZWFyKAogICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlSW5kZXgsICZzeW5jU2FtcGxlSW5kZXgsIGZpbmRGbGFncyk7CiAgICAgICAgICAgICB9CkBAIC02NDg1LDkgKzY2MTgsOSBAQAogICAgIGlmIChzbXBsLT5lbmNyeXB0ZWRzaXplcy5zaXplKCkpIHsKICAgICAgICAgLy8gc3RvcmUgY2xlYXIvZW5jcnlwdGVkIGxlbmd0aHMgaW4gbWV0YWRhdGEKICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUywKLSAgICAgICAgICAgICAgICBzbXBsLT5jbGVhcnNpemVzLmFycmF5KCksIHNtcGwtPmNsZWFyc2l6ZXMuc2l6ZSgpICogNCk7CisgICAgICAgICAgICAgICAgc21wbC0+Y2xlYXJzaXplcy5hcnJheSgpLCBzbXBsLT5jbGVhcnNpemVzLnNpemUoKSAqIHNpemVvZih1aW50MzJfdCkpOwogICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9TSVpFUywKLSAgICAgICAgICAgICAgICBzbXBsLT5lbmNyeXB0ZWRzaXplcy5hcnJheSgpLCBzbXBsLT5lbmNyeXB0ZWRzaXplcy5zaXplKCkgKiA0KTsKKyAgICAgICAgICAgICAgICBzbXBsLT5lbmNyeXB0ZWRzaXplcy5hcnJheSgpLCBzbXBsLT5lbmNyeXB0ZWRzaXplcy5zaXplKCkgKiBzaXplb2YodWludDMyX3QpKTsKICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSwgbURlZmF1bHRJVlNpemUpOwogICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSwgbUNyeXB0b01vZGUpOwogICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgbUNyeXB0b0tleSwgMTYpOwpAQCAtNjcxMyw2ICs2ODQ2LDcgQEAKICAgICAgICAgRk9VUkNDKCJodmMxIiksCiAgICAgICAgIEZPVVJDQygiaGV2MSIpLAogICAgICAgICBGT1VSQ0MoImF2MDEiKSwKKyAgICAgICAgRk9VUkNDKCJ2cDA5IiksCiAgICAgICAgIEZPVVJDQygiM2dwNCIpLAogICAgICAgICBGT1VSQ0MoIm1wNDEiKSwKICAgICAgICAgRk9VUkNDKCJtcDQyIiksCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAKaW5kZXggYmM4NjMyYy4uN2U2MjQ3YiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icApAQCAtMSw2ICsxLDM1IEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfZXh0cmFjdG9yc19tcGVnMl9saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9leHRyYWN0b3JzX21wZWcyX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtcGVnMmV4dHJhY3RvciIsCiAKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICAgICAgYW5kcm9pZDogeworICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsibGlidm5ka3N1cHBvcnQjMjkiXSwKKyAgICAgICAgfSwKKyAgICB9LAorCiAgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbCkBAIC0xMiwxNCArNDEsMTMgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJjZ3JvdXByYyMyOSIsCi0gICAgICAgICJsaWJ2bmRrc3VwcG9ydCMyOSIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKICAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKLSAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfZGF0YXNvdXJjZV9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKQEAgLTM3LDcgKzY1LDcgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl93aXRob3V0X2ltZW1vcnkiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJleHRyYWN0b3IiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydF9ub2NyeXB0byIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAKaW5kZXggN2FlZDY4My4uZDc1NDBjNCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMjAgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2V4dHJhY3RvcnNfb2dnX2xpY2Vuc2UiXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfZXh0cmFjdG9yc19vZ2dfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm9nZ2V4dHJhY3RvciIsCiAKQEAgLTIwLDQgKzM3LDExIEBACiAgICAgICAgICJsaWJ2b3JiaXNpZGVjIiwKICAgICBdLAogCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5jcHAKaW5kZXggODI4YmNkNi4uZWIyMjQ2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuY3BwCkBAIC0xMzA0LDggKzEzMDQsOCBAQAogICAgICAgICAgICAgICAgIHx8IGF1ZGlvQ2hhbm5lbENvdW50IDw9IDAgfHwgYXVkaW9DaGFubmVsQ291bnQgPiBGQ0NfOCkgewogICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgaGFwdGljIGNoYW5uZWwgY291bnQgZm91bmQgaW4gbWV0YWRhdGE6ICVkIiwgbUhhcHRpY0NoYW5uZWxDb3VudCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudCgKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9DaGFubmVsQ291bnQpIHwgaGFwdGljQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PigKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGF1ZGlvQ2hhbm5lbENvdW50KSB8IGhhcHRpY0NoYW5uZWxNYXNrKTsKICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0ssIGNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMigKICAgICAgICAgICAgICAgICAgICAgbU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSEFQVElDX0NIQU5ORUxfQ09VTlQsIG1IYXB0aWNDaGFubmVsQ291bnQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGIzYWZlMmYuLmY0NmZhN2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJFeHRyYWN0b3JVbml0VGVzdCIsCiAgICAgZ3Rlc3Q6IHRydWUsCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvQW5kcm9pZFRlc3QueG1sCmluZGV4IDZiYjJjOGEuLmZjODE1MmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvQW5kcm9pZFRlc3QueG1sCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvQW5kcm9pZFRlc3QueG1sCkBAIC0xOSw3ICsxOSw3IEBACiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkV4dHJhY3RvclVuaXRUZXN0LT4vZGF0YS9sb2NhbC90bXAvRXh0cmFjdG9yVW5pdFRlc3QiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgotICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvZXh0cmFjdG9yLnppcD91bnppcD10cnVlIgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvZXh0cmFjdG9yLTEuNC56aXA/dW56aXA9dHJ1ZSIKICAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvRXh0cmFjdG9yVW5pdFRlc3RSZXMvIiAvPgogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0V4dHJhY3RvclVuaXRUZXN0LmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvRXh0cmFjdG9yVW5pdFRlc3QuY3BwCmluZGV4IDUxODE2NmUuLmQ5MWZmZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvRXh0cmFjdG9yVW5pdFRlc3QuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvRXh0cmFjdG9yVW5pdFRlc3QuY3BwCkBAIC0yMCw4ICsyMCwxMCBAQAogCiAjaW5jbHVkZSA8ZGF0YXNvdXJjZS9GaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmg+CiAKICNpbmNsdWRlICJhYWMvQUFDRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiYW1yL0FNUkV4dHJhY3Rvci5oIgpAQCAtNDMsMTEgKzQ1LDc2IEBACiAjZGVmaW5lIE9VVFBVVF9EVU1QX0ZJTEUgIi9kYXRhL2xvY2FsL3RtcC9leHRyYWN0b3JPdXRwdXQiCiAKIGNvbnN0ZXhwciBpbnQzMl90IGtNYXhDb3VudCA9IDEwOwotY29uc3RleHByIGludDMyX3Qga09wdXNTZWVrUHJlUm9sbFVzID0gODAwMDA7ICAvLyA4MCBtczsKK2NvbnN0ZXhwciBpbnQzMl90IGtBdWRpb0RlZmF1bHRTYW1wbGVEdXJhdGlvbiA9IDIwMDAwOyAgICAgICAgICAgICAgICAgICAgICAgLy8gMjBtcworY29uc3RleHByIGludDMyX3Qga1JhbmRvbVNlZWtUb2xlcmFuY2VVcyA9IDIgKiBrQXVkaW9EZWZhdWx0U2FtcGxlRHVyYXRpb247ICAvLyA0MCBtczsKK2NvbnN0ZXhwciBpbnQzMl90IGtSYW5kb21TZWVkID0gNzAwOworY29uc3RleHByIGludDMyX3Qga1VuZGVmaW5lZCA9IC0xOworCitlbnVtIGlucHV0SUQgeworICAgIC8vIGF1ZGlvIHN0cmVhbXMKKyAgICBBQUNfMSwKKyAgICBBTVJfTkJfMSwKKyAgICBBTVJfV0JfMSwKKyAgICBGTEFDXzEsCisgICAgR1NNXzEsCisgICAgTUlESV8xLAorICAgIE1QM18xLAorICAgIE9QVVNfMSwKKyAgICBWT1JCSVNfMSwKKyAgICAvLyB2aWRlbyBzdHJlYW1zCisgICAgSEVWQ18xLAorICAgIEhFVkNfMiwKKyAgICBNUEVHMl9QU18xLAorICAgIE1QRUcyX1RTXzEsCisgICAgTVBFRzRfMSwKKyAgICBWUDlfMSwKKyAgICBVTktOT1dOX0lELAorfTsKKworLy8gTG9va1VwVGFibGUgb2YgY2xpcHMgYW5kIG1ldGFkYXRhIGZvciBjb21wb25lbnQgdGVzdGluZworc3RhdGljIGNvbnN0IHN0cnVjdCBJbnB1dERhdGEgeworICAgIGlucHV0SUQgaW5wSWQ7CisgICAgc3RyaW5nIG1pbWU7CisgICAgc3RyaW5nIGlucHV0RmlsZTsKKyAgICBpbnQzMl90IGZpcnN0UGFyYW07CisgICAgaW50MzJfdCBzZWNvbmRQYXJhbTsKKyAgICBpbnQzMl90IHByb2ZpbGU7CisgICAgaW50MzJfdCBmcmFtZVJhdGU7Cit9IGtJbnB1dERhdGFbXSA9IHsKKyAgICAgICAge0FBQ18xLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJ0ZXN0X21vbm9fNDQxMDBIel9hYWMuYWFjIiwgNDQxMDAsIDEsIEFBQ09iamVjdExDLAorICAgICAgICAga1VuZGVmaW5lZH0sCisgICAgICAgIHtBTVJfTkJfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCAiYmJiX21vbm9fOGtIel9hbXJuYi5hbXIiLCA4MDAwLCAxLCBrVW5kZWZpbmVkLAorICAgICAgICAga1VuZGVmaW5lZH0sCisgICAgICAgIHtBTVJfV0JfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCAiYmJiX21vbm9fMTZrSHpfYW1yd2IuYW1yIiwgMTYwMDAsIDEsIGtVbmRlZmluZWQsCisgICAgICAgICBrVW5kZWZpbmVkfSwKKyAgICAgICAge0ZMQUNfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXLCAiYmJiX3N0ZXJlb180OGtIel9mbGFjLmZsYWMiLCA0ODAwMCwgMiwga1VuZGVmaW5lZCwKKyAgICAgICAgIGtVbmRlZmluZWR9LAorICAgICAgICB7R1NNXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNLCAidGVzdF9tb25vXzhrSHpfZ3NtLndhdiIsIDgwMDAsIDEsIGtVbmRlZmluZWQsCisgICAgICAgICBrVW5kZWZpbmVkfSwKKyAgICAgICAge01JRElfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXLCAibWlkaV9hLm1pZCIsIDIyMDUwLCAyLCBrVW5kZWZpbmVkLCBrVW5kZWZpbmVkfSwKKyAgICAgICAge01QM18xLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHLCAiYmJiX3N0ZXJlb180OGtIel9tcDMubXAzIiwgNDgwMDAsIDIsIGtVbmRlZmluZWQsCisgICAgICAgICBrVW5kZWZpbmVkfSwKKyAgICAgICAge09QVVNfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUywgInRlc3Rfc3RlcmVvXzQ4a0h6X29wdXMub3B1cyIsIDQ4MDAwLCAyLCBrVW5kZWZpbmVkLAorICAgICAgICAga1VuZGVmaW5lZH0sCisgICAgICAgIHtWT1JCSVNfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLCAiYmJiX3N0ZXJlb180OGtIel92b3JiaXMub2dnIiwgNDgwMDAsIDIsIGtVbmRlZmluZWQsCisgICAgICAgICBrVW5kZWZpbmVkfSwKKworICAgICAgICAvLyBUZXN0IChiLzE1MTY3NzI2NCkgZm9yIE1QNCBleHRyYWN0b3IKKyAgICAgICAge0hFVkNfMSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywgImNyb3dkXzUwOHgyNDBfMjVmcHNfaGV2Yy5tcDQiLCA1MDgsIDI0MCwKKyAgICAgICAgIEhFVkNQcm9maWxlTWFpbiwgMjV9LAorICAgICAgICB7SEVWQ18yLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMsICJ0ZXN0My5oZWljIiwgODIwLCA0NjAsIGtVbmRlZmluZWQsIGtVbmRlZmluZWR9LAorICAgICAgICB7TVBFRzJfUFNfMSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIsICJzd2lybF8xNDR4MTM2X21wZWcyLm1wZyIsIDE0NCwgMTM2LAorICAgICAgICAgTVBFRzJQcm9maWxlTWFpbiwgMTJ9LAorICAgICAgICB7TVBFRzJfVFNfMSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIsICJiYmJfY2lmXzc2OGticHNfMzBmcHNfbXBlZzIudHMiLCAzNTIsIDI4OCwKKyAgICAgICAgIE1QRUcyUHJvZmlsZU1haW4sIDMwfSwKKyAgICAgICAge01QRUc0XzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiYmJiX2NpZl83NjhrYnBzXzMwZnBzX21wZWc0Lm1rdiIsIDM1MiwgMjg4LAorICAgICAgICAgTVBFRzRQcm9maWxlU2ltcGxlLCAzMH0sCisgICAgICAgIHtWUDlfMSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5LCAiYmJiXzM0MHgyODBfMzBmcHNfdnA5LndlYm0iLCAzNDAsIDI4MCwgVlA5UHJvZmlsZTAsIDMwfSwKK307CiAKIHN0YXRpYyBFeHRyYWN0b3JVbml0VGVzdEVudmlyb25tZW50ICpnRW52ID0gbnVsbHB0cjsKIAotY2xhc3MgRXh0cmFjdG9yVW5pdFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHBhaXI8c3RyaW5nLCBzdHJpbmc+PiB7CitjbGFzcyBFeHRyYWN0b3JVbml0VGVzdCB7CiAgIHB1YmxpYzoKICAgICBFeHRyYWN0b3JVbml0VGVzdCgpIDogbUlucHV0RnAobnVsbHB0ciksIG1EYXRhU291cmNlKG51bGxwdHIpLCBtRXh0cmFjdG9yKG51bGxwdHIpIHt9CiAKQEAgLTY2LDE2ICsxMzMsMjkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICB2b2lkIHNldHVwRXh0cmFjdG9yKHN0cmluZyB3cml0ZXJGb3JtYXQpIHsKICAgICAgICAgbUV4dHJhY3Rvck5hbWUgPSB1bmtub3duX2NvbXA7CiAgICAgICAgIG1EaXNhYmxlVGVzdCA9IGZhbHNlOwogCiAgICAgICAgIHN0YXRpYyBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RhbmRhcmRFeHRyYWN0b3JzPiBtYXBFeHRyYWN0b3IgPSB7Ci0gICAgICAgICAgICAgICAgeyJhYWMiLCBBQUN9LCAgICAgeyJhbXIiLCBBTVJ9LCAgICAgICAgIHsibXAzIiwgTVAzfSwgICAgICAgIHsib2dnIiwgT0dHfSwKLSAgICAgICAgICAgICAgICB7IndhdiIsIFdBVn0sICAgICB7Im1rdiIsIE1LVn0sICAgICAgICAgeyJmbGFjIiwgRkxBQ30sICAgICAgeyJtaWRpIiwgTUlESX0sCi0gICAgICAgICAgICAgICAgeyJtcGVnNCIsIE1QRUc0fSwgeyJtcGVnMnRzIiwgTVBFRzJUU30sIHsibXBlZzJwcyIsIE1QRUcyUFN9fTsKKyAgICAgICAgICAgICAgICB7ImFhYyIsIEFBQ30sCisgICAgICAgICAgICAgICAgeyJhbXIiLCBBTVJ9LAorICAgICAgICAgICAgICAgIHsiZmxhYyIsIEZMQUN9LAorICAgICAgICAgICAgICAgIHsibWlkIiwgTUlESX0sCisgICAgICAgICAgICAgICAgeyJtaWRpIiwgTUlESX0sCisgICAgICAgICAgICAgICAgeyJta3YiLCBNS1Z9LAorICAgICAgICAgICAgICAgIHsibXAzIiwgTVAzfSwKKyAgICAgICAgICAgICAgICB7Im1wNCIsIE1QRUc0fSwKKyAgICAgICAgICAgICAgICB7Im1wZWcycHMiLCBNUEVHMlBTfSwKKyAgICAgICAgICAgICAgICB7Im1wZWcydHMiLCBNUEVHMlRTfSwKKyAgICAgICAgICAgICAgICB7Im1wZWc0IiwgTVBFRzR9LAorICAgICAgICAgICAgICAgIHsibXBnIiwgTVBFRzJQU30sCisgICAgICAgICAgICAgICAgeyJvZ2ciLCBPR0d9LAorICAgICAgICAgICAgICAgIHsib3B1cyIsIE9HR30sCisgICAgICAgICAgICAgICAgeyJ0cyIsIE1QRUcyVFN9LAorICAgICAgICAgICAgICAgIHsid2F2IiwgV0FWfSwKKyAgICAgICAgICAgICAgICB7IndlYm0iLCBNS1Z9fTsKICAgICAgICAgLy8gRmluZCB0aGUgY29tcG9uZW50IHR5cGUKLSAgICAgICAgc3RyaW5nIHdyaXRlckZvcm1hdCA9IEdldFBhcmFtKCkuZmlyc3Q7CiAgICAgICAgIGlmIChtYXBFeHRyYWN0b3IuZmluZCh3cml0ZXJGb3JtYXQpICE9IG1hcEV4dHJhY3Rvci5lbmQoKSkgewogICAgICAgICAgICAgbUV4dHJhY3Rvck5hbWUgPSBtYXBFeHRyYWN0b3IuYXQod3JpdGVyRm9ybWF0KTsKICAgICAgICAgfQpAQCAtMTEyLDYgKzE5MiwzOSBAQAogICAgIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyICptRXh0cmFjdG9yOwogfTsKIAorY2xhc3MgRXh0cmFjdG9yRnVuY3Rpb25hbGl0eVRlc3QKKyAgICA6IHB1YmxpYyBFeHRyYWN0b3JVbml0VGVzdCwKKyAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGU8c3RyaW5nIC8qIGNvbnRhaW5lciAqLywgc3RyaW5nIC8qIElucHV0RmlsZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAvKiBudW1UcmFja3MgKi8sIGJvb2wgLyogc2Vla1N1cHBvcnRlZCAqLz4+IHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgdHVwbGU8c3RyaW5nLCBzdHJpbmcsIGludDMyX3QsIGJvb2w+IHBhcmFtcyA9IEdldFBhcmFtKCk7CisgICAgICAgIG1Db250YWluZXIgPSBnZXQ8MD4ocGFyYW1zKTsKKyAgICAgICAgbU51bVRyYWNrcyA9IGdldDwyPihwYXJhbXMpOworICAgICAgICBzZXR1cEV4dHJhY3RvcihtQ29udGFpbmVyKTsKKyAgICB9CisgICAgc3RyaW5nIG1Db250YWluZXI7CisgICAgaW50MzJfdCBtTnVtVHJhY2tzOworfTsKKworY2xhc3MgQ29uZmlnUGFyYW1UZXN0IDogcHVibGljIEV4dHJhY3RvclVuaXRUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxwYWlyPHN0cmluZywgaW5wdXRJRD4+IHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsgc2V0dXBFeHRyYWN0b3IoR2V0UGFyYW0oKS5maXJzdCk7IH0KKworICAgIHN0cnVjdCBjb25maWdGb3JtYXQgeworICAgICAgICBzdHJpbmcgbWltZTsKKyAgICAgICAgaW50MzJfdCB3aWR0aDsKKyAgICAgICAgaW50MzJfdCBoZWlnaHQ7CisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQ7CisgICAgICAgIGludDMyX3QgcHJvZmlsZTsKKyAgICAgICAgaW50MzJfdCBmcmFtZVJhdGU7CisgICAgfTsKKworICAgIHZvaWQgZ2V0RmlsZVByb3BlcnRpZXMoaW5wdXRJRCBpbnB1dElkLCBzdHJpbmcgJmlucHV0RmlsZSwgY29uZmlnRm9ybWF0ICZjb25maWdQYXJhbSk7Cit9OworCiBpbnQzMl90IEV4dHJhY3RvclVuaXRUZXN0OjpzZXREYXRhU291cmNlKHN0cmluZyBpbnB1dEZpbGVOYW1lKSB7CiAgICAgbUlucHV0RnAgPSBmb3BlbihpbnB1dEZpbGVOYW1lLmNfc3RyKCksICJyYiIpOwogICAgIGlmICghbUlucHV0RnApIHsKQEAgLTE2OCw2ICsyODEsNzUgQEAKICAgICByZXR1cm4gMDsKIH0KIAordm9pZCBDb25maWdQYXJhbVRlc3Q6OmdldEZpbGVQcm9wZXJ0aWVzKGlucHV0SUQgaW5wdXRJZCwgc3RyaW5nICZpbnB1dEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnRm9ybWF0ICZjb25maWdQYXJhbSkgeworICAgIGludDMyX3QgaW5wdXREYXRhU2l6ZSA9IHNpemVvZihrSW5wdXREYXRhKSAvIHNpemVvZihrSW5wdXREYXRhWzBdKTsKKyAgICBpbnQzMl90IGlucHV0SWR4ID0gMDsKKyAgICBmb3IgKDsgaW5wdXRJZHggPCBpbnB1dERhdGFTaXplOyBpbnB1dElkeCsrKSB7CisgICAgICAgIGlmIChpbnB1dElkID09IGtJbnB1dERhdGFbaW5wdXRJZHhdLmlucElkKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5wdXRJZHggPT0gaW5wdXREYXRhU2l6ZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlucHV0RmlsZSArPSBrSW5wdXREYXRhW2lucHV0SWR4XS5pbnB1dEZpbGU7CisgICAgY29uZmlnUGFyYW0ubWltZSA9IGtJbnB1dERhdGFbaW5wdXRJZHhdLm1pbWU7CisgICAgc2l6ZV90IGZvdW5kID0gY29uZmlnUGFyYW0ubWltZS5maW5kKCJhdWRpby8iKTsKKyAgICAvLyBDaGVjayBpZiAnYXVkaW8vJyBpcyBwcmVzZW50IGluIHRoZSBiZWdpbmluaWcgb2YgdGhlIG1pbWUgdHlwZQorICAgIGlmIChmb3VuZCA9PSAwKSB7CisgICAgICAgIGNvbmZpZ1BhcmFtLnNhbXBsZVJhdGUgPSBrSW5wdXREYXRhW2lucHV0SWR4XS5maXJzdFBhcmFtOworICAgICAgICBjb25maWdQYXJhbS5jaGFubmVsQ291bnQgPSBrSW5wdXREYXRhW2lucHV0SWR4XS5zZWNvbmRQYXJhbTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25maWdQYXJhbS53aWR0aCA9IGtJbnB1dERhdGFbaW5wdXRJZHhdLmZpcnN0UGFyYW07CisgICAgICAgIGNvbmZpZ1BhcmFtLmhlaWdodCA9IGtJbnB1dERhdGFbaW5wdXRJZHhdLnNlY29uZFBhcmFtOworICAgIH0KKyAgICBjb25maWdQYXJhbS5wcm9maWxlID0ga0lucHV0RGF0YVtpbnB1dElkeF0ucHJvZmlsZTsKKyAgICBjb25maWdQYXJhbS5mcmFtZVJhdGUgPSBrSW5wdXREYXRhW2lucHV0SWR4XS5mcmFtZVJhdGU7CisgICAgcmV0dXJuOworfQorCit2b2lkIHJhbmRvbVNlZWtUZXN0KE1lZGlhVHJhY2tIZWxwZXIgKnRyYWNrLCBpbnQ2NF90IGNsaXBEdXJhdGlvbikgeworICAgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgICBpbnQzMl90IHNlZWtDb3VudCA9IDA7CisgICAgYm9vbCBoYXNUaW1lc3RhbXAgPSBmYWxzZTsKKyAgICB2ZWN0b3I8aW50NjRfdD4gc2Vla1RvVGltZVN0YW1wOworICAgIHN0cmluZyBzZWVrUHRzU3RyaW5nOworCisgICAgc3JhbmQoa1JhbmRvbVNlZWQpOworICAgIHdoaWxlIChzZWVrQ291bnQgPCBrTWF4Q291bnQpIHsKKyAgICAgICAgaW50NjRfdCB0aW1lU3RhbXAgPSAoKGRvdWJsZSlyYW5kKCkgLyBSQU5EX01BWCkgKiBjbGlwRHVyYXRpb247CisgICAgICAgIHNlZWtUb1RpbWVTdGFtcC5wdXNoX2JhY2sodGltZVN0YW1wKTsKKyAgICAgICAgc2Vla1B0c1N0cmluZy5hcHBlbmQodG9fc3RyaW5nKHRpbWVTdGFtcCkpOworICAgICAgICBzZWVrUHRzU3RyaW5nLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgc2Vla0NvdW50Kys7CisgICAgfQorCisgICAgZm9yIChpbnQ2NF90IHNlZWtQdHMgOiBzZWVrVG9UaW1lU3RhbXApIHsKKyAgICAgICAgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBuZXcgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnMoCisgICAgICAgICAgICAgICAgQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUIHwgQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFSywgc2Vla1B0cyk7CisgICAgICAgIEFTU0VSVF9ORShvcHRpb25zLCBudWxscHRyKSA8PCAiQ2Fubm90IGNyZWF0ZSByZWFkIG9wdGlvbiI7CisKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHN0YXR1cyA9IHRyYWNrLT5yZWFkKCZidWZmZXIsIG9wdGlvbnMpOworICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGFEYXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgIGludDY0X3QgdGltZVN0YW1wID0gMDsKKyAgICAgICAgICAgIGhhc1RpbWVzdGFtcCA9IEFNZWRpYUZvcm1hdF9nZXRJbnQ2NChtZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAmdGltZVN0YW1wKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGhhc1RpbWVzdGFtcCkgPDwgIkV4dHJhY3RvciBkaWRuJ3Qgc2V0IHRpbWVzdGFtcCBmb3IgdGhlIGdpdmVuIHNhbXBsZSI7CisKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgRVhQRUNUX0xFKGFicyh0aW1lU3RhbXAgLSBzZWVrUHRzKSwga1JhbmRvbVNlZWtUb2xlcmFuY2VVcykKKyAgICAgICAgICAgICAgICAgICAgPDwgIlNlZWsgdW5zdWNjZXNzZnVsLiBFeHBlY3RlZCB0aW1lc3RhbXAgcmFuZ2UgWyIKKyAgICAgICAgICAgICAgICAgICAgPDwgc2Vla1B0cyAtIGtSYW5kb21TZWVrVG9sZXJhbmNlVXMgPDwgIiwgIiA8PCBzZWVrUHRzICsga1JhbmRvbVNlZWtUb2xlcmFuY2VVcworICAgICAgICAgICAgICAgICAgICA8PCAiXSAiCisgICAgICAgICAgICAgICAgICAgIDw8ICJyZWNlaXZlZCAiIDw8IHRpbWVTdGFtcCA8PCAiLCBsaXN0IG9mIGlucHV0IHNlZWsgdGltZXN0YW1wcyBbIgorICAgICAgICAgICAgICAgICAgICA8PCBzZWVrUHRzU3RyaW5nIDw8ICJdIjsKKyAgICAgICAgfQorICAgICAgICBkZWxldGUgb3B0aW9uczsKKyAgICB9Cit9CisKIHZvaWQgZ2V0U2Vla2FibGVQb2ludHModmVjdG9yPGludDY0X3Q+ICZzZWVrYWJsZVBvaW50cywgTWVkaWFUcmFja0hlbHBlciAqdHJhY2spIHsKICAgICBpbnQzMl90IHN0YXR1cyA9IDA7CiAgICAgaWYgKCFzZWVrYWJsZVBvaW50cy5lbXB0eSgpKSB7CkBAIC0xOTAsMjAgKzM3MiwyMSBAQAogICAgIH0KIH0KIAotVEVTVF9QKEV4dHJhY3RvclVuaXRUZXN0LCBDcmVhdGVFeHRyYWN0b3JUZXN0KSB7CitURVNUX1AoRXh0cmFjdG9yRnVuY3Rpb25hbGl0eVRlc3QsIENyZWF0ZUV4dHJhY3RvclRlc3QpIHsKICAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CiAKICAgICBBTE9HVigiQ2hlY2tzIGlmIGEgdmFsaWQgZXh0cmFjdG9yIGlzIGNyZWF0ZWQgZm9yIGEgZ2l2ZW4gaW5wdXQgZmlsZSIpOwotICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDE+KEdldFBhcmFtKCkpOwogCi0gICAgQVNTRVJUX0VRKHNldERhdGFTb3VyY2UoaW5wdXRGaWxlTmFtZSksIDApCi0gICAgICAgICAgICA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBHZXRQYXJhbSgpLmZpcnN0IDw8ICJleHRyYWN0b3IiOworICAgIGludDMyX3Qgc3RhdHVzID0gc2V0RGF0YVNvdXJjZShpbnB1dEZpbGVOYW1lKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBtQ29udGFpbmVyIDw8ICJleHRyYWN0b3IiOwogCi0gICAgQVNTRVJUX0VRKGNyZWF0ZUV4dHJhY3RvcigpLCAwKQotICAgICAgICAgICAgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yIiA8PCBHZXRQYXJhbSgpLmZpcnN0IDw8ICJleHRyYWN0b3IiOworICAgIHN0YXR1cyA9IGNyZWF0ZUV4dHJhY3RvcigpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciIgPDwgbUNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKIAotICAgIC8vIEEgdmFsaWQgZXh0cmFjdG9yIGluc3RhY2Ugc2hvdWxkIHJldHVybiBzdWNjZXNzIGZvciBmb2xsb3dpbmcgY2FsbHMKLSAgICBBU1NFUlRfR1QobUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKSwgMCk7CisgICAgaW50MzJfdCBudW1UcmFja3MgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICAgIEFTU0VSVF9FUShudW1UcmFja3MsIG1OdW1UcmFja3MpCisgICAgICAgICAgICA8PCAiRXh0cmFjdG9yIHJlcG9ydGVkIHdyb25nIG51bWJlciBvZiB0cmFjayBmb3IgdGhlIGdpdmVuIGNsaXAiOwogCiAgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiAgICAgQVNTRVJUX05FKGZvcm1hdCwgbnVsbHB0cikgPDwgIkFNZWRpYUZvcm1hdF9uZXcgcmV0dXJuZWQgbnVsbCBBTWVkaWFmb3JtYXQiOwpAQCAtMjEyLDIwICszOTUsMjEgQEAKICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZvcm1hdCk7CiB9CiAKLVRFU1RfUChFeHRyYWN0b3JVbml0VGVzdCwgRXh0cmFjdG9yVGVzdCkgeworVEVTVF9QKEV4dHJhY3RvckZ1bmN0aW9uYWxpdHlUZXN0LCBFeHRyYWN0b3JUZXN0KSB7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOwogCi0gICAgQUxPR1YoIlZhbGlkYXRlcyAlcyBFeHRyYWN0b3IgZm9yIGEgZ2l2ZW4gaW5wdXQgZmlsZSIsIEdldFBhcmFtKCkuZmlyc3QuY19zdHIoKSk7Ci0gICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCkuc2Vjb25kOworICAgIEFMT0dWKCJWYWxpZGF0ZXMgJXMgRXh0cmFjdG9yIGZvciBhIGdpdmVuIGlucHV0IGZpbGUiLCBtQ29udGFpbmVyLmNfc3RyKCkpOworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MT4oR2V0UGFyYW0oKSk7CiAKICAgICBpbnQzMl90IHN0YXR1cyA9IHNldERhdGFTb3VyY2UoaW5wdXRGaWxlTmFtZSk7Ci0gICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBtQ29udGFpbmVyIDw8ICJleHRyYWN0b3IiOwogCiAgICAgc3RhdHVzID0gY3JlYXRlRXh0cmFjdG9yKCk7Ci0gICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yIiA8PCBHZXRQYXJhbSgpLmZpcnN0IDw8ICJleHRyYWN0b3IiOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciIgPDwgbUNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKIAogICAgIGludDMyX3QgbnVtVHJhY2tzID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKLSAgICBBU1NFUlRfR1QobnVtVHJhY2tzLCAwKSA8PCAiRXh0cmFjdG9yIGRpZG4ndCBmaW5kIGFueSB0cmFjayBmb3IgdGhlIGdpdmVuIGNsaXAiOworICAgIEFTU0VSVF9FUShudW1UcmFja3MsIG1OdW1UcmFja3MpCisgICAgICAgICAgICA8PCAiRXh0cmFjdG9yIHJlcG9ydGVkIHdyb25nIG51bWJlciBvZiB0cmFjayBmb3IgdGhlIGdpdmVuIGNsaXAiOwogCiAgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IG51bVRyYWNrczsgaWR4KyspIHsKICAgICAgICAgTWVkaWFUcmFja0hlbHBlciAqdHJhY2sgPSBtRXh0cmFjdG9yLT5nZXRUcmFjayhpZHgpOwpAQCAtMjYyLDIwICs0NDYsMjEgQEAKICAgICB9CiB9CiAKLVRFU1RfUChFeHRyYWN0b3JVbml0VGVzdCwgTWV0YURhdGFDb21wYXJpc29uVGVzdCkgeworVEVTVF9QKEV4dHJhY3RvckZ1bmN0aW9uYWxpdHlUZXN0LCBNZXRhRGF0YUNvbXBhcmlzb25UZXN0KSB7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOwogCiAgICAgQUxPR1YoIlZhbGlkYXRlcyBFeHRyYWN0b3IncyBtZXRhIGRhdGEgZm9yIGEgZ2l2ZW4gaW5wdXQgZmlsZSIpOwotICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDE+KEdldFBhcmFtKCkpOwogCiAgICAgaW50MzJfdCBzdGF0dXMgPSBzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpOwotICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgImV4dHJhY3RvciI7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgbUNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKIAogICAgIHN0YXR1cyA9IGNyZWF0ZUV4dHJhY3RvcigpOwotICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CiAKICAgICBpbnQzMl90IG51bVRyYWNrcyA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7Ci0gICAgQVNTRVJUX0dUKG51bVRyYWNrcywgMCkgPDwgIkV4dHJhY3RvciBkaWRuJ3QgZmluZCBhbnkgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKKyAgICBBU1NFUlRfRVEobnVtVHJhY2tzLCBtTnVtVHJhY2tzKQorICAgICAgICAgICAgPDwgIkV4dHJhY3RvciByZXBvcnRlZCB3cm9uZyBudW1iZXIgb2YgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKIAogICAgIEFNZWRpYUZvcm1hdCAqZXh0cmFjdG9yRm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOwogICAgIEFTU0VSVF9ORShleHRyYWN0b3JGb3JtYXQsIG51bGxwdHIpIDw8ICJBTWVkaWFGb3JtYXRfbmV3IHJldHVybmVkIG51bGwgQU1lZGlhZm9ybWF0IjsKQEAgLTMzNywyMCArNTIyLDIxIEBACiAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShleHRyYWN0b3JGb3JtYXQpOwogfQogCi1URVNUX1AoRXh0cmFjdG9yVW5pdFRlc3QsIE11bHRpcGxlU3RhcnRTdG9wVGVzdCkgeworVEVTVF9QKEV4dHJhY3RvckZ1bmN0aW9uYWxpdHlUZXN0LCBNdWx0aXBsZVN0YXJ0U3RvcFRlc3QpIHsKICAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CiAKLSAgICBBTE9HVigiVGVzdCAlcyBleHRyYWN0b3IgZm9yIG11bHRpcGxlIHN0YXJ0IGFuZCBzdG9wIGNhbGxzIiwgR2V0UGFyYW0oKS5maXJzdC5jX3N0cigpKTsKLSAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgQUxPR1YoIlRlc3QgJXMgZXh0cmFjdG9yIGZvciBtdWx0aXBsZSBzdGFydCBhbmQgc3RvcCBjYWxscyIsIG1Db250YWluZXIuY19zdHIoKSk7CisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwxPihHZXRQYXJhbSgpKTsKIAogICAgIGludDMyX3Qgc3RhdHVzID0gc2V0RGF0YVNvdXJjZShpbnB1dEZpbGVOYW1lKTsKLSAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBHZXRQYXJhbSgpLmZpcnN0IDw8ICJleHRyYWN0b3IiOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CiAKICAgICBzdGF0dXMgPSBjcmVhdGVFeHRyYWN0b3IoKTsKLSAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgImV4dHJhY3RvciI7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yIiA8PCBtQ29udGFpbmVyIDw8ICJleHRyYWN0b3IiOwogCiAgICAgaW50MzJfdCBudW1UcmFja3MgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwotICAgIEFTU0VSVF9HVChudW1UcmFja3MsIDApIDw8ICJFeHRyYWN0b3IgZGlkbid0IGZpbmQgYW55IHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CisgICAgQVNTRVJUX0VRKG51bVRyYWNrcywgbU51bVRyYWNrcykKKyAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgcmVwb3J0ZWQgd3JvbmcgbnVtYmVyIG9mIHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CiAKICAgICAvLyBzdGFydC9zdG9wIHRoZSB0cmFja3MgbXVsdGlwbGUgdGltZXMKICAgICBmb3IgKGludDMyX3QgY291bnQgPSAwOyBjb3VudCA8IGtNYXhDb3VudDsgY291bnQrKykgewpAQCAtMzc5LDI3ICs1NjUsMjggQEAKICAgICB9CiB9CiAKLVRFU1RfUChFeHRyYWN0b3JVbml0VGVzdCwgU2Vla1Rlc3QpIHsKLSAgICAvLyBCb3RoIEZsYWMgYW5kIFdhdiBleHRyYWN0b3IgY2FuIGdpdmUgc2FtcGxlcyBmcm9tIGFueSBwdHMgYW5kIG1hcmsgdGhlIGdpdmVuIHNhbXBsZSBhcwotICAgIC8vIHN5bmMgZnJhbWUuIFNvLCB0aGlzIHNlZWsgdGVzdCBpcyBub3QgYXBwbGljYWJsZSB0byBGTEFDIGFuZCBXQVYgZXh0cmFjdG9ycwotICAgIGlmIChtRGlzYWJsZVRlc3QgfHwgbUV4dHJhY3Rvck5hbWUgPT0gRkxBQyB8fCBtRXh0cmFjdG9yTmFtZSA9PSBXQVYpIHJldHVybjsKK1RFU1RfUChFeHRyYWN0b3JGdW5jdGlvbmFsaXR5VGVzdCwgU2Vla1Rlc3QpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CiAKLSAgICBBTE9HVigiVmFsaWRhdGVzICVzIEV4dHJhY3RvciBiZWhhdmlvdXIgZm9yIGRpZmZlcmVudCBzZWVrIG1vZGVzIiwgR2V0UGFyYW0oKS5maXJzdC5jX3N0cigpKTsKLSAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgQUxPR1YoIlZhbGlkYXRlcyAlcyBFeHRyYWN0b3IgYmVoYXZpb3VyIGZvciBkaWZmZXJlbnQgc2VlayBtb2RlcyIsIG1Db250YWluZXIuY19zdHIoKSk7CisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwxPihHZXRQYXJhbSgpKTsKIAogICAgIGludDMyX3Qgc3RhdHVzID0gc2V0RGF0YVNvdXJjZShpbnB1dEZpbGVOYW1lKTsKLSAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBHZXRQYXJhbSgpLmZpcnN0IDw8ICJleHRyYWN0b3IiOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CiAKICAgICBzdGF0dXMgPSBjcmVhdGVFeHRyYWN0b3IoKTsKLSAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgImV4dHJhY3RvciI7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yIiA8PCBtQ29udGFpbmVyIDw8ICJleHRyYWN0b3IiOwogCiAgICAgaW50MzJfdCBudW1UcmFja3MgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwotICAgIEFTU0VSVF9HVChudW1UcmFja3MsIDApIDw8ICJFeHRyYWN0b3IgZGlkbid0IGZpbmQgYW55IHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CisgICAgQVNTRVJUX0VRKG51bVRyYWNrcywgbU51bVRyYWNrcykKKyAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgcmVwb3J0ZWQgd3JvbmcgbnVtYmVyIG9mIHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CiAKICAgICB1aW50MzJfdCBzZWVrRmxhZyA9IG1FeHRyYWN0b3ItPmZsYWdzKCk7Ci0gICAgaWYgKCEoc2Vla0ZsYWcgJiBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcjo6Q0FOX1NFRUspKSB7Ci0gICAgICAgIGNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQuICIgPDwgR2V0UGFyYW0oKS5maXJzdAotICAgICAgICAgICAgIDw8ICIgRXh0cmFjdG9yIGRvZXNuJ3Qgc3VwcG9ydCBzZWVrXG4iOworICAgIGJvb2wgc2Vla1N1cHBvcnRlZCA9IGdldDwzPihHZXRQYXJhbSgpKTsKKyAgICBib29sIHNlZWthYmxlID0gc2Vla0ZsYWcgJiBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcjo6Q0FOX1NFRUs7CisgICAgaWYgKCFzZWVrYWJsZSkgeworICAgICAgICBBU1NFUlRfRkFMU0Uoc2Vla1N1cHBvcnRlZCkgPDwgbUNvbnRhaW5lciA8PCAiRXh0cmFjdG9yIGlzIGV4cGVjdGVkIHRvIHN1cHBvcnQgc2VlayAiOworICAgICAgICBjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkLiAiIDw8IG1Db250YWluZXIgPDwgIiBFeHRyYWN0b3IgZG9lc24ndCBzdXBwb3J0IHNlZWtcbiI7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTQxNSwxOSArNjAyLDczIEBACiAgICAgICAgIE1lZGlhQnVmZmVyR3JvdXAgKmJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXAoKTsKICAgICAgICAgc3RhdHVzID0gY1RyYWNrLT5zdGFydCh0cmFjaywgYnVmZmVyR3JvdXAtPndyYXAoKSk7CiAgICAgICAgIEFTU0VSVF9FUShPSywgKG1lZGlhX3N0YXR1c190KXN0YXR1cykgPDwgIkZhaWxlZCB0byBzdGFydCB0aGUgdHJhY2siOwotICAgICAgICBnZXRTZWVrYWJsZVBvaW50cyhzZWVrYWJsZVBvaW50cywgdHJhY2spOwotICAgICAgICBBU1NFUlRfR1Qoc2Vla2FibGVQb2ludHMuc2l6ZSgpLCAwKQotICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gZ2V0IHNlZWthYmxlIHBvaW50cyBmb3IgIiA8PCBHZXRQYXJhbSgpLmZpcnN0IDw8ICIgZXh0cmFjdG9yIjsKKworICAgICAgICAvLyBGb3IgRmxhYywgV2F2IGFuZCBNaWRpIGV4dHJhY3RvciwgYWxsIHNhbXBsZXMgYXJlIHNlZWsgcG9pbnRzLgorICAgICAgICAvLyBXZSBjYW5ub3QgY3JlYXRlIGxpc3Qgb2YgYWxsIHNlZWthYmxlIHBvaW50cyBmb3IgdGhlc2UuCisgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCBpZiB3ZSBwYXNzIGEgc2Vla1RvVGltZVN0YW1wIGJldHdlZW4gdHdvIHNlZWsgcG9pbnRzLCB3ZSBtYXkKKyAgICAgICAgLy8gZW5kIHVwIGdldHRpbmcgdGhlIHRpbWVzdGFtcCBvZiBuZXh0IHNhbXBsZSBhcyBhIHNlZWthYmxlIHRpbWVzdGFtcC4KKyAgICAgICAgLy8gVGhpcyB0aW1lc3RhbXAgbWF5L21heSBub3QgYmUgYSBwYXJ0IG9mIHRoZSBzZWVrYWJsZSBwb2ludCB2ZWN0b3IgdGhlcmVieSBmYWlsaW5nIHRoZQorICAgICAgICAvLyB0ZXN0LiBTbyB3ZSB0ZXN0IHRoZXNlIGV4dHJhY3RvcnMgdXNpbmcgcmFuZG9tIHNlZWsgdGVzdC4KKyAgICAgICAgaWYgKG1FeHRyYWN0b3JOYW1lID09IEZMQUMgfHwgbUV4dHJhY3Rvck5hbWUgPT0gV0FWIHx8IG1FeHRyYWN0b3JOYW1lID09IE1JREkpIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgICAgICAgICAgQVNTRVJUX05FKHRyYWNrTWV0YSwgbnVsbHB0cikgPDwgIkFNZWRpYUZvcm1hdF9uZXcgcmV0dXJuZWQgbnVsbCBBTWVkaWFmb3JtYXQiOworCisgICAgICAgICAgICBzdGF0dXMgPSBtRXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKHRyYWNrTWV0YSwgaWR4LCAxKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShPSywgKG1lZGlhX3N0YXR1c190KXN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdHJhY2tNZXRhRGF0YSI7CisKKyAgICAgICAgICAgIGludDY0X3QgY2xpcER1cmF0aW9uID0gMDsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQ2NCh0cmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZjbGlwRHVyYXRpb24pOworICAgICAgICAgICAgQVNTRVJUX0dUKGNsaXBEdXJhdGlvbiwgMCkgPDwgIkludmFsaWQgY2xpcCBkdXJhdGlvbiAiOworICAgICAgICAgICAgcmFuZG9tU2Vla1Rlc3QodHJhY2ssIGNsaXBEdXJhdGlvbik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHRyYWNrTWV0YSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCiAgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tGb3JtYXQgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiAgICAgICAgIEFTU0VSVF9ORSh0cmFja0Zvcm1hdCwgbnVsbHB0cikgPDwgIkFNZWRpYUZvcm1hdF9uZXcgcmV0dXJuZWQgbnVsbCBmb3JtYXQiOwogICAgICAgICBzdGF0dXMgPSB0cmFjay0+Z2V0Rm9ybWF0KHRyYWNrRm9ybWF0KTsKICAgICAgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayBtZXRhIGRhdGEiOwogCi0gICAgICAgIGJvb2wgaXNPcHVzID0gZmFsc2U7CiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpOwotICAgICAgICBpZiAoIXN0cmNtcChtaW1lLCAiYXVkaW8vb3B1cyIpKSBpc09wdXMgPSB0cnVlOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSkKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGdldCBtaW1lIjsKKworICAgICAgICAvLyBJbWFnZSBmb3JtYXRzIGFyZSBub3QgZXhwZWN0ZWQgdG8gYmUgc2Vla2FibGUKKyAgICAgICAgaWYgKCFzdHJuY21wKG1pbWUsICJpbWFnZS8iLCA2KSkgY29udGludWU7CisKKyAgICAgICAgLy8gUmVxdWVzdCBzZWVrYWJsZSBwb2ludHMgZm9yIHJlbWFpbmluZyBleHRyYWN0b3JzIHdoaWNoIHdpbGwgYmUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgc2VlaworICAgICAgICAvLyBhY2N1cmFjeSBmb3IgdGhlIGV4dHJhY3RvcnMuIERlcGVuZGluZyBvbiBTRUVLIE1vZGUsIHdlIGV4cGVjdCB0aGUgZXh0cmFjdG9ycyB0byByZXR1cm4KKyAgICAgICAgLy8gdGhlIGV4cGVjdGVkIHN5bmMgZnJhbWUuIFdlIGRvbid0IHByZWZlciByYW5kb20gc2VlayB0ZXN0IGZvciB0aGVzZSBleHRyYWN0b3JzIGJlY2F1c2UKKyAgICAgICAgLy8gdGhleSBhcmVuJ3QgZXhwZWN0ZWQgdG8gc2VlayB0byByYW5kb20gc2FtcGxlcy4gTVA0IGZvciBpbnN0YW5jZSBjYW4gc2VlayB0bworICAgICAgICAvLyBuZXh0L3ByZXZpb3VzIHN5bmMgZnJhbWVzIGJ1dCBub3QgdG8gc2FtcGxlcyBiZXR3ZWVuIHR3byBzeW5jIGZyYW1lcy4KKyAgICAgICAgZ2V0U2Vla2FibGVQb2ludHMoc2Vla2FibGVQb2ludHMsIHRyYWNrKTsKKyAgICAgICAgQVNTRVJUX0dUKHNlZWthYmxlUG9pbnRzLnNpemUoKSwgMCkKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGdldCBzZWVrYWJsZSBwb2ludHMgZm9yICIgPDwgbUNvbnRhaW5lciA8PCAiIGV4dHJhY3RvciI7CisKKyAgICAgICAgYm9vbCBpc09wdXMgPSBmYWxzZTsKKyAgICAgICAgaW50NjRfdCBvcHVzU2Vla1ByZVJvbGxVcyA9IDA7CisgICAgICAgIGlmICghc3RyY21wKG1pbWUsICJhdWRpby9vcHVzIikpIHsKKyAgICAgICAgICAgIGlzT3B1cyA9IHRydWU7CisgICAgICAgICAgICB2b2lkICpzZWVrUHJlUm9sbEJ1ZiA9IG51bGxwdHI7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2tGb3JtYXQsICJjc2QtMiIsICZzZWVrUHJlUm9sbEJ1ZiwgJnNpemUpKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IG9wdXNIZWFkU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgc2l6ZV90IGNvZGVjRGVsYXlCdWZTaXplID0gMDsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc2Vla1ByZVJvbGxCdWZTaXplID0gMDsKKyAgICAgICAgICAgICAgICB2b2lkICpjc2RCdWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgICAgIHZvaWQgKm9wdXNIZWFkQnVmID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICB2b2lkICpjb2RlY0RlbGF5QnVmID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrRm9ybWF0LCAiY3NkLTAiLCAmY3NkQnVmZmVyLCAmc2l6ZSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKGNzZEJ1ZmZlciwgbnVsbHB0cik7CisKKyAgICAgICAgICAgICAgICBHZXRPcHVzSGVhZGVyQnVmZmVycygodWludDhfdCAqKWNzZEJ1ZmZlciwgc2l6ZSwgJm9wdXNIZWFkQnVmLCAmb3B1c0hlYWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY0RlbGF5QnVmLCAmY29kZWNEZWxheUJ1ZlNpemUsICZzZWVrUHJlUm9sbEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vla1ByZVJvbGxCdWZTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFTU0VSVF9ORShzZWVrUHJlUm9sbEJ1ZiwgbnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgdHJhY2sgZm9ybWF0LiBTZWVrUHJlUm9sbCBpbmZvIG1pc3NpbmcgZm9yIE9wdXMgZmlsZSI7CisgICAgICAgICAgICBvcHVzU2Vla1ByZVJvbGxVcyA9ICooKGludDY0X3QgKilzZWVrUHJlUm9sbEJ1Zik7CisgICAgICAgIH0KICAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZSh0cmFja0Zvcm1hdCk7CiAKICAgICAgICAgaW50MzJfdCBzZWVrSWR4ID0gMDsKQEAgLTQ0OCw3ICs2ODksNyBAQAogICAgICAgICAgICAgICAgIC8vIGV4dHJhY3RvciBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIChzZWVrUHRzIC0gc2Vla1ByZVJvbGxVcykuCiAgICAgICAgICAgICAgICAgLy8gU28gd2UgYWRkIHRoZSBwcmVSb2xsIHZhbHVlIHRvIHRoZSB0aW1lU3RhbXAgd2Ugd2FudCB0byBzZWVrIHRvLgogICAgICAgICAgICAgICAgIGlmIChpc09wdXMpIHsKLSAgICAgICAgICAgICAgICAgICAgc2Vla1RvVGltZVN0YW1wICs9IGtPcHVzU2Vla1ByZVJvbGxVczsKKyAgICAgICAgICAgICAgICAgICAgc2Vla1RvVGltZVN0YW1wICs9IG9wdXNTZWVrUHJlUm9sbFVzOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zICpvcHRpb25zID0gbmV3IE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zKApAQCAtNDk2LDI0ICs3MzcsNTE3IEBACiAgICAgc2Vla2FibGVQb2ludHMuY2xlYXIoKTsKIH0KIAotLy8gVE9ETzogKGIvMTQ1MzMyMTg1KQotLy8gQWRkIE1JREkgaW5wdXRzCi1JTlNUQU5USUFURV9URVNUX1NVSVRFX1AoRXh0cmFjdG9yVW5pdFRlc3RBbGwsIEV4dHJhY3RvclVuaXRUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfcGFpcigiYWFjIiwgImxvdWRzb2Z0YWFjLmFhYyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYW1yIiwgInRlc3RhbXIuYW1yIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJhbXIiLCAiYW1yd2Iud2F2IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJvZ2ciLCAiam9obl9jYWdlLm9nZyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigid2F2IiwgIm1vbm90ZXN0Z3NtLndhdiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzJ0cyIsICJzZWdtZW50MDAwMDAxLnRzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJmbGFjIiwgInNpbmVzd2VlcGZsYWMuZmxhYyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigib2dnIiwgInRlc3RvcHVzLm9wdXMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1rdiIsICJzaW5lc3dlZXB2b3JiaXMubWt2IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcGVnNCIsICJzaW5lc3dlZXBvZ2dtcDQubXA0IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcDMiLCAic2luZXN3ZWVwbXAzbGFtZS5tcDMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1rdiIsICJzd2lybF8xNDR4MTM2X3ZwOS53ZWJtIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJta3YiLCAic3dpcmxfMTQ0eDEzNl92cDgud2VibSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzJwcyIsICJzd2lybF8xNDR4MTM2X21wZWcyLm1wZyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzQiLCAic3dpcmxfMTMyeDEzMF9tcGVnNC5tcDQiKSkpOworLy8gVGVzdHMgdGhlIGV4dHJhY3RvcnMgZm9yIHNlZWsgYmV5b25kIHJhbmdlIDogKDAsIENsaXBEdXJhdGlvbikKK1RFU1RfUChFeHRyYWN0b3JGdW5jdGlvbmFsaXR5VGVzdCwgTW9ua2V5U2Vla1Rlc3QpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgLy8gVE9ETyhiLzE1NTYzMDc3OCk6IEVuYWJsZSB0ZXN0IGZvciB3YXYgZXh0cmFjdG9ycworICAgIGlmIChtRXh0cmFjdG9yTmFtZSA9PSBXQVYpIHJldHVybjsKKworICAgIEFMT0dWKCJWYWxpZGF0ZXMgJXMgRXh0cmFjdG9yIGJlaGF2aW91ciBmb3IgaW52YWxpZCBzZWVrIHBvaW50cyIsIG1Db250YWluZXIuY19zdHIoKSk7CisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwxPihHZXRQYXJhbSgpKTsKKworICAgIGludDMyX3Qgc3RhdHVzID0gc2V0RGF0YVNvdXJjZShpbnB1dEZpbGVOYW1lKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBtQ29udGFpbmVyIDw8ICJleHRyYWN0b3IiOworCisgICAgc3RhdHVzID0gY3JlYXRlRXh0cmFjdG9yKCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yIiA8PCBtQ29udGFpbmVyIDw8ICJleHRyYWN0b3IiOworCisgICAgaW50MzJfdCBudW1UcmFja3MgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICAgIEFTU0VSVF9FUShudW1UcmFja3MsIG1OdW1UcmFja3MpCisgICAgICAgICAgICA8PCAiRXh0cmFjdG9yIHJlcG9ydGVkIHdyb25nIG51bWJlciBvZiB0cmFjayBmb3IgdGhlIGdpdmVuIGNsaXAiOworCisgICAgdWludDMyX3Qgc2Vla0ZsYWcgPSBtRXh0cmFjdG9yLT5mbGFncygpOworICAgIGJvb2wgc2Vla1N1cHBvcnRlZCA9IGdldDwzPihHZXRQYXJhbSgpKTsKKyAgICBib29sIHNlZWthYmxlID0gc2Vla0ZsYWcgJiBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcjo6Q0FOX1NFRUs7CisgICAgaWYgKCFzZWVrYWJsZSkgeworICAgICAgICBBU1NFUlRfRkFMU0Uoc2Vla1N1cHBvcnRlZCkgPDwgbUNvbnRhaW5lciA8PCAiRXh0cmFjdG9yIGlzIGV4cGVjdGVkIHRvIHN1cHBvcnQgc2VlayAiOworICAgICAgICBjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkLiAiIDw8IG1Db250YWluZXIgPDwgIiBFeHRyYWN0b3IgZG9lc24ndCBzdXBwb3J0IHNlZWtcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgbnVtVHJhY2tzOyBpZHgrKykgeworICAgICAgICBNZWRpYVRyYWNrSGVscGVyICp0cmFjayA9IG1FeHRyYWN0b3ItPmdldFRyYWNrKGlkeCk7CisgICAgICAgIEFTU0VSVF9ORSh0cmFjaywgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBnZXQgdHJhY2sgZm9yIGluZGV4ICIgPDwgaWR4OworCisgICAgICAgIENNZWRpYVRyYWNrICpjVHJhY2sgPSB3cmFwKHRyYWNrKTsKKyAgICAgICAgQVNTRVJUX05FKGNUcmFjaywgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBnZXQgdHJhY2sgd3JhcHBlciBmb3IgaW5kZXggIiA8PCBpZHg7CisKKyAgICAgICAgTWVkaWFCdWZmZXJHcm91cCAqYnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCgpOworICAgICAgICBzdGF0dXMgPSBjVHJhY2stPnN0YXJ0KHRyYWNrLCBidWZmZXJHcm91cC0+d3JhcCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0YXJ0IHRoZSB0cmFjayI7CisKKyAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgICAgIEFTU0VSVF9ORSh0cmFja01ldGEsIG51bGxwdHIpIDw8ICJBTWVkaWFGb3JtYXRfbmV3IHJldHVybmVkIG51bGwgQU1lZGlhZm9ybWF0IjsKKworICAgICAgICBzdGF0dXMgPSBtRXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKAorICAgICAgICAgICAgICAgIHRyYWNrTWV0YSwgaWR4LCBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcjo6a0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSk7CisgICAgICAgIEFTU0VSVF9FUShPSywgKG1lZGlhX3N0YXR1c190KXN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdHJhY2tNZXRhRGF0YSI7CisKKyAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gZ2V0IG1pbWUiOworCisgICAgICAgIGludDY0X3QgY2xpcER1cmF0aW9uID0gMDsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDY0KHRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJmNsaXBEdXJhdGlvbik7CisgICAgICAgIC8vIEltYWdlIGZvcm1hdHMgYXJlIG5vdCBleHBlY3RlZCB0byBoYXZlIGR1cmF0aW9uIGluZm9ybWF0aW9uCisgICAgICAgIEFTU0VSVF9UUlVFKGNsaXBEdXJhdGlvbiA+IDAgfHwgIXN0cm5jbXAobWltZSwgImltYWdlLyIsIDYpKSA8PCAiSW52YWxpZCBjbGlwIGR1cmF0aW9uICI7CisgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUodHJhY2tNZXRhKTsKKworICAgICAgICBpbnQ2NF90IHNlZWtUb1RpbWVTdGFtcFVzW10gPSB7LWNsaXBEdXJhdGlvbiwgY2xpcER1cmF0aW9uIC8gMiwgY2xpcER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcER1cmF0aW9uICogMn07CisgICAgICAgIGZvciAoaW50MzJfdCBtb2RlID0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOworICAgICAgICAgICAgIG1vZGUgPD0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUOyBtb2RlKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50NjRfdCBzZWVrVGltZVVzIDogc2Vla1RvVGltZVN0YW1wVXMpIHsKKyAgICAgICAgICAgICAgICBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IG5ldyBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9ucygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgfCBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLLCBzZWVrVGltZVVzKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfTkUob3B0aW9ucywgbnVsbHB0cikgPDwgIkNhbm5vdCBjcmVhdGUgcmVhZCBvcHRpb24iOworCisgICAgICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdHJhY2stPnJlYWQoJmJ1ZmZlciwgb3B0aW9ucyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgICAgICAgICBkZWxldGUgb3B0aW9uczsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhRGF0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVN0YW1wOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50NjQobWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgJnRpbWVTdGFtcCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJTZWVrZWQgdG8gdGltZXN0YW1wIDogJWxsZCwgcmVxdWVzdGVkIDogJWxsZCIsIChsb25nIGxvbmcpdGltZVN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNlZWtUaW1lVXMpOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gY1RyYWNrLT5zdG9wKHRyYWNrKTsKKyAgICAgICAgQVNTRVJUX0VRKE9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgdHJhY2siOworICAgICAgICBkZWxldGUgYnVmZmVyR3JvdXA7CisgICAgICAgIGRlbGV0ZSB0cmFjazsKKyAgICB9Cit9CisKKy8vIFRlc3RzIGV4dHJhY3RvcnMgZm9yIGludmFsaWQgdHJhY2tzCitURVNUX1AoRXh0cmFjdG9yRnVuY3Rpb25hbGl0eVRlc3QsIFNhbml0eVRlc3QpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgLy8gVE9ETyhiLzE1NTYyNjk0Nik6IEVuYWJsZSB0ZXN0IGZvciBNUEVHMiBUUy9QUyBleHRyYWN0b3JzCisgICAgaWYgKG1FeHRyYWN0b3JOYW1lID09IE1QRUcyVFMgfHwgbUV4dHJhY3Rvck5hbWUgPT0gTVBFRzJQUykgcmV0dXJuOworCisgICAgQUxPR1YoIlZhbGlkYXRlcyAlcyBFeHRyYWN0b3IgYmVoYXZpb3VyIGZvciBpbnZhbGlkIHRyYWNrcyIsIG1Db250YWluZXIuY19zdHIoKSk7CisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwxPihHZXRQYXJhbSgpKTsKKworICAgIGludDMyX3Qgc3RhdHVzID0gc2V0RGF0YVNvdXJjZShpbnB1dEZpbGVOYW1lKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBtQ29udGFpbmVyIDw8ICJleHRyYWN0b3IiOworCisgICAgc3RhdHVzID0gY3JlYXRlRXh0cmFjdG9yKCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yIiA8PCBtQ29udGFpbmVyIDw8ICJleHRyYWN0b3IiOworCisgICAgaW50MzJfdCBudW1UcmFja3MgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICAgIEFTU0VSVF9FUShudW1UcmFja3MsIG1OdW1UcmFja3MpCisgICAgICAgICAgICA8PCAiRXh0cmFjdG9yIHJlcG9ydGVkIHdyb25nIG51bWJlciBvZiB0cmFjayBmb3IgdGhlIGdpdmVuIGNsaXAiOworCisgICAgaW50MzJfdCB0cmFja0lkeFtdID0gey0xLCBudW1UcmFja3N9OworICAgIGZvciAoaW50MzJfdCBpZHggOiB0cmFja0lkeCkgeworICAgICAgICBNZWRpYVRyYWNrSGVscGVyICp0cmFjayA9IG1FeHRyYWN0b3ItPmdldFRyYWNrKGlkeCk7CisgICAgICAgIEFTU0VSVF9FUSh0cmFjaywgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBnZXQgdHJhY2sgZm9yIGluZGV4ICIgPDwgaWR4IDw8ICJcbiI7CisKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpleHRyYWN0b3JGb3JtYXQgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgICAgIEFTU0VSVF9ORShleHRyYWN0b3JGb3JtYXQsIG51bGxwdHIpIDw8ICJBTWVkaWFGb3JtYXRfbmV3IHJldHVybmVkIG51bGwgQU1lZGlhZm9ybWF0IjsKKworICAgICAgICBzdGF0dXMgPSBtRXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKAorICAgICAgICAgICAgICAgIGV4dHJhY3RvckZvcm1hdCwgaWR4LCBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcjo6a0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSk7CisgICAgICAgIEFTU0VSVF9ORShPSywgc3RhdHVzKSA8PCAiZ2V0VHJhY2tNZXRhRGF0YSBzaG91bGQgcmV0dXJuIGVycm9yIGZvciBpbnZhbGlkIGluZGV4ICIgPDwgaWR4OworICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGV4dHJhY3RvckZvcm1hdCk7CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgRXh0cmFjdG9yJ3MgZ2V0VHJhY2tNZXRhRGF0YSBmb3IgbnVsbCBmb3JtYXQKKyAgICBBTWVkaWFGb3JtYXQgKm1lZGlhRm9ybWF0ID0gbnVsbHB0cjsKKyAgICBzdGF0dXMgPSBtRXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKG1lZGlhRm9ybWF0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXI6OmtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGEpOworICAgIEFTU0VSVF9ORShPSywgc3RhdHVzKSA8PCAiZ2V0VHJhY2tNZXRhRGF0YSBzaG91bGQgcmV0dXJuIGVycm9yIGZvciBudWxsIE1lZGlhIGZvcm1hdCI7Cit9CisKKy8vIFRoaXMgdGVzdCB2YWxpZGF0ZXMgY29uZmlnIHBhcmFtcyBmb3IgYSBnaXZlbiBpbnB1dCBmaWxlLgorLy8gRm9yIHRoaXMgdGVzdCB3ZSBvbmx5IHRha2Ugc2luZ2xlIHRyYWNrIGZpbGVzIHNpbmNlIHRoZSBmb2N1cyBvZiB0aGlzIHRlc3QgaXMKKy8vIHRvIHZhbGlkYXRlIHRoZSBmaWxlIHByb3BlcnRpZXMgcmVwb3J0ZWQgYnkgRXh0cmFjdG9yIGFuZCBub3QgbXVsdGktdHJhY2sgYmVoYXZpb3IKK1RFU1RfUChDb25maWdQYXJhbVRlc3QsIENvbmZpZ1BhcmFtVmFsaWRhdGlvbikgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIHN0cmluZyBjb250YWluZXIgPSBHZXRQYXJhbSgpLmZpcnN0OworICAgIEFMT0dWKCJWYWxpZGF0ZXMgJXMgRXh0cmFjdG9yIGZvciBpbnB1dCdzIGZpbGUgcHJvcGVydGllcyIsIGNvbnRhaW5lci5jX3N0cigpKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpOworICAgIGlucHV0SUQgaW5wdXRGaWxlSWQgPSBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBjb25maWdGb3JtYXQgY29uZmlnUGFyYW07CisgICAgZ2V0RmlsZVByb3BlcnRpZXMoaW5wdXRGaWxlSWQsIGlucHV0RmlsZU5hbWUsIGNvbmZpZ1BhcmFtKTsKKworICAgIGludDMyX3Qgc3RhdHVzID0gc2V0RGF0YVNvdXJjZShpbnB1dEZpbGVOYW1lKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yICIgPDwgY29udGFpbmVyIDw8ICJleHRyYWN0b3IiOworCisgICAgc3RhdHVzID0gY3JlYXRlRXh0cmFjdG9yKCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yICIgPDwgY29udGFpbmVyIDw8ICJleHRyYWN0b3IiOworCisgICAgaW50MzJfdCBudW1UcmFja3MgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICAgIEFTU0VSVF9HVChudW1UcmFja3MsIDApIDw8ICJFeHRyYWN0b3IgZGlkbid0IGZpbmQgYW55IHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CisKKyAgICBNZWRpYVRyYWNrSGVscGVyICp0cmFjayA9IG1FeHRyYWN0b3ItPmdldFRyYWNrKDApOworICAgIEFTU0VSVF9ORSh0cmFjaywgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBnZXQgdHJhY2sgZm9yIGluZGV4IDAiOworCisgICAgQU1lZGlhRm9ybWF0ICp0cmFja0Zvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBBU1NFUlRfTkUodHJhY2tGb3JtYXQsIG51bGxwdHIpIDw8ICJBTWVkaWFGb3JtYXRfbmV3IHJldHVybmVkIG51bGwgZm9ybWF0IjsKKworICAgIHN0YXR1cyA9IHRyYWNrLT5nZXRGb3JtYXQodHJhY2tGb3JtYXQpOworICAgIEFTU0VSVF9FUShPSywgKG1lZGlhX3N0YXR1c190KXN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdHJhY2sgbWV0YSBkYXRhIjsKKworICAgIGNvbnN0IGNoYXIgKnRyYWNrTWltZTsKKyAgICBib29sIHZhbHVlRm91bmQgPSBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZ0cmFja01pbWUpOworICAgIEFTU0VSVF9UUlVFKHZhbHVlRm91bmQpIDw8ICJNaW1lIHR5cGUgbm90IHNldCBieSBleHRyYWN0b3IiOworICAgIEFTU0VSVF9TVFJFUShjb25maWdQYXJhbS5taW1lLmNfc3RyKCksIHRyYWNrTWltZSkgPDwgIkludmFsaWQgdHJhY2sgZm9ybWF0IjsKKworICAgIGlmICghc3RybmNtcCh0cmFja01pbWUsICJhdWRpby8iLCA2KSkgeworICAgICAgICBpbnQzMl90IHRyYWNrU2FtcGxlUmF0ZSwgdHJhY2tDaGFubmVsQ291bnQ7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMih0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrQ2hhbm5lbENvdW50KSk7CisgICAgICAgIEFTU0VSVF9UUlVFKAorICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMih0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgJnRyYWNrU2FtcGxlUmF0ZSkpOworICAgICAgICBBU1NFUlRfRVEoY29uZmlnUGFyYW0uc2FtcGxlUmF0ZSwgdHJhY2tTYW1wbGVSYXRlKSA8PCAiU2FtcGxlUmF0ZSBub3QgYXMgZXhwZWN0ZWQiOworICAgICAgICBBU1NFUlRfRVEoY29uZmlnUGFyYW0uY2hhbm5lbENvdW50LCB0cmFja0NoYW5uZWxDb3VudCkgPDwgIkNoYW5uZWxDb3VudCBub3QgYXMgZXhwZWN0ZWQiOworICAgIH0gZWxzZSB7CisgICAgICAgIGludDMyX3QgdHJhY2tXaWR0aCwgdHJhY2tIZWlnaHQ7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMih0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgJnRyYWNrV2lkdGgpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgJnRyYWNrSGVpZ2h0KSk7CisgICAgICAgIEFTU0VSVF9FUShjb25maWdQYXJhbS53aWR0aCwgdHJhY2tXaWR0aCkgPDwgIldpZHRoIG5vdCBhcyBleHBlY3RlZCI7CisgICAgICAgIEFTU0VSVF9FUShjb25maWdQYXJhbS5oZWlnaHQsIHRyYWNrSGVpZ2h0KSA8PCAiSGVpZ2h0IG5vdCBhcyBleHBlY3RlZCI7CisKKyAgICAgICAgaWYgKGNvbmZpZ1BhcmFtLmZyYW1lUmF0ZSAhPSBrVW5kZWZpbmVkKSB7CisgICAgICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKAorICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSwgJmZyYW1lUmF0ZSkpOworICAgICAgICAgICAgQVNTRVJUX0VRKGNvbmZpZ1BhcmFtLmZyYW1lUmF0ZSwgZnJhbWVSYXRlKSA8PCAiZnJhbWVSYXRlIG5vdCBhcyBleHBlY3RlZCI7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gdmFsaWRhdGUgdGhlIHByb2ZpbGUgZm9yIHRoZSBpbnB1dCBjbGlwCisgICAgaW50MzJfdCBwcm9maWxlOworICAgIGlmIChjb25maWdQYXJhbS5wcm9maWxlICE9IGtVbmRlZmluZWQpIHsKKyAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQzMih0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFLCAmcHJvZmlsZSkpIHsKKyAgICAgICAgICAgIEFTU0VSVF9FUShjb25maWdQYXJhbS5wcm9maWxlLCBwcm9maWxlKSA8PCAicHJvZmlsZSBub3QgYXMgZXhwZWN0ZWQiOworICAgICAgICB9IGVsc2UgaWYgKG1FeHRyYWN0b3JOYW1lID09IEFBQyAmJgorICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMih0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRSwgJnByb2ZpbGUpKSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoY29uZmlnUGFyYW0ucHJvZmlsZSwgcHJvZmlsZSkgPDwgInByb2ZpbGUgbm90IGFzIGV4cGVjdGVkIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAicHJvZmlsZSBub3QgcmV0dXJuZWQgaW4gZXh0cmFjdG9yIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRlbGV0ZSB0cmFjazsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHRyYWNrRm9ybWF0KTsKK30KKworY2xhc3MgRXh0cmFjdG9yQ29tcGFyaXNvbgorICAgIDogcHVibGljIEV4dHJhY3RvclVuaXRUZXN0LAorICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxwYWlyPHN0cmluZyAvKiBJbnB1dEZpbGUwICovLCBzdHJpbmcgLyogSW5wdXRGaWxlMSAqLz4+IHsKKyAgcHVibGljOgorICAgIH5FeHRyYWN0b3JDb21wYXJpc29uKCkgeworICAgICAgICBmb3IgKGludDhfdCAqZXh0cmFjdG9yT3AgOiBtRXh0cmFjdG9yT3V0cHV0KSB7CisgICAgICAgICAgICBpZiAoZXh0cmFjdG9yT3AgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGZyZWUoZXh0cmFjdG9yT3ApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaW50OF90ICptRXh0cmFjdG9yT3V0cHV0WzJde307CisgICAgc2l6ZV90IG1FeHRyYWN0b3JPdXB1dFNpemVbMl17fTsKK307CisKK3NpemVfdCBhbGxvY2F0ZU91dHB1dEJ1ZmZlcnMoc3RyaW5nIGlucHV0RmlsZU5hbWUsIEFNZWRpYUZvcm1hdCAqZXh0cmFjdG9yRm9ybWF0KSB7CisgICAgc2l6ZV90IGJ1ZmZlclNpemUgPSAwdTsKKyAgICAvLyBhbGxvY2F0aW5nIHRoZSBidWZmZXIgc2l6ZSBhcyBzYW1wbGVSYXRlICogY2hhbm5lbENvdW50ICogY2xpcER1cmF0aW9uIHNpbmNlCisgICAgLy8gc29tZSBleHRyYWN0b3JzIGxpa2UgZmxhYywgbWlkaSBhbmQgd2F2IGRlY29kZXMgdGhlIGZpbGUuIFRoZXNlIGV4dHJhY3RvcnMKKyAgICAvLyBhZHZlcnRpc2UgdGhlIG1pbWUgdHlwZSBhcyByYXcuCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGV4dHJhY3RvckZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7CisgICAgaWYgKCFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkgeworICAgICAgICBpbnQ2NF90IGNsaXBEdXJhdGlvblVzID0gLTE7CisgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gLTE7CisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IC0xOworICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wcGxlID0gLTE7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKGV4dHJhY3RvckZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbENvdW50KSB8fCBjaGFubmVsQ291bnQgPD0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2hhbm5lbENvdW50IGZvciBpbnB1dCBmaWxlIDogJXMiLCBpbnB1dEZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZXh0cmFjdG9yRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCAmc2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgICAgIHNhbXBsZVJhdGUgPD0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgc2FtcGxlUmF0ZSBmb3IgaW5wdXQgZmlsZSA6ICVzIiwgaW5wdXRGaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDY0KGV4dHJhY3RvckZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJmNsaXBEdXJhdGlvblVzKSB8fAorICAgICAgICAgICAgY2xpcER1cmF0aW9uVXMgPD0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2xpcCBkdXJhdGlvbiBmb3IgaW5wdXQgZmlsZSA6ICVzIiwgaW5wdXRGaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKGV4dHJhY3RvckZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiaXRzUGVyU2FtcHBsZSkgfHwgYml0c1BlclNhbXBwbGUgPD0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgYml0cyBwZXIgc2FtcGxlIGZvciBpbnB1dCBmaWxlIDogJXMiLCBpbnB1dEZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyU2l6ZSA9IGJpdHNQZXJTYW1wcGxlICogY2hhbm5lbENvdW50ICogc2FtcGxlUmF0ZSAqIChjbGlwRHVyYXRpb25VcyAvIDEwMDAwMDAgKyAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgICAgIGludDMyX3Qgc3RhdHVzID0gc3RhdChpbnB1dEZpbGVOYW1lLmNfc3RyKCksICZidWYpOworICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZ2V0IGZpbGUgcHJvcGVydGllcyBmb3I6ICVzIiwgaW5wdXRGaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlclNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIGJ1ZmZlclNpemU7Cit9CisKKy8vIENvbXBhcmUgb3V0cHV0IG9mIHR3byBleHRyYWN0b3JzIGZvciBpZGVudGljYWwgY29udGVudAorVEVTVF9QKEV4dHJhY3RvckNvbXBhcmlzb24sIEV4dHJhY3RvckNvbXBhcmlzb25UZXN0KSB7CisgICAgdmVjdG9yPHN0cmluZz4gaW5wdXRGaWxlTmFtZXMgPSB7R2V0UGFyYW0oKS5maXJzdCwgR2V0UGFyYW0oKS5zZWNvbmR9OworICAgIHNpemVfdCBleHRyYWN0ZWRPdXRwdXRTaXplWzJde307CisgICAgQU1lZGlhRm9ybWF0ICpleHRyYWN0b3JGb3JtYXRbMl17fTsKKyAgICBpbnQzMl90IHN0YXR1cyA9IE9LOworCisgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IGlucHV0RmlsZU5hbWVzLnNpemUoKTsgaWR4KyspIHsKKyAgICAgICAgc3RyaW5nIGNvbnRhaW5lckZvcm1hdCA9IGlucHV0RmlsZU5hbWVzW2lkeF0uc3Vic3RyKGlucHV0RmlsZU5hbWVzW2lkeF0uZmluZCgiLiIpICsgMSk7CisgICAgICAgIHNldHVwRXh0cmFjdG9yKGNvbnRhaW5lckZvcm1hdCk7CisgICAgICAgIGlmIChtRGlzYWJsZVRlc3QpIHsKKyAgICAgICAgICAgIEFMT0dWKCJVbmtub3duIGV4dHJhY3RvciAlcy4gU2tpcHBpbmcgdGhlIHRlc3QiLCBjb250YWluZXJGb3JtYXQuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiVmFsaWRhdGVzICVzIEV4dHJhY3RvciBmb3IgJXMiLCBjb250YWluZXJGb3JtYXQuY19zdHIoKSwKKyAgICAgICAgICAgICAgaW5wdXRGaWxlTmFtZXNbaWR4XS5jX3N0cigpKTsKKyAgICAgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIGlucHV0RmlsZU5hbWVzW2lkeF07CisKKyAgICAgICAgc3RhdHVzID0gc2V0RGF0YVNvdXJjZShpbnB1dEZpbGVOYW1lKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgY29udGFpbmVyRm9ybWF0IDw8ICJleHRyYWN0b3IiOworCisgICAgICAgIHN0YXR1cyA9IGNyZWF0ZUV4dHJhY3RvcigpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IgIiA8PCBjb250YWluZXJGb3JtYXQgPDwgIiBleHRyYWN0b3IiOworCisgICAgICAgIGludDMyX3QgbnVtVHJhY2tzID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKyAgICAgICAgQVNTRVJUX0VRKG51bVRyYWNrcywgMSkgPDwgIlRoaXMgdGVzdCBleHBlY3RzIGlucHV0cyB3aXRoIG9uZSB0cmFjayBvbmx5IjsKKworICAgICAgICBpbnQzMl90IHRyYWNrSWR4ID0gMDsKKyAgICAgICAgTWVkaWFUcmFja0hlbHBlciAqdHJhY2sgPSBtRXh0cmFjdG9yLT5nZXRUcmFjayh0cmFja0lkeCk7CisgICAgICAgIEFTU0VSVF9ORSh0cmFjaywgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBnZXQgdHJhY2sgZm9yIGluZGV4ICIgPDwgdHJhY2tJZHg7CisKKyAgICAgICAgZXh0cmFjdG9yRm9ybWF0W2lkeF0gPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgICAgIEFTU0VSVF9ORShleHRyYWN0b3JGb3JtYXRbaWR4XSwgbnVsbHB0cikgPDwgIkFNZWRpYUZvcm1hdF9uZXcgcmV0dXJuZWQgbnVsbCBBTWVkaWFmb3JtYXQiOworCisgICAgICAgIHN0YXR1cyA9IHRyYWNrLT5nZXRGb3JtYXQoZXh0cmFjdG9yRm9ybWF0W2lkeF0pOworICAgICAgICBBU1NFUlRfRVEoT0ssIChtZWRpYV9zdGF0dXNfdClzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRyYWNrIG1ldGEgZGF0YSI7CisKKyAgICAgICAgQ01lZGlhVHJhY2sgKmNUcmFjayA9IHdyYXAodHJhY2spOworICAgICAgICBBU1NFUlRfTkUoY1RyYWNrLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayB3cmFwcGVyIGZvciBpbmRleCAiIDw8IHRyYWNrSWR4OworCisgICAgICAgIG1FeHRyYWN0b3JPdXB1dFNpemVbaWR4XSA9IGFsbG9jYXRlT3V0cHV0QnVmZmVycyhpbnB1dEZpbGVOYW1lLCBleHRyYWN0b3JGb3JtYXRbaWR4XSk7CisgICAgICAgIEFTU0VSVF9HVChtRXh0cmFjdG9yT3VwdXRTaXplW2lkeF0sIDB1KSA8PCAiIEludmFsaWQgc2l6ZSBmb3Igb3V0cHV0IGJ1ZmZlcnMiOworCisgICAgICAgIG1FeHRyYWN0b3JPdXRwdXRbaWR4XSA9IChpbnQ4X3QgKiljYWxsb2MoMSwgbUV4dHJhY3Rvck91cHV0U2l6ZVtpZHhdKTsKKyAgICAgICAgQVNTRVJUX05FKG1FeHRyYWN0b3JPdXRwdXRbaWR4XSwgbnVsbHB0cikKKyAgICAgICAgICAgICAgICA8PCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igd3JpdGluZyBleHRyYWN0b3IncyBvdXRwdXQiOworCisgICAgICAgIE1lZGlhQnVmZmVyR3JvdXAgKmJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXAoKTsKKyAgICAgICAgc3RhdHVzID0gY1RyYWNrLT5zdGFydCh0cmFjaywgYnVmZmVyR3JvdXAtPndyYXAoKSk7CisgICAgICAgIEFTU0VSVF9FUShPSywgKG1lZGlhX3N0YXR1c190KXN0YXR1cykgPDwgIkZhaWxlZCB0byBzdGFydCB0aGUgdHJhY2siOworCisgICAgICAgIGludDMyX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgd2hpbGUgKHN0YXR1cyAhPSBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICBzdGF0dXMgPSB0cmFjay0+cmVhZCgmYnVmZmVyKTsKKyAgICAgICAgICAgIEFMT0dWKCJ0cmFjay0+cmVhZCBTdGF0dXMgPSAlZCBidWZmZXIgJXAiLCBzdGF0dXMsIGJ1ZmZlcik7CisgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0xFKG9mZnNldCArIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCksIG1FeHRyYWN0b3JPdXB1dFNpemVbaWR4XSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJNZW1vcnkgb3ZlcmZsb3cuIEV4dHJhY3RlZCBvdXRwdXQgc2l6ZSBtb3JlIHRoYW4gZXhwZWN0ZWQiOworCisgICAgICAgICAgICAgICAgbWVtY3B5KG1FeHRyYWN0b3JPdXRwdXRbaWR4XSArIG9mZnNldCwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGV4dHJhY3RlZE91dHB1dFNpemVbaWR4XSArPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IGNUcmFjay0+c3RvcCh0cmFjayk7CisgICAgICAgIEFTU0VSVF9FUShPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgdGhlIHRyYWNrIjsKKworICAgICAgICBmY2xvc2UobUlucHV0RnApOworICAgICAgICBkZWxldGUgYnVmZmVyR3JvdXA7CisgICAgICAgIGRlbGV0ZSB0cmFjazsKKyAgICAgICAgbURhdGFTb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgZGVsZXRlIG1FeHRyYWN0b3I7CisgICAgICAgIG1JbnB1dEZwID0gbnVsbHB0cjsKKyAgICAgICAgbUV4dHJhY3RvciA9IG51bGxwdHI7CisgICAgfQorCisgICAgLy8gQ29tcGFyZSB0aGUgbWV0YSBkYXRhIGZyb20gYm90aCB0aGUgZXh0cmFjdG9ycworICAgIGNvbnN0IGNoYXIgKm1pbWVbMl07CisgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhleHRyYWN0b3JGb3JtYXRbMF0sIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWVbMF0pOworICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoZXh0cmFjdG9yRm9ybWF0WzFdLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lWzFdKTsKKyAgICBBU1NFUlRfU1RSRVEobWltZVswXSwgbWltZVsxXSkgPDwgIk1pc21hdGNoIGJldHdlZW4gZXh0cmFjdG9yJ3MgZm9ybWF0IjsKKworICAgIGlmICghc3RybmNtcChtaW1lWzBdLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQwLCBjaGFubmVsQ291bnQxOworICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUwLCBzYW1wbGVSYXRlMTsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGV4dHJhY3RvckZvcm1hdFswXSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWxDb3VudDApKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGV4dHJhY3RvckZvcm1hdFswXSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVSYXRlMCkpOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZXh0cmFjdG9yRm9ybWF0WzFdLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbENvdW50MSkpOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZXh0cmFjdG9yRm9ybWF0WzFdLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVJhdGUxKSk7CisgICAgICAgIEFTU0VSVF9FUShjaGFubmVsQ291bnQwLCBjaGFubmVsQ291bnQxKSA8PCAiTWlzbWF0Y2ggYmV0d2VlbiBleHRyYWN0b3IncyBjaGFubmVsQ291bnQiOworICAgICAgICBBU1NFUlRfRVEoc2FtcGxlUmF0ZTAsIHNhbXBsZVJhdGUxKSA8PCAiTWlzbWF0Y2ggYmV0d2VlbiBleHRyYWN0b3IncyBzYW1wbGVSYXRlIjsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKG1pbWVbMF0sICJ2aWRlby8iLCA2KSkgeworICAgICAgICBpbnQzMl90IHdpZHRoMCwgaGVpZ2h0MDsKKyAgICAgICAgaW50MzJfdCB3aWR0aDEsIGhlaWdodDE7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihleHRyYWN0b3JGb3JtYXRbMF0sIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsICZ3aWR0aDApKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGV4dHJhY3RvckZvcm1hdFswXSwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsICZoZWlnaHQwKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihleHRyYWN0b3JGb3JtYXRbMV0sIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsICZ3aWR0aDEpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGV4dHJhY3RvckZvcm1hdFsxXSwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsICZoZWlnaHQxKSk7CisgICAgICAgIEFTU0VSVF9FUSh3aWR0aDAsIHdpZHRoMSkgPDwgIk1pc21hdGNoIGJldHdlZW4gZXh0cmFjdG9yJ3Mgd2lkdGgiOworICAgICAgICBBU1NFUlRfRVEoaGVpZ2h0MCwgaGVpZ2h0MSkgPDwgIk1pc21hdGNoIGJldHdlZW4gZXh0cmFjdG9yJ3MgaGVpZ2h0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIkludmFsaWQgbWltZSB0eXBlICIgPDwgbWltZVswXTsKKyAgICB9CisKKyAgICBmb3IgKEFNZWRpYUZvcm1hdCAqZXhGb3JtYXQgOiBleHRyYWN0b3JGb3JtYXQpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShleEZvcm1hdCk7CisgICAgfQorCisgICAgLy8gQ29tcGFyZSB0aGUgZXh0cmFjdGVkIG91dHB1dHMgb2YgYm90aCBleHRyYWN0b3IKKyAgICBBU1NFUlRfRVEoZXh0cmFjdGVkT3V0cHV0U2l6ZVswXSwgZXh0cmFjdGVkT3V0cHV0U2l6ZVsxXSkKKyAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IncyBvdXRwdXQgc2l6ZSBkb2Vzbid0IG1hdGNoIGJldHdlZW4gIiA8PCBpbnB1dEZpbGVOYW1lc1swXSA8PCAiYW5kICIKKyAgICAgICAgICAgIDw8IGlucHV0RmlsZU5hbWVzWzFdIDw8ICIgZXh0cmFjdG9ycyI7CisgICAgc3RhdHVzID0gbWVtY21wKG1FeHRyYWN0b3JPdXRwdXRbMF0sIG1FeHRyYWN0b3JPdXRwdXRbMV0sIGV4dHJhY3RlZE91dHB1dFNpemVbMF0pOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0ZWQgY29udGVudCBtaXNtYXRjaCBiZXR3ZWVuICIgPDwgaW5wdXRGaWxlTmFtZXNbMF0gPDwgImFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5wdXRGaWxlTmFtZXNbMV0gPDwgIiBleHRyYWN0b3JzIjsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBFeHRyYWN0b3JDb21wYXJpc29uQWxsLCBFeHRyYWN0b3JDb21wYXJpc29uLAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoInN3aXJsXzE0NHgxMzZfdnA5Lm1wNCIsICJzd2lybF8xNDR4MTM2X3ZwOS53ZWJtIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigidmlkZW9fNDgweDM2MF9tcDRfdnA5XzMzM2ticHNfMjVmcHMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb180ODB4MzYwX3dlYm1fdnA5XzMzM2ticHNfMjVmcHMud2VibSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInZpZGVvXzEyODB4NzIwX2F2MV9oZHJfc3RhdGljXzNtYnBzLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fMTI4MHg3MjBfYXYxX2hkcl9zdGF0aWNfM21icHMud2VibSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInN3aXJsXzEzMngxMzBfbXBlZzQuM2dwIiwgInN3aXJsXzEzMngxMzBfbXBlZzQubWt2IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic3dpcmxfMTQ0eDEzNl9hdmMubWt2IiwgInN3aXJsXzE0NHgxMzZfYXZjLm1wNCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInN3aXJsXzEzMngxMzBfbXBlZzQubXA0IiwgInN3aXJsXzEzMngxMzBfbXBlZzQubWt2IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiY3Jvd2RfNTA4eDI0MF8yNWZwc19oZXZjLm1wNCIsImNyb3dkXzUwOHgyNDBfMjVmcHNfaGV2Yy5ta3YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfY2lmXzc2OGticHNfMzBmcHNfbXBlZzIubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfY2lmXzc2OGticHNfMzBmcHNfbXBlZzIudHMiKSwKKworICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImxvdWRzb2Z0YWFjLmFhYyIsICJsb3Vkc29mdGFhYy5ta3YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXBmbGFjbWt2Lm1rdiIsICJzaW5lc3dlZXBmbGFjbXA0Lm1wNCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInNpbmVzd2VlcG1wM2xhbWUubXAzIiwgInNpbmVzd2VlcG1wM2xhbWUubWt2IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic2luZXN3ZWVwb2dnbXA0Lm1wNCIsICJzaW5lc3dlZXBvZ2cub2dnIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic2luZXN3ZWVwdm9yYmlzLm1wNCIsICJzaW5lc3dlZXB2b3JiaXMub2dnIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic2luZXN3ZWVwdm9yYmlzLm1rdiIsICJzaW5lc3dlZXB2b3JiaXMub2dnIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigidGVzdG9wdXMubWt2IiwgInRlc3RvcHVzLm1wNCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInRlc3RvcHVzLm1wNCIsICJ0ZXN0b3B1cy5vcHVzIiksCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJsb3Vkc29mdGFhYy5hYWMiLCAibG91ZHNvZnRhYWMuYWFjIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigidGVzdGFtci5hbXIiLCAidGVzdGFtci5hbXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXBmbGFjLmZsYWMiLCAic2luZXN3ZWVwZmxhYy5mbGFjIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibWlkaV9hLm1pZCIsICJtaWRpX2EubWlkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic2luZXN3ZWVwdm9yYmlzLm1rdiIsICJzaW5lc3dlZXB2b3JiaXMubWt2IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic2luZXN3ZWVwbXAzbGFtZS5tcDMiLCAic2luZXN3ZWVwbXAzbGFtZS5tcDMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXBvZ2dtcDQubXA0IiwgInNpbmVzd2VlcG9nZ21wNC5tcDQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ0ZXN0b3B1cy5vcHVzIiwgInRlc3RvcHVzLm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJqb2huX2NhZ2Uub2dnIiwgImpvaG5fY2FnZS5vZ2ciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtb25vdGVzdGdzbS53YXYiLCAibW9ub3Rlc3Rnc20ud2F2IiksCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzd2lybF8xNDR4MTM2X21wZWcyLm1wZyIsICJzd2lybF8xNDR4MTM2X21wZWcyLm1wZyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInN3aXJsXzEzMngxMzBfbXBlZzQubXA0IiwgInN3aXJsXzEzMngxMzBfbXBlZzQubXA0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic3dpcmxfMTQ0eDEzNl92cDkud2VibSIsICJzd2lybF8xNDR4MTM2X3ZwOS53ZWJtIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic3dpcmxfMTQ0eDEzNl92cDgud2VibSIsICJzd2lybF8xNDR4MTM2X3ZwOC53ZWJtIikpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKENvbmZpZ1BhcmFtVGVzdEFsbCwgQ29uZmlnUGFyYW1UZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfcGFpcigiYWFjIiwgQUFDXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYW1yIiwgQU1SX05CXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYW1yIiwgQU1SX1dCXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiZmxhYyIsIEZMQUNfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ3YXYiLCBHU01fMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtaWRpIiwgTUlESV8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wMyIsIE1QM18xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm9nZyIsIE9QVVNfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJvZ2ciLCBWT1JCSVNfMSksCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWc0IiwgSEVWQ18xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWc0IiwgSEVWQ18yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWcycHMiLCBNUEVHMl9QU18xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWcydHMiLCBNUEVHMl9UU18xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1rdiIsIE1QRUc0XzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibWt2IiwgVlA5XzEpKSk7CisKKy8vIFZhbGlkYXRlIGV4dHJhY3RvcnMgZm9yIGNvbnRhaW5lciBmb3JtYXQsIGlucHV0IGZpbGUsIG5vLiBvZiB0cmFja3MgYW5kIHN1cHBvcnRzIHNlZWsgZmxhZworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBFeHRyYWN0b3JVbml0VGVzdEFsbCwgRXh0cmFjdG9yRnVuY3Rpb25hbGl0eVRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFhYyIsICJsb3Vkc29mdGFhYy5hYWMiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJhbXIiLCAidGVzdGFtci5hbXIiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJhbXIiLCAiYW1yd2Iud2F2IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiZmxhYyIsICJzaW5lc3dlZXBmbGFjLmZsYWMiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtaWRpIiwgIm1pZGlfYS5taWQiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJta3YiLCAic2luZXN3ZWVwdm9yYmlzLm1rdiIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1rdiIsICJzaW5lc3dlZXBtcDNsYW1lLm1rdiIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1rdiIsICJsb3Vkc29mdGFhYy5ta3YiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcDMiLCAic2luZXN3ZWVwbXAzbGFtZS5tcDMiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcDMiLCAiaWQzdGVzdDEwLm1wMyIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWcydHMiLCAic2VnbWVudDAwMDAwMS50cyIsIDIsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnMnRzIiwgInRlc3RhYzN0cy50cyIsIDEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnMnRzIiwgInRlc3RhYzR0cy50cyIsIDEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnMnRzIiwgInRlc3RlYWMzdHMudHMiLCAxLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAiYXVkaW9fYWFjX21vbm9fNzBrYnNfNDQxMDBoei5tcDQiLCAyLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJtdWx0aTBfYWM0Lm1wNCIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgIm5vaXNlXzZjaF80NGtoel9hb3Q1X2RyX3Nicl9zaWcyX21wNC5tNGEiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJzaW5lc3dlZXBhbGFjLm1vdiIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgInNpbmVzd2VlcGZsYWNtcDQubXA0IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAic2luZXN3ZWVwbTRhLm00YSIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgInNpbmVzd2VlcG9nZ21wNC5tcDQiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJzaW5lc3dlZXBvcHVzbXA0Lm1wNCIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgInRlc3RhYzNtcDQubXA0IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAidGVzdGVhYzNtcDQubXA0IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgib2dnIiwgImpvaG5fY2FnZS5vZ2ciLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJvZ2ciLCAidGVzdG9wdXMub3B1cyIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm9nZyIsICJzaW5lc3dlZXBvZ2dhbGJ1bWFydC5vZ2ciLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3YXYiLCAibG91ZHNvZnR3YXYud2F2IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2F2IiwgIm1vbm90ZXN0Z3NtLndhdiIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndhdiIsICJub2lzZV81Y2hfNDRraHpfYW90Ml93YXZlLndhdiIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndhdiIsICJzaW5lMWtoem00MGRiX2FsYXcud2F2IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2F2IiwgInNpbmUxa2h6bTQwZGJfZjMybGUud2F2IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2F2IiwgInNpbmUxa2h6bTQwZGJfbXVsYXcud2F2IiwgMSwgdHJ1ZSksCisKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJta3YiLCAic3dpcmxfMTQ0eDEzNl9hdmMubWt2IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibWt2IiwgIndpdGhvdXRjdWVzLm1rdiIsIDIsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1rdiIsICJzd2lybF8xNDR4MTM2X3ZwOS53ZWJtIiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibWt2IiwgInN3aXJsXzE0NHgxMzZfdnA4LndlYm0iLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnMnBzIiwgInN3aXJsXzE0NHgxMzZfbXBlZzIubXBnIiwgMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWcycHMiLCAicHJvZ3JhbXN0cmVhbS5tcGVnIiwgMiwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgImNvbG9yXzE3NngxNDRfYnQ2MDFfNTI1X2xyX3Nkcl9oMjY0Lm1wNCIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgImhlaWZ3cml0ZXJfaW5wdXQuaGVpYyIsIDQsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJwc3NodGVzdC5tcDQiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJzd2lybF8xMzJ4MTMwX21wZWc0Lm1wNCIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgInRlc3R2aWRlby4zZ3AiLCA0LCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJ0ZXN0dmlkZW9fd2l0aF8yX3RpbWVkdGV4dF90cmFja3MuM2dwIiwgNCwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzE3NngxNDRfM2dwX2gyNjNfMzAwa2Jwc18yNWZwc19hYWNfc3RlcmVvXzEyOGticHNfMTEwMjVoel8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0YWRhdGFfZ3lyb19jb21wbGlhbnQuM2dwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAibXBlZzQiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzE5MjB4MTA4MF9tcDRfbXBlZzJfMTIwMDBrYnBzXzMwZnBzX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAyLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fNDgweDM2MF9tcDRfaGV2Y182NTBrYnBzXzMwZnBzX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm1wNCIsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgIm1wZWc0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb180ODB4MzYwX21wNF9oMjY0XzEzNTBrYnBzXzMwZnBzX2FhY19zdGVyZW9fMTI4a2Jwc180NDEwMGh6X2Rhc2gubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDIsIHRydWUpKSk7CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewogICAgIGdFbnYgPSBuZXcgRXh0cmFjdG9yVW5pdFRlc3RFbnZpcm9ubWVudCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9SRUFETUUubWQgYi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL1JFQURNRS5tZAppbmRleCA2OTUzOGI2Li5jZmYwOWNhIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL1JFQURNRS5tZAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL1JFQURNRS5tZApAQCAtMjIsNyArMjIsNyBAQAogYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9FeHRyYWN0b3JVbml0VGVzdC9FeHRyYWN0b3JVbml0VGVzdCAvZGF0YS9sb2NhbC90bXAvCiBgYGAKIAotVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvZXh0cmFjdG9yLnppcCkuIERvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL2V4dHJhY3Rvci0xLjQuemlwKS4gRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgogCiBgYGAKIGFkYiBwdXNoIGV4dHJhY3RvciAvZGF0YS9sb2NhbC90bXAvCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icAppbmRleCA1ZDM4YTgxLi5jYzVlMWM3IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAKQEAgLTEsNyArMSwyNCBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfZXh0cmFjdG9yc193YXZfbGljZW5zZSJdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9leHRyYWN0b3JzX3dhdl9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlid2F2ZXh0cmFjdG9yIiwKIAotICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1kZWZhdWx0cyJdLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1kZWZhdWx0cyIsICJsaWJiaW5kZXJfbmRrX2hvc3RfdXNlciJdLAogCiAgICAgc3JjczogWyJXQVZFeHRyYWN0b3IuY3BwIl0sCiAKQEAgLTE5LDQgKzM2LDExIEBACiAgICAgICAgICJsaWJmaWZvIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCisKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS9pbWdfdXRpbHMvQW5kcm9pZC5icAppbmRleCA2NDUzMGUxLi4yMzdjZDJiIDEwMDY0NAotLS0gYS9tZWRpYS9pbWdfdXRpbHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9pbWdfdXRpbHMvQW5kcm9pZC5icApAQCAtMTIsNiArMTIsMTUgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliaW1nX3V0aWxzIiwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvamFuaXRvcnMvUkVBRE1FIGIvbWVkaWEvamFuaXRvcnMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYjhlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYW5pdG9ycy9SRUFETUUKQEAgLTAsMCArMSw0IEBACitBIGNvbGxlY3Rpb24gb2YgT1dORVJTIGZpbGVzIHRoYXQgd2UgcmVmZXJlbmNlIGZyb20gb3RoZXIgcHJvamVjdHMsCitzdWNoIGFzIHRoZSBzb2Z0d2FyZSBjb2RlY3MgaW4gZGlyZWN0b3JpZXMgbGlrZSBleHRlcm5hbC9saWJhdmMuCitUaGlzIGlzIHRvIHNpbXBsaWZ5IG91ciBvd25lci9hcHByb3ZlciBtYW5hZ2VtZW50IGFjcm9zcyB0aGUgbXVsdGlwbGUKK3Byb2plY3RzIHJlbGF0ZWQgdG8gbWVkaWEuCmRpZmYgLS1naXQgYS9tZWRpYS9qYW5pdG9ycy9jb2RlY19PV05FUlMgYi9tZWRpYS9qYW5pdG9ycy9jb2RlY19PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwMTM5OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phbml0b3JzL2NvZGVjX09XTkVSUwpAQCAtMCwwICsxLDUgQEAKKyMgZ2Vycml0IG93bmVyL2FwcHJvdmVycyBmb3IgdGhlIGFjdHVhbCBzb2Z0d2FyZSBjb2RlYyBsaWJyYXJpZXMKKyMgZGlmZmVyZW50aWF0ZWQgZnJvbSBwbHVnaW5zIGNvbm5lY3RpbmcgdGhvc2UgY29kZWNzIHRvIGVpdGhlciBvbXggb3IgY29kZWMyIGluZnJhc3RydWN0dXJlCitlc3NpY2tAZ29vZ2xlLmNvbQorbGFqb3NAZ29vZ2xlLmNvbQorbWFyY29uZUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9BbmRyb2lkLmJwCmluZGV4IDE0MDA1MmYuLjA1Yzc4OGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9BbmRyb2lkLmJwCkBAIC0xMiw2ICsxMiwxNSBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogbmRrX2hlYWRlcnMgewogICAgIG5hbWU6ICJsaWJBQXVkaW9faGVhZGVycyIsCiAgICAgZnJvbTogImluY2x1ZGUiLApAQCAtMzMsNCArNDIsMyBAQAogICAgIG5hbWU6ICJsaWJhYXVkaW9faGVhZGVycyIsCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL0FuZHJvaWQuYnAKaW5kZXggNDliZDVlZS4uZTJjMTg3OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X2hlYWRlcnMgewogICAgIG5hbWU6ICJsaWJhYXVkaW9fZXhhbXBsZV91dGlscyIsCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJ1dGlscyJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3IvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL0FuZHJvaWQuYnAKaW5kZXggZDhjNTg0My4uNzJhZGZkNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3IvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogImlucHV0X21vbml0b3IiLAogICAgIGd0ZXN0OiBmYWxzZSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL0FuZHJvaWQuYnAKaW5kZXggNWI3ZDk1Ni4uOGQ4NmU5NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiYWF1ZGlvX2xvb3BiYWNrIiwKICAgICBndGVzdDogZmFsc2UsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvZHVtbXkuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL2R1bW15LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmN2UzNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvZHVtbXkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0vKioKLSAqIER1bW15IGZpbGUgbmVlZGVkIHRvIGdldCBBbmRyb2lkIFN0dWRpbyB0byBzY2FuIHRoaXMgZm9sZGVyLgotICovCi0KLWludCBnX0RvTm90VXNlVGhpc1ZhcmlhYmxlID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy91bnVzZWQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL3VudXNlZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE1MjA1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy91bnVzZWQuY3BwCkBAIC0wLDAgKzEsNSBAQAorLyoqCisgKiBVbnVzZWQgZmlsZSByZXF1aXJlZCB0byBnZXQgQW5kcm9pZCBTdHVkaW8gdG8gc2NhbiB0aGlzIGZvbGRlci4KKyAqLworCitpbnQgZ19Eb05vdFVzZVRoaXNWYXJpYWJsZSA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvQW5kcm9pZC5icAppbmRleCBhYTI1ZTY3Li4xYzdlMGYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAid3JpdGVfc2luZSIsCiAgICAgc3JjczogWyJzcmMvd3JpdGVfc2luZS5jcHAiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaCBiL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaAppbmRleCBjYWI4OTI5Li43MDljNjU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCkBAIC0yOSw2ICsyOSw4IEBACiAjaWZuZGVmIEFBVURJT19BQVVESU9fSAogI2RlZmluZSBBQVVESU9fQUFVRElPX0gKIAorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpAQCAtMTAyMiw3ICsxMDI0LDYgQEAKIC8vIFN0cmVhbSBDb250cm9sCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAzMAogLyoqCiAgKiBGcmVlIHRoZSBhdWRpbyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgc3RyZWFtIGNyZWF0ZWQgYnkKICAqIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpLgpAQCAtMTA0MCwxMSArMTA0MSwxMiBAQAogICogT24gb3RoZXIgIkxlZ2FjeSIgc3RyZWFtcyBzb21lIGF1ZGlvIHJlc291cmNlcyB3aWxsIHN0aWxsIGJlIGluIHVzZQogICogYW5kIHNvbWUgY2FsbGJhY2tzIG1heSBzdGlsbCBiZSBpbiBwcm9jZXNzIGFmdGVyIHRoaXMgY2FsbC4KICAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDMwLgorICoKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCiAgKiBAcmV0dXJuIHtAbGluayAjQUFVRElPX09LfSBvciBhIG5lZ2F0aXZlIGVycm9yLgogICovCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlbGVhc2UoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIF9fSU5UUk9EVUNFRF9JTigzMCk7Ci0jZW5kaWYgLy8gX19BTkRST0lEX0FQSV9fCiAKIC8qKgogICogRGVsZXRlIHRoZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdHJlYW0gY3JlYXRlZApAQCAtMTA1Miw2ICsxMDU0LDggQEAKICAqCiAgKiBJZiBBQXVkaW9TdHJlYW1fcmVsZWFzZSgpIGhhcyBub3QgYmVlbiBjYWxsZWQgdGhlbiBpdCB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5LgogICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjYuCisgKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKICAqIEByZXR1cm4ge0BsaW5rICNBQVVESU9fT0t9IG9yIGEgbmVnYXRpdmUgZXJyb3IuCiAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icAppbmRleCA3MTdmMzFhLi5mZGJjOWM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmFhdWRpbyIsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oCmluZGV4IDRlYzM4YzUuLjM5MjdmNTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaApAQCAtMjYsNyArMjYsNyBAQAogCiBuYW1lc3BhY2UgYWF1ZGlvIHsKIAotLy8gQXJiaXRyYXJ5IGxpbWl0cyBmb3Igc2FuaXR5IGNoZWNrcy4gVE9ETyByZW1vdmUgYWZ0ZXIgZGVidWdnaW5nLgorLy8gQXJiaXRyYXJ5IGxpbWl0cyBmb3IgcmFuZ2UgY2hlY2tzLgogI2RlZmluZSBNQVhfU0hBUkVEX01FTU9SSUVTICgzMikKICNkZWZpbmUgTUFYX01NQVBfT0ZGU0VUX0JZVEVTICgzMiAqIDEwMjQgKiA4KQogI2RlZmluZSBNQVhfTU1BUF9TSVpFX0JZVEVTICgzMiAqIDEwMjQgKiA4KQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaAppbmRleCBlZGE0NmFlLi45NzI5MzJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaApAQCAtMjY3LDcgKzI2Nyw3IEBACiAgICAgQXVkaW9GbG9hdElucHV0UG9ydCBpbnB1dDsKIAogICAgIC8qKgotICAgICAqIER1bW15IHByb2Nlc3Nvci4gVGhlIHdvcmsgaGFwcGVucyBpbiB0aGUgcmVhZCgpIG1ldGhvZC4KKyAgICAgKiBEbyBub3RoaW5nLiBUaGUgd29yayBoYXBwZW5zIGluIHRoZSByZWFkKCkgbWV0aG9kLgogICAgICAqCiAgICAgICogQHBhcmFtIGZyYW1lUG9zaXRpb24gaW5kZXggb2YgZmlyc3QgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkCiAgICAgICogQHBhcmFtIG51bUZyYW1lcwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcAppbmRleCA5MDA3YjEwLi4zZGZiODAxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcApAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgImNvcmUvQXVkaW9HbG9iYWwuaCIKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvVGVzdGluZy5oPgogI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8tYmFzZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPGFzc2VydC5oPgogCiAjaW5jbHVkZSAidXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaCIKQEAgLTIzMSw3ICsyMzEsOCBAQAogICAgICAgICBjYXNlIEFBVURJT19BTExPV19DQVBUVVJFX0JZX1NZU1RFTToKICAgICAgICAgICAgIHJldHVybiBBVURJT19GTEFHX05PX01FRElBX1BST0pFQ1RJT047CiAgICAgICAgIGNhc2UgQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfTk9ORToKLSAgICAgICAgICAgIHJldHVybiBBVURJT19GTEFHX05PX01FRElBX1BST0pFQ1RJT04gfCBBVURJT19GTEFHX05PX1NZU1RFTV9DQVBUVVJFOworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGF1ZGlvX2ZsYWdzX21hc2tfdD4oCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZMQUdfTk9fTUVESUFfUFJPSkVDVElPTiB8IEFVRElPX0ZMQUdfTk9fU1lTVEVNX0NBUFRVUkUpOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIiVzKCkgMHglMDhYIHVucmVjb2duaXplZCIsIF9fZnVuY19fLCBwb2xpY3kpOwogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfTk9ORTsgLy8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaAppbmRleCBkMmU0ODA1Li44MmViNzdkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icAppbmRleCA4OTM1ZDU3Li5jY2ZiZWEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2RlZmF1bHRzIHsKICAgICBuYW1lOiAibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIiwKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwCmluZGV4IGZhMmExNTkuLjBjMTFlMGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCkBAIC0xMiw2ICsyMSwxMiBAQAogICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbl9oZWFkZXJzIiwKICAgICBdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKQEAgLTQyLDcgKzU3LDcgQEAKICAgICBdLAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliYXVkaW9jbGllbnQiLAogCiAgICAgYWlkbDogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9BdHRyaWJ1dGVzLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvQXR0cmlidXRlcy5jcHAKaW5kZXggMWVlNjkzMC4uZmY0YmEwNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9BdHRyaWJ1dGVzLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0F0dHJpYnV0ZXMuY3BwCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMigwKTsKICAgICB9IGVsc2UgewogICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoMSk7Ci0gICAgICAgIHBhcmNlbC0+d3JpdGVVdGY4QXNVdGYxNihtQXR0cmlidXRlcy50YWdzKTsKKyAgICAgICAgcGFyY2VsLT53cml0ZVV0ZjhBc1V0ZjE2KHN0ZDo6c3RyaW5nKG1BdHRyaWJ1dGVzLnRhZ3MpKTsKICAgICB9CiAgICAgcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1TdHJlYW1UeXBlKSk7CiAgICAgcGFyY2VsLT53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4obUdyb3VwSWQpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcAppbmRleCA5NTY4ZTgzLi41NWI4MzZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCkBAIC0yNzksNyArMjc5LDggQEAKICAgICAgICAgbUF0dHJpYnV0ZXMuc291cmNlID0gaW5wdXRTb3VyY2U7CiAgICAgICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTgogICAgICAgICAgICAgICAgIHx8IGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9DQU1DT1JERVIpIHsKLSAgICAgICAgICAgIG1BdHRyaWJ1dGVzLmZsYWdzIHw9IEFVRElPX0ZMQUdfQ0FQVFVSRV9QUklWQVRFOworICAgICAgICAgICAgbUF0dHJpYnV0ZXMuZmxhZ3MgPSBzdGF0aWNfY2FzdDxhdWRpb19mbGFnc19tYXNrX3Q+KAorICAgICAgICAgICAgICAgICAgICBtQXR0cmlidXRlcy5mbGFncyB8IEFVRElPX0ZMQUdfQ0FQVFVSRV9QUklWQVRFKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIHN0cmVhbSB0eXBlIHNob3VsZG4ndCBiZSBsb29rZWQgYXQsIHRoaXMgdHJhY2sgaGFzIGF1ZGlvIGF0dHJpYnV0ZXMKQEAgLTExMDMsNyArMTEwNCw3IEBACiAgICAgfQogCiAgICAgaWYgKHNzaXplX3QodXNlclNpemUpIDwgMCB8fCAoYnVmZmVyID09IE5VTEwgJiYgdXNlclNpemUgIT0gMCkpIHsKLSAgICAgICAgLy8gc2FuaXR5LWNoZWNrLiB1c2VyIGlzIG1vc3QtbGlrZWx5IHBhc3NpbmcgYW4gZXJyb3IgY29kZSwgYW5kIGl0IHdvdWxkCisgICAgICAgIC8vIFZhbGlkYXRpb24uIHVzZXIgaXMgbW9zdC1saWtlbHkgcGFzc2luZyBhbiBlcnJvciBjb2RlLCBhbmQgaXQgd291bGQKICAgICAgICAgLy8gbWFrZSB0aGUgcmV0dXJuIHZhbHVlIGFtYmlndW91cyAoYWN0dWFsU2l6ZSB2cyBlcnJvcikuCiAgICAgICAgIEFMT0dFKCIlcyglZCkgKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6dSkiLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CkBAIC0xMzMwLDcgKzEzMzEsNyBAQAogICAgICAgICBtQ2JmKEVWRU5UX01PUkVfREFUQSwgbVVzZXJEYXRhLCAmYXVkaW9CdWZmZXIpOwogICAgICAgICBzaXplX3QgcmVhZFNpemUgPSBhdWRpb0J1ZmZlci5zaXplOwogCi0gICAgICAgIC8vIFNhbml0eSBjaGVjayBvbiByZXR1cm5lZCBzaXplCisgICAgICAgIC8vIFZhbGlkYXRlIG9uIHJldHVybmVkIHNpemUKICAgICAgICAgaWYgKHNzaXplX3QocmVhZFNpemUpIDwgMCB8fCByZWFkU2l6ZSA+IHJlcVNpemUpIHsKICAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6ICBFVkVOVF9NT1JFX0RBVEEgcmVxdWVzdGVkICV6dSBieXRlcyBidXQgY2FsbGJhY2sgcmV0dXJuZWQgJXpkIGJ5dGVzIiwKICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHJlcVNpemUsIHNzaXplX3QocmVhZFNpemUpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAppbmRleCBlMjZhODMxLi5lZGIwODg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCkBAIC01ODIsNyArNTgyLDggQEAKICAgICAgICAgY2FzZSBBVURJT19JTlBVVF9DT05GSUdfQ0hBTkdFRDogewogICAgICAgICAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IG9sZERlc2MgPSBnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgICAgICBpZiAob2xkRGVzYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImlvQ29uZmlnQ2hhbmdlZCgpIG1vZGlmeWluZyB1bmtub3duIG91dHB1dCEgJWQiLCBpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgQUxPR1coImlvQ29uZmlnQ2hhbmdlZCgpIG1vZGlmeWluZyB1bmtub3duICVzISAlZCIsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCA/ICJvdXRwdXQiIDogImlucHV0IiwgaW9EZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xMzYyLDcgKzEzNjMsNyBAQAogICAgIHJldHVybiBhcHMtPnJlZ2lzdGVyUG9saWN5TWl4ZXMobWl4ZXMsIHJlZ2lzdHJhdGlvbik7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CkBAIC0xMzc2LDcgKzEzNzcsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwpAQCAtMTYwMywzMyArMTYwNCw4OCBAQAogICAgIHJldHVybiBhcHMtPmlzQ2FsbFNjcmVlbk1vZGVTdXBwb3J0ZWQoKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9Ci0gICAgcmV0dXJuIGFwcy0+c2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGRldmljZSk7CisgICAgcmV0dXJuIGFwcy0+c2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneShzdHJhdGVneSwgcm9sZSwgZGV2aWNlcyk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpyZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6cmVtb3ZlRGV2aWNlc1JvbGVGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksIGRldmljZV9yb2xlX3Qgcm9sZSkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQotICAgIHJldHVybiBhcHMtPnJlbW92ZVByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKKyAgICByZXR1cm4gYXBzLT5yZW1vdmVEZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCByb2xlKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKQorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQotICAgIHJldHVybiBhcHMtPmdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBkZXZpY2UpOworICAgIHJldHVybiBhcHMtPmdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3koc3RyYXRlZ3ksIHJvbGUsIGRldmljZXMpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYXBzLT5zZXREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6YWRkRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYXBzLT5hZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6cmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGFwcy0+cmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBhcHMtPmNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGFwcy0+Z2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKTsKIH0KIAogY2xhc3MgQ2FwdHVyZVN0YXRlTGlzdGVuZXJJbXBsIDogcHVibGljIG1lZGlhOjpCbkNhcHR1cmVTdGF0ZUxpc3RlbmVyLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcAppbmRleCA2OGQxMWQ0Li5lMzdjYzEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcApAQCAtMjI3LDcgKzIyNyw3IEBACiB7CiAgICAgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV047CiAgICAgbUF0dHJpYnV0ZXMudXNhZ2UgPSBBVURJT19VU0FHRV9VTktOT1dOOwotICAgIG1BdHRyaWJ1dGVzLmZsYWdzID0gMHgwOworICAgIG1BdHRyaWJ1dGVzLmZsYWdzID0gQVVESU9fRkxBR19OT05FOwogICAgIHN0cmNweShtQXR0cmlidXRlcy50YWdzLCAiIik7CiB9CiAKQEAgLTQ2Nyw3ICs0NjcsNyBAQAogICAgIGlmIChmb3JtYXQgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gQVVESU9fRk9STUFUX0lFQzYxOTM3KSB7IC8vIEhETUkgcGFzcy10aHJvdWdoPwotICAgICAgICBtQXR0cmlidXRlcy5mbGFncyB8PSBBVURJT19PVVRQVVRfRkxBR19JRUM5NThfTk9OQVVESU87CisgICAgICAgIGZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSUVDOTU4X05PTkFVRElPKTsKICAgICB9CiAKICAgICAvLyB2YWxpZGF0ZSBwYXJhbWV0ZXJzCkBAIC02NDQsNiArNjQ0LDM2IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAorCitzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXQoCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBjYWxsYmFja190IGNiZiwKKyAgICAgICAgdm9pZCogdXNlciwKKyAgICAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCisgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEsCisgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlLAorICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8sCisgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzLAorICAgICAgICBib29sIGRvTm90UmVjb25uZWN0LAorICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkLAorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQpCit7CisgICAgcmV0dXJuIHNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oY2hhbm5lbE1hc2spLAorICAgICAgICAgICAgZnJhbWVDb3VudCwgZmxhZ3MsIGNiZiwgdXNlciwgbm90aWZpY2F0aW9uRnJhbWVzLCBzaGFyZWRCdWZmZXIsCisgICAgICAgICAgICB0aHJlYWRDYW5DYWxsSmF2YSwgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIG9mZmxvYWRJbmZvLCB1aWQsIHBpZCwKKyAgICAgICAgICAgIHBBdHRyaWJ1dGVzLCBkb05vdFJlY29ubmVjdCwgbWF4UmVxdWlyZWRTcGVlZCwgc2VsZWN0ZWREZXZpY2VJZCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c3RhcnQoKQpAQCAtMTA0NSw2ICsxMDc1LDQwIEBACiAgICAgcmV0dXJuIG1PcmlnaW5hbFNhbXBsZVJhdGU7CiB9CiAKK3N0YXR1c190IEF1ZGlvVHJhY2s6OnNldER1YWxNb25vTW9kZShhdWRpb19kdWFsX21vbm9fbW9kZV90IG1vZGUpCit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHJldHVybiBzZXREdWFsTW9ub01vZGVfbChtb2RlKTsKK30KKworc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0RHVhbE1vbm9Nb2RlX2woYXVkaW9fZHVhbF9tb25vX21vZGVfdCBtb2RlKQoreworICAgIHJldHVybiBtQXVkaW9UcmFjay0+c2V0RHVhbE1vbm9Nb2RlKG1vZGUpOworfQorCitzdGF0dXNfdCBBdWRpb1RyYWNrOjpnZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCogbW9kZSkgY29uc3QKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1RyYWNrLT5nZXREdWFsTW9ub01vZGUobW9kZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvVHJhY2s6OnNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCBsZXZlbGRCKQoreworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gc2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsX2wobGV2ZWxkQik7Cit9CisKK3N0YXR1c190IEF1ZGlvVHJhY2s6OnNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbF9sKGZsb2F0IGxldmVsZEIpCit7CisgICAgcmV0dXJuIG1BdWRpb1RyYWNrLT5zZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwobGV2ZWxkQik7Cit9CisKK3N0YXR1c190IEF1ZGlvVHJhY2s6OmdldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCogbGV2ZWxkQikgY29uc3QKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1RyYWNrLT5nZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwobGV2ZWxkQik7Cit9CisKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKQEAgLTEwNTIsNyArMTExNiwxMSBAQAogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1RyYWNrLT5zZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKHBsYXliYWNrUmF0ZSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1QbGF5YmFja1JhdGUgPSBwbGF5YmFja1JhdGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTExNyw5ICsxMTg1LDE2IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1jb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgQXVkaW9UcmFjazo6Z2V0UGxheWJhY2tSYXRlKCkgY29uc3QKK2NvbnN0IEF1ZGlvUGxheWJhY2tSYXRlJiBBdWRpb1RyYWNrOjpnZXRQbGF5YmFja1JhdGUoKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkpIHsKKyAgICAgICAgYXVkaW9fcGxheWJhY2tfcmF0ZV90IHBsYXliYWNrUmF0ZVRlbXA7CisgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1RyYWNrLT5nZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKCZwbGF5YmFja1JhdGVUZW1wKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeyAvLyB1cGRhdGUgbG9jYWwgdmVyc2lvbiBpZiBjaGFuZ2VkLgorICAgICAgICAgICAgbVBsYXliYWNrUmF0ZSA9IHBsYXliYWNrUmF0ZVRlbXA7CisgICAgICAgIH0KKyAgICB9CiAgICAgcmV0dXJuIG1QbGF5YmFja1JhdGU7CiB9CiAKQEAgLTExNzQsNiArMTI0OSw0NiBAQAogICAgIHJldHVybiBmaW5hbEJ1ZmZlclNpemU7CiB9CiAKK3NzaXplX3QgQXVkaW9UcmFjazo6Z2V0U3RhcnRUaHJlc2hvbGRJbkZyYW1lcygpIGNvbnN0Cit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIGlmIChtT3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FIHx8IG1Qcm94eS5nZXQoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gKHNzaXplX3QpIG1Qcm94eS0+Z2V0U3RhcnRUaHJlc2hvbGRJbkZyYW1lcygpOworfQorCitzc2l6ZV90IEF1ZGlvVHJhY2s6OnNldFN0YXJ0VGhyZXNob2xkSW5GcmFtZXMoc2l6ZV90IHN0YXJ0VGhyZXNob2xkSW5GcmFtZXMpCit7CisgICAgaWYgKHN0YXJ0VGhyZXNob2xkSW5GcmFtZXMgPiBJTlQzMl9NQVggfHwgc3RhcnRUaHJlc2hvbGRJbkZyYW1lcyA9PSAwKSB7CisgICAgICAgIC8vIGNvbnRyYWN0dWFsbHkgd2UgY291bGQgc2ltcGx5IHJldHVybiB0aGUgY3VycmVudCB0aHJlc2hvbGQgaW4gZnJhbWVzCisgICAgICAgIC8vIHRvIGluZGljYXRlIHRoZSByZXF1ZXN0IHdhcyBpZ25vcmVkLCBidXQgd2UgcmV0dXJuIGFuIGVycm9yIGhlcmUuCisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAvLyBXZSBkbyBub3QgcGVybWl0IGNhbGxpbmcgc2V0U3RhcnRUaHJlc2hvbGRJbkZyYW1lcygpIGJldHdlZW4gdGhlIEF1ZGlvVHJhY2sKKyAgICAvLyBkZWZhdWx0IGN0b3IgQXVkaW9UcmFjaygpIGFuZCBzZXQoLi4uKSBidXQgcmF0aGVyIGZhaWwgc3VjaCBhbiBhdHRlbXB0LgorICAgIC8vIChUbyBkbyBzbyB3b3VsZCByZXF1aXJlIGEgY2FjaGVkIG1PcmlnU3RhcnRUaHJlc2hvbGRJbkZyYW1lcyBhbmQgd2UgbWF5CisgICAgLy8gbm90IGhhdmUgcHJvcGVyIHZhbGlkYXRpb24gZm9yIHRoZSBhY3R1YWwgc2V0IHZhbHVlKS4KKyAgICBpZiAobU91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSB8fCBtUHJveHkuZ2V0KCkgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgY29uc3QgdWludDMyX3Qgb3JpZ2luYWwgPSBtUHJveHktPmdldFN0YXJ0VGhyZXNob2xkSW5GcmFtZXMoKTsKKyAgICBjb25zdCB1aW50MzJfdCBmaW5hbCA9IG1Qcm94eS0+c2V0U3RhcnRUaHJlc2hvbGRJbkZyYW1lcyhzdGFydFRocmVzaG9sZEluRnJhbWVzKTsKKyAgICBpZiAob3JpZ2luYWwgIT0gZmluYWwpIHsKKyAgICAgICAgYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpMb2dJdGVtKG1NZXRyaWNzSWQpCisgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9TRVRTVEFSVFRIUkVTSE9MRCkKKyAgICAgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFSVFRIUkVTSE9MREZSQU1FUywgKGludDMyX3QpZmluYWwpCisgICAgICAgICAgICAgICAgLnJlY29yZCgpOworICAgICAgICBpZiAob3JpZ2luYWwgPiBmaW5hbCkgeworICAgICAgICAgICAgLy8gcmVzdGFydCB0cmFjayBpZiBpdCB3YXMgZGlzYWJsZWQgYnkgYXVkaW9mbGluZ2VyIGR1ZSB0byBwcmV2aW91cyB1bmRlcnJ1bgorICAgICAgICAgICAgLy8gYW5kIHdlIHJlZHVjZWQgdGhlIG51bWJlciBvZiBmcmFtZXMgZm9yIHRoZSB0aHJlc2hvbGQuCisgICAgICAgICAgICByZXN0YXJ0SWZEaXNhYmxlZCgpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmaW5hbDsKK30KKwogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0TG9vcCh1aW50MzJfdCBsb29wU3RhcnQsIHVpbnQzMl90IGxvb3BFbmQsIGludCBsb29wQ291bnQpCiB7CiAgICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCB8fCBpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKQEAgLTE3MTUsNiArMTgzMCwxMyBAQAogICAgIG1Qcm94eS0+c2V0UGxheWJhY2tSYXRlKHBsYXliYWNrUmF0ZVRlbXApOwogICAgIG1Qcm94eS0+c2V0TWluaW11bShtTm90aWZpY2F0aW9uRnJhbWVzQWN0KTsKIAorICAgIGlmIChtRHVhbE1vbm9Nb2RlICE9IEFVRElPX0RVQUxfTU9OT19NT0RFX09GRikgeworICAgICAgICBzZXREdWFsTW9ub01vZGVfbChtRHVhbE1vbm9Nb2RlKTsKKyAgICB9CisgICAgaWYgKG1BdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWxkQiAhPSAtc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCkpIHsKKyAgICAgICAgc2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsX2wobUF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbGRCKTsKKyAgICB9CisKICAgICBtRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKHRoaXMpOwogICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1BdWRpb1RyYWNrKS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwogCkBAIC0xOTQ2LDcgKzIwNjgsNyBAQAogICAgIH0KIAogICAgIGlmIChzc2l6ZV90KHVzZXJTaXplKSA8IDAgfHwgKGJ1ZmZlciA9PSBOVUxMICYmIHVzZXJTaXplICE9IDApKSB7Ci0gICAgICAgIC8vIFNhbml0eS1jaGVjazogdXNlciBpcyBtb3N0LWxpa2VseSBwYXNzaW5nIGFuIGVycm9yIGNvZGUsIGFuZCBpdCB3b3VsZAorICAgICAgICAvLyBWYWxpZGF0aW9uOiB1c2VyIGlzIG1vc3QtbGlrZWx5IHBhc3NpbmcgYW4gZXJyb3IgY29kZSwgYW5kIGl0IHdvdWxkCiAgICAgICAgIC8vIG1ha2UgdGhlIHJldHVybiB2YWx1ZSBhbWJpZ3VvdXMgKGFjdHVhbFNpemUgdnMgZXJyb3IpLgogICAgICAgICBBTE9HRSgiJXMoJWQpOiBBdWRpb1RyYWNrOjp3cml0ZShidWZmZXI9JXAsIHNpemU9JXp1ICglemQpIiwKICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgYnVmZmVyLCB1c2VyU2l6ZSwgdXNlclNpemUpOwpAQCAtMjMzNiw3ICsyNDU4LDcgQEAKICAgICAgICAgICAgICAgICBtVXNlckRhdGEsICZhdWRpb0J1ZmZlcik7CiAgICAgICAgIHNpemVfdCB3cml0dGVuU2l6ZSA9IGF1ZGlvQnVmZmVyLnNpemU7CiAKLSAgICAgICAgLy8gU2FuaXR5IGNoZWNrIG9uIHJldHVybmVkIHNpemUKKyAgICAgICAgLy8gVmFsaWRhdGUgb24gcmV0dXJuZWQgc2l6ZQogICAgICAgICBpZiAoc3NpemVfdCh3cml0dGVuU2l6ZSkgPCAwIHx8IHdyaXR0ZW5TaXplID4gcmVxU2l6ZSkgewogICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCiAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCByZXFTaXplLCBzc2l6ZV90KHdyaXR0ZW5TaXplKSk7CkBAIC0yNDgwLDYgKzI2MDIsMTAgQEAKICAgICAgICAgc3RhdGljUG9zaXRpb24gPSBtU3RhdGljUHJveHktPmdldFBvc2l0aW9uKCkudW5zaWduZWRWYWx1ZSgpOwogICAgIH0KIAorICAgIC8vIHNhdmUgdGhlIG9sZCBzdGFydFRocmVzaG9sZCBhbmQgZnJhbWVjb3VudAorICAgIGNvbnN0IHVpbnQzMl90IG9yaWdpbmFsU3RhcnRUaHJlc2hvbGRJbkZyYW1lcyA9IG1Qcm94eS0+Z2V0U3RhcnRUaHJlc2hvbGRJbkZyYW1lcygpOworICAgIGNvbnN0IHVpbnQzMl90IG9yaWdpbmFsRnJhbWVDb3VudCA9IG1Qcm94eS0+ZnJhbWVDb3VudCgpOworCiAgICAgLy8gU2VlIGIvNzQ0MDkyNjcuIENvbm5lY3RpbmcgdG8gYSBCVCBBMkRQIGRldmljZSBzdXBwb3J0aW5nIG11bHRpcGxlIGNvZGVjcwogICAgIC8vIGNhdXNlcyBhIGxvdCBvZiBjaHVybiBvbiB0aGUgc2VydmljZSBzaWRlLCBhbmQgaXQgY2FuIHJlamVjdCBzdGFydGluZwogICAgIC8vIHBsYXliYWNrIG9mIGEgcHJldmlvdXNseSBjcmVhdGVkIHRyYWNrLiBNYXkgYWxzbyBhcHBseSB0byBvdGhlciBjYXNlcy4KQEAgLTI1MzQsNiArMjY2MCwxOCBAQAogICAgICAgICAgICAgcmV0dXJuIG1BdWRpb1RyYWNrLT5hcHBseVZvbHVtZVNoYXBlcihzaGFwZXIubUNvbmZpZ3VyYXRpb24sIG9wZXJhdGlvblRvRW5kKTsKICAgICAgICAgfSk7CiAKKyAgICAgICAgLy8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgc3RhcnQgdGhyZXNob2xkIGlmIGRpZmZlcmVudCB0aGFuIGZyYW1lQ291bnQuCisgICAgICAgIGlmIChvcmlnaW5hbFN0YXJ0VGhyZXNob2xkSW5GcmFtZXMgIT0gb3JpZ2luYWxGcmFtZUNvdW50KSB7CisgICAgICAgICAgICAvLyBOb3RlOiBtUHJveHktPnNldFN0YXJ0VGhyZXNob2xkSW5GcmFtZXMoKSBjYWxsIGlzIGluIHRoZSBQcm94eQorICAgICAgICAgICAgLy8gYW5kIGRvZXMgbm90IHRyaWdnZXIgYSByZXN0YXJ0LgorICAgICAgICAgICAgLy8gKEFsc28gQ0JMS19ESVNBQkxFRCBpcyBub3Qgc2V0LCBidWZmZXJzIGFyZSBlbXB0eSBhZnRlciB0cmFjayByZWNyZWF0aW9uKS4KKyAgICAgICAgICAgIC8vIEFueSBzdGFydCB3b3VsZCBiZSB0cmlnZ2VyZWQgb24gdGhlIG1TdGF0ZSA9PSBBQ1RJVkUgY2hlY2sgYmVsb3cuCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjdXJyZW50VGhyZXNob2xkID0KKyAgICAgICAgICAgICAgICAgICAgbVByb3h5LT5zZXRTdGFydFRocmVzaG9sZEluRnJhbWVzKG9yaWdpbmFsU3RhcnRUaHJlc2hvbGRJbkZyYW1lcyk7CisgICAgICAgICAgICBBTE9HRF9JRihvcmlnaW5hbFN0YXJ0VGhyZXNob2xkSW5GcmFtZXMgIT0gY3VycmVudFRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgIiVzKCVkKSBzdGFydFRocmVzaG9sZEluRnJhbWVzIGNoYW5naW5nIGZyb20gJXUgdG8gJXUiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgb3JpZ2luYWxTdGFydFRocmVzaG9sZEluRnJhbWVzLCBjdXJyZW50VGhyZXNob2xkKTsKKyAgICAgICAgfQogICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FDVElWRSkgewogICAgICAgICAgICAgcmVzdWx0ID0gbUF1ZGlvVHJhY2stPnN0YXJ0KCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKaW5kZXggZjFmOGY5Yy4uMzU3MTliZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9UcmFja1NoYXJlZCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGF0b21pYz4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0zMyw2ICszNCwyMSBAQAogICAgIHJldHVybiBzaXplb2YoVCkgPiBzaXplb2Yoc2l6ZV90KSAmJiB4ID4gKFQpIFNJWkVfTUFYID8gU0laRV9NQVggOiB4IDwgMCA/IDAgOiAoc2l6ZV90KSB4OwogfQogCisvLyBjb21waWxlLXRpbWUgc2FmZSBhdG9taWNzLiBUT0RPOiB1cGRhdGUgYWxsIG1ldGhvZHMgdG8gdXNlIGl0Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgYW5kcm9pZF9hdG9taWNfbG9hZChjb25zdCB2b2xhdGlsZSBUKiBhZGRyKSB7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoVCkgPT0gc2l6ZW9mKHN0ZDo6YXRvbWljPFQ+KSk7IC8vIG5vIGV4dHJhIHN5bmMgZGF0YSByZXF1aXJlZC4KKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6YXRvbWljPFQ+Ojppc19hbHdheXNfbG9ja19mcmVlKTsgLy8gbm8gaGFzaCBsb2NrIHNvbWV3aGVyZS4KKyAgICByZXR1cm4gYXRvbWljX2xvYWQoKHN0ZDo6YXRvbWljPFQ+KilhZGRyKTsgICAgICAgICAgLy8gbWVtb3J5X29yZGVyX3NlcV9jc3QKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIGFuZHJvaWRfYXRvbWljX3N0b3JlKGNvbnN0IHZvbGF0aWxlIFQqIGFkZHIsIFQgdmFsdWUpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihUKSA9PSBzaXplb2Yoc3RkOjphdG9taWM8VD4pKTsgLy8gbm8gZXh0cmEgc3luYyBkYXRhIHJlcXVpcmVkLgorICAgIHN0YXRpY19hc3NlcnQoc3RkOjphdG9taWM8VD46OmlzX2Fsd2F5c19sb2NrX2ZyZWUpOyAvLyBubyBoYXNoIGxvY2sgc29tZXdoZXJlLgorICAgIGF0b21pY19zdG9yZSgoc3RkOjphdG9taWM8VD4qKWFkZHIsIHZhbHVlKTsgICAgICAgICAvLyBtZW1vcnlfb3JkZXJfc2VxX2NzdAorfQorCiAvLyBpbmNyZW1lbnRTZXF1ZW5jZSBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgbmV4dCBzZXF1ZW5jZSB2YWx1ZQogLy8gZm9yIHRoZSBsb29wIGFuZCBwb3NpdGlvbiBzZXF1ZW5jZSBjb3VudGVycy4gIEl0IHNob3VsZCByZXR1cm4KIC8vIGEgdmFsdWUgYmV0d2VlbiAib3RoZXIiICsgMSBhbmQgIm90aGVyIiArIElOVDMyX01BWCwgdGhlIGNob2ljZSBvZgpAQCAtNTEsNiArNjcsNyBAQAogICAgIDogbVNlcnZlcigwKSwgbUZ1dGV4KDApLCBtTWluaW11bSgwKQogICAgICwgbVZvbHVtZUxSKEdBSU5fTUlOSUZMT0FUX1BBQ0tFRF9VTklUWSksIG1TYW1wbGVSYXRlKDApLCBtU2VuZExldmVsKDApCiAgICAgLCBtQnVmZmVyU2l6ZUluRnJhbWVzKDApCisgICAgLCBtU3RhcnRUaHJlc2hvbGRJbkZyYW1lcygwKSAvLyBmaWxsZWQgaW4gYnkgdGhlIHNlcnZlci4KICAgICAsIG1GbGFncygwKQogewogICAgIG1lbXNldCgmdSwgMCwgc2l6ZW9mKHUpKTsKQEAgLTY2LDYgKzgzLDI2IEBACiB7CiB9CiAKK3VpbnQzMl90IFByb3h5OjpnZXRTdGFydFRocmVzaG9sZEluRnJhbWVzKCkgY29uc3QKK3sKKyAgICBjb25zdCB1aW50MzJfdCBzdGFydFRocmVzaG9sZEluRnJhbWVzID0KKyAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfbG9hZCgmbUNibGstPm1TdGFydFRocmVzaG9sZEluRnJhbWVzKTsKKyAgICBpZiAoc3RhcnRUaHJlc2hvbGRJbkZyYW1lcyA9PSAwIHx8IHN0YXJ0VGhyZXNob2xkSW5GcmFtZXMgPiBtRnJhbWVDb3VudCkgeworICAgICAgICBBTE9HRCgiJXM6IHN0YXJ0VGhyZXNob2xkSW5GcmFtZXMgJXUgbm90IGJldHdlZW4gMSBhbmQgZnJhbWVDb3VudCAlenUsICIKKyAgICAgICAgICAgICAgICAic2V0dGluZyB0byBmcmFtZUNvdW50IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RhcnRUaHJlc2hvbGRJbkZyYW1lcywgbUZyYW1lQ291bnQpOworICAgICAgICByZXR1cm4gbUZyYW1lQ291bnQ7CisgICAgfQorICAgIHJldHVybiBzdGFydFRocmVzaG9sZEluRnJhbWVzOworfQorCit1aW50MzJfdCBQcm94eTo6c2V0U3RhcnRUaHJlc2hvbGRJbkZyYW1lcyh1aW50MzJfdCBzdGFydFRocmVzaG9sZEluRnJhbWVzKQoreworICAgIGNvbnN0IHVpbnQzMl90IGFjdHVhbCA9IHN0ZDo6bWluKChzaXplX3Qpc3RhcnRUaHJlc2hvbGRJbkZyYW1lcywgZnJhbWVDb3VudCgpKTsKKyAgICBhbmRyb2lkX2F0b21pY19zdG9yZSgmbUNibGstPm1TdGFydFRocmVzaG9sZEluRnJhbWVzLCBhY3R1YWwpOworICAgIHJldHVybiBhY3R1YWw7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBDbGllbnRQcm94eTo6Q2xpZW50UHJveHkoYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrLCB2b2lkICpidWZmZXJzLCBzaXplX3QgZnJhbWVDb3VudCwKQEAgLTY2Myw2ICs3MDAsNyBAQAogICAgICwgbVRpbWVzdGFtcE11dGF0b3IoJmNibGstPm1FeHRlbmRlZFRpbWVzdGFtcFF1ZXVlKQogewogICAgIGNibGstPm1CdWZmZXJTaXplSW5GcmFtZXMgPSBmcmFtZUNvdW50OworICAgIGNibGstPm1TdGFydFRocmVzaG9sZEluRnJhbWVzID0gZnJhbWVDb3VudDsKIH0KIAogX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCkBAIC05MDAsMTEgKzkzOCw4IEBACiAgICAgfQogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IG1DYmxrOwogCi0gICAgaW50MzJfdCBmbHVzaCA9IGNibGstPnUubVN0cmVhbWluZy5tRmx1c2g7Ci0gICAgaWYgKGZsdXNoICE9IG1GbHVzaCkgewotICAgICAgICAvLyBGSVhNRSBzaG91bGQgcmV0dXJuIGFuIGFjY3VyYXRlIHZhbHVlLCBidXQgb3Zlci1lc3RpbWF0ZSBpcyBiZXR0ZXIgdGhhbiB1bmRlci1lc3RpbWF0ZQotICAgICAgICByZXR1cm4gbUZyYW1lQ291bnQ7Ci0gICAgfQorICAgIGZsdXNoQnVmZmVySWZOZWVkZWQoKTsKKwogICAgIGNvbnN0IGludDMyX3QgcmVhciA9IGdldFJlYXIoKTsKICAgICBzc2l6ZV90IGZpbGxlZCA9IGF1ZGlvX3V0aWxzOjpzYWZlX3N1Yl9vdmVyZmxvdyhyZWFyLCBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250KTsKICAgICAvLyBwaXBlIHNob3VsZCBub3QgYWxyZWFkeSBiZSBvdmVyZnVsbApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvRmxpbmdlci5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcAppbmRleCBkM2EwMzdjLi4wOGYzMDdkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcApAQCAtMTAwMiw3ICsxMDAyLDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIC8vIFdoaXRlbGlzdCBvZiByZWxldmFudCBldmVudHMgdG8gdHJpZ2dlciBsb2cgbWVyZ2luZy4KKyAgICAvLyBMaXN0IG9mIHJlbGV2YW50IGV2ZW50cyB0aGF0IHRyaWdnZXIgbG9nIG1lcmdpbmcuCiAgICAgLy8gTG9nIG1lcmdpbmcgc2hvdWxkIGFjdGl2YXRlIGR1cmluZyBhdWRpbyBhY3Rpdml0eSBvZiBhbnkga2luZC4gVGhpcyBhcmUgY29uc2lkZXJlZCB0aGUKICAgICAvLyBtb3N0IHJlbGV2YW50IGV2ZW50cy4KICAgICAvLyBUT0RPIHNob3VsZCBzZWxlY3QgbW9yZSB3aXNlbHkgdGhlIGl0ZW1zIGZyb20gdGhlIGxpc3QKQEAgLTEyMTEsNyArMTIxMSw3IEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KCBnZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaykgKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggNDNhNTM2OS4uODFmOWRmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTExMywxMyArMTEzLDE4IEBACiAgICAgTU9WRV9FRkZFQ1RTX1RPX0lPLAogICAgIFNFVF9SVFRfRU5BQkxFRCwKICAgICBJU19DQUxMX1NDUkVFTl9NT0RFX1NVUFBPUlRFRCwKLSAgICBTRVRfUFJFRkVSUkVEX0RFVklDRV9GT1JfUFJPRFVDVF9TVFJBVEVHWSwKLSAgICBSRU1PVkVfUFJFRkVSUkVEX0RFVklDRV9GT1JfUFJPRFVDVF9TVFJBVEVHWSwKLSAgICBHRVRfUFJFRkVSUkVEX0RFVklDRV9GT1JfUFJPRFVDVF9TVFJBVEVHWSwKKyAgICBTRVRfREVWSUNFU19ST0xFX0ZPUl9QUk9EVUNUX1NUUkFURUdZLAorICAgIFJFTU9WRV9ERVZJQ0VTX1JPTEVfRk9SX1BST0RVQ1RfU1RSQVRFR1ksCisgICAgR0VUX0RFVklDRVNfRk9SX1JPTEVfQU5EX1BST0RVQ1RfU1RSQVRFR1ksCiAgICAgR0VUX0RFVklDRVNfRk9SX0FUVFJJQlVURVMsCiAgICAgQVVESU9fTU9EVUxFU19VUERBVEVELCAgLy8gb25ld2F5CiAgICAgU0VUX0NVUlJFTlRfSU1FX1VJRCwKICAgICBSRUdJU1RFUl9TT1VORFRSSUdHRVJfQ0FQVFVSRV9TVEFURV9MSVNURU5FUiwKKyAgICBTRVRfREVWSUNFU19ST0xFX0ZPUl9DQVBUVVJFX1BSRVNFVCwKKyAgICBBRERfREVWSUNFU19ST0xFX0ZPUl9DQVBUVVJFX1BSRVNFVCwKKyAgICBSRU1PVkVfREVWSUNFU19ST0xFX0ZPUl9DQVBUVVJFX1BSRVNFVCwKKyAgICBDTEVBUl9ERVZJQ0VTX1JPTEVfRk9SX0NBUFRVUkVfUFJFU0VULAorICAgIEdFVF9ERVZJQ0VTX0ZPUl9ST0xFX0FORF9DQVBUVVJFX1BSRVNFVCwKIH07CiAKICNkZWZpbmUgTUFYX0lURU1TX1BFUl9MSVNUIDEwMjQKQEAgLTExNzQsMzEgKzExNzksMTggQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRCb29sKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogCiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgdWlkKTsKLSAgICAgICAgc2l6ZV90IHNpemUgPSBkZXZpY2VzLnNpemUoKTsKLSAgICAgICAgc2l6ZV90IHNpemVQb3NpdGlvbiA9IGRhdGEuZGF0YVBvc2l0aW9uKCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc2l6ZSk7Ci0gICAgICAgIHNpemVfdCBmaW5hbFNpemUgPSBzaXplOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gZGF0YS5kYXRhUG9zaXRpb24oKTsKLSAgICAgICAgICAgIGlmIChkZXZpY2VzW2ldLndyaXRlVG9QYXJjZWwoJmRhdGEpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgZGF0YS5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOwotICAgICAgICAgICAgICAgIGZpbmFsU2l6ZS0tOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzaXplICE9IGZpbmFsU2l6ZSkgewotICAgICAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gZGF0YS5kYXRhUG9zaXRpb24oKTsKLSAgICAgICAgICAgIGRhdGEuc2V0RGF0YVBvc2l0aW9uKHNpemVQb3NpdGlvbik7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoZmluYWxTaXplKTsKLSAgICAgICAgICAgIGRhdGEuc2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS53cml0ZVBhcmNlbGFibGVWZWN0b3IoZGV2aWNlcyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KIAotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1VJRF9ERVZJQ0VfQUZGSU5JVFksIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfVUlEX0RFVklDRV9BRkZJTklUWSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICB9CkBAIC0xMjE5LDUxICsxMjExLDM3IEBACiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkLAotICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykKLSAgICAgICAgewotICAgICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogCi0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHVzZXJJZCk7Ci0gICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGRldmljZXMuc2l6ZSgpOwotICAgICAgICAgICAgc2l6ZV90IHNpemVQb3NpdGlvbiA9IGRhdGEuZGF0YVBvc2l0aW9uKCk7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNpemUpOwotICAgICAgICAgICAgc2l6ZV90IGZpbmFsU2l6ZSA9IHNpemU7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IGRhdGEuZGF0YVBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZXNbaV0ud3JpdGVUb1BhcmNlbCgmZGF0YSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YS5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICBmaW5hbFNpemUtLTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2l6ZSAhPSBmaW5hbFNpemUpIHsKLSAgICAgICAgICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBkYXRhLmRhdGFQb3NpdGlvbigpOwotICAgICAgICAgICAgICAgIGRhdGEuc2V0RGF0YVBvc2l0aW9uKHNpemVQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGZpbmFsU2l6ZSk7Ci0gICAgICAgICAgICAgICAgZGF0YS5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1VTRVJJRF9ERVZJQ0VfQUZGSU5JVFksIGRhdGEsICZyZXBseSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgfQorICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHVzZXJJZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEud3JpdGVQYXJjZWxhYmxlVmVjdG9yKGRldmljZXMpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9CiAKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQpIHsKLSAgICAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotCi0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHVzZXJJZCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9Ci0gICAgICAgICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTU9WRV9VU0VSSURfREVWSUNFX0FGRklOSVRZLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCkgcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1VTRVJJRF9ERVZJQ0VfQUZGSU5JVFksIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSB1c2VySWQpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX1VTRVJJRF9ERVZJQ0VfQUZGSU5JVFksIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCkgcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKQogICAgIHsKQEAgLTEzODUsMTcgKzEzNjMsMzEgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRCb29sKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0cmF0ZWd5KSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZS53cml0ZVRvUGFyY2VsKCZkYXRhKTsKKyAgICAgICAgZGF0YS53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4ocm9sZSkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLndyaXRlUGFyY2VsYWJsZVZlY3RvcihkZXZpY2VzKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1BSRUZFUlJFRF9ERVZJQ0VfRk9SX1BST0RVQ1RfU1RSQVRFR1ksCisgICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfREVWSUNFU19ST0xFX0ZPUl9QUk9EVUNUX1NUUkFURUdZLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0YXR1c190PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVEZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgZGV2aWNlX3JvbGVfdCByb2xlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyYXRlZ3kpKTsKKyAgICAgICAgZGF0YS53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4ocm9sZSkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX0RFVklDRVNfUk9MRV9GT1JfUFJPRFVDVF9TVFJBVEVHWSwKICAgICAgICAgICAgICAgICBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CkBAIC0xNDAzLDMxICsxMzk1LDEwOCBAQAogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyYXRlZ3kpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTU9WRV9QUkVGRVJSRURfREVWSUNFX0ZPUl9QUk9EVUNUX1NUUkFURUdZLAotICAgICAgICAgICAgICAgIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0cmF0ZWd5KSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUFJFRkVSUkVEX0RFVklDRV9GT1JfUFJPRFVDVF9TVFJBVEVHWSwKKyAgICAgICAgZGF0YS53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4ocm9sZSkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0RFVklDRVNfRk9SX1JPTEVfQU5EX1BST0RVQ1RfU1RSQVRFR1ksCiAgICAgICAgICAgICAgICAgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSBkZXZpY2UucmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZFBhcmNlbGFibGVWZWN0b3IoJmRldmljZXMpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGF1ZGlvU291cmNlKSk7CisgICAgICAgIGRhdGEud3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJvbGUpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS53cml0ZVBhcmNlbGFibGVWZWN0b3IoZGV2aWNlcyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9ERVZJQ0VTX1JPTEVfRk9SX0NBUFRVUkVfUFJFU0VULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4oYXVkaW9Tb3VyY2UpKTsKKyAgICAgICAgZGF0YS53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4ocm9sZSkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLndyaXRlUGFyY2VsYWJsZVZlY3RvcihkZXZpY2VzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQUREX0RFVklDRVNfUk9MRV9GT1JfQ0FQVFVSRV9QUkVTRVQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCgKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLCBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4oYXVkaW9Tb3VyY2UpKTsKKyAgICAgICAgZGF0YS53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4ocm9sZSkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLndyaXRlUGFyY2VsYWJsZVZlY3RvcihkZXZpY2VzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX0RFVklDRVNfUk9MRV9GT1JfQ0FQVFVSRV9QUkVTRVQsCisgICAgICAgICAgICAgICAgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4oYXVkaW9Tb3VyY2UpKTsKKyAgICAgICAgZGF0YS53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4ocm9sZSkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQ0xFQVJfREVWSUNFU19ST0xFX0ZPUl9DQVBUVVJFX1BSRVNFVCwKKyAgICAgICAgICAgICAgICBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0YXR1c190PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PihhdWRpb1NvdXJjZSkpOworICAgICAgICBkYXRhLndyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90Pihyb2xlKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfREVWSUNFU19GT1JfUk9MRV9BTkRfQ0FQVFVSRV9QUkVTRVQsCisgICAgICAgICAgICAgICAgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkUGFyY2VsYWJsZVZlY3RvcigmZGV2aWNlcyk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KQEAgLTE1NjIsMTUgKzE2MzEsMjAgQEAKICAgICAgICAgY2FzZSBSRUxFQVNFX1NPVU5EVFJJR0dFUl9TRVNTSU9OOgogICAgICAgICBjYXNlIFNFVF9SVFRfRU5BQkxFRDoKICAgICAgICAgY2FzZSBJU19DQUxMX1NDUkVFTl9NT0RFX1NVUFBPUlRFRDoKLSAgICAgICAgY2FzZSBTRVRfUFJFRkVSUkVEX0RFVklDRV9GT1JfUFJPRFVDVF9TVFJBVEVHWToKKyAgICAgICAgY2FzZSBTRVRfREVWSUNFU19ST0xFX0ZPUl9QUk9EVUNUX1NUUkFURUdZOgogICAgICAgICBjYXNlIFNFVF9TVVBQT1JURURfU1lTVEVNX1VTQUdFUzoKLSAgICAgICAgY2FzZSBSRU1PVkVfUFJFRkVSUkVEX0RFVklDRV9GT1JfUFJPRFVDVF9TVFJBVEVHWToKLSAgICAgICAgY2FzZSBHRVRfUFJFRkVSUkVEX0RFVklDRV9GT1JfUFJPRFVDVF9TVFJBVEVHWToKKyAgICAgICAgY2FzZSBSRU1PVkVfREVWSUNFU19ST0xFX0ZPUl9QUk9EVUNUX1NUUkFURUdZOgorICAgICAgICBjYXNlIEdFVF9ERVZJQ0VTX0ZPUl9ST0xFX0FORF9QUk9EVUNUX1NUUkFURUdZOgogICAgICAgICBjYXNlIEdFVF9ERVZJQ0VTX0ZPUl9BVFRSSUJVVEVTOgogICAgICAgICBjYXNlIFNFVF9BTExPV0VEX0NBUFRVUkVfUE9MSUNZOgogICAgICAgICBjYXNlIEFVRElPX01PRFVMRVNfVVBEQVRFRDoKICAgICAgICAgY2FzZSBTRVRfQ1VSUkVOVF9JTUVfVUlEOgotICAgICAgICBjYXNlIFJFR0lTVEVSX1NPVU5EVFJJR0dFUl9DQVBUVVJFX1NUQVRFX0xJU1RFTkVSOiB7CisgICAgICAgIGNhc2UgUkVHSVNURVJfU09VTkRUUklHR0VSX0NBUFRVUkVfU1RBVEVfTElTVEVORVI6CisgICAgICAgIGNhc2UgU0VUX0RFVklDRVNfUk9MRV9GT1JfQ0FQVFVSRV9QUkVTRVQ6CisgICAgICAgIGNhc2UgQUREX0RFVklDRVNfUk9MRV9GT1JfQ0FQVFVSRV9QUkVTRVQ6CisgICAgICAgIGNhc2UgUkVNT1ZFX0RFVklDRVNfUk9MRV9GT1JfQ0FQVFVSRV9QUkVTRVQ6CisgICAgICAgIGNhc2UgQ0xFQVJfREVWSUNFU19ST0xFX0ZPUl9DQVBUVVJFX1BSRVNFVDoKKyAgICAgICAgY2FzZSBHRVRfREVWSUNFU19GT1JfUk9MRV9BTkRfQ0FQVFVSRV9QUkVTRVQ6IHsKICAgICAgICAgICAgIGlmICghaXNTZXJ2aWNlVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IHRyYW5zYWN0aW9uICVkIHJlY2VpdmVkIGZyb20gUElEICVkIHVuYXV0aG9yaXplZCBVSUQgJWQiLAogICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjb2RlLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCkBAIC0yNTIyLDE1ICsyNTk2LDEyIEBACiAgICAgICAgIGNhc2UgU0VUX1VJRF9ERVZJQ0VfQUZGSU5JVFk6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBjb25zdCB1aWRfdCB1aWQgPSAodWlkX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4gZGV2aWNlczsKLSAgICAgICAgICAgIHNpemVfdCBzaXplID0gKHNpemVfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyIGRldmljZTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlLnJlYWRGcm9tUGFyY2VsKChQYXJjZWwqKSZkYXRhKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZFBhcmNlbGFibGVWZWN0b3IoJmRldmljZXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZCwgZGV2aWNlcyk7CisgICAgICAgICAgICBzdGF0dXMgPSBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZCwgZGV2aWNlcyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CkBAIC0yNTQ2LDE1ICsyNjE3LDEyIEBACiAgICAgICAgIGNhc2UgU0VUX1VTRVJJRF9ERVZJQ0VfQUZGSU5JVFk6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBjb25zdCBpbnQgdXNlcklkID0gKGludCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiBkZXZpY2VzOwotICAgICAgICAgICAgc2l6ZV90IHNpemUgPSAoc2l6ZV90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgZGV2aWNlOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UucmVhZEZyb21QYXJjZWwoKFBhcmNlbCopJmRhdGEpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldmljZXMuYWRkKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkUGFyY2VsYWJsZVZlY3RvcigmZGV2aWNlcyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldFVzZXJJZERldmljZUFmZmluaXRpZXModXNlcklkLCBkZXZpY2VzKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHNldFVzZXJJZERldmljZUFmZmluaXRpZXModXNlcklkLCBkZXZpY2VzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KQEAgLTI2OTAsNyArMjc1OCw3IEBACiAgICAgICAgIGNhc2UgU0VUX0FMTE9XRURfQ0FQVFVSRV9QT0xJQ1k6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICB1aWRfdCB1aWQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fZmxhZ3NfbWFza190IGZsYWdzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX2ZsYWdzX21hc2tfdCBmbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX2ZsYWdzX21hc2tfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aWQsIGZsYWdzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC0yNzExLDMzICsyNzc5LDM2IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIFNFVF9QUkVGRVJSRURfREVWSUNFX0ZPUl9QUk9EVUNUX1NUUkFURUdZOiB7CisgICAgICAgIGNhc2UgU0VUX0RFVklDRVNfUk9MRV9GT1JfUFJPRFVDVF9TVFJBVEVHWTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSA9IChwcm9kdWN0X3N0cmF0ZWd5X3QpIGRhdGEucmVhZFVpbnQzMigpOwotICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciBkZXZpY2U7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2UucmVhZEZyb21QYXJjZWwoKFBhcmNlbCopJmRhdGEpOworICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlID0gKGRldmljZV9yb2xlX3QpIGRhdGEucmVhZFVpbnQzMigpOworICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkUGFyY2VsYWJsZVZlY3RvcigmZGV2aWNlcyk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1cyA9IHNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBkZXZpY2UpOworICAgICAgICAgICAgc3RhdHVzID0gc2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneShzdHJhdGVneSwgcm9sZSwgZGV2aWNlcyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBSRU1PVkVfUFJFRkVSUkVEX0RFVklDRV9GT1JfUFJPRFVDVF9TVFJBVEVHWTogeworICAgICAgICBjYXNlIFJFTU9WRV9ERVZJQ0VTX1JPTEVfRk9SX1BST0RVQ1RfU1RSQVRFR1k6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSAocHJvZHVjdF9zdHJhdGVneV90KSBkYXRhLnJlYWRVaW50MzIoKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW92ZVByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSA9IChkZXZpY2Vfcm9sZV90KSBkYXRhLnJlYWRVaW50MzIoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHJvbGUpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgR0VUX1BSRUZFUlJFRF9ERVZJQ0VfRk9SX1BST0RVQ1RfU1RSQVRFR1k6IHsKKyAgICAgICAgY2FzZSBHRVRfREVWSUNFU19GT1JfUk9MRV9BTkRfUFJPRFVDVF9TVFJBVEVHWTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSA9IChwcm9kdWN0X3N0cmF0ZWd5X3QpIGRhdGEucmVhZFVpbnQzMigpOwotICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciBkZXZpY2U7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZGV2aWNlKTsKLSAgICAgICAgICAgIHN0YXR1c190IG1hcnNoYWxsX3N0YXR1cyA9IGRldmljZS53cml0ZVRvUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSA9IChkZXZpY2Vfcm9sZV90KSBkYXRhLnJlYWRVaW50MzIoKTsKKyAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3koc3RyYXRlZ3ksIHJvbGUsIGRldmljZXMpOworICAgICAgICAgICAgc3RhdHVzX3QgbWFyc2hhbGxfc3RhdHVzID0gcmVwbHktPndyaXRlUGFyY2VsYWJsZVZlY3RvcihkZXZpY2VzKTsKICAgICAgICAgICAgIGlmIChtYXJzaGFsbF9zdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbWFyc2hhbGxfc3RhdHVzOwogICAgICAgICAgICAgfQpAQCAtMjgxOSw2ICsyODkwLDcxIEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKKyAgICAgICAgY2FzZSBTRVRfREVWSUNFU19ST0xFX0ZPUl9DQVBUVVJFX1BSRVNFVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBkYXRhLnJlYWRVaW50MzIoKTsKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSA9IChkZXZpY2Vfcm9sZV90KSBkYXRhLnJlYWRVaW50MzIoKTsKKyAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZFBhcmNlbGFibGVWZWN0b3IoJmRldmljZXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSBzZXREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQUREX0RFVklDRVNfUk9MRV9GT1JfQ0FQVFVSRV9QUkVTRVQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgZGF0YS5yZWFkVWludDMyKCk7CisgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUgPSAoZGV2aWNlX3JvbGVfdCkgZGF0YS5yZWFkVWludDMyKCk7CisgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIGRldmljZXM7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWRQYXJjZWxhYmxlVmVjdG9yKCZkZXZpY2VzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gYWRkRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFJFTU9WRV9ERVZJQ0VTX1JPTEVfRk9SX0NBUFRVUkVfUFJFU0VUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIGRhdGEucmVhZFVpbnQzMigpOworICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlID0gKGRldmljZV9yb2xlX3QpIGRhdGEucmVhZFVpbnQzMigpOworICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkUGFyY2VsYWJsZVZlY3RvcigmZGV2aWNlcyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IHJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBDTEVBUl9ERVZJQ0VTX1JPTEVfRk9SX0NBUFRVUkVfUFJFU0VUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIGRhdGEucmVhZFVpbnQzMigpOworICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlID0gKGRldmljZV9yb2xlX3QpIGRhdGEucmVhZFVpbnQzMigpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgR0VUX0RFVklDRVNfRk9SX1JPTEVfQU5EX0NBUFRVUkVfUFJFU0VUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIGRhdGEucmVhZFVpbnQzMigpOworICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlID0gKGRldmljZV9yb2xlX3QpIGRhdGEucmVhZFVpbnQzMigpOworICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKTsKKyAgICAgICAgICAgIHN0YXR1c190IG1hcnNoYWxsX3N0YXR1cyA9IHJlcGx5LT53cml0ZVBhcmNlbGFibGVWZWN0b3IoZGV2aWNlcyk7CisgICAgICAgICAgICBpZiAobWFyc2hhbGxfc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1hcnNoYWxsX3N0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9UcmFjay5jcHAKaW5kZXggNjIxOWU3YS4uNmZjZjMwMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1RyYWNrLmNwcApAQCAtNDQsNiArNDQsMTIgQEAKICAgICBTSUdOQUwsCiAgICAgQVBQTFlfVk9MVU1FX1NIQVBFUiwKICAgICBHRVRfVk9MVU1FX1NIQVBFUl9TVEFURSwKKyAgICBTRVRfRFVBTF9NT05PX01PREUsCisgICAgR0VUX0RVQUxfTU9OT19NT0RFLAorICAgIFNFVF9BVURJT19ERVNDUklQVElPTl9NSVhfTEVWRUwsCisgICAgR0VUX0FVRElPX0RFU0NSSVBUSU9OX01JWF9MRVZFTCwKKyAgICBTRVRfUExBWUJBQ0tfUkFURV9QQVJBTUVURVJTLAorICAgIEdFVF9QTEFZQkFDS19SQVRFX1BBUkFNRVRFUlMsCiB9OwogCiBjbGFzcyBCcEF1ZGlvVHJhY2sgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUF1ZGlvVHJhY2s+CkBAIC0yMDcsNiArMjEzLDkyIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgIH0KKworICAgIHN0YXR1c190IGdldER1YWxNb25vTW9kZShhdWRpb19kdWFsX21vbm9fbW9kZV90KiBtb2RlKSBvdmVycmlkZSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1RyYWNrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0RVQUxfTU9OT19NT0RFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICAqbW9kZSA9IChhdWRpb19kdWFsX21vbm9fbW9kZV90KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc2V0RHVhbE1vbm9Nb2RlKGF1ZGlvX2R1YWxfbW9ub19tb2RlX3QgbW9kZSkgb3ZlcnJpZGUgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW1vZGUpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0RVQUxfTU9OT19NT0RFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBnZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQqIGxldmVsZEIpIG92ZXJyaWRlIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvVHJhY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQVVESU9fREVTQ1JJUFRJT05fTUlYX0xFVkVMLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICAqbGV2ZWxkQiA9IHJlcGx5LnJlYWRGbG9hdCgpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0IGxldmVsZEIpIG92ZXJyaWRlIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvVHJhY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVGbG9hdChsZXZlbGRCKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BVURJT19ERVNDUklQVElPTl9NSVhfTEVWRUwsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKworICAgIHN0YXR1c190IGdldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoYXVkaW9fcGxheWJhY2tfcmF0ZV90KiBwbGF5YmFja1JhdGUpIG92ZXJyaWRlIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvVHJhY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUExBWUJBQ0tfUkFURV9QQVJBTUVURVJTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBwbGF5YmFja1JhdGUtPm1TcGVlZCA9IHJlcGx5LnJlYWRGbG9hdCgpOworICAgICAgICBwbGF5YmFja1JhdGUtPm1QaXRjaCA9IHJlcGx5LnJlYWRGbG9hdCgpOworICAgICAgICBwbGF5YmFja1JhdGUtPm1TdHJldGNoTW9kZSA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb190aW1lc3RyZXRjaF9zdHJldGNoX21vZGVfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICBwbGF5YmFja1JhdGUtPm1GYWxsYmFja01vZGUgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fdGltZXN0cmV0Y2hfZmFsbGJhY2tfbW9kZV90PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKGNvbnN0IGF1ZGlvX3BsYXliYWNrX3JhdGVfdCYgcGxheWJhY2tSYXRlKSBvdmVycmlkZSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1RyYWNrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlRmxvYXQocGxheWJhY2tSYXRlLm1TcGVlZCk7CisgICAgICAgIGRhdGEud3JpdGVGbG9hdChwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHBsYXliYWNrUmF0ZS5tU3RyZXRjaE1vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocGxheWJhY2tSYXRlLm1GYWxsYmFja01vZGUpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1BMQVlCQUNLX1JBVEVfUEFSQU1FVEVSUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEF1ZGlvVHJhY2ssICJhbmRyb2lkLm1lZGlhLklBdWRpb1RyYWNrIik7CkBAIC0zMDksNiArNDAxLDU5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgU0VUX0RVQUxfTU9OT19NT0RFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvVHJhY2ssIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBzZXREdWFsTW9ub01vZGUoKGF1ZGlvX2R1YWxfbW9ub19tb2RlX3QpZGF0YS5yZWFkSW50MzIoKSkgKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBHRVRfRFVBTF9NT05PX01PREU6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9UcmFjaywgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fZHVhbF9tb25vX21vZGVfdCBtb2RlOworICAgICAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0RHVhbE1vbm9Nb2RlKCZtb2RlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KXN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobW9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgU0VUX0FVRElPX0RFU0NSSVBUSU9OX01JWF9MRVZFTDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1RyYWNrLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggc2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGRhdGEucmVhZEZsb2F0KCkpICk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX0FVRElPX0RFU0NSSVBUSU9OX01JWF9MRVZFTDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1RyYWNrLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBmbG9hdCBmOworICAgICAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKCZmKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KXN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlRmxvYXQoZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgU0VUX1BMQVlCQUNLX1JBVEVfUEFSQU1FVEVSUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1RyYWNrLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19wbGF5YmFja19yYXRlX3QgcGxheWJhY2tSYXRlID0geworICAgICAgICAgICAgICAgIGRhdGEucmVhZEZsb2F0KCksCisgICAgICAgICAgICAgICAgZGF0YS5yZWFkRmxvYXQoKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb190aW1lc3RyZXRjaF9zdHJldGNoX21vZGVfdD4oZGF0YS5yZWFkSW50MzIoKSksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fdGltZXN0cmV0Y2hfZmFsbGJhY2tfbW9kZV90PihkYXRhLnJlYWRJbnQzMigpKX07CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggc2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycyhwbGF5YmFja1JhdGUpICk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX1BMQVlCQUNLX1JBVEVfUEFSQU1FVEVSUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1RyYWNrLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19wbGF5YmFja19yYXRlX3QgcGxheWJhY2tSYXRlOworICAgICAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycygmcGxheWJhY2tSYXRlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KXN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlRmxvYXQocGxheWJhY2tSYXRlLm1TcGVlZCk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlRmxvYXQocGxheWJhY2tSYXRlLm1QaXRjaCk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocGxheWJhY2tSYXRlLm1TdHJldGNoTW9kZSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocGxheWJhY2tSYXRlLm1GYWxsYmFja01vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9PV05FUlMgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9PV05FUlMKaW5kZXggNDgyYjlmYi4uMDM0ZDE2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvT1dORVJTCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L09XTkVSUwpAQCAtMSwzICsxLDQgQEAKIGdrYXN0ZW5AZ29vZ2xlLmNvbQoraHVuZ2FAZ29vZ2xlLmNvbQogam10cml2aUBnb29nbGUuY29tCiBtbmFnYW5vdkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKaW5kZXggMTljMmNiZC4uODQ4NzQzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaApAQCAtMzYxLDExICszNjEsMTEgQEAKIAogICAgIHN0YXRpYyBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzLCBib29sIHJlZ2lzdHJhdGlvbik7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcyk7CisgICAgc3RhdGljIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCk7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpOwogCiAgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZVVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCk7CiAKQEAgLTQyNSwxMyArNDI1LDI5IEBACiAgICAgICovCiAgICAgc3RhdGljIHN0YXR1c190IHNldEF1ZGlvSGFsUGlkcyhjb25zdCBzdGQ6OnZlY3RvcjxwaWRfdD4mIHBpZHMpOwogCi0gICAgc3RhdGljIHN0YXR1c190IHNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSk7CisgICAgc3RhdGljIHN0YXR1c190IHNldERldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKTsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpOworICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVEZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgZGV2aWNlX3JvbGVfdCByb2xlKTsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpOworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcyk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBhZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpOworCisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCgKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLCBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCgKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLCBkZXZpY2Vfcm9sZV90IHJvbGUpOworCisgICAgc3RhdGljIHN0YXR1c190IGdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcyk7CiAKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAogICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmgKaW5kZXggYTk5NDZkYS4uNGFmYTljOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmgKQEAgLTM0NCw2ICszNDQsMjcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCA9IDEuMGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CisgICAgLy8gRklYTUUoYi8xNjk4ODk3MTQpOiBWZW5kb3IgY29kZSBkZXBlbmRzIG9uIHRoZSBvbGQgbWV0aG9kIHNpZ25hdHVyZSBhdCBsaW5rIHRpbWUKKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmICAgICAgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgICAgICAgICAgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCA9IEFVRElPX1VJRF9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkID0gMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKIAogICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvVHJhY2suIFRoaXMgbXVzdCBiZSBjaGVja2VkIGZvciBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uCiAgICAgICogYmVmb3JlIHVzaW5nIGFueSBBdWRpb1RyYWNrIEFQSSAoZXhjZXB0IGZvciBzZXQoKSksIGJlY2F1c2UgdXNpbmcKQEAgLTQwOCw2ICs0MjksMTkgQEAKICAgICAgKi8KICAgICAgICAgICAgIHNzaXplX3QgICAgIHNldEJ1ZmZlclNpemVJbkZyYW1lcyhzaXplX3Qgc2l6ZSk7CiAKKyAgICAvKiBSZXR1cm5zIHRoZSBzdGFydCB0aHJlc2hvbGQgb24gdGhlIGJ1ZmZlciBmb3IgYXVkaW8gc3RyZWFtaW5nCisgICAgICogb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGUgQXVkaW9UcmFjayBpcyBub3QgaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgICAgICAgICBzc2l6ZV90ICAgICBnZXRTdGFydFRocmVzaG9sZEluRnJhbWVzKCkgY29uc3Q7CisKKyAgICAvKiBTZXRzIHRoZSBzdGFydCB0aHJlc2hvbGQgaW4gZnJhbWVzIG9uIHRoZSBidWZmZXIgZm9yIGF1ZGlvIHN0cmVhbWluZy4KKyAgICAgKgorICAgICAqIE1heSBiZSBjbGFtcGVkIGludGVybmFsbHkuIFJldHVybnMgdGhlIGFjdHVhbCB2YWx1ZSBzZXQsIG9yIGEgbmVnYXRpdmUKKyAgICAgKiB2YWx1ZSBpZiB0aGUgQXVkaW9UcmFjayBpcyBub3QgaW5pdGlhbGl6ZWQgb3IgaWYgdGhlIGlucHV0CisgICAgICogaXMgemVybyBvciBncmVhdGVyIHRoYW4gSU5UX01BWC4KKyAgICAgKi8KKyAgICAgICAgICAgIHNzaXplX3QgICAgIHNldFN0YXJ0VGhyZXNob2xkSW5GcmFtZXMoc2l6ZV90IHN0YXJ0VGhyZXNob2xkSW5GcmFtZXMpOworCiAgICAgLyogUmV0dXJuIHRoZSBzdGF0aWMgYnVmZmVyIHNwZWNpZmllZCBpbiBjb25zdHJ1Y3RvciBvciBzZXQoKSwgb3IgMCBmb3Igc3RyZWFtaW5nIG1vZGUgKi8KICAgICAgICAgICAgIHNwPElNZW1vcnk+IHNoYXJlZEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1TaGFyZWRCdWZmZXI7IH0KIApAQCAtNDkyLDYgKzUyNiwxOCBAQAogICAgICAqLwogICAgICAgICAgICAgdWludDMyX3QgICAgZ2V0T3JpZ2luYWxTYW1wbGVSYXRlKCkgY29uc3Q7CiAKKyAgICAvKiBTZXRzIHRoZSBEdWFsIE1vbm8gbW9kZSBwcmVzZW50YXRpb24gb24gdGhlIG91dHB1dCBkZXZpY2UuICovCisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCBtb2RlKTsKKworICAgIC8qIFJldHVybnMgdGhlIER1YWwgTW9ubyBtb2RlIHByZXNlbnRhdGlvbiBzZXR0aW5nLiAqLworICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0RHVhbE1vbm9Nb2RlKGF1ZGlvX2R1YWxfbW9ub19tb2RlX3QqIG1vZGUpIGNvbnN0OworCisgICAgLyogU2V0cyB0aGUgQXVkaW8gRGVzY3JpcHRpb24gTWl4IGxldmVsIGluIGRCLiAqLworICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0IGxldmVsZEIpOworCisgICAgLyogUmV0dXJucyB0aGUgQXVkaW8gRGVzY3JpcHRpb24gTWl4IGxldmVsIGluIGRCLiAqLworICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0KiBsZXZlbGRCKSBjb25zdDsKKwogICAgIC8qIFNldCBzb3VyY2UgcGxheWJhY2sgcmF0ZSBmb3IgdGltZXN0cmV0Y2gKICAgICAgKiAxLjAgaXMgbm9ybWFsIHNwZWVkOiA8IDEuMCBpcyBzbG93ZXIsID4gMS4wIGlzIGZhc3RlcgogICAgICAqIDEuMCBpcyBub3JtYWwgcGl0Y2g6IDwgMS4wIGlzIGxvd2VyIHBpdGNoLCA+IDEuMCBpcyBoaWdoZXIgcGl0Y2gKQEAgLTUwNSw3ICs1NTEsNyBAQAogICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpOwogCiAgICAgLyogUmV0dXJuIGN1cnJlbnQgcGxheWJhY2sgcmF0ZSAqLwotICAgICAgICAgICAgY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIGdldFBsYXliYWNrUmF0ZSgpIGNvbnN0OworICAgICAgICAgICAgY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIGdldFBsYXliYWNrUmF0ZSgpOwogCiAgICAgLyogRW5hYmxlcyBsb29waW5nIGFuZCBzZXRzIHRoZSBzdGFydCBhbmQgZW5kIHBvaW50cyBvZiBsb29waW5nLgogICAgICAqIE9ubHkgc3VwcG9ydGVkIGZvciBzdGF0aWMgYnVmZmVyIG1vZGUuCkBAIC0xMDQ5LDYgKzEwOTUsMTIgQEAKIAogICAgICAgICAgICAgdm9pZCAgICAgdXBkYXRlUm91dGVkRGV2aWNlSWRfbCgpOwogCisgICAgICAgICAgICAvKiBTZXRzIHRoZSBEdWFsIE1vbm8gbW9kZSBwcmVzZW50YXRpb24gb24gdGhlIG91dHB1dCBkZXZpY2UuICovCisgICAgICAgICAgICBzdGF0dXNfdCBzZXREdWFsTW9ub01vZGVfbChhdWRpb19kdWFsX21vbm9fbW9kZV90IG1vZGUpOworCisgICAgICAgICAgICAvKiBTZXRzIHRoZSBBdWRpbyBEZXNjcmlwdGlvbiBNaXggbGV2ZWwgaW4gZEIuICovCisgICAgICAgICAgICBzdGF0dXNfdCBzZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWxfbChmbG9hdCBsZXZlbGRCKTsKKwogICAgIC8vIE5leHQgNCBmaWVsZHMgbWF5IGJlIGNoYW5nZWQgaWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZCwgYnV0IGFsd2F5cyAhPSAwCiAgICAgc3A8SUF1ZGlvVHJhY2s+ICAgICAgICAgbUF1ZGlvVHJhY2s7CiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7CkBAIC0xMjYxLDYgKzEzMTMsMTAgQEAKIAogICAgIHdwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiBtRGV2aWNlQ2FsbGJhY2s7CiAKKyAgICAvLyBDYWNoZWQgdmFsdWVzIHRvIHJlc3RvcmUgYWxvbmcgd2l0aCB0aGUgQXVkaW9UcmFjay4KKyAgICBhdWRpb19kdWFsX21vbm9fbW9kZV90IG1EdWFsTW9ub01vZGUgPSBBVURJT19EVUFMX01PTk9fTU9ERV9PRkY7CisgICAgZmxvYXQgbUF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbGRCID0gLXN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOworCiBwcml2YXRlOgogICAgIGNsYXNzIE1lZGlhTWV0cmljcyB7CiAgICAgICBwdWJsaWM6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCmluZGV4IDM3NmM2ZWIuLjgzNzM3NWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0xOTYsMTMgKzE5NiwxMyBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzLCBib29sIHJlZ2lzdHJhdGlvbikgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpCiAgICAgICAgICAgICA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCwKLSAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgPSAwOworICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQpID0gMDsKIApAQCAtMjQxLDEzICsyNDEsMzUgQEAKIAogICAgIHZpcnR1YWwgYm9vbCAgICAgaXNDYWxsU2NyZWVuTW9kZVN1cHBvcnRlZCgpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRGV2aWNlc1JvbGVGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpID0gMDsKIAogICAgIC8vIFRoZSByZXR1cm4gY29kZSBoZXJlIGlzIG9ubHkgaW50ZW5kZWQgdG8gcmVwcmVzZW50IHRyYW5zcG9ydCBlcnJvcnMuIFRoZQogICAgIC8vIGFjdHVhbCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gc2hvdWxkIGFsd2F5cyByZXR1cm4gTk9fRVJST1IuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKaW5kZXggMDZlNzg2ZC4uZGJiYmYzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaApAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RpbWVzdGFtcC5oPgogI2luY2x1ZGUgPG1lZGlhL1ZvbHVtZVNoYXBlci5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTg2LDYgKzg3LDI0IEBACiAKICAgICAvKiBnZXRzIHRoZSB2b2x1bWUgc2hhcGVyIHN0YXRlICovCiAgICAgdmlydHVhbCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKSA9IDA7CisKKyAgICAvKiBSZXR1cm5zIHRoZSBEdWFsIE1vbm8gbW9kZSBwcmVzZW50YXRpb24gc2V0dGluZy4gKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldER1YWxNb25vTW9kZShhdWRpb19kdWFsX21vbm9fbW9kZV90KiBtb2RlKSA9IDA7CisKKyAgICAvKiBTZXRzIHRoZSBEdWFsIE1vbm8gbW9kZSBwcmVzZW50YXRpb24gb24gdGhlIG91dHB1dCBkZXZpY2UuICovCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCBtb2RlKSA9IDA7CisKKyAgICAvKiBSZXR1cm5zIHRoZSBBdWRpbyBEZXNjcmlwdGlvbiBNaXggbGV2ZWwgaW4gZEIuICovCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQqIGxldmVsZEIpID0gMDsKKworICAgIC8qIFNldHMgdGhlIEF1ZGlvIERlc2NyaXB0aW9uIE1peCBsZXZlbCBpbiBkQi4gKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCBsZXZlbGRCKSA9IDA7CisKKyAgICAvKiBSZXRyaWV2ZXMgY3VycmVudCBwbGF5YmFjayByYXRlIHBhcmFtZXRlcnMuICovCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKGF1ZGlvX3BsYXliYWNrX3JhdGVfdCogcGxheWJhY2tSYXRlKSA9IDA7CisKKyAgICAvKiBTZXRzIHRoZSBwbGF5YmFjayByYXRlIHBhcmFtZXRlcnMgdGhhdCBjb250cm9sIHBsYXliYWNrIGJlaGF2aW9yLiAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycyhjb25zdCBhdWRpb19wbGF5YmFja19yYXRlX3QmIHBsYXliYWNrUmF0ZSkgPSAwOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggMzUwYTc4MC4uOTJjNmVjMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJsaWJhdWRpb2NsaWVudF90ZXN0c19kZWZhdWx0cyIsCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BbmRyb2lkLmJwCmluZGV4IDU0OGIwODAuLmIyZmEwMDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9oZWFkZXJzIHsKICAgICBuYW1lOiAibGliYXVkaW9mb3VuZGF0aW9uX2hlYWRlcnMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCkBAIC0xMiw2ICsyMSwxMiBAQAogICAgICAgICAibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiLAogICAgICAgICAibGlibWVkaWFfaGVscGVyX2hlYWRlcnMiLAogICAgIF0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KIAogY2NfbGlicmFyeSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9EZXZpY2VUeXBlQWRkci5jcHAgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9EZXZpY2VUeXBlQWRkci5jcHAKaW5kZXggYjQ0MDQzYS4uYTQ3MzM3YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvRGV2aWNlVHlwZUFkZHIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb0RldmljZVR5cGVBZGRyLmNwcApAQCAtMTYsMTIgKzE2LDU3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmg+CiAKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxyZWdleD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCituYW1lc3BhY2UgeworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgU1VQUFJFU1NFRCA9ICJTVVBQUkVTU0VEIjsKK3N0YXRpYyBjb25zdCBzdGQ6OnJlZ2V4IE1BQ19BRERSRVNTX1JFR0VYKCIoWzAtOWEtZkEtRl17Mn06KXs1fVswLTlhLWZBLUZdezJ9Iik7CisKK2Jvb2wgaXNTZW5zdGl2ZUFkZHJlc3MoY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MpIHsKKyAgICBpZiAoc3RkOjpyZWdleF9tYXRjaChhZGRyZXNzLCBNQUNfQUREUkVTU19SRUdFWCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgc29ja2FkZHJfc3RvcmFnZSBzczQ7CisgICAgaWYgKGluZXRfcHRvbihBRl9JTkVULCBhZGRyZXNzLmNfc3RyKCksICZzczQpID4gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBzb2NrYWRkcl9zdG9yYWdlIHNzNjsKKyAgICBpZiAoaW5ldF9wdG9uKEFGX0lORVQ2LCBhZGRyZXNzLmNfc3RyKCksICZzczYpID4gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK30gLy8gbmFtZXNwYWNlCisKK0F1ZGlvRGV2aWNlVHlwZUFkZHI6OkF1ZGlvRGV2aWNlVHlwZUFkZHIoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKSA6CisgICAgICAgIG1UeXBlKHR5cGUpLCBtQWRkcmVzcyhhZGRyZXNzKSB7CisgICAgbUlzQWRkcmVzc1NlbnNpdGl2ZSA9IGlzU2Vuc3RpdmVBZGRyZXNzKG1BZGRyZXNzKTsKK30KKwogY29uc3QgY2hhciogQXVkaW9EZXZpY2VUeXBlQWRkcjo6Z2V0QWRkcmVzcygpIGNvbnN0IHsKICAgICByZXR1cm4gbUFkZHJlc3MuY19zdHIoKTsKIH0KIAorY29uc3Qgc3RkOjpzdHJpbmcmIEF1ZGlvRGV2aWNlVHlwZUFkZHI6OmFkZHJlc3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1BZGRyZXNzOworfQorCit2b2lkIEF1ZGlvRGV2aWNlVHlwZUFkZHI6OnNldEFkZHJlc3MoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MpIHsKKyAgICBtQWRkcmVzcyA9IGFkZHJlc3M7CisgICAgbUlzQWRkcmVzc1NlbnNpdGl2ZSA9IGlzU2Vuc3RpdmVBZGRyZXNzKG1BZGRyZXNzKTsKK30KKwogYm9vbCBBdWRpb0RldmljZVR5cGVBZGRyOjplcXVhbHMoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgb3RoZXIpIGNvbnN0IHsKICAgICByZXR1cm4gbVR5cGUgPT0gb3RoZXIubVR5cGUgJiYgbUFkZHJlc3MgPT0gb3RoZXIubUFkZHJlc3M7CiB9CkBAIC0zNiwxNCArODEsMzQgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgQXVkaW9EZXZpY2VUeXBlQWRkcjo6b3BlcmF0b3I9PShjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZyaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gZXF1YWxzKHJocyk7Cit9CisKK2Jvb2wgQXVkaW9EZXZpY2VUeXBlQWRkcjo6b3BlcmF0b3IhPShjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZyaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gIW9wZXJhdG9yPT0ocmhzKTsKK30KKwogdm9pZCBBdWRpb0RldmljZVR5cGVBZGRyOjpyZXNldCgpIHsKICAgICBtVHlwZSA9IEFVRElPX0RFVklDRV9OT05FOwotICAgIG1BZGRyZXNzID0gIiI7CisgICAgc2V0QWRkcmVzcygiIik7Cit9CisKK3N0ZDo6c3RyaW5nIEF1ZGlvRGV2aWNlVHlwZUFkZHI6OnRvU3RyaW5nKGJvb2wgaW5jbHVkZVNlbnNpdGl2ZUluZm8pIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzc3RyZWFtOworICAgIHNzdHJlYW0gPDwgInR5cGU6MHgiIDw8IHN0ZDo6aGV4IDw8IG1UeXBlOworICAgIC8vIElQIGFuZCBNQUMgYWRkcmVzcyBhcmUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiBUaGUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIHdpbGwgYmUgc3VwcHJlc3NlZAorICAgIC8vIGlzIGBpbmNsdWRlU2Vuc2l0aXZlSW5mb2AgaXMgZmFsc2UuCisgICAgc3N0cmVhbSA8PCAiLEA6IgorICAgICAgICAgICAgPDwgKCFpbmNsdWRlU2Vuc2l0aXZlSW5mbyAmJiBtSXNBZGRyZXNzU2Vuc2l0aXZlID8gU1VQUFJFU1NFRCA6IG1BZGRyZXNzKTsKKyAgICByZXR1cm4gc3N0cmVhbS5zdHIoKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9EZXZpY2VUeXBlQWRkcjo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIHsKICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRVaW50MzIoJm1UeXBlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgdWludDMyX3QgcmF3RGV2aWNlVHlwZTsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMigmcmF3RGV2aWNlVHlwZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIG1UeXBlID0gc3RhdGljX2Nhc3Q8YXVkaW9fZGV2aWNlc190PihyYXdEZXZpY2VUeXBlKTsKICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRVdGY4RnJvbVV0ZjE2KCZtQWRkcmVzcyk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTY0LDQgKzEyOSwzMCBAQAogICAgIHJldHVybiBkZXZpY2VUeXBlczsKIH0KIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK0F1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZXhjbHVkZURldmljZVR5cGVBZGRyc0Zyb20oCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMsCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXNUb0V4Y2x1ZGUpIHsKKyAgICBzdGQ6OnNldDxBdWRpb0RldmljZVR5cGVBZGRyPiBkZXZpY2VzVG9FeGNsdWRlU2V0KAorICAgICAgICAgICAgZGV2aWNlc1RvRXhjbHVkZS5iZWdpbigpLCBkZXZpY2VzVG9FeGNsdWRlLmVuZCgpKTsKKyAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIHJlbWFpbmVkRGV2aWNlczsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IGRldmljZXMpIHsKKyAgICAgICAgaWYgKGRldmljZXNUb0V4Y2x1ZGVTZXQuY291bnQoZGV2aWNlKSA9PSAwKSB7CisgICAgICAgICAgICByZW1haW5lZERldmljZXMucHVzaF9iYWNrKGRldmljZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlbWFpbmVkRGV2aWNlczsKK30KKworc3RkOjpzdHJpbmcgZHVtcEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlVHlwZUFkZHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlU2Vuc2l0aXZlSW5mbykgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsKKyAgICBmb3IgKGF1dG8gaXQgPSBkZXZpY2VUeXBlQWRkcnMuYmVnaW4oKTsgaXQgIT0gZGV2aWNlVHlwZUFkZHJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChpdCAhPSBkZXZpY2VUeXBlQWRkcnMuYmVnaW4oKSkgeworICAgICAgICAgICAgc3RyZWFtIDw8ICIgIjsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW0gPDwgaXQtPnRvU3RyaW5nKGluY2x1ZGVTZW5zaXRpdmVJbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHN0cmVhbS5zdHIoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvR2Fpbi5jcHAgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9HYWluLmNwcAppbmRleCAwZDI4MzM1Li43NTkxNDBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9HYWluLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9HYWluLmNwcApAQCAtMTUyLDggKzE1MiwxMiBAQAogICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1JbmRleCkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwogICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkQm9vbCgmbVVzZUluQ2hhbm5lbE1hc2spKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKICAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZEJvb2woJm1Vc2VGb3JWb2x1bWUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMigmbUdhaW4ubW9kZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkVWludDMyKCZtR2Fpbi5jaGFubmVsX21hc2spKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICB1aW50MzJfdCByYXdHYWluTW9kZTsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMigmcmF3R2Fpbk1vZGUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBtR2Fpbi5tb2RlID0gc3RhdGljX2Nhc3Q8YXVkaW9fZ2Fpbl9tb2RlX3Q+KHJhd0dhaW5Nb2RlKTsKKyAgICB1aW50MzJfdCByYXdDaGFubmVsTWFzazsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMigmcmF3Q2hhbm5lbE1hc2spKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBtR2Fpbi5jaGFubmVsX21hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4ocmF3Q2hhbm5lbE1hc2spOwogICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1HYWluLm1pbl92YWx1ZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwogICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1HYWluLm1heF92YWx1ZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwogICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1HYWluLmRlZmF1bHRfdmFsdWUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1BvcnQuY3BwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvUG9ydC5jcHAKaW5kZXggZjk4ODY5MC4uMTg0NmE2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvUG9ydC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvUG9ydC5jcHAKQEAgLTI2OCwxMiArMjY4LDE3IEBACiAgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRVaW50MzIocmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZtRm9ybWF0KSkpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkVWludDMyKCZtQ2hhbm5lbE1hc2spKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICB1aW50MzJfdCByYXdDaGFubmVsTWFzazsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMigmcmF3Q2hhbm5lbE1hc2spKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBtQ2hhbm5lbE1hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4ocmF3Q2hhbm5lbE1hc2spOwogICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1JZCkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwogICAgIC8vIFJlYWQgbUdhaW4gZnJvbSBwYXJjZWwuCiAgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmbUdhaW4uaW5kZXgpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMigmbUdhaW4ubW9kZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkVWludDMyKCZtR2Fpbi5jaGFubmVsX21hc2spKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICB1aW50MzJfdCByYXdHYWluTW9kZTsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMigmcmF3R2Fpbk1vZGUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBtR2Fpbi5tb2RlID0gc3RhdGljX2Nhc3Q8YXVkaW9fZ2Fpbl9tb2RlX3Q+KHJhd0dhaW5Nb2RlKTsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMigmcmF3Q2hhbm5lbE1hc2spKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBtR2Fpbi5jaGFubmVsX21hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4ocmF3Q2hhbm5lbE1hc2spOwogICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkVWludDMyKCZtR2Fpbi5yYW1wX2R1cmF0aW9uX21zKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CiAgICAgc3RkOjp2ZWN0b3I8aW50PiB2YWx1ZXM7CiAgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMlZlY3RvcigmdmFsdWVzKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Qcm9maWxlLmNwcCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1Byb2ZpbGUuY3BwCmluZGV4IDkxYmUzNDYuLjY3YjYwMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1Byb2ZpbGUuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1Byb2ZpbGUuY3BwCkBAIC0xNTcsNyArMTU3LDkgQEAKICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZhbHVlczsKICAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyVmVjdG9yKCZ2YWx1ZXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKICAgICBtQ2hhbm5lbE1hc2tzLmNsZWFyKCk7Ci0gICAgbUNoYW5uZWxNYXNrcy5pbnNlcnQodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSk7CisgICAgZm9yIChhdXRvIHJhdyA6IHZhbHVlcykgeworICAgICAgICBtQ2hhbm5lbE1hc2tzLmluc2VydChzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4ocmF3KSk7CisgICAgfQogICAgIHZhbHVlcy5jbGVhcigpOwogICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzJWZWN0b3IoJnZhbHVlcykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwogICAgIG1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vRGV2aWNlRGVzY3JpcHRvckJhc2UuY3BwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0RldmljZURlc2NyaXB0b3JCYXNlLmNwcAppbmRleCAzZGJlMzdkLi4xNmNmNzFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vRGV2aWNlRGVzY3JpcHRvckJhc2UuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9EZXZpY2VEZXNjcmlwdG9yQmFzZS5jcHAKQEAgLTQwLDExICs0MCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU09VUkNFKSwKICAgICAgICAgbURldmljZVR5cGVBZGRyKGRldmljZVR5cGVBZGRyKQogewotICAgIGlmIChtRGV2aWNlVHlwZUFkZHIubUFkZHJlc3MuZW1wdHkoKSAmJiBhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShtRGV2aWNlVHlwZUFkZHIubVR5cGUpKSB7Ci0gICAgICAgIG1EZXZpY2VUeXBlQWRkci5tQWRkcmVzcyA9ICIwIjsKKyAgICBpZiAobURldmljZVR5cGVBZGRyLmFkZHJlc3MoKS5lbXB0eSgpICYmIGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKG1EZXZpY2VUeXBlQWRkci5tVHlwZSkpIHsKKyAgICAgICAgbURldmljZVR5cGVBZGRyLnNldEFkZHJlc3MoIjAiKTsKICAgICB9CiB9CiAKK3ZvaWQgRGV2aWNlRGVzY3JpcHRvckJhc2U6OnNldEFkZHJlc3MoY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MpIHsKKyAgICBtRGV2aWNlVHlwZUFkZHIuc2V0QWRkcmVzcyhhZGRyZXNzKTsKK30KKwogdm9pZCBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKIHsKQEAgLTEyMywxOCArMTI3LDE2IEBACiAgICAgICAgICAgICAiJSpzLSBzdXBwb3J0ZWQgZW5jYXBzdWxhdGlvbiBtZXRhZGF0YSB0eXBlczogJXUiLAogICAgICAgICAgICAgc3BhY2VzLCAiIiwgbUVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzKSk7CiAKLSAgICBpZiAobURldmljZVR5cGVBZGRyLm1BZGRyZXNzLnNpemUoKSAhPSAwKSB7CisgICAgaWYgKG1EZXZpY2VUeXBlQWRkci5hZGRyZXNzKCkuc2l6ZSgpICE9IDApIHsKICAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKAogICAgICAgICAgICAgICAgICIlKnMtIGFkZHJlc3M6ICUtMzJzXG4iLCBzcGFjZXMsICIiLCBtRGV2aWNlVHlwZUFkZHIuZ2V0QWRkcmVzcygpKSk7CiAgICAgfQogICAgIEF1ZGlvUG9ydDo6ZHVtcChkc3QsIHNwYWNlcywgdmVyYm9zZSk7CiB9CiAKLXN0ZDo6c3RyaW5nIERldmljZURlc2NyaXB0b3JCYXNlOjp0b1N0cmluZygpIGNvbnN0CitzdGQ6OnN0cmluZyBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6dG9TdHJpbmcoYm9vbCBpbmNsdWRlU2Vuc2l0aXZlSW5mbykgY29uc3QKIHsKLSAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzc3RyZWFtOwotICAgIHNzdHJlYW0gPDwgInR5cGU6MHgiIDw8IHN0ZDo6aGV4IDw8IHR5cGUoKSA8PCAiLEA6IiA8PCBtRGV2aWNlVHlwZUFkZHIubUFkZHJlc3M7Ci0gICAgcmV0dXJuIHNzdHJlYW0uc3RyKCk7CisgICAgcmV0dXJuIG1EZXZpY2VUeXBlQWRkci50b1N0cmluZyhpbmNsdWRlU2Vuc2l0aXZlSW5mbyk7CiB9CiAKIHZvaWQgRGV2aWNlRGVzY3JpcHRvckJhc2U6OmxvZygpIGNvbnN0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0NvbnRhaW5lcnMuaCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvQ29udGFpbmVycy5oCmluZGV4IDcyZmRhNDkuLmFhN2NhNjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvQ29udGFpbmVycy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvQ29udGFpbmVycy5oCkBAIC05Niw3ICs5Niw3IEBACiBzdGF0aWMgaW5saW5lIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlc1RvQml0TWFzayhjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcykgewogICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlcyA9IEFVRElPX0RFVklDRV9OT05FOwogICAgIGZvciAoYXV0byBkZXZpY2VUeXBlIDogZGV2aWNlVHlwZXMpIHsKLSAgICAgICAgdHlwZXMgfD0gZGV2aWNlVHlwZTsKKyAgICAgICAgdHlwZXMgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KHR5cGVzIHwgZGV2aWNlVHlwZSk7CiAgICAgfQogICAgIHJldHVybiB0eXBlczsKIH0KQEAgLTEzMSw0ICsxMzEsNCBAQAogc3RkOjpzdHJpbmcgdG9TdHJpbmcoY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpOwogCiAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmggYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmgKaW5kZXggNjBlYTc4ZS4uNzQ5N2ZhZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvRGV2aWNlVHlwZUFkZHIuaApAQCAtMjcsMjggKzI3LDQzIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgOiBwdWJsaWMgUGFyY2VsYWJsZSB7CitjbGFzcyBBdWRpb0RldmljZVR5cGVBZGRyIDogcHVibGljIFBhcmNlbGFibGUgeworcHVibGljOgogICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIoKSA9IGRlZmF1bHQ7CiAKLSAgICBBdWRpb0RldmljZVR5cGVBZGRyKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcykgOgotICAgICAgICAgICAgbVR5cGUodHlwZSksIG1BZGRyZXNzKGFkZHJlc3MpIHt9CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MpOwogCiAgICAgY29uc3QgY2hhciogZ2V0QWRkcmVzcygpIGNvbnN0OwogCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MoKSBjb25zdDsKKworICAgIHZvaWQgc2V0QWRkcmVzcyhjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcyk7CisKKyAgICBib29sIGlzQWRkcmVzc1NlbnNpdGl2ZSgpOworCiAgICAgYm9vbCBlcXVhbHMoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgb3RoZXIpIGNvbnN0OwogCiAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciYgb3BlcmF0b3I9IChjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJikgPSBkZWZhdWx0OwogCiAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgb3RoZXIpIGNvbnN0OwogCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIHJocykgY29uc3Q7CisKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgcmhzKSBjb25zdDsKKwogICAgIHZvaWQgcmVzZXQoKTsKIAorICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGJvb2wgaW5jbHVkZVNlbnNpdGl2ZUluZm89ZmFsc2UpIGNvbnN0OworCiAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIG92ZXJyaWRlOwogCiAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgICBhdWRpb19kZXZpY2VzX3QgbVR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKKworcHJpdmF0ZToKICAgICBzdGQ6OnN0cmluZyBtQWRkcmVzczsKKyAgICBib29sIG1Jc0FkZHJlc3NTZW5zaXRpdmU7CiB9OwogCiB1c2luZyBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yID0gc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj47CkBAIC01OCw0ICs3MywxNSBAQAogICovCiBEZXZpY2VUeXBlU2V0IGdldEF1ZGlvRGV2aWNlVHlwZXMoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlVHlwZUFkZHJzKTsKIAotfQorLyoqCisgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIG9mIEF1ZGlvRGV2aWNlVHlwZUFkZHJzIHRoYXQgYXJlIHNob3duIGluIGBkZXZpY2VzYCBidXQgbm90CisgKiBpbiBgZGV2aWNlc1RvRXhjbHVkZWAKKyAqLworQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBleGNsdWRlRGV2aWNlVHlwZUFkZHJzRnJvbSgKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcywKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlc1RvRXhjbHVkZSk7CisKK3N0ZDo6c3RyaW5nIGR1bXBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZVR5cGVBZGRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZVNlbnNpdGl2ZUluZm89ZmFsc2UpOworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9EZXZpY2VEZXNjcmlwdG9yQmFzZS5oIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvRGV2aWNlRGVzY3JpcHRvckJhc2UuaAppbmRleCBhZjA0NzIxLi4wY2JkMWRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9EZXZpY2VEZXNjcmlwdG9yQmFzZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0RldmljZURlc2NyaXB0b3JCYXNlLmgKQEAgLTQxLDggKzQxLDggQEAKICAgICB2aXJ0dWFsIH5EZXZpY2VEZXNjcmlwdG9yQmFzZSgpIHt9CiAKICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlQWRkci5tVHlwZTsgfQotICAgIHN0ZDo6c3RyaW5nIGFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZUFkZHIubUFkZHJlc3M7IH0KLSAgICB2b2lkIHNldEFkZHJlc3MoY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MpIHsgbURldmljZVR5cGVBZGRyLm1BZGRyZXNzID0gYWRkcmVzczsgfQorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gbURldmljZVR5cGVBZGRyLmFkZHJlc3MoKTsgfQorICAgIHZvaWQgc2V0QWRkcmVzcyhjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcyk7CiAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZ2V0RGV2aWNlVHlwZUFkZHIoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZUFkZHI7IH0KIAogICAgIC8vIEF1ZGlvUG9ydENvbmZpZwpAQCAtNjEsNyArNjEsMTQgQEAKICAgICB2b2lkIGR1bXAoc3RkOjpzdHJpbmcgKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4LAogICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHRyYUluZm8gPSBudWxscHRyLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKICAgICB2b2lkIGxvZygpIGNvbnN0OwotICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzdHJpbmcgdG8gZGVzY3JpYmUgdGhlIERldmljZURlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5jbHVkZVNlbnNpdGl2ZUluZm8gc2Vuc2l0aXZlIGluZm9ybWF0aW9uIHdpbGwgYmUgYWRkZWQgd2hlbiBpdCBpcyB0cnVlLgorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCB0byBkZXNjcmliZSB0aGUgRGV2aWNlRGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyhib29sIGluY2x1ZGVTZW5zaXRpdmVJbmZvID0gZmFsc2UpIGNvbnN0OwogCiAgICAgYm9vbCBlcXVhbHMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+JiBvdGhlcikgY29uc3Q7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggZjI1OGIxNC4uYmI5YTVmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiYXVkaW9mb3VuZGF0aW9uX3BhcmNlbGFibGVfdGVzdCIsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLmJwCmluZGV4IDE3MDlkMWUuLmRiZTM0MmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliYXVkaW9oYWwiLAogCkBAIC0xNCwxMCArMjMsMTAgQEAKICAgICBdLAogCiAgICAgcmVxdWlyZWQ6IFsKLSAgICAgICAgImxpYmF1ZGlvaGFsQDIuMCIsCiAgICAgICAgICJsaWJhdWRpb2hhbEA0LjAiLAogICAgICAgICAibGliYXVkaW9oYWxANS4wIiwKICAgICAgICAgImxpYmF1ZGlvaGFsQDYuMCIsCisgICAgICAgICJsaWJhdWRpb2hhbEA3LjAiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuY3BwCmluZGV4IDU5ODVlZjAuLmU0MjBkMDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5jcHAKQEAgLTMxLDEwICszMSwxMCBAQAogLyoqIFN1cHBvcnRlZCBIQUwgdmVyc2lvbnMsIGluIG9yZGVyIG9mIHByZWZlcmVuY2UuCiAgKi8KIGNvbnN0IGNoYXIqIHNBdWRpb0hBTFZlcnNpb25zW10gPSB7CisgICAgIjcuMCIsCiAgICAgIjYuMCIsCiAgICAgIjUuMCIsCiAgICAgIjQuMCIsCi0gICAgIjIuMCIsCiAgICAgbnVsbHB0cgogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvT1dORVJTIGIvbWVkaWEvbGliYXVkaW9oYWwvT1dORVJTCmluZGV4IDE0NTZhYjYuLjcxYjE3ZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL09XTkVSUworKysgYi9tZWRpYS9saWJhdWRpb2hhbC9PV05FUlMKQEAgLTEsMiArMSBAQAota3JvY2FyZEBnb29nbGUuY29tCiBtbmFnYW5vdkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAKaW5kZXggOTY3ZmJhMS4uOTFhN2ExNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2RlZmF1bHRzIHsKICAgICBuYW1lOiAibGliYXVkaW9oYWxfZGVmYXVsdCIsCiAKQEAgLTUzLDI5ICs2MiwxNSBAQAogfQogCiBjY19saWJyYXJ5X3NoYXJlZCB7Ci0gICAgbmFtZTogImxpYmF1ZGlvaGFsQDIuMCIsCi0gICAgZGVmYXVsdHM6IFsibGliYXVkaW9oYWxfZGVmYXVsdCJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wLXV0aWwiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RAMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9AMi4wIiwKLSAgICBdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLURNQUpPUl9WRVJTSU9OPTIiLAotICAgICAgICAiLURNSU5PUl9WRVJTSU9OPTAiLAotICAgICAgICAiLWluY2x1ZGUgY29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uTWFjcm8uaCIsCi0gICAgXQotfQotCi1jY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmF1ZGlvaGFsQDQuMCIsCiAgICAgZGVmYXVsdHM6IFsibGliYXVkaW9oYWxfZGVmYXVsdCJdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA0LjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANC4wLXV0aWwiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANC4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDQuMC11dGlsIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANC4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANC4wLXV0aWwiLAogICAgIF0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItRE1BSk9SX1ZFUlNJT049NCIsCkBAIC05MSw3ICs4Niw5IEBACiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA1LjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANS4wLXV0aWwiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDUuMC11dGlsIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANS4wLXV0aWwiLAogICAgIF0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItRE1BSk9SX1ZFUlNJT049NSIsCkBAIC0xMDcsNyArMTA0LDkgQEAKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDYuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA2LjAtdXRpbCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA2LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANi4wLXV0aWwiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A2LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A2LjAtdXRpbCIsCiAgICAgXSwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1ETUFKT1JfVkVSU0lPTj02IiwKQEAgLTExNiwzICsxMTUsMjAgQEAKICAgICBdCiB9CiAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9oYWxANy4wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDcuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA3LjAtdXRpbCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA3LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANy4wLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A3LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A3LjAtdXRpbCIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ETUFKT1JfVkVSU0lPTj03IiwKKyAgICAgICAgIi1ETUlOT1JfVkVSU0lPTj0wIiwKKyAgICAgICAgIi1pbmNsdWRlIGNvbW1vbi9hbGwtdmVyc2lvbnMvVmVyc2lvbk1hY3JvLmgiLAorICAgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKaW5kZXggZWJlZDVmZC4uYjZmZWU2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKQEAgLTUwLDEyICs1MCwyMCBAQAogICAgICAgICAgICAgaGFsS2V5cy5nZXQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfREVWSUNFX1NVUF9FTkNBUFNVTEFUSU9OX01FVEFEQVRBX1RZUEVTKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKSA9PSBOT19FUlJPUjsKIAorICAgIGNvbnN0IGJvb2wga2VlcERlbGF5VmFsdWUgPQorICAgICAgICAgICAgaGFsS2V5cy5nZXQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfREVWSUNFX0FERElUSU9OQUxfT1VUUFVUX0RFTEFZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKSA9PSBOT19FUlJPUiB8fAorICAgICAgICAgICAgaGFsS2V5cy5nZXQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfREVWSUNFX01BWF9BRERJVElPTkFMX09VVFBVVF9ERUxBWSksCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSkgPT0gTk9fRVJST1I7CisKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhhbEtleXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgU3RyaW5nOCBrZXk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGhhbEtleXMuZ2V0QXQoaSwga2V5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKICAgICAgICAgaWYgKChrZWVwRm9ybWF0VmFsdWUgJiYga2V5ID09IEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpIHx8Ci0gICAgICAgICAgICAoa2VlcFJvdXRpbmdWYWx1ZSAmJiBrZXkgPT0gQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpKSB7CisgICAgICAgICAgICAoa2VlcFJvdXRpbmdWYWx1ZSAmJiBrZXkgPT0gQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpIHx8CisgICAgICAgICAgICAoa2VlcERlbGF5VmFsdWUgJiYga2V5ID09IEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfQURESVRJT05BTF9PVVRQVVRfREVMQVkpIHx8CisgICAgICAgICAgICAoa2VlcERlbGF5VmFsdWUgJiYga2V5ID09IEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfTUFYX0FERElUSU9OQUxfT1VUUFVUX0RFTEFZKSkgewogICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIga2VlcFZhbHVlUGFyYW07CiAgICAgICAgICAgICBoYWxLZXlzLmdldEF0KGksIGtleSwgdmFsdWUpOwogICAgICAgICAgICAga2VlcFZhbHVlUGFyYW0uYWRkKGtleSwgdmFsdWUpOwpAQCAtMTEyLDEyOSArMTIwLDUgQEAKICAgICBBTE9HRSgiJXMgJXAgJXM6ICVzIChmcm9tIHJwYykiLCBtQ2xhc3NOYW1lLCB0aGlzLCBmdW5jTmFtZSwgZGVzY3JpcHRpb24pOwogfQogCi0jaWYgTUFKT1JfVkVSU0lPTiA+PSA0Ci0vLyBUT0RPOiBVc2UgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gaW4gdGhlIGhhbCB3aGVuIGl0IG1vdmVzIHRvIGEgdXRpbCBsaWJyYXJ5Lgotc3RhdGljIHN0ZDo6c3RyaW5nIGRldmljZUFkZHJlc3NUb0hhbChjb25zdCBEZXZpY2VBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gICAgLy8gSEFMIGFzc3VtZXMgdGhhdCB0aGUgYWRkcmVzcyBpcyBOVUwtdGVybWluYXRlZC4KLSAgICBjaGFyIGhhbEFkZHJlc3NbQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTl07Ci0gICAgbWVtc2V0KGhhbEFkZHJlc3MsIDAsIHNpemVvZihoYWxBZGRyZXNzKSk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGhhbERldmljZSA9IHN0YXRpY19jYXN0PGF1ZGlvX2RldmljZXNfdD4oYWRkcmVzcy5kZXZpY2UpOwotICAgIGlmIChnZXRBdWRpb0RldmljZU91dEFsbEEyZHBTZXQoKS5jb3VudChoYWxEZXZpY2UpID4gMCB8fAotICAgICAgICBoYWxEZXZpY2UgPT0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKLSAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1swXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1sxXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1syXSwKLSAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1szXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s0XSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s1XSk7Ci0gICAgfSBlbHNlIGlmIChoYWxEZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9JUCB8fCBoYWxEZXZpY2UgPT0gQVVESU9fREVWSUNFX0lOX0lQKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVkLiVkLiVkLiVkIiwgYWRkcmVzcy5hZGRyZXNzLmlwdjRbMF0sCi0gICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzFdLCBhZGRyZXNzLmFkZHJlc3MuaXB2NFsyXSwgYWRkcmVzcy5hZGRyZXNzLmlwdjRbM10pOwotICAgIH0gZWxzZSBpZiAoZ2V0QXVkaW9EZXZpY2VPdXRBbGxVc2JTZXQoKS5jb3VudChoYWxEZXZpY2UpID4gMCB8fAotICAgICAgICAgICAgICAgZ2V0QXVkaW9EZXZpY2VJbkFsbFVzYlNldCgpLmNvdW50KGhhbERldmljZSkgPiAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgImNhcmQ9JWQ7ZGV2aWNlPSVkIiwgYWRkcmVzcy5hZGRyZXNzLmFsc2EuY2FyZCwKLSAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLmFsc2EuZGV2aWNlKTsKLSAgICB9IGVsc2UgaWYgKGhhbERldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0JVUyB8fCBoYWxEZXZpY2UgPT0gQVVESU9fREVWSUNFX0lOX0JVUykgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuYnVzQWRkcmVzcy5jX3N0cigpKTsKLSAgICB9IGVsc2UgaWYgKGhhbERldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVggfHwKLSAgICAgICAgICAgICAgIGhhbERldmljZSA9PSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuclN1Ym1peEFkZHJlc3MuY19zdHIoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJXMiLCBhZGRyZXNzLmJ1c0FkZHJlc3MuY19zdHIoKSk7Ci0gICAgfQotICAgIHJldHVybiBoYWxBZGRyZXNzOwotfQotCi0vL2xvY2FsIGNvbnZlcnNpb24gaGVscGVycwotCi1zdGF0aWMgYXVkaW9fbWljcm9waG9uZV9jaGFubmVsX21hcHBpbmdfdCAgY2hhbm5lbE1hcHBpbmdUb0hhbChBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZyBtYXBwaW5nKSB7Ci0gICAgc3dpdGNoIChtYXBwaW5nKSB7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc6OlVOVVNFRDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19VTlVTRUQ7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc6OkRJUkVDVDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19ESVJFQ1Q7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc6OlBST0NFU1NFRDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19QUk9DRVNTRUQ7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIGNoYW5uZWxNYXBwaW5nVG9IYWwgY29udmVyc2lvbiAlZCIsIG1hcHBpbmcpOwotICAgIH0KLX0KLQotc3RhdGljIGF1ZGlvX21pY3JvcGhvbmVfbG9jYXRpb25fdCBsb2NhdGlvblRvSGFsKEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uIGxvY2F0aW9uKSB7Ci0gICAgc3dpdGNoIChsb2NhdGlvbikgewotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpVTktOT1dOOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fVU5LTk9XTjsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFk6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9NQUlOQk9EWTsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFlfTU9WQUJMRToKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX01BSU5CT0RZX01PVkFCTEU7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246OlBFUklQSEVSQUw6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9QRVJJUEhFUkFMOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBsb2NhdGlvblRvSGFsIGNvbnZlcnNpb24gJWQiLCBsb2NhdGlvbik7Ci0gICAgfQotfQotc3RhdGljIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uYWxpdHlfdCBkaXJlY3Rpb25hbGl0eVRvSGFsKEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5IGRpcikgewotICAgIHN3aXRjaCAoZGlyKSB7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6OlVOS05PV046Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9VTktOT1dOOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpPTU5JOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfRElSRUNUSU9OQUxJVFlfT01OSTsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6QklfRElSRUNUSU9OQUw6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9CSV9ESVJFQ1RJT05BTDsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6Q0FSRElPSUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9DQVJESU9JRDsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6SFlQRVJfQ0FSRElPSUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9IWVBFUl9DQVJESU9JRDsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6U1VQRVJfQ0FSRElPSUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9TVVBFUl9DQVJESU9JRDsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gZGlyZWN0aW9uYWxpdHlUb0hhbCBjb252ZXJzaW9uICVkIiwgZGlyKTsKLSAgICB9Ci19Ci0KLXZvaWQgbWljcm9waG9uZUluZm9Ub0hhbChjb25zdCBNaWNyb3Bob25lSW5mbyYgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCAqcERzdCkgewotICAgIGlmIChwRHN0ICE9IE5VTEwpIHsKLSAgICAgICAgc25wcmludGYocERzdC0+ZGV2aWNlX2lkLCBzaXplb2YocERzdC0+ZGV2aWNlX2lkKSwKLSAgICAgICAgICAgICAgICAgIiVzIiwgc3JjLmRldmljZUlkLmNfc3RyKCkpOwotICAgICAgICBwRHN0LT5kZXZpY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KHNyYy5kZXZpY2VBZGRyZXNzLmRldmljZSk7Ci0gICAgICAgIHNucHJpbnRmKHBEc3QtPmFkZHJlc3MsIHNpemVvZihwRHN0LT5hZGRyZXNzKSwKLSAgICAgICAgICAgICAgICAgIiVzIiwgZGV2aWNlQWRkcmVzc1RvSGFsKHNyYy5kZXZpY2VBZGRyZXNzKS5jX3N0cigpKTsKLSAgICAgICAgaWYgKHNyYy5jaGFubmVsTWFwcGluZy5zaXplKCkgPiBBVURJT19DSEFOTkVMX0NPVU5UX01BWCkgewotICAgICAgICAgICAgQUxPR1coIm1pY3JvcGhvbmVJbmZvVG9TdHJ1Y3QgZm91bmQgJXp1IGNoYW5uZWxNYXBwaW5nIGVsZW1lbnRzLiBNYXggZXhwZWN0ZWQgaXMgJWQiLAotICAgICAgICAgICAgICAgICAgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSwgQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVgpOwotICAgICAgICB9Ci0gICAgICAgIHNpemVfdCBjaDsKLSAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSAmJiBjaCA8IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYOyBjaCsrKSB7Ci0gICAgICAgICAgICBwRHN0LT5jaGFubmVsX21hcHBpbmdbY2hdID0gY2hhbm5lbE1hcHBpbmdUb0hhbChzcmMuY2hhbm5lbE1hcHBpbmdbY2hdKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKDsgY2ggPCBBVURJT19DSEFOTkVMX0NPVU5UX01BWDsgY2grKykgewotICAgICAgICAgICAgcERzdC0+Y2hhbm5lbF9tYXBwaW5nW2NoXSA9IEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1VOVVNFRDsKLSAgICAgICAgfQotICAgICAgICBwRHN0LT5sb2NhdGlvbiA9IGxvY2F0aW9uVG9IYWwoc3JjLmxvY2F0aW9uKTsKLSAgICAgICAgcERzdC0+Z3JvdXAgPSAoYXVkaW9fbWljcm9waG9uZV9ncm91cF90KXNyYy5ncm91cDsKLSAgICAgICAgcERzdC0+aW5kZXhfaW5fdGhlX2dyb3VwID0gKHVuc2lnbmVkIGludClzcmMuaW5kZXhJblRoZUdyb3VwOwotICAgICAgICBwRHN0LT5zZW5zaXRpdml0eSA9IHNyYy5zZW5zaXRpdml0eTsKLSAgICAgICAgcERzdC0+bWF4X3NwbCA9IHNyYy5tYXhTcGw7Ci0gICAgICAgIHBEc3QtPm1pbl9zcGwgPSBzcmMubWluU3BsOwotICAgICAgICBwRHN0LT5kaXJlY3Rpb25hbGl0eSA9IGRpcmVjdGlvbmFsaXR5VG9IYWwoc3JjLmRpcmVjdGlvbmFsaXR5KTsKLSAgICAgICAgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMgPSAodW5zaWduZWQgaW50KXNyYy5mcmVxdWVuY3lSZXNwb25zZS5zaXplKCk7Ci0gICAgICAgIGlmIChwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA+IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVMpIHsKLSAgICAgICAgICAgIEFMT0dXKCJtaWNyb3Bob25lSW5mb1RvU3RydWN0IGZvdW5kICVkIGZyZXF1ZW5jeSByZXNwb25zZXMuIE1heCBleHBlY3RlZCBpcyAlZCIsCi0gICAgICAgICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcywgQVVESU9fTUlDUk9QSE9ORV9NQVhfRlJFUVVFTkNZX1JFU1BPTlNFUyk7Ci0gICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVM7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlczsgaysrKSB7Ci0gICAgICAgICAgICBwRHN0LT5mcmVxdWVuY3lfcmVzcG9uc2VzWzBdW2tdID0gc3JjLmZyZXF1ZW5jeVJlc3BvbnNlW2tdLmZyZXF1ZW5jeTsKLSAgICAgICAgICAgIHBEc3QtPmZyZXF1ZW5jeV9yZXNwb25zZXNbMV1ba10gPSBzcmMuZnJlcXVlbmN5UmVzcG9uc2Vba10ubGV2ZWw7Ci0gICAgICAgIH0KLSAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnggPSBzcmMucG9zaXRpb24ueDsKLSAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnkgPSBzcmMucG9zaXRpb24ueTsKLSAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnogPSBzcmMucG9zaXRpb24uejsKLSAgICAgICAgcERzdC0+b3JpZW50YXRpb24ueCA9IHNyYy5vcmllbnRhdGlvbi54OwotICAgICAgICBwRHN0LT5vcmllbnRhdGlvbi55ID0gc3JjLm9yaWVudGF0aW9uLnk7Ci0gICAgICAgIHBEc3QtPm9yaWVudGF0aW9uLnogPSBzcmMub3JpZW50YXRpb24uejsKLSAgICB9Ci19Ci0jZW5kaWYKLQogfSAgLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5oCmluZGV4IGZiM2JiOWQuLjU5MTIyYzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKQEAgLTgyLDEyICs4Miw2IEBACiAgICAgdm9pZCBlbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKTsKIH07CiAKLSNpZiBNQUpPUl9WRVJTSU9OID49IDQKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6TWljcm9waG9uZUluZm87Ci12b2lkIG1pY3JvcGhvbmVJbmZvVG9IYWwoY29uc3QgTWljcm9waG9uZUluZm8mIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgKnBEc3QpOwotI2VuZGlmCi0KIH0gIC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5jcHAKaW5kZXggN2QwZDgzZC4uY2E0ZjY2MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuY3BwCkBAIC0xOSwyMiArMTksMjQgQEAKICNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlSGFsSGlkbCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JUHJpbWFyeURldmljZS5oKQogI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CiAjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0NvbnRhaW5lcnMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JUHJpbWFyeURldmljZS5oKQorI2luY2x1ZGUgPEhpZGxVdGlscy5oPgogI2luY2x1ZGUgPGNvbW1vbi9hbGwtdmVyc2lvbnMvVmVyc2lvblV0aWxzLmg+CisjaW5jbHVkZSA8dXRpbC9Db3JlVXRpbHMuaD4KIAogI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKICNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCisjaW5jbHVkZSAiUGFyYW1ldGVyVXRpbHMuaCIKICNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCi0jaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6dXRpbHM6OkVudW1CaXRmaWVsZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkNvcmVVdGlsczsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CiAKQEAgLTQ2LDQ3ICs0OCw2IEBACiAKIHVzaW5nIEVmZmVjdEhhbEhpZGwgPSA6OmFuZHJvaWQ6OmVmZmVjdDo6Q1BQX1ZFUlNJT046OkVmZmVjdEhhbEhpZGw7CiAKLW5hbWVzcGFjZSB7Ci0KLXN0YXR1c190IGRldmljZUFkZHJlc3NGcm9tSGFsKAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBjaGFyKiBoYWxBZGRyZXNzLCBEZXZpY2VBZGRyZXNzKiBhZGRyZXNzKSB7Ci0gICAgYWRkcmVzcy0+ZGV2aWNlID0gQXVkaW9EZXZpY2UoZGV2aWNlKTsKLQotICAgIGlmIChoYWxBZGRyZXNzID09IG51bGxwdHIgfHwgc3RybmxlbihoYWxBZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgaWYgKGdldEF1ZGlvRGV2aWNlT3V0QWxsQTJkcFNldCgpLmNvdW50KGRldmljZSkgPiAwCi0gICAgICAgICAgICB8fCBkZXZpY2UgPT0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiJWhoWDolaGhYOiVoaFg6JWhoWDolaGhYOiVoaFgiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLm1hY1swXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzFdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMl0sCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzNdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbNF0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s1XSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gNiA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfSVAgfHwgZGV2aWNlID09IEFVRElPX0RFVklDRV9JTl9JUCkgewotICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgIiVoaHUuJWhodS4laGh1LiVoaHUiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMF0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMV0sCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsyXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFszXSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gNCA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoZ2V0QXVkaW9EZXZpY2VPdXRBbGxVc2JTZXQoKS5jb3VudChkZXZpY2UpID4gMAotICAgICAgICAgICAgfHwgZ2V0QXVkaW9EZXZpY2VJbkFsbFVzYlNldCgpLmNvdW50KGRldmljZSkgPiAwKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiY2FyZD0lZDtkZXZpY2U9JWQiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuY2FyZCwgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5kZXZpY2UpOwotICAgICAgICByZXR1cm4gc3RhdHVzID09IDIgPyBPSyA6IEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0JVUyB8fCBkZXZpY2UgPT0gQVVESU9fREVWSUNFX0lOX0JVUykgewotICAgICAgICBhZGRyZXNzLT5idXNBZGRyZXNzID0gaGFsQWRkcmVzczsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWAotICAgICAgICAgICAgfHwgZGV2aWNlID09IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSB7Ci0gICAgICAgIGFkZHJlc3MtPnJTdWJtaXhBZGRyZXNzID0gaGFsQWRkcmVzczsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCiBEZXZpY2VIYWxIaWRsOjpEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpCiAgICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkRldmljZSIpLCBtRGV2aWNlKGRldmljZSksCiAgICAgICAgICAgbVByaW1hcnlEZXZpY2UoSVByaW1hcnlEZXZpY2U6OmNhc3RGcm9tKGRldmljZSkpIHsKQEAgLTIxMiw3ICsxNzMsNyBAQAogICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsIHRydWUgLyppc0lucHV0Ki8sICZoaWRsQ29uZmlnKTsKICAgICBSZXN1bHQgcmV0dmFsOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRJbnB1dEJ1ZmZlclNpemUoCiAgICAgICAgICAgICBoaWRsQ29uZmlnLApAQCAtMjM0LDE2ICsxOTUsMjIgQEAKICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZVR5cGUsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIGlmIChzdGF0dXNfdCBzdGF0dXMgPSBDb3JlVXRpbHM6OmRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZVR5cGUsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KICAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICBpZiAoc3RhdHVzX3Qgc3RhdHVzID0gSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgZmFsc2UgLyppc0lucHV0Ki8sICZoaWRsQ29uZmlnKTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBDb3JlVXRpbHM6OkF1ZGlvT3V0cHV0RmxhZ3MgaGlkbEZsYWdzOworICAgIGlmIChzdGF0dXNfdCBzdGF0dXMgPSBDb3JlVXRpbHM6OmF1ZGlvT3V0cHV0RmxhZ3NGcm9tSGFsKGZsYWdzLCAmaGlkbEZsYWdzKTsgc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQogICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgIGhpZGxEZXZpY2UsCi0gICAgICAgICAgICBoaWRsQ29uZmlnLAotICAgICAgICAgICAgRW51bUJpdGZpZWxkPEF1ZGlvT3V0cHV0RmxhZz4oZmxhZ3MpLAorICAgICAgICAgICAgaGFuZGxlLCBoaWRsRGV2aWNlLCBoaWRsQ29uZmlnLCBoaWRsRmxhZ3MsCiAjaWYgTUFKT1JfVkVSU0lPTiA+PSA0CiAgICAgICAgICAgICB7fSAvKiBtZXRhZGF0YSAqLywKICNlbmRpZgpAQCAtMjY5LDM5ICsyMzYsNTQgQEAKICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgewogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIERldmljZUFkZHJlc3MgaGlkbERldmljZTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2VBZGRyZXNzRnJvbUhhbChkZXZpY2VzLCBhZGRyZXNzLCAmaGlkbERldmljZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoc3RhdHVzX3Qgc3RhdHVzID0gQ29yZVV0aWxzOjpkZXZpY2VBZGRyZXNzRnJvbUhhbChkZXZpY2VzLCBhZGRyZXNzLCAmaGlkbERldmljZSk7CisgICAgICAgICAgICBzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CiAgICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7CisgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsIHRydWUgLyppc0lucHV0Ki8sICZoaWRsQ29uZmlnKTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBDb3JlVXRpbHM6OkF1ZGlvSW5wdXRGbGFncyBoaWRsRmxhZ3M7CisjaWYgTUFKT1JfVkVSU0lPTiA8PSA1CisgICAgLy8gU29tZSBmbGFncyB3ZXJlIHNwZWNpZmljIHRvIGZyYW1ld29yayBhbmQgbXVzdCBub3QgbGVhayB0byB0aGUgSEFMLgorICAgIGZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD4oZmxhZ3MgJiB+QVVESU9fSU5QVVRfRkxBR19ESVJFQ1QpOworI2VuZGlmCisgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IENvcmVVdGlsczo6YXVkaW9JbnB1dEZsYWdzRnJvbUhhbChmbGFncywgJmhpZGxGbGFncyk7IHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KICAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CiAjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCiAgICAgYXV0byBzaW5rTWV0YWRhdGEgPSBBdWRpb1NvdXJjZShzb3VyY2UpOwogI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CiAgICAgLy8gVE9ETzogY29ycmVjdGx5IHByb3BhZ2F0ZSB0aGUgdHJhY2tzIHNvdXJjZXMgYW5kIHZvbHVtZQogICAgIC8vICAgICAgIGZvciBub3csIG9ubHkgc2VuZCB0aGUgbWFpbiBzb3VyY2UgYXQgMWRiZnMKLSAgICBTaW5rTWV0YWRhdGEgc2lua01ldGFkYXRhID0ge3t7IC5zb3VyY2UgPSBBdWRpb1NvdXJjZShzb3VyY2UpLCAuZ2FpbiA9IDEgfX19OworICAgIEF1ZGlvU291cmNlIGhpZGxTb3VyY2U7CisgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IEhpZGxVdGlsczo6YXVkaW9Tb3VyY2VGcm9tSGFsKHNvdXJjZSwgJmhpZGxTb3VyY2UpOyBzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgU2lua01ldGFkYXRhIHNpbmtNZXRhZGF0YSA9IHt7eyAuc291cmNlID0gc3RkOjptb3ZlKGhpZGxTb3VyY2UpLCAuZ2FpbiA9IDEgfX19OwogI2VuZGlmCiAjaWYgTUFKT1JfVkVSU0lPTiA8IDUKICAgICAodm9pZClvdXRwdXREZXZpY2U7CiAgICAgKHZvaWQpb3V0cHV0RGV2aWNlQWRkcmVzczsKICNlbHNlCisjaWYgTUFKT1JfVkVSU0lPTiA+PSA3CisgICAgKHZvaWQpSGlkbFV0aWxzOjphdWRpb0NoYW5uZWxNYXNrRnJvbUhhbCgKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfTk9ORSwgdHJ1ZSAvKmlzSW5wdXQqLywgJnNpbmtNZXRhZGF0YS50cmFja3NbMF0uY2hhbm5lbE1hc2spOworI2VuZGlmCiAgICAgaWYgKG91dHB1dERldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewogICAgICAgICBEZXZpY2VBZGRyZXNzIGhpZGxPdXRwdXREZXZpY2U7Ci0gICAgICAgIHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKG91dHB1dERldmljZSwgb3V0cHV0RGV2aWNlQWRkcmVzcywgJmhpZGxPdXRwdXREZXZpY2UpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgICAgICBpZiAoc3RhdHVzX3Qgc3RhdHVzID0gQ29yZVV0aWxzOjpkZXZpY2VBZGRyZXNzRnJvbUhhbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZSwgb3V0cHV0RGV2aWNlQWRkcmVzcywgJmhpZGxPdXRwdXREZXZpY2UpOyBzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KICAgICAgICAgc2lua01ldGFkYXRhLnRyYWNrc1swXS5kZXN0aW5hdGlvbi5kZXZpY2Uoc3RkOjptb3ZlKGhpZGxPdXRwdXREZXZpY2UpKTsKICAgICB9CiAjZW5kaWYKLSNpZiBNQUpPUl9WRVJTSU9OIDw9IDUKLSAgICAvLyBTb21lIGZsYWdzIHdlcmUgc3BlY2lmaWMgdG8gZnJhbWV3b3JrIGFuZCBtdXN0IG5vdCBsZWFrIHRvIHRoZSBIQUwuCi0gICAgZmxhZ3MgPSBzdGF0aWNfY2FzdDxhdWRpb19pbnB1dF9mbGFnc190PihmbGFncyAmIH5BVURJT19JTlBVVF9GTEFHX0RJUkVDVCk7Ci0jZW5kaWYKICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgaGFuZGxlLAotICAgICAgICAgICAgaGlkbERldmljZSwKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBFbnVtQml0ZmllbGQ8QXVkaW9JbnB1dEZsYWc+KGZsYWdzKSwKLSAgICAgICAgICAgIHNpbmtNZXRhZGF0YSwKKyAgICAgICAgICAgIGhhbmRsZSwgaGlkbERldmljZSwgaGlkbENvbmZpZywgaGlkbEZsYWdzLCBzaW5rTWV0YWRhdGEsCiAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1Jbj4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgewogICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CiAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CkBAIC0zNzIsNyArMzU0LDggQEAKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVsZWFzZUF1ZGlvUGF0Y2giLCBtRGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaCkpOwogfQogCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBIYWxQb3J0Pgorc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0QXVkaW9Qb3J0SW1wbChIYWxQb3J0ICpwb3J0KSB7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgQXVkaW9Qb3J0IGhpZGxQb3J0OwogICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0RnJvbUhhbCgqcG9ydCwgJmhpZGxQb3J0KTsKQEAgLTM4OCw2ICszNzEsMzAgQEAKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qb3J0IiwgcmV0LCByZXR2YWwpOwogfQogCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKKyAgICByZXR1cm4gZ2V0QXVkaW9Qb3J0SW1wbChwb3J0KTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KSB7CisjaWYgTUFKT1JfVkVSU0lPTiA+PSA3CisgICAgcmV0dXJuIGdldEF1ZGlvUG9ydEltcGwocG9ydCk7CisjZWxzZQorICAgIHN0cnVjdCBhdWRpb19wb3J0IGF1ZGlvUG9ydCA9IHt9OworICAgIHN0YXR1c190IHJlc3VsdCA9IE5PX0VSUk9SOworICAgIGlmICghYXVkaW9fcG9wdWxhdGVfYXVkaW9fcG9ydChwb3J0LCAmYXVkaW9Qb3J0KSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHBvcHVsYXRlIGxlZ2FjeSBhdWRpbyBwb3J0IGZyb20gYXVkaW9fcG9ydF92NyIpOworICAgICAgICByZXN1bHQgPSBCQURfVkFMVUU7CisgICAgfQorICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9ydCgmYXVkaW9Qb3J0KTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGF1ZGlvX3BvcHVsYXRlX2F1ZGlvX3BvcnRfdjcoJmF1ZGlvUG9ydCwgcG9ydCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworI2VuZGlmCit9CisKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgewogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIEF1ZGlvUG9ydENvbmZpZyBoaWRsQ29uZmlnOwpAQCAtNDExLDcgKzQxOCw3IEBACiAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbWljQXJyYXlIYWwuc2l6ZSgpOyBrKyspIHsKICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBkc3Q7CiAgICAgICAgICAgICAvL2NvbnZlcnQKLSAgICAgICAgICAgIG1pY3JvcGhvbmVJbmZvVG9IYWwobWljQXJyYXlIYWxba10sICZkc3QpOworICAgICAgICAgICAgKHZvaWQpQ29yZVV0aWxzOjptaWNyb3Bob25lSW5mb1RvSGFsKG1pY0FycmF5SGFsW2tdLCAmZHN0KTsKICAgICAgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKGRzdCk7CiAgICAgICAgICAgICBtaWNyb3Bob25lc0luZm8tPnB1c2hfYmFjayhtaWNyb3Bob25lKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaAppbmRleCBkMzQyZDRhLi4yYzg0N2NmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaApAQCAtMTA3LDYgKzEwNyw5IEBACiAgICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7CiAKKyAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KTsKKwogICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwogCkBAIC0xMjgsNiArMTMxLDggQEAKIAogICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCiAgICAgdmlydHVhbCB+RGV2aWNlSGFsSGlkbCgpOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbFBvcnQ+IHN0YXR1c190IGdldEF1ZGlvUG9ydEltcGwoSGFsUG9ydCAqcG9ydCk7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmNwcAppbmRleCA4MDIxZDkyLi5hZjdkYzFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmNwcApAQCAtMTgwLDYgKzE4MCwyMiBAQAogICAgIHJldHVybiBtRGV2LT5nZXRfYXVkaW9fcG9ydChtRGV2LCBwb3J0KTsKIH0KIAorc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkgeworI2lmIE1BSk9SX1ZFUlNJT04gPj0gNworICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICAvLyBnZXRfYXVkaW9fcG9ydF92NyBpcyBtYW5kYXRvcnkgaWYgbGVnYWN5IEhBTCBzdXBwb3J0IHRoaXMgQVBJIHZlcnNpb24uCisgICAgICAgIHJldHVybiBtRGV2LT5nZXRfYXVkaW9fcG9ydF92NyhtRGV2LCBwb3J0KTsKKyAgICB9CisjZW5kaWYKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydCBhdWRpb1BvcnQgPSB7fTsKKyAgICBhdWRpb19wb3B1bGF0ZV9hdWRpb19wb3J0KHBvcnQsICZhdWRpb1BvcnQpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9ydCgmYXVkaW9Qb3J0KTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGF1ZGlvX3BvcHVsYXRlX2F1ZGlvX3BvcnRfdjcoJmF1ZGlvUG9ydCwgcG9ydCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKIHN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKICAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApCiAgICAgICAgIHJldHVybiBtRGV2LT5zZXRfYXVkaW9fcG9ydF9jb25maWcobURldiwgY29uZmlnKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuaAppbmRleCBkODVlMmE3Li40NmI1MTBiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5oCkBAIC0xMDAsNiArMTAwLDkgQEAKICAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKIAorICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpOworCiAgICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKQEAgLTExNCw2ICsxMTcsOCBAQAogICAgIHZvaWQgY2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpOwogICAgIHZvaWQgY2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pOwogCisgICAgdWludDMyX3QgdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1EZXYtPmNvbW1vbi52ZXJzaW9uOyB9CisKICAgcHJpdmF0ZToKICAgICBhdWRpb19od19kZXZpY2VfdCAqbURldjsKIApAQCAtMTI0LDggKzEyOSw2IEBACiAKICAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgogICAgIHZpcnR1YWwgfkRldmljZUhhbExvY2FsKCk7Ci0KLSAgICB1aW50MzJfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbURldi0+Y29tbW9uLnZlcnNpb247IH0KIH07CiAKIH0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmNwcAppbmRleCBjYWY1NzVjLi5jNTg5YTQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5jcHAKQEAgLTIzLDEyICsyMywxMyBAQAogI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDx1dGlsL0VmZmVjdFV0aWxzLmg+CisKICNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCiAjaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkhpZGxVdGlsczsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OnV0aWxzOjpFbnVtQml0ZmllbGQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkVmZmVjdFV0aWxzOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwpAQCAtNDIsNiArNDMsMTAgQEAKIAogRWZmZWN0SGFsSGlkbDo6RWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCkKICAgICAgICAgOiBtRWZmZWN0KGVmZmVjdCksIG1FZmZlY3RJZChlZmZlY3RJZCksIG1CdWZmZXJzQ2hhbmdlZCh0cnVlKSwgbUVmR3JvdXAobnVsbHB0cikgeworICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgaGFsRGVzY3JpcHRvcnt9OworICAgIGlmIChFZmZlY3RIYWxIaWRsOjpnZXREZXNjcmlwdG9yKCZoYWxEZXNjcmlwdG9yKSA9PSBOT19FUlJPUikgeworICAgICAgICBtSXNJbnB1dCA9IChoYWxEZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQzsKKyAgICB9CiB9CiAKIEVmZmVjdEhhbEhpZGw6On5FZmZlY3RIYWxIaWRsKCkgewpAQCAtNTYsNTkgKzYxLDYgQEAKIH0KIAogLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbCgKLSAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcikgewotICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudHlwZSwgJmhhbERlc2NyaXB0b3ItPnR5cGUpOwotICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudXVpZCwgJmhhbERlc2NyaXB0b3ItPnV1aWQpOwotICAgIGhhbERlc2NyaXB0b3ItPmZsYWdzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRlc2NyaXB0b3IuZmxhZ3MpOwotICAgIGhhbERlc2NyaXB0b3ItPmNwdUxvYWQgPSBkZXNjcmlwdG9yLmNwdUxvYWQ7Ci0gICAgaGFsRGVzY3JpcHRvci0+bWVtb3J5VXNhZ2UgPSBkZXNjcmlwdG9yLm1lbW9yeVVzYWdlOwotICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5uYW1lLCBkZXNjcmlwdG9yLm5hbWUuZGF0YSgpLCBkZXNjcmlwdG9yLm5hbWUuc2l6ZSgpKTsKLSAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+aW1wbGVtZW50b3IsCi0gICAgICAgICAgICBkZXNjcmlwdG9yLmltcGxlbWVudG9yLmRhdGEoKSwgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5zaXplKCkpOwotfQotCi0vLyBUT0RPKG1uYWdhbm92KTogVGhlc2UgYnVmZmVyIGNvbnZlcnNpb24gZnVuY3Rpb25zIHNob3VsZCBiZSBzaGFyZWQgd2l0aCBFZmZlY3Qgd3JhcHBlcgotLy8gdmlhIEhpZGxVdGlscy4gTW92ZSB0aGVtIHRoZXJlIHdoZW4gaGFyZHdhcmUvaW50ZXJmYWNlcyB3aWxsIGdldCB1bi1mcm96ZW4gYWdhaW4uCi0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAotICAgICAgICBjb25zdCBidWZmZXJfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0QnVmZmVyQ29uZmlnKiBjb25maWcpIHsKLSAgICBjb25maWctPnNhbXBsaW5nUmF0ZUh6ID0gaGFsQ29uZmlnLnNhbXBsaW5nUmF0ZTsKLSAgICBjb25maWctPmNoYW5uZWxzID0gRW51bUJpdGZpZWxkPEF1ZGlvQ2hhbm5lbE1hc2s+KGhhbENvbmZpZy5jaGFubmVscyk7Ci0gICAgY29uZmlnLT5mb3JtYXQgPSBBdWRpb0Zvcm1hdChoYWxDb25maWcuZm9ybWF0KTsKLSAgICBjb25maWctPmFjY2Vzc01vZGUgPSBFZmZlY3RCdWZmZXJBY2Nlc3MoaGFsQ29uZmlnLmFjY2Vzc01vZGUpOwotICAgIGNvbmZpZy0+bWFzayA9IEVudW1CaXRmaWVsZDxFZmZlY3RDb25maWdQYXJhbWV0ZXJzPihoYWxDb25maWcubWFzayk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKLSAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKSB7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIuZnJhbWVDb3VudCA9IDA7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIucmF3ID0gTlVMTDsKLSAgICBoYWxDb25maWctPnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGluZ1JhdGVIejsKLSAgICBoYWxDb25maWctPmNoYW5uZWxzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbmZpZy5jaGFubmVscyk7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKLSAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+Zm9ybWF0ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmZvcm1hdCk7Ci0gICAgaGFsQ29uZmlnLT5hY2Nlc3NNb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmFjY2Vzc01vZGUpOwotICAgIGhhbENvbmZpZy0+bWFzayA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5tYXNrKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKSB7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcuaW5wdXRDZmcsICZjb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5vdXRwdXRDZmcsICZjb25maWctPm91dHB1dENmZyk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpIHsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcuaW5wdXRDZmcsICZoYWxDb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcub3V0cHV0Q2ZnLCAmaGFsQ29uZmlnLT5vdXRwdXRDZmcpOwotfQotCi0vLyBzdGF0aWMKIHN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKICAgICBzd2l0Y2ggKHJlc3VsdCkgewogICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKQEAgLTI2OSw3ICsyMjEsNyBAQAogICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwogICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgIEVmZmVjdFV0aWxzOjplZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSk7CiAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047CkBAIC0zMDEsMTQgKzI1MywxNiBAQAogICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWcoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7CiAgICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOwogICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKKyAgICAgICAgICAgICAgICBFZmZlY3RVdGlsczo6ZWZmZWN0Q29uZmlnVG9IYWwoCisgICAgICAgICAgICAgICAgICAgICAgICBoaWRsQ29uZmlnLCBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwUmVwbHlEYXRhKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldCA9IG1FZmZlY3QtPmdldENvbmZpZ1JldmVyc2UoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7CiAgICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOwogICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKKyAgICAgICAgICAgICAgICBFZmZlY3RVdGlsczo6ZWZmZWN0Q29uZmlnVG9IYWwoCisgICAgICAgICAgICAgICAgICAgICAgICBoaWRsQ29uZmlnLCBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwUmVwbHlEYXRhKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogICAgIH0KQEAgLTMzMiw3ICsyODYsNyBAQAogICAgICAgICBBTE9HRSgiQnVmZmVyIHByb3ZpZGVyIGNhbGxiYWNrcyBhcmUgbm90IHN1cHBvcnRlZCIpOwogICAgIH0KICAgICBFZmZlY3RDb25maWcgaGlkbENvbmZpZzsKLSAgICBlZmZlY3RDb25maWdGcm9tSGFsKCpoYWxDb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICBFZmZlY3RVdGlsczo6ZWZmZWN0Q29uZmlnRnJvbUhhbCgqaGFsQ29uZmlnLCBtSXNJbnB1dCwgJmhpZGxDb25maWcpOwogICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHID8KICAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZyhoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKSA6CiAgICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWdSZXZlcnNlKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuaAppbmRleCAxZjIzOGMwLi44ZTQ2NjM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuaApAQCAtNjUsOSArNjUsNiBAQAogCiAgICAgdWludDY0X3QgZWZmZWN0SWQoKSBjb25zdCB7IHJldHVybiBtRWZmZWN0SWQ7IH0KIAotICAgIHN0YXRpYyB2b2lkIGVmZmVjdERlc2NyaXB0b3JUb0hhbCgKLSAgICAgICAgICAgIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIGhhbERlc2NyaXB0b3IpOwotCiAgIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbDsKICAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZXN1bHQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKQEAgLTc5LDE0ICs3Niw5IEBACiAgICAgYm9vbCBtQnVmZmVyc0NoYW5nZWQ7CiAgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7CiAgICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKKyAgICBib29sIG1Jc0lucHV0ID0gZmFsc2U7CiAKICAgICBzdGF0aWMgc3RhdHVzX3QgYW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKLSAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCi0gICAgICAgICAgICBjb25zdCBFZmZlY3RCdWZmZXJDb25maWcmIGNvbmZpZywgYnVmZmVyX2NvbmZpZ190KiBoYWxDb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpOwogCiAgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgogICAgIEVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCmluZGV4IDkxOTJhMzEuLjhkMTU1OTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKQEAgLTE5LDEzICsxOSwxNiBAQAogCiAjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KIAorI2luY2x1ZGUgPFV1aWRVdGlscy5oPgorI2luY2x1ZGUgPHV0aWwvRWZmZWN0VXRpbHMuaD4KKwogI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCiAjaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgogI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKICNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwuaCIKLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT046OmltcGxlbWVudGF0aW9uOjpIaWRsVXRpbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OlV1aWRVdGlsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6RWZmZWN0VXRpbHM7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTc2LDcgKzc5LDcgQEAKICAgICAgICAgaWYgKHF1ZXJ5UmVzdWx0ICE9IE9LKSByZXR1cm4gcXVlcnlSZXN1bHQ7CiAgICAgfQogICAgIGlmIChpbmRleCA+PSBtTGFzdERlc2NyaXB0b3JzLnNpemUoKSkgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChtTGFzdERlc2NyaXB0b3JzW2luZGV4XSwgcERlc2NyaXB0b3IpOworICAgIEVmZmVjdFV0aWxzOjplZmZlY3REZXNjcmlwdG9yVG9IYWwobUxhc3REZXNjcmlwdG9yc1tpbmRleF0sIHBEZXNjcmlwdG9yKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTg1LDEzICs4OCwxMyBAQAogICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCiAgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBVdWlkIGhpZGxVdWlkOwotICAgIEhpZGxVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOworICAgIFV1aWRVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOwogICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5nZXREZXNjcmlwdG9yKGhpZGxVdWlkLAogICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwogICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgIEVmZmVjdFV0aWxzOjplZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSk7CiAgICAgaWYgKHJldC5pc09rKCkpIHsKQEAgLTEwNyw3ICsxMTAsNyBAQAogICAgICAgICBpbnQzMl90IGRldmljZUlkIF9fdW51c2VkLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpIHsKICAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwogICAgIFV1aWQgaGlkbFV1aWQ7Ci0gICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7CisgICAgVXVpZFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7CiAgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwogICAgIFJldHVybjx2b2lkPiByZXQ7CiAjaWYgTUFKT1JfVkVSU0lPTiA+PSA2CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1ZlcnNpb25VdGlscy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9QYXJhbWV0ZXJVdGlscy5oCnNpbWlsYXJpdHkgaW5kZXggOTElCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvVmVyc2lvblV0aWxzLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvUGFyYW1ldGVyVXRpbHMuaAppbmRleCBlYjBhNDJhLi45Y2FiNzJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1ZlcnNpb25VdGlscy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvUGFyYW1ldGVyVXRpbHMuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDggKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTX0gKKyNwcmFnbWEgb25jZQogCiAjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL3R5cGVzLmgpCiAjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgpAQCAtNTksNSArNTgsMyBAQAogfSAvLyBuYW1lc3BhY2UgdXRpbHMKIH0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5jcHAKaW5kZXggMjcyNmUzNi4uZjRhNGZlMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuY3BwCkBAIC0xNywxNyArMTcsMjMgQEAKICNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsSGlkbCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JU3RyZWFtT3V0Q2FsbGJhY2suaCkKKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjAvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JU3RyZWFtT3V0Q2FsbGJhY2suaCkKKyNpbmNsdWRlIDxIaWRsVXRpbHMuaD4KKyNpbmNsdWRlIDx1dGlsL0NvcmVVdGlscy5oPgorCiAjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgogI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKKyNpbmNsdWRlICJQYXJhbWV0ZXJVdGlscy5oIgogI2luY2x1ZGUgIlN0cmVhbUhhbEhpZGwuaCIKLSNpbmNsdWRlICJWZXJzaW9uVXRpbHMuaCIKIAordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT046OmltcGxlbWVudGF0aW9uOjpIaWRsVXRpbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OmltcGxlbWVudGF0aW9uOjpDb3JlVXRpbHM7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKQEAgLTQ5LDE0ICs1NSwxMCBAQAogCiAgICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KICAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgotICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgLyogJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpICovKSB7Ci0gICAgICAgIC8vIE9idGFpbiBhdWRpbyBwcm9wZXJ0aWVzIChzZWUgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKCkgYmVsb3cpLgotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgICAgIFsmXShhdXRvIHNyLCBhdXRvIG0sIGF1dG8gZikgewotICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKLSAgICAgICAgICAgIH0pOworICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0JBU0VfSU5JVElBTElaRVI7CisgICAgaWYgKC8qIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSAmJiAqLworICAgICAgICBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoJmNvbmZpZykgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQoY29uZmlnLnNhbXBsZV9yYXRlLCBjb25maWcuY2hhbm5lbF9tYXNrLCBjb25maWcuZm9ybWF0KTsKICAgICB9CiB9CiAKQEAgLTY0LDExICs2Niw2IEBACiAgICAgbVN0cmVhbSA9IG51bGxwdHI7CiB9CiAKLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRTYW1wbGVSYXRlIiwgbVN0cmVhbS0+Z2V0U2FtcGxlUmF0ZSgpLCByYXRlKTsKLX0KLQogc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKICAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwogICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oImdldEJ1ZmZlclNpemUiLCBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCksIHNpemUpOwpAQCAtNzgsMjYgKzc1LDMzIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcyhhdWRpb19jb25maWdfYmFzZV90ICpjb25maWdCYXNlKSB7CisgICAgKmNvbmZpZ0Jhc2UgPSBBVURJT19DT05GSUdfQkFTRV9JTklUSUFMSVpFUjsKICAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDaGFubmVsTWFzayIsIG1TdHJlYW0tPmdldENoYW5uZWxNYXNrKCksIG1hc2spOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZvcm1hdCIsIG1TdHJlYW0tPmdldEZvcm1hdCgpLCBmb3JtYXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisjaWYgTUFKT1JfVkVSU0lPTiA8PSA2CiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKICAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgYXV0byBtLCBhdXRvIGYpIHsKLSAgICAgICAgICAgICAgICAqc2FtcGxlUmF0ZSA9IHNyOwotICAgICAgICAgICAgICAgICptYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pOwotICAgICAgICAgICAgICAgICpmb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZik7CisgICAgICAgICAgICAgICAgY29uZmlnQmFzZS0+c2FtcGxlX3JhdGUgPSBzcjsKKyAgICAgICAgICAgICAgICBjb25maWdCYXNlLT5jaGFubmVsX21hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obSk7CisgICAgICAgICAgICAgICAgY29uZmlnQmFzZS0+Zm9ybWF0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpOwogICAgICAgICAgICAgfSk7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUHJvcGVydGllcyIsIHJldCk7CisjZWxzZQorICAgIFJlc3VsdCByZXR2YWw7CisgICAgc3RhdHVzX3QgY29udmVyc2lvblN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBBdWRpb0NvbmZpZ0Jhc2UmIGNvbmZpZykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25TdGF0dXMgPSBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnQmFzZVRvSGFsKGNvbmZpZywgY29uZmlnQmFzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUHJvcGVydGllcyIsIHJldCwgcmV0dmFsKTsgc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBjb252ZXJzaW9uU3RhdHVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorI2VuZGlmCiB9CiAKIHN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewpAQCAtMjI1LDYgKzIyOSwyNCBAQAogICAgIHJldHVybiBnZXRCdWZmZXJTaXplKHNpemUpOwogfQogCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRIYWxQaWQocGlkX3QgKnBpZCkgeworICAgIHVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6RGVidWdJbmZvOworICAgIHVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6bWFuYWdlcjo6VjFfMDo6SVNlcnZpY2VNYW5hZ2VyOworCisgICAgRGVidWdJbmZvIGRlYnVnSW5mbzsKKyAgICBhdXRvIHJldCA9IG1TdHJlYW0tPmdldERlYnVnSW5mbyhbJl0gKGNvbnN0IGF1dG8gJmluZm8pIHsKKyAgICAgICAgZGVidWdJbmZvID0gaW5mbzsKKyAgICB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBpZiAoZGVidWdJbmZvLnBpZCAhPSAoaW50KUlTZXJ2aWNlTWFuYWdlcjo6UGlkQ29uc3RhbnQ6Ok5PX1BJRCkgeworICAgICAgICAqcGlkID0gZGVidWdJbmZvLnBpZDsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Cit9CisKIGJvb2wgU3RyZWFtSGFsSGlkbDo6cmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpIHsKICAgICBpZiAobUhhbFRocmVhZFByaW9yaXR5ID09IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTQ1Myw3ICs0NzUsNyBAQAogICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvJiBoYWxUaHJlYWRJbmZvKSB7CiAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKICAgICAgICAgICAgICAgICAgICAgdGVtcENvbW1hbmRNUS5yZXNldChuZXcgQ29tbWFuZE1RKGNvbW1hbmRNUSkpOwpAQCAtNDYyLDggKzQ4NCwxMiBAQAogICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOwogICAgICAgICAgICAgICAgICAgICB9CisjaWYgTUFKT1JfVkVSU0lPTiA8PSA2CiAgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOwogICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm87CisjZW5kaWYKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9KTsKICAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKQEAgLTQ4NCw2ICs1MTAsMTEgQEAKICAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3Igd3JpdGluZyBmYWlsZWQiKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorI2lmIE1BSk9SX1ZFUlNJT04gPj0gNworICAgIGlmIChzdGF0dXNfdCBzdGF0dXMgPSBnZXRIYWxQaWQoJmhhbFRocmVhZFBpZCk7IHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyNlbmRpZgogICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7CiAKICAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOwpAQCAtNTk3LDMxICs2MjgsNDUgQEAKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKLS8qKiBUcmFuc2Zvcm0gYSBzdGFuZGFyZCBjb2xsZWN0aW9uIHRvIGFuIEhJREwgdmVjdG9yLiAqLwotdGVtcGxhdGUgPGNsYXNzIFZhbHVlcywgY2xhc3MgRWxlbWVudENvbnZlcnRlcj4KLXN0YXRpYyBhdXRvIHRyYW5zZm9ybVRvSGlkbFZlYyhjb25zdCBWYWx1ZXMmIHZhbHVlcywgRWxlbWVudENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLSAgICBoaWRsX3ZlYzxkZWNsdHlwZShjb252ZXJ0ZXIoKnZhbHVlcy5iZWdpbigpKSk+IHJlc3VsdHt2YWx1ZXMuc2l6ZSgpfTsKLSAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwotICAgIHRyYW5zZm9ybShiZWdpbih2YWx1ZXMpLCBlbmQodmFsdWVzKSwgYmVnaW4ocmVzdWx0KSwgY29udmVydGVyKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YSgKICAgICAgICAgY29uc3QgU3RyZWFtT3V0SGFsSW50ZXJmYWNlOjpTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKLSAgICBDUFBfVkVSU0lPTjo6U291cmNlTWV0YWRhdGEgaGFsTWV0YWRhdGEgPSB7Ci0gICAgICAgIC50cmFja3MgPSB0cmFuc2Zvcm1Ub0hpZGxWZWMoc291cmNlTWV0YWRhdGEudHJhY2tzLAotICAgICAgICAgICAgICBbXShjb25zdCBwbGF5YmFja190cmFja19tZXRhZGF0YSYgbWV0YWRhdGEpIC0+IFBsYXliYWNrVHJhY2tNZXRhZGF0YSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gewotICAgICAgICAgICAgICAgICAgICAudXNhZ2U9c3RhdGljX2Nhc3Q8QXVkaW9Vc2FnZT4obWV0YWRhdGEudXNhZ2UpLAotICAgICAgICAgICAgICAgICAgICAuY29udGVudFR5cGU9c3RhdGljX2Nhc3Q8QXVkaW9Db250ZW50VHlwZT4obWV0YWRhdGEuY29udGVudF90eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgLmdhaW49bWV0YWRhdGEuZ2FpbiwKLSAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgIH0pfTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigidXBkYXRlU291cmNlTWV0YWRhdGEiLCBtU3RyZWFtLT51cGRhdGVTb3VyY2VNZXRhZGF0YShoYWxNZXRhZGF0YSkpOworICAgIENQUF9WRVJTSU9OOjpTb3VyY2VNZXRhZGF0YSBoaWRsTWV0YWRhdGE7CisgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IENvcmVVdGlsczo6c291cmNlTWV0YWRhdGFGcm9tSGFsVjcoCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZU1ldGFkYXRhLnRyYWNrcywgdHJ1ZSAvKmlnbm9yZU5vblZlbmRvclRhZ3MqLywgJmhpZGxNZXRhZGF0YSk7CisgICAgICAgICAgICBzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInVwZGF0ZVNvdXJjZU1ldGFkYXRhIiwgbVN0cmVhbS0+dXBkYXRlU291cmNlTWV0YWRhdGEoaGlkbE1ldGFkYXRhKSk7CiB9CiAjZW5kaWYKIAogI2lmIE1BSk9SX1ZFUlNJT04gPCA2CitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCogbW9kZSBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0RHVhbE1vbm9Nb2RlKGF1ZGlvX2R1YWxfbW9ub19tb2RlX3QgbW9kZSBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0KiBsZXZlbGRCIF9fdW51c2VkKSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQgbGV2ZWxkQiBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycygKKyAgICAgICAgYXVkaW9fcGxheWJhY2tfcmF0ZV90KiBwbGF5YmFja1JhdGUgX191bnVzZWQpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BsYXliYWNrX3JhdGVfdCYgcGxheWJhY2tSYXRlIF9fdW51c2VkKSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRFdmVudENhbGxiYWNrKAogICAgICAgICBjb25zdCBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VFdmVudENhbGxiYWNrPiYgY2FsbGJhY2sgX191bnVzZWQpIHsKICAgICAvLyBDb2RlYyBmb3JtYXQgY2FsbGJhY2sgaXMgc3VwcG9ydGVkIHN0YXJ0aW5nIGZyb20gYXVkaW8gSEFMIFY2LjAKQEAgLTYyOSw2ICs2NzQsNzMgQEAKIH0KICNlbHNlCiAKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldER1YWxNb25vTW9kZShhdWRpb19kdWFsX21vbm9fbW9kZV90KiBtb2RlKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0RHVhbE1vbm9Nb2RlKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBEdWFsTW9ub01vZGUgaGlkbE1vZGUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqbW9kZSA9IHN0YXRpY19jYXN0PGF1ZGlvX2R1YWxfbW9ub19tb2RlX3Q+KGhpZGxNb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0RHVhbE1vbm9Nb2RlIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCBtb2RlKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oCisgICAgICAgICAgICAic2V0RHVhbE1vbm9Nb2RlIiwgbVN0cmVhbS0+c2V0RHVhbE1vbm9Nb2RlKHN0YXRpY19jYXN0PER1YWxNb25vTW9kZT4obW9kZSkpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0KiBsZXZlbGRCKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBmbG9hdCBoaWRsTGV2ZWxkQikgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpsZXZlbGRCID0gaGlkbExldmVsZEI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbCIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0IGxldmVsZEIpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigKKyAgICAgICAgICAgICJzZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwiLCBtU3RyZWFtLT5zZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwobGV2ZWxkQikpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKGF1ZGlvX3BsYXliYWNrX3JhdGVfdCogcGxheWJhY2tSYXRlKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycygKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgUGxheWJhY2tSYXRlIGhpZGxQbGF5YmFja1JhdGUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUtPm1TcGVlZCA9IGhpZGxQbGF5YmFja1JhdGUuc3BlZWQ7CisgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS0+bVBpdGNoID0gaGlkbFBsYXliYWNrUmF0ZS5waXRjaDsKKyAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlLT5tU3RyZXRjaE1vZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fdGltZXN0cmV0Y2hfc3RyZXRjaF9tb2RlX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxQbGF5YmFja1JhdGUudGltZXN0cmV0Y2hNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlLT5tRmFsbGJhY2tNb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX3RpbWVzdHJldGNoX2ZhbGxiYWNrX21vZGVfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbFBsYXliYWNrUmF0ZS5mYWxsYmFja01vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKGNvbnN0IGF1ZGlvX3BsYXliYWNrX3JhdGVfdCYgcGxheWJhY2tSYXRlKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oCisgICAgICAgICAgICAic2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycyIsIG1TdHJlYW0tPnNldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoCisgICAgICAgICAgICAgICAgUGxheWJhY2tSYXRle3BsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gsCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFRpbWVzdHJldGNoTW9kZT4ocGxheWJhY2tSYXRlLm1TdHJldGNoTW9kZSksCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFRpbWVzdHJldGNoRmFsbGJhY2tNb2RlPihwbGF5YmFja1JhdGUubUZhbGxiYWNrTW9kZSl9KSk7Cit9CisKICNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbU91dEV2ZW50Q2FsbGJhY2suaCkKIAogbmFtZXNwYWNlIHsKQEAgLTc5Nyw3ICs5MDksNyBAQAogICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvJiBoYWxUaHJlYWRJbmZvKSB7CiAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKICAgICAgICAgICAgICAgICAgICAgdGVtcENvbW1hbmRNUS5yZXNldChuZXcgQ29tbWFuZE1RKGNvbW1hbmRNUSkpOwpAQCAtODA2LDggKzkxOCwxMiBAQAogICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOwogICAgICAgICAgICAgICAgICAgICB9CisjaWYgTUFKT1JfVkVSU0lPTiA8PSA2CiAgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOwogICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm87CisjZW5kaWYKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9KTsKICAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKQEAgLTgyOCw2ICs5NDQsMTEgQEAKICAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgcmVhZGluZyBmYWlsZWQiKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorI2lmIE1BSk9SX1ZFUlNJT04gPj0gNworICAgIGlmIChzdGF0dXNfdCBzdGF0dXMgPSBnZXRIYWxQaWQoJmhhbFRocmVhZFBpZCk7IHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyNlbmRpZgogICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7CiAKICAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOwpAQCAtODkwLDcgKzEwMTEsNyBAQAogICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IG1pY0FycmF5SGFsLnNpemUoKTsgaysrKSB7CiAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgZHN0OwogICAgICAgICAgICAgLy8gY29udmVydAotICAgICAgICAgICAgbWljcm9waG9uZUluZm9Ub0hhbChtaWNBcnJheUhhbFtrXSwgJmRzdCk7CisgICAgICAgICAgICAodm9pZClDb3JlVXRpbHM6Om1pY3JvcGhvbmVJbmZvVG9IYWwobWljQXJyYXlIYWxba10sICZkc3QpOwogICAgICAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmUgPSBtZWRpYTo6TWljcm9waG9uZUluZm8oZHN0KTsKICAgICAgICAgICAgIG1pY3JvcGhvbmVzSW5mby0+cHVzaF9iYWNrKG1pY3JvcGhvbmUpOwogICAgICAgICB9CkBAIC05MDAsMTUgKzEwMjEsMTMgQEAKIAogc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjp1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QKICAgICAgICAgU3RyZWFtSW5IYWxJbnRlcmZhY2U6OlNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7Ci0gICAgQ1BQX1ZFUlNJT046OlNpbmtNZXRhZGF0YSBoYWxNZXRhZGF0YSA9IHsKLSAgICAgICAgLnRyYWNrcyA9IHRyYW5zZm9ybVRvSGlkbFZlYyhzaW5rTWV0YWRhdGEudHJhY2tzLAotICAgICAgICAgICAgICBbXShjb25zdCByZWNvcmRfdHJhY2tfbWV0YWRhdGEmIG1ldGFkYXRhKSAtPiBSZWNvcmRUcmFja01ldGFkYXRhIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiB7Ci0gICAgICAgICAgICAgICAgICAgIC5zb3VyY2U9c3RhdGljX2Nhc3Q8QXVkaW9Tb3VyY2U+KG1ldGFkYXRhLnNvdXJjZSksCi0gICAgICAgICAgICAgICAgICAgIC5nYWluPW1ldGFkYXRhLmdhaW4sCi0gICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICB9KX07Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInVwZGF0ZVNpbmtNZXRhZGF0YSIsIG1TdHJlYW0tPnVwZGF0ZVNpbmtNZXRhZGF0YShoYWxNZXRhZGF0YSkpOworICAgIENQUF9WRVJTSU9OOjpTaW5rTWV0YWRhdGEgaGlkbE1ldGFkYXRhOworICAgIGlmIChzdGF0dXNfdCBzdGF0dXMgPSBDb3JlVXRpbHM6OnNpbmtNZXRhZGF0YUZyb21IYWxWNygKKyAgICAgICAgICAgICAgICAgICAgc2lua01ldGFkYXRhLnRyYWNrcywgdHJ1ZSAvKmlnbm9yZU5vblZlbmRvclRhZ3MqLywgJmhpZGxNZXRhZGF0YSk7CisgICAgICAgICAgICBzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInVwZGF0ZVNpbmtNZXRhZGF0YSIsIG1TdHJlYW0tPnVwZGF0ZVNpbmtNZXRhZGF0YShoaWRsTWV0YWRhdGEpKTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oCmluZGV4IDg4Zjg1ODcuLmQ0MGZhN2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oCkBAIC00OCwyMSArNDgsMTQgQEAKIGNsYXNzIFN0cmVhbUhhbEhpZGwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAogewogICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7Ci0KICAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwogCi0gICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworICAgIC8vIFJldHVybiB0aGUgYmFzZSBjb25maWd1cmF0aW9uIG9mIHRoZSBzdHJlYW06CisgICAgLy8gICAtIGNoYW5uZWwgbWFzazsKKyAgICAvLyAgIC0gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICAvLyAgIC0gc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcyhhdWRpb19jb25maWdfYmFzZV90ICpjb25maWdCYXNlKTsKIAogICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CkBAIC0xMDUsNiArOTgsOCBAQAogCiAgICAgc3RhdHVzX3QgZ2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwogCisgICAgc3RhdHVzX3QgZ2V0SGFsUGlkKHBpZF90ICpwaWQpOworCiAgICAgYm9vbCByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCk7CiAKICAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCkBAIC0xNzMsNiArMTY4LDI0IEBACiAgICAgdm9pZCBvbkRyYWluUmVhZHkoKTsKICAgICB2b2lkIG9uRXJyb3IoKTsKIAorICAgIC8vIFJldHVybnMgdGhlIER1YWwgTW9ubyBtb2RlIHByZXNlbnRhdGlvbiBzZXR0aW5nLgorICAgIHN0YXR1c190IGdldER1YWxNb25vTW9kZShhdWRpb19kdWFsX21vbm9fbW9kZV90KiBtb2RlKSBvdmVycmlkZTsKKworICAgIC8vIFNldHMgdGhlIER1YWwgTW9ubyBtb2RlIHByZXNlbnRhdGlvbiBvbiB0aGUgb3V0cHV0IGRldmljZS4KKyAgICBzdGF0dXNfdCBzZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCBtb2RlKSBvdmVycmlkZTsKKworICAgIC8vIFJldHVybnMgdGhlIEF1ZGlvIERlc2NyaXB0aW9uIE1peCBsZXZlbCBpbiBkQi4KKyAgICBzdGF0dXNfdCBnZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQqIGxldmVsZEIpIG92ZXJyaWRlOworCisgICAgLy8gU2V0cyB0aGUgQXVkaW8gRGVzY3JpcHRpb24gTWl4IGxldmVsIGluIGRCLgorICAgIHN0YXR1c190IHNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCBsZXZlbGRCKSBvdmVycmlkZTsKKworICAgIC8vIFJldHJpZXZlcyBjdXJyZW50IHBsYXliYWNrIHJhdGUgcGFyYW1ldGVycy4KKyAgICBzdGF0dXNfdCBnZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKGF1ZGlvX3BsYXliYWNrX3JhdGVfdCogcGxheWJhY2tSYXRlKSBvdmVycmlkZTsKKworICAgIC8vIFNldHMgdGhlIHBsYXliYWNrIHJhdGUgcGFyYW1ldGVycyB0aGF0IGNvbnRyb2wgcGxheWJhY2sgYmVoYXZpb3IuCisgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycyhjb25zdCBhdWRpb19wbGF5YmFja19yYXRlX3QmIHBsYXliYWNrUmF0ZSkgb3ZlcnJpZGU7CisKICAgICBzdGF0dXNfdCBzZXRFdmVudENhbGxiYWNrKGNvbnN0IHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUV2ZW50Q2FsbGJhY2s+JiBjYWxsYmFjaykgb3ZlcnJpZGU7CiAKICAgICAvLyBNZXRob2RzIHVzZWQgYnkgU3RyZWFtQ29kZWNGb3JtYXRDYWxsYmFjayAoSElETCkuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuY3BwCmluZGV4IDY5YmUzMDMuLjM0YmQ1ZGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuY3BwCkBAIC0xNywxMyArMTcsMTQgQEAKICNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsTG9jYWwiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9NZXRhZGF0YS5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCisjaW5jbHVkZSAiUGFyYW1ldGVyVXRpbHMuaCIKICNpbmNsdWRlICJTdHJlYW1IYWxMb2NhbC5oIgotI2luY2x1ZGUgIlZlcnNpb25VdGlscy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewpAQCAtNDUsMzEgKzQ2LDE1IEBACiAgICAgbURldmljZS5jbGVhcigpOwogfQogCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgewotICAgICpyYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQogc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7CiAgICAgKnNpemUgPSBtU3RyZWFtLT5nZXRfYnVmZmVyX3NpemUobVN0cmVhbSk7CiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKLSAgICAqbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7Ci0gICAgKnNhbXBsZVJhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7Ci0gICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7Ci0gICAgKmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7CitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZ0Jhc2UpIHsKKyAgICBjb25maWdCYXNlLT5zYW1wbGVfcmF0ZSA9IG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKTsKKyAgICBjb25maWdCYXNlLT5jaGFubmVsX21hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7CisgICAgY29uZmlnQmFzZS0+Zm9ybWF0ID0gbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTI0MSwxOSArMjI2LDU1IEBACiAgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lc3RhbXApOwogfQogCit2b2lkIFN0cmVhbU91dEhhbExvY2FsOjpkb1VwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgeworICAgIHN0ZDo6dmVjdG9yPHBsYXliYWNrX3RyYWNrX21ldGFkYXRhPiBoYWxUcmFja3M7CisgICAgaGFsVHJhY2tzLnJlc2VydmUoc291cmNlTWV0YWRhdGEudHJhY2tzLnNpemUoKSk7CisgICAgZm9yIChhdXRvJiBtZXRhZGF0YSA6IHNvdXJjZU1ldGFkYXRhLnRyYWNrcykgeworICAgICAgICBwbGF5YmFja190cmFja19tZXRhZGF0YSBoYWxUcmFja01ldGFkYXRhOworICAgICAgICBwbGF5YmFja190cmFja19tZXRhZGF0YV9mcm9tX3Y3KCZoYWxUcmFja01ldGFkYXRhLCAmbWV0YWRhdGEpOworICAgICAgICBoYWxUcmFja3MucHVzaF9iYWNrKGhhbFRyYWNrTWV0YWRhdGEpOworICAgIH0KKyAgICBjb25zdCBzb3VyY2VfbWV0YWRhdGFfdCBoYWxNZXRhZGF0YSA9IHsKKyAgICAgICAgLnRyYWNrX2NvdW50ID0gaGFsVHJhY2tzLnNpemUoKSwKKyAgICAgICAgLnRyYWNrcyA9IGhhbFRyYWNrcy5kYXRhKCksCisgICAgfTsKKyAgICBtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhKG1TdHJlYW0sICZoYWxNZXRhZGF0YSk7Cit9CisKKyNpZiBNQUpPUl9WRVJTSU9OID49IDcKK3ZvaWQgU3RyZWFtT3V0SGFsTG9jYWw6OmRvVXBkYXRlU291cmNlTWV0YWRhdGFWNyhjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKKyAgICBjb25zdCBzb3VyY2VfbWV0YWRhdGFfdjdfdCBtZXRhZGF0YSB7CisgICAgICAgIC50cmFja19jb3VudCA9IHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5zaXplKCksCisgICAgICAgIC8vIGNvbnN0IGNhc3QgaXMgZmluZSBhcyBpdCBpcyBpbiBhIGNvbnN0IHN0cnVjdHVyZQorICAgICAgICAudHJhY2tzID0gY29uc3RfY2FzdDxwbGF5YmFja190cmFja19tZXRhZGF0YV92Nyo+KHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAorICAgIH07CisgICAgbVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YV92NyhtU3RyZWFtLCAmbWV0YWRhdGEpOworfQorI2VuZGlmCisKIHN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKKyNpZiBNQUpPUl9WRVJTSU9OIDwgNwogICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBjb25zdCBzb3VyY2VfbWV0YWRhdGFfdCBtZXRhZGF0YSB7Ci0gICAgICAgIC50cmFja19jb3VudCA9IHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5zaXplKCksCi0gICAgICAgIC8vIGNvbnN0IGNhc3QgaXMgZmluZSBhcyBpdCBpcyBpbiBhIGNvbnN0IHN0cnVjdHVyZQotICAgICAgICAudHJhY2tzID0gY29uc3RfY2FzdDxwbGF5YmFja190cmFja19tZXRhZGF0YSo+KHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAotICAgIH07Ci0gICAgbVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YShtU3RyZWFtLCAmbWV0YWRhdGEpOworICAgIGRvVXBkYXRlU291cmNlTWV0YWRhdGEoc291cmNlTWV0YWRhdGEpOworI2Vsc2UKKyAgICBpZiAobURldmljZS0+dmVyc2lvbigpIDwgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgZG9VcGRhdGVTb3VyY2VNZXRhZGF0YShzb3VyY2VNZXRhZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGFfdjcgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIGRvVXBkYXRlU291cmNlTWV0YWRhdGFWNyhzb3VyY2VNZXRhZGF0YSk7CisgICAgfQorI2VuZGlmCiAgICAgcmV0dXJuIE9LOwogfQogCisKIHN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdGFydCgpIHsKICAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKQEAgLTI3NSw2ICsyOTYsMzYgQEAKICAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOwogfQogCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0RHVhbE1vbm9Nb2RlKGF1ZGlvX2R1YWxfbW9ub19tb2RlX3QqIG1vZGUpIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X2R1YWxfbW9ub19tb2RlID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X2R1YWxfbW9ub19tb2RlKG1TdHJlYW0sIG1vZGUpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0RHVhbE1vbm9Nb2RlKGF1ZGlvX2R1YWxfbW9ub19tb2RlX3QgbW9kZSkgeworICAgIGlmIChtU3RyZWFtLT5zZXRfZHVhbF9tb25vX21vZGUgPT0gbnVsbHB0cikgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfZHVhbF9tb25vX21vZGUobVN0cmVhbSwgbW9kZSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQqIGxldmVsZEIpIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X2F1ZGlvX2Rlc2NyaXB0aW9uX21peF9sZXZlbCA9PSBudWxscHRyKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9hdWRpb19kZXNjcmlwdGlvbl9taXhfbGV2ZWwobVN0cmVhbSwgbGV2ZWxkQik7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQgbGV2ZWxkQikgeworICAgIGlmIChtU3RyZWFtLT5zZXRfYXVkaW9fZGVzY3JpcHRpb25fbWl4X2xldmVsID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c2V0X2F1ZGlvX2Rlc2NyaXB0aW9uX21peF9sZXZlbChtU3RyZWFtLCBsZXZlbGRCKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoYXVkaW9fcGxheWJhY2tfcmF0ZV90KiBwbGF5YmFja1JhdGUpIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X3BsYXliYWNrX3JhdGVfcGFyYW1ldGVycyA9PSBudWxscHRyKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9wbGF5YmFja19yYXRlX3BhcmFtZXRlcnMobVN0cmVhbSwgcGxheWJhY2tSYXRlKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoY29uc3QgYXVkaW9fcGxheWJhY2tfcmF0ZV90JiBwbGF5YmFja1JhdGUpIHsKKyAgICBpZiAobVN0cmVhbS0+c2V0X3BsYXliYWNrX3JhdGVfcGFyYW1ldGVycyA9PSBudWxscHRyKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnNldF9wbGF5YmFja19yYXRlX3BhcmFtZXRlcnMobVN0cmVhbSwgJnBsYXliYWNrUmF0ZSk7Cit9CisKIHN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRFdmVudENhbGxiYWNrKAogICAgICAgICBjb25zdCBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VFdmVudENhbGxiYWNrPiYgY2FsbGJhY2spIHsKICAgICBpZiAobVN0cmVhbS0+c2V0X2V2ZW50X2NhbGxiYWNrID09IG51bGxwdHIpIHsKQEAgLTMwMyw3ICszNTQsMTEgQEAKICAgICBpZiAoY2FsbGJhY2suZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIDA7CiAgICAgc3dpdGNoIChldmVudCkgewogICAgICAgICBjYXNlIFNUUkVBTV9FVkVOVF9DQktfVFlQRV9DT0RFQ19GT1JNQVRfQ0hBTkdFRDoKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbkNvZGVjRm9ybWF0Q2hhbmdlZChzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90PigodWludDhfdCopcGFyYW0pKTsKKyAgICAgICAgICAgIC8vIHZvaWQqIHBhcmFtIGlzIHRoZSBieXRlIHN0cmluZyBidWZmZXIgZnJvbSBieXRlX3N0cmluZ19mcm9tX2F1ZGlvX21ldGFkYXRhKCkuCisgICAgICAgICAgICAvLyBBcyB0aGUgYnl0ZSBzdHJpbmcgYnVmZmVyIG1heSBoYXZlIGVtYmVkZGVkIHplcm9lcywgd2UgY2Fubm90IHVzZSBzdHJsZW4oKQorICAgICAgICAgICAgY2FsbGJhY2stPm9uQ29kZWNGb3JtYXRDaGFuZ2VkKHN0ZDo6YmFzaWNfc3RyaW5nPHVpbnQ4X3Q+KAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopcGFyYW0sCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzOjptZXRhZGF0YTo6ZGF0YUJ5dGVTdHJpbmdMZW4oKGNvbnN0IHVpbnQ4X3QqKXBhcmFtKSkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HVygiJXMgdW5rbm93biBldmVudCAlZCIsIF9fZnVuY19fLCBldmVudCk7CkBAIC0zNTIsMTYgKzQwNyw1MSBAQAogICAgIHJldHVybiBtU3RyZWFtLT5nZXRfY2FwdHVyZV9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWUpOwogfQogCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjp1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKLSAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit2b2lkIFN0cmVhbUluSGFsTG9jYWw6OmRvVXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7CisgICAgc3RkOjp2ZWN0b3I8cmVjb3JkX3RyYWNrX21ldGFkYXRhPiBoYWxUcmFja3M7CisgICAgaGFsVHJhY2tzLnJlc2VydmUoc2lua01ldGFkYXRhLnRyYWNrcy5zaXplKCkpOworICAgIGZvciAoYXV0byYgbWV0YWRhdGEgOiBzaW5rTWV0YWRhdGEudHJhY2tzKSB7CisgICAgICAgIHJlY29yZF90cmFja19tZXRhZGF0YSBoYWxUcmFja01ldGFkYXRhOworICAgICAgICByZWNvcmRfdHJhY2tfbWV0YWRhdGFfZnJvbV92NygmaGFsVHJhY2tNZXRhZGF0YSwgJm1ldGFkYXRhKTsKKyAgICAgICAgaGFsVHJhY2tzLnB1c2hfYmFjayhoYWxUcmFja01ldGFkYXRhKTsKICAgICB9Ci0gICAgY29uc3Qgc2lua19tZXRhZGF0YV90IG1ldGFkYXRhIHsKKyAgICBjb25zdCBzaW5rX21ldGFkYXRhX3QgaGFsTWV0YWRhdGEgPSB7CisgICAgICAgIC50cmFja19jb3VudCA9IGhhbFRyYWNrcy5zaXplKCksCisgICAgICAgIC50cmFja3MgPSBoYWxUcmFja3MuZGF0YSgpLAorICAgIH07CisgICAgbVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEobVN0cmVhbSwgJmhhbE1ldGFkYXRhKTsKK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPj0gNwordm9pZCBTdHJlYW1JbkhhbExvY2FsOjpkb1VwZGF0ZVNpbmtNZXRhZGF0YVY3KGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7CisgICAgY29uc3Qgc2lua19tZXRhZGF0YV92N190IGhhbE1ldGFkYXRhIHsKICAgICAgICAgLnRyYWNrX2NvdW50ID0gc2lua01ldGFkYXRhLnRyYWNrcy5zaXplKCksCiAgICAgICAgIC8vIGNvbnN0IGNhc3QgaXMgZmluZSBhcyBpdCBpcyBpbiBhIGNvbnN0IHN0cnVjdHVyZQotICAgICAgICAudHJhY2tzID0gY29uc3RfY2FzdDxyZWNvcmRfdHJhY2tfbWV0YWRhdGEqPihzaW5rTWV0YWRhdGEudHJhY2tzLmRhdGEoKSksCisgICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHJlY29yZF90cmFja19tZXRhZGF0YV92Nyo+KHNpbmtNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKICAgICB9OwotICAgIG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhKG1TdHJlYW0sICZtZXRhZGF0YSk7CisgICAgbVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGFfdjcobVN0cmVhbSwgJmhhbE1ldGFkYXRhKTsKK30KKyNlbmRpZgorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjp1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKKyNpZiBNQUpPUl9WRVJTSU9OIDwgNworICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgIC8vIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIEhBTAorICAgIH0KKyAgICBkb1VwZGF0ZVNpbmtNZXRhZGF0YShzaW5rTWV0YWRhdGEpOworI2Vsc2UKKyAgICBpZiAobURldmljZS0+dmVyc2lvbigpIDwgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyAgLy8gbm90IHN1cHBvcnRlZCBieSB0aGUgSEFMCisgICAgICAgIH0KKyAgICAgICAgZG9VcGRhdGVTaW5rTWV0YWRhdGEoc2lua01ldGFkYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGFfdjcgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyAgLy8gbm90IHN1cHBvcnRlZCBieSB0aGUgSEFMCisgICAgICAgIH0KKyAgICAgICAgZG9VcGRhdGVTaW5rTWV0YWRhdGFWNyhzaW5rTWV0YWRhdGEpOworICAgIH0KKyNlbmRpZgogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5oCmluZGV4IGQxN2Y5ZjMuLmIyNjA0OTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmgKQEAgLTI4LDIxICsyOCwxNCBAQAogY2xhc3MgU3RyZWFtSGFsTG9jYWwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UKIHsKICAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOwotCiAgICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKIAotICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKKyAgICAvLyBSZXR1cm4gdGhlIGJhc2UgY29uZmlndXJhdGlvbiBvZiB0aGUgc3RyZWFtOgorICAgIC8vICAgLSBjaGFubmVsIG1hc2s7CisgICAgLy8gICAtIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgLy8gICAtIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoYXVkaW9fY29uZmlnX2Jhc2VfdCAqY29uZmlnQmFzZSk7CiAKICAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwpAQCAtMTU2LDYgKzE0OSwyNCBAQAogICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCiAgICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKIAorICAgIC8vIFJldHVybnMgdGhlIER1YWwgTW9ubyBtb2RlIHByZXNlbnRhdGlvbiBzZXR0aW5nLgorICAgIHN0YXR1c190IGdldER1YWxNb25vTW9kZShhdWRpb19kdWFsX21vbm9fbW9kZV90KiBtb2RlKSBvdmVycmlkZTsKKworICAgIC8vIFNldHMgdGhlIER1YWwgTW9ubyBtb2RlIHByZXNlbnRhdGlvbiBvbiB0aGUgb3V0cHV0IGRldmljZS4KKyAgICBzdGF0dXNfdCBzZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCBtb2RlKSBvdmVycmlkZTsKKworICAgIC8vIFJldHVybnMgdGhlIEF1ZGlvIERlc2NyaXB0aW9uIE1peCBsZXZlbCBpbiBkQi4KKyAgICBzdGF0dXNfdCBnZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQqIGxldmVsZEIpIG92ZXJyaWRlOworCisgICAgLy8gU2V0cyB0aGUgQXVkaW8gRGVzY3JpcHRpb24gTWl4IGxldmVsIGluIGRCLgorICAgIHN0YXR1c190IHNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCBsZXZlbGRCKSBvdmVycmlkZTsKKworICAgIC8vIFJldHJpZXZlcyBjdXJyZW50IHBsYXliYWNrIHJhdGUgcGFyYW1ldGVycy4KKyAgICBzdGF0dXNfdCBnZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKGF1ZGlvX3BsYXliYWNrX3JhdGVfdCogcGxheWJhY2tSYXRlKSBvdmVycmlkZTsKKworICAgIC8vIFNldHMgdGhlIHBsYXliYWNrIHJhdGUgcGFyYW1ldGVycyB0aGF0IGNvbnRyb2wgcGxheWJhY2sgYmVoYXZpb3IuCisgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycyhjb25zdCBhdWRpb19wbGF5YmFja19yYXRlX3QmIHBsYXliYWNrUmF0ZSkgb3ZlcnJpZGU7CisKICAgICBzdGF0dXNfdCBzZXRFdmVudENhbGxiYWNrKGNvbnN0IHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUV2ZW50Q2FsbGJhY2s+JiBjYWxsYmFjaykgb3ZlcnJpZGU7CiAKICAgcHJpdmF0ZToKQEAgLTE3Myw2ICsxODQsOSBAQAogICAgIHN0YXRpYyBpbnQgYXN5bmNDYWxsYmFjayhzdHJlYW1fY2FsbGJhY2tfZXZlbnRfdCBldmVudCwgdm9pZCAqcGFyYW0sIHZvaWQgKmNvb2tpZSk7CiAKICAgICBzdGF0aWMgaW50IGFzeW5jRXZlbnRDYWxsYmFjayhzdHJlYW1fZXZlbnRfY2FsbGJhY2tfdHlwZV90IGV2ZW50LCB2b2lkICpwYXJhbSwgdm9pZCAqY29va2llKTsKKworICAgIHZvaWQgZG9VcGRhdGVTb3VyY2VNZXRhZGF0YVY3KGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSk7CisgICAgdm9pZCBkb1VwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSk7CiB9OwogCiBjbGFzcyBTdHJlYW1JbkhhbExvY2FsIDogcHVibGljIFN0cmVhbUluSGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsTG9jYWwgewpAQCAtMjI3LDYgKzI0MSw5IEBACiAgICAgU3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKIAogICAgIHZpcnR1YWwgflN0cmVhbUluSGFsTG9jYWwoKTsKKworICAgIHZvaWQgZG9VcGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpOworICAgIHZvaWQgZG9VcGRhdGVTaW5rTWV0YWRhdGFWNyhjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSk7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1Qb3dlckxvZy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1Qb3dlckxvZy5oCmluZGV4IDVmZDM5MTIuLmY2YTU1NGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtUG93ZXJMb2cuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvUG93ZXJMb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYml0b3BzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmgKaW5kZXggMWUwNGIyMS4uMjllZjAxMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oCkBAIC0xMDYsNiArMTA2LDkgQEAKICAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSA9IDA7CiAKKyAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KSA9IDA7CisKICAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSA9IDA7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oCmluZGV4IGUzMGNiNzIuLjJiZTEyZmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaApAQCAtMzEsMjEgKzMxLDI3IEBACiBjbGFzcyBTdHJlYW1IYWxJbnRlcmZhY2UgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCiB7CiAgIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKSA9IDA7Ci0KICAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpID0gMDsKIAotICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spID0gMDsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSA9IDA7CisgICAgLy8gUmV0dXJuIHRoZSBiYXNlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHN0cmVhbToKKyAgICAvLyAgIC0gY2hhbm5lbCBtYXNrOworICAgIC8vICAgLSBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIC8vICAgLSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZ0Jhc2UpID0gMDsKIAogICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgPSAwOworICAgIGlubGluZSBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKKyAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcgPSBBVURJT19DT05GSUdfQkFTRV9JTklUSUFMSVpFUjsKKyAgICAgICAgY29uc3Qgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0QXVkaW9Qcm9wZXJ0aWVzKCZjb25maWcpOworICAgICAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBpZiAoc2FtcGxlUmF0ZSAhPSBudWxscHRyKSAqc2FtcGxlUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgIGlmIChtYXNrICE9IG51bGxwdHIpICptYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gbnVsbHB0cikgKmZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiAKICAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpID0gMDsKQEAgLTE1OCwxNCArMTY0LDMzIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgPSAwOwogCiAgICAgc3RydWN0IFNvdXJjZU1ldGFkYXRhIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8cGxheWJhY2tfdHJhY2tfbWV0YWRhdGFfdD4gdHJhY2tzOworICAgICAgICBzdGQ6OnZlY3RvcjxwbGF5YmFja190cmFja19tZXRhZGF0YV92N190PiB0cmFja3M7CiAgICAgfTsKKwogICAgIC8qKgogICAgICAqIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCiAgICAgICogQHBhcmFtIHNvdXJjZU1ldGFkYXRhIERlc2NyaXB0aW9uIG9mIHRoZSBhdWRpbyB0aGF0IGlzIHBsYXllZCBieSB0aGUgY2xpZW50cy4KICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgPSAwOwogCisgICAgLy8gUmV0dXJucyB0aGUgRHVhbCBNb25vIG1vZGUgcHJlc2VudGF0aW9uIHNldHRpbmcuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCogbW9kZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgRHVhbCBNb25vIG1vZGUgcHJlc2VudGF0aW9uIG9uIHRoZSBvdXRwdXQgZGV2aWNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RHVhbE1vbm9Nb2RlKGF1ZGlvX2R1YWxfbW9ub19tb2RlX3QgbW9kZSkgPSAwOworCisgICAgLy8gUmV0dXJucyB0aGUgQXVkaW8gRGVzY3JpcHRpb24gTWl4IGxldmVsIGluIGRCLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0KiBsZXZlbGRCKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBBdWRpbyBEZXNjcmlwdGlvbiBNaXggbGV2ZWwgaW4gZEIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQgbGV2ZWxkQikgPSAwOworCisgICAgLy8gUmV0cmlldmVzIGN1cnJlbnQgcGxheWJhY2sgcmF0ZSBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycyhhdWRpb19wbGF5YmFja19yYXRlX3QqIHBsYXliYWNrUmF0ZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgcGxheWJhY2sgcmF0ZSBwYXJhbWV0ZXJzIHRoYXQgY29udHJvbCBwbGF5YmFjayBiZWhhdmlvci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoY29uc3QgYXVkaW9fcGxheWJhY2tfcmF0ZV90JiBwbGF5YmFja1JhdGUpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RXZlbnRDYWxsYmFjayhjb25zdCBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VFdmVudENhbGxiYWNrPiYgY2FsbGJhY2spID0gMDsKIAogICBwcm90ZWN0ZWQ6CkBAIC0xOTcsNyArMjIyLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSA9IDA7CiAKICAgICBzdHJ1Y3QgU2lua01ldGFkYXRhIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8cmVjb3JkX3RyYWNrX21ldGFkYXRhX3Q+IHRyYWNrczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8cmVjb3JkX3RyYWNrX21ldGFkYXRhX3Y3X3Q+IHRyYWNrczsKICAgICB9OwogICAgIC8qKgogICAgICAqIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc2luayBoYXMgYmVlbiBjaGFuZ2VkLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQW5kcm9pZC5icAppbmRleCAzOWIwY2ViLi4zMDk3NjVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2RlZmF1bHRzIHsKICAgICBuYW1lOiAibGliYXVkaW9wcm9jZXNzaW5nX2RlZmF1bHRzIiwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwCmluZGV4IDFhMzE0MjAuLjAwYmFlYTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAKQEAgLTc5LDEwICs3OSwxNCBAQAogICAgICAgICAgICAgJiYgbWl4ZXJDaGFubmVsTWFzayA9PSAodHJhY2stPm1NaXhlckNoYW5uZWxNYXNrIHwgdHJhY2stPm1NaXhlckhhcHRpY0NoYW5uZWxNYXNrKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBubyBuZWVkIHRvIGNoYW5nZQogICAgIH0KLSAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBoYXB0aWNDaGFubmVsTWFzayA9IHRyYWNrQ2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7Ci0gICAgdHJhY2tDaGFubmVsTWFzayAmPSB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOwotICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IG1peGVySGFwdGljQ2hhbm5lbE1hc2sgPSBtaXhlckNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOwotICAgIG1peGVyQ2hhbm5lbE1hc2sgJj0gfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBoYXB0aWNDaGFubmVsTWFzayA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4odHJhY2tDaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCk7CisgICAgdHJhY2tDaGFubmVsTWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PigKKyAgICAgICAgICAgIHRyYWNrQ2hhbm5lbE1hc2sgJiB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKKyAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckhhcHRpY0NoYW5uZWxNYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KAorICAgICAgICAgICAgbWl4ZXJDaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCk7CisgICAgbWl4ZXJDaGFubmVsTWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PigKKyAgICAgICAgICAgIG1peGVyQ2hhbm5lbE1hc2sgJiB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKICAgICAvLyBhbHdheXMgcmVjb21wdXRlIGZvciBib3RoIGNoYW5uZWwgbWFza3MgZXZlbiBpZiBvbmx5IG9uZSBoYXMgY2hhbmdlZC4KICAgICBjb25zdCB1aW50MzJfdCB0cmFja0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayh0cmFja0NoYW5uZWxNYXNrKTsKICAgICBjb25zdCB1aW50MzJfdCBtaXhlckNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtaXhlckNoYW5uZWxNYXNrKTsKQEAgLTM2Miw3ICszNjYsOCBAQAogICAgICAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdHJhY2tDaGFubmVsTWFzayA9CiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHZhbHVlSW50KTsKICAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgdHJhY2tDaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgKHRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzayB8IHRyYWNrLT5tTWl4ZXJIYXB0aWNDaGFubmVsTWFzaykpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2sgfCB0cmFjay0+bU1peGVySGFwdGljQ2hhbm5lbE1hc2spKSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIENIQU5ORUxfTUFTSywgJXgpIiwgdHJhY2tDaGFubmVsTWFzayk7CiAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgfQpAQCAtNDA3LDcgKzQxMiw4IEBACiAgICAgICAgIGNhc2UgTUlYRVJfQ0hBTk5FTF9NQVNLOiB7CiAgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckNoYW5uZWxNYXNrID0KICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHZhbHVlSW50KTsKLSAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgdHJhY2stPmNoYW5uZWxNYXNrIHwgdHJhY2stPm1IYXB0aWNDaGFubmVsTWFzaywKKyAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmNoYW5uZWxNYXNrIHwgdHJhY2stPm1IYXB0aWNDaGFubmVsTWFzayksCiAgICAgICAgICAgICAgICAgICAgIG1peGVyQ2hhbm5lbE1hc2spKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgTUlYRVJfQ0hBTk5FTF9NQVNLLCAlI3gpIiwgbWl4ZXJDaGFubmVsTWFzayk7CiAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwpAQCAtNTMzLDkgKzUzOSwxMCBAQAogICAgIFRyYWNrKiB0ID0gc3RhdGljX2Nhc3Q8VHJhY2sqPih0cmFjayk7CiAKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IHQtPmNoYW5uZWxNYXNrOwotICAgIHQtPm1IYXB0aWNDaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOworICAgIHQtPm1IYXB0aWNDaGFubmVsTWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PigKKyAgICAgICAgICAgIGNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKICAgICB0LT5tSGFwdGljQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHQtPm1IYXB0aWNDaGFubmVsTWFzayk7Ci0gICAgY2hhbm5lbE1hc2sgJj0gfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICBjaGFubmVsTWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihjaGFubmVsTWFzayAmIH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpOwogICAgIHQtPmNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CiAgICAgQUxPR1ZfSUYoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCiAgICAgICAgICAgICAiTm9uLXN0ZXJlbyBjaGFubmVsIG1hc2s6ICVkXG4iLCBjaGFubmVsTWFzayk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmNwcAppbmRleCBlYzU2YjAwLi4xYWFjZmQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5jcHAKQEAgLTI1LDcgKzI1LDYgQEAKIAogI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAKQEAgLTYzNiw3ICs2MzUsNyBAQAogICAgIGNvbnN0IHVpbnQzMl90IHBoYXNlV3JhcExpbWl0ID0gYy5tTCA8PCBjLm1TaGlmdDsKICAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gKHBoYXNlSW5jcmVtZW50ICogKHVpbnQ2NF90KW91dEZyYW1lQ291bnQgKyBwaGFzZUZyYWN0aW9uKQogICAgICAgICAgICAgLyBwaGFzZVdyYXBMaW1pdDsKLSAgICAvLyBzYW5pdHkgY2hlY2sgdGhhdCBpbkZyYW1lQ291bnQgaXMgaW4gc2lnbmVkIDMyIGJpdCBpbnRlZ2VyIHJhbmdlLgorICAgIC8vIHZhbGlkYXRlIHRoYXQgaW5GcmFtZUNvdW50IGlzIGluIHNpZ25lZCAzMiBiaXQgaW50ZWdlciByYW5nZS4KICAgICBBTE9HX0FTU0VSVCgwIDw9IGluRnJhbWVDb3VudCAmJiBpbkZyYW1lQ291bnQgPCAoMVUgPDwgMzEpKTsKIAogICAgIC8vQUxPR1YoImluRnJhbWVDb3VudDolZCAgb3V0RnJhbWVDb3VudDolZCIKQEAgLTY0Niw3ICs2NDUsNyBAQAogICAgIC8vIE5PVEU6IGJlIHZlcnkgY2FyZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgY29kZSBoZXJlLiByZWdpc3RlcgogICAgIC8vIHByZXNzdXJlIGlzIHZlcnkgaGlnaCBhbmQgYSBzbWFsbCBjaGFuZ2UgbWlnaHQgY2F1c2UgdGhlIGNvbXBpbGVyCiAgICAgLy8gdG8gZ2VuZXJhdGUgZmFyIGxlc3MgZWZmaWNpZW50IGNvZGUuCi0gICAgLy8gQWx3YXlzIHNhbml0eSBjaGVjayB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgorICAgIC8vIEFsd2F5cyB2YWxpZGF0ZSB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgogCiAgICAgLy8gdGhlIGZvbGxvd2luZyBsb2dpYyBpcyBhIGJpdCBjb252b2x1dGVkIHRvIGtlZXAgdGhlIG1haW4gcHJvY2Vzc2luZyBsb29wCiAgICAgLy8gYXMgdGlnaHQgYXMgcG9zc2libGUgd2l0aCByZWdpc3RlciBhbGxvY2F0aW9uLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCmluZGV4IDliNzBhMWMuLjFmY2ZmY2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKQEAgLTM4MSw3ICszODEsNyBAQAogICAgIC8vIE5PVEU6IGJlIHZlcnkgY2FyZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgY29kZSBoZXJlLiByZWdpc3RlcgogICAgIC8vIHByZXNzdXJlIGlzIHZlcnkgaGlnaCBhbmQgYSBzbWFsbCBjaGFuZ2UgbWlnaHQgY2F1c2UgdGhlIGNvbXBpbGVyCiAgICAgLy8gdG8gZ2VuZXJhdGUgZmFyIGxlc3MgZWZmaWNpZW50IGNvZGUuCi0gICAgLy8gQWx3YXlzIHNhbml0eSBjaGVjayB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgorICAgIC8vIEFsd2F5cyB2YWxpZGF0ZSB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgogCiAgICAgaWYgKExPQ0tFRCkgewogICAgICAgICAvLyBsb2NrZWQgcG9seXBoYXNlIChubyBpbnRlcnBvbGF0aW9uKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAppbmRleCA1YTAzYTBkLi5mMmMzODZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcApAQCAtNDA0LDcgKzQwNCw3IEBACiAgICAgLy8gTk9URTogYmUgdmVyeSBjYXJlZnVsIHdoZW4gbW9kaWZ5aW5nIHRoZSBjb2RlIGhlcmUuIHJlZ2lzdGVyCiAgICAgLy8gcHJlc3N1cmUgaXMgdmVyeSBoaWdoIGFuZCBhIHNtYWxsIGNoYW5nZSBtaWdodCBjYXVzZSB0aGUgY29tcGlsZXIKICAgICAvLyB0byBnZW5lcmF0ZSBmYXIgbGVzcyBlZmZpY2llbnQgY29kZS4KLSAgICAvLyBBbHdheXMgc2FuaXR5IGNoZWNrIHRoZSByZXN1bHQgd2l0aCBvYmpkdW1wIG9yIHRlc3QtcmVzYW1wbGUuCisgICAgLy8gQWx3YXlzIHZhbGlkYXRlIHRoZSByZXN1bHQgd2l0aCBvYmpkdW1wIG9yIHRlc3QtcmVzYW1wbGUuCiAKICAgICAvLyBjb21wdXRlIHRoZSBpbmRleCBvZiB0aGUgY29lZmZpY2llbnQgb24gdGhlIHBvc2l0aXZlIHNpZGUgYW5kCiAgICAgLy8gbmVnYXRpdmUgc2lkZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2F1ZGlvLXJlc2FtcGxlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2F1ZGlvLXJlc2FtcGxlci9BbmRyb2lkLmJwCmluZGV4IGRjNzAzMTAuLjRlYTc1ZTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9hdWRpby1yZXNhbXBsZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvYXVkaW8tcmVzYW1wbGVyL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmF1ZGlvLXJlc2FtcGxlciIsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCmluZGV4IDFiMzkwNjcuLjIwMGE0YzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaApAQCAtNTksNyArNTksNyBAQAogCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1BsYXliYWNrUmF0ZVZhbGlkKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpIHsKICAgICBpZiAocGxheWJhY2tSYXRlLm1GYWxsYmFja01vZGUgPT0gQVVESU9fVElNRVNUUkVUQ0hfRkFMTEJBQ0tfRkFJTCAmJgotICAgICAgICAgICAgKHBsYXliYWNrUmF0ZS5tU3RyZXRjaE1vZGUgPT0gQVVESU9fVElNRVNUUkVUQ0hfU1RSRVRDSF9TUEVFQ0ggfHwKKyAgICAgICAgICAgIChwbGF5YmFja1JhdGUubVN0cmV0Y2hNb2RlID09IEFVRElPX1RJTUVTVFJFVENIX1NUUkVUQ0hfVk9JQ0UgfHwKICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlLm1TdHJldGNoTW9kZSA9PSBBVURJT19USU1FU1RSRVRDSF9TVFJFVENIX0RFRkFVTFQpKSB7CiAgICAgICAgIC8vdGVzdCBzb25pYyBzcGVjaWZpYyBjb25zdHJhaW50cwogICAgICAgICByZXR1cm4gcGxheWJhY2tSYXRlLm1TcGVlZCA+PSBUSU1FU1RSRVRDSF9TT05JQ19TUEVFRF9NSU4gJiYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggMThhY2VmNy4uMzg1NjgxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTEsNSArMSwxNCBAQAogLy8gQnVpbGQgdGhlIHVuaXQgdGVzdHMgZm9yIGxpYmF1ZGlvcHJvY2Vzc2luZwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2RlZmF1bHRzIHsKICAgICBuYW1lOiAibGliYXVkaW9wcm9jZXNzaW5nX3Rlc3RfZGVmYXVsdHMiLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvZnV6emVyL0FuZHJvaWQuYnAKaW5kZXggMWRmNDdiNy4uOGZiNmZmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL2Z1enplci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2Z1enogewogICBuYW1lOiAibGliYXVkaW9wcm9jZXNzaW5nX3Jlc2FtcGxlcl9mdXp6ZXIiLAogICBzcmNzOiBbCkBAIC04LDMgKzE3LDE0IEBACiAgICAgImxpYnNuZGZpbGUiLAogICBdLAogfQorCitjY19mdXp6IHsKKyAgbmFtZTogImxpYmF1ZGlvcHJvY2Vzc2luZ19yZWNvcmRfYnVmZmVyX2NvbnZlcnRlcl9mdXp6ZXIiLAorICBzcmNzOiBbCisgICAgImxpYmF1ZGlvcHJvY2Vzc2luZ19yZWNvcmRfYnVmZmVyX2NvbnZlcnRlcl9mdXp6ZXIuY3BwIiwKKyAgXSwKKyAgZGVmYXVsdHM6IFsibGliYXVkaW9wcm9jZXNzaW5nX3Rlc3RfZGVmYXVsdHMiXSwKKyAgc3RhdGljX2xpYnM6IFsKKyAgICAibGlic25kZmlsZSIsCisgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvZnV6emVyL2xpYmF1ZGlvcHJvY2Vzc2luZ19mdXp6X3V0aWxzLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvZnV6emVyL2xpYmF1ZGlvcHJvY2Vzc2luZ19mdXp6X3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE2NTkyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9mdXp6ZXIvbGliYXVkaW9wcm9jZXNzaW5nX2Z1enpfdXRpbHMuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0xJQkFVRElPUFJPQ0VTU0lOR19GVVpaX1VUSUxTX0gKKyNkZWZpbmUgQU5EUk9JRF9MSUJBVURJT1BST0NFU1NJTkdfRlVaWl9VVElMU19ICisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgUHJvdmlkZXIgOiBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlciB7CisgIGNvbnN0IHZvaWQqIG1BZGRyOyAgICAgICAgLy8gYmFzZSBhZGRyZXNzCisgIGNvbnN0IHNpemVfdCBtTnVtRnJhbWVzOyAgLy8gdG90YWwgZnJhbWVzCisgIGNvbnN0IHNpemVfdCBtRnJhbWVTaXplOyAgLy8gc2l6ZSBvZiBlYWNoIGZyYW1lIGluIGJ5dGVzCisgIHNpemVfdCBtTmV4dEZyYW1lOyAgICAgICAgLy8gaW5kZXggb2YgbmV4dCBmcmFtZSB0byBwcm92aWRlCisgIHNpemVfdCBtVW5yZWw7ICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBub3QgeWV0IHJlbGVhc2VkCisgcHVibGljOgorICBQcm92aWRlcihjb25zdCB2b2lkKiBhZGRyLCBzaXplX3QgZnJhbWVzLCBzaXplX3QgZnJhbWVTaXplKQorICAgICAgOiBtQWRkcihhZGRyKSwKKyAgICAgICAgbU51bUZyYW1lcyhmcmFtZXMpLAorICAgICAgICBtRnJhbWVTaXplKGZyYW1lU2l6ZSksCisgICAgICAgIG1OZXh0RnJhbWUoMCksCisgICAgICAgIG1VbnJlbCgwKSB7fQorICBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEJ1ZmZlciogYnVmZmVyKSBvdmVycmlkZSB7CisgICAgaWYgKGJ1ZmZlci0+ZnJhbWVDb3VudCA+IG1OdW1GcmFtZXMgLSBtTmV4dEZyYW1lKSB7CisgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBtTnVtRnJhbWVzIC0gbU5leHRGcmFtZTsKKyAgICB9CisgICAgbVVucmVsID0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgIGlmIChidWZmZXItPmZyYW1lQ291bnQgPiAwKSB7CisgICAgICBidWZmZXItPnJhdyA9IChjaGFyKiltQWRkciArIG1GcmFtZVNpemUgKiBtTmV4dEZyYW1lOworICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICBidWZmZXItPnJhdyA9IG51bGxwdHI7CisgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgIH0KKyAgfQorICB2b2lkIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpIG92ZXJyaWRlIHsKKyAgICBpZiAoYnVmZmVyLT5mcmFtZUNvdW50ID4gbVVucmVsKSB7CisgICAgICBtTmV4dEZyYW1lICs9IG1VbnJlbDsKKyAgICAgIG1VbnJlbCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIG1OZXh0RnJhbWUgKz0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgICAgbVVucmVsIC09IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICB9CisgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKKyAgICBidWZmZXItPnJhdyA9IG51bGxwdHI7CisgIH0KKyAgdm9pZCByZXNldCgpIHsgbU5leHRGcmFtZSA9IDA7IH0KK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfTElCQVVESU9QUk9DRVNTSU5HX0ZVWlpfVVRJTFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL2Z1enplci9saWJhdWRpb3Byb2Nlc3NpbmdfcmVjb3JkX2J1ZmZlcl9jb252ZXJ0ZXJfZnV6emVyLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9mdXp6ZXIvbGliYXVkaW9wcm9jZXNzaW5nX3JlY29yZF9idWZmZXJfY29udmVydGVyX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3NTk4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9mdXp6ZXIvbGliYXVkaW9wcm9jZXNzaW5nX3JlY29yZF9idWZmZXJfY29udmVydGVyX2Z1enplci5jcHAKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibGliYXVkaW9wcm9jZXNzaW5nX2Z1enpfdXRpbHMuaCIKKyNpbmNsdWRlICJmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9SZWNvcmRCdWZmZXJDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NvbnN0ZXhwciBpbnQgTUFYX0ZSQU1FUyA9IDEwMjQ7CisKKyNkZWZpbmUgQVVESU9fRk9STUFUX1BDTV9NQUlOIDAKKworLy8gQ29waWVkIGFuZCBzaW1wbGlmaWVkIGZyb20gYXVkaW8taGFsLWVudW1zLmg/bD01NzEKK2NvbnN0ZXhwciB1aW50MzJfdCBGVVpaX0FVRElPX0ZPUk1BVFNbXSA9IHsKKyAgQVVESU9fRk9STUFUX1BDTV9NQUlOIHwgQVVESU9fRk9STUFUX1BDTV9TVUJfMTZfQklULAorICBBVURJT19GT1JNQVRfUENNX01BSU4gfCBBVURJT19GT1JNQVRfUENNX1NVQl84X0JJVCwKKyAgQVVESU9fRk9STUFUX1BDTV9NQUlOIHwgQVVESU9fRk9STUFUX1BDTV9TVUJfMzJfQklULAorICBBVURJT19GT1JNQVRfUENNX01BSU4gfCBBVURJT19GT1JNQVRfUENNX1NVQl84XzI0X0JJVCwKKyAgQVVESU9fRk9STUFUX1BDTV9NQUlOIHwgQVVESU9fRk9STUFUX1BDTV9TVUJfRkxPQVQsCisgIEFVRElPX0ZPUk1BVF9QQ01fTUFJTiB8IEFVRElPX0ZPUk1BVF9QQ01fU1VCXzI0X0JJVF9QQUNLRUQsCisgIDB4MDEwMDAwMDB1LAorICAweDAyMDAwMDAwdSwKKyAgMHgwMzAwMDAwMHUsCisgIDB4MDQwMDAwMDB1LAorICBBVURJT19GT1JNQVRfQUFDIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfTUFJTiwKKyAgQVVESU9fRk9STUFUX0FBQyB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX0xDLAorICBBVURJT19GT1JNQVRfQUFDIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfU1NSLAorICBBVURJT19GT1JNQVRfQUFDIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfTFRQLAorICBBVURJT19GT1JNQVRfQUFDIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfSEVfVjEsCisgIEFVRElPX0ZPUk1BVF9BQUMgfCBBVURJT19GT1JNQVRfQUFDX1NVQl9TQ0FMQUJMRSwKKyAgQVVESU9fRk9STUFUX0FBQyB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX0VSTEMsCisgIEFVRElPX0ZPUk1BVF9BQUMgfCBBVURJT19GT1JNQVRfQUFDX1NVQl9MRCwKKyAgQVVESU9fRk9STUFUX0FBQyB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX0hFX1YyLAorICBBVURJT19GT1JNQVRfQUFDIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfRUxELAorICBBVURJT19GT1JNQVRfQUFDIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfWEhFLAorICAweDA1MDAwMDAwdSwKKyAgMHgwNjAwMDAwMHUsCisgIDB4MDcwMDAwMDB1LAorICAweDA4MDAwMDAwdSwKKyAgMHgwOTAwMDAwMHUsCisgIDB4MEEwMDAwMDB1LAorICBBVURJT19GT1JNQVRfRV9BQzMgfCBBVURJT19GT1JNQVRfRV9BQzNfU1VCX0pPQywKKyAgMHgwQjAwMDAwMHUsCisgIDB4MEMwMDAwMDB1LAorICAweDBEMDAwMDAwdSwKKyAgMHgwRTAwMDAwMHUsCisgIDB4MTAwMDAwMDB1LAorICAweDExMDAwMDAwdSwKKyAgMHgxMjAwMDAwMHUsCisgIDB4MTMwMDAwMDB1LAorICAweDE0MDAwMDAwdSwKKyAgMHgxNTAwMDAwMHUsCisgIDB4MTYwMDAwMDB1LAorICAweDE3MDAwMDAwdSwKKyAgMHgxODAwMDAwMHUsCisgIDB4MTkwMDAwMDB1LAorICAweDFBMDAwMDAwdSwKKyAgMHgxQjAwMDAwMHUsCisgIDB4MUMwMDAwMDB1LAorICAweDFEMDAwMDAwdSwKKyAgMHgxRTAwMDAwMHUsCisgIEFVRElPX0ZPUk1BVF9BQUNfQURUUyB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX01BSU4sCisgIEFVRElPX0ZPUk1BVF9BQUNfQURUUyB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX0xDLAorICBBVURJT19GT1JNQVRfQUFDX0FEVFMgfCBBVURJT19GT1JNQVRfQUFDX1NVQl9TU1IsCisgIEFVRElPX0ZPUk1BVF9BQUNfQURUUyB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX0xUUCwKKyAgQVVESU9fRk9STUFUX0FBQ19BRFRTIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfSEVfVjEsCisgIEFVRElPX0ZPUk1BVF9BQUNfQURUUyB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX1NDQUxBQkxFLAorICBBVURJT19GT1JNQVRfQUFDX0FEVFMgfCBBVURJT19GT1JNQVRfQUFDX1NVQl9FUkxDLAorICBBVURJT19GT1JNQVRfQUFDX0FEVFMgfCBBVURJT19GT1JNQVRfQUFDX1NVQl9MRCwKKyAgQVVESU9fRk9STUFUX0FBQ19BRFRTIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfSEVfVjIsCisgIEFVRElPX0ZPUk1BVF9BQUNfQURUUyB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX0VMRCwKKyAgQVVESU9fRk9STUFUX0FBQ19BRFRTIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfWEhFLAorICAweDFGMDAwMDAwdSwKKyAgMHgyMDAwMDAwMHUsCisgIDB4MjEwMDAwMDB1LAorICAweDIyMDAwMDAwdSwKKyAgMHgyMzAwMDAwMHUsCisgIDB4MjQwMDAwMDB1LAorICBBVURJT19GT1JNQVRfTUFUIHwgQVVESU9fRk9STUFUX01BVF9TVUJfMV8wLAorICBBVURJT19GT1JNQVRfTUFUIHwgQVVESU9fRk9STUFUX01BVF9TVUJfMl8wLAorICBBVURJT19GT1JNQVRfTUFUIHwgQVVESU9fRk9STUFUX01BVF9TVUJfMl8xLAorICAweDI1MDAwMDAwdSwKKyAgQVVESU9fRk9STUFUX0FBQ19MQVRNIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfTEMsCisgIEFVRElPX0ZPUk1BVF9BQUNfTEFUTSB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX0hFX1YxLAorICBBVURJT19GT1JNQVRfQUFDX0xBVE0gfCBBVURJT19GT1JNQVRfQUFDX1NVQl9IRV9WMiwKKyAgMHgyNjAwMDAwMHUsCisgIDB4MjcwMDAwMDB1LAorICAweDI4MDAwMDAwdSwKKyAgMHgyOTAwMDAwMHUsCisgIDB4MkEwMDAwMDB1LAorICAweDJCMDAwMDAwdSwKKyAgMHhGRkZGRkZGRnUsCisgIEFVRElPX0ZPUk1BVF9QQ01fTUFJTiwKKyAgQVVESU9fRk9STUFUX1BDTSwKK307Citjb25zdGV4cHIgc2l6ZV90IE5VTV9BVURJT19GT1JNQVRTID0gc3RkOjpzaXplKEZVWlpfQVVESU9fRk9STUFUUyk7CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcChkYXRhLCBzaXplKTsKKyAgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCk7CisKKyAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgc3JjQ2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCk7CisgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHNyY0Zvcm1hdCA9CisgICAgICAoYXVkaW9fZm9ybWF0X3QpRlVaWl9BVURJT19GT1JNQVRTW2ZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludD4oMCwgTlVNX0FVRElPX0ZPUk1BVFMgLSAxKV07CisgIGNvbnN0IHVpbnQzMl90IHNyY1NhbXBsZVJhdGUgPSBmZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQ+KDEsIDB4N2ZmZmZmZmYpOworICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBkc3RDaGFubmVsTWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdClmZHAuQ29uc3VtZUludGVncmFsPGludD4oKTsKKyAgY29uc3QgYXVkaW9fZm9ybWF0X3QgZHN0Rm9ybWF0ID0KKyAgICAgIChhdWRpb19mb3JtYXRfdClGVVpaX0FVRElPX0ZPUk1BVFNbZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50PigwLCBOVU1fQVVESU9fRk9STUFUUyAtIDEpXTsKKyAgY29uc3QgdWludDMyX3QgZHN0U2FtcGxlUmF0ZSA9IGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludD4oMSwgMHg3ZmZmZmZmZik7CisKKyAgLy8gQ2VydGFpbiBmb3JtYXRzIHdpbGwgcmVzdWx0IGluIExPR19BTFdBWVNfRkFUQUwgZXJyb3JzIHRoYXQgYXJlbid0IGludGVyZXN0aW5nIGNyYXNoZXMKKyAgLy8gZm9yIGZ1enppbmcuICBEb24ndCB1c2UgdGhvc2Ugb25lcy4KKyAgY29uc3QgdWludDMyX3QgZHN0Q2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soZHN0Q2hhbm5lbE1hc2spOworICBjb25zdGV4cHIgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IHF1YWxpdHkgPQorICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRFRkFVTFRfUVVBTElUWTsKKyAgY29uc3QgaW50IG1heENoYW5uZWxzID0KKyAgICAgIHF1YWxpdHkgPCBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZID8gMiA6IDg7CisgIGlmIChkc3RDaGFubmVsQ291bnQgPCAxIHx8IGRzdENoYW5uZWxDb3VudCA+IG1heENoYW5uZWxzKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBjb25zdCB1aW50MzJfdCBzcmNDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhzcmNDaGFubmVsTWFzayk7CisgIGlmIChzcmNDaGFubmVsQ291bnQgPCAxIHx8IHNyY0NoYW5uZWxDb3VudCA+IG1heENoYW5uZWxzKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIgY29udmVydGVyKHNyY0NoYW5uZWxNYXNrLCBzcmNGb3JtYXQsIHNyY1NhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0Q2hhbm5lbE1hc2ssIGRzdEZvcm1hdCwgZHN0U2FtcGxlUmF0ZSk7CisgIGlmIChjb252ZXJ0ZXIuaW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGNvbnN0IHVpbnQzMl90IHNyY0ZyYW1lU2l6ZSA9IHNyY0NoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoc3JjRm9ybWF0KTsKKyAgY29uc3QgaW50IHNyY051bUZyYW1lcyA9IGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludD4oMCwgTUFYX0ZSQU1FUyk7CisgIGNvbnN0ZXhwciBzaXplX3QgbWV0YWRhdGFTaXplID0gMiArIDMgKiBzaXplb2YoaW50KSArIDIgKiBzaXplb2YoZmxvYXQpOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBpbnB1dERhdGEgPSBmZHAuQ29uc3VtZUJ5dGVzPHVpbnQ4X3Q+KAorICAgICAgbWV0YWRhdGFTaXplICsgKHNyY0ZyYW1lU2l6ZSAqIHNyY051bUZyYW1lcykpOworICBQcm92aWRlciBwcm92aWRlcihpbnB1dERhdGEuZGF0YSgpLCBzcmNOdW1GcmFtZXMsIHNyY0ZyYW1lU2l6ZSk7CisKKyAgY29uc3QgdWludDMyX3QgZHN0RnJhbWVTaXplID0gZHN0Q2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShkc3RGb3JtYXQpOworICBjb25zdCBzaXplX3QgZnJhbWVzID0gZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBNQVhfRlJBTUVTICsgMSk7CisgIGludDhfdCBkc3RbZHN0RnJhbWVTaXplICogZnJhbWVzXTsKKyAgbWVtc2V0KGRzdCwgMCwgc2l6ZW9mKGludDhfdCkgKiBkc3RGcmFtZVNpemUgKiBmcmFtZXMpOworCisgIC8vIEFkZCBhIHNtYWxsIG51bWJlciBvZiBsb29wcyB0byBzZWUgaWYgcmVwZWF0ZWQgY2FsbHMgdG8gY29udmVydCBjYXVzZQorICAvLyBhbnkgY2hhbmdlIGluIGJlaGF2aW9yLgorICBjb25zdCBpbnQgbnVtTG9vcHMgPSBmZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQ+KDEsIDMpOworICBmb3IgKGludCBsb29wID0gMDsgbG9vcCA8IG51bUxvb3BzOyArK2xvb3ApIHsKKyAgICBzd2l0Y2ggKGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludD4oMCwgMSkpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgY29udmVydGVyLnJlc2V0KCk7CisgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOworICAgICAgY2FzZSAxOgorICAgICAgICBjb252ZXJ0ZXIuY29udmVydChkc3QsICZwcm92aWRlciwgZnJhbWVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvZnV6emVyL2xpYmF1ZGlvcHJvY2Vzc2luZ19yZXNhbXBsZXJfZnV6emVyLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9mdXp6ZXIvbGliYXVkaW9wcm9jZXNzaW5nX3Jlc2FtcGxlcl9mdXp6ZXIuY3BwCmluZGV4IDkzOGM2MTAuLjY1YzlhM2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9mdXp6ZXIvbGliYXVkaW9wcm9jZXNzaW5nX3Jlc2FtcGxlcl9mdXp6ZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9mdXp6ZXIvbGliYXVkaW9wcm9jZXNzaW5nX3Jlc2FtcGxlcl9mdXp6ZXIuY3BwCkBAIC0zNCw2ICszNCw4IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKKyNpbmNsdWRlICJsaWJhdWRpb3Byb2Nlc3NpbmdfZnV6el91dGlscy5oIgorCiAjaW5jbHVkZSA8bWVtb3J5PgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKQEAgLTUzLDQ2ICs1NSw2IEBACiAgICAgQXVkaW9SZXNhbXBsZXI6OkRZTl9ISUdIX1FVQUxJVFksCiB9OwogCi1jbGFzcyBQcm92aWRlciA6IHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyIHsKLSAgY29uc3Qgdm9pZCogbUFkZHI7ICAgICAgICAvLyBiYXNlIGFkZHJlc3MKLSAgY29uc3Qgc2l6ZV90IG1OdW1GcmFtZXM7ICAvLyB0b3RhbCBmcmFtZXMKLSAgY29uc3Qgc2l6ZV90IG1GcmFtZVNpemU7ICAvLyBzaXplIG9mIGVhY2ggZnJhbWUgaW4gYnl0ZXMKLSAgc2l6ZV90IG1OZXh0RnJhbWU7ICAgICAgICAvLyBpbmRleCBvZiBuZXh0IGZyYW1lIHRvIHByb3ZpZGUKLSAgc2l6ZV90IG1VbnJlbDsgICAgICAgICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIG5vdCB5ZXQgcmVsZWFzZWQKLSBwdWJsaWM6Ci0gIFByb3ZpZGVyKGNvbnN0IHZvaWQqIGFkZHIsIHNpemVfdCBmcmFtZXMsIHNpemVfdCBmcmFtZVNpemUpCi0gICAgICA6IG1BZGRyKGFkZHIpLAotICAgICAgICBtTnVtRnJhbWVzKGZyYW1lcyksCi0gICAgICAgIG1GcmFtZVNpemUoZnJhbWVTaXplKSwKLSAgICAgICAgbU5leHRGcmFtZSgwKSwKLSAgICAgICAgbVVucmVsKDApIHt9Ci0gIHN0YXR1c190IGdldE5leHRCdWZmZXIoQnVmZmVyKiBidWZmZXIpIG92ZXJyaWRlIHsKLSAgICBpZiAoYnVmZmVyLT5mcmFtZUNvdW50ID4gbU51bUZyYW1lcyAtIG1OZXh0RnJhbWUpIHsKLSAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IG1OdW1GcmFtZXMgLSBtTmV4dEZyYW1lOwotICAgIH0KLSAgICBtVW5yZWwgPSBidWZmZXItPmZyYW1lQ291bnQ7Ci0gICAgaWYgKGJ1ZmZlci0+ZnJhbWVDb3VudCA+IDApIHsKLSAgICAgIGJ1ZmZlci0+cmF3ID0gKGNoYXIqKW1BZGRyICsgbUZyYW1lU2l6ZSAqIG1OZXh0RnJhbWU7Ci0gICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJ1ZmZlci0+cmF3ID0gbnVsbHB0cjsKLSAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgfQotICB9Ci0gIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKSB7Ci0gICAgaWYgKGJ1ZmZlci0+ZnJhbWVDb3VudCA+IG1VbnJlbCkgewotICAgICAgbU5leHRGcmFtZSArPSBtVW5yZWw7Ci0gICAgICBtVW5yZWwgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICBtTmV4dEZyYW1lICs9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKLSAgICAgIG1VbnJlbCAtPSBidWZmZXItPmZyYW1lQ291bnQ7Ci0gICAgfQotICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Ci0gICAgYnVmZmVyLT5yYXcgPSBudWxscHRyOwotICB9Ci0gIHZvaWQgcmVzZXQoKSB7IG1OZXh0RnJhbWUgPSAwOyB9Ci19OwotCiBhdWRpb19mb3JtYXRfdCBjaG9vc2VGb3JtYXQoQXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IHF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpbnB1dF9ieXRlKSB7CiAgIHN3aXRjaCAocXVhbGl0eSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL3Rlc3QtbWl4ZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL3Rlc3QtbWl4ZXIuY3BwCmluZGV4IGJjOWQyYTYuLjFiYmI4NjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy90ZXN0LW1peGVyLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvdGVzdC1taXhlci5jcHAKQEAgLTI0MSw3ICsyNDEsOCBAQAogICAgIC8vIHNldCB1cCB0aGUgdHJhY2tzLgogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJvdmlkZXJzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIC8vcHJpbnRmKCJ0cmFjayAlZCBvdXQgb2YgJWRcbiIsIGksIHByb3ZpZGVycy5zaXplKCkpOwotICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChwcm92aWRlcnNbaV0uZ2V0TnVtQ2hhbm5lbHMoKSk7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0KKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQocHJvdmlkZXJzW2ldLmdldE51bUNoYW5uZWxzKCkpOwogICAgICAgICBjb25zdCBpbnQgbmFtZSA9IGk7CiAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IG1peGVyLT5jcmVhdGUoCiAgICAgICAgICAgICAgICAgbmFtZSwgY2hhbm5lbE1hc2ssIGZvcm1hdHNbaV0sIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJjcHVzdGF0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliY3B1c3RhdHMvQW5kcm9pZC5icAppbmRleCA2ZThjYTFkLi4xYWIxZGUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJjcHVzdGF0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmNwdXN0YXRzL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYmNwdXN0YXRzIiwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliY3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuY3BwIGIvbWVkaWEvbGliY3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuY3BwCmluZGV4IDRiNzU0OWYuLmU3MWE3ZGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmNwcAorKysgYi9tZWRpYS9saWJjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZGF0YXNvdXJjZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZGF0YXNvdXJjZS9BbmRyb2lkLmJwCmluZGV4IGYxOTFjMjEuLmUwYzY4MDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmRhdGFzb3VyY2UvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJkYXRhc291cmNlL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliZGF0YXNvdXJjZSIsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmRhdGFzb3VyY2UvRGF0YVNvdXJjZUZhY3RvcnkuY3BwIGIvbWVkaWEvbGliZGF0YXNvdXJjZS9EYXRhU291cmNlRmFjdG9yeS5jcHAKaW5kZXggYmI2YTA4Yy4uZjkxZTNlYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZGF0YXNvdXJjZS9EYXRhU291cmNlRmFjdG9yeS5jcHAKKysrIGIvbWVkaWEvbGliZGF0YXNvdXJjZS9EYXRhU291cmNlRmFjdG9yeS5jcHAKQEAgLTY1LDYgKzY1LDkgQEAKICAgICAgICAgc3A8SFRUUEJhc2U+IG1lZGlhSFRUUCA9IGh0dHBTb3VyY2U7CiAgICAgICAgIGlmIChtZWRpYUhUVFAgPT0gTlVMTCkgewogICAgICAgICAgICAgbWVkaWFIVFRQID0gc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4oQ3JlYXRlTWVkaWFIVFRQKGh0dHBTZXJ2aWNlKS5nZXQoKSk7CisgICAgICAgICAgICBpZiAobWVkaWFIVFRQID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIFN0cmluZzggY2FjaGVDb25maWc7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL09XTkVSUyBiL21lZGlhL2xpYmVmZmVjdHMvT1dORVJTCmluZGV4IDdmOWFlODEuLmI3ODMyZWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvT1dORVJTCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvT1dORVJTCkBAIC0xLDQgKzEsMyBAQAogaHVuZ2FAZ29vZ2xlLmNvbQota3JvY2FyZEBnb29nbGUuY29tCiBtbmFnYW5vdkBnb29nbGUuY29tCiByYWdvQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9BbmRyb2lkLmJwCmluZGV4IDg0OTNlMzAuLmIwMmRjYjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvQW5kcm9pZC5icApAQCAtMSw0ICsxLDEzIEBACiAvLyBFZmZlY3QgY29uZmlndXJhdGlvbgorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliZWZmZWN0c2NvbmZpZyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcAppbmRleCAyNmVhYWY4Li4xNjk2MjMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvc3JjL0VmZmVjdHNDb25maWcuY3BwCkBAIC0xMzgsNyArMTM4LDcgQEAKIAogdGVtcGxhdGUgPD4KIGJvb2wgc3RyaW5nVG9TdHJlYW1UeXBlKGNvbnN0IGNoYXIgKnN0cmVhbU5hbWUsIGF1ZGlvX2RldmljZXNfdCogdHlwZSkgewotICAgIHJldHVybiBkZXZpY2VGcm9tU3RyaW5nKHN0cmVhbU5hbWUsICp0eXBlKTsKKyAgICByZXR1cm4gRGV2aWNlQ29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmVhbU5hbWUsICp0eXBlKTsKIH0KIAogLyoqIFBhcnNlIGEgbGlicmFyeSB4bWwgbm90ZSBhbmQgcHVzaCB0aGUgcmVzdWx0IGluIGxpYnJhcmllcyBvciByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZS4gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQuYnAKaW5kZXggMmEyZjM2ZS4uYjQwMzE3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQuYnAKQEAgLTEsNCArMSwyMyBAQAogLy8gTXVsdGljaGFubmVsIGRvd25taXggZWZmZWN0IGxpYnJhcnkKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJlZmZlY3RzX2Rvd25taXhfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGliZWZmZWN0c19kb3dubWl4X2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliZG93bm1peCIsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggNjNhZmM1NC4uNDA3NzMxMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTEsNCArMSwxNSBAQAogLy8gQnVpbGQgdGVzdGJlbmNoIGZvciBkb3dubWl4IG1vZHVsZS4KK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYmVmZmVjdHNfZG93bm1peF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGliZWZmZWN0c19kb3dubWl4X2xpY2Vuc2UiLAorICAgIF0sCit9CisKIGNjX3Rlc3QgewogICAgIG5hbWU6ImRvd25taXh0ZXN0IiwKICAgICBob3N0X3N1cHBvcnRlZDogZmFsc2UsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCmluZGV4IGQwZmFlYmUuLjhhYWRmYmYgMTAwNzU1Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCkBAIC0zOSw4ICszOSw3IEBACiBlY2hvICJ0ZXN0aW5nIERvd25taXgiCiBhZGIgc2hlbGwgbWtkaXIgJHRlc3RkaXIKIAotYWRiIHB1c2ggJEFORFJPSURfQlVJTERfVE9QL2N0cy90ZXN0cy90ZXN0cy9tZWRpYS9yZXMvcmF3L3NpbmVzd2VlcHJhdy5yYXcgXAotJHRlc3RkaXIKK2FkYiBwdXNoICRBTkRST0lEX0JVSUxEX1RPUC9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvcmVzL3Jhdy9zaW5lc3dlZXByYXcucmF3ICR0ZXN0ZGlyCiBhZGIgcHVzaCAkT1VUL3Rlc3RjYXNlcy9kb3dubWl4dGVzdC9hcm02NC9kb3dubWl4dGVzdCAkdGVzdGRpcgogCiAjcnVuIHRoZSBkb3dubWl4IHRlc3QgYXBwbGljYXRpb24gZm9yIHRlc3QuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvQW5kcm9pZC5icAppbmRleCBlYWZjNDgzLi44NDEzMWE0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL0FuZHJvaWQuYnAKQEAgLTEzLDYgKzEzLDI1IEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogLy8gRHluYW1pY3NQcm9jZXNzaW5nIGxpYnJhcnkKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJlZmZlY3RzX2R5bmFtaWNzcHJvY19saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJlZmZlY3RzX2R5bmFtaWNzcHJvY19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmR5bnByb2MiLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9BbmRyb2lkLmJwCmluZGV4IGRkYmZkZDguLjIyODM4YTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9oZWFkZXJzIHsKICAgICBuYW1lOiAibGliZWZmZWN0c19oZWFkZXJzIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNDb25maWdMb2FkZXIuYyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmMKaW5kZXggZmNlZjM2Zi4uZTIzNTMwZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNDb25maWdMb2FkZXIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5jCkBAIC0zOTQsNyArMzk0LDcgQEAKICAgICAgICB9CiAgICAgICAgc3ViX2VmZmVjdF9lbnRyeV90ICpzdWJFbnRyeSA9IChzdWJfZWZmZWN0X2VudHJ5X3QqKWdTdWJFZmZlY3RMaXN0LT5zdWJfZWxlbS0+b2JqZWN0OwogICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnN1YkVmZmVjdERlc2MgPSAoZWZmZWN0X2Rlc2NyaXB0b3JfdCopKHN1YkVudHJ5LT5vYmplY3QpOwotICAgICAgIC8vIFNpbmNlIHdlIHJldHVybiBhIGR1bW15IGRlc2NyaXB0b3IgZm9yIHRoZSBwcm94eSBkdXJpbmcKKyAgICAgICAvLyBTaW5jZSB3ZSByZXR1cm4gYSBzdHViIGRlc2NyaXB0b3IgZm9yIHRoZSBwcm94eSBkdXJpbmcKICAgICAgICAvLyBnZXRfZGVzY3JpcHRvciBjYWxsLHdlIHJlcGxhY2UgaXQgd2l0aCB0aGUgY29ycmVzcG9kaW5nCiAgICAgICAgLy8gc3cgZWZmZWN0IGRlc2NyaXB0b3IsIGJ1dCB3aXRoIFByb3h5IFVVSUQKICAgICAgICAvLyBjaGVjayBmb3IgU3cgZGVzYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuY3BwCmluZGV4IDUwNWJlN2MuLjMwYTkwMDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAKQEAgLTI4Myw3ICsyODMsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbGlzdFB1c2goZWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjLmdldCgpLCBzdWJFZmZlY3RMaXN0KTsKIAotICAgICAgICAgICAgLy8gU2luY2Ugd2UgcmV0dXJuIGEgZHVtbXkgZGVzY3JpcHRvciBmb3IgdGhlIHByb3h5IGR1cmluZworICAgICAgICAgICAgLy8gU2luY2Ugd2UgcmV0dXJuIGEgc3R1YiBkZXNjcmlwdG9yIGZvciB0aGUgcHJveHkgZHVyaW5nCiAgICAgICAgICAgICAvLyBnZXRfZGVzY3JpcHRvciBjYWxsLCB3ZSByZXBsYWNlIGl0IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcKICAgICAgICAgICAgIC8vIHN3IGVmZmVjdCBkZXNjcmlwdG9yLCBidXQga2VlcCB0aGUgUHJveHkgVVVJRAogICAgICAgICAgICAgKmVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYyA9ICpzd0VmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvQW5kcm9pZC5icAppbmRleCA1YTEzYWY2Li5iY2Q2OTQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsMjMgQEAKIC8vIExvdWRuZXNzRW5oYW5jZXIgbGlicmFyeQorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYmVmZmVjdHNfbG91ZG5lc3NfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGliZWZmZWN0c19sb3VkbmVzc19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmxkbmhuY3IiLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS8uY2xhbmctZm9ybWF0IGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vLmNsYW5nLWZvcm1hdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjRiMTNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vLmNsYW5nLWZvcm1hdApAQCAtMCwwICsxLDE1IEBACitCYXNlZE9uU3R5bGU6IEdvb2dsZQorU3RhbmRhcmQ6IENwcDExCitBY2Nlc3NNb2RpZmllck9mZnNldDogLTIKK0FsbG93U2hvcnRGdW5jdGlvbnNPbkFTaW5nbGVMaW5lOiBJbmxpbmUKK0NvbHVtbkxpbWl0OiAxMDAKK0NvbW1lbnRQcmFnbWFzOiBOT0xJTlQ6LioKK0Rlcml2ZVBvaW50ZXJBbGlnbm1lbnQ6IGZhbHNlCitJbmNsdWRlQmxvY2tzOiBQcmVzZXJ2ZQorSW5kZW50V2lkdGg6IDQKK0NvbnRpbnVhdGlvbkluZGVudFdpZHRoOiA4CitQb2ludGVyQWxpZ25tZW50OiBMZWZ0CitUYWJXaWR0aDogNAorVXNlVGFiOiBOZXZlcgorIyBGb2xsb3dpbmcgYXJlIHNwZWNpZmljIHRvIGxpYmVmZmVjdHMvbHZtCitTb3J0SW5jbHVkZXM6IGZhbHNlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9iZW5jaG1hcmtzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9iZW5jaG1hcmtzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEyNWI4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2JlbmNobWFya3MvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ4IEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2JlbmNobWFyayB7CisgICAgbmFtZTogImx2bV9iZW5jaG1hcmsiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBzcmNzOiBbImx2bV9iZW5jaG1hcmsuY3BwIl0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmJ1bmRsZXdyYXBwZXIiLAorICAgICAgICAibGlibXVzaWNidW5kbGUiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICBdLAorfQorCitjY19iZW5jaG1hcmsgeworICAgIG5hbWU6ICJyZXZlcmJfYmVuY2htYXJrIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiIiwKKyAgICBdLAorICAgIHNyY3M6IFsicmV2ZXJiX2JlbmNobWFyay5jcHAiXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlicmV2ZXJiIiwKKyAgICAgICAgImxpYnJldmVyYndyYXBwZXIiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAorICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2JlbmNobWFya3MvbHZtX2JlbmNobWFyay5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9iZW5jaG1hcmtzL2x2bV9iZW5jaG1hcmsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYjY2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9iZW5jaG1hcmtzL2x2bV9iZW5jaG1hcmsuY3BwCkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHJhbmRvbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPGJlbmNobWFyay9iZW5jaG1hcmsuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworZXh0ZXJuIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU07Citjb25zdGV4cHIgZWZmZWN0X3V1aWRfdCBrRWZmZWN0VXVpZHNbXSA9IHsKKyAgICAgICAgLy8gTlhQIFNXIEJhc3NCb29zdAorICAgICAgICB7MHg4NjMxZjMwMCwgMHg3MmUyLCAweDExZGYsIDB4YjU3ZSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgLy8gTlhQIFNXIFZpcnR1YWxpemVyCisgICAgICAgIHsweDFkNDAzM2MwLCAweDg1NTcsIDB4MTFkZiwgMHg5ZjJkLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICAvLyBOWFAgU1cgRXF1YWxpemVyCisgICAgICAgIHsweGNlNzcyZjIwLCAweDg0N2QsIDB4MTFkZiwgMHhiYjE3LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICAvLyBOWFAgU1cgVm9sdW1lCisgICAgICAgIHsweDExOTM0MWEwLCAweDg0NjksIDB4MTFkZiwgMHg4MWY5LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorfTsKKworY29uc3RleHByIHNpemVfdCBrTnVtRWZmZWN0VXVpZHMgPSBzdGQ6OnNpemUoa0VmZmVjdFV1aWRzKTsKKworY29uc3RleHByIHNpemVfdCBrRnJhbWVDb3VudCA9IDIwNDg7CisKK2NvbnN0ZXhwciBhdWRpb19jaGFubmVsX21hc2tfdCBrQ2hNYXNrc1tdID0geworICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMSwgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yLCAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzMsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS180LCAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzUsICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzcsICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOCwgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS185LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTAsIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMSwgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEyLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTMsIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNCwgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE1LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTYsIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNywgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE4LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTksIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMCwgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIxLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjIsIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMywgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzI0LAorfTsKKworY29uc3RleHByIHNpemVfdCBrTnVtQ2hNYXNrcyA9IHN0ZDo6c2l6ZShrQ2hNYXNrcyk7Citjb25zdGV4cHIgaW50IGtTYW1wbGVSYXRlID0gNDQxMDA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBIHRlc3QgcmVzdWx0IHJ1bm5pbmcgb24gUGl4ZWwgMyBmb3IgY29tcGFyaXNvbi4KKyAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMuCisgKiBUaGUgc2Vjb25kIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIGVmZmVjdC4KKyAqIDA6IEJhc3MgQm9vc3QsIDE6IFZpcnR1YWxpemVyLCAyOiBFcXVhbGl6ZXIsIDM6IFZvbHVtZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJlbmNobWFyayAgICAgICAgICAgVGltZSAgICAgICAgICAgICBDUFUgICBJdGVyYXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQk1fTFZNLzEvMCAgICAgICA1MjEyMyBucyAgICAgICAgNTE5NzEgbnMgICAgICAgIDEzNDM3CisgKiBCTV9MVk0vMS8xICAgICAgIDc1Mzk3IG5zICAgICAgICA3NTE3NSBucyAgICAgICAgIDkzODIKKyAqIEJNX0xWTS8xLzIgICAgICAgNDAyNTMgbnMgICAgICAgIDQwMTQwIG5zICAgICAgICAxNzQxOAorICogQk1fTFZNLzEvMyAgICAgICAxOTkxOCBucyAgICAgICAgMTk4NjAgbnMgICAgICAgIDM1MjMwCisgKiBCTV9MVk0vMi8wICAgICAgIDYyNDU1IG5zICAgICAgICA2MjI4MyBucyAgICAgICAgMTEyMTQKKyAqIEJNX0xWTS8yLzEgICAgICAxMTAwODYgbnMgICAgICAgMTA5NzUxIG5zICAgICAgICAgNjM1MAorICogQk1fTFZNLzIvMiAgICAgICA0NDAxNyBucyAgICAgICAgNDM4OTAgbnMgICAgICAgIDE1OTgyCisgKiBCTV9MVk0vMi8zICAgICAgIDIxNjYwIG5zICAgICAgICAyMTU5NiBucyAgICAgICAgMzI1NjgKKyAqIEJNX0xWTS8zLzAgICAgICAgNzE5MjUgbnMgICAgICAgIDcxNjk4IG5zICAgICAgICAgOTc0NQorICogQk1fTFZNLzMvMSAgICAgIDExNzA0MyBucyAgICAgICAxMTY3NTQgbnMgICAgICAgICA2MDA3CisgKiBCTV9MVk0vMy8yICAgICAgIDQ4ODk5IG5zICAgICAgICA0ODc4MSBucyAgICAgICAgMTQzMzQKKyAqIEJNX0xWTS8zLzMgICAgICAgMjM2MDcgbnMgICAgICAgIDIzNTQwIG5zICAgICAgICAyOTczOQorICogQk1fTFZNLzQvMCAgICAgICA4MTI5NiBucyAgICAgICAgODEwOTUgbnMgICAgICAgICA4NjMyCisgKiBCTV9MVk0vNC8xICAgICAgMTIyNDM1IG5zICAgICAgIDEyMjEzMiBucyAgICAgICAgIDU3MzMKKyAqIEJNX0xWTS80LzIgICAgICAgNTM3NDQgbnMgICAgICAgIDUzNjEyIG5zICAgICAgICAxMzA2OAorICogQk1fTFZNLzQvMyAgICAgICAyNTg0NiBucyAgICAgICAgMjU3ODMgbnMgICAgICAgIDI3MTg4CisgKiBCTV9MVk0vNS8wICAgICAgIDk4NTU3IG5zICAgICAgICA5ODMxMSBucyAgICAgICAgIDcxMjAKKyAqIEJNX0xWTS81LzEgICAgICAxMzE2MjYgbnMgICAgICAgMTMxMjY5IG5zICAgICAgICAgNTI5NgorICogQk1fTFZNLzUvMiAgICAgICA2Njg5MiBucyAgICAgICAgNjY3MzIgbnMgICAgICAgIDEwNDU4CisgKiBCTV9MVk0vNS8zICAgICAgIDMxNzk3IG5zICAgICAgICAzMTcyMSBucyAgICAgICAgMjIwOTIKKyAqIEJNX0xWTS82LzAgICAgICAxMTE4ODAgbnMgICAgICAgMTExNTk2IG5zICAgICAgICAgNjI3OAorICogQk1fTFZNLzYvMSAgICAgIDE0MDIwNyBucyAgICAgICAxMzk4NDYgbnMgICAgICAgICA1MDAwCisgKiBCTV9MVk0vNi8yICAgICAgIDc1NjgzIG5zICAgICAgICA3NTQ5NiBucyAgICAgICAgIDkyNTMKKyAqIEJNX0xWTS82LzMgICAgICAgMzc2NjkgbnMgICAgICAgIDM3NTcxIG5zICAgICAgICAxODY2MworICogQk1fTFZNLzcvMCAgICAgIDEyODI2NSBucyAgICAgICAxMjc5NTcgbnMgICAgICAgICA1NDcwCisgKiBCTV9MVk0vNy8xICAgICAgMTQ5NTIyIG5zICAgICAgIDE0OTE1OSBucyAgICAgICAgIDQ2OTkKKyAqIEJNX0xWTS83LzIgICAgICAgOTIwMjQgbnMgICAgICAgIDkxNzk4IG5zICAgICAgICAgNzYzMQorICogQk1fTFZNLzcvMyAgICAgICA0MzM3MiBucyAgICAgICAgNDMyNjggbnMgICAgICAgIDE2MTgxCisgKiBCTV9MVk0vOC8wICAgICAgMTQxODk3IG5zICAgICAgIDE0MTU0OCBucyAgICAgICAgIDQ5NDUKKyAqIEJNX0xWTS84LzEgICAgICAxNTgwNjIgbnMgICAgICAgMTU3NjYxIG5zICAgICAgICAgNDQzOAorICogQk1fTFZNLzgvMiAgICAgICA5ODA0MiBucyAgICAgICAgOTc4MDEgbnMgICAgICAgICA3MTUxCisgKiBCTV9MVk0vOC8zICAgICAgIDQ5MDQ0IG5zICAgICAgICA0ODkyMyBucyAgICAgICAgMTQzMTQKKyAqIEJNX0xWTS85LzAgICAgICAxNzQ2OTIgbnMgICAgICAgMTc0MjI4IG5zICAgICAgICAgNDAyNgorICogQk1fTFZNLzkvMSAgICAgIDE4MzA0OCBucyAgICAgICAxODI1NjAgbnMgICAgICAgICAzODM0CisgKiBCTV9MVk0vOS8yICAgICAgMTMxMDIwIG5zICAgICAgIDEzMDY3NSBucyAgICAgICAgIDUzNDcKKyAqIEJNX0xWTS85LzMgICAgICAgNzExMDIgbnMgICAgICAgIDcwOTE1IG5zICAgICAgICAgOTgwMQorICogQk1fTFZNLzEwLzAgICAgIDE4OTA3OSBucyAgICAgICAxODg1NzYgbnMgICAgICAgICAzNjk5CisgKiBCTV9MVk0vMTAvMSAgICAgMTg3OTg5IG5zICAgICAgIDE4NzQ3MiBucyAgICAgICAgIDM3MzcKKyAqIEJNX0xWTS8xMC8yICAgICAxNDAwOTMgbnMgICAgICAgMTM5NzE3IG5zICAgICAgICAgNTAwNworICogQk1fTFZNLzEwLzMgICAgICA3ODE3NSBucyAgICAgICAgNzc5NjMgbnMgICAgICAgICA4OTE5CisgKiBCTV9MVk0vMTEvMCAgICAgMjA3NTc3IG5zICAgICAgIDIwNzAwNyBucyAgICAgICAgIDMzNzEKKyAqIEJNX0xWTS8xMS8xICAgICAxOTgxODYgbnMgICAgICAgMTk3NjQwIG5zICAgICAgICAgMzUzNQorICogQk1fTFZNLzExLzIgICAgIDE1NzIxNCBucyAgICAgICAxNTY3ODYgbnMgICAgICAgICA0NDU5CisgKiBCTV9MVk0vMTEvMyAgICAgIDg1OTEyIG5zICAgICAgICA4NTY4MSBucyAgICAgICAgIDgxNTMKKyAqIEJNX0xWTS8xMi8wICAgICAyMjA4NjEgbnMgICAgICAgMjIwMjY1IG5zICAgICAgICAgMzE2OQorICogQk1fTFZNLzEyLzEgICAgIDIwODc1OSBucyAgICAgICAyMDgxODQgbnMgICAgICAgICAzMzU1CisgKiBCTV9MVk0vMTIvMiAgICAgMTY1NTMzIG5zICAgICAgIDE2NTA4OCBucyAgICAgICAgIDQyMzQKKyAqIEJNX0xWTS8xMi8zICAgICAgOTI2MTYgbnMgICAgICAgIDkyMzY0IG5zICAgICAgICAgNzUyOAorICogQk1fTFZNLzEzLzAgICAgIDIzODU3MyBucyAgICAgICAyMzc5MjAgbnMgICAgICAgICAyOTQ1CisgKiBCTV9MVk0vMTMvMSAgICAgMjE5MTMwIG5zICAgICAgIDIxODUyMCBucyAgICAgICAgIDMyMDkKKyAqIEJNX0xWTS8xMy8yICAgICAxODMxOTMgbnMgICAgICAgMTgyNjkyIG5zICAgICAgICAgMzgzMAorICogQk1fTFZNLzEzLzMgICAgIDEwMDU0NiBucyAgICAgICAxMDAyNzQgbnMgICAgICAgICA3MDA1CisgKiBCTV9MVk0vMTQvMCAgICAgMjU0ODIwIG5zICAgICAgIDI1NDEzNSBucyAgICAgICAgIDI3NDgKKyAqIEJNX0xWTS8xNC8xICAgICAyMzAxNjEgbnMgICAgICAgMjI5NTMwIG5zICAgICAgICAgMzA0OQorICogQk1fTFZNLzE0LzIgICAgIDE5MjE5NSBucyAgICAgICAxOTE2NzEgbnMgICAgICAgICAzNjM1CisgKiBCTV9MVk0vMTQvMyAgICAgMTA3NzcwIG5zICAgICAgIDEwNzQ3NyBucyAgICAgICAgIDY1MDIKKyAqIEJNX0xWTS8xNS8wICAgICAyNzM2OTUgbnMgICAgICAgMjcyOTU0IG5zICAgICAgICAgMjUzMQorICogQk1fTFZNLzE1LzEgICAgIDI0MDcxOCBucyAgICAgICAyNDAwNDkgbnMgICAgICAgICAyODAxCisgKiBCTV9MVk0vMTUvMiAgICAgMjIwOTE0IG5zICAgICAgIDIyMDMwOSBucyAgICAgICAgIDMxOTEKKyAqIEJNX0xWTS8xNS8zICAgICAxMjQzMjEgbnMgICAgICAgMTIzOTc4IG5zICAgICAgICAgNTY2NAorICogQk1fTFZNLzE2LzAgICAgIDI4NTc2OSBucyAgICAgICAyODQ5NjkgbnMgICAgICAgICAyNDU5CisgKiBCTV9MVk0vMTYvMSAgICAgMjUxNjkyIG5zICAgICAgIDI1MDk4MyBucyAgICAgICAgIDI3ODkKKyAqIEJNX0xWTS8xNi8yICAgICAyMjQ1NTQgbnMgICAgICAgMjIzOTE3IG5zICAgICAgICAgMzEzMgorICogQk1fTFZNLzE2LzMgICAgIDEyMjA0OCBucyAgICAgICAxMjE3MDYgbnMgICAgICAgICA1NzUzCisgKiBCTV9MVk0vMTcvMCAgICAgMzEwMDI3IG5zICAgICAgIDMwOTE1NCBucyAgICAgICAgIDIyNjYKKyAqIEJNX0xWTS8xNy8xICAgICAyNjIwMDggbnMgICAgICAgMjYxMjU5IG5zICAgICAgICAgMjY4MQorICogQk1fTFZNLzE3LzIgICAgIDI0NzUzMCBucyAgICAgICAyNDY4MjcgbnMgICAgICAgICAyODQyCisgKiBCTV9MVk0vMTcvMyAgICAgMTI5NTEzIG5zICAgICAgIDEyOTE0NiBucyAgICAgICAgIDU0MTgKKyAqIEJNX0xWTS8xOC8wICAgICAzMjI3NTUgbnMgICAgICAgMzIxODQ0IG5zICAgICAgICAgMjE3MworICogQk1fTFZNLzE4LzEgICAgIDI2MzI2NiBucyAgICAgICAyNjI1MTQgbnMgICAgICAgICAyNjcxCisgKiBCTV9MVk0vMTgvMiAgICAgMjU3NjA2IG5zICAgICAgIDI1Njg3NSBucyAgICAgICAgIDI3MzEKKyAqIEJNX0xWTS8xOC8zICAgICAxMzY1NTAgbnMgICAgICAgMTM2MTY0IG5zICAgICAgICAgNTEyOQorICogQk1fTFZNLzE5LzAgICAgIDMzODU1MSBucyAgICAgICAzMzc1OTEgbnMgICAgICAgICAyMDY5CisgKiBCTV9MVk0vMTkvMSAgICAgMjc1OTI5IG5zICAgICAgIDI3NTEzNCBucyAgICAgICAgIDI1MzUKKyAqIEJNX0xWTS8xOS8yICAgICAyNzAzMzEgbnMgICAgICAgMjY5NTU0IG5zICAgICAgICAgMjU5NgorICogQk1fTFZNLzE5LzMgICAgIDE0NDU1MSBucyAgICAgICAxNDQxMzggbnMgICAgICAgICA0ODM4CisgKiBCTV9MVk0vMjAvMCAgICAgMzUyNjMzIG5zICAgICAgIDM1MTYxNyBucyAgICAgICAgIDE5OTMKKyAqIEJNX0xWTS8yMC8xICAgICAyODY2MDcgbnMgICAgICAgMjg1NzEzIG5zICAgICAgICAgMjM3MQorICogQk1fTFZNLzIwLzIgICAgIDI4MzU0MSBucyAgICAgICAyODI2ODkgbnMgICAgICAgICAyNDA3CisgKiBCTV9MVk0vMjAvMyAgICAgMTUyMzU1IG5zICAgICAgIDE1MTkwNCBucyAgICAgICAgIDQ2MDQKKyAqIEJNX0xWTS8yMS8wICAgICAzNzA1NTcgbnMgICAgICAgMzY5NDU2IG5zICAgICAgICAgMTg4OQorICogQk1fTFZNLzIxLzEgICAgIDI5ODI1MSBucyAgICAgICAyOTczNTEgbnMgICAgICAgICAyMzUyCisgKiBCTV9MVk0vMjEvMiAgICAgMjk2ODA2IG5zICAgICAgIDI5NTkxNyBucyAgICAgICAgIDIzNjQKKyAqIEJNX0xWTS8yMS8zICAgICAxNjAyMTIgbnMgICAgICAgMTU5NzM1IG5zICAgICAgICAgNDMzMAorICogQk1fTFZNLzIyLzAgICAgIDM4NjQzMSBucyAgICAgICAzODUyMjQgbnMgICAgICAgICAxODI2CisgKiBCTV9MVk0vMjIvMSAgICAgMzA4OTAxIG5zICAgICAgIDMwNzkyNSBucyAgICAgICAgIDIyNzMKKyAqIEJNX0xWTS8yMi8yICAgICAzMDkwNzcgbnMgICAgICAgMzA4MTQwIG5zICAgICAgICAgMjI3NAorICogQk1fTFZNLzIyLzMgICAgIDE2NzQ5MiBucyAgICAgICAxNjY5ODcgbnMgICAgICAgICA0MTk0CisgKiBCTV9MVk0vMjMvMCAgICAgNDA0NDU1IG5zICAgICAgIDQwMzIxOCBucyAgICAgICAgIDE3MjkKKyAqIEJNX0xWTS8yMy8xICAgICAzMjIwMjYgbnMgICAgICAgMzIxMDE0IG5zICAgICAgICAgMjE4NworICogQk1fTFZNLzIzLzIgICAgIDMyNjYxNiBucyAgICAgICAzMjU2MjMgbnMgICAgICAgICAyMTUyCisgKiBCTV9MVk0vMjMvMyAgICAgMTc1ODczIG5zICAgICAgIDE3NTMyOCBucyAgICAgICAgIDQwMDcKKyAqIEJNX0xWTS8yNC8wICAgICA0MTY5NDkgbnMgICAgICAgNDE1Njc2IG5zICAgICAgICAgMTY4NAorICogQk1fTFZNLzI0LzEgICAgIDMyOTgwMyBucyAgICAgICAzMjg3NzkgbnMgICAgICAgICAyMTI4CisgKiBCTV9MVk0vMjQvMiAgICAgMzM3NjQ4IG5zICAgICAgIDMzNjYyNiBucyAgICAgICAgIDIwODAKKyAqIEJNX0xWTS8yNC8zICAgICAxODMxOTIgbnMgICAgICAgMTgyNjM0IG5zICAgICAgICAgMzgyNAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIEJNX0xWTShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIGNvbnN0IHNpemVfdCBjaE1hc2sgPSBrQ2hNYXNrc1tzdGF0ZS5yYW5nZSgwKSAtIDFdOworICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgdXVpZCA9IGtFZmZlY3RVdWlkc1tzdGF0ZS5yYW5nZSgxKV07CisgICAgY29uc3Qgc2l6ZV90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaE1hc2spOworCisgICAgLy8gSW5pdGlhbGl6ZSBpbnB1dCBidWZmZXIgd2l0aCBkZXRlcm1pbmlzdGljIHBzZXVkby1yYW5kb20gdmFsdWVzCisgICAgc3RkOjptaW5zdGRfcmFuZCBnZW4oY2hNYXNrKTsKKyAgICBzdGQ6OnVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248PiBkaXMoLTEuMGYsIDEuMGYpOworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBpbnB1dChrRnJhbWVDb3VudCAqIGNoYW5uZWxDb3VudCk7CisgICAgZm9yIChhdXRvJiBpbiA6IGlucHV0KSB7CisgICAgICAgIGluID0gZGlzKGdlbik7CisgICAgfQorCisgICAgZWZmZWN0X2hhbmRsZV90IGVmZmVjdEhhbmRsZSA9IG51bGxwdHI7CisgICAgaWYgKGludCBzdGF0dXMgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTS5jcmVhdGVfZWZmZWN0KCZ1dWlkLCAxLCAxLCAmZWZmZWN0SGFuZGxlKTsKKyAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZV9lZmZlY3QgcmV0dXJuZWQgYW4gZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGVmZmVjdF9jb25maWdfdCBjb25maWd7fTsKKyAgICBjb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gY29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSBrU2FtcGxlUmF0ZTsKKyAgICBjb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBjb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gY2hNYXNrOworICAgIGNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBjb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisKKyAgICBpbnQgcmVwbHkgPSAwOworICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihyZXBseSk7CisgICAgaWYgKGludCBzdGF0dXMgPSAoKmVmZmVjdEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5jb21tYW5kKGVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfQ09ORklHLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsICZyZXBseVNpemUsICZyZXBseSk7CisgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJjb21tYW5kIHJldHVybmVkIGFuIGVycm9yID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaW50IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgKCplZmZlY3RIYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAtPmNvbW1hbmQoZWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX0VOQUJMRSwgMCwgbnVsbHB0ciwgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIkNvbW1hbmQgZW5hYmxlIGNhbGwgcmV0dXJuZWQgZXJyb3IgJWRcbiIsIHJlcGx5KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFJ1biB0aGUgdGVzdAorICAgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG91dHB1dChrRnJhbWVDb3VudCAqIGNoYW5uZWxDb3VudCk7CisKKyAgICAgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKGlucHV0LmRhdGEoKSk7CisgICAgICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShvdXRwdXQuZGF0YSgpKTsKKworICAgICAgICBhdWRpb19idWZmZXJfdCBpbkJ1ZmZlciA9IHsuZnJhbWVDb3VudCA9IGtGcmFtZUNvdW50LCAuZjMyID0gaW5wdXQuZGF0YSgpfTsKKyAgICAgICAgYXVkaW9fYnVmZmVyX3Qgb3V0QnVmZmVyID0gey5mcmFtZUNvdW50ID0ga0ZyYW1lQ291bnQsIC5mMzIgPSBvdXRwdXQuZGF0YSgpfTsKKyAgICAgICAgKCplZmZlY3RIYW5kbGUpLT5wcm9jZXNzKGVmZmVjdEhhbmRsZSwgJmluQnVmZmVyLCAmb3V0QnVmZmVyKTsKKworICAgICAgICBiZW5jaG1hcms6OkNsb2JiZXJNZW1vcnkoKTsKKyAgICB9CisKKyAgICBzdGF0ZS5TZXRDb21wbGV4aXR5TihzdGF0ZS5yYW5nZSgwKSk7CisKKyAgICBpZiAoaW50IHN0YXR1cyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLnJlbGVhc2VfZWZmZWN0KGVmZmVjdEhhbmRsZSk7IHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJyZWxlYXNlX2VmZmVjdCByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBMVk1BcmdzKGJlbmNobWFyazo6aW50ZXJuYWw6OkJlbmNobWFyayogYikgeworICAgIGZvciAoaW50IGkgPSBGQ0NfMTsgaSA8PSBrTnVtQ2hNYXNrczsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwga051bUVmZmVjdFV1aWRzOyArK2opIHsKKyAgICAgICAgICAgIGItPkFyZ3Moe2ksIGp9KTsKKyAgICAgICAgfQorICAgIH0KK30KKworQkVOQ0hNQVJLKEJNX0xWTSktPkFwcGx5KExWTUFyZ3MpOworCitCRU5DSE1BUktfTUFJTigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vYmVuY2htYXJrcy9yZXZlcmJfYmVuY2htYXJrLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2JlbmNobWFya3MvcmV2ZXJiX2JlbmNobWFyay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBhN2ZmMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2JlbmNobWFya3MvcmV2ZXJiX2JlbmNobWFyay5jcHAKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8cmFuZG9tPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8YmVuY2htYXJrL2JlbmNobWFyay5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgIkVmZmVjdFJldmVyYi5oIgorCitleHRlcm4gYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTTsKK2NvbnN0ZXhwciBlZmZlY3RfdXVpZF90IGtFZmZlY3RVdWlkc1tdID0geworICAgICAgICB7MHgxNzJjZGYwMCwKKyAgICAgICAgIDB4YTNiYywKKyAgICAgICAgIDB4MTFkZiwKKyAgICAgICAgIDB4YTcyZiwKKyAgICAgICAgIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyBwcmVzZXQtaW5zZXJ0IG1vZGUKKyAgICAgICAgezB4ZjI5YTE0MDAsCisgICAgICAgICAweGEzYmIsCisgICAgICAgICAweDExZGYsCisgICAgICAgICAweDhkZGMsCisgICAgICAgICB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gcHJlc2V0LWF1eCBtb2RlCit9OworCitjb25zdGV4cHIgc2l6ZV90IGtOdW1FZmZlY3RVdWlkcyA9IHN0ZDo6c2l6ZShrRWZmZWN0VXVpZHMpOworCitjb25zdGV4cHIgc2l6ZV90IGtGcmFtZUNvdW50ID0gMjA0ODsKKworY29uc3RleHByIGludCBrUHJlc2V0c1tdID0geworICAgICAgICBSRVZFUkJfUFJFU0VUX05PTkUsICAgICAgUkVWRVJCX1BSRVNFVF9TTUFMTFJPT00sICBSRVZFUkJfUFJFU0VUX01FRElVTVJPT00sCisgICAgICAgIFJFVkVSQl9QUkVTRVRfTEFSR0VST09NLCBSRVZFUkJfUFJFU0VUX01FRElVTUhBTEwsIFJFVkVSQl9QUkVTRVRfTEFSR0VIQUxMLAorICAgICAgICBSRVZFUkJfUFJFU0VUX1BMQVRFLAorfTsKKworY29uc3RleHByIHNpemVfdCBrTnVtUHJlc2V0cyA9IHN0ZDo6c2l6ZShrUHJlc2V0cyk7CisKK2NvbnN0ZXhwciBpbnQga1NhbXBsZVJhdGUgPSA0NDEwMDsKKworaW50IHJldmVyYlNldENvbmZpZ1BhcmFtKHVpbnQzMl90IHBhcmFtVHlwZSwgdWludDMyX3QgcGFyYW1WYWx1ZSwgZWZmZWN0X2hhbmRsZV90IGVmZmVjdEhhbmRsZSkgeworICAgIGludCByZXBseSA9IDA7CisgICAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKHJlcGx5KTsKKyAgICB1aW50MzJfdCBwYXJhbURhdGFbMl0gPSB7cGFyYW1UeXBlLCBwYXJhbVZhbHVlfTsKKyAgICBhdXRvIGVmZmVjdFBhcmFtID0gKGVmZmVjdF9wYXJhbV90KiltYWxsb2Moc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihwYXJhbURhdGEpKTsKKyAgICBtZW1jcHkoJmVmZmVjdFBhcmFtLT5kYXRhWzBdLCAmcGFyYW1EYXRhWzBdLCBzaXplb2YocGFyYW1EYXRhKSk7CisgICAgZWZmZWN0UGFyYW0tPnBzaXplID0gc2l6ZW9mKHBhcmFtRGF0YVswXSk7CisgICAgZWZmZWN0UGFyYW0tPnZzaXplID0gc2l6ZW9mKHBhcmFtRGF0YVsxXSk7CisgICAgaW50IHN0YXR1cyA9ICgqZWZmZWN0SGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgIC0+Y29tbWFuZChlZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKHBhcmFtRGF0YSksIGVmZmVjdFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHlTaXplLCAmcmVwbHkpOworICAgIGZyZWUoZWZmZWN0UGFyYW0pOworICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiUmV2ZXJiIHNldCBjb25maWcgcmV0dXJuZWQgYW4gZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHJlcGx5OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQSB0ZXN0IHJlc3VsdCBydW5uaW5nIG9uIFBpeGVsIDMgd2l0aCBmb3IgY29tcGFyaXNvbi4KKyAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBwcmVzZXQgbGV2ZWwgaWQuCisgKiBUaGUgc2Vjb25kIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIGVmZmVjdC4KKyAqIDA6IHByZXNldC1pbnNlcnQgbW9kZSwgMTogcHJlc2V0LWF1eCBtb2RlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQmVuY2htYXJrICAgICAgICAgICAgICBUaW1lICAgICAgICAgICAgIENQVSAgIEl0ZXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCTV9SRVZFUkIvMC8wICAgICAgMTkzMTIgbnMgICAgICAgIDE5MjQ5IG5zICAgICAgICAzNjI4MgorICogQk1fUkVWRVJCLzAvMSAgICAgICA1NjEzIG5zICAgICAgICAgNTU5NiBucyAgICAgICAxMjUwMzIKKyAqIEJNX1JFVkVSQi8xLzAgICAgIDYwNTQ1MyBucyAgICAgICA2MDM3MTQgbnMgICAgICAgICAxMTMxCisgKiBCTV9SRVZFUkIvMS8xICAgICA1ODk0MjEgbnMgICAgICAgNTg3NzU4IG5zICAgICAgICAgMTE2MQorICogQk1fUkVWRVJCLzIvMCAgICAgNjA1NzYwIG5zICAgICAgIDYwNDAwNiBucyAgICAgICAgIDExMzEKKyAqIEJNX1JFVkVSQi8yLzEgICAgIDU4OTQzNCBucyAgICAgICA1ODc3NzcgbnMgICAgICAgICAxMTYxCisgKiBCTV9SRVZFUkIvMy8wICAgICA2MDU1NzQgbnMgICAgICAgNjAzODI4IG5zICAgICAgICAgMTEzMQorICogQk1fUkVWRVJCLzMvMSAgICAgNTg5NTY2IG5zICAgICAgIDU4Nzg2MiBucyAgICAgICAgIDExNjIKKyAqIEJNX1JFVkVSQi80LzAgICAgIDYwNTYzNCBucyAgICAgICA2MDM4OTQgbnMgICAgICAgICAxMTMxCisgKiBCTV9SRVZFUkIvNC8xICAgICA1ODk1MDYgbnMgICAgICAgNTg3ODU2IG5zICAgICAgICAgMTE2MQorICogQk1fUkVWRVJCLzUvMCAgICAgNjA1NjQ0IG5zICAgICAgIDYwMzkyOSBucyAgICAgICAgIDExMzEKKyAqIEJNX1JFVkVSQi81LzEgICAgIDU4OTU5MiBucyAgICAgICA1ODc4NjMgbnMgICAgICAgICAxMTYxCisgKiBCTV9SRVZFUkIvNi8wICAgICA2MTA1NDQgbnMgICAgICAgNjA4NTYxIG5zICAgICAgICAgMTEzMQorICogQk1fUkVWRVJCLzYvMSAgICAgNTg5Njg2IG5zICAgICAgIDU4Nzg3MSBucyAgICAgICAgIDExNjEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBCTV9SRVZFUkIoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBjb25zdCBzaXplX3QgY2hNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIGNvbnN0IHNpemVfdCBwcmVzZXQgPSBrUHJlc2V0c1tzdGF0ZS5yYW5nZSgwKV07CisgICAgY29uc3QgZWZmZWN0X3V1aWRfdCB1dWlkID0ga0VmZmVjdFV1aWRzW3N0YXRlLnJhbmdlKDEpXTsKKyAgICBjb25zdCBzaXplX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoTWFzayk7CisKKyAgICAvLyBJbml0aWFsaXplIGlucHV0IGJ1ZmZlciB3aXRoIGRldGVybWluaXN0aWMgcHNldWRvLXJhbmRvbSB2YWx1ZXMKKyAgICBzdGQ6Om1pbnN0ZF9yYW5kIGdlbihjaE1hc2spOworICAgIHN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjw+IGRpcygtMS4wZiwgMS4wZik7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGlucHV0KGtGcmFtZUNvdW50ICogY2hhbm5lbENvdW50KTsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gb3V0cHV0KGtGcmFtZUNvdW50ICogY2hhbm5lbENvdW50KTsKKyAgICBmb3IgKGF1dG8mIGluIDogaW5wdXQpIHsKKyAgICAgICAgaW4gPSBkaXMoZ2VuKTsKKyAgICB9CisKKyAgICBlZmZlY3RfaGFuZGxlX3QgZWZmZWN0SGFuZGxlID0gbnVsbHB0cjsKKyAgICBpZiAoaW50IHN0YXR1cyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLmNyZWF0ZV9lZmZlY3QoJnV1aWQsIDEsIDEsICZlZmZlY3RIYW5kbGUpOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiY3JlYXRlX2VmZmVjdCByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZWZmZWN0X2NvbmZpZ190IGNvbmZpZ3t9OworICAgIGNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSBjb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IGtTYW1wbGVSYXRlOworICAgIGNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IGNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBjaE1hc2s7CisgICAgY29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKworICAgIGludCByZXBseSA9IDA7CisgICAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKHJlcGx5KTsKKyAgICBpZiAoaW50IHN0YXR1cyA9ICgqZWZmZWN0SGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmNvbW1hbmQoZWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUcsIHNpemVvZihlZmZlY3RfY29uZmlnX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoImNvbW1hbmQgcmV0dXJuZWQgYW4gZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpbnQgc3RhdHVzID0KKyAgICAgICAgICAgICAgICAoKmVmZmVjdEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0+Y29tbWFuZChlZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfRU5BQkxFLCAwLCBudWxscHRyLCAmcmVwbHlTaXplLCAmcmVwbHkpOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiQ29tbWFuZCBlbmFibGUgY2FsbCByZXR1cm5lZCBlcnJvciAlZFxuIiwgcmVwbHkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGludCBzdGF0dXMgPSByZXZlcmJTZXRDb25maWdQYXJhbShSRVZFUkJfUEFSQU1fUFJFU0VULCBwcmVzZXQsIGVmZmVjdEhhbmRsZSk7IHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHJldmVyYiBwcmVzZXQuIEVycm9yICVkXG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gUnVuIHRoZSB0ZXN0CisgICAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgICAgICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoaW5wdXQuZGF0YSgpKTsKKyAgICAgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKG91dHB1dC5kYXRhKCkpOworCisgICAgICAgIGF1ZGlvX2J1ZmZlcl90IGluQnVmZmVyID0gey5mcmFtZUNvdW50ID0ga0ZyYW1lQ291bnQsIC5mMzIgPSBpbnB1dC5kYXRhKCl9OworICAgICAgICBhdWRpb19idWZmZXJfdCBvdXRCdWZmZXIgPSB7LmZyYW1lQ291bnQgPSBrRnJhbWVDb3VudCwgLmYzMiA9IG91dHB1dC5kYXRhKCl9OworICAgICAgICAoKmVmZmVjdEhhbmRsZSktPnByb2Nlc3MoZWZmZWN0SGFuZGxlLCAmaW5CdWZmZXIsICZvdXRCdWZmZXIpOworCisgICAgICAgIGJlbmNobWFyazo6Q2xvYmJlck1lbW9yeSgpOworICAgIH0KKworICAgIHN0YXRlLlNldENvbXBsZXhpdHlOKHN0YXRlLnJhbmdlKDApKTsKKworICAgIGlmIChpbnQgc3RhdHVzID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0ucmVsZWFzZV9lZmZlY3QoZWZmZWN0SGFuZGxlKTsgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoInJlbGVhc2VfZWZmZWN0IHJldHVybmVkIGFuIGVycm9yID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIFJFVkVSQkFyZ3MoYmVuY2htYXJrOjppbnRlcm5hbDo6QmVuY2htYXJrKiBiKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtUHJlc2V0czsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwga051bUVmZmVjdFV1aWRzOyArK2opIHsKKyAgICAgICAgICAgIGItPkFyZ3Moe2ksIGp9KTsKKyAgICAgICAgfQorICAgIH0KK30KKworQkVOQ0hNQVJLKEJNX1JFVkVSQiktPkFwcGx5KFJFVkVSQkFyZ3MpOworCitCRU5DSE1BUktfTUFJTigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5icAppbmRleCAxZjJhNWUxLi43OTk4ODc5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5icApAQCAtMSw0ICsxLDIzIEBACiAvLyBNdXNpYyBidW5kbGUKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJlZmZlY3RzX2x2bV9saWJfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGliZWZmZWN0c19sdm1fbGliX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlibXVzaWNidW5kbGUiLAogCkBAIC05LDYgKzI4LDcgQEAKICAgICB9LAogCiAgICAgdmVuZG9yOiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIHNyY3M6IFsKICAgICAgICAgIlN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5jcHAiLAogICAgICAgICAiU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQ29udHJvbC5jcHAiLApAQCAtMzAsNyArNTAsNiBAQAogICAgICAgICAiQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jcHAiLAogICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jcHAiLAogICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jcHAiLAotICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmNwcCIsCiAgICAgICAgICJTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmNwcCIsCiAgICAgICAgICJTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jcHAiLAogICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX1Byb2Nlc3MuY3BwIiwKQEAgLTQwLDU4ICs1OSwyMCBAQAogICAgICAgICAiRXEvc3JjL0xWRVFOQl9Jbml0LmNwcCIsCiAgICAgICAgICJFcS9zcmMvTFZFUU5CX1Byb2Nlc3MuY3BwIiwKICAgICAgICAgIkVxL3NyYy9MVkVRTkJfVGFibGVzLmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0luc3RBbGxvYy5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0ZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMS5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL1BLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxLmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9JbnQxNkxTaGlmdFRvSW50MzJfMTZ4MzIuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzE2LmNwcCIsCiAgICAgICAgICJDb21tb24vc3JjL0NvcHlfMTYuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvTW9ub1RvMklfMTYuY3BwIiwKICAgICAgICAgIkNvbW1vbi9zcmMvTW9ub1RvMklfMzIuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0xvYWRDb25zdF8zMi5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjE2eHYxNi5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9BYnNfMzIuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNi5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvbXVsdDNzXzE2eDE2LmNwcCIsCiAgICAgICAgICJDb21tb24vc3JjL011bHQzc18zMngxNi5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmNwcCIsCiAgICAgICAgICJDb21tb24vc3JjL0Zyb20yaVRvTVNfMTZ4MTYuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvTWFjM3NfU2F0XzE2eDE2LmNwcCIsCiAgICAgICAgICJDb21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9BZGQyX1NhdF8xNngxNi5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jcHAiLApAQCAtMTMyLDEzICsxMTMsMTQgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKICAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICBdLAogICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIgorICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCiAgICAgXSwKICAgICBjcHBmbGFnczogWwogICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCi0gICAgICAgICItRFNVUFBPUlRfTUMiLAotCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLApAQCAtMTU2LDI3ICsxMzgsMTkgQEAKICAgICB9LAogCiAgICAgdmVuZG9yOiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIHNyY3M6IFsKICAgICAgICAgIlJldmVyYi9zcmMvTFZSRVZfQXBwbHlOZXdTZXR0aW5ncy5jcHAiLAogICAgICAgICAiUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jcHAiLAogICAgICAgICAiUmV2ZXJiL3NyYy9MVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycy5jcHAiLAogICAgICAgICAiUmV2ZXJiL3NyYy9MVlJFVl9HZXRJbnN0YW5jZUhhbmRsZS5jcHAiLAotICAgICAgICAiUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jcHAiLAogICAgICAgICAiUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmNwcCIsCiAgICAgICAgICJSZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmNwcCIsCiAgICAgICAgICJSZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9BYnNfMzIuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvSW5zdEFsbG9jLmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0xvYWRDb25zdF8xNi5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuY3BwIiwKICAgICAgICAgIkNvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmNwcCIsCiAgICAgICAgICJDb21tb24vc3JjL011bHQzc18zMngxNi5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMS5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0RlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyLmNwcCIsCiAgICAgICAgICJDb21tb24vc3JjL0NvcHlfMTYuY3BwIiwKICAgICAgICAgIkNvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0RlbGF5V3JpdGVfMzIuY3BwIiwKICAgICAgICAgIkNvbW1vbi9zcmMvU2hpZnRfU2F0X3YzMnh2MzIuY3BwIiwKICAgICAgICAgIkNvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuY3BwIiwKICAgICAgICAgIkNvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuY3BwIiwKQEAgLTIwMywxMCArMTc3LDExIEBACiAgICAgICAgICJSZXZlcmIvbGliIiwKICAgICAgICAgIkNvbW1vbi9saWIiLAogICAgIF0sCi0KKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgXSwKICAgICBjcHBmbGFnczogWwogICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCi0KICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCmluZGV4IDk0OGQ3OWMuLmU2MGFkMDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCkBAIC02OSwxNSArNjksMTIgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIE1lbW9yeSB0YWJsZSovCi0jZGVmaW5lIExWREJFX05SX01FTU9SWV9SRUdJT05TICAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBtZW1vcnkgcmVnaW9ucyAqLwotCiAvKiBCYXNzIEVuaGFuY2VtZW50IGVmZmVjdCBsZXZlbCAqLwotI2RlZmluZSBMVkRCRV9FRkZFQ1RfMDNEQiAgICAgICAgICAgIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFZmZlY3QgZGVmaW5lcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgTFZEQkVfRUZGRUNUXzA2REIgICAgICAgICAgICA2Ci0jZGVmaW5lIExWREJFX0VGRkVDVF8wOURCICAgICAgICAgICAgOQotI2RlZmluZSBMVkRCRV9FRkZFQ1RfMTJEQiAgICAgICAgICAgIDEyCi0jZGVmaW5lIExWREJFX0VGRkVDVF8xNURCICAgICAgICAgICAgMTUKKyNkZWZpbmUgTFZEQkVfRUZGRUNUXzAzREIgMyAvKiBFZmZlY3QgZGVmaW5lcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgTFZEQkVfRUZGRUNUXzA2REIgNgorI2RlZmluZSBMVkRCRV9FRkZFQ1RfMDlEQiA5CisjZGVmaW5lIExWREJFX0VGRkVDVF8xMkRCIDEyCisjZGVmaW5lIExWREJFX0VGRkVDVF8xNURCIDE1CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC04Niw1MiArODMsMzEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLXR5cGVkZWYgdm9pZCAgICAqTFZEQkVfSGFuZGxlX3Q7Cit0eXBlZGVmIHZvaWQqIExWREJFX0hhbmRsZV90OwogCiAvKiBPcGVyYXRpbmcgbW9kZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWREJFX09GRiAgICAgID0gMCwKLSAgICBMVkRCRV9PTiAgICAgICA9IDEsCi0gICAgTFZEQkVfTU9ERV9NQVggPSBMVk1fTUFYSU5UXzMyCi19IExWREJFX01vZGVfZW47Cit0eXBlZGVmIGVudW0geyBMVkRCRV9PRkYgPSAwLCBMVkRCRV9PTiA9IDEsIExWREJFX01PREVfTUFYID0gTFZNX01BWElOVF8zMiB9IExWREJFX01vZGVfZW47CiAKIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgKi8KLXR5cGVkZWYgZW51bQotewordHlwZWRlZiBlbnVtIHsKICAgICBMVkRCRV9IUEZfT0ZGID0gMCwKLSAgICBMVkRCRV9IUEZfT04gID0gMSwKKyAgICBMVkRCRV9IUEZfT04gPSAxLAogICAgIExWREJFX0hQRl9NQVggPSBMVk1fTUFYSU5UXzMyCiB9IExWREJFX0ZpbHRlclNlbGVjdF9lbjsKIAogLyogVm9sdW1lIGNvbnRyb2wgKi8KLXR5cGVkZWYgZW51bQotewordHlwZWRlZiBlbnVtIHsKICAgICBMVkRCRV9WT0xVTUVfT0ZGID0gMCwKLSAgICBMVkRCRV9WT0xVTUVfT04gID0gMSwKKyAgICBMVkRCRV9WT0xVTUVfT04gPSAxLAogICAgIExWREJFX1ZPTFVNRV9NQVggPSBMVk1fTUFYSU5UXzMyCiB9IExWREJFX1ZvbHVtZV9lbjsKIAotLyogTWVtb3J5IFR5cGVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVkRCRV9QRVJTSVNURU5UICAgICAgPSAwLAotICAgIExWREJFX1BFUlNJU1RFTlRfREFUQSA9IDEsCi0gICAgTFZEQkVfUEVSU0lTVEVOVF9DT0VGID0gMiwKLSAgICBMVkRCRV9TQ1JBVENIICAgICAgICAgPSAzLAotICAgIExWREJFX01FTU9SWV9NQVggICAgICA9IExWTV9NQVhJTlRfMzIKLQotfSBMVkRCRV9NZW1vcnlUeXBlc19lbjsKLQogLyogRnVuY3Rpb24gcmV0dXJuIHN0YXR1cyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZEQkVfU1VDQ0VTUyAgICAgICAgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gYSByb3V0aW5lICovCi0gICAgTFZEQkVfQUxJR05NRU5URVJST1IgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSBhbGlnbm1lbnQgZXJyb3IgKi8KLSAgICBMVkRCRV9OVUxMQUREUkVTUyAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KLSAgICBMVkRCRV9UT09NQU5ZU0FNUExFUyA9IDMsICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBibG9jayBzaXplIGV4Y2VlZGVkICovCi0gICAgTFZEQkVfU0laRUVSUk9SICAgICAgPSA0LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY29ycmVjdCBzdHJ1Y3R1cmUgc2l6ZSAqLwotICAgIExWREJFX1NUQVRVU19NQVggICAgID0gTFZNX01BWElOVF8zMgordHlwZWRlZiBlbnVtIHsKKyAgICBMVkRCRV9TVUNDRVNTID0gMCwgICAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gYSByb3V0aW5lICovCisgICAgTFZEQkVfTlVMTEFERFJFU1MgPSAxLCAgICAvKiBOVUxMIGFsbG9jYXRpb24gYWRkcmVzcyAqLworICAgIExWREJFX1RPT01BTllTQU1QTEVTID0gMiwgLyogTWF4aW11bSBibG9jayBzaXplIGV4Y2VlZGVkICovCisgICAgTFZEQkVfU1RBVFVTX01BWCA9IExWTV9NQVhJTlRfMzIKIH0gTFZEQkVfUmV0dXJuU3RhdHVzX2VuOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE1OCw0MCArMTM0LDM4IEBACiAvKgogICogQmFzcyBFbmhhbmNlbWVudCBjZW50cmUgZnJlcXVlbmN5CiAgKi8KLSNkZWZpbmUgTFZEQkVfQ0FQX0NFTlRSRV81NUh6ICAgICAgIDEKLSNkZWZpbmUgTFZEQkVfQ0FQX0NFTlRSRV82Nkh6ICAgICAgIDIKLSNkZWZpbmUgTFZEQkVfQ0FQX0NFTlRSRV83OEh6ICAgICAgIDQKLSNkZWZpbmUgTFZEQkVfQ0FQX0NFTlRSRV85MEh6ICAgICAgIDgKKyNkZWZpbmUgTFZEQkVfQ0FQX0NFTlRSRV81NUh6IDEKKyNkZWZpbmUgTFZEQkVfQ0FQX0NFTlRSRV82Nkh6IDIKKyNkZWZpbmUgTFZEQkVfQ0FQX0NFTlRSRV83OEh6IDQKKyNkZWZpbmUgTFZEQkVfQ0FQX0NFTlRSRV85MEh6IDgKIAotdHlwZWRlZiBlbnVtCi17Cit0eXBlZGVmIGVudW0gewogICAgIExWREJFX0NFTlRSRV81NUhaID0gMCwKICAgICBMVkRCRV9DRU5UUkVfNjZIWiA9IDEsCiAgICAgTFZEQkVfQ0VOVFJFXzc4SFogPSAyLAogICAgIExWREJFX0NFTlRSRV85MEhaID0gMywKLSAgICBMVkRCRV9DRU5UUkVfTUFYICA9IExWTV9NQVhJTlRfMzIKKyAgICBMVkRCRV9DRU5UUkVfTUFYID0gTFZNX01BWElOVF8zMgogfSBMVkRCRV9DZW50cmVGcmVxX2VuOwogCiAvKgogICogU3VwcG9ydGVkIHNhbXBsZSByYXRlcyBpbiBzYW1wbGVzIHBlciBzZWNvbmQKICAqLwotI2RlZmluZSBMVkRCRV9DQVBfRlNfODAwMCAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIExWREJFX0NBUF9GU18xMTAyNSAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzEyMDAwICAgICAgICAgICAgICAgNAotI2RlZmluZSBMVkRCRV9DQVBfRlNfMTYwMDAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIExWREJFX0NBUF9GU18yMjA1MCAgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIExWREJFX0NBUF9GU18yNDAwMCAgICAgICAgICAgICAgIDMyCi0jZGVmaW5lIExWREJFX0NBUF9GU18zMjAwMCAgICAgICAgICAgICAgIDY0Ci0jZGVmaW5lIExWREJFX0NBUF9GU180NDEwMCAgICAgICAgICAgICAgIDEyOAotI2RlZmluZSBMVkRCRV9DQVBfRlNfNDgwMDAgICAgICAgICAgICAgICAyNTYKLSNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzg4MjAwICAgICAgICAgICAgICAgNTEyCi0jZGVmaW5lIExWREJFX0NBUF9GU185NjAwMCAgICAgICAgICAgICAgIDEwMjQKLSNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzE3NjQwMCAgICAgICAgICAgICAgMjA0OAotI2RlZmluZSBMVkRCRV9DQVBfRlNfMTkyMDAwICAgICAgICAgICAgICA0MDk2CisjZGVmaW5lIExWREJFX0NBUF9GU184MDAwIDEKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzExMDI1IDIKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzEyMDAwIDQKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzE2MDAwIDgKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzIyMDUwIDE2CisjZGVmaW5lIExWREJFX0NBUF9GU18yNDAwMCAzMgorI2RlZmluZSBMVkRCRV9DQVBfRlNfMzIwMDAgNjQKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzQ0MTAwIDEyOAorI2RlZmluZSBMVkRCRV9DQVBfRlNfNDgwMDAgMjU2CisjZGVmaW5lIExWREJFX0NBUF9GU184ODIwMCA1MTIKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzk2MDAwIDEwMjQKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzE3NjQwMCAyMDQ4CisjZGVmaW5lIExWREJFX0NBUF9GU18xOTIwMDAgNDA5NgogCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVkRCRV9GU184MDAwICA9IDAsCit0eXBlZGVmIGVudW0geworICAgIExWREJFX0ZTXzgwMDAgPSAwLAogICAgIExWREJFX0ZTXzExMDI1ID0gMSwKICAgICBMVkRCRV9GU18xMjAwMCA9IDIsCiAgICAgTFZEQkVfRlNfMTYwMDAgPSAzLApAQCAtMjA0LDcgKzE3OCw3IEBACiAgICAgTFZEQkVfRlNfOTYwMDAgPSAxMCwKICAgICBMVkRCRV9GU18xNzY0MDAgPSAxMSwKICAgICBMVkRCRV9GU18xOTIwMDAgPSAxMiwKLSAgICBMVkRCRV9GU19NQVggICA9IExWTV9NQVhJTlRfMzIKKyAgICBMVkRCRV9GU19NQVggPSBMVk1fTUFYSU5UXzMyCiB9IExWREJFX0ZzX2VuOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIxMyw0NCArMTg3LDI1IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBNZW1vcnkgcmVnaW9uIGRlZmluaXRpb24gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiBzaXplIGluIGJ5dGVzICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBBbGlnbm1lbnQ7ICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIGFsaWdubWVudCBpbiBieXRlcyAqLwotICAgIExWREJFX01lbW9yeVR5cGVzX2VuICAgICAgVHlwZTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiB0eXBlICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqcEJhc2VBZGRyZXNzOyAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgcmVnaW9uIGJhc2UgYWRkcmVzcyAqLwotfSBMVkRCRV9NZW1vcnlSZWdpb25fdDsKLQotLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVkRCRV9NZW1vcnlSZWdpb25fdCAgICBSZWdpb25bTFZEQkVfTlJfTUVNT1JZX1JFR0lPTlNdOyAgLyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICovCi19IExWREJFX01lbVRhYl90OwotCiAvKiBQYXJhbWV0ZXIgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWREJFX01vZGVfZW4gICAgICAgICAgIE9wZXJhdGluZ01vZGU7Ci0gICAgTFZEQkVfRnNfZW4gICAgICAgICAgICAgU2FtcGxlUmF0ZTsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBFZmZlY3RMZXZlbDsKLSAgICBMVkRCRV9DZW50cmVGcmVxX2VuICAgICBDZW50cmVGcmVxdWVuY3k7Ci0gICAgTFZEQkVfRmlsdGVyU2VsZWN0X2VuICAgSFBGU2VsZWN0OwotICAgIExWREJFX1ZvbHVtZV9lbiAgICAgICAgIFZvbHVtZUNvbnRyb2w7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVm9sdW1lZEI7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSGVhZHJvb21kQjsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVsczsKLSNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWREJFX01vZGVfZW4gT3BlcmF0aW5nTW9kZTsKKyAgICBMVkRCRV9Gc19lbiBTYW1wbGVSYXRlOworICAgIExWTV9JTlQxNiBFZmZlY3RMZXZlbDsKKyAgICBMVkRCRV9DZW50cmVGcmVxX2VuIENlbnRyZUZyZXF1ZW5jeTsKKyAgICBMVkRCRV9GaWx0ZXJTZWxlY3RfZW4gSFBGU2VsZWN0OworICAgIExWREJFX1ZvbHVtZV9lbiBWb2x1bWVDb250cm9sOworICAgIExWTV9JTlQxNiBWb2x1bWVkQjsKKyAgICBMVk1fSU5UMTYgSGVhZHJvb21kQjsKKyAgICBMVk1fSU5UMTYgTnJDaGFubmVsczsKIAogfSBMVkRCRV9QYXJhbXNfdDsKIAogLyogQ2FwYWJpbGl0eSBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBTYW1wbGVSYXRlOyAgICAgICAgICAgICAgIC8qIFNhbXBsaW5nIHJhdGUgY2FwYWJpbGl0aWVzICovCi0gICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBDZW50cmVGcmVxdWVuY3k7ICAgICAgICAgIC8qIENlbnRyZSBmcmVxdWVuY3kgY2FwYWJpbGl0aWVzICovCi0gICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBNYXhCbG9ja1NpemU7ICAgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBpbiBzYW1wbGUgcGFpcnMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fVUlOVDE2IFNhbXBsZVJhdGU7ICAgICAgLyogU2FtcGxpbmcgcmF0ZSBjYXBhYmlsaXRpZXMgKi8KKyAgICBMVk1fVUlOVDE2IENlbnRyZUZyZXF1ZW5jeTsgLyogQ2VudHJlIGZyZXF1ZW5jeSBjYXBhYmlsaXRpZXMgKi8KKyAgICBMVk1fVUlOVDE2IE1heEJsb2NrU2l6ZTsgICAgLyogTWF4aW11bSBibG9jayBzaXplIGluIHNhbXBsZSBwYWlycyAqLwogfSBMVkRCRV9DYXBhYmlsaXRpZXNfdDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNjEsNzUgKzIxNiwzOSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkRCRV9NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICovCi0vKiAgICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgKi8KLS8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgKi8KLS8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICovCi0vKiAgICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZGVmYXVsdCBjYXBhYmlsaXRlcyAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAxLiAgICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9NZW1vcnkoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfTWVtVGFiX3QgICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICAqcENhcGFiaWxpdGllcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWREJFX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgQmFzcyBFbmhhbmNlbWVudCBtb2R1bGUgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gYWxnb3JpdGhtIGluc3RhbmNlIGJ5IGNhbGxpbmcgd2l0aCAgICAgICAgICovCi0vKiAgICBoSW5zdGFuY2Ugc2V0IHRvIE5VTEwuIEluIHRoaXMgY2FzZSB0aGUgYWxnb3JpdGhtIHJldHVybnMgdGhlIG5ldyBpbnN0YW5jZSAgICAgICAgKi8KLS8qICAgIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGEgZnVsbCByZS1pbml0aWFsaXNhdGlvbiBvZiB0aGUgYWxnb3JpdGhtICAgICAgKi8KLS8qICAgIGJ5IGNhbGxpbmcgd2l0aCBoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUuIEluIHRoaXMgY2FzZSB0aGUgbWVtb3J5IHRhYmxlICAgICAgICAqLwotLyogICAgc2hvdWxkIGJlIGNvcnJlY3QgZm9yIHRoZSBpbnN0YW5jZSwgdGhpcyBjYW4gYmUgZW5zdXJlZCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiAgICovCi0vKiAgICBMVkRCRV9NZW1vcnkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgICBQb2ludGVyIHRvIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgKi8KKy8qICBwU2NyYXRjaCAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVuZGxlIHNjcmF0Y2ggYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkRCRV9TVUNDRVNTICAgICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWREJFX0FMSUdOTUVOVEVSUk9SICAgICAgICBJbnN0YW5jZSBvciBzY3JhdGNoIG1lbW9yeSBvbiBpbmNvcnJlY3QgYWxpZ25tZW50ICAgICAgICovCi0vKiAgICBMVkRCRV9OVUxMQUREUkVTUyAgICAgICAgICAgIE9uZSBvciBtb3JlIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9TVUNDRVNTICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWREJFX05VTExBRERSRVNTICAgICAgICBPbmUgb3IgbW9yZSBtZW1vcnkgaGFzIGEgTlVMTCBwb2ludGVyIC0gbWFsbG9jIGZhaWx1cmUgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICAgICBUaGUgaW5zdGFuY2UgaGFuZGxlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1lbW9yeSAgICovCi0vKiAgICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIDIuICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAqLworLyogIDEuICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0luaXQoTFZEQkVfSGFuZGxlX3QqIHBoSW5zdGFuY2UsIExWREJFX0NhcGFiaWxpdGllc190KiBwQ2FwYWJpbGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFNjcmF0Y2gpOwogCi1MVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfSW5pdChMVkRCRV9IYW5kbGVfdCAgICAgICAgICAgICAqcGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfTWVtVGFiX3QgICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICAqcENhcGFiaWxpdGllcyk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkRCRV9EZUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnJlZSB0aGUgbWVtb3JpZXMgY3JlYXRlZCBkdXJpbmcgTFZEQkVfSW5pdCBpbmNsdWRpbmcgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgICBQb2ludGVyIHRvIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkRCRV9EZUluaXQoTFZEQkVfSGFuZGxlX3QqIHBoSW5zdGFuY2UpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzUxLDggKzI3MCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfR2V0UGFyYW1ldGVycyhMVkRCRV9IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICpwUGFyYW1zKTsKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9HZXRQYXJhbWV0ZXJzKExWREJFX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZEQkVfUGFyYW1zX3QqIHBQYXJhbXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzc0LDggKzI5Miw4IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfR2V0Q2FwYWJpbGl0aWVzKExWREJFX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICpwQ2FwYWJpbGl0aWVzKTsKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9HZXRDYXBhYmlsaXRpZXMoTFZEQkVfSGFuZGxlX3QgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCogcENhcGFiaWxpdGllcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00MTQsOCArMzMyLDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Db250cm9sKExWREJFX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAqcFBhcmFtcyk7CitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfQ29udHJvbChMVkRCRV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWREJFX1BhcmFtc190KiBwUGFyYW1zKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQzNyw5ICszNTQsNyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBOdW1TYW1wbGVzKTsKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Qcm9jZXNzKExWREJFX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwT3V0RGF0YSwgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKTsKIAogI2VuZGlmIC8qIF9fTFZEQkVfSF9fICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKaW5kZXggYjM2NGRhZS4uMzBlMTY5MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaApAQCAtMjQsNyArMjQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgTFZEQkVfU0NBTEVTSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIExWREJFX1NDQUxFU0hJRlQgMTAgLyogQXMgYSBwb3dlciBvZiAyICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzIsMjg5ICszMiwyODkgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDU1SHogKi8KLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMC45NTg4NDlmCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgICgtMS45MTc2OThmKQotI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAwLjk1ODg0OWYKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkzOTAwMWYpCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTQwODA3ZgotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2NjkwOWYKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkzMzgxOGYpCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY2OTA5ZgotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTU1NzMyZikKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NTY2OTBmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTY4NjUwZgotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTM3MzAwZikKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45Njg2NTBmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NTkzMjdmKQotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk2MDEzOGYKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzM1ODhmCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NDcxNzZmKQotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3MzU4OGYKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2OTQ5NGYpCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY5OTUyZgotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3NzY3MWYKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1NTM0M2YpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc3NjcxZgotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTc3ODYzZikKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzgxMDVmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc4NTUxZgotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTU3MTAyZikKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45Nzg1NTFmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45Nzk2NjJmKQotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3OTg2NmYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODEwNDJmCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NjIwODRmKQotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MTA0MmYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4NDc0NmYpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0ODYxZgotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MzA5N2YKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2NjE5NGYpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgzMDk3ZgotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTg4OTMxZikKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODg5OTJmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgzNTM5ZgotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY3MDc5ZikKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODM1MzlmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45ODk4MzFmKQotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4OTg4MmYKKy8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA1NUh6ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9BMCAwLjk1ODg0OWYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0ExICgtMS45MTc2OThmKQorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQTIgMC45NTg4NDlmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9CMSAoLTEuOTM5MDAxZikKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0IyIDAuOTQwODA3ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0EwIDAuOTY2OTA5ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0ExICgtMS45MzM4MThmKQorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0EyIDAuOTY2OTA5ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0IxICgtMS45NTU3MzJmKQorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0IyIDAuOTU2NjkwZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0EwIDAuOTY4NjUwZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0ExICgtMS45MzczMDBmKQorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0EyIDAuOTY4NjUwZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0IxICgtMS45NTkzMjdmKQorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0IyIDAuOTYwMTM4ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0EwIDAuOTczNTg4ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0ExICgtMS45NDcxNzZmKQorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0EyIDAuOTczNTg4ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0IxICgtMS45Njk0OTRmKQorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0IyIDAuOTY5OTUyZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0EwIDAuOTc3NjcxZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0ExICgtMS45NTUzNDNmKQorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0EyIDAuOTc3NjcxZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0IxICgtMS45Nzc4NjNmKQorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0IyIDAuOTc4MTA1ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0EwIDAuOTc4NTUxZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0ExICgtMS45NTcxMDJmKQorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0EyIDAuOTc4NTUxZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0IxICgtMS45Nzk2NjJmKQorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0IyIDAuOTc5ODY2ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0EwIDAuOTgxMDQyZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0ExICgtMS45NjIwODRmKQorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0EyIDAuOTgxMDQyZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0IxICgtMS45ODQ3NDZmKQorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0IyIDAuOTg0ODYxZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0EwIDAuOTgzMDk3ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0ExICgtMS45NjYxOTRmKQorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0EyIDAuOTgzMDk3ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0IxICgtMS45ODg5MzFmKQorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0IyIDAuOTg4OTkyZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0EwIDAuOTgzNTM5ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0ExICgtMS45NjcwNzlmKQorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0EyIDAuOTgzNTM5ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0IxICgtMS45ODk4MzFmKQorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0IyIDAuOTg5ODgyZgogCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1ODE4ZgotI2RlZmluZSBIUEZfRnM4ODIwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcxNjM2ZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODU4MThmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTQ0NjZmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5NDQ4MWYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9BMCAwLjk4NTgxOGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9BMSAoLTEuOTcxNjM2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9BMiAwLjk4NTgxOGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9CMSAoLTEuOTk0NDY2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9CMiAwLjk5NDQ4MWYKIAotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NjA0MGYKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MjA4MGYpCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg2MDQwZgotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk0OTE1ZikKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTQ5MjhmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTAgMC45ODYwNDBmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTEgKC0xLjk3MjA4MGYpCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTIgMC45ODYwNDBmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQjEgKC0xLjk5NDkxNWYpCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQjIgMC45OTQ5MjhmCiAKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODcxODNmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzQzNjZmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzE4M2YKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NzIzM2YpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk3MjM3ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9BMCAwLjk4NzE4M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQTEgKC0xLjk3NDM2NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0EyIDAuOTg3MTgzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9CMSAoLTEuOTk3MjMzZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQjIgMC45OTcyMzdmCiAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODcyOTRmCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzQ1ODhmKQotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzI5NGYKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NzQ1OGYpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk3NDYxZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMCAwLjk4NzI5NGYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTEgKC0xLjk3NDU4OGYpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0EyIDAuOTg3Mjk0ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9CMSAoLTEuOTk3NDU4ZikKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQjIgMC45OTc0NjFmCiAKLSAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNjZIeiAqLwotI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAwLjk1MzAxNmYKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkwNjAzMmYpCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTUzMDE2ZgotI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTI2ODEwZikKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMC45MjkzOTZmCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTYyNjM4ZgotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTI1Mjc1ZikKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjI2MzhmCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NDY4ODFmKQotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk0ODI1NmYKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NjQ3MThmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45Mjk0MzVmKQotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk2NDcxOGYKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1MTE5NmYpCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTUyMzU5ZgotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3MDYyMmYKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk0MTI0NGYpCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTcwNjIyZgotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTYzMzk0ZikKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjQwNTJmCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc1NTA5ZgotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTUxMDE5ZikKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzU1MDlmCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzM0MzZmKQotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3Mzc4NGYKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzY1NjNmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NTMxMjVmKQotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3NjU2M2YKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3NTU5NGYpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc1ODg5ZgotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3OTU0N2YKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1OTA5M2YpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc5NTQ3ZgotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTgxNjk1ZikKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODE4NjFmCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgyMDEwZgotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY0MDE5ZikKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODIwMTBmCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45ODY3MThmKQotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NjgwNWYKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODI1NDBmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NjUwNzlmKQotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MjU0MGYKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4Nzc5N2YpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg3ODcxZgorLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDY2SHogKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0EwIDAuOTUzMDE2ZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQTEgKC0xLjkwNjAzMmYpCisjZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9BMiAwLjk1MzAxNmYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0IxICgtMS45MjY4MTBmKQorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQjIgMC45MjkzOTZmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQTAgMC45NjI2MzhmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQTEgKC0xLjkyNTI3NWYpCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQTIgMC45NjI2MzhmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQjEgKC0xLjk0Njg4MWYpCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQjIgMC45NDgyNTZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQTAgMC45NjQ3MThmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQTEgKC0xLjkyOTQzNWYpCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQTIgMC45NjQ3MThmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQjEgKC0xLjk1MTE5NmYpCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQjIgMC45NTIzNTlmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQTAgMC45NzA2MjJmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQTEgKC0xLjk0MTI0NGYpCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQTIgMC45NzA2MjJmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQjEgKC0xLjk2MzM5NGYpCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQjIgMC45NjQwNTJmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQTAgMC45NzU1MDlmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQTEgKC0xLjk1MTAxOWYpCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQTIgMC45NzU1MDlmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQjEgKC0xLjk3MzQzNmYpCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQjIgMC45NzM3ODRmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQTAgMC45NzY1NjNmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQTEgKC0xLjk1MzEyNWYpCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQTIgMC45NzY1NjNmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQjEgKC0xLjk3NTU5NGYpCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQjIgMC45NzU4ODlmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQTAgMC45Nzk1NDdmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQTEgKC0xLjk1OTA5M2YpCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQTIgMC45Nzk1NDdmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQjEgKC0xLjk4MTY5NWYpCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQjIgMC45ODE4NjFmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQTAgMC45ODIwMTBmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQTEgKC0xLjk2NDAxOWYpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQTIgMC45ODIwMTBmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQjEgKC0xLjk4NjcxOGYpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQjIgMC45ODY4MDVmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQTAgMC45ODI1NDBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQTEgKC0xLjk2NTA3OWYpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQTIgMC45ODI1NDBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQjEgKC0xLjk4Nzc5N2YpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQjIgMC45ODc4NzFmCiAKLSNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODUyNzNmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzA1NDZmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTI3M2YKLSNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MzM1OWYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkzMzgxZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0EwIDAuOTg1MjczZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0ExICgtMS45NzA1NDZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0EyIDAuOTg1MjczZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0IxICgtMS45OTMzNTlmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0IyIDAuOTkzMzgxZgogCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NTM5ZgotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcxMDc3ZikKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODU1MzlmCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTM4OThmKQotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MzkxN2YKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMCAwLjk4NTUzOWYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMSAoLTEuOTcxMDc3ZikKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMiAwLjk4NTUzOWYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9CMSAoLTEuOTkzODk4ZikKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9CMiAwLjk5MzkxN2YKIAotI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjkxMGYKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MzgyMGYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2OTEwZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2Njc5ZikKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY2ODVmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0EwIDAuOTg2OTEwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9BMSAoLTEuOTczODIwZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQTIgMC45ODY5MTBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0IxICgtMS45OTY2NzlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9CMiAwLjk5NjY4NWYKIAotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NzA0M2YKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3NDA4NmYpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MDQzZgotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2OTQ5ZikKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY5NTRmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0EwIDAuOTg3MDQzZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMSAoLTEuOTc0MDg2ZikKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQTIgMC45ODcwNDNmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0IxICgtMS45OTY5NDlmKQorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9CMiAwLjk5Njk1NGYKIAogLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDc4SHogKi8KLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgMC45NDY2OTNmCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgICgtMS44OTMzODdmKQotI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAwLjk0NjY5M2YKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkxMzUxN2YpCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTE3MTA1ZgotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk1Nzk5OWYKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkxNTk5OGYpCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTU3OTk5ZgotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTM3MjI5ZikKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45MzkxNDBmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTYwNDQ2ZgotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTIwODkyZikKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjA0NDZmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NDIzMjZmKQotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk0Mzk0NGYKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NjczOTdmCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45MzQ3OTRmKQotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk2NzM5N2YKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1Njc0MGYpCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTU3NjU2ZgotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3MzE1NmYKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk0NjMxM2YpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTczMTU2ZgotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY4NjA3ZikKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjkwOTJmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc0Mzk4ZgotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTQ4Nzk3ZikKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzQzOThmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzExNTdmKQotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3MTU2OGYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45Nzc5MThmCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NTU4MzZmKQotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3NzkxOGYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3ODM2N2YpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc4NTk5ZgotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MDgyNGYKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2MTY0OWYpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgwODI0ZgotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTg0MzAzZikKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0MjVmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxNDUwZgotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTYyOTAwZikKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODE0NTBmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45ODU1NzhmKQotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTY4MWYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0EwIDAuOTQ2NjkzZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQTEgKC0xLjg5MzM4N2YpCisjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9BMiAwLjk0NjY5M2YKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0IxICgtMS45MTM1MTdmKQorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQjIgMC45MTcxMDVmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQTAgMC45NTc5OTlmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQTEgKC0xLjkxNTk5OGYpCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQTIgMC45NTc5OTlmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQjEgKC0xLjkzNzIyOWYpCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQjIgMC45MzkxNDBmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTAgMC45NjA0NDZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTEgKC0xLjkyMDg5MmYpCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTIgMC45NjA0NDZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQjEgKC0xLjk0MjMyNmYpCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQjIgMC45NDM5NDRmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTAgMC45NjczOTdmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTEgKC0xLjkzNDc5NGYpCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTIgMC45NjczOTdmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQjEgKC0xLjk1Njc0MGYpCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQjIgMC45NTc2NTZmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQTAgMC45NzMxNTZmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQTEgKC0xLjk0NjMxM2YpCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQTIgMC45NzMxNTZmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQjEgKC0xLjk2ODYwN2YpCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQjIgMC45NjkwOTJmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTAgMC45NzQzOThmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTEgKC0xLjk0ODc5N2YpCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTIgMC45NzQzOThmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQjEgKC0xLjk3MTE1N2YpCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQjIgMC45NzE1NjhmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTAgMC45Nzc5MThmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTEgKC0xLjk1NTgzNmYpCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTIgMC45Nzc5MThmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQjEgKC0xLjk3ODM2N2YpCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQjIgMC45Nzg1OTlmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQTAgMC45ODA4MjRmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQTEgKC0xLjk2MTY0OWYpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQTIgMC45ODA4MjRmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQjEgKC0xLjk4NDMwM2YpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQjIgMC45ODQ0MjVmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTAgMC45ODE0NTBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTEgKC0xLjk2MjkwMGYpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTIgMC45ODE0NTBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQjEgKC0xLjk4NTU3OGYpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQjIgMC45ODU2ODFmCiAKLSNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ2NzhmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NjkzNTZmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDY3OGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MjE1MWYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkyMTgyZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0EwIDAuOTg0Njc4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0ExICgtMS45NjkzNTZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0EyIDAuOTg0Njc4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0IxICgtMS45OTIxNTFmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0IyIDAuOTkyMTgyZgogCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0OTkyZgotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY5OTg0ZikKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ5OTJmCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTI3ODlmKQotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjgxNWYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMCAwLjk4NDk5MmYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMSAoLTEuOTY5OTg0ZikKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMiAwLjk4NDk5MmYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9CMSAoLTEuOTkyNzg5ZikKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9CMiAwLjk5MjgxNWYKIAotI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjYxMmYKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MzIyNGYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NjEyZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2MDc2ZikKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTYwODNmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0EwIDAuOTg2NjEyZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9BMSAoLTEuOTczMjI0ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQTIgMC45ODY2MTJmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0IxICgtMS45OTYwNzZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9CMiAwLjk5NjA4M2YKIAotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4Njc2OWYKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MzUzOWYpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NzY5ZgotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2Mzk0ZikKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY0MDFmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0EwIDAuOTg2NzY5ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9BMSAoLTEuOTczNTM5ZikKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTIgMC45ODY3NjlmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0IxICgtMS45OTYzOTRmKQorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9CMiAwLjk5NjQwMWYKIAogLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDkwSHogKi8KLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk0MDQxMmYKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuODgwODI1ZikKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk0MDQxMmYKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTAwMjMxZikKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjkwNDk3N2YKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk1MzM4M2YKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTA2NzY2ZikKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk1MzM4M2YKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTI3NTc5ZikKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjkzMDExMWYKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk1NjE5M2YKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTEyMzg3ZikKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk1NjE5M2YKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTMzNDU5ZikKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjkzNTYwM2YKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk2NDE4M2YKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTI4MzY1ZikKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk2NDE4M2YKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTUwMDg3ZikKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk1MTMwM2YKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk3MDgwOWYKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTQxNjE4ZikKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk3MDgwOWYKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTYzNzc4ZikKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk2NDQyM2YKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk3MjIzOWYKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTQ0NDc3ZikKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk3MjIzOWYKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY2NzIxZikKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk2NzI2NmYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk3NjI5MmYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTUyNTg0ZikKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk3NjI5MmYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTc1MDQwZikKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk3NTM0N2YKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk3OTY0MWYKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTU5MjgyZikKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk3OTY0MWYKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTgxODg4ZikKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4MjA1MGYKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4MDM2MmYKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTYwNzI0ZikKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4MDM2MmYKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTgzMzU5ZikKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4MzQ5N2YKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0EwIDAuOTQwNDEyZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQTEgKC0xLjg4MDgyNWYpCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9BMiAwLjk0MDQxMmYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0IxICgtMS45MDAyMzFmKQorI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQjIgMC45MDQ5NzdmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQTAgMC45NTMzODNmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQTEgKC0xLjkwNjc2NmYpCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQTIgMC45NTMzODNmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQjEgKC0xLjkyNzU3OWYpCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQjIgMC45MzAxMTFmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTAgMC45NTYxOTNmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTEgKC0xLjkxMjM4N2YpCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTIgMC45NTYxOTNmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQjEgKC0xLjkzMzQ1OWYpCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQjIgMC45MzU2MDNmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTAgMC45NjQxODNmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTEgKC0xLjkyODM2NWYpCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTIgMC45NjQxODNmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQjEgKC0xLjk1MDA4N2YpCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQjIgMC45NTEzMDNmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQTAgMC45NzA4MDlmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQTEgKC0xLjk0MTYxOGYpCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQTIgMC45NzA4MDlmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQjEgKC0xLjk2Mzc3OGYpCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQjIgMC45NjQ0MjNmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTAgMC45NzIyMzlmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTEgKC0xLjk0NDQ3N2YpCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTIgMC45NzIyMzlmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQjEgKC0xLjk2NjcyMWYpCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQjIgMC45NjcyNjZmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTAgMC45NzYyOTJmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTEgKC0xLjk1MjU4NGYpCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTIgMC45NzYyOTJmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQjEgKC0xLjk3NTA0MGYpCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQjIgMC45NzUzNDdmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQTAgMC45Nzk2NDFmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQTEgKC0xLjk1OTI4MmYpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQTIgMC45Nzk2NDFmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQjEgKC0xLjk4MTg4OGYpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQjIgMC45ODIwNTBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTAgMC45ODAzNjJmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTEgKC0xLjk2MDcyNGYpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTIgMC45ODAzNjJmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQjEgKC0xLjk4MzM1OWYpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQjIgMC45ODM0OTdmCiAKLSNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODQwODRmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NjgxNjhmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDA4NGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MDk0NGYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkwOTg1ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0EwIDAuOTg0MDg0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0ExICgtMS45NjgxNjhmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0EyIDAuOTg0MDg0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0IxICgtMS45OTA5NDRmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0IyIDAuOTkwOTg1ZgogCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NDQ2ZgotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY4ODkyZikKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0NDZmCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTE2ODBmKQotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MTcxNGYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMCAwLjk4NDQ0NmYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMSAoLTEuOTY4ODkyZikKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMiAwLjk4NDQ0NmYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9CMSAoLTEuOTkxNjgwZikKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9CMiAwLjk5MTcxNGYKIAotI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjMxNGYKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MjYyOWYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2MzE0ZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk1NDcyZikKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTU0ODJmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0EwIDAuOTg2MzE0ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9BMSAoLTEuOTcyNjI5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQTIgMC45ODYzMTRmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0IxICgtMS45OTU0NzJmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9CMiAwLjk5NTQ4MmYKIAotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjQ5NmYKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3Mjk5MmYpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NDk2ZgotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk1ODQwZikKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTU4NDhmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0EwIDAuOTg2NDk2ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMSAoLTEuOTcyOTkyZikKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTIgMC45ODY0OTZmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0IxICgtMS45OTU4NDBmKQorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9CMiAwLjk5NTg0OGYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zMjMsMjg4ICszMjMsMjg4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNTVIeiAqLwotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA5MTk3ZgotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDkxOTdmKQotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45Nzk1NDVmKQotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxMzkzZgotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA2NjkxZgotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDY2OTFmKQotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45ODU0ODhmKQotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NDY0ZgotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA2MTUwZgotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDYxNTBmKQotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45ODY3MzNmKQotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTg3NTU3ZgotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA0NjIwZgotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDQ2MjBmKQotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTAxODlmKQotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkwNjUzZgotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAzMzU3ZgotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDMzNTdmKQotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTI5NjRmKQotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkzMjA5ZgotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAzMDg1ZgotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDMwODVmKQotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTM1NTJmKQotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkzNzU5ZgotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAyMzE1ZgotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDIzMTVmKQotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTUxOTlmKQotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk1MzE2ZgotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAxNjgxZgotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDE2ODFmKQotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTY1MzdmKQotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2NTk5ZgotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAxNTQ1ZgotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDE1NDVmKQotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTY4MjNmKQotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2ODc1ZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQTAgMC4wMDkxOTdmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0EyICgtMC4wMDkxOTdmKQorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQjEgKC0xLjk3OTU0NWYpCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9CMiAwLjk4MTM5M2YKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9BMCAwLjAwNjY5MWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9BMiAoLTAuMDA2NjkxZikKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9CMSAoLTEuOTg1NDg4ZikKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9CMiAwLjk4NjQ2NGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9BMCAwLjAwNjE1MGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9BMiAoLTAuMDA2MTUwZikKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9CMSAoLTEuOTg2NzMzZikKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9CMiAwLjk4NzU1N2YKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMCAwLjAwNDYyMGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMiAoLTAuMDA0NjIwZikKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9CMSAoLTEuOTkwMTg5ZikKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9CMiAwLjk5MDY1M2YKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9BMCAwLjAwMzM1N2YKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9BMiAoLTAuMDAzMzU3ZikKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9CMSAoLTEuOTkyOTY0ZikKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9CMiAwLjk5MzIwOWYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9BMCAwLjAwMzA4NWYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9BMiAoLTAuMDAzMDg1ZikKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9CMSAoLTEuOTkzNTUyZikKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9CMiAwLjk5Mzc1OWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMCAwLjAwMjMxNWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMiAoLTAuMDAyMzE1ZikKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9CMSAoLTEuOTk1MTk5ZikKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9CMiAwLjk5NTMxNmYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9BMCAwLjAwMTY4MWYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9BMiAoLTAuMDAxNjgxZikKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9CMSAoLTEuOTk2NTM3ZikKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9CMiAwLjk5NjU5OWYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9BMCAwLjAwMTU0NWYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9BMiAoLTAuMDAxNTQ1ZikKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9CMSAoLTEuOTk2ODIzZikKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9CMiAwLjk5Njg3NWYKIAotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAwODMxZgotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDA4MzFmKQotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTgzMjFmKQotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk4MzM4ZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0EwIDAuMDAwODMxZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0EyICgtMC4wMDA4MzFmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0IxICgtMS45OTgzMjFmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0IyIDAuOTk4MzM4ZgogCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDA3NjJmCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDc2MmYpCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5ODQ2MWYpCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTg0NzdmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTAgMC4wMDA3NjJmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTIgKC0wLjAwMDc2MmYpCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQjEgKC0xLjk5ODQ2MWYpCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQjIgMC45OTg0NzdmCiAKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMDQxNmYKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwNDE2ZikKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk5MTY0ZikKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5OTE2OWYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQTAgMC4wMDA0MTZmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzU1X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9BMiAoLTAuMDAwNDE2ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQjEgKC0xLjk5OTE2NGYpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzU1X0IyIDAuOTk5MTY5ZgogCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDAzODFmCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDM4MWYpCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5OTIzNGYpCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTkyMzhmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0EwIDAuMDAwMzgxZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQTIgKC0wLjAwMDM4MWYpCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0IxICgtMS45OTkyMzRmKQorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9CMiAwLjk5OTIzOGYKIAogLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDY2SHogKi8KLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDEyNjQ4ZgotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDEyNjQ4ZikKLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45NzE3NjBmKQotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NzQ0MTJmCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwOTIwOWYKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwOTIwOWYpCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTc5OTY2ZikKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTgxMzY4ZgotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDg0NjhmCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDg0NjhmKQotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk4MTY4NWYpCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk4Mjg2OWYKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA2MzY0ZgotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDA2MzY0ZikKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45ODY0NTdmKQotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODcxMjRmCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNDYyNmYKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwNDYyNmYpCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTkwMjg4ZikKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkwNjQxZgotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDQyNTJmCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDQyNTJmKQotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MTEwMGYpCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MTM5OGYKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAzMTkyZgotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAzMTkyZikKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTMzNzRmKQotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTM1NDFmCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMjMxOGYKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMjMxOGYpCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk1MjIxZikKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk1MzA5ZgotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDIxMzFmCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDIxMzFmKQotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NTYxNWYpCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5NTY5MGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0EwIDAuMDEyNjQ4ZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9BMiAoLTAuMDEyNjQ4ZikKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0IxICgtMS45NzE3NjBmKQorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQjIgMC45NzQ0MTJmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQTAgMC4wMDkyMDlmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQTIgKC0wLjAwOTIwOWYpCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQjEgKC0xLjk3OTk2NmYpCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQjIgMC45ODEzNjhmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTAgMC4wMDg0NjhmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTIgKC0wLjAwODQ2OGYpCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQjEgKC0xLjk4MTY4NWYpCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQjIgMC45ODI4NjlmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTAgMC4wMDYzNjRmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTIgKC0wLjAwNjM2NGYpCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQjEgKC0xLjk4NjQ1N2YpCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQjIgMC45ODcxMjRmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQTAgMC4wMDQ2MjZmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQTIgKC0wLjAwNDYyNmYpCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQjEgKC0xLjk5MDI4OGYpCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQjIgMC45OTA2NDFmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTAgMC4wMDQyNTJmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTIgKC0wLjAwNDI1MmYpCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQjEgKC0xLjk5MTEwMGYpCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQjIgMC45OTEzOThmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTAgMC4wMDMxOTJmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTIgKC0wLjAwMzE5MmYpCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQjEgKC0xLjk5MzM3NGYpCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQjIgMC45OTM1NDFmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQTAgMC4wMDIzMThmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQTIgKC0wLjAwMjMxOGYpCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQjEgKC0xLjk5NTIyMWYpCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQjIgMC45OTUzMDlmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTAgMC4wMDIxMzFmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTIgKC0wLjAwMjEzMWYpCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQjEgKC0xLjk5NTYxNWYpCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQjIgMC45OTU2OTBmCiAKLSNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxMTQ2ZgotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxMTQ2ZikKLSNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTc2ODRmKQotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTc3MDhmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQTAgMC4wMDExNDZmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQTIgKC0wLjAwMTE0NmYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQjEgKC0xLjk5NzY4NGYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQjIgMC45OTc3MDhmCiAKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxMDU1ZgotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxMDU1ZikKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTc4NjhmKQotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTc4OTFmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTAgMC4wMDEwNTVmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTIgKC0wLjAwMTA1NWYpCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQjEgKC0xLjk5Nzg2OGYpCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQjIgMC45OTc4OTFmCiAKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwNTczZgotI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAwNTczZikKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICgtMS45OTg4NDdmKQotI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgMC45OTg4NTNmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0EwIDAuMDAwNTczZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQTIgKC0wLjAwMDU3M2YpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0IxICgtMS45OTg4NDdmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9CMiAwLjk5ODg1M2YKIAotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDA1MjhmCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgKC0wLjAwMDUyOGYpCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICgtMS45OTg5MzlmKQotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgMC45OTg5NDVmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0EwIDAuMDAwNTI4ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTIgKC0wLjAwMDUyOGYpCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0IxICgtMS45OTg5MzlmKQorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9CMiAwLjk5ODk0NWYKIAogLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDc4SHogKi8KLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDE4NTcyZgotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDE4NTcyZikKLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45NTg3NDVmKQotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NjI0MjdmCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAxMzU0NWYKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAxMzU0NWYpCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTcwNjQ3ZikKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTcyNTk2ZgotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMTI0NThmCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMTI0NThmKQotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MzE0OGYpCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk3NDc5NWYKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA5MzczZgotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDA5MzczZikKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45ODAxMDhmKQotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODEwMzdmCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNjgxOWYKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwNjgxOWYpCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTg1NzE0ZikKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTg2MjA0ZgotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDYyNjhmCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDYyNjhmKQotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk4NjkwNGYpCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk4NzMxOGYKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA0NzA5ZgotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDA0NzA5ZikKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTAyNDBmKQotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTA0NzNmCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMzQyMWYKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMzQyMWYpCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTkyOTU1ZikKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkzMDc4ZgotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDMxNDRmCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDMxNDRmKQotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MzUzNWYpCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MzYzOWYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0EwIDAuMDE4NTcyZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9BMiAoLTAuMDE4NTcyZikKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0IxICgtMS45NTg3NDVmKQorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQjIgMC45NjI0MjdmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTAgMC4wMTM1NDVmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTIgKC0wLjAxMzU0NWYpCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQjEgKC0xLjk3MDY0N2YpCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQjIgMC45NzI1OTZmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTAgMC4wMTI0NThmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTIgKC0wLjAxMjQ1OGYpCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQjEgKC0xLjk3MzE0OGYpCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQjIgMC45NzQ3OTVmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQTAgMC4wMDkzNzNmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQTIgKC0wLjAwOTM3M2YpCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQjEgKC0xLjk4MDEwOGYpCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQjIgMC45ODEwMzdmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTAgMC4wMDY4MTlmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTIgKC0wLjAwNjgxOWYpCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQjEgKC0xLjk4NTcxNGYpCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQjIgMC45ODYyMDRmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTAgMC4wMDYyNjhmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTIgKC0wLjAwNjI2OGYpCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQjEgKC0xLjk4NjkwNGYpCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQjIgMC45ODczMThmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQTAgMC4wMDQ3MDlmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQTIgKC0wLjAwNDcwOWYpCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQjEgKC0xLjk5MDI0MGYpCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQjIgMC45OTA0NzNmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTAgMC4wMDM0MjFmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTIgKC0wLjAwMzQyMWYpCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQjEgKC0xLjk5Mjk1NWYpCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQjIgMC45OTMwNzhmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTAgMC4wMDMxNDRmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTIgKC0wLjAwMzE0NGYpCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQjEgKC0xLjk5MzUzNWYpCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQjIgMC45OTM2MzlmCiAKLSNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDE2OTNmCi0jZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAxNjkzZikKLSNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjU4MmYpCi0jZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk2NjE1ZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0EwIDAuMDAxNjkzZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0EyICgtMC4wMDE2OTNmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0IxICgtMS45OTY1ODJmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0IyIDAuOTk2NjE1ZgogCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTU1NWYKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAxNTU1NWYpCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICgtMS45OTY4NjBmKQotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTY4OTFmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTAgMC4wMDE1NTVmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTIgKC0wLjAwMTU1NTVmKQorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0IxICgtMS45OTY4NjBmKQorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0IyIDAuOTk2ODkxZgogCi0jZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMDg0N2YKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDg0N2YpCi0jZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAoLTEuOTk4Mjk4ZikKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk4MzA2ZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9BMCAwLjAwMDg0N2YKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0EyICgtMC4wMDA4NDdmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9CMSAoLTEuOTk4Mjk4ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQjIgMC45OTgzMDZmCiAKLSNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwNzc4ZgotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICgtMC4wMDA3NzhmKQotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAoLTEuOTk4NDM3ZikKLSNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk4NDQ0ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMCAwLjAwMDc3OGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0EyICgtMC4wMDA3NzhmKQorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9CMSAoLTEuOTk4NDM3ZikKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQjIgMC45OTg0NDRmCiAKIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA5MEh6ICovCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4wMjI3NjBmCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAyMjc2MGYpCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk0OTA3M2YpCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NTM5NTNmCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMTY2MTlmCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAxNjYxOWYpCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2Mzc5MWYpCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NjYzNzdmCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMTUyODlmCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAxNTI4OWYpCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2Njg4MmYpCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NjkwNjdmCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMTE1MTFmCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAxMTUxMWYpCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3NTQ3N2YpCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NzY3MTFmCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDgzNzlmCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwODM3OWYpCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4MjM5NWYpCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODMwNDdmCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDc3MDRmCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwNzcwNGYpCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4Mzg2M2YpCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0MTRmCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDU3ODlmCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwNTc4OWYpCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4Nzk3N2YpCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODgyODhmCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDQyMDdmCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwNDIwN2YpCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MTMyNGYpCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTE0ODhmCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDM4NjdmCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMzg2N2YpCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MjAzOGYpCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTIxNzdmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9BMCAwLjAyMjc2MGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQTIgKC0wLjAyMjc2MGYpCisjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9CMSAoLTEuOTQ5MDczZikKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0IyIDAuOTUzOTUzZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0EwIDAuMDE2NjE5ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0EyICgtMC4wMTY2MTlmKQorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0IxICgtMS45NjM3OTFmKQorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0IyIDAuOTY2Mzc3ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0EwIDAuMDE1Mjg5ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0EyICgtMC4wMTUyODlmKQorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0IxICgtMS45NjY4ODJmKQorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0IyIDAuOTY5MDY3ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0EwIDAuMDExNTExZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0EyICgtMC4wMTE1MTFmKQorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0IxICgtMS45NzU0NzdmKQorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0IyIDAuOTc2NzExZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0EwIDAuMDA4Mzc5ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0EyICgtMC4wMDgzNzlmKQorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0IxICgtMS45ODIzOTVmKQorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0IyIDAuOTgzMDQ3ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0EwIDAuMDA3NzA0ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0EyICgtMC4wMDc3MDRmKQorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0IxICgtMS45ODM4NjNmKQorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0IyIDAuOTg0NDE0ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0EwIDAuMDA1Nzg5ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0EyICgtMC4wMDU3ODlmKQorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0IxICgtMS45ODc5NzdmKQorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0IyIDAuOTg4Mjg4ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0EwIDAuMDA0MjA3ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0EyICgtMC4wMDQyMDdmKQorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0IxICgtMS45OTEzMjRmKQorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0IyIDAuOTkxNDg4ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0EwIDAuMDAzODY3ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0EyICgtMC4wMDM4NjdmKQorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0IxICgtMS45OTIwMzhmKQorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0IyIDAuOTkyMTc3ZgogCi0jZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDIwODNmCi0jZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMjA4M2YpCi0jZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NTc5MWYpCi0jZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTU4MzVmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQTAgMC4wMDIwODNmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQTIgKC0wLjAwMjA4M2YpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQjEgKC0xLjk5NTc5MWYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQjIgMC45OTU4MzVmCiAKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMTkxM2YKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDE5MTNmKQotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjEzNGYpCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTYxNzRmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTAgMC4wMDE5MTNmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTIgKC0wLjAwMTkxM2YpCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQjEgKC0xLjk5NjEzNGYpCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQjIgMC45OTYxNzRmCiAKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTA0MmYKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxMDQyZikKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk3OTA0ZikKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5NzkxNWYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQTAgMC4wMDEwNDJmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9BMiAoLTAuMDAxMDQyZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQjEgKC0xLjk5NzkwNGYpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzkwX0IyIDAuOTk3OTE1ZgogCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDA5NThmCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAwOTU4ZikKLSNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICgtMS45OTgwNzVmKQotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk4MDg1ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMCAwLjAwMDk1OGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0EyICgtMC4wMDA5NThmKQorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9CMSAoLTEuOTk4MDc1ZikKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQjIgMC45OTgwODVmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjEzLDc0ICs2MTMsNzQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEFHQyBUaW1lIGNvbnN0YW50cyAqLwotI2RlZmluZSBBR0NfQVRUQUNLX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC44NDEzOTVmCi0jZGVmaW5lIEFHQ19BVFRBQ0tfRnMxMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjg4MjIyM2YKLSNkZWZpbmUgQUdDX0FUVEFDS19GczEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuODkxMjUxZgotI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45MTcyNzZmCi0jZGVmaW5lIEFHQ19BVFRBQ0tfRnMyMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjkzOTI2N2YKLSNkZWZpbmUgQUdDX0FUVEFDS19GczI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTQ0MDYxZgotI2RlZmluZSBBR0NfQVRUQUNLX0ZzMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45NTc3NDVmCi0jZGVmaW5lIEFHQ19BVFRBQ0tfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk2OTE1OGYKLSNkZWZpbmUgQUdDX0FUVEFDS19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTcxNjI4ZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzODAwMCAwLjg0MTM5NWYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczExMDI1IDAuODgyMjIzZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTIwMDAgMC44OTEyNTFmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxNjAwMCAwLjkxNzI3NmYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczIyMDUwIDAuOTM5MjY3ZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMjQwMDAgMC45NDQwNjFmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMzMjAwMCAwLjk1Nzc0NWYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczQ0MTAwIDAuOTY5MTU4ZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzNDgwMDAgMC45NzE2MjhmCiAKLSNkZWZpbmUgQUdDX0FUVEFDS19Gczg4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQ1OGYKLSNkZWZpbmUgQUdDX0FUVEFDS19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTcxMmYKLSNkZWZpbmUgQUdDX0FUVEFDS19GczE3NjQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjE5OWYKLSNkZWZpbmUgQUdDX0FUVEFDS19GczE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjgzMGYKKyNkZWZpbmUgQUdDX0FUVEFDS19Gczg4MjAwIDAuOTg0NDU4ZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzOTYwMDAgMC45ODU3MTJmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxNzY0MDAgMC45OTIxOTlmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxOTIwMDAgMC45OTI4MzBmCiAKLSNkZWZpbmUgREVDQVlfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIERFQ0FZX1NISUZUIDEwCiAKLSNkZWZpbmUgQUdDX0RFQ0FZX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDQyZgotI2RlZmluZSBBR0NfREVDQVlfRnMxMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMzBmCi0jZGVmaW5lIEFHQ19ERUNBWV9GczEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAyOGYKLSNkZWZpbmUgQUdDX0RFQ0FZX0ZzMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDIxZgotI2RlZmluZSBBR0NfREVDQVlfRnMyMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMTVmCi0jZGVmaW5lIEFHQ19ERUNBWV9GczI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAxNGYKLSNkZWZpbmUgQUdDX0RFQ0FZX0ZzMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDEwZgotI2RlZmluZSBBR0NfREVDQVlfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDhmCi0jZGVmaW5lIEFHQ19ERUNBWV9GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwN2YKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzODAwMCAwLjAwMDA0MmYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMTEwMjUgMC4wMDAwMzBmCisjZGVmaW5lIEFHQ19ERUNBWV9GczEyMDAwIDAuMDAwMDI4ZgorI2RlZmluZSBBR0NfREVDQVlfRnMxNjAwMCAwLjAwMDAyMWYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMjIwNTAgMC4wMDAwMTVmCisjZGVmaW5lIEFHQ19ERUNBWV9GczI0MDAwIDAuMDAwMDE0ZgorI2RlZmluZSBBR0NfREVDQVlfRnMzMjAwMCAwLjAwMDAxMGYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzNDQxMDAgMC4wMDAwMDhmCisjZGVmaW5lIEFHQ19ERUNBWV9GczQ4MDAwIDAuMDAwMDA3ZgogCi0jZGVmaW5lIEFHQ19ERUNBWV9Gczg4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAzOGYKLSNkZWZpbmUgQUdDX0RFQ0FZX0ZTOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDM1ZgotI2RlZmluZSBBR0NfREVDQVlfRnMxNzY0MDAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAxODhmCi0jZGVmaW5lIEFHQ19ERUNBWV9GUzE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDE3NWYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzODgyMDAgMC4wMDAwMDM4ZgorI2RlZmluZSBBR0NfREVDQVlfRlM5NjAwMCAwLjAwMDAwMzVmCisjZGVmaW5lIEFHQ19ERUNBWV9GczE3NjQwMCAwLjAwMDAwMTg4ZgorI2RlZmluZSBBR0NfREVDQVlfRlMxOTIwMDAgMC4wMDAwMDE3NWYKIAogLyogQUdDIEdhaW4gc2V0dGluZ3MgKi8KLSNkZWZpbmUgQUdDX0dBSU5fU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KLSNkZWZpbmUgQUdDX0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KLSNkZWZpbmUgQUdDX1RBUkdFVExFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg4NTUzZgotI2RlZmluZSBBR0NfSFBGR0FJTl8wZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MTI1MzhmCi0jZGVmaW5lIEFHQ19HQUlOXzBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQUdDX0hQRkdBSU5fMWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTg0ODkzZgotI2RlZmluZSBBR0NfR0FJTl8xZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjIwMThmCi0jZGVmaW5lIEFHQ19IUEZHQUlOXzJkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjc3ODI3OWYKLSNkZWZpbmUgQUdDX0dBSU5fMmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjU4OTI1ZgotI2RlZmluZSBBR0NfSFBGR0FJTl8zZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTUyNjJmCi0jZGVmaW5lIEFHQ19HQUlOXzNkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQxMjUzOGYKLSNkZWZpbmUgQUdDX0hQRkdBSU5fNGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjM4NzIxZgotI2RlZmluZSBBR0NfR0FJTl80ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41ODQ4OTNmCi0jZGVmaW5lIEFHQ19IUEZHQUlOXzVkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjUxMTg4NmYKLSNkZWZpbmUgQUdDX0dBSU5fNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzc4Mjc5ZgotI2RlZmluZSBBR0NfSFBGR0FJTl82ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS44MTgzODNmCi0jZGVmaW5lIEFHQ19HQUlOXzZkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5NTI2MmYKLSNkZWZpbmUgQUdDX0hQRkdBSU5fN2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTYyMjc4ZgotI2RlZmluZSBBR0NfR0FJTl83ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMzg3MjFmCi0jZGVmaW5lIEFHQ19IUEZHQUlOXzhkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjU0ODEzNGYKLSNkZWZpbmUgQUdDX0dBSU5fOGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTExODg2ZgotI2RlZmluZSBBR0NfSFBGR0FJTl85ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi45ODEwNzJmCi0jZGVmaW5lIEFHQ19HQUlOXzlkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjgxODM4M2YKLSNkZWZpbmUgQUdDX0hQRkdBSU5fMTBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNDY2ODM2ZgotI2RlZmluZSBBR0NfR0FJTl8xMGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xNjIyNzhmCi0jZGVmaW5lIEFHQ19IUEZHQUlOXzExZEIgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjAxMTg3MmYKLSNkZWZpbmUgQUdDX0dBSU5fMTFkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNTQ4MTM0ZgotI2RlZmluZSBBR0NfSFBGR0FJTl8xMmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgNC42MjM0MTNmCi0jZGVmaW5lIEFHQ19HQUlOXzEyZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjk4MTA3MmYKLSNkZWZpbmUgQUdDX0hQRkdBSU5fMTNkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuMzA5NTczZgotI2RlZmluZSBBR0NfR0FJTl8xM2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy40NjY4MzZmCi0jZGVmaW5lIEFHQ19IUEZHQUlOXzE0ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICA2LjA3OTQ1OGYKLSNkZWZpbmUgQUdDX0dBSU5fMTRkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDExODcyZgotI2RlZmluZSBBR0NfSFBGR0FJTl8xNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgNi45NDMyODJmCi0jZGVmaW5lIEFHQ19HQUlOXzE1ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjYyMzQxM2YKKyNkZWZpbmUgQUdDX0dBSU5fU0NBTEUgMzEgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIEFHQ19HQUlOX1NISUZUIDQgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBBR0NfVEFSR0VUTEVWRUwgMC45ODg1NTNmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzBkQiAwLjQxMjUzOGYKKyNkZWZpbmUgQUdDX0dBSU5fMGRCIDAuMDAwMDAwZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xZEIgMC41ODQ4OTNmCisjZGVmaW5lIEFHQ19HQUlOXzFkQiAwLjEyMjAxOGYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMmRCIDAuNzc4Mjc5ZgorI2RlZmluZSBBR0NfR0FJTl8yZEIgMC4yNTg5MjVmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzNkQiAwLjk5NTI2MmYKKyNkZWZpbmUgQUdDX0dBSU5fM2RCIDAuNDEyNTM4ZgorI2RlZmluZSBBR0NfSFBGR0FJTl80ZEIgMS4yMzg3MjFmCisjZGVmaW5lIEFHQ19HQUlOXzRkQiAwLjU4NDg5M2YKKyNkZWZpbmUgQUdDX0hQRkdBSU5fNWRCIDEuNTExODg2ZgorI2RlZmluZSBBR0NfR0FJTl81ZEIgMC43NzgyNzlmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzZkQiAxLjgxODM4M2YKKyNkZWZpbmUgQUdDX0dBSU5fNmRCIDAuOTk1MjYyZgorI2RlZmluZSBBR0NfSFBGR0FJTl83ZEIgMi4xNjIyNzhmCisjZGVmaW5lIEFHQ19HQUlOXzdkQiAxLjIzODcyMWYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fOGRCIDIuNTQ4MTM0ZgorI2RlZmluZSBBR0NfR0FJTl84ZEIgMS41MTE4ODZmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzlkQiAyLjk4MTA3MmYKKyNkZWZpbmUgQUdDX0dBSU5fOWRCIDEuODE4MzgzZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xMGRCIDMuNDY2ODM2ZgorI2RlZmluZSBBR0NfR0FJTl8xMGRCIDIuMTYyMjc4ZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xMWRCIDQuMDExODcyZgorI2RlZmluZSBBR0NfR0FJTl8xMWRCIDIuNTQ4MTM0ZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xMmRCIDQuNjIzNDEzZgorI2RlZmluZSBBR0NfR0FJTl8xMmRCIDIuOTgxMDcyZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xM2RCIDUuMzA5NTczZgorI2RlZmluZSBBR0NfR0FJTl8xM2RCIDMuNDY2ODM2ZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xNGRCIDYuMDc5NDU4ZgorI2RlZmluZSBBR0NfR0FJTl8xNGRCIDQuMDExODcyZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xNWRCIDYuOTQzMjgyZgorI2RlZmluZSBBR0NfR0FJTl8xNWRCIDQuNjIzNDEzZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY4OSwzOCArNjg5LDM4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBWb2x1bWUgY29udHJvbCBnYWluICovCi0jZGVmaW5lIFZPTFVNRV9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogSW4gZEJzICovCi0jZGVmaW5lIFZPTFVNRV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogSW4gZEJzICovCisjZGVmaW5lIFZPTFVNRV9NQVggMCAgIC8qIEluIGRCcyAqLworI2RlZmluZSBWT0xVTUVfU0hJRlQgMCAvKiBJbiBkQnMgKi8KIAogLyogVm9sdW1lIGNvbnRyb2wgdGltZSBjb25zdGFudHMgKi8KLSNkZWZpbmUgVk9MX1RDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KLSNkZWZpbmUgVk9MX1RDX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjQ2OTBmCi0jZGVmaW5lIFZPTF9UQ19GczExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDE3OTc3ZgotI2RlZmluZSBWT0xfVENfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAxNjUyOWYKLSNkZWZpbmUgVk9MX1RDX0ZzMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMTI0MjJmCi0jZGVmaW5lIFZPTF9UQ19GczIyMDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA5MDI5ZgotI2RlZmluZSBWT0xfVENfRnMyNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwODI5OWYKLSNkZWZpbmUgVk9MX1RDX0ZzMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDYyMzFmCi0jZGVmaW5lIFZPTF9UQ19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA0NTI1ZgotI2RlZmluZSBWT0xfVENfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwNDE1OGYKLSNkZWZpbmUgVk9MX1RDX0ZzODgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDIyNjNmCi0jZGVmaW5lIFZPTF9UQ19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAyMDc5ZgotI2RlZmluZSBWT0xfVENfRnMxNzY0MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMTEzMWYKLSNkZWZpbmUgVk9MX1RDX0ZzMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDEwMzlmCi0jZGVmaW5lIE1JWF9UQ19GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5MzY1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC44OTYxNTEgKi8KLSNkZWZpbmUgTUlYX1RDX0ZzMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAyMzAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkyMjU0OCAqLwotI2RlZmluZSBNSVhfVENfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDQyMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTI4NDE1ICovCi0jZGVmaW5lIE1JWF9UQ19GczE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwOTc4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NDUzODcgKi8KLSNkZWZpbmUgTUlYX1RDX0ZzMjIwNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE0NTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1OTgwNCAqLwotI2RlZmluZSBNSVhfVENfRnMyNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTU1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTYyOTU2ICovCi0jZGVmaW5lIE1JWF9UQ19GczMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxODUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzE5NzMgKi8KLSNkZWZpbmUgTUlYX1RDX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwOTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3OTUxNSAqLwotI2RlZmluZSBNSVhfVENfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjE1MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgxMTUwICovCisjZGVmaW5lIFZPTF9UQ19TSElGVCAyMSAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgVk9MX1RDX0ZzODAwMCAwLjAyNDY5MGYKKyNkZWZpbmUgVk9MX1RDX0ZzMTEwMjUgMC4wMTc5NzdmCisjZGVmaW5lIFZPTF9UQ19GczEyMDAwIDAuMDE2NTI5ZgorI2RlZmluZSBWT0xfVENfRnMxNjAwMCAwLjAxMjQyMmYKKyNkZWZpbmUgVk9MX1RDX0ZzMjIwNTAgMC4wMDkwMjlmCisjZGVmaW5lIFZPTF9UQ19GczI0MDAwIDAuMDA4Mjk5ZgorI2RlZmluZSBWT0xfVENfRnMzMjAwMCAwLjAwNjIzMWYKKyNkZWZpbmUgVk9MX1RDX0ZzNDQxMDAgMC4wMDQ1MjVmCisjZGVmaW5lIFZPTF9UQ19GczQ4MDAwIDAuMDA0MTU4ZgorI2RlZmluZSBWT0xfVENfRnM4ODIwMCAwLjAwMjI2M2YKKyNkZWZpbmUgVk9MX1RDX0ZzOTYwMDAgMC4wMDIwNzlmCisjZGVmaW5lIFZPTF9UQ19GczE3NjQwMCAwLjAwMTEzMWYKKyNkZWZpbmUgVk9MX1RDX0ZzMTkyMDAwIDAuMDAxMDM5ZgorI2RlZmluZSBNSVhfVENfRnM4MDAwIDI5MzY1ICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjg5NjE1MSAqLworI2RlZmluZSBNSVhfVENfRnMxMTAyNSAzMDIzMCAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkyMjU0OCAqLworI2RlZmluZSBNSVhfVENfRnMxMjAwMCAzMDQyMiAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkyODQxNSAqLworI2RlZmluZSBNSVhfVENfRnMxNjAwMCAzMDk3OCAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk0NTM4NyAqLworI2RlZmluZSBNSVhfVENfRnMyMjA1MCAzMTQ1MSAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1OTgwNCAqLworI2RlZmluZSBNSVhfVENfRnMyNDAwMCAzMTU1NCAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2Mjk1NiAqLworI2RlZmluZSBNSVhfVENfRnMzMjAwMCAzMTg1MCAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MTk3MyAqLworI2RlZmluZSBNSVhfVENfRnM0NDEwMCAzMjA5NyAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3OTUxNSAqLworI2RlZmluZSBNSVhfVENfRnM0ODAwMCAzMjE1MCAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MTE1MCAqLwogLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODk3MDQgKi8KLSNkZWZpbmUgTUlYX1RDX0ZzODgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI0MzAKLSNkZWZpbmUgTUlYX1RDX0ZzOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI0NTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MDUzMCAqLworI2RlZmluZSBNSVhfVENfRnM4ODIwMCAzMjQzMAorI2RlZmluZSBNSVhfVENfRnM5NjAwMCAzMjQ1NiAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MDUzMCAqLwogLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTQ4MzggKi8KLSNkZWZpbmUgTUlYX1RDX0ZzMTc2NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI1OTgKLSNkZWZpbmUgTUlYX1RDX0ZzMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI2MTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MjUyNCAqLworI2RlZmluZSBNSVhfVENfRnMxNzY0MDAgMzI1OTgKKyNkZWZpbmUgTUlYX1RDX0ZzMTkyMDAwIDMyNjExIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkyNTI0ICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuY3BwCmluZGV4IDUzZmVhZTguLjlmZTgxMTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jcHAKQEAgLTIxLDYgKzIxLDggQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9CaXF1YWRGaWx0ZXIuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlICJMVkRCRS5oIgogI2luY2x1ZGUgIkxWREJFX1ByaXZhdGUuaCIKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCkBAIC00NywxNSArNDksMTIgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9HZXRQYXJhbWV0ZXJzKExWREJFX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICAqcFBhcmFtcykKLXsKLQotICAgIExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0dldFBhcmFtZXRlcnMoTFZEQkVfSGFuZGxlX3QgaEluc3RhbmNlLCBMVkRCRV9QYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWREJFX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkRCRV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CiAKICAgICAqcFBhcmFtcyA9IHBJbnN0YW5jZS0+UGFyYW1zOwogCi0gICAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZEQkVfU1VDQ0VTUyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC03NywxNSArNzYsMTMgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfR2V0Q2FwYWJpbGl0aWVzKExWREJFX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICpwQ2FwYWJpbGl0aWVzKQotewotCi0gICAgTFZEQkVfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZEQkVfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfR2V0Q2FwYWJpbGl0aWVzKExWREJFX0hhbmRsZV90IGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QqIHBDYXBhYmlsaXRpZXMpIHsKKyAgICBMVkRCRV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZEQkVfSW5zdGFuY2VfdCopaEluc3RhbmNlOwogCiAgICAgKnBDYXBhYmlsaXRpZXMgPSBwSW5zdGFuY2UtPkNhcGFiaWxpdGllczsKIAotICAgIHJldHVybihMVkRCRV9TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWREJFX1NVQ0NFU1MpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTAxLDM1ICs5OCwzMCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgICAgTFZEQkVfU2V0RmlsdGVycyhMVkRCRV9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQotewotCit2b2lkIExWREJFX1NldEZpbHRlcnMoTFZEQkVfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVkRCRV9QYXJhbXNfdCogcFBhcmFtcykgewogICAgIC8qCiAgICAgICogQ2FsY3VsYXRlIHRoZSB0YWJsZSBvZmZzZXRzCiAgICAgICovCi0gICAgTFZNX1VJTlQxNiBPZmZzZXQgPSAoTFZNX1VJTlQxNikoKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZSArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShwUGFyYW1zLT5DZW50cmVGcmVxdWVuY3kgKiAoMStMVkRCRV9GU18xOTIwMDApKSk7CisgICAgTFZNX1VJTlQxNiBPZmZzZXQgPQorICAgICAgICAgICAgKExWTV9VSU5UMTYpKChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGUgKworICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShwUGFyYW1zLT5DZW50cmVGcmVxdWVuY3kgKiAoMSArIExWREJFX0ZTXzE5MjAwMCkpKTsKIAogICAgIC8qCiAgICAgICogU2V0dXAgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIKICAgICAgKi8KLSAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLwotICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcywgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihwSW5zdGFuY2UtPnBEYXRhLT5IUEZUYXBzKSAvIHNpemVvZihMVk1fRkxPQVQpKTsgLyogTnVtYmVyIG9mIHdvcmRzICovCi0gICAgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsICAgIC8qIEluaXRpYWxpc2UgdGhlIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQlFfRkxPQVRfQ29lZnNfdCAqKSZMVkRCRV9IUEZfVGFibGVbT2Zmc2V0XSk7CisgICAgc3RkOjphcnJheTxMVk1fRkxPQVQsIGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjprQmlxdWFkTnVtQ29lZnM+IGNvZWZzID0geworICAgICAgICAgICAgTFZEQkVfSFBGX1RhYmxlW09mZnNldF0uQTAsIExWREJFX0hQRl9UYWJsZVtPZmZzZXRdLkExLCBMVkRCRV9IUEZfVGFibGVbT2Zmc2V0XS5BMiwKKyAgICAgICAgICAgIC0oTFZEQkVfSFBGX1RhYmxlW09mZnNldF0uQjEpLCAtKExWREJFX0hQRl9UYWJsZVtPZmZzZXRdLkIyKX07CisgICAgcEluc3RhbmNlLT5wSFBGQmlxdWFkCisgICAgICAgICAgICAtPnNldENvZWZmaWNpZW50czxzdGQ6OmFycmF5PExWTV9GTE9BVCwgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OmtCaXF1YWROdW1Db2Vmcz4+KGNvZWZzKTsKIAogICAgIC8qCiAgICAgICogU2V0dXAgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKICAgICAgKi8KLSAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGhpc3RvcnksIHZhbHVlIDAgKi8KLSAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKSZwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzLCAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgc2l6ZW9mKHBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMpIC8gc2l6ZW9mKExWTV9GTE9BVCkpOyAgIC8qIE51bWJlciBvZiB3b3JkcyAqLwotICAgIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAgICAvKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJQX0ZMT0FUX0NvZWZzX3QgKikmTFZEQkVfQlBGX1RhYmxlW09mZnNldF0pOworICAgIGNvZWZzID0ge0xWREJFX0JQRl9UYWJsZVtPZmZzZXRdLkEwLCAwLjAsIC0oTFZEQkVfQlBGX1RhYmxlW09mZnNldF0uQTApLAorICAgICAgICAgICAgIC0oTFZEQkVfQlBGX1RhYmxlW09mZnNldF0uQjEpLCAtKExWREJFX0JQRl9UYWJsZVtPZmZzZXRdLkIyKX07CisgICAgcEluc3RhbmNlLT5wQlBGQmlxdWFkCisgICAgICAgICAgICAtPnNldENvZWZmaWNpZW50czxzdGQ6OmFycmF5PExWTV9GTE9BVCwgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OmtCaXF1YWROdW1Db2Vmcz4+KGNvZWZzKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE0NSwyOSArMTM3LDI2IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAgICBMVkRCRV9TZXRBR0MoTFZEQkVfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQotewotCit2b2lkIExWREJFX1NldEFHQyhMVkRCRV9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWREJFX1BhcmFtc190KiBwUGFyYW1zKSB7CiAgICAgLyoKICAgICAgKiBHZXQgdGhlIGF0dGFjayBhbmQgZGVjYXkgdGltZSBjb25zdGFudHMKICAgICAgKi8KLSAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfQXR0YWNrID0gTFZEQkVfQUdDX0FUVEFDS19UYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsgIC8qIEF0dGFjayBtdWx0aXBsaWVyICovCi0gICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX0RlY2F5ICA9IExWREJFX0FHQ19ERUNBWV9UYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsgICAvKiBEZWNheSBtdWx0aXBsZXIgKi8KKyAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfQXR0YWNrID0KKyAgICAgICAgICAgIExWREJFX0FHQ19BVFRBQ0tfVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07IC8qIEF0dGFjayBtdWx0aXBsaWVyICovCisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX0RlY2F5ID0KKyAgICAgICAgICAgIExWREJFX0FHQ19ERUNBWV9UYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsgLyogRGVjYXkgbXVsdGlwbGVyICovCiAKICAgICAvKgogICAgICAqIEdldCB0aGUgYm9vc3QgZ2FpbgogICAgICAqLwotICAgIGlmIChwUGFyYW1zLT5IUEZTZWxlY3QgPT0gTFZEQkVfSFBGX09OKQotICAgIHsKLSAgICAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX01heEdhaW4gICA9IExWREJFX0FHQ19IUEZHQUlOX1RhYmxlWyhMVk1fVUlOVDE2KXBQYXJhbXMtPkVmZmVjdExldmVsXTsgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgb24gKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX01heEdhaW4gICA9IExWREJFX0FHQ19HQUlOX1RhYmxlWyhMVk1fVUlOVDE2KXBQYXJhbXMtPkVmZmVjdExldmVsXTsgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgb2ZmICovCisgICAgaWYgKHBQYXJhbXMtPkhQRlNlbGVjdCA9PSBMVkRCRV9IUEZfT04pIHsKKyAgICAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX01heEdhaW4gPQorICAgICAgICAgICAgICAgIExWREJFX0FHQ19IUEZHQUlOX1RhYmxlWyhMVk1fVUlOVDE2KXBQYXJhbXMtPkVmZmVjdExldmVsXTsgLyogSGlnaCBwYXNzIGZpbHRlciBvbiAqLworICAgIH0gZWxzZSB7CisgICAgICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19NYXhHYWluID0KKyAgICAgICAgICAgICAgICBMVkRCRV9BR0NfR0FJTl9UYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5FZmZlY3RMZXZlbF07IC8qIEhpZ2ggcGFzcyBmaWx0ZXIgb2ZmICovCiAgICAgfQogICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19UYXJnZXQgPSBBR0NfVEFSR0VUTEVWRUw7Ci0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE5MywyOSArMTgyLDIyIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAgICBMVkRCRV9TZXRWb2x1bWUoTFZEQkVfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQotewordm9pZCBMVkRCRV9TZXRWb2x1bWUoTFZEQkVfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVkRCRV9QYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWTV9VSU5UMTYgZEJTaGlmdHM7ICAvKiA2ZEIgc2hpZnRzICovCisgICAgTFZNX1VJTlQxNiBkQk9mZnNldDsgIC8qIFRhYmxlIG9mZnNldCAqLworICAgIExWTV9JTlQxNiBWb2x1bWUgPSAwOyAvKiBSZXF1aXJlZCB2b2x1bWUgaW4gZEJzICovCiAKLSAgICBMVk1fVUlOVDE2ICAgICAgZEJTaGlmdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2ZEIgc2hpZnRzICovCi0gICAgTFZNX1VJTlQxNiAgICAgIGRCT2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGFibGUgb2Zmc2V0ICovCi0gICAgTFZNX0lOVDE2ICAgICAgIFZvbHVtZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVxdWlyZWQgdm9sdW1lIGluIGRCcyAqLwotCi0gICAgTFZNX0ZMT0FUICAgICAgICBkQlNoaWZ0c19mYWM7CisgICAgTFZNX0ZMT0FUIGRCU2hpZnRzX2ZhYzsKICAgICAvKgogICAgICAqIEFwcGx5IHRoZSB2b2x1bWUgaWYgZW5hYmxlZAogICAgICAqLwotICAgIGlmIChwUGFyYW1zLT5Wb2x1bWVDb250cm9sID09IExWREJFX1ZPTFVNRV9PTikKLSAgICB7CisgICAgaWYgKHBQYXJhbXMtPlZvbHVtZUNvbnRyb2wgPT0gTFZEQkVfVk9MVU1FX09OKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIExpbWl0IHRoZSBnYWluIHRvIHRoZSBtYXhpbXVtIGFsbG93ZWQKICAgICAgICAgICovCi0gICAgICAgIGlmICAocFBhcmFtcy0+Vm9sdW1lZEIgPiBWT0xVTUVfTUFYKQotICAgICAgICB7CisgICAgICAgIGlmIChwUGFyYW1zLT5Wb2x1bWVkQiA+IFZPTFVNRV9NQVgpIHsKICAgICAgICAgICAgIFZvbHVtZSA9IFZPTFVNRV9NQVg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBWb2x1bWUgPSBwUGFyYW1zLT5Wb2x1bWVkQjsKICAgICAgICAgfQogICAgIH0KQEAgLTIyMyw4ICsyMDUsOCBAQAogICAgIC8qCiAgICAgICogQ2FsY3VsYXRlIHRoZSByZXF1aXJlZCBnYWluIGFuZCBzaGlmdHMKICAgICAgKi8KLSAgICBkQk9mZnNldCA9IChMVk1fVUlOVDE2KSg2ICsgVm9sdW1lICUgNik7ICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIGRCcyAwLTUgKi8KLSAgICBkQlNoaWZ0cyA9IChMVk1fVUlOVDE2KShWb2x1bWUgLyAtNik7ICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIDZkQiBzaGlmdHMgKi8KKyAgICBkQk9mZnNldCA9IChMVk1fVUlOVDE2KSg2ICsgVm9sdW1lICUgNik7IC8qIEdldCB0aGUgZEJzIDAtNSAqLworICAgIGRCU2hpZnRzID0gKExWTV9VSU5UMTYpKFZvbHVtZSAvIC02KTsgICAgLyogR2V0IHRoZSA2ZEIgc2hpZnRzICovCiAKICAgICBkQlNoaWZ0c19mYWMgPSAoTFZNX0ZMT0FUKSgxIDw8IGRCU2hpZnRzKTsKICAgICAvKgpAQCAtMjMyLDI3ICsyMTQsMjMgQEAKICAgICAgKi8KICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQgPSAoTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQgPSBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQgLyBkQlNoaWZ0c19mYWM7Ci0gICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVm9sdW1lVEMgICAgPSBMVkRCRV9Wb2x1bWVUQ1RhYmxlWyhMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGVdOyAgIC8qIFZvbHVtZSB1cGRhdGUgdGltZSBjb25zdGFudCAqLworICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlZvbHVtZVRDID0KKyAgICAgICAgICAgIExWREJFX1ZvbHVtZVRDVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07IC8qIFZvbHVtZSB1cGRhdGUgdGltZSBjb25zdGFudCAqLwogCiAgICAgLyoKICAgICAgKiBXaGVuIERCRSBpcyBkaXNhYmxlZCB1c2UgdGhlIGJ5cGFzcyB2b2x1bWUgY29udHJvbAogICAgICAqLwotICAgIGlmKGRCU2hpZnRzID4gMCkKLSAgICB7CisgICAgaWYgKGRCU2hpZnRzID4gMCkgewogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdIC8gZEJTaGlmdHNfZmFjKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKICAgICB9CiAKICAgICBwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSAxOwogICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfTUlYRVJfVEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRnNfZW4pcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9NSVhFUl9UQywgKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLCAyKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yOTIsMjEgKzI3MCwyNSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0NvbnRyb2woTFZEQkVfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICAgKnBQYXJhbXMpCi17CitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfQ29udHJvbChMVkRCRV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWREJFX1BhcmFtc190KiBwUGFyYW1zKSB7CisgICAgTFZEQkVfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWREJFX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKKyAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QqIHBCeXBhc3NNaXhlcl9JbnN0YW5jZSA9ICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlcjsKIAotICAgIExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgKnBCeXBhc3NNaXhlcl9JbnN0YW5jZSA9ICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlcjsKLQorICAgIC8qCisgICAgICogQ3JlYXRlIGJpcXVhZCBpbnN0YW5jZQorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzICE9IHBQYXJhbXMtPk5yQ2hhbm5lbHMpIHsKKyAgICAgICAgcEluc3RhbmNlLT5wSFBGQmlxdWFkLnJlc2V0KAorICAgICAgICAgICAgICAgIG5ldyBhbmRyb2lkOjphdWRpb191dGlsczo6QmlxdWFkRmlsdGVyPExWTV9GTE9BVD4ocFBhcmFtcy0+TnJDaGFubmVscykpOworICAgIH0KICAgICAvKgogICAgICAqIFVwZGF0ZSB0aGUgZmlsdGVycwogICAgICAqLwogICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSB8fAotICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuQ2VudHJlRnJlcXVlbmN5ICE9IHBQYXJhbXMtPkNlbnRyZUZyZXF1ZW5jeSkpCi0gICAgewotICAgICAgICBMVkRCRV9TZXRGaWx0ZXJzKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7ICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzICovCisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzICE9IHBQYXJhbXMtPk5yQ2hhbm5lbHMpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5DZW50cmVGcmVxdWVuY3kgIT0gcFBhcmFtcy0+Q2VudHJlRnJlcXVlbmN5KSkgeworICAgICAgICBMVkRCRV9TZXRGaWx0ZXJzKHBJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOyAgLyogTmV3IHBhcmFtZXRlcnMgKi8KICAgICB9CiAKICAgICAvKgpAQCAtMzE0LDE2ICsyOTYsMTQgQEAKICAgICAgKi8KICAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLkVmZmVjdExldmVsICE9IHBQYXJhbXMtPkVmZmVjdExldmVsKSB8fAotICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ICE9IHBQYXJhbXMtPkhQRlNlbGVjdCkpCi0gICAgewotICAgICAgICBMVkRCRV9TZXRBR0MocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzICovCi0gICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sCi0gICAgICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCAhPSBwUGFyYW1zLT5IUEZTZWxlY3QpKSB7CisgICAgICAgIExWREJFX1NldEFHQyhwSW5zdGFuY2UsIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOyAgLyogTmV3IHBhcmFtZXRlcnMgKi8KKyAgICAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgTFZEQkVfQllQQVNTX01JWEVSX1RDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CiAKLSAgICAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwKLSAgICAgICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOwotCisgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sIExWREJFX0JZUEFTU19NSVhFUl9UQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOwogICAgIH0KIAogICAgIC8qCkBAIC0zMzIsMTkgKzMxMiwxNiBAQAogICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuVm9sdW1lZEIgIT0gcFBhcmFtcy0+Vm9sdW1lZEIpIHx8CiAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8CiAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5IZWFkcm9vbWRCICE9IHBQYXJhbXMtPkhlYWRyb29tZEIpIHx8Ci0gICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Wb2x1bWVDb250cm9sICE9IHBQYXJhbXMtPlZvbHVtZUNvbnRyb2wpKQotICAgIHsKLSAgICAgICAgTFZEQkVfU2V0Vm9sdW1lKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyAqLworICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuVm9sdW1lQ29udHJvbCAhPSBwUGFyYW1zLT5Wb2x1bWVDb250cm9sKSkgeworICAgICAgICBMVkRCRV9TZXRWb2x1bWUocEluc3RhbmNlLCAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsgIC8qIE5ldyBwYXJhbWV0ZXJzICovCiAgICAgfQogCi0gICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGU9PUxWREJFX09OICYmIHBQYXJhbXMtPk9wZXJhdGluZ01vZGU9PUxWREJFX09GRikKLSAgICB7CisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT04gJiYgcFBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9PSBMVkRCRV9PRkYpIHsKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sIDApOwogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMS4wZik7CiAgICAgfQotICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlPT1MVkRCRV9PRkYgJiYgcFBhcmFtcy0+T3BlcmF0aW5nTW9kZT09TFZEQkVfT04pCi0gICAgeworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09GRiAmJiBwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWREJFX09OKSB7CiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLCAxLjBmKTsKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDApOwogICAgIH0KQEAgLTM1NCw1ICszMzEsNSBAQAogICAgICAqLwogICAgIHBJbnN0YW5jZS0+UGFyYW1zID0gKnBQYXJhbXM7CiAKLSAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVkRCRV9TVUNDRVNTKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmNwcAppbmRleCBhZDc3Njk2Li5iMTEzZjQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuY3BwCkBAIC0yMSwyMDkgKzIxLDkzIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSAiTFZEQkUuaCIKICNpbmNsdWRlICJMVkRCRV9Qcml2YXRlLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWREJFX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgKi8KLS8qICAgIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBoSW5zdGFuY2UgPSBJbnN0YW5jZSBoYW5kbGUgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJhc2UgYWRkcmVzc2VzIGZvciB0aGUgaW5zdGFuY2UgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgdGhlIG1lbW9yeSAgICAqLwotLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZnJlZSAoaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlKSB0aGUgbWVtb3J5ICAgICAqLwotLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgKi8KLS8qICAgIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkRCRV9TVUNDRVNTICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIDEuICAgIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkRCRV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX01lbW9yeShMVkRCRV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfTWVtVGFiX3QgICAgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICAgICpwQ2FwYWJpbGl0aWVzKQotewotCi0gICAgTFZNX1VJTlQzMiAgICAgICAgICBTY3JhdGNoU2l6ZTsKLSAgICBMVkRCRV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPSAoTFZEQkVfSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKLQotICAgIC8qCi0gICAgICogRmlsbCBpbiB0aGUgbWVtb3J5IHRhYmxlCi0gICAgICovCi0gICAgaWYgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEluc3RhbmNlIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX0lOU1RBTkNFXS5TaXplICAgICAgICAgPSBzaXplb2YoTFZEQkVfSW5zdGFuY2VfdCk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9JTlNUQU5DRV0uQWxpZ25tZW50ICAgID0gTFZEQkVfSU5TVEFOQ0VfQUxJR047Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9JTlNUQU5DRV0uVHlwZSAgICAgICAgID0gTFZEQkVfUEVSU0lTVEVOVDsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBEYXRhIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgID0gc2l6ZW9mKExWREJFX0RhdGFfRkxPQVRfdCk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLkFsaWdubWVudCAgICA9IExWREJFX1BFUlNJU1RFTlRfREFUQV9BTElHTjsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uVHlwZSAgICAgICAgID0gTFZEQkVfUEVSU0lTVEVOVF9EQVRBOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDb2VmIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgID0gc2l6ZW9mKExWREJFX0NvZWZfRkxPQVRfdCk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLkFsaWdubWVudCAgICA9IExWREJFX1BFUlNJU1RFTlRfQ09FRl9BTElHTjsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZEQkVfUEVSU0lTVEVOVF9DT0VGOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTY3JhdGNoIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgU2NyYXRjaFNpemUgPSAoTFZNX1VJTlQzMikoTFZEQkVfU0NSQVRDSEJVRkZFUlNfSU5QTEFDRSpzaXplb2YoTFZNX0ZMT0FUKSAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0uU2l6ZSAgICAgICAgID0gU2NyYXRjaFNpemU7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5BbGlnbm1lbnQgICAgPSBMVkRCRV9TQ1JBVENIX0FMSUdOOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0uVHlwZSAgICAgICAgID0gTFZEQkVfU0NSQVRDSDsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBSZWFkIGJhY2sgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KLSAgICAgICAgKnBNZW1vcnlUYWJsZSA9IHBJbnN0YW5jZS0+TWVtb3J5VGFibGU7Ci0gICAgfQotCi0gICAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkRCRV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ3JlYXRlIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCBtb2R1bGUgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFsZ29yaXRobSBpbnN0YW5jZSBieSBjYWxsaW5nIHdpdGggICAgICAgICAqLwotLyogICAgaEluc3RhbmNlIHNldCB0byBOVUxMLiBJbiB0aGlzIGNhc2UgdGhlIGFsZ29yaXRobSByZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgICAgICAgICovCi0vKiAgICBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBmb3JjZSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24gb2YgdGhlIGFsZ29yaXRobSAgICAgICovCi0vKiAgICBieSBjYWxsaW5nIHdpdGggaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlLiBJbiB0aGlzIGNhc2UgdGhlIG1lbW9yeSB0YWJsZSAgICAgICAgKi8KLS8qICAgIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIGVuc3VyZWQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gICAqLwotLyogICAgREJFX01lbW9yeSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgQmFzcyBFbmhhbmNlbWVudCBtb2R1bGUgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAqLworLyogIHBTY3JhdGNoICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBidW5kbGUgc2NyYXRjaCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIExWREJFX1NVQ0NFU1MgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZEQkVfQUxJR05NRU5URVJST1IgICAgSW5zdGFuY2Ugb3Igc2NyYXRjaCBtZW1vcnkgb24gaW5jb3JyZWN0IGFsaWdubWVudCAgICAgICAgICAgKi8KLS8qICAgIExWREJFX05VTExBRERSRVNTICAgICAgICBJbnN0YW5jZSBvciBzY3JhdGNoIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAqLworLyogIExWREJFX05VTExBRERSRVNTICAgICAgICBPbmUgb3IgbW9yZSBtZW1vcnkgaGFzIGEgTlVMTCBwb2ludGVyIC0gbWFsbG9jIGZhaWx1cmUgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICAgICBUaGUgaW5zdGFuY2UgaGFuZGxlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1lbW9yeSAgICovCi0vKiAgICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIDIuICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAqLworLyogIDEuICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfSW5pdChMVkRCRV9IYW5kbGVfdCAgICAgICAgICpwaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9NZW1UYWJfdCAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAqcENhcGFiaWxpdGllcykKLXsKLQotICAgIExWREJFX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlOwotICAgIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAgICAgICAqcE1peGVyX0luc3RhbmNlOwotICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAqcEJ5cGFzc01peGVyX0luc3RhbmNlOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICBNaXhHYWluOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICBpOworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0luaXQoTFZEQkVfSGFuZGxlX3QqIHBoSW5zdGFuY2UsIExWREJFX0NhcGFiaWxpdGllc190KiBwQ2FwYWJpbGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFNjcmF0Y2gpIHsKKyAgICBMVkRCRV9JbnN0YW5jZV90KiBwSW5zdGFuY2U7CisgICAgTFZNaXhlcjNfMVN0X0ZMT0FUX3N0KiBwTWl4ZXJfSW5zdGFuY2U7CisgICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0KiBwQnlwYXNzTWl4ZXJfSW5zdGFuY2U7CisgICAgTFZNX0ZMT0FUIE1peEdhaW47CiAKICAgICAvKgotICAgICAqIFNldCB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkCisgICAgICogQ3JlYXRlIHRoZSBpbnN0YW5jZSBoYW5kbGUgaWYgbm90IGFscmVhZHkgaW5pdGlhbGlzZWQKICAgICAgKi8KLSAgICBpZiAoKnBoSW5zdGFuY2UgPT0gTFZNX05VTEwpCi0gICAgewotICAgICAgICAqcGhJbnN0YW5jZSA9IChMVkRCRV9IYW5kbGVfdClwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0VdLnBCYXNlQWRkcmVzczsKKyAgICBpZiAoKnBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgKnBoSW5zdGFuY2UgPSBuZXcgTFZEQkVfSW5zdGFuY2VfdHt9OwogICAgIH0KLSAgICBwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICAqKSpwaEluc3RhbmNlOwotCi0gICAgLyoKLSAgICAgKiBDaGVjayB0aGUgbWVtb3J5IHRhYmxlIGZvciBOVUxMIHBvaW50ZXJzIGFuZCBpbmNvcnJlY3RseSBhbGlnbmVkIGRhdGEKLSAgICAgKi8KLSAgICBmb3IgKGk9MDsgaTxMVkRCRV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLlNpemUhPTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3M9PUxWTV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybihMVkRCRV9OVUxMQUREUkVTUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKCh1aW50cHRyX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzICUgcE1lbW9yeVRhYmxlLT5SZWdpb25baV0uQWxpZ25tZW50KSE9MCl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKExWREJFX0FMSUdOTUVOVEVSUk9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KKyAgICBwSW5zdGFuY2UgPSAoTFZEQkVfSW5zdGFuY2VfdCopKnBoSW5zdGFuY2U7CiAKICAgICAvKgogICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlCiAgICAgICovCiAgICAgcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMgPSAqcENhcGFiaWxpdGllczsKIAotICAgIC8qCi0gICAgICogU2F2ZSB0aGUgbWVtb3J5IHRhYmxlIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKLSAgICAgKi8KLSAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlID0gKnBNZW1vcnlUYWJsZTsKKyAgICBwSW5zdGFuY2UtPnBTY3JhdGNoID0gcFNjcmF0Y2g7CiAKICAgICAvKgogICAgICAqIFNldCB0aGUgZGVmYXVsdCBpbnN0YW5jZSBwYXJhbWV0ZXJzCiAgICAgICovCi0gICAgcEluc3RhbmNlLT5QYXJhbXMuQ2VudHJlRnJlcXVlbmN5ICAgPSAgICBMVkRCRV9DRU5UUkVfNTVIWjsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5FZmZlY3RMZXZlbCAgICAgICA9ICAgIDA7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuSGVhZHJvb21kQiAgICAgICAgPSAgICAwOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCAgICAgICAgID0gICAgTFZEQkVfSFBGX09GRjsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICAgICA9ICAgIExWREJFX09GRjsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICAgICAgICA9ICAgIExWREJFX0ZTXzgwMDA7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuVm9sdW1lQ29udHJvbCAgICAgPSAgICBMVkRCRV9WT0xVTUVfT0ZGOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZvbHVtZWRCICAgICAgICAgID0gICAgMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5DZW50cmVGcmVxdWVuY3kgPSBMVkRCRV9DRU5UUkVfNTVIWjsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5FZmZlY3RMZXZlbCA9IDA7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuSGVhZHJvb21kQiA9IDA7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ID0gTFZEQkVfSFBGX09GRjsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZEQkVfT0ZGOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgPSBMVkRCRV9GU184MDAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZvbHVtZUNvbnRyb2wgPSBMVkRCRV9WT0xVTUVfT0ZGOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZvbHVtZWRCID0gMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzID0gRkNDXzI7CiAKICAgICAvKgotICAgICAqIFNldCBwb2ludGVyIHRvIGRhdGEgYW5kIGNvZWYgbWVtb3J5CisgICAgICogQ3JlYXRlIHBvaW50ZXIgdG8gZGF0YSBhbmQgY29lZiBtZW1vcnkKICAgICAgKi8KLSAgICBwSW5zdGFuY2UtPnBEYXRhID0KLSAgICAgICAgIChMVkRCRV9EYXRhX0ZMT0FUX3QgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3M7Ci0gICAgcEluc3RhbmNlLT5wQ29lZiA9Ci0gICAgICAgICAoTFZEQkVfQ29lZl9GTE9BVF90ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzOworICAgIHBJbnN0YW5jZS0+cERhdGEgPSAoTFZEQkVfRGF0YV9GTE9BVF90KiljYWxsb2MoMSwgc2l6ZW9mKCoocEluc3RhbmNlLT5wRGF0YSkpKTsKKyAgICBpZiAocEluc3RhbmNlLT5wRGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBMVkRCRV9OVUxMQUREUkVTUzsKKyAgICB9CisgICAgLyoKKyAgICAgKiBDcmVhdGUgYmlxdWFkIGluc3RhbmNlCisgICAgICovCisgICAgcEluc3RhbmNlLT5wSFBGQmlxdWFkLnJlc2V0KAorICAgICAgICAgICAgbmV3IGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpCaXF1YWRGaWx0ZXI8TFZNX0ZMT0FUPihwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzKSk7CisgICAgcEluc3RhbmNlLT5wQlBGQmlxdWFkLnJlc2V0KG5ldyBhbmRyb2lkOjphdWRpb191dGlsczo6QmlxdWFkRmlsdGVyPExWTV9GTE9BVD4oRkNDXzEpKTsKIAogICAgIC8qCiAgICAgICogSW5pdGlhbGlzZSB0aGUgZmlsdGVycwogICAgICAqLwotICAgIExWREJFX1NldEZpbHRlcnMocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBmaWx0ZXIgdGFwcyBhbmQgY29lZmZpY2llbnRzICovCisgICAgTFZEQkVfU2V0RmlsdGVycyhwSW5zdGFuY2UsIC8qIFNldCB0aGUgZmlsdGVyIHRhcHMgYW5kIGNvZWZmaWNpZW50cyAqLwogICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UGFyYW1zKTsKIAogICAgIC8qCiAgICAgICogSW5pdGlhbGlzZSB0aGUgQUdDCiAgICAgICovCi0gICAgTFZEQkVfU2V0QUdDKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBBR0MgZ2FpbiAqLworICAgIExWREJFX1NldEFHQyhwSW5zdGFuY2UsIC8qIFNldCB0aGUgQUdDIGdhaW4gKi8KICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UGFyYW1zKTsKICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfR2FpbiA9IHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19NYXhHYWluOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVmYXVsdCB0byB0aGUgYmFzcyBib29zdCBzZXR0aW5nICovCisgICAgLyogRGVmYXVsdCB0byB0aGUgYmFzcyBib29zdCBzZXR0aW5nICovCiAKICAgICAvLyBpbml0aWFsaXplIHRoZSBtaXhlciB3aXRoIHNvbWUgZml4ZXMgdmFsdWVzIHNpbmNlIG90aGVyd2lzZSBMVkRCRV9TZXRWb2x1bWUgZW5kcyB1cAogICAgIC8vIHJlYWRpbmcgdW5pbml0aWFsaXplZCBkYXRhCkBAIC0yMzMsMTEgKzExNywxMSBAQAogICAgIC8qCiAgICAgICogSW5pdGlhbGlzZSB0aGUgdm9sdW1lCiAgICAgICovCi0gICAgTFZEQkVfU2V0Vm9sdW1lKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgVm9sdW1lICovCisgICAgTFZEQkVfU2V0Vm9sdW1lKHBJbnN0YW5jZSwgLyogU2V0IHRoZSBWb2x1bWUgKi8KICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UGFyYW1zKTsKIAogICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlZvbHVtZSA9IHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlRhcmdldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgYXMgdGhlIHRhcmdldCAqLworICAgIC8qIEluaXRpYWxpc2UgYXMgdGhlIHRhcmdldCAqLwogICAgIE1peEdhaW4gPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKTsKICAgICBMVkNfTWl4ZXJfSW5pdCgmcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgTWl4R2FpbiwgTWl4R2Fpbik7CiAKQEAgLTI1OSwxMSArMTQzLDExIEBACiAgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtID0gMDsKICAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOwogICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrID0gTFZNX05VTEw7Ci0gICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldD0wOworICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSAwOwogCi0gICAgTFZDX01peGVyX0luaXQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sMCwwKTsKLSAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLAotICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLDIpOworICAgIExWQ19NaXhlcl9Jbml0KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCAwLCAwKTsKKyAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZzX2VuKXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsIDIpOwogCiAgICAgLyoKICAgICAgKiBTZXR1cCB0aGUgbWl4ZXIgZ2FpbiBmb3IgdGhlIHVucHJvY2Vzc2VkIHBhdGgKQEAgLTI3MSwxMCArMTU1LDM0IEBACiAgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtID0gMDsKICAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOwogICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrID0gTFZNX05VTEw7Ci0gICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldD0wOworICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgPSAwOwogICAgIExWQ19NaXhlcl9Jbml0KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLCAxLjAsIDEuMCk7Ci0gICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwKLSAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwgMik7CisgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwgTFZEQkVfQllQQVNTX01JWEVSX1RDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLCAyKTsKIAotICAgIHJldHVybihMVkRCRV9TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWREJFX1NVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkRCRV9EZUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnJlZSB0aGUgbWVtb3JpZXMgY3JlYXRlZCBkdXJpbmcgTFZEQkVfSW5pdCBpbmNsdWRpbmcgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgICBQb2ludGVyIHRvIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkRCRV9EZUluaXQoTFZEQkVfSGFuZGxlX3QqIHBoSW5zdGFuY2UpIHsKKyAgICBMVkRCRV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZEQkVfSW5zdGFuY2VfdCopKnBoSW5zdGFuY2U7CisgICAgaWYgKHBJbnN0YW5jZSA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChwSW5zdGFuY2UtPnBEYXRhICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocEluc3RhbmNlLT5wRGF0YSk7CisgICAgICAgIHBJbnN0YW5jZS0+cERhdGEgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgZGVsZXRlIHBJbnN0YW5jZTsKKyAgICAqcGhJbnN0YW5jZSA9IExWTV9OVUxMOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmgKaW5kZXggZjNmYWFlZC4uN2FjNWRiMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCkBAIC0zMyw3ICszMyw4IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaW5jbHVkZSAiTFZEQkUuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbGxpbmcgb3IgQXBwbGljYXRpb24gbGF5ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxhdWRpb191dGlscy9CaXF1YWRGaWx0ZXIuaD4KKyNpbmNsdWRlICJMVkRCRS5oIiAvKiBDYWxsaW5nIG9yIEFwcGxpY2F0aW9uIGxheWVyIGRlZmluaXRpb25zICovCiAjaW5jbHVkZSAiQklRVUFELmgiCiAjaW5jbHVkZSAiTFZDX01peGVyLmgiCiAjaW5jbHVkZSAiQUdDLmgiCkBAIC00NSwyOCArNDYsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBHZW5lcmFsICovCi0jZGVmaW5lICAgIExWREJFX0lOVkFMSUQgICAgICAgICAgICAweEZGRkYgICAgICAgIC8qIEludmFsaWQgaW5pdCBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgTFZEQkVfSU5WQUxJRCAweEZGRkYgLyogSW52YWxpZCBpbml0IHBhcmFtZXRlciAqLwogCi0vKiBNZW1vcnkgKi8KLSNkZWZpbmUgTFZEQkVfTUVNUkVHSU9OX0lOU1RBTkNFICAgICAgICAgMCAgICAgICAvKiBPZmZzZXQgdG8gdGhlIGluc3RhbmNlIG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQSAgMSAgICAgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCBkYXRhIG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRiAgMiAgICAgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCBjb2VmZmljaWVudCByZWdpb24gKi8KLSNkZWZpbmUgTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0ggICAgICAgICAgMyAgICAgICAvKiBPZmZzZXQgdG8gZGF0YSBzY3JhdGNoIG1lbW9yeSByZWdpb24gKi8KLQotI2RlZmluZSBMVkRCRV9JTlNUQU5DRV9BTElHTiAgICAgICAgICAgICA0ICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIHN0cnVjdHVyZXMgKi8KLSNkZWZpbmUgTFZEQkVfUEVSU0lTVEVOVF9EQVRBX0FMSUdOICAgICAgNCAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBkYXRhICovCi0jZGVmaW5lIExWREJFX1BFUlNJU1RFTlRfQ09FRl9BTElHTiAgICAgIDQgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgY29lZiAqLwotI2RlZmluZSBMVkRCRV9TQ1JBVENIX0FMSUdOICAgICAgICAgICAgICA0ICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgZGF0YSAqLwotCi0jaWZkZWYgU1VQUE9SVF9NQwotLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLwotI2RlZmluZSBMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFICAgICAoTFZNX01BWF9DSEFOTkVMUyAqIDMpCi0jZWxzZQotI2RlZmluZSBMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFICAgICA2ICAgICAgIC8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KLSNlbmRpZgotCi0jZGVmaW5lIExWREJFX01JWEVSX1RDICAgICAgICAgICAgICAgICAgIDUgICAgICAgLyogTWl4ZXIgdGltZSAgKi8KLSNkZWZpbmUgTFZEQkVfQllQQVNTX01JWEVSX1RDICAgICAgICAgICAgMTAwICAgICAvKiBCeXBhc3MgbWl4ZXIgdGltZSAqLworI2RlZmluZSBMVkRCRV9NSVhFUl9UQyA1ICAgICAgICAgIC8qIE1peGVyIHRpbWUgICovCisjZGVmaW5lIExWREJFX0JZUEFTU19NSVhFUl9UQyAxMDAgLyogQnlwYXNzIG1peGVyIHRpbWUgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTc2LDM3ICs1OSwzMCBAQAogCiAvKiBEYXRhIHN0cnVjdHVyZSAqLwogLyogRGF0YSBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogQUdDIHBhcmFtZXRlcnMgKi8KLSAgICBBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QgICBBR0NJbnN0YW5jZTsgICAgICAgIC8qIEFHQyBpbnN0YW5jZSBwYXJhbWV0ZXJzICovCisgICAgQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90IEFHQ0luc3RhbmNlOyAvKiBBR0MgaW5zdGFuY2UgcGFyYW1ldGVycyAqLwogCiAgICAgLyogUHJvY2VzcyB2YXJpYWJsZXMgKi8KLSAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICAgSFBGVGFwczsgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIHRhcHMgKi8KLSAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICAgQlBGVGFwczsgICAgICAgICAgICAvKiBCYW5kIHBhc3MgZmlsdGVyIHRhcHMgKi8KLSAgICBMVk1peGVyM18xU3RfRkxPQVRfc3QgICAgICAgICAgICAgQnlwYXNzVm9sdW1lOyAgICAgICAvKiBCeXBhc3Mgdm9sdW1lIHNjYWxlciAqLwotICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAgICAgICBCeXBhc3NNaXhlcjsgICAgICAgIC8qIEJ5cGFzcyBNaXhlciBmb3IgQ2xpY2sgUmVtb3ZhbCAqLworICAgIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCBCeXBhc3NWb2x1bWU7ICAgIC8qIEJ5cGFzcyB2b2x1bWUgc2NhbGVyICovCisgICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0IEJ5cGFzc01peGVyOyAgICAgLyogQnlwYXNzIE1peGVyIGZvciBDbGljayBSZW1vdmFsICovCiAKIH0gTFZEQkVfRGF0YV9GTE9BVF90OwogCi0vKiBDb2VmcyBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyogUHJvY2VzcyB2YXJpYWJsZXMgKi8KLSAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICAgSFBGSW5zdGFuY2U7ICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIGluc3RhbmNlICovCi0gICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAgIEJQRkluc3RhbmNlOyAgICAgICAgLyogQmFuZCBwYXNzIGZpbHRlciBpbnN0YW5jZSAqLwotfSBMVkRCRV9Db2VmX0ZMT0FUX3Q7CisKIC8qIEluc3RhbmNlIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBQdWJsaWMgcGFyYW1ldGVycyAqLwotICAgIExWREJFX01lbVRhYl90ICAgICAgICAgICAgICAgIE1lbW9yeVRhYmxlOyAgICAgICAgLyogSW5zdGFuY2UgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KLSAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAgICAgICAgICBQYXJhbXM7ICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KLSAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICAgICAgQ2FwYWJpbGl0aWVzOyAgICAgICAgIC8qIEluc3RhbmNlIGNhcGFiaWxpdGllcyAqLworICAgIExWREJFX1BhcmFtc190IFBhcmFtczsgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLworICAgIExWREJFX0NhcGFiaWxpdGllc190IENhcGFiaWxpdGllczsgLyogSW5zdGFuY2UgY2FwYWJpbGl0aWVzICovCiAKICAgICAvKiBEYXRhIGFuZCBjb2VmZmljaWVudCBwb2ludGVycyAqLwotICAgIExWREJFX0RhdGFfRkxPQVRfdCAgICAgICAgICAgICAgICAqcERhdGE7ICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGRhdGEgKi8KLSAgICBMVkRCRV9Db2VmX0ZMT0FUX3QgICAgICAgICAgICAgICAgKnBDb2VmOyAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBjb2VmZmljaWVudHMgKi8KKyAgICBMVkRCRV9EYXRhX0ZMT0FUX3QqIHBEYXRhOyAvKiBJbnN0YW5jZSBkYXRhICovCisgICAgdm9pZCogcFNjcmF0Y2g7ICAgICAgICAgICAgLyogc2NyYXRjaCBwb2ludGVyICovCisgICAgc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpCaXF1YWRGaWx0ZXI8TFZNX0ZMT0FUPj4KKyAgICAgICAgICAgIHBIUEZCaXF1YWQ7IC8qIEJpcXVhZCBmaWx0ZXIgaW5zdGFuY2UgZm9yIEhQRiAqLworICAgIHN0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjphdWRpb191dGlsczo6QmlxdWFkRmlsdGVyPExWTV9GTE9BVD4+CisgICAgICAgICAgICBwQlBGQmlxdWFkOyAvKiBCaXF1YWQgZmlsdGVyIGluc3RhbmNlIGZvciBCUEYgKi8KIH0gTFZEQkVfSW5zdGFuY2VfdDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMTUsMTMgKzkxLDEwIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkICAgIExWREJFX1NldEFHQyhMVkRCRV9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAgICpwUGFyYW1zKTsKK3ZvaWQgTFZEQkVfU2V0QUdDKExWREJFX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZEQkVfUGFyYW1zX3QqIHBQYXJhbXMpOwogCi12b2lkICAgIExWREJFX1NldFZvbHVtZShMVkRCRV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICpwUGFyYW1zKTsKK3ZvaWQgTFZEQkVfU2V0Vm9sdW1lKExWREJFX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZEQkVfUGFyYW1zX3QqIHBQYXJhbXMpOwogCi12b2lkICAgIExWREJFX1NldEZpbHRlcnMoTFZEQkVfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICpwUGFyYW1zKTsKK3ZvaWQgTFZEQkVfU2V0RmlsdGVycyhMVkRCRV9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWREJFX1BhcmFtc190KiBwUGFyYW1zKTsKIAotI2VuZGlmICAgICAgLyogX19MVkRCRV9QUklWQVRFX0hfXyAqLworI2VuZGlmIC8qIF9fTFZEQkVfUFJJVkFURV9IX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmNwcAppbmRleCBiNGE3MWM3Li4wOTY5MDUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuY3BwCkBAIC0yMCwxMyArMjAsMTQgQEAKIC8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxhdWRpb191dGlscy9CaXF1YWRGaWx0ZXIuaD4KIAotI2luY2x1ZGUgPHN0cmluZy5oPiAvLyBtZW1zZXQKKyNpbmNsdWRlIDxzdHJpbmcuaD4gIC8vIG1lbXNldAogI2luY2x1ZGUgIkxWREJFLmgiCiAjaW5jbHVkZSAiTFZEQkVfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKICNpbmNsdWRlICJBR0MuaCIKLSNpbmNsdWRlICJMVkRCRV9Db2VmZnMuaCIgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY29lZmZpY2llbnRzICovCisjaW5jbHVkZSAiTFZEQkVfQ29lZmZzLmgiIC8qIEZpbHRlciBjb2VmZmljaWVudHMgKi8KICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTczLDE3OSArNzQsMTAzIEBACiAvKiAgICAgb3ZlcmFsbCBlbmQgdG8gZW5kIGdhaW4gaXMgb2RCLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfUHJvY2VzcyhMVkRCRV9IYW5kbGVfdCBoSW5zdGFuY2UsCi0gICAgY29uc3QgTFZNX0ZMT0FUICpwSW5EYXRhLAotICAgIExWTV9GTE9BVCAqcE91dERhdGEsCi0gICAgY29uc3QgTFZNX1VJTlQxNiBOckZyYW1lcykgLy8gdXBkYXRlZCB0byB1c2Ugc2FtcGxlcyA9IGZyYW1lcyAqIGNoYW5uZWxzLgorTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoCisgICAgICAgIExWREJFX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5EYXRhLCBMVk1fRkxPQVQqIHBPdXREYXRhLAorICAgICAgICBjb25zdCBMVk1fVUlOVDE2IE5yRnJhbWVzKSAgLy8gdXBkYXRlZCB0byB1c2Ugc2FtcGxlcyA9IGZyYW1lcyAqIGNoYW5uZWxzLgogewotICBMVkRCRV9JbnN0YW5jZV90ICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICopaEluc3RhbmNlOworICAgIExWREJFX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkRCRV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgY29uc3QgTFZNX0lOVDMyIE5yQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOworICAgIGNvbnN0IExWTV9JTlQzMiBOclNhbXBsZXMgPSBOckNoYW5uZWxzICogTnJGcmFtZXM7CiAKLSAgLypFeHRyYWN0IG51bWJlciBvZiBDaGFubmVscyBpbmZvKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gIC8vIE1vbm8gcGFzc2VkIGluIGFzIHN0ZXJlbwotICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMgPT0gMQotICAgICAgPyAyIDogcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKLSNlbHNlCi0gIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gMjsgLy8gRkNDXzIKLSNlbmRpZgotICBjb25zdCBMVk1fSU5UMzIgTnJTYW1wbGVzID0gTnJDaGFubmVscyAqIE5yRnJhbWVzOwotCi0gIC8qIFNwYWNlIHRvIHN0b3JlIERCRSBwYXRoIGNvbXB1dGF0aW9uICovCi0gIExWTV9GTE9BVCAqIGNvbnN0IHBTY3JhdGNoID0KLSAgICAgICAgICAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKLQotICAvKgotICAgKiBTY3JhdGNoIGZvciBNb25vIHBhdGggc3RhcnRzIGF0IG9mZnNldCBvZgotICAgKiBOclNhbXBsZXMgZmxvYXQgdmFsdWVzIGZyb20gcFNjcmF0Y2guCi0gICAqLwotICBMVk1fRkxPQVQgKiBjb25zdCBwTW9ubyA9IHBTY3JhdGNoICsgTnJTYW1wbGVzOwotCi0gIC8qCi0gICAqIFRSSUNLWTogcE1vbm8gaXMgdXNlZCBhbmQgZGlzY2FyZGVkIGJ5IHRoZSBEQkUgcGF0aC4KLSAgICogICAgICAgICBzbyBpdCBpcyBhdmFpbGFibGUgZm9yIHVzZSBmb3IgdGhlIHBTY3JhdGNoVm9sCi0gICAqICAgICAgICAgcGF0aCB3aGljaCBpcyBjb21wdXRlZCBhZnRlcndhcmRzLgotICAgKgotICAgKiBTcGFjZSB0byBzdG9yZSBWb2x1bWUgQ29udHJvbCBwYXRoIGNvbXB1dGF0aW9uLgotICAgKiBUaGlzIGlzIGlkZW50aWNhbCB0byBwTW9ubyAoc2VlIFRSSUNLWSBjb21tZW50KS4KLSAgICovCi0gIExWTV9GTE9BVCAqIGNvbnN0IHBTY3JhdGNoVm9sID0gcE1vbm87Ci0KLSAgLyoKLSAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBmcmFtZXMgaXMgbm90IHRvbyBsYXJnZQotICAgKi8KLSAgaWYgKE5yRnJhbWVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQotICB7Ci0gICAgcmV0dXJuIExWREJFX1RPT01BTllTQU1QTEVTOwotICB9Ci0KLSAgLyoKLSAgICogQ2hlY2sgaWYgdGhlIGFsZ29yaXRobSBpcyBlbmFibGVkCi0gICAqLwotICAvKiBEQkUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT04gb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLwotICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT04pfHwKLSAgICAgIChMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pCi0gICAgICAgICAgIT1MVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkpKQotICB7Ci0gICAgLy8gbWFrZSBjb3B5IG9mIGlucHV0IGRhdGEKLSAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsCi0gICAgICAgIHBTY3JhdGNoLAotICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7CisgICAgLyogU3BhY2UgdG8gc3RvcmUgREJFIHBhdGggY29tcHV0YXRpb24gKi8KKyAgICBMVk1fRkxPQVQqIGNvbnN0IHBTY3JhdGNoID0gKExWTV9GTE9BVCopcEluc3RhbmNlLT5wU2NyYXRjaDsKIAogICAgIC8qCi0gICAgICogQXBwbHkgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgaWYgc2VsZWN0ZWQKKyAgICAgKiBTY3JhdGNoIGZvciBNb25vIHBhdGggc3RhcnRzIGF0IG9mZnNldCBvZgorICAgICAqIE5yU2FtcGxlcyBmbG9hdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaC4KICAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ID09IExWREJFX0hQRl9PTikKLSAgICB7Ci0jaWZkZWYgU1VQUE9SVF9NQwotICAgICAgQlFfTUNfRDMyRjMyQzMwX1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLCAvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAqLwotICAgICAgICAgIHBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAqLwotICAgICAgICAgIHBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAqLwotICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCi0gICAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKLSNlbHNlCi0gICAgICBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsLyogRmlsdGVyIGluc3RhbmNlICAgICAgKi8KLSAgICAgICAgICBwU2NyYXRjaCwgLyogU291cmNlICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KLSAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzKTsKLSNlbmRpZgorICAgIExWTV9GTE9BVCogY29uc3QgcE1vbm8gPSBwU2NyYXRjaCArIE5yU2FtcGxlczsKKworICAgIC8qCisgICAgICogVFJJQ0tZOiBwTW9ubyBpcyB1c2VkIGFuZCBkaXNjYXJkZWQgYnkgdGhlIERCRSBwYXRoLgorICAgICAqICAgICAgICAgc28gaXQgaXMgYXZhaWxhYmxlIGZvciB1c2UgZm9yIHRoZSBwU2NyYXRjaFZvbAorICAgICAqICAgICAgICAgcGF0aCB3aGljaCBpcyBjb21wdXRlZCBhZnRlcndhcmRzLgorICAgICAqCisgICAgICogU3BhY2UgdG8gc3RvcmUgVm9sdW1lIENvbnRyb2wgcGF0aCBjb21wdXRhdGlvbi4KKyAgICAgKiBUaGlzIGlzIGlkZW50aWNhbCB0byBwTW9ubyAoc2VlIFRSSUNLWSBjb21tZW50KS4KKyAgICAgKi8KKyAgICBMVk1fRkxPQVQqIGNvbnN0IHBTY3JhdGNoVm9sID0gcE1vbm87CisKKyAgICAvKgorICAgICAqIENoZWNrIHRoZSBudW1iZXIgb2YgZnJhbWVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICAgKi8KKyAgICBpZiAoTnJGcmFtZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpIHsKKyAgICAgICAgcmV0dXJuIExWREJFX1RPT01BTllTQU1QTEVTOwogICAgIH0KIAogICAgIC8qCi0gICAgICogQ3JlYXRlIHRoZSBtb25vIHN0cmVhbQorICAgICAqIENoZWNrIGlmIHRoZSBhbGdvcml0aG0gaXMgZW5hYmxlZAogICAgICAqLwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICBGcm9tTWNUb01vbm9fRmxvYXQocFNjcmF0Y2gsIC8qIFNvdXJjZSAqLwotICAgICAgICBwTW9ubywgLyogTW9ubyBkZXN0aW5hdGlvbiAqLwotICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLCAgLyogTnVtYmVyIG9mIGZyYW1lcyAqLwotICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOwotI2Vsc2UKLSAgICBGcm9tMmlUb01vbm9fRmxvYXQocFNjcmF0Y2gsIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLwotICAgICAgICBwTW9ubywgLyogTW9ubyBkZXN0aW5hdGlvbiAgICAgICovCi0gICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMpOwotI2VuZGlmCisgICAgLyogREJFIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9OIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT04pIHx8CisgICAgICAgIChMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pICE9CisgICAgICAgICBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkpKSB7CisgICAgICAgIC8vIG1ha2UgY29weSBvZiBpbnB1dCBkYXRhCisgICAgICAgIENvcHlfRmxvYXQocEluRGF0YSwgcFNjcmF0Y2gsIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsKIAotICAgIC8qCi0gICAgICogQXBwbHkgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKLSAgICAgKi8KLSAgICBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMigmcEluc3RhbmNlLT5wQ29lZi0+QlBGSW5zdGFuY2UsIC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICAqLwotICAgICAgICBwTW9ubywgLyogU291cmNlICAgICAgICAgICAgICAgICovCi0gICAgICAgIHBNb25vLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAgKi8KLSAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcyk7CisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBoaWdoIHBhc3MgZmlsdGVyIGlmIHNlbGVjdGVkCisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ID09IExWREJFX0hQRl9PTikgeworICAgICAgICAgICAgcEluc3RhbmNlLT5wSFBGQmlxdWFkLT5wcm9jZXNzKHBTY3JhdGNoLCBwU2NyYXRjaCwgTnJGcmFtZXMpOworICAgICAgICB9CiAKLSAgICAvKgotICAgICAqIEFwcGx5IHRoZSBBR0MgYW5kIG1peAotICAgICAqLwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICBBR0NfTUlYX1ZPTF9NYzFNb25fRDMyX1dSQSgmcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UsIC8qIEluc3RhbmNlIHBvaW50ZXIgICAgICAqLwotICAgICAgICBwU2NyYXRjaCwgLyogU291cmNlICAgICAgICAgKi8KLSAgICAgICAgcE1vbm8sIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAqLwotICAgICAgICBwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgKi8KLSAgICAgICAgTnJGcmFtZXMsIC8qIE51bWJlciBvZiBmcmFtZXMgICAgICovCi0gICAgICAgIE5yQ2hhbm5lbHMpOyAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgICAgICovCi0jZWxzZQotICAgIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQSgmcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UsIC8qIEluc3RhbmNlIHBvaW50ZXIgICAgICAqLwotICAgICAgICBwU2NyYXRjaCwgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCi0gICAgICAgIHBNb25vLCAvKiBNb25vIGJhbmQgcGFzcyBzb3VyY2UgKi8KLSAgICAgICAgcFNjcmF0Y2gsIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAgICAqLwotICAgICAgICBOckZyYW1lcyk7Ci0jZW5kaWYKKyAgICAgICAgLyoKKyAgICAgICAgICogQ3JlYXRlIHRoZSBtb25vIHN0cmVhbQorICAgICAgICAgKi8KKyAgICAgICAgRnJvbU1jVG9Nb25vX0Zsb2F0KHBTY3JhdGNoLCAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1vbm8sICAgICAgICAgICAgICAgLyogTW9ubyBkZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywgLyogTnVtYmVyIG9mIGZyYW1lcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKIAotICAgIGZvciAoTFZNX0lOVDMyIGlpID0gMDsgaWkgPCBOclNhbXBsZXM7ICsraWkpIHsKLSAgICAgIC8vVE9ETzogcmVwbGFjZSB3aXRoIGV4aXN0aW5nIGNsYW1waW5nIGZ1bmN0aW9uCi0gICAgICBpZiAocFNjcmF0Y2hbaWldIDwgLTEuMCkgewotICAgICAgICBwU2NyYXRjaFtpaV0gPSAtMS4wOwotICAgICAgfSBlbHNlIGlmIChwU2NyYXRjaFtpaV0gPiAxLjApIHsKLSAgICAgICAgcFNjcmF0Y2hbaWldID0gMS4wOwotICAgICAgfQorICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgYmFuZCBwYXNzIGZpbHRlcgorICAgICAgICAgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wQlBGQmlxdWFkLT5wcm9jZXNzKHBNb25vLCBwTW9ubywgTnJGcmFtZXMpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBBR0MgYW5kIG1peAorICAgICAgICAgKi8KKyAgICAgICAgQUdDX01JWF9WT0xfTWMxTW9uX0QzMl9XUkEoJnBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLCAvKiBJbnN0YW5jZSBwb2ludGVyICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTW9ubywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLCAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGZyYW1lcyAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7ICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgICAgICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gY2xlYXIgREJFIHByb2Nlc3NlZCBwYXRoCisgICAgICAgIG1lbXNldChwU2NyYXRjaCwgMCwgc2l6ZW9mKCpwU2NyYXRjaCkgKiBOclNhbXBsZXMpOwogICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBjbGVhciBEQkUgcHJvY2Vzc2VkIHBhdGgKLSAgICBtZW1zZXQocFNjcmF0Y2gsIDAsIHNpemVvZigqcFNjcmF0Y2gpICogTnJTYW1wbGVzKTsKLSAgfQogCi0gIC8qIEJ5cGFzcyBWb2x1bWUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT0ZGIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KLSAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09GRil8fAotICAgICAgKExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSkKLSAgICAgICAgICAhPUxWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKSkpCi0gIHsKKyAgICAvKiBCeXBhc3MgVm9sdW1lIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9GRiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09GRikgfHwKKyAgICAgICAgKExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSkgIT0KKyAgICAgICAgIExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKSkpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBidXQgdm9sdW1lIG1hbmFnZW1lbnQgaXMgcmVxdWlyZWQgdG8gY29tcGVuc2F0ZSBmb3IKKyAgICAgICAgICogaGVhZHJvb20gYW5kIHZvbHVtZSAoaWYgZW5hYmxlZCkKKyAgICAgICAgICovCisgICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwgcEluRGF0YSwgcFNjcmF0Y2hWb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBjbGVhciBieXBhc3Mgdm9sdW1lIHBhdGgKKyAgICAgICAgbWVtc2V0KHBTY3JhdGNoVm9sLCAwLCBzaXplb2YoKnBTY3JhdGNoVm9sKSAqIE5yU2FtcGxlcyk7CisgICAgfQogCiAgICAgLyoKLSAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIGJ1dCB2b2x1bWUgbWFuYWdlbWVudCBpcyByZXF1aXJlZCB0byBjb21wZW5zYXRlIGZvcgotICAgICAqIGhlYWRyb29tIGFuZCB2b2x1bWUgKGlmIGVuYWJsZWQpCisgICAgICogTWl4IERCRSBwcm9jZXNzZWQgcGF0aCBhbmQgYnlwYXNzIHZvbHVtZSBwYXRoCiAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwotICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwKLSAgICAgICAgcEluRGF0YSwKLSAgICAgICAgcFNjcmF0Y2hWb2wsCi0gICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCi0gICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7Ci0jZWxzZQotICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUsCi0gICAgICAgIHBJbkRhdGEsCi0gICAgICAgIHBTY3JhdGNoVm9sLAotICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7IC8qIExlZnQgYW5kIHJpZ2h0LCByZWFsbHkgIyBzYW1wbGVzICovCi0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICAvLyBjbGVhciBieXBhc3Mgdm9sdW1lIHBhdGgKLSAgICBtZW1zZXQocFNjcmF0Y2hWb2wsIDAsIHNpemVvZigqcFNjcmF0Y2hWb2wpICogTnJTYW1wbGVzKTsKLSAgfQotCi0gIC8qCi0gICAqIE1peCBEQkUgcHJvY2Vzc2VkIHBhdGggYW5kIGJ5cGFzcyB2b2x1bWUgcGF0aAotICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlciwKLSAgICAgIHBTY3JhdGNoLAotICAgICAgcFNjcmF0Y2hWb2wsCi0gICAgICBwT3V0RGF0YSwKLSAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCi0gICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOwotI2Vsc2UKLSAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLAotICAgICAgcFNjcmF0Y2gsCi0gICAgICBwU2NyYXRjaFZvbCwKLSAgICAgIHBPdXREYXRhLAotICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOwotI2VuZGlmCi0gIHJldHVybiBMVkRCRV9TVUNDRVNTOworICAgIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlciwgcFNjcmF0Y2gsIHBTY3JhdGNoVm9sLCBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLCAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworICAgIHJldHVybiBMVkRCRV9TVUNDRVNTOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmNwcAppbmRleCA3Mjg1NzVjLi4xYjk1ODEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmNwcApAQCAtMjIsNyArMjIsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgIkxWREJFLmgiCi0jaW5jbHVkZSAiTFZEQkVfQ29lZmZzLmgiICAgICAgICAgICAgICAgLyogRmlsdGVyIGNvZWZmaWNpZW50cyAqLworI2luY2x1ZGUgIkxWREJFX0NvZWZmcy5oIiAvKiBGaWx0ZXIgY29lZmZpY2llbnRzICovCiAjaW5jbHVkZSAiTFZEQkVfVGFibGVzLmgiCiAjaW5jbHVkZSAiQklRVUFELmgiCiAKQEAgLTM2LDI3NSArMzYsMTE5IEBACiAgKiBIaWdoIFBhc3MgRmlsdGVyIENvZWZmaWNpZW50IHRhYmxlCiAgKi8KIGNvbnN0IEJRX0ZMT0FUX0NvZWZzX3QgTFZEQkVfSFBGX1RhYmxlW10gPSB7Ci0gICAgLyogQ29lZmZpY2llbnRzIGZvciA1NUh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KLSAgICB7SFBGX0ZzODAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzODAwMF9GYzU1X0ExLAotICAgICBIUEZfRnM4MDAwX0ZjNTVfQTAsCi0gICAgIC1IUEZfRnM4MDAwX0ZjNTVfQjIsCi0gICAgIC1IUEZfRnM4MDAwX0ZjNTVfQjF9LAotICAgIHtIUEZfRnMxMTAyNV9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczExMDI1X0ZjNTVfQTEsCi0gICAgIEhQRl9GczExMDI1X0ZjNTVfQTAsCi0gICAgIC1IUEZfRnMxMTAyNV9GYzU1X0IyLAotICAgICAtSFBGX0ZzMTEwMjVfRmM1NV9CMX0sCi0gICAge0hQRl9GczEyMDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTIwMDBfRmM1NV9BMSwKLSAgICAgSFBGX0ZzMTIwMDBfRmM1NV9BMCwKLSAgICAgLUhQRl9GczEyMDAwX0ZjNTVfQjIsCi0gICAgIC1IUEZfRnMxMjAwMF9GYzU1X0IxfSwKLSAgICB7SFBGX0ZzMTYwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxNjAwMF9GYzU1X0ExLAotICAgICBIUEZfRnMxNjAwMF9GYzU1X0EwLAotICAgICAtSFBGX0ZzMTYwMDBfRmM1NV9CMiwKLSAgICAgLUhQRl9GczE2MDAwX0ZjNTVfQjF9LAotICAgIHtIUEZfRnMyMjA1MF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczIyMDUwX0ZjNTVfQTEsCi0gICAgIEhQRl9GczIyMDUwX0ZjNTVfQTAsCi0gICAgIC1IUEZfRnMyMjA1MF9GYzU1X0IyLAotICAgICAtSFBGX0ZzMjIwNTBfRmM1NV9CMX0sCi0gICAge0hQRl9GczI0MDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMjQwMDBfRmM1NV9BMSwKLSAgICAgSFBGX0ZzMjQwMDBfRmM1NV9BMCwKLSAgICAgLUhQRl9GczI0MDAwX0ZjNTVfQjIsCi0gICAgIC1IUEZfRnMyNDAwMF9GYzU1X0IxfSwKLSAgICB7SFBGX0ZzMzIwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMzMjAwMF9GYzU1X0ExLAotICAgICBIUEZfRnMzMjAwMF9GYzU1X0EwLAotICAgICAtSFBGX0ZzMzIwMDBfRmM1NV9CMiwKLSAgICAgLUhQRl9GczMyMDAwX0ZjNTVfQjF9LAotICAgIHtIUEZfRnM0NDEwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczQ0MTAwX0ZjNTVfQTEsCi0gICAgIEhQRl9GczQ0MTAwX0ZjNTVfQTAsCi0gICAgIC1IUEZfRnM0NDEwMF9GYzU1X0IyLAotICAgICAtSFBGX0ZzNDQxMDBfRmM1NV9CMX0sCi0gICAge0hQRl9GczQ4MDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzNDgwMDBfRmM1NV9BMSwKLSAgICAgSFBGX0ZzNDgwMDBfRmM1NV9BMCwKLSAgICAgLUhQRl9GczQ4MDAwX0ZjNTVfQjIsCi0gICAgIC1IUEZfRnM0ODAwMF9GYzU1X0IxfSwKLSAgICB7SFBGX0ZzODgyMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM4ODIwMF9GYzU1X0ExLAotICAgICBIUEZfRnM4ODIwMF9GYzU1X0EwLAotICAgICAtSFBGX0ZzODgyMDBfRmM1NV9CMiwKLSAgICAgLUhQRl9Gczg4MjAwX0ZjNTVfQjF9LAotICAgIHtIUEZfRnM5NjAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9Gczk2MDAwX0ZjNTVfQTEsCi0gICAgIEhQRl9Gczk2MDAwX0ZjNTVfQTAsCi0gICAgIC1IUEZfRnM5NjAwMF9GYzU1X0IyLAotICAgICAtSFBGX0ZzOTYwMDBfRmM1NV9CMX0sCi0gICAge0hQRl9GczE3NjQwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxNzY0MDBfRmM1NV9BMSwKLSAgICAgSFBGX0ZzMTc2NDAwX0ZjNTVfQTAsCi0gICAgIC1IUEZfRnMxNzY0MDBfRmM1NV9CMiwKLSAgICAgLUhQRl9GczE3NjQwMF9GYzU1X0IxfSwKLSAgICB7SFBGX0ZzMTkyMDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczE5MjAwMF9GYzU1X0ExLAotICAgICBIUEZfRnMxOTIwMDBfRmM1NV9BMCwKLSAgICAgLUhQRl9GczE5MjAwMF9GYzU1X0IyLAotICAgICAtSFBGX0ZzMTkyMDAwX0ZjNTVfQjF9LAorICAgICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDU1SHogY2VudHJlIGZyZXF1ZW5jeSAqLworICAgICAgICB7SFBGX0ZzODAwMF9GYzU1X0EyLCAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczgwMDBfRmM1NV9BMSwgSFBGX0ZzODAwMF9GYzU1X0EwLCAtSFBGX0ZzODAwMF9GYzU1X0IyLCAtSFBGX0ZzODAwMF9GYzU1X0IxfSwKKyAgICAgICAge0hQRl9GczExMDI1X0ZjNTVfQTIsIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczExMDI1X0ZjNTVfQTEsIEhQRl9GczExMDI1X0ZjNTVfQTAsIC1IUEZfRnMxMTAyNV9GYzU1X0IyLCAtSFBGX0ZzMTEwMjVfRmM1NV9CMX0sCisgICAgICAgIHtIUEZfRnMxMjAwMF9GYzU1X0EyLCAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMxMjAwMF9GYzU1X0ExLCBIUEZfRnMxMjAwMF9GYzU1X0EwLCAtSFBGX0ZzMTIwMDBfRmM1NV9CMiwgLUhQRl9GczEyMDAwX0ZjNTVfQjF9LAorICAgICAgICB7SFBGX0ZzMTYwMDBfRmM1NV9BMiwgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMTYwMDBfRmM1NV9BMSwgSFBGX0ZzMTYwMDBfRmM1NV9BMCwgLUhQRl9GczE2MDAwX0ZjNTVfQjIsIC1IUEZfRnMxNjAwMF9GYzU1X0IxfSwKKyAgICAgICAge0hQRl9GczIyMDUwX0ZjNTVfQTIsIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczIyMDUwX0ZjNTVfQTEsIEhQRl9GczIyMDUwX0ZjNTVfQTAsIC1IUEZfRnMyMjA1MF9GYzU1X0IyLCAtSFBGX0ZzMjIwNTBfRmM1NV9CMX0sCisgICAgICAgIHtIUEZfRnMyNDAwMF9GYzU1X0EyLCAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMyNDAwMF9GYzU1X0ExLCBIUEZfRnMyNDAwMF9GYzU1X0EwLCAtSFBGX0ZzMjQwMDBfRmM1NV9CMiwgLUhQRl9GczI0MDAwX0ZjNTVfQjF9LAorICAgICAgICB7SFBGX0ZzMzIwMDBfRmM1NV9BMiwgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMzIwMDBfRmM1NV9BMSwgSFBGX0ZzMzIwMDBfRmM1NV9BMCwgLUhQRl9GczMyMDAwX0ZjNTVfQjIsIC1IUEZfRnMzMjAwMF9GYzU1X0IxfSwKKyAgICAgICAge0hQRl9GczQ0MTAwX0ZjNTVfQTIsIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczQ0MTAwX0ZjNTVfQTEsIEhQRl9GczQ0MTAwX0ZjNTVfQTAsIC1IUEZfRnM0NDEwMF9GYzU1X0IyLCAtSFBGX0ZzNDQxMDBfRmM1NV9CMX0sCisgICAgICAgIHtIUEZfRnM0ODAwMF9GYzU1X0EyLCAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnM0ODAwMF9GYzU1X0ExLCBIUEZfRnM0ODAwMF9GYzU1X0EwLCAtSFBGX0ZzNDgwMDBfRmM1NV9CMiwgLUhQRl9GczQ4MDAwX0ZjNTVfQjF9LAorICAgICAgICB7SFBGX0ZzODgyMDBfRmM1NV9BMiwgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzODgyMDBfRmM1NV9BMSwgSFBGX0ZzODgyMDBfRmM1NV9BMCwgLUhQRl9Gczg4MjAwX0ZjNTVfQjIsIC1IUEZfRnM4ODIwMF9GYzU1X0IxfSwKKyAgICAgICAge0hQRl9Gczk2MDAwX0ZjNTVfQTIsIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9Gczk2MDAwX0ZjNTVfQTEsIEhQRl9Gczk2MDAwX0ZjNTVfQTAsIC1IUEZfRnM5NjAwMF9GYzU1X0IyLCAtSFBGX0ZzOTYwMDBfRmM1NV9CMX0sCisgICAgICAgIHtIUEZfRnMxNzY0MDBfRmM1NV9BMiwgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9GYzU1X0ExLCBIUEZfRnMxNzY0MDBfRmM1NV9BMCwgLUhQRl9GczE3NjQwMF9GYzU1X0IyLCAtSFBGX0ZzMTc2NDAwX0ZjNTVfQjF9LAorICAgICAgICB7SFBGX0ZzMTkyMDAwX0ZjNTVfQTIsIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMxOTIwMDBfRmM1NV9BMSwgSFBGX0ZzMTkyMDAwX0ZjNTVfQTAsIC1IUEZfRnMxOTIwMDBfRmM1NV9CMiwgLUhQRl9GczE5MjAwMF9GYzU1X0IxfSwKIAotICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNjZIeiBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAge0hQRl9GczgwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczgwMDBfRmM2Nl9BMSwKLSAgICAgSFBGX0ZzODAwMF9GYzY2X0EwLAotICAgICAtSFBGX0ZzODAwMF9GYzY2X0IyLAotICAgICAtSFBGX0ZzODAwMF9GYzY2X0IxfSwKLSAgICB7SFBGX0ZzMTEwMjVfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxMTAyNV9GYzY2X0ExLAotICAgICBIUEZfRnMxMTAyNV9GYzY2X0EwLAotICAgICAtSFBGX0ZzMTEwMjVfRmM2Nl9CMiwKLSAgICAgLUhQRl9GczExMDI1X0ZjNjZfQjF9LAotICAgIHtIUEZfRnMxMjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczEyMDAwX0ZjNjZfQTEsCi0gICAgIEhQRl9GczEyMDAwX0ZjNjZfQTAsCi0gICAgIC1IUEZfRnMxMjAwMF9GYzY2X0IyLAotICAgICAtSFBGX0ZzMTIwMDBfRmM2Nl9CMX0sCi0gICAge0hQRl9GczE2MDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTYwMDBfRmM2Nl9BMSwKLSAgICAgSFBGX0ZzMTYwMDBfRmM2Nl9BMCwKLSAgICAgLUhQRl9GczE2MDAwX0ZjNjZfQjIsCi0gICAgIC1IUEZfRnMxNjAwMF9GYzY2X0IxfSwKLSAgICB7SFBGX0ZzMjIwNTBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMyMjA1MF9GYzY2X0ExLAotICAgICBIUEZfRnMyMjA1MF9GYzY2X0EwLAotICAgICAtSFBGX0ZzMjIwNTBfRmM2Nl9CMiwKLSAgICAgLUhQRl9GczIyMDUwX0ZjNjZfQjF9LAotICAgIHtIUEZfRnMyNDAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczI0MDAwX0ZjNjZfQTEsCi0gICAgIEhQRl9GczI0MDAwX0ZjNjZfQTAsCi0gICAgIC1IUEZfRnMyNDAwMF9GYzY2X0IyLAotICAgICAtSFBGX0ZzMjQwMDBfRmM2Nl9CMX0sCi0gICAge0hQRl9GczMyMDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMzIwMDBfRmM2Nl9BMSwKLSAgICAgSFBGX0ZzMzIwMDBfRmM2Nl9BMCwKLSAgICAgLUhQRl9GczMyMDAwX0ZjNjZfQjIsCi0gICAgIC1IUEZfRnMzMjAwMF9GYzY2X0IxfSwKLSAgICB7SFBGX0ZzNDQxMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM0NDEwMF9GYzY2X0ExLAotICAgICBIUEZfRnM0NDEwMF9GYzY2X0EwLAotICAgICAtSFBGX0ZzNDQxMDBfRmM2Nl9CMiwKLSAgICAgLUhQRl9GczQ0MTAwX0ZjNjZfQjF9LAotICAgIHtIUEZfRnM0ODAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczQ4MDAwX0ZjNjZfQTEsCi0gICAgIEhQRl9GczQ4MDAwX0ZjNjZfQTAsCi0gICAgIC1IUEZfRnM0ODAwMF9GYzY2X0IyLAotICAgICAtSFBGX0ZzNDgwMDBfRmM2Nl9CMX0sCi0gICAge0hQRl9Gczg4MjAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzODgyMDBfRmM2Nl9BMSwKLSAgICAgSFBGX0ZzODgyMDBfRmM2Nl9BMCwKLSAgICAgLUhQRl9Gczg4MjAwX0ZjNjZfQjIsCi0gICAgIC1IUEZfRnM4ODIwMF9GYzY2X0IxfSwKLSAgICB7SFBGX0ZzOTYwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM5NjAwMF9GYzY2X0ExLAotICAgICBIUEZfRnM5NjAwMF9GYzY2X0EwLAotICAgICAtSFBGX0ZzOTYwMDBfRmM2Nl9CMiwKLSAgICAgLUhQRl9Gczk2MDAwX0ZjNjZfQjF9LAotICAgIHtIUEZfRnMxNzY0MDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTc2NDAwX0ZjNjZfQTEsCi0gICAgIEhQRl9GczE3NjQwMF9GYzY2X0EwLAotICAgICAtSFBGX0ZzMTc2NDAwX0ZjNjZfQjIsCi0gICAgIC1IUEZfRnMxNzY0MDBfRmM2Nl9CMX0sCi0gICAge0hQRl9GczE5MjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxOTIwMDBfRmM2Nl9BMSwKLSAgICAgSFBGX0ZzMTkyMDAwX0ZjNjZfQTAsCi0gICAgIC1IUEZfRnMxOTIwMDBfRmM2Nl9CMiwKLSAgICAgLUhQRl9GczE5MjAwMF9GYzY2X0IxfSwKKyAgICAgICAgLyogQ29lZmZpY2llbnRzIGZvciA2Nkh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICAgICAge0hQRl9GczgwMDBfRmM2Nl9BMiwgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnM4MDAwX0ZjNjZfQTEsIEhQRl9GczgwMDBfRmM2Nl9BMCwgLUhQRl9GczgwMDBfRmM2Nl9CMiwgLUhQRl9GczgwMDBfRmM2Nl9CMX0sCisgICAgICAgIHtIUEZfRnMxMTAyNV9GYzY2X0EyLCAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMxMTAyNV9GYzY2X0ExLCBIUEZfRnMxMTAyNV9GYzY2X0EwLCAtSFBGX0ZzMTEwMjVfRmM2Nl9CMiwgLUhQRl9GczExMDI1X0ZjNjZfQjF9LAorICAgICAgICB7SFBGX0ZzMTIwMDBfRmM2Nl9BMiwgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMTIwMDBfRmM2Nl9BMSwgSFBGX0ZzMTIwMDBfRmM2Nl9BMCwgLUhQRl9GczEyMDAwX0ZjNjZfQjIsIC1IUEZfRnMxMjAwMF9GYzY2X0IxfSwKKyAgICAgICAge0hQRl9GczE2MDAwX0ZjNjZfQTIsIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczE2MDAwX0ZjNjZfQTEsIEhQRl9GczE2MDAwX0ZjNjZfQTAsIC1IUEZfRnMxNjAwMF9GYzY2X0IyLCAtSFBGX0ZzMTYwMDBfRmM2Nl9CMX0sCisgICAgICAgIHtIUEZfRnMyMjA1MF9GYzY2X0EyLCAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMyMjA1MF9GYzY2X0ExLCBIUEZfRnMyMjA1MF9GYzY2X0EwLCAtSFBGX0ZzMjIwNTBfRmM2Nl9CMiwgLUhQRl9GczIyMDUwX0ZjNjZfQjF9LAorICAgICAgICB7SFBGX0ZzMjQwMDBfRmM2Nl9BMiwgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMjQwMDBfRmM2Nl9BMSwgSFBGX0ZzMjQwMDBfRmM2Nl9BMCwgLUhQRl9GczI0MDAwX0ZjNjZfQjIsIC1IUEZfRnMyNDAwMF9GYzY2X0IxfSwKKyAgICAgICAge0hQRl9GczMyMDAwX0ZjNjZfQTIsIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczMyMDAwX0ZjNjZfQTEsIEhQRl9GczMyMDAwX0ZjNjZfQTAsIC1IUEZfRnMzMjAwMF9GYzY2X0IyLCAtSFBGX0ZzMzIwMDBfRmM2Nl9CMX0sCisgICAgICAgIHtIUEZfRnM0NDEwMF9GYzY2X0EyLCAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnM0NDEwMF9GYzY2X0ExLCBIUEZfRnM0NDEwMF9GYzY2X0EwLCAtSFBGX0ZzNDQxMDBfRmM2Nl9CMiwgLUhQRl9GczQ0MTAwX0ZjNjZfQjF9LAorICAgICAgICB7SFBGX0ZzNDgwMDBfRmM2Nl9BMiwgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzNDgwMDBfRmM2Nl9BMSwgSFBGX0ZzNDgwMDBfRmM2Nl9BMCwgLUhQRl9GczQ4MDAwX0ZjNjZfQjIsIC1IUEZfRnM0ODAwMF9GYzY2X0IxfSwKKyAgICAgICAge0hQRl9Gczg4MjAwX0ZjNjZfQTIsIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0ZjNjZfQTEsIEhQRl9Gczg4MjAwX0ZjNjZfQTAsIC1IUEZfRnM4ODIwMF9GYzY2X0IyLCAtSFBGX0ZzODgyMDBfRmM2Nl9CMX0sCisgICAgICAgIHtIUEZfRnM5NjAwMF9GYzY2X0EyLCAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnM5NjAwMF9GYzY2X0ExLCBIUEZfRnM5NjAwMF9GYzY2X0EwLCAtSFBGX0ZzOTYwMDBfRmM2Nl9CMiwgLUhQRl9Gczk2MDAwX0ZjNjZfQjF9LAorICAgICAgICB7SFBGX0ZzMTc2NDAwX0ZjNjZfQTIsIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMxNzY0MDBfRmM2Nl9BMSwgSFBGX0ZzMTc2NDAwX0ZjNjZfQTAsIC1IUEZfRnMxNzY0MDBfRmM2Nl9CMiwgLUhQRl9GczE3NjQwMF9GYzY2X0IxfSwKKyAgICAgICAge0hQRl9GczE5MjAwMF9GYzY2X0EyLCAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMTkyMDAwX0ZjNjZfQTEsIEhQRl9GczE5MjAwMF9GYzY2X0EwLCAtSFBGX0ZzMTkyMDAwX0ZjNjZfQjIsIC1IUEZfRnMxOTIwMDBfRmM2Nl9CMX0sCiAKLSAgICAvKiBDb2VmZmljaWVudHMgZm9yIDc4SHogY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgIHtIUEZfRnM4MDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM4MDAwX0ZjNzhfQTEsCi0gICAgIEhQRl9GczgwMDBfRmM3OF9BMCwKLSAgICAgLUhQRl9GczgwMDBfRmM3OF9CMiwKLSAgICAgLUhQRl9GczgwMDBfRmM3OF9CMX0sCi0gICAge0hQRl9GczExMDI1X0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTEwMjVfRmM3OF9BMSwKLSAgICAgSFBGX0ZzMTEwMjVfRmM3OF9BMCwKLSAgICAgLUhQRl9GczExMDI1X0ZjNzhfQjIsCi0gICAgIC1IUEZfRnMxMTAyNV9GYzc4X0IxfSwKLSAgICB7SFBGX0ZzMTIwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxMjAwMF9GYzc4X0ExLAotICAgICBIUEZfRnMxMjAwMF9GYzc4X0EwLAotICAgICAtSFBGX0ZzMTIwMDBfRmM3OF9CMiwKLSAgICAgLUhQRl9GczEyMDAwX0ZjNzhfQjF9LAotICAgIHtIUEZfRnMxNjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczE2MDAwX0ZjNzhfQTEsCi0gICAgIEhQRl9GczE2MDAwX0ZjNzhfQTAsCi0gICAgIC1IUEZfRnMxNjAwMF9GYzc4X0IyLAotICAgICAtSFBGX0ZzMTYwMDBfRmM3OF9CMX0sCi0gICAge0hQRl9GczIyMDUwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMjIwNTBfRmM3OF9BMSwKLSAgICAgSFBGX0ZzMjIwNTBfRmM3OF9BMCwKLSAgICAgLUhQRl9GczIyMDUwX0ZjNzhfQjIsCi0gICAgIC1IUEZfRnMyMjA1MF9GYzc4X0IxfSwKLSAgICB7SFBGX0ZzMjQwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMyNDAwMF9GYzc4X0ExLAotICAgICBIUEZfRnMyNDAwMF9GYzc4X0EwLAotICAgICAtSFBGX0ZzMjQwMDBfRmM3OF9CMiwKLSAgICAgLUhQRl9GczI0MDAwX0ZjNzhfQjF9LAotICAgIHtIUEZfRnMzMjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczMyMDAwX0ZjNzhfQTEsCi0gICAgIEhQRl9GczMyMDAwX0ZjNzhfQTAsCi0gICAgIC1IUEZfRnMzMjAwMF9GYzc4X0IyLAotICAgICAtSFBGX0ZzMzIwMDBfRmM3OF9CMX0sCi0gICAge0hQRl9GczQ0MTAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzNDQxMDBfRmM3OF9BMSwKLSAgICAgSFBGX0ZzNDQxMDBfRmM3OF9BMCwKLSAgICAgLUhQRl9GczQ0MTAwX0ZjNzhfQjIsCi0gICAgIC1IUEZfRnM0NDEwMF9GYzc4X0IxfSwKLSAgICB7SFBGX0ZzNDgwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM0ODAwMF9GYzc4X0ExLAotICAgICBIUEZfRnM0ODAwMF9GYzc4X0EwLAotICAgICAtSFBGX0ZzNDgwMDBfRmM3OF9CMiwKLSAgICAgLUhQRl9GczQ4MDAwX0ZjNzhfQjF9LAotICAgIHtIUEZfRnM4ODIwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9Gczg4MjAwX0ZjNzhfQTEsCi0gICAgIEhQRl9Gczg4MjAwX0ZjNzhfQTAsCi0gICAgIC1IUEZfRnM4ODIwMF9GYzc4X0IyLAotICAgICAtSFBGX0ZzODgyMDBfRmM3OF9CMX0sCi0gICAge0hQRl9Gczk2MDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzOTYwMDBfRmM3OF9BMSwKLSAgICAgSFBGX0ZzOTYwMDBfRmM3OF9BMCwKLSAgICAgLUhQRl9Gczk2MDAwX0ZjNzhfQjIsCi0gICAgIC1IUEZfRnM5NjAwMF9GYzc4X0IxfSwKLSAgICB7SFBGX0ZzMTc2NDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczE3NjQwMF9GYzc4X0ExLAotICAgICBIUEZfRnMxNzY0MDBfRmM3OF9BMCwKLSAgICAgLUhQRl9GczE3NjQwMF9GYzc4X0IyLAotICAgICAtSFBGX0ZzMTc2NDAwX0ZjNzhfQjF9LAotICAgIHtIUEZfRnMxOTIwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTkyMDAwX0ZjNzhfQTEsCi0gICAgIEhQRl9GczE5MjAwMF9GYzc4X0EwLAotICAgICAtSFBGX0ZzMTkyMDAwX0ZjNzhfQjIsCi0gICAgIC1IUEZfRnMxOTIwMDBfRmM3OF9CMX0sCisgICAgICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNzhIeiBjZW50cmUgZnJlcXVlbmN5ICovCisgICAgICAgIHtIUEZfRnM4MDAwX0ZjNzhfQTIsIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzODAwMF9GYzc4X0ExLCBIUEZfRnM4MDAwX0ZjNzhfQTAsIC1IUEZfRnM4MDAwX0ZjNzhfQjIsIC1IUEZfRnM4MDAwX0ZjNzhfQjF9LAorICAgICAgICB7SFBGX0ZzMTEwMjVfRmM3OF9BMiwgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMTEwMjVfRmM3OF9BMSwgSFBGX0ZzMTEwMjVfRmM3OF9BMCwgLUhQRl9GczExMDI1X0ZjNzhfQjIsIC1IUEZfRnMxMTAyNV9GYzc4X0IxfSwKKyAgICAgICAge0hQRl9GczEyMDAwX0ZjNzhfQTIsIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczEyMDAwX0ZjNzhfQTEsIEhQRl9GczEyMDAwX0ZjNzhfQTAsIC1IUEZfRnMxMjAwMF9GYzc4X0IyLCAtSFBGX0ZzMTIwMDBfRmM3OF9CMX0sCisgICAgICAgIHtIUEZfRnMxNjAwMF9GYzc4X0EyLCAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMxNjAwMF9GYzc4X0ExLCBIUEZfRnMxNjAwMF9GYzc4X0EwLCAtSFBGX0ZzMTYwMDBfRmM3OF9CMiwgLUhQRl9GczE2MDAwX0ZjNzhfQjF9LAorICAgICAgICB7SFBGX0ZzMjIwNTBfRmM3OF9BMiwgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMjIwNTBfRmM3OF9BMSwgSFBGX0ZzMjIwNTBfRmM3OF9BMCwgLUhQRl9GczIyMDUwX0ZjNzhfQjIsIC1IUEZfRnMyMjA1MF9GYzc4X0IxfSwKKyAgICAgICAge0hQRl9GczI0MDAwX0ZjNzhfQTIsIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczI0MDAwX0ZjNzhfQTEsIEhQRl9GczI0MDAwX0ZjNzhfQTAsIC1IUEZfRnMyNDAwMF9GYzc4X0IyLCAtSFBGX0ZzMjQwMDBfRmM3OF9CMX0sCisgICAgICAgIHtIUEZfRnMzMjAwMF9GYzc4X0EyLCAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMzMjAwMF9GYzc4X0ExLCBIUEZfRnMzMjAwMF9GYzc4X0EwLCAtSFBGX0ZzMzIwMDBfRmM3OF9CMiwgLUhQRl9GczMyMDAwX0ZjNzhfQjF9LAorICAgICAgICB7SFBGX0ZzNDQxMDBfRmM3OF9BMiwgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzNDQxMDBfRmM3OF9BMSwgSFBGX0ZzNDQxMDBfRmM3OF9BMCwgLUhQRl9GczQ0MTAwX0ZjNzhfQjIsIC1IUEZfRnM0NDEwMF9GYzc4X0IxfSwKKyAgICAgICAge0hQRl9GczQ4MDAwX0ZjNzhfQTIsIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczQ4MDAwX0ZjNzhfQTEsIEhQRl9GczQ4MDAwX0ZjNzhfQTAsIC1IUEZfRnM0ODAwMF9GYzc4X0IyLCAtSFBGX0ZzNDgwMDBfRmM3OF9CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9GYzc4X0EyLCAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnM4ODIwMF9GYzc4X0ExLCBIUEZfRnM4ODIwMF9GYzc4X0EwLCAtSFBGX0ZzODgyMDBfRmM3OF9CMiwgLUhQRl9Gczg4MjAwX0ZjNzhfQjF9LAorICAgICAgICB7SFBGX0ZzOTYwMDBfRmM3OF9BMiwgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzOTYwMDBfRmM3OF9BMSwgSFBGX0ZzOTYwMDBfRmM3OF9BMCwgLUhQRl9Gczk2MDAwX0ZjNzhfQjIsIC1IUEZfRnM5NjAwMF9GYzc4X0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9GYzc4X0EyLCAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMTc2NDAwX0ZjNzhfQTEsIEhQRl9GczE3NjQwMF9GYzc4X0EwLCAtSFBGX0ZzMTc2NDAwX0ZjNzhfQjIsIC1IUEZfRnMxNzY0MDBfRmM3OF9CMX0sCisgICAgICAgIHtIUEZfRnMxOTIwMDBfRmM3OF9BMiwgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczE5MjAwMF9GYzc4X0ExLCBIUEZfRnMxOTIwMDBfRmM3OF9BMCwgLUhQRl9GczE5MjAwMF9GYzc4X0IyLCAtSFBGX0ZzMTkyMDAwX0ZjNzhfQjF9LAogCi0gICAgLyogQ29lZmZpY2llbnRzIGZvciA5MEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KLSAgICB7SFBGX0ZzODAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzODAwMF9GYzkwX0ExLAotICAgICBIUEZfRnM4MDAwX0ZjOTBfQTAsCi0gICAgIC1IUEZfRnM4MDAwX0ZjOTBfQjIsCi0gICAgIC1IUEZfRnM4MDAwX0ZjOTBfQjF9LAotICAgIHtIUEZfRnMxMTAyNV9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczExMDI1X0ZjOTBfQTEsCi0gICAgIEhQRl9GczExMDI1X0ZjOTBfQTAsCi0gICAgIC1IUEZfRnMxMTAyNV9GYzkwX0IyLAotICAgICAtSFBGX0ZzMTEwMjVfRmM5MF9CMX0sCi0gICAge0hQRl9GczEyMDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTIwMDBfRmM5MF9BMSwKLSAgICAgSFBGX0ZzMTIwMDBfRmM5MF9BMCwKLSAgICAgLUhQRl9GczEyMDAwX0ZjOTBfQjIsCi0gICAgIC1IUEZfRnMxMjAwMF9GYzkwX0IxfSwKLSAgICB7SFBGX0ZzMTYwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxNjAwMF9GYzkwX0ExLAotICAgICBIUEZfRnMxNjAwMF9GYzkwX0EwLAotICAgICAtSFBGX0ZzMTYwMDBfRmM5MF9CMiwKLSAgICAgLUhQRl9GczE2MDAwX0ZjOTBfQjF9LAotICAgIHtIUEZfRnMyMjA1MF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczIyMDUwX0ZjOTBfQTEsCi0gICAgIEhQRl9GczIyMDUwX0ZjOTBfQTAsCi0gICAgIC1IUEZfRnMyMjA1MF9GYzkwX0IyLAotICAgICAtSFBGX0ZzMjIwNTBfRmM5MF9CMX0sCi0gICAge0hQRl9GczI0MDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMjQwMDBfRmM5MF9BMSwKLSAgICAgSFBGX0ZzMjQwMDBfRmM5MF9BMCwKLSAgICAgLUhQRl9GczI0MDAwX0ZjOTBfQjIsCi0gICAgIC1IUEZfRnMyNDAwMF9GYzkwX0IxfSwKLSAgICB7SFBGX0ZzMzIwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMzMjAwMF9GYzkwX0ExLAotICAgICBIUEZfRnMzMjAwMF9GYzkwX0EwLAotICAgICAtSFBGX0ZzMzIwMDBfRmM5MF9CMiwKLSAgICAgLUhQRl9GczMyMDAwX0ZjOTBfQjF9LAotICAgIHtIUEZfRnM0NDEwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczQ0MTAwX0ZjOTBfQTEsCi0gICAgIEhQRl9GczQ0MTAwX0ZjOTBfQTAsCi0gICAgIC1IUEZfRnM0NDEwMF9GYzkwX0IyLAotICAgICAtSFBGX0ZzNDQxMDBfRmM5MF9CMX0sCi0gICAge0hQRl9GczQ4MDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzNDgwMDBfRmM5MF9BMSwKLSAgICAgSFBGX0ZzNDgwMDBfRmM5MF9BMCwKLSAgICAgLUhQRl9GczQ4MDAwX0ZjOTBfQjIsCi0gICAgIC1IUEZfRnM0ODAwMF9GYzkwX0IxfQorICAgICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDkwSHogY2VudHJlIGZyZXF1ZW5jeSAqLworICAgICAgICB7SFBGX0ZzODAwMF9GYzkwX0EyLCAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczgwMDBfRmM5MF9BMSwgSFBGX0ZzODAwMF9GYzkwX0EwLCAtSFBGX0ZzODAwMF9GYzkwX0IyLCAtSFBGX0ZzODAwMF9GYzkwX0IxfSwKKyAgICAgICAge0hQRl9GczExMDI1X0ZjOTBfQTIsIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczExMDI1X0ZjOTBfQTEsIEhQRl9GczExMDI1X0ZjOTBfQTAsIC1IUEZfRnMxMTAyNV9GYzkwX0IyLCAtSFBGX0ZzMTEwMjVfRmM5MF9CMX0sCisgICAgICAgIHtIUEZfRnMxMjAwMF9GYzkwX0EyLCAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMxMjAwMF9GYzkwX0ExLCBIUEZfRnMxMjAwMF9GYzkwX0EwLCAtSFBGX0ZzMTIwMDBfRmM5MF9CMiwgLUhQRl9GczEyMDAwX0ZjOTBfQjF9LAorICAgICAgICB7SFBGX0ZzMTYwMDBfRmM5MF9BMiwgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMTYwMDBfRmM5MF9BMSwgSFBGX0ZzMTYwMDBfRmM5MF9BMCwgLUhQRl9GczE2MDAwX0ZjOTBfQjIsIC1IUEZfRnMxNjAwMF9GYzkwX0IxfSwKKyAgICAgICAge0hQRl9GczIyMDUwX0ZjOTBfQTIsIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczIyMDUwX0ZjOTBfQTEsIEhQRl9GczIyMDUwX0ZjOTBfQTAsIC1IUEZfRnMyMjA1MF9GYzkwX0IyLCAtSFBGX0ZzMjIwNTBfRmM5MF9CMX0sCisgICAgICAgIHtIUEZfRnMyNDAwMF9GYzkwX0EyLCAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMyNDAwMF9GYzkwX0ExLCBIUEZfRnMyNDAwMF9GYzkwX0EwLCAtSFBGX0ZzMjQwMDBfRmM5MF9CMiwgLUhQRl9GczI0MDAwX0ZjOTBfQjF9LAorICAgICAgICB7SFBGX0ZzMzIwMDBfRmM5MF9BMiwgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMzIwMDBfRmM5MF9BMSwgSFBGX0ZzMzIwMDBfRmM5MF9BMCwgLUhQRl9GczMyMDAwX0ZjOTBfQjIsIC1IUEZfRnMzMjAwMF9GYzkwX0IxfSwKKyAgICAgICAge0hQRl9GczQ0MTAwX0ZjOTBfQTIsIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczQ0MTAwX0ZjOTBfQTEsIEhQRl9GczQ0MTAwX0ZjOTBfQTAsIC1IUEZfRnM0NDEwMF9GYzkwX0IyLCAtSFBGX0ZzNDQxMDBfRmM5MF9CMX0sCisgICAgICAgIHtIUEZfRnM0ODAwMF9GYzkwX0EyLCAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnM0ODAwMF9GYzkwX0ExLCBIUEZfRnM0ODAwMF9GYzkwX0EwLCAtSFBGX0ZzNDgwMDBfRmM5MF9CMiwgLUhQRl9GczQ4MDAwX0ZjOTBfQjF9CiAKLSAgICAsCi0gICAge0hQRl9Gczg4MjAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzODgyMDBfRmM5MF9BMSwKLSAgICAgSFBGX0ZzODgyMDBfRmM5MF9BMCwKLSAgICAgLUhQRl9Gczg4MjAwX0ZjOTBfQjIsCi0gICAgIC1IUEZfRnM4ODIwMF9GYzkwX0IxfSwKLSAgICB7SFBGX0ZzOTYwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM5NjAwMF9GYzkwX0ExLAotICAgICBIUEZfRnM5NjAwMF9GYzkwX0EwLAotICAgICAtSFBGX0ZzOTYwMDBfRmM5MF9CMiwKLSAgICAgLUhQRl9Gczk2MDAwX0ZjOTBfQjF9LAotICAgIHtIUEZfRnMxNzY0MDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTc2NDAwX0ZjOTBfQTEsCi0gICAgIEhQRl9GczE3NjQwMF9GYzkwX0EwLAotICAgICAtSFBGX0ZzMTc2NDAwX0ZjOTBfQjIsCi0gICAgIC1IUEZfRnMxNzY0MDBfRmM5MF9CMX0sCi0gICAge0hQRl9GczE5MjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxOTIwMDBfRmM5MF9BMSwKLSAgICAgSFBGX0ZzMTkyMDAwX0ZjOTBfQTAsCi0gICAgIC1IUEZfRnMxOTIwMDBfRmM5MF9CMiwKLSAgICAgLUhQRl9GczE5MjAwMF9GYzkwX0IxfQorICAgICAgICAsCisgICAgICAgIHtIUEZfRnM4ODIwMF9GYzkwX0EyLCAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnM4ODIwMF9GYzkwX0ExLCBIUEZfRnM4ODIwMF9GYzkwX0EwLCAtSFBGX0ZzODgyMDBfRmM5MF9CMiwgLUhQRl9Gczg4MjAwX0ZjOTBfQjF9LAorICAgICAgICB7SFBGX0ZzOTYwMDBfRmM5MF9BMiwgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzOTYwMDBfRmM5MF9BMSwgSFBGX0ZzOTYwMDBfRmM5MF9BMCwgLUhQRl9Gczk2MDAwX0ZjOTBfQjIsIC1IUEZfRnM5NjAwMF9GYzkwX0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9GYzkwX0EyLCAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMTc2NDAwX0ZjOTBfQTEsIEhQRl9GczE3NjQwMF9GYzkwX0EwLCAtSFBGX0ZzMTc2NDAwX0ZjOTBfQjIsIC1IUEZfRnMxNzY0MDBfRmM5MF9CMX0sCisgICAgICAgIHtIUEZfRnMxOTIwMDBfRmM5MF9BMiwgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczE5MjAwMF9GYzkwX0ExLCBIUEZfRnMxOTIwMDBfRmM5MF9BMCwgLUhQRl9GczE5MjAwMF9GYzkwX0IyLCAtSFBGX0ZzMTkyMDAwX0ZjOTBfQjF9CiAKIH07CiAKQEAgLTMxMiwxNzAgKzE1NiwxMTcgQEAKICAqIEJhbmQgUGFzcyBGaWx0ZXIgY29lZmZpY2llbnQgdGFibGUKICAqLwogY29uc3QgQlBfRkxPQVRfQ29lZnNfdCBMVkRCRV9CUEZfVGFibGVbXSA9IHsKLSAgICAvKiBDb2VmZmljaWVudHMgZm9yIDU1SHogY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgIHtCUEZfRnM4MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzODAwMF9GYzU1X0IyLAotICAgICAtQlBGX0ZzODAwMF9GYzU1X0IxfSwKLSAgICB7QlBGX0ZzMTEwMjVfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTEwMjVfRmM1NV9CMiwKLSAgICAgLUJQRl9GczExMDI1X0ZjNTVfQjF9LAotICAgIHtCUEZfRnMxMjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxMjAwMF9GYzU1X0IyLAotICAgICAtQlBGX0ZzMTIwMDBfRmM1NV9CMX0sCi0gICAge0JQRl9GczE2MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczE2MDAwX0ZjNTVfQjIsCi0gICAgIC1CUEZfRnMxNjAwMF9GYzU1X0IxfSwKLSAgICB7QlBGX0ZzMjIwNTBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMjIwNTBfRmM1NV9CMiwKLSAgICAgLUJQRl9GczIyMDUwX0ZjNTVfQjF9LAotICAgIHtCUEZfRnMyNDAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMyNDAwMF9GYzU1X0IyLAotICAgICAtQlBGX0ZzMjQwMDBfRmM1NV9CMX0sCi0gICAge0JQRl9GczMyMDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczMyMDAwX0ZjNTVfQjIsCi0gICAgIC1CUEZfRnMzMjAwMF9GYzU1X0IxfSwKLSAgICB7QlBGX0ZzNDQxMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzNDQxMDBfRmM1NV9CMiwKLSAgICAgLUJQRl9GczQ0MTAwX0ZjNTVfQjF9LAotICAgIHtCUEZfRnM0ODAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM0ODAwMF9GYzU1X0IyLAotICAgICAtQlBGX0ZzNDgwMDBfRmM1NV9CMX0sCi0gICAgIHtCUEZfRnM4ODIwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgICAtQlBGX0ZzODgyMDBfRmM1NV9CMiwKLSAgICAgIC1CUEZfRnM4ODIwMF9GYzU1X0IxfSwKLSAgICAge0JQRl9Gczk2MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9Gczk2MDAwX0ZjNTVfQjIsCi0gICAgIC1CUEZfRnM5NjAwMF9GYzU1X0IxfSwKLSAgICAge0JQRl9GczE3NjQwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAgLUJQRl9GczE3NjQwMF9GYzU1X0IyLAotICAgICAgLUJQRl9GczE3NjQwMF9GYzU1X0IxfSwKLSAgICAge0JQRl9GczE5MjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTkyMDAwX0ZjNTVfQjIsCi0gICAgIC1CUEZfRnMxOTIwMDBfRmM1NV9CMX0sCisgICAgICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNTVIeiBjZW50cmUgZnJlcXVlbmN5ICovCisgICAgICAgIHtCUEZfRnM4MDAwX0ZjNTVfQTAsIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczgwMDBfRmM1NV9CMiwgLUJQRl9GczgwMDBfRmM1NV9CMX0sCisgICAgICAgIHtCUEZfRnMxMTAyNV9GYzU1X0EwLCAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMTEwMjVfRmM1NV9CMiwgLUJQRl9GczExMDI1X0ZjNTVfQjF9LAorICAgICAgICB7QlBGX0ZzMTIwMDBfRmM1NV9BMCwgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczEyMDAwX0ZjNTVfQjIsIC1CUEZfRnMxMjAwMF9GYzU1X0IxfSwKKyAgICAgICAge0JQRl9GczE2MDAwX0ZjNTVfQTAsIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxNjAwMF9GYzU1X0IyLCAtQlBGX0ZzMTYwMDBfRmM1NV9CMX0sCisgICAgICAgIHtCUEZfRnMyMjA1MF9GYzU1X0EwLCAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMjIwNTBfRmM1NV9CMiwgLUJQRl9GczIyMDUwX0ZjNTVfQjF9LAorICAgICAgICB7QlBGX0ZzMjQwMDBfRmM1NV9BMCwgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczI0MDAwX0ZjNTVfQjIsIC1CUEZfRnMyNDAwMF9GYzU1X0IxfSwKKyAgICAgICAge0JQRl9GczMyMDAwX0ZjNTVfQTAsIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMzMjAwMF9GYzU1X0IyLCAtQlBGX0ZzMzIwMDBfRmM1NV9CMX0sCisgICAgICAgIHtCUEZfRnM0NDEwMF9GYzU1X0EwLCAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzNDQxMDBfRmM1NV9CMiwgLUJQRl9GczQ0MTAwX0ZjNTVfQjF9LAorICAgICAgICB7QlBGX0ZzNDgwMDBfRmM1NV9BMCwgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczQ4MDAwX0ZjNTVfQjIsIC1CUEZfRnM0ODAwMF9GYzU1X0IxfSwKKyAgICAgICAge0JQRl9Gczg4MjAwX0ZjNTVfQTAsIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnM4ODIwMF9GYzU1X0IyLCAtQlBGX0ZzODgyMDBfRmM1NV9CMX0sCisgICAgICAgIHtCUEZfRnM5NjAwMF9GYzU1X0EwLCAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzOTYwMDBfRmM1NV9CMiwgLUJQRl9Gczk2MDAwX0ZjNTVfQjF9LAorICAgICAgICB7QlBGX0ZzMTc2NDAwX0ZjNTVfQTAsIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMTc2NDAwX0ZjNTVfQjIsIC1CUEZfRnMxNzY0MDBfRmM1NV9CMX0sCisgICAgICAgIHtCUEZfRnMxOTIwMDBfRmM1NV9BMCwgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxOTIwMDBfRmM1NV9CMiwgLUJQRl9GczE5MjAwMF9GYzU1X0IxfSwKIAotICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNjZIeiBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAge0JQRl9GczgwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM4MDAwX0ZjNjZfQjIsCi0gICAgIC1CUEZfRnM4MDAwX0ZjNjZfQjF9LAotICAgIHtCUEZfRnMxMTAyNV9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxMTAyNV9GYzY2X0IyLAotICAgICAtQlBGX0ZzMTEwMjVfRmM2Nl9CMX0sCi0gICAge0JQRl9GczEyMDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczEyMDAwX0ZjNjZfQjIsCi0gICAgIC1CUEZfRnMxMjAwMF9GYzY2X0IxfSwKLSAgICB7QlBGX0ZzMTYwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTYwMDBfRmM2Nl9CMiwKLSAgICAgLUJQRl9GczE2MDAwX0ZjNjZfQjF9LAotICAgIHtCUEZfRnMyMjA1MF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMyMjA1MF9GYzY2X0IyLAotICAgICAtQlBGX0ZzMjIwNTBfRmM2Nl9CMX0sCi0gICAge0JQRl9GczI0MDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczI0MDAwX0ZjNjZfQjIsCi0gICAgIC1CUEZfRnMyNDAwMF9GYzY2X0IxfSwKLSAgICB7QlBGX0ZzMzIwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMzIwMDBfRmM2Nl9CMiwKLSAgICAgLUJQRl9GczMyMDAwX0ZjNjZfQjF9LAotICAgIHtCUEZfRnM0NDEwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM0NDEwMF9GYzY2X0IyLAotICAgICAtQlBGX0ZzNDQxMDBfRmM2Nl9CMX0sCi0gICAge0JQRl9GczQ4MDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczQ4MDAwX0ZjNjZfQjIsCi0gICAgIC1CUEZfRnM0ODAwMF9GYzY2X0IxfSwKLSAgICB7QlBGX0ZzODgyMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzODgyMDBfRmM2Nl9CMiwKLSAgICAgLUJQRl9Gczg4MjAwX0ZjNjZfQjF9LAotICAgIHtCUEZfRnM5NjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM5NjAwMF9GYzY2X0IyLAotICAgICAtQlBGX0ZzOTYwMDBfRmM2Nl9CMX0sCi0gICAge0JQRl9GczE3NjQwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTc2NDAwX0ZjNjZfQjIsCi0gICAgIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMX0sCi0gICAge0JQRl9GczE5MjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTkyMDAwX0ZjNjZfQjIsCi0gICAgIC1CUEZfRnMxOTIwMDBfRmM2Nl9CMX0sCisgICAgICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNjZIeiBjZW50cmUgZnJlcXVlbmN5ICovCisgICAgICAgIHtCUEZfRnM4MDAwX0ZjNjZfQTAsIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczgwMDBfRmM2Nl9CMiwgLUJQRl9GczgwMDBfRmM2Nl9CMX0sCisgICAgICAgIHtCUEZfRnMxMTAyNV9GYzY2X0EwLCAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMTEwMjVfRmM2Nl9CMiwgLUJQRl9GczExMDI1X0ZjNjZfQjF9LAorICAgICAgICB7QlBGX0ZzMTIwMDBfRmM2Nl9BMCwgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczEyMDAwX0ZjNjZfQjIsIC1CUEZfRnMxMjAwMF9GYzY2X0IxfSwKKyAgICAgICAge0JQRl9GczE2MDAwX0ZjNjZfQTAsIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxNjAwMF9GYzY2X0IyLCAtQlBGX0ZzMTYwMDBfRmM2Nl9CMX0sCisgICAgICAgIHtCUEZfRnMyMjA1MF9GYzY2X0EwLCAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMjIwNTBfRmM2Nl9CMiwgLUJQRl9GczIyMDUwX0ZjNjZfQjF9LAorICAgICAgICB7QlBGX0ZzMjQwMDBfRmM2Nl9BMCwgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczI0MDAwX0ZjNjZfQjIsIC1CUEZfRnMyNDAwMF9GYzY2X0IxfSwKKyAgICAgICAge0JQRl9GczMyMDAwX0ZjNjZfQTAsIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMzMjAwMF9GYzY2X0IyLCAtQlBGX0ZzMzIwMDBfRmM2Nl9CMX0sCisgICAgICAgIHtCUEZfRnM0NDEwMF9GYzY2X0EwLCAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzNDQxMDBfRmM2Nl9CMiwgLUJQRl9GczQ0MTAwX0ZjNjZfQjF9LAorICAgICAgICB7QlBGX0ZzNDgwMDBfRmM2Nl9BMCwgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczQ4MDAwX0ZjNjZfQjIsIC1CUEZfRnM0ODAwMF9GYzY2X0IxfSwKKyAgICAgICAge0JQRl9Gczg4MjAwX0ZjNjZfQTAsIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnM4ODIwMF9GYzY2X0IyLCAtQlBGX0ZzODgyMDBfRmM2Nl9CMX0sCisgICAgICAgIHtCUEZfRnM5NjAwMF9GYzY2X0EwLCAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzOTYwMDBfRmM2Nl9CMiwgLUJQRl9Gczk2MDAwX0ZjNjZfQjF9LAorICAgICAgICB7QlBGX0ZzMTc2NDAwX0ZjNjZfQTAsIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMTc2NDAwX0ZjNjZfQjIsIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMX0sCisgICAgICAgIHtCUEZfRnMxOTIwMDBfRmM2Nl9BMCwgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxOTIwMDBfRmM2Nl9CMiwgLUJQRl9GczE5MjAwMF9GYzY2X0IxfSwKIAotICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNzhIeiBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAge0JQRl9GczgwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM4MDAwX0ZjNzhfQjIsCi0gICAgIC1CUEZfRnM4MDAwX0ZjNzhfQjF9LAotICAgIHtCUEZfRnMxMTAyNV9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxMTAyNV9GYzc4X0IyLAotICAgICAtQlBGX0ZzMTEwMjVfRmM3OF9CMX0sCi0gICAge0JQRl9GczEyMDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczEyMDAwX0ZjNzhfQjIsCi0gICAgIC1CUEZfRnMxMjAwMF9GYzc4X0IxfSwKLSAgICB7QlBGX0ZzMTYwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTYwMDBfRmM3OF9CMiwKLSAgICAgLUJQRl9GczE2MDAwX0ZjNzhfQjF9LAotICAgIHtCUEZfRnMyMjA1MF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMyMjA1MF9GYzc4X0IyLAotICAgICAtQlBGX0ZzMjIwNTBfRmM3OF9CMX0sCi0gICAge0JQRl9GczI0MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczI0MDAwX0ZjNzhfQjIsCi0gICAgIC1CUEZfRnMyNDAwMF9GYzc4X0IxfSwKLSAgICB7QlBGX0ZzMzIwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMzIwMDBfRmM3OF9CMiwKLSAgICAgLUJQRl9GczMyMDAwX0ZjNzhfQjF9LAotICAgIHtCUEZfRnM0NDEwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM0NDEwMF9GYzc4X0IyLAotICAgICAtQlBGX0ZzNDQxMDBfRmM3OF9CMX0sCi0gICAge0JQRl9GczQ4MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczQ4MDAwX0ZjNzhfQjIsCi0gICAgIC1CUEZfRnM0ODAwMF9GYzc4X0IxfSwKLSAgICB7QlBGX0ZzODgyMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzODgyMDBfRmM2Nl9CMiwKLSAgICAgLUJQRl9Gczg4MjAwX0ZjNjZfQjF9LAotICAgIHtCUEZfRnM5NjAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM5NjAwMF9GYzc4X0IyLAotICAgICAtQlBGX0ZzOTYwMDBfRmM3OF9CMX0sCi0gICAge0JQRl9GczE3NjQwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTc2NDAwX0ZjNjZfQjIsCi0gICAgIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMX0sCi0gICAge0JQRl9GczE5MjAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTkyMDAwX0ZjNzhfQjIsCi0gICAgIC1CUEZfRnMxOTIwMDBfRmM3OF9CMX0sCisgICAgICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNzhIeiBjZW50cmUgZnJlcXVlbmN5ICovCisgICAgICAgIHtCUEZfRnM4MDAwX0ZjNzhfQTAsIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczgwMDBfRmM3OF9CMiwgLUJQRl9GczgwMDBfRmM3OF9CMX0sCisgICAgICAgIHtCUEZfRnMxMTAyNV9GYzc4X0EwLCAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMTEwMjVfRmM3OF9CMiwgLUJQRl9GczExMDI1X0ZjNzhfQjF9LAorICAgICAgICB7QlBGX0ZzMTIwMDBfRmM3OF9BMCwgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczEyMDAwX0ZjNzhfQjIsIC1CUEZfRnMxMjAwMF9GYzc4X0IxfSwKKyAgICAgICAge0JQRl9GczE2MDAwX0ZjNzhfQTAsIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxNjAwMF9GYzc4X0IyLCAtQlBGX0ZzMTYwMDBfRmM3OF9CMX0sCisgICAgICAgIHtCUEZfRnMyMjA1MF9GYzc4X0EwLCAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMjIwNTBfRmM3OF9CMiwgLUJQRl9GczIyMDUwX0ZjNzhfQjF9LAorICAgICAgICB7QlBGX0ZzMjQwMDBfRmM3OF9BMCwgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczI0MDAwX0ZjNzhfQjIsIC1CUEZfRnMyNDAwMF9GYzc4X0IxfSwKKyAgICAgICAge0JQRl9GczMyMDAwX0ZjNzhfQTAsIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMzMjAwMF9GYzc4X0IyLCAtQlBGX0ZzMzIwMDBfRmM3OF9CMX0sCisgICAgICAgIHtCUEZfRnM0NDEwMF9GYzc4X0EwLCAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzNDQxMDBfRmM3OF9CMiwgLUJQRl9GczQ0MTAwX0ZjNzhfQjF9LAorICAgICAgICB7QlBGX0ZzNDgwMDBfRmM3OF9BMCwgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczQ4MDAwX0ZjNzhfQjIsIC1CUEZfRnM0ODAwMF9GYzc4X0IxfSwKKyAgICAgICAge0JQRl9Gczg4MjAwX0ZjNjZfQTAsIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnM4ODIwMF9GYzY2X0IyLCAtQlBGX0ZzODgyMDBfRmM2Nl9CMX0sCisgICAgICAgIHtCUEZfRnM5NjAwMF9GYzc4X0EwLCAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzOTYwMDBfRmM3OF9CMiwgLUJQRl9Gczk2MDAwX0ZjNzhfQjF9LAorICAgICAgICB7QlBGX0ZzMTc2NDAwX0ZjNjZfQTAsIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMTc2NDAwX0ZjNjZfQjIsIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMX0sCisgICAgICAgIHtCUEZfRnMxOTIwMDBfRmM3OF9BMCwgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxOTIwMDBfRmM3OF9CMiwgLUJQRl9GczE5MjAwMF9GYzc4X0IxfSwKIAotICAgIC8qIENvZWZmaWNpZW50cyBmb3IgOTBIeiBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAge0JQRl9GczgwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM4MDAwX0ZjOTBfQjIsCi0gICAgIC1CUEZfRnM4MDAwX0ZjOTBfQjF9LAotICAgIHtCUEZfRnMxMTAyNV9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxMTAyNV9GYzkwX0IyLAotICAgICAtQlBGX0ZzMTEwMjVfRmM5MF9CMX0sCi0gICAge0JQRl9GczEyMDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczEyMDAwX0ZjOTBfQjIsCi0gICAgIC1CUEZfRnMxMjAwMF9GYzkwX0IxfSwKLSAgICB7QlBGX0ZzMTYwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTYwMDBfRmM5MF9CMiwKLSAgICAgLUJQRl9GczE2MDAwX0ZjOTBfQjF9LAotICAgIHtCUEZfRnMyMjA1MF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMyMjA1MF9GYzkwX0IyLAotICAgICAtQlBGX0ZzMjIwNTBfRmM5MF9CMX0sCi0gICAge0JQRl9GczI0MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczI0MDAwX0ZjOTBfQjIsCi0gICAgIC1CUEZfRnMyNDAwMF9GYzkwX0IxfSwKLSAgICB7QlBGX0ZzMzIwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMzIwMDBfRmM5MF9CMiwKLSAgICAgLUJQRl9GczMyMDAwX0ZjOTBfQjF9LAotICAgIHtCUEZfRnM0NDEwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM0NDEwMF9GYzkwX0IyLAotICAgICAtQlBGX0ZzNDQxMDBfRmM5MF9CMX0sCi0gICAge0JQRl9GczQ4MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczQ4MDAwX0ZjOTBfQjIsCi0gICAgIC1CUEZfRnM0ODAwMF9GYzkwX0IxfQotICAgICwKLSAgICB7QlBGX0ZzODgyMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzODgyMDBfRmM5MF9CMiwKLSAgICAgLUJQRl9Gczg4MjAwX0ZjOTBfQjF9LAotICAgIHtCUEZfRnM5NjAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM5NjAwMF9GYzkwX0IyLAotICAgICAtQlBGX0ZzOTYwMDBfRmM5MF9CMX0sCi0gICAge0JQRl9GczE3NjQwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTc2NDAwX0ZjOTBfQjIsCi0gICAgIC1CUEZfRnMxNzY0MDBfRmM5MF9CMX0sCi0gICAge0JQRl9GczE5MjAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTkyMDAwX0ZjOTBfQjIsCi0gICAgIC1CUEZfRnMxOTIwMDBfRmM5MF9CMX0KKyAgICAgICAgLyogQ29lZmZpY2llbnRzIGZvciA5MEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICAgICAge0JQRl9GczgwMDBfRmM5MF9BMCwgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzODAwMF9GYzkwX0IyLCAtQlBGX0ZzODAwMF9GYzkwX0IxfSwKKyAgICAgICAge0JQRl9GczExMDI1X0ZjOTBfQTAsIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxMTAyNV9GYzkwX0IyLCAtQlBGX0ZzMTEwMjVfRmM5MF9CMX0sCisgICAgICAgIHtCUEZfRnMxMjAwMF9GYzkwX0EwLCAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMTIwMDBfRmM5MF9CMiwgLUJQRl9GczEyMDAwX0ZjOTBfQjF9LAorICAgICAgICB7QlBGX0ZzMTYwMDBfRmM5MF9BMCwgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczE2MDAwX0ZjOTBfQjIsIC1CUEZfRnMxNjAwMF9GYzkwX0IxfSwKKyAgICAgICAge0JQRl9GczIyMDUwX0ZjOTBfQTAsIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMyMjA1MF9GYzkwX0IyLCAtQlBGX0ZzMjIwNTBfRmM5MF9CMX0sCisgICAgICAgIHtCUEZfRnMyNDAwMF9GYzkwX0EwLCAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMjQwMDBfRmM5MF9CMiwgLUJQRl9GczI0MDAwX0ZjOTBfQjF9LAorICAgICAgICB7QlBGX0ZzMzIwMDBfRmM5MF9BMCwgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczMyMDAwX0ZjOTBfQjIsIC1CUEZfRnMzMjAwMF9GYzkwX0IxfSwKKyAgICAgICAge0JQRl9GczQ0MTAwX0ZjOTBfQTAsIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnM0NDEwMF9GYzkwX0IyLCAtQlBGX0ZzNDQxMDBfRmM5MF9CMX0sCisgICAgICAgIHtCUEZfRnM0ODAwMF9GYzkwX0EwLCAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzNDgwMDBfRmM5MF9CMiwgLUJQRl9GczQ4MDAwX0ZjOTBfQjF9LAorICAgICAgICB7QlBGX0ZzODgyMDBfRmM5MF9BMCwgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9Gczg4MjAwX0ZjOTBfQjIsIC1CUEZfRnM4ODIwMF9GYzkwX0IxfSwKKyAgICAgICAge0JQRl9Gczk2MDAwX0ZjOTBfQTAsIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnM5NjAwMF9GYzkwX0IyLCAtQlBGX0ZzOTYwMDBfRmM5MF9CMX0sCisgICAgICAgIHtCUEZfRnMxNzY0MDBfRmM5MF9BMCwgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxNzY0MDBfRmM5MF9CMiwgLUJQRl9GczE3NjQwMF9GYzkwX0IxfSwKKyAgICAgICAge0JQRl9GczE5MjAwMF9GYzkwX0EwLCAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczE5MjAwMF9GYzkwX0IyLCAtQlBGX0ZzMTkyMDAwX0ZjOTBfQjF9CiAKIH07CiAKQEAgLTQ4Nyw3NyArMjc4LDM0IEBACiAKIC8qIEF0dGFjayB0aW1lIChzaWduYWwgdG9vIGxhcmdlKSAqLwogY29uc3QgTFZNX0ZMT0FUIExWREJFX0FHQ19BVFRBQ0tfVGFibGVbXSA9IHsKLSAgICBBR0NfQVRUQUNLX0ZzODAwMCwKLSAgICBBR0NfQVRUQUNLX0ZzMTEwMjUsCi0gICAgQUdDX0FUVEFDS19GczEyMDAwLAotICAgIEFHQ19BVFRBQ0tfRnMxNjAwMCwKLSAgICBBR0NfQVRUQUNLX0ZzMjIwNTAsCi0gICAgQUdDX0FUVEFDS19GczI0MDAwLAotICAgIEFHQ19BVFRBQ0tfRnMzMjAwMCwKLSAgICBBR0NfQVRUQUNLX0ZzNDQxMDAsCi0gICAgQUdDX0FUVEFDS19GczQ4MDAwCi0gICAgLEFHQ19BVFRBQ0tfRnM4ODIwMAotICAgICxBR0NfQVRUQUNLX0ZzOTYwMDAKLSAgICAsQUdDX0FUVEFDS19GczE3NjQwMAotICAgICxBR0NfQVRUQUNLX0ZzMTkyMDAwCisgICAgICAgIEFHQ19BVFRBQ0tfRnM4MDAwLCAgQUdDX0FUVEFDS19GczExMDI1LCBBR0NfQVRUQUNLX0ZzMTIwMDAsIEFHQ19BVFRBQ0tfRnMxNjAwMCwKKyAgICAgICAgQUdDX0FUVEFDS19GczIyMDUwLCBBR0NfQVRUQUNLX0ZzMjQwMDAsIEFHQ19BVFRBQ0tfRnMzMjAwMCwgQUdDX0FUVEFDS19GczQ0MTAwLAorICAgICAgICBBR0NfQVRUQUNLX0ZzNDgwMDAsIEFHQ19BVFRBQ0tfRnM4ODIwMCwgQUdDX0FUVEFDS19Gczk2MDAwLCBBR0NfQVRUQUNLX0ZzMTc2NDAwLAorICAgICAgICBBR0NfQVRUQUNLX0ZzMTkyMDAwCiAKIH07CiAKIC8qIERlY2F5IHRpbWUgKHNpZ25hbCB0b28gc21hbGwpICovCi1jb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0RFQ0FZX1RhYmxlW10gPSB7Ci0gICAgQUdDX0RFQ0FZX0ZzODAwMCwKLSAgICBBR0NfREVDQVlfRnMxMTAyNSwKLSAgICBBR0NfREVDQVlfRnMxMjAwMCwKLSAgICBBR0NfREVDQVlfRnMxNjAwMCwKLSAgICBBR0NfREVDQVlfRnMyMjA1MCwKLSAgICBBR0NfREVDQVlfRnMyNDAwMCwKLSAgICBBR0NfREVDQVlfRnMzMjAwMCwKLSAgICBBR0NfREVDQVlfRnM0NDEwMCwKLSAgICBBR0NfREVDQVlfRnM0ODAwMAotICAgICxBR0NfREVDQVlfRnM4ODIwMAotICAgICxBR0NfREVDQVlfRlM5NjAwMAotICAgICxBR0NfREVDQVlfRnMxNzY0MDAKLSAgICAsQUdDX0RFQ0FZX0ZTMTkyMDAwCitjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0RFQ0FZX1RhYmxlW10gPSB7QUdDX0RFQ0FZX0ZzODAwMCwgIEFHQ19ERUNBWV9GczExMDI1LCBBR0NfREVDQVlfRnMxMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR0NfREVDQVlfRnMxNjAwMCwgQUdDX0RFQ0FZX0ZzMjIwNTAsIEFHQ19ERUNBWV9GczI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFHQ19ERUNBWV9GczMyMDAwLCBBR0NfREVDQVlfRnM0NDEwMCwgQUdDX0RFQ0FZX0ZzNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdDX0RFQ0FZX0ZzODgyMDAsIEFHQ19ERUNBWV9GUzk2MDAwLCBBR0NfREVDQVlfRnMxNzY0MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdDX0RFQ0FZX0ZTMTkyMDAwCiAKIH07CiAKIC8qIEdhaW4gZm9yIHVzZSB3aXRob3V0IHRoZSBoaWdoIHBhc3MgZmlsdGVyICovCiBjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0dBSU5fVGFibGVbXSA9IHsKLSAgICBBR0NfR0FJTl8wZEIsCi0gICAgQUdDX0dBSU5fMWRCLAotICAgIEFHQ19HQUlOXzJkQiwKLSAgICBBR0NfR0FJTl8zZEIsCi0gICAgQUdDX0dBSU5fNGRCLAotICAgIEFHQ19HQUlOXzVkQiwKLSAgICBBR0NfR0FJTl82ZEIsCi0gICAgQUdDX0dBSU5fN2RCLAotICAgIEFHQ19HQUlOXzhkQiwKLSAgICBBR0NfR0FJTl85ZEIsCi0gICAgQUdDX0dBSU5fMTBkQiwKLSAgICBBR0NfR0FJTl8xMWRCLAotICAgIEFHQ19HQUlOXzEyZEIsCi0gICAgQUdDX0dBSU5fMTNkQiwKLSAgICBBR0NfR0FJTl8xNGRCLAotICAgIEFHQ19HQUlOXzE1ZEJ9OworICAgICAgICBBR0NfR0FJTl8wZEIsICBBR0NfR0FJTl8xZEIsICBBR0NfR0FJTl8yZEIsICBBR0NfR0FJTl8zZEIsIEFHQ19HQUlOXzRkQiwgIEFHQ19HQUlOXzVkQiwKKyAgICAgICAgQUdDX0dBSU5fNmRCLCAgQUdDX0dBSU5fN2RCLCAgQUdDX0dBSU5fOGRCLCAgQUdDX0dBSU5fOWRCLCBBR0NfR0FJTl8xMGRCLCBBR0NfR0FJTl8xMWRCLAorICAgICAgICBBR0NfR0FJTl8xMmRCLCBBR0NfR0FJTl8xM2RCLCBBR0NfR0FJTl8xNGRCLCBBR0NfR0FJTl8xNWRCfTsKIAogLyogR2FpbiBmb3IgdXNlIHdpdGggdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgKi8KIGNvbnN0IExWTV9GTE9BVCBMVkRCRV9BR0NfSFBGR0FJTl9UYWJsZVtdID0gewotICAgIEFHQ19IUEZHQUlOXzBkQiwKLSAgICBBR0NfSFBGR0FJTl8xZEIsCi0gICAgQUdDX0hQRkdBSU5fMmRCLAotICAgIEFHQ19IUEZHQUlOXzNkQiwKLSAgICBBR0NfSFBGR0FJTl80ZEIsCi0gICAgQUdDX0hQRkdBSU5fNWRCLAotICAgIEFHQ19IUEZHQUlOXzZkQiwKLSAgICBBR0NfSFBGR0FJTl83ZEIsCi0gICAgQUdDX0hQRkdBSU5fOGRCLAotICAgIEFHQ19IUEZHQUlOXzlkQiwKLSAgICBBR0NfSFBGR0FJTl8xMGRCLAotICAgIEFHQ19IUEZHQUlOXzExZEIsCi0gICAgQUdDX0hQRkdBSU5fMTJkQiwKLSAgICBBR0NfSFBGR0FJTl8xM2RCLAotICAgIEFHQ19IUEZHQUlOXzE0ZEIsCi0gICAgQUdDX0hQRkdBSU5fMTVkQn07CisgICAgICAgIEFHQ19IUEZHQUlOXzBkQiwgIEFHQ19IUEZHQUlOXzFkQiwgIEFHQ19IUEZHQUlOXzJkQiwgIEFHQ19IUEZHQUlOXzNkQiwKKyAgICAgICAgQUdDX0hQRkdBSU5fNGRCLCAgQUdDX0hQRkdBSU5fNWRCLCAgQUdDX0hQRkdBSU5fNmRCLCAgQUdDX0hQRkdBSU5fN2RCLAorICAgICAgICBBR0NfSFBGR0FJTl84ZEIsICBBR0NfSFBGR0FJTl85ZEIsICBBR0NfSFBGR0FJTl8xMGRCLCBBR0NfSFBGR0FJTl8xMWRCLAorICAgICAgICBBR0NfSFBGR0FJTl8xMmRCLCBBR0NfSFBGR0FJTl8xM2RCLCBBR0NfSFBGR0FJTl8xNGRCLCBBR0NfSFBGR0FJTl8xNWRCfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01NjYsNDUgKzMxNCwyMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogZEIgdG8gbGluZWFyIGNvbnZlcnNpb24gdGFibGUgKi8KLWNvbnN0IExWTV9GTE9BVCBMVkRCRV9Wb2x1bWVUYWJsZVtdID0gewotICAgIDAuNTAwMDAwZiwgICAgICAgICAvKiAtNmRCICovCi0gICAgMC41NjIzNDFmLCAgICAgICAgIC8qIC01ZEIgKi8KLSAgICAwLjYzMDk1N2YsICAgICAgICAgLyogLTRkQiAqLwotICAgIDAuNzA3OTQ2ZiwgICAgICAgICAvKiAtM2RCICovCi0gICAgMC43OTQzMjhmLCAgICAgICAgIC8qIC0yZEIgKi8KLSAgICAwLjg5MTI1MWYsICAgICAgICAgLyogLTFkQiAqLwotICAgIDEuMDAwMDAwZn07ICAgICAgICAvKiAgMGRCICovCitjb25zdCBMVk1fRkxPQVQgTFZEQkVfVm9sdW1lVGFibGVbXSA9IHswLjUwMDAwMGYsICAvKiAtNmRCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjU2MjM0MWYsICAvKiAtNWRCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjYzMDk1N2YsICAvKiAtNGRCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcwNzk0NmYsICAvKiAtM2RCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjc5NDMyOGYsICAvKiAtMmRCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjg5MTI1MWYsICAvKiAtMWRCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAwMDAwMGZ9OyAvKiAgMGRCICovCiAKIGNvbnN0IExWTV9GTE9BVCBMVkRCRV9Wb2x1bWVUQ1RhYmxlW10gPSB7Ci0gICAgVk9MX1RDX0ZzODAwMCwKLSAgICBWT0xfVENfRnMxMTAyNSwKLSAgICBWT0xfVENfRnMxMjAwMCwKLSAgICBWT0xfVENfRnMxNjAwMCwKLSAgICBWT0xfVENfRnMyMjA1MCwKLSAgICBWT0xfVENfRnMyNDAwMCwKLSAgICBWT0xfVENfRnMzMjAwMCwKLSAgICBWT0xfVENfRnM0NDEwMCwKLSAgICBWT0xfVENfRnM0ODAwMAotICAgICxWT0xfVENfRnM4ODIwMAotICAgICxWT0xfVENfRnM5NjAwMAotICAgICxWT0xfVENfRnMxNzY0MDAKLSAgICAsVk9MX1RDX0ZzMTkyMDAwCi19OworICAgICAgICBWT0xfVENfRnM4MDAwLCAgVk9MX1RDX0ZzMTEwMjUsICBWT0xfVENfRnMxMjAwMCwgVk9MX1RDX0ZzMTYwMDAsIFZPTF9UQ19GczIyMDUwLAorICAgICAgICBWT0xfVENfRnMyNDAwMCwgVk9MX1RDX0ZzMzIwMDAsICBWT0xfVENfRnM0NDEwMCwgVk9MX1RDX0ZzNDgwMDAsIFZPTF9UQ19Gczg4MjAwLAorICAgICAgICBWT0xfVENfRnM5NjAwMCwgVk9MX1RDX0ZzMTc2NDAwLCBWT0xfVENfRnMxOTIwMDB9OwogCiBjb25zdCBMVk1fSU5UMTYgTFZEQkVfTWl4ZXJUQ1RhYmxlW10gPSB7CiAKLSAgICBNSVhfVENfRnM4MDAwLAotICAgIE1JWF9UQ19GczExMDI1LAotICAgIE1JWF9UQ19GczEyMDAwLAotICAgIE1JWF9UQ19GczE2MDAwLAotICAgIE1JWF9UQ19GczIyMDUwLAotICAgIE1JWF9UQ19GczI0MDAwLAotICAgIE1JWF9UQ19GczMyMDAwLAotICAgIE1JWF9UQ19GczQ0MTAwLAotICAgIE1JWF9UQ19GczQ4MDAwCi0gICAgLE1JWF9UQ19Gczg4MjAwCi0gICAgLE1JWF9UQ19Gczk2MDAwCi0gICAgLE1JWF9UQ19GczE3NjQwMAotICAgICxNSVhfVENfRnMxOTIwMDAKKyAgICAgICAgTUlYX1RDX0ZzODAwMCwgIE1JWF9UQ19GczExMDI1LCAgTUlYX1RDX0ZzMTIwMDAsIE1JWF9UQ19GczE2MDAwLCBNSVhfVENfRnMyMjA1MCwKKyAgICAgICAgTUlYX1RDX0ZzMjQwMDAsIE1JWF9UQ19GczMyMDAwLCAgTUlYX1RDX0ZzNDQxMDAsIE1JWF9UQ19GczQ4MDAwLCBNSVhfVENfRnM4ODIwMCwKKyAgICAgICAgTUlYX1RDX0ZzOTYwMDAsIE1JWF9UQ19GczE3NjQwMCwgTUlYX1RDX0ZzMTkyMDAwCiAKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCmluZGV4IGU0ZTg0NTAuLmM5MGM1Y2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCkBAIC02NywzMSArNjcsMjggQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIE1lbW9yeSB0YWJsZSovCi0jZGVmaW5lIExWTV9OUl9NRU1PUllfUkVHSU9OUyAgICAgICAgICAgICAgICAgNCAgICAgLyogTnVtYmVyIG9mIG1lbW9yeSByZWdpb25zICovCi0KIC8qIENvbmNlcnQgU291bmQgZWZmZWN0IGxldmVsIHByZXNldHMgKi8KLSNkZWZpbmUgTFZNX0NTX0VGRkVDVF9OT05FICAgICAgICAgICAgICAgICAgICAwICAgICAvKiAwJSBlZmZlY3QsIG1pbmltdW0gdmFsdWUgKi8KLSNkZWZpbmUgTFZNX0NTX0VGRkVDVF9MT1cgICAgICAgICAgICAgICAgIDE2Mzg0ICAgICAvKiA1MCUgZWZmZWN0ICovCi0jZGVmaW5lIExWTV9DU19FRkZFQ1RfTUVEICAgICAgICAgICAgICAgICAyNDU3NiAgICAgLyogNzUlIGVmZmVjdCAqLwotI2RlZmluZSBMVk1fQ1NfRUZGRUNUX0hJR0ggICAgICAgICAgICAgICAgMzI3NjcgICAgIC8qIDEwMCUgZWZmZWN0LCBtYXhpbXVtIHZhbHVlICovCisjZGVmaW5lIExWTV9DU19FRkZFQ1RfTk9ORSAwICAgICAvKiAwJSBlZmZlY3QsIG1pbmltdW0gdmFsdWUgKi8KKyNkZWZpbmUgTFZNX0NTX0VGRkVDVF9MT1cgMTYzODQgIC8qIDUwJSBlZmZlY3QgKi8KKyNkZWZpbmUgTFZNX0NTX0VGRkVDVF9NRUQgMjQ1NzYgIC8qIDc1JSBlZmZlY3QgKi8KKyNkZWZpbmUgTFZNX0NTX0VGRkVDVF9ISUdIIDMyNzY3IC8qIDEwMCUgZWZmZWN0LCBtYXhpbXVtIHZhbHVlICovCiAKIC8qIFRyZWJsZSBlbmhhbmNlbWVudCAqLwotI2RlZmluZSBMVk1fVEVfTE9XX01JUFMgICAgICAgICAgICAgICAgICAgMzI3NjcKKyNkZWZpbmUgTFZNX1RFX0xPV19NSVBTIDMyNzY3CiAKIC8qIEJhc3MgZW5oYW5jZW1lbnQgZWZmZWN0IGxldmVsIHByZXNldHMgKi8KLSNkZWZpbmUgTFZNX0JFXzBEQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAvKiAwZEIgYm9vc3QsIG5vIGVmZmVjdCAqLwotI2RlZmluZSBMVk1fQkVfM0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgIC8qICszZEIgYm9vc3QgKi8KLSNkZWZpbmUgTFZNX0JFXzZEQiAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ICAgICAvKiArNmRCIGJvb3N0ICovCi0jZGVmaW5lIExWTV9CRV85REIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSAgICAgLyogKzlkQiBib29zdCAqLwotI2RlZmluZSBMVk1fQkVfMTJEQiAgICAgICAgICAgICAgICAgICAgICAgICAgMTIgICAgIC8qICsxMmRCIGJvb3N0ICovCi0jZGVmaW5lIExWTV9CRV8xNURCICAgICAgICAgICAgICAgICAgICAgICAgICAxNSAgICAgLyogKzE1ZEIgYm9vc3QgKi8KKyNkZWZpbmUgTFZNX0JFXzBEQiAwICAgLyogMGRCIGJvb3N0LCBubyBlZmZlY3QgKi8KKyNkZWZpbmUgTFZNX0JFXzNEQiAzICAgLyogKzNkQiBib29zdCAqLworI2RlZmluZSBMVk1fQkVfNkRCIDYgICAvKiArNmRCIGJvb3N0ICovCisjZGVmaW5lIExWTV9CRV85REIgOSAgIC8qICs5ZEIgYm9vc3QgKi8KKyNkZWZpbmUgTFZNX0JFXzEyREIgMTIgLyogKzEyZEIgYm9vc3QgKi8KKyNkZWZpbmUgTFZNX0JFXzE1REIgMTUgLyogKzE1ZEIgYm9vc3QgKi8KIAogLyogTi1CYW5kIEVxdWFsaXplciAqLwotI2RlZmluZSBMVk1fRVFfTkJBTkRTICAgICAgICAgICAgICAgICAgICAgICAgIDUgICAgLyogTnVtYmVyIG9mIGJhbmRzIGZvciBlcXVhbGl6ZXIgKi8KKyNkZWZpbmUgTFZNX0VRX05CQU5EUyA1IC8qIE51bWJlciBvZiBiYW5kcyBmb3IgZXF1YWxpemVyICovCiAKIC8qIEhlYWRyb29tIG1hbmFnZW1lbnQgKi8KLSNkZWZpbmUgTFZNX0hFQURST09NX01BWF9OQkFORFMgICAgICAgICAgICAgICA1CisjZGVmaW5lIExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTIDUKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEwMCwxMjMgKzk3LDg5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogSW5zdGFuY2UgaGFuZGxlICovCi10eXBlZGVmIHZvaWQgKkxWTV9IYW5kbGVfdDsKK3R5cGVkZWYgdm9pZCogTFZNX0hhbmRsZV90OwogCiAvKiBTdGF0dXMgcmV0dXJuIHZhbHVlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX1NVQ0NFU1MgICAgICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBhIHJvdXRpbmUgKi8KLSAgICBMVk1fQUxJR05NRU5URVJST1IgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgYWxpZ25tZW50IGVycm9yICovCi0gICAgTFZNX05VTExBRERSRVNTICAgICAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KLSAgICBMVk1fT1VUT0ZSQU5HRSAgICAgICAgID0gMywgICAgICAgICAgICAgICAgICAgICAvKiBPdXQgb2YgcmFuZ2UgY29udHJvbCBwYXJhbWV0ZXIgKi8KLSAgICBMVk1fSU5WQUxJRE5VTVNBTVBMRVMgID0gNCwgICAgICAgICAgICAgICAgICAgICAvKiBJbnZhbGlkIG51bWJlciBvZiBzYW1wbGVzICovCi0gICAgTFZNX1dST05HQVVESU9USU1FICAgICA9IDUsICAgICAgICAgICAgICAgICAgICAgLyogV3JvbmcgdGltZSB2YWx1ZSBmb3IgYXVkaW8gdGltZSovCi0gICAgTFZNX0FMR09SSVRITURJU0FCTEVEICA9IDYsICAgICAgICAgICAgICAgICAgICAgLyogQWxnb3JpdGhtIGlzIGRpc2FibGVkKi8KLSAgICBMVk1fQUxHT1JJVEhNUFNBICAgICAgID0gNywgICAgICAgICAgICAgICAgICAgICAvKiBBbGdvcml0aG0gUFNBIHJldHVybnMgYW4gZXJyb3IgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgTFZNX1NVQ0NFU1MgPSAwLCAgICAgICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBhIHJvdXRpbmUgKi8KKyAgICBMVk1fQUxJR05NRU5URVJST1IgPSAxLCAgICAvKiBNZW1vcnkgYWxpZ25tZW50IGVycm9yICovCisgICAgTFZNX05VTExBRERSRVNTID0gMiwgICAgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KKyAgICBMVk1fT1VUT0ZSQU5HRSA9IDMsICAgICAgICAvKiBPdXQgb2YgcmFuZ2UgY29udHJvbCBwYXJhbWV0ZXIgKi8KKyAgICBMVk1fSU5WQUxJRE5VTVNBTVBMRVMgPSA0LCAvKiBJbnZhbGlkIG51bWJlciBvZiBzYW1wbGVzICovCisgICAgTFZNX1dST05HQVVESU9USU1FID0gNSwgICAgLyogV3JvbmcgdGltZSB2YWx1ZSBmb3IgYXVkaW8gdGltZSovCisgICAgTFZNX0FMR09SSVRITURJU0FCTEVEID0gNiwgLyogQWxnb3JpdGhtIGlzIGRpc2FibGVkKi8KKyAgICBMVk1fQUxHT1JJVEhNUFNBID0gNywgICAgICAvKiBBbGdvcml0aG0gUFNBIHJldHVybnMgYW4gZXJyb3IgKi8KICAgICBMVk1fUkVUVVJOU1RBVFVTX0RVTU1ZID0gTFZNX01BWEVOVU0KIH0gTFZNX1JldHVyblN0YXR1c19lbjsKIAogLyogQnVmZmVyIE1hbmFnZW1lbnQgbW9kZSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX01BTkFHRURfQlVGRkVSUyAgID0gMCwKK3R5cGVkZWYgZW51bSB7CisgICAgTFZNX01BTkFHRURfQlVGRkVSUyA9IDAsCiAgICAgTFZNX1VOTUFOQUdFRF9CVUZGRVJTID0gMSwKLSAgICBMVk1fQlVGRkVSU19EVU1NWSAgICAgPSBMVk1fTUFYRU5VTQorICAgIExWTV9CVUZGRVJTX0RVTU1ZID0gTFZNX01BWEVOVU0KIH0gTFZNX0J1ZmZlck1vZGVfZW47CiAKIC8qIE91dHB1dCBkZXZpY2UgdHlwZSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX0hFQURQSE9ORVMgICAgICAgICAgICAgPSAwLAotICAgIExWTV9FWF9IRUFEUEhPTkVTICAgICAgICAgID0gMSwKLSAgICBMVk1fU1BFQUtFUlRZUEVfTUFYICAgICAgICA9IExWTV9NQVhFTlVNCit0eXBlZGVmIGVudW0geworICAgIExWTV9IRUFEUEhPTkVTID0gMCwKKyAgICBMVk1fRVhfSEVBRFBIT05FUyA9IDEsCisgICAgTFZNX1NQRUFLRVJUWVBFX01BWCA9IExWTV9NQVhFTlVNCiB9IExWTV9PdXRwdXREZXZpY2VUeXBlX2VuOwogCiAvKiBWaXJ0dWFsaXplciBtb2RlIHNlbGVjdGlvbiovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fQ09OQ0VSVFNPVU5EICAgICAgID0gMCwKLSAgICBMVk1fVklSVFVBTElaRVJUWVBFX0RVTU1ZICAgPSBMVk1fTUFYRU5VTQordHlwZWRlZiBlbnVtIHsKKyAgICBMVk1fQ09OQ0VSVFNPVU5EID0gMCwKKyAgICBMVk1fVklSVFVBTElaRVJUWVBFX0RVTU1ZID0gTFZNX01BWEVOVU0KIH0gTFZNX1ZpcnR1YWxpemVyVHlwZV9lbjsKIAogLyogTi1CYW5kIEVxdWFsaXNlciBvcGVyYXRpbmcgbW9kZSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX0VRTkJfT0ZGICAgPSAwLAotICAgIExWTV9FUU5CX09OICAgID0gMSwKLSAgICBMVk1fRVFOQl9EVU1NWSA9IExWTV9NQVhFTlVNCi19IExWTV9FUU5CX01vZGVfZW47Cit0eXBlZGVmIGVudW0geyBMVk1fRVFOQl9PRkYgPSAwLCBMVk1fRVFOQl9PTiA9IDEsIExWTV9FUU5CX0RVTU1ZID0gTFZNX01BWEVOVU0gfSBMVk1fRVFOQl9Nb2RlX2VuOwogCiAvKiBCYXNzIEVuaGFuY2VtZW50IG9wZXJhdGluZyBtb2RlICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fQkVfT0ZGICAgPSAwLAotICAgIExWTV9CRV9PTiAgICA9IDEsCi0gICAgTFZNX0JFX0RVTU1ZID0gTFZNX01BWEVOVU0KLX0gTFZNX0JFX01vZGVfZW47Cit0eXBlZGVmIGVudW0geyBMVk1fQkVfT0ZGID0gMCwgTFZNX0JFX09OID0gMSwgTFZNX0JFX0RVTU1ZID0gTFZNX01BWEVOVU0gfSBMVk1fQkVfTW9kZV9lbjsKIAogLyogQmFzcyBFbmhhbmNlbWVudCBjZW50cmUgZnJlcXVlbmN5IHNlbGVjdGlvbiBjb250cm9sICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fQkVfQ0VOVFJFXzU1SHogID0gMCwKLSAgICBMVk1fQkVfQ0VOVFJFXzY2SHogID0gMSwKLSAgICBMVk1fQkVfQ0VOVFJFXzc4SHogID0gMiwKLSAgICBMVk1fQkVfQ0VOVFJFXzkwSHogID0gMywKK3R5cGVkZWYgZW51bSB7CisgICAgTFZNX0JFX0NFTlRSRV81NUh6ID0gMCwKKyAgICBMVk1fQkVfQ0VOVFJFXzY2SHogPSAxLAorICAgIExWTV9CRV9DRU5UUkVfNzhIeiA9IDIsCisgICAgTFZNX0JFX0NFTlRSRV85MEh6ID0gMywKICAgICBMVk1fQkVfQ0VOVFJFX0RVTU1ZID0gTFZNX01BWEVOVU0KIH0gTFZNX0JFX0NlbnRyZUZyZXFfZW47CiAKIC8qIEJhc3MgRW5oYW5jZW1lbnQgSFBGIHNlbGVjdGlvbiBjb250cm9sICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fQkVfSFBGX09GRiAgID0gMCwKLSAgICBMVk1fQkVfSFBGX09OICAgID0gMSwKK3R5cGVkZWYgZW51bSB7CisgICAgTFZNX0JFX0hQRl9PRkYgPSAwLAorICAgIExWTV9CRV9IUEZfT04gPSAxLAogICAgIExWTV9CRV9IUEZfRFVNTVkgPSBMVk1fTUFYRU5VTQogfSBMVk1fQkVfRmlsdGVyU2VsZWN0X2VuOwogCiAvKiBWb2x1bWUgQ29udHJvbCBvcGVyYXRpbmcgbW9kZSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX1ZDX09GRiAgID0gMCwKLSAgICBMVk1fVkNfT04gICAgPSAxLAotICAgIExWTV9WQ19EVU1NWSA9IExWTV9NQVhFTlVNCi19IExWTV9WQ19Nb2RlX2VuOwordHlwZWRlZiBlbnVtIHsgTFZNX1ZDX09GRiA9IDAsIExWTV9WQ19PTiA9IDEsIExWTV9WQ19EVU1NWSA9IExWTV9NQVhFTlVNIH0gTFZNX1ZDX01vZGVfZW47CiAKIC8qIFRyZWJsZSBFbmhhbmNlbWVudCBvcGVyYXRpbmcgbW9kZSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX1RFX09GRiAgID0gMCwKLSAgICBMVk1fVEVfT04gICAgPSAxLAotICAgIExWTV9URV9EVU1NWSA9IExWTV9NQVhFTlVNCi19IExWTV9URV9Nb2RlX2VuOwordHlwZWRlZiBlbnVtIHsgTFZNX1RFX09GRiA9IDAsIExWTV9URV9PTiA9IDEsIExWTV9URV9EVU1NWSA9IExWTV9NQVhFTlVNIH0gTFZNX1RFX01vZGVfZW47CiAKIC8qIEhlYWRyb29tIG1hbmFnZW1lbnQgb3BlcmF0aW5nIG1vZGUgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWTV9IRUFEUk9PTV9PRkYgICA9IDAsCi0gICAgTFZNX0hFQURST09NX09OICAgID0gMSwKK3R5cGVkZWYgZW51bSB7CisgICAgTFZNX0hFQURST09NX09GRiA9IDAsCisgICAgTFZNX0hFQURST09NX09OID0gMSwKICAgICBMVk1fSGVhZHJvb21fRFVNTVkgPSBMVk1fTUFYRU5VTQogfSBMVk1fSGVhZHJvb21fTW9kZV9lbjsKIAotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX1BTQV9TUEVFRF9TTE9XLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQZWFrIGRlY2F5aW5nIGF0IHNsb3cgc3BlZWQgKi8KLSAgICBMVk1fUFNBX1NQRUVEX01FRElVTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlYWsgZGVjYXlpbmcgYXQgbWVkaXVtIHNwZWVkICovCi0gICAgTFZNX1BTQV9TUEVFRF9GQVNULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQZWFrIGRlY2F5aW5nIGF0IGZhc3Qgc3BlZWQgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgTFZNX1BTQV9TUEVFRF9TTE9XLCAgIC8qIFBlYWsgZGVjYXlpbmcgYXQgc2xvdyBzcGVlZCAqLworICAgIExWTV9QU0FfU1BFRURfTUVESVVNLCAvKiBQZWFrIGRlY2F5aW5nIGF0IG1lZGl1bSBzcGVlZCAqLworICAgIExWTV9QU0FfU1BFRURfRkFTVCwgICAvKiBQZWFrIGRlY2F5aW5nIGF0IGZhc3Qgc3BlZWQgKi8KICAgICBMVk1fUFNBX1NQRUVEX0RVTU1ZID0gTFZNX01BWEVOVU0KIH0gTFZNX1BTQV9EZWNheVNwZWVkX2VuOwogCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fUFNBX09GRiAgID0gMCwKLSAgICBMVk1fUFNBX09OICAgID0gMSwKLSAgICBMVk1fUFNBX0RVTU1ZID0gTFZNX01BWEVOVU0KLX0gTFZNX1BTQV9Nb2RlX2VuOwordHlwZWRlZiBlbnVtIHsgTFZNX1BTQV9PRkYgPSAwLCBMVk1fUFNBX09OID0gMSwgTFZNX1BTQV9EVU1NWSA9IExWTV9NQVhFTlVNIH0gTFZNX1BTQV9Nb2RlX2VuOwogCiAvKiBWZXJzaW9uIGluZm9ybWF0aW9uICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9DSEFSICAgICAgICAgICAgICAgICAgICAqcFZlcnNpb25OdW1iZXI7ICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSB2ZXJzaW9uIG51bWJlciBpbiB0aGUgZm9ybWF0IFguWVkuWlogKi8KLSAgICBMVk1fQ0hBUiAgICAgICAgICAgICAgICAgICAgKnBQbGF0Zm9ybTsgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgbGlicmFyeSBwbGF0Zm9ybSB0eXBlICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0NIQVIqIHBWZXJzaW9uTnVtYmVyOyAvKiBQb2ludGVyIHRvIHRoZSB2ZXJzaW9uIG51bWJlciBpbiB0aGUgZm9ybWF0IFguWVkuWlogKi8KKyAgICBMVk1fQ0hBUiogcFBsYXRmb3JtOyAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGxpYnJhcnkgcGxhdGZvcm0gdHlwZSAqLwogfSBMVk1fVmVyc2lvbkluZm9fc3Q7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjI1LDkzICsxODgsODAgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX01lbW9yeVJlZ2lvbl9zdCAgICAgICAgIFJlZ2lvbltMVk1fTlJfTUVNT1JZX1JFR0lPTlNdOyAgLyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICovCi19IExWTV9NZW1UYWJfdDsKLQogLyogTi1CYW5kIGVxdWFsaXNlciBiYW5kIGRlZmluaXRpb24gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIEdhaW47ICAgICAgICAgICAgICAgICAgIC8qIEJhbmQgZ2FpbiBpbiBkQiAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBGcmVxdWVuY3k7ICAgICAgICAgICAgICAvKiBCYW5kIGNlbnRyZSBmcmVxdWVuY3kgaW4gSHogKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgUUZhY3RvcjsgICAgICAgICAgICAgICAgLyogQmFuZCBxdWFsaXR5IGZhY3RvciAoeDEwMCkgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fSU5UMTYgR2FpbjsgICAgICAgLyogQmFuZCBnYWluIGluIGRCICovCisgICAgTFZNX1VJTlQxNiBGcmVxdWVuY3k7IC8qIEJhbmQgY2VudHJlIGZyZXF1ZW5jeSBpbiBIeiAqLworICAgIExWTV9VSU5UMTYgUUZhY3RvcjsgICAvKiBCYW5kIHF1YWxpdHkgZmFjdG9yICh4MTAwKSAqLwogfSBMVk1fRVFOQl9CYW5kRGVmX3Q7CiAKIC8qIEhlYWRyb29tIGJhbmQgZGVmaW5pdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTGltaXRfTG93OyAgICAgICAgICAgICAgLyogTG93IGZyZXF1ZW5jeSBsaW1pdCBvZiB0aGUgYmFuZCBpbiBIZXJ0eiAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBMaW1pdF9IaWdoOyAgICAgICAgICAgICAvKiBIaWdoIGZyZXF1ZW5jeSBsaW1pdCBvZiB0aGUgYmFuZCBpbiBIZXJ0eiAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBIZWFkcm9vbV9PZmZzZXQ7ICAgICAgICAvKiBIZWFkcm9vbSA9IGJpZ2dlc3QgYmFuZCBnYWluIC0gSGVhZHJvb21fT2Zmc2V0ICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX1VJTlQxNiBMaW1pdF9Mb3c7ICAgICAgLyogTG93IGZyZXF1ZW5jeSBsaW1pdCBvZiB0aGUgYmFuZCBpbiBIZXJ0eiAqLworICAgIExWTV9VSU5UMTYgTGltaXRfSGlnaDsgICAgIC8qIEhpZ2ggZnJlcXVlbmN5IGxpbWl0IG9mIHRoZSBiYW5kIGluIEhlcnR6ICovCisgICAgTFZNX0lOVDE2IEhlYWRyb29tX09mZnNldDsgLyogSGVhZHJvb20gPSBiaWdnZXN0IGJhbmQgZ2FpbiAtIEhlYWRyb29tX09mZnNldCAqLwogfSBMVk1fSGVhZHJvb21CYW5kRGVmX3Q7CiAKIC8qIENvbnRyb2wgUGFyYW1ldGVyIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fTW9kZV9lbiAgICAgICAgICAgICAgICAgT3BlcmF0aW5nTW9kZTsgICAgICAgICAgLyogQnVuZGxlIG9wZXJhdGluZyBtb2RlIE9uL0J5cGFzcyAqLwotICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICBTYW1wbGVSYXRlOyAgICAgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAqLwotICAgIExWTV9Gb3JtYXRfZW4gICAgICAgICAgICAgICBTb3VyY2VGb3JtYXQ7ICAgICAgICAgICAvKiBJbnB1dCBkYXRhIGZvcm1hdCAqLwotICAgIExWTV9PdXRwdXREZXZpY2VUeXBlX2VuICAgICBTcGVha2VyVHlwZTsgICAgICAgICAgICAvKiBPdXRwdXQgZGV2aWNlIHR5cGUgKi8KKyAgICBMVk1fTW9kZV9lbiBPcGVyYXRpbmdNb2RlOyAgICAgICAgICAgLyogQnVuZGxlIG9wZXJhdGluZyBtb2RlIE9uL0J5cGFzcyAqLworICAgIExWTV9Gc19lbiBTYW1wbGVSYXRlOyAgICAgICAgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAqLworICAgIExWTV9Gb3JtYXRfZW4gU291cmNlRm9ybWF0OyAgICAgICAgICAvKiBJbnB1dCBkYXRhIGZvcm1hdCAqLworICAgIExWTV9PdXRwdXREZXZpY2VUeXBlX2VuIFNwZWFrZXJUeXBlOyAvKiBPdXRwdXQgZGV2aWNlIHR5cGUgKi8KIAogICAgIC8qIENvbmNlcnQgU291bmQgVmlydHVhbGl6ZXIgcGFyYW1ldGVycyovCi0gICAgTFZNX01vZGVfZW4gICAgICAgICAgICAgICAgIFZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZTsgLyogVmlydHVhbGl6ZXIgb3BlcmF0aW5nIG1vZGUgT24vT2ZmICovCi0gICAgTFZNX1ZpcnR1YWxpemVyVHlwZV9lbiAgICAgIFZpcnR1YWxpemVyVHlwZTsgICAgICAgICAgLyogVmlydHVhbGl6ZXIgdHlwZTogQ29uY2VydFNvdW5kICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFZpcnR1YWxpemVyUmV2ZXJiTGV2ZWw7ICAgLyogVmlydHVhbGl6ZXIgcmV2ZXJiIGxldmVsIGluICUgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgQ1NfRWZmZWN0TGV2ZWw7ICAgICAgICAgICAvKiBDb25jZXJ0IFNvdW5kIGVmZmVjdCBsZXZlbCAqLworICAgIExWTV9Nb2RlX2VuIFZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZTsgICAvKiBWaXJ0dWFsaXplciBvcGVyYXRpbmcgbW9kZSBPbi9PZmYgKi8KKyAgICBMVk1fVmlydHVhbGl6ZXJUeXBlX2VuIFZpcnR1YWxpemVyVHlwZTsgLyogVmlydHVhbGl6ZXIgdHlwZTogQ29uY2VydFNvdW5kICovCisgICAgTFZNX1VJTlQxNiBWaXJ0dWFsaXplclJldmVyYkxldmVsOyAgICAgIC8qIFZpcnR1YWxpemVyIHJldmVyYiBsZXZlbCBpbiAlICovCisgICAgTFZNX0lOVDE2IENTX0VmZmVjdExldmVsOyAgICAgICAgICAgICAgIC8qIENvbmNlcnQgU291bmQgZWZmZWN0IGxldmVsICovCiAKICAgICAvKiBOLUJhbmQgRXF1YWxpc2VyIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fRVFOQl9Nb2RlX2VuICAgICAgICAgICAgRVFOQl9PcGVyYXRpbmdNb2RlOyAgICAgLyogTi1CYW5kIEVxdWFsaXNlciBvcGVyYXRpbmcgbW9kZSAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBFUU5CX05CYW5kczsgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmFuZHMgKi8KLSAgICBMVk1fRVFOQl9CYW5kRGVmX3QgICAgICAgICAgKnBFUU5CX0JhbmREZWZpbml0aW9uOyAgLyogUG9pbnRlciB0byBlcXVhbGlzZXIgZGVmaW5pdGlvbnMgKi8KKyAgICBMVk1fRVFOQl9Nb2RlX2VuIEVRTkJfT3BlcmF0aW5nTW9kZTsgICAgICAvKiBOLUJhbmQgRXF1YWxpc2VyIG9wZXJhdGluZyBtb2RlICovCisgICAgTFZNX1VJTlQxNiBFUU5CX05CYW5kczsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJhbmRzICovCisgICAgTFZNX0VRTkJfQmFuZERlZl90KiBwRVFOQl9CYW5kRGVmaW5pdGlvbjsgLyogUG9pbnRlciB0byBlcXVhbGlzZXIgZGVmaW5pdGlvbnMgKi8KIAogICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLwotICAgIExWTV9CRV9Nb2RlX2VuICAgICAgICAgICAgICBCRV9PcGVyYXRpbmdNb2RlOyAgICAgICAvKiBCYXNzIEVuaGFuY2VtZW50IG9wZXJhdGluZyBtb2RlICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIEJFX0VmZmVjdExldmVsOyAgICAgICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgZWZmZWN0IGxldmVsICovCi0gICAgTFZNX0JFX0NlbnRyZUZyZXFfZW4gICAgICAgIEJFX0NlbnRyZUZyZXE7ICAgICAgICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgIExWTV9CRV9GaWx0ZXJTZWxlY3RfZW4gICAgICBCRV9IUEY7ICAgICAgICAgICAgICAgICAvKiBCYXNzIEVuaGFuY2VtZW50IGhpZ2ggcGFzcyBmaWx0ZXIgc2VsZWN0b3IgKi8KKyAgICBMVk1fQkVfTW9kZV9lbiBCRV9PcGVyYXRpbmdNb2RlOyAgICAvKiBCYXNzIEVuaGFuY2VtZW50IG9wZXJhdGluZyBtb2RlICovCisgICAgTFZNX0lOVDE2IEJFX0VmZmVjdExldmVsOyAgICAgICAgICAgLyogQmFzcyBFbmhhbmNlbWVudCBlZmZlY3QgbGV2ZWwgKi8KKyAgICBMVk1fQkVfQ2VudHJlRnJlcV9lbiBCRV9DZW50cmVGcmVxOyAvKiBCYXNzIEVuaGFuY2VtZW50IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICBMVk1fQkVfRmlsdGVyU2VsZWN0X2VuIEJFX0hQRjsgICAgICAvKiBCYXNzIEVuaGFuY2VtZW50IGhpZ2ggcGFzcyBmaWx0ZXIgc2VsZWN0b3IgKi8KIAogICAgIC8qIFZvbHVtZSBDb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgVkNfRWZmZWN0TGV2ZWw7ICAgICAgICAgLyogVm9sdW1lIENvbnRyb2wgc2V0dGluZyBpbiBkQnMgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgVkNfQmFsYW5jZTsgICAgICAgICAgICAgLyogTGVmdCBSaWdodCBCYWxhbmNlIGNvbnRyb2wgaW4gZEIgKC05NiB0byA5NiBkQiksIC12ZSB2YWx1ZXMgcmVkdWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJpZ2h0IGNoYW5uZWwgd2hpbGUgK3ZlIHZhbHVlIHJlZHVjZXMgTGVmdCBjaGFubmVsKi8KKyAgICBMVk1fSU5UMTYgVkNfRWZmZWN0TGV2ZWw7IC8qIFZvbHVtZSBDb250cm9sIHNldHRpbmcgaW4gZEJzICovCisgICAgTFZNX0lOVDE2IFZDX0JhbGFuY2U7ICAgICAvKiBMZWZ0IFJpZ2h0IEJhbGFuY2UgY29udHJvbCBpbiBkQiAoLTk2IHRvIDk2IGRCKSwgLXZlIHZhbHVlcyByZWR1Y2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJpZ2h0IGNoYW5uZWwgd2hpbGUgK3ZlIHZhbHVlIHJlZHVjZXMgTGVmdCBjaGFubmVsKi8KIAogICAgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCi0gICAgTFZNX1RFX01vZGVfZW4gICAgICAgICAgICAgIFRFX09wZXJhdGluZ01vZGU7ICAgICAgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCBPbi9PZmYgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgVEVfRWZmZWN0TGV2ZWw7ICAgICAgICAgLyogVHJlYmxlIEVuaGFuY2VtZW50IGdhaW4gZEJzICovCisgICAgTFZNX1RFX01vZGVfZW4gVEVfT3BlcmF0aW5nTW9kZTsgLyogVHJlYmxlIEVuaGFuY2VtZW50IE9uL09mZiAqLworICAgIExWTV9JTlQxNiBURV9FZmZlY3RMZXZlbDsgICAgICAgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCBnYWluIGRCcyAqLwogCiAgICAgLyogU3BlY3RydW0gQW5hbHl6ZXIgcGFyYW1ldGVycyBDb250cm9sICovCi0gICAgTFZNX1BTQV9Nb2RlX2VuICAgICAgICAgICAgIFBTQV9FbmFibGU7Ci0gICAgTFZNX1BTQV9EZWNheVNwZWVkX2VuICAgICAgIFBTQV9QZWFrRGVjYXlSYXRlOyAgICAgIC8qIFBlYWsgdmFsdWUgZGVjYXkgcmF0ZSovCi0jaWZkZWYgU1VQUE9SVF9NQwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICBDaE1hc2s7Ci0jZW5kaWYKKyAgICBMVk1fUFNBX01vZGVfZW4gUFNBX0VuYWJsZTsKKyAgICBMVk1fUFNBX0RlY2F5U3BlZWRfZW4gUFNBX1BlYWtEZWNheVJhdGU7IC8qIFBlYWsgdmFsdWUgZGVjYXkgcmF0ZSovCisgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHM7CisgICAgTFZNX0lOVDMyIENoTWFzazsKIAogfSBMVk1fQ29udHJvbFBhcmFtc190OwogCiAvKiBJbnN0YW5jZSBQYXJhbWV0ZXIgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIEdlbmVyYWwgKi8KLSAgICBMVk1fQnVmZmVyTW9kZV9lbiAgICAgICAgICAgQnVmZmVyTW9kZTsgICAgICAgICAgICAgLyogQnVmZmVyIG1hbmFnZW1lbnQgbW9kZSAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemU7ICAgICAgICAgICAvKiBNYXhpbXVtIHByb2Nlc3NpbmcgYmxvY2sgc2l6ZSAqLworICAgIExWTV9CdWZmZXJNb2RlX2VuIEJ1ZmZlck1vZGU7IC8qIEJ1ZmZlciBtYW5hZ2VtZW50IG1vZGUgKi8KKyAgICBMVk1fVUlOVDE2IE1heEJsb2NrU2l6ZTsgICAgICAvKiBNYXhpbXVtIHByb2Nlc3NpbmcgYmxvY2sgc2l6ZSAqLwogCiAgICAgLyogTi1CYW5kIEVxdWFsaXNlciAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBFUU5CX051bUJhbmRzOyAgICAgICAgICAvKiBNYXhpbXVtIG51bWJlciBvZiBlcXVhbGlzZXIgYmFuZHMgKi8KKyAgICBMVk1fVUlOVDE2IEVRTkJfTnVtQmFuZHM7IC8qIE1heGltdW0gbnVtYmVyIG9mIGVxdWFsaXNlciBiYW5kcyAqLwogCiAgICAgLyogUFNBICovCi0gICAgTFZNX1BTQV9Nb2RlX2VuICAgICAgICAgICAgIFBTQV9JbmNsdWRlZDsgICAgICAgICAgICAvKiBDb250cm9scyB0aGUgaW5zdGFuY2UgbWVtb3J5IGFsbG9jYXRpb24gZm9yIFBTQTogT04vT0ZGICovCisgICAgTFZNX1BTQV9Nb2RlX2VuIFBTQV9JbmNsdWRlZDsgLyogQ29udHJvbHMgdGhlIGluc3RhbmNlIG1lbW9yeSBhbGxvY2F0aW9uIGZvciBQU0E6IE9OL09GRiAqLwogfSBMVk1fSW5zdFBhcmFtc190OwogCiAvKiBIZWFkcm9vbSBtYW5hZ2VtZW50IHBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0hlYWRyb29tX01vZGVfZW4gICAgICAgIEhlYWRyb29tX09wZXJhdGluZ01vZGU7IC8qIEhlYWRyb29tIENvbnRyb2wgT24vT2ZmICovCi0gICAgTFZNX0hlYWRyb29tQmFuZERlZl90ICAgICAgICpwSGVhZHJvb21EZWZpbml0aW9uOyAgIC8qIFBvaW50ZXIgdG8gaGVhZHJvb20gYmFuZHMgZGVmaW5pdGlvbiAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBOSGVhZHJvb21CYW5kczsgICAgICAgICAvKiBOdW1iZXIgb2YgaGVhZHJvb20gYmFuZHMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fSGVhZHJvb21fTW9kZV9lbiBIZWFkcm9vbV9PcGVyYXRpbmdNb2RlOyAvKiBIZWFkcm9vbSBDb250cm9sIE9uL09mZiAqLworICAgIExWTV9IZWFkcm9vbUJhbmREZWZfdCogcEhlYWRyb29tRGVmaW5pdGlvbjsgIC8qIFBvaW50ZXIgdG8gaGVhZHJvb20gYmFuZHMgZGVmaW5pdGlvbiAqLworICAgIExWTV9VSU5UMTYgTkhlYWRyb29tQmFuZHM7ICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBoZWFkcm9vbSBiYW5kcyAqLwogCiB9IExWTV9IZWFkcm9vbVBhcmFtc190OwogCkBAIC0zMzksNTUgKzI4OSwxOCBAQAogLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0VmVyc2lvbkluZm8oTFZNX1ZlcnNpb25JbmZvX3N0ICAqcFZlcnNpb24pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9HZXRNZW1vcnlUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCi0vKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICAgKi8KLS8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICAgKi8KLS8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICovCi0vKiAgcEluc3RQYXJhbXMgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgICBXaGVuIG9uZSBvZiBwTWVtb3J5VGFibGUgb3IgcEluc3RQYXJhbXMgaXMgTlVMTCAgICAgICAgICAgICAqLwotLyogIExWTV9PVVRPRlJBTkdFICAgICAgICAgIFdoZW4gYW55IG9mIHRoZSBJbnN0YW5jZSBwYXJhbWV0ZXJzIGFyZSBvdXQgb2YgcmFuZ2UgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0TWVtb3J5VGFibGUoTFZNX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01lbVRhYl90ICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JbnN0UGFyYW1zX3QgICAgICpwSW5zdFBhcmFtcyk7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRWZXJzaW9uSW5mbyhMVk1fVmVyc2lvbkluZm9fc3QqIHBWZXJzaW9uKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0SW5zdGFuY2VIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgYnVuZGxlIGluc3RhbmNlLiBJdCByZXR1cm5zIHRoZSBjcmVhdGVkIGluc3RhbmNlICAqLwotLyogIGhhbmRsZSB0aHJvdWdoIHBoSW5zdGFuY2UuIEFsbCBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCwgaW5hY3RpdmUgc3RhdGUuICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIGJ1bmRsZSBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBbGwgcGFyYW1ldGVycyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQsIGluYWN0aXZlIHN0YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwaEluc3RhbmNlICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBwSW5zdFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM5OSw5ICszMTIsMjQgQEAKIC8qICAxLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldEluc3RhbmNlSGFuZGxlKExWTV9IYW5kbGVfdCAgICAgICAgKnBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtVGFiX3QgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSW5zdFBhcmFtc190ICAgICpwSW5zdFBhcmFtcyk7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRJbnN0YW5jZUhhbmRsZShMVk1fSGFuZGxlX3QqIHBoSW5zdGFuY2UsIExWTV9JbnN0UGFyYW1zX3QqIHBJbnN0UGFyYW1zKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fRGVsSW5zdGFuY2VIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgYnVuZGxlIGluc3RhbmNlLiBJdCByZXR1cm5zIHRoZSBjcmVhdGVkIGluc3RhbmNlICAqLworLyogIGhhbmRsZSB0aHJvdWdoIHBoSW5zdGFuY2UuIEFsbCBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCwgaW5hY3RpdmUgc3RhdGUuICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVk1fRGVsSW5zdGFuY2VIYW5kbGUoTFZNX0hhbmRsZV90KiBwaEluc3RhbmNlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQyMSw3ICszNDksNyBAQAogLyogIDEuIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fQ2xlYXJBdWRpb0J1ZmZlcnMoTFZNX0hhbmRsZV90ICBoSW5zdGFuY2UpOworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fQ2xlYXJBdWRpb0J1ZmZlcnMoTFZNX0hhbmRsZV90IGhJbnN0YW5jZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00NDMsOCArMzcxLDcgQEAKIC8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKExWTV9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcyk7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhMVk1fSGFuZGxlX3QgaEluc3RhbmNlLCBMVk1fQ29udHJvbFBhcmFtc190KiBwUGFyYW1zKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQ2Niw4ICszOTMsNyBAQAogLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMoTFZNX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKTsKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWTV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDk5LDExICs0MjUsOCBAQAogLyogICAgICBTVEVSRU8gICAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2FtcGxlIHBhaXJzIGluIHRoZSBibG9jayAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fUHJvY2VzcyhMVk1fSGFuZGxlX3QgICAgICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lKTsKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1Byb2Nlc3MoTFZNX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBPdXREYXRhLCBMVk1fVUlOVDE2IE51bVNhbXBsZXMsIExWTV9VSU5UMzIgQXVkaW9UaW1lKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTUyNCw4ICs0NDcsOCBAQAogLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fU2V0SGVhZHJvb21QYXJhbXMoICBMVk1fSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9IZWFkcm9vbVBhcmFtc190ICAgICpwSGVhZHJvb21QYXJhbXMpOworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fU2V0SGVhZHJvb21QYXJhbXMoTFZNX0hhbmRsZV90IGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9IZWFkcm9vbVBhcmFtc190KiBwSGVhZHJvb21QYXJhbXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTQ2LDggKzQ2OSw4IEBACiAvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRIZWFkcm9vbVBhcmFtcyggIExWTV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgKnBIZWFkcm9vbVBhcmFtcyk7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRIZWFkcm9vbVBhcmFtcyhMVk1fSGFuZGxlX3QgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QqIHBIZWFkcm9vbVBhcmFtcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01NzQsMTAgKzQ5Nyw4IEBACiAvKiAgMS4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRTcGVjdHJ1bSggTFZNX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICpwQ3VycmVudFBlYWtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICpwUGFzdFBlYWtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEF1ZGlvVGltZSk7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRTcGVjdHJ1bShMVk1fSGFuZGxlX3QgaEluc3RhbmNlLCBMVk1fVUlOVDgqIHBDdXJyZW50UGVha3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDgqIHBQYXN0UGVha3MsIExWTV9JTlQzMiBBdWRpb1RpbWUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTk5LDggKzUyMCw2IEBACiAvKiAgMS4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRWb2x1bWVOb1Ntb290aGluZyggTFZNX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcyk7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRWb2x1bWVOb1Ntb290aGluZyhMVk1fSGFuZGxlX3QgaEluc3RhbmNlLCBMVk1fQ29udHJvbFBhcmFtc190KiBwUGFyYW1zKTsKIAotI2VuZGlmICAgICAgLyogX19MVk1fSF9fICovCi0KKyNlbmRpZiAvKiBfX0xWTV9IX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9BUElfU3BlY2lhbHMuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0FQSV9TcGVjaWFscy5jcHAKaW5kZXggZTI0MWNkZC4uY2VhOTY0YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0FQSV9TcGVjaWFscy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0FQSV9TcGVjaWFscy5jcHAKQEAgLTQ3LDY5ICs0Nyw1MiBAQAogLyogIDEuIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0U3BlY3RydW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAqcEN1cnJlbnRQZWFrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICpwUGFzdFBlYWtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQXVkaW9UaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgTFZNX0luc3RhbmNlX3QgICAgICAgICAgICpwSW5zdGFuY2UgICA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRTcGVjdHJ1bShMVk1fSGFuZGxlX3QgaEluc3RhbmNlLCBMVk1fVUlOVDgqIHBDdXJyZW50UGVha3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDgqIHBQYXN0UGVha3MsIExWTV9JTlQzMiBBdWRpb1RpbWUpIHsKKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CiAKLSAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICpoUFNBSW5zdGFuY2U7Ci0gICAgTFZQU0FfUkVUVVJOICAgICAgICAgICBMVlBTQV9TdGF0dXM7CisgICAgcExWUFNBX0hhbmRsZV90KiBoUFNBSW5zdGFuY2U7CisgICAgTFZQU0FfUkVUVVJOIExWUFNBX1N0YXR1czsKIAotICAgIGlmKHBJbnN0YW5jZSA9PSBMVk1fTlVMTCkKLSAgICB7CisgICAgaWYgKHBJbnN0YW5jZSA9PSBMVk1fTlVMTCkgewogICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOwogICAgIH0KIAogICAgIC8qSWYgUFNBIGlzIG5vdCBpbmNsdWRlZCBhdCB0aGUgdGltZSBvZiBpbnN0YW5jZSBjcmVhdGlvbiwgcmV0dXJuIHdpdGhvdXQgYW55IHByb2Nlc3NpbmcqLwotICAgIGlmKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQhPUxWTV9QU0FfT04pCi0gICAgeworICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuUFNBX0luY2x1ZGVkICE9IExWTV9QU0FfT04pIHsKICAgICAgICAgcmV0dXJuIExWTV9TVUNDRVNTOwogICAgIH0KIAotICAgIGhQU0FJbnN0YW5jZSA9IChwTFZQU0FfSGFuZGxlX3QgKilwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZTsKKyAgICBoUFNBSW5zdGFuY2UgPSAocExWUFNBX0hhbmRsZV90KilwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZTsKIAotICAgIGlmKChwQ3VycmVudFBlYWtzID09IExWTV9OVUxMKSB8fAotICAgICAgICAocFBhc3RQZWFrcyA9PSBMVk1fTlVMTCkpCi0gICAgeworICAgIGlmICgocEN1cnJlbnRQZWFrcyA9PSBMVk1fTlVMTCkgfHwgKHBQYXN0UGVha3MgPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgbmV3IHBhcmFtZXRlcnMgaWYgbmVjZXNzYXJ5CiAgICAgICovCi0gICAgaWYgKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCi0gICAgeworICAgIGlmIChwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKSB7CiAgICAgICAgIExWTV9BcHBseU5ld1NldHRpbmdzKGhJbnN0YW5jZSk7CiAgICAgfQogCiAgICAgLyogSWYgUFNBIG1vZHVsZSBpcyBkaXNhYmxlZCwgZG8gbm90aGluZyAqLwotICAgIGlmKHBJbnN0YW5jZS0+UGFyYW1zLlBTQV9FbmFibGU9PUxWTV9QU0FfT0ZGKQotICAgIHsKKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuUFNBX0VuYWJsZSA9PSBMVk1fUFNBX09GRikgewogICAgICAgICByZXR1cm4gTFZNX0FMR09SSVRITURJU0FCTEVEOwogICAgIH0KIAotICAgIExWUFNBX1N0YXR1cyA9IExWUFNBX0dldFNwZWN0cnVtKGhQU0FJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZQU0FfVGltZSkgKEF1ZGlvVGltZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UOCopIHBDdXJyZW50UGVha3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UOCopIHBQYXN0UGVha3MgKTsKKyAgICBMVlBTQV9TdGF0dXMgPSBMVlBTQV9HZXRTcGVjdHJ1bShoUFNBSW5zdGFuY2UsIChMVlBTQV9UaW1lKShBdWRpb1RpbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDgqKXBDdXJyZW50UGVha3MsIChMVk1fVUlOVDgqKXBQYXN0UGVha3MpOwogCi0gICAgaWYoTFZQU0FfU3RhdHVzICE9IExWUFNBX09LKQotICAgIHsKLSAgICAgICAgaWYoTFZQU0FfU3RhdHVzID09IExWUFNBX0VSUk9SX1dST05HVElNRSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChMVk1fUmV0dXJuU3RhdHVzX2VuKSBMVk1fV1JPTkdBVURJT1RJTUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKExWTV9SZXR1cm5TdGF0dXNfZW4pIExWTV9OVUxMQUREUkVTUzsKKyAgICBpZiAoTFZQU0FfU3RhdHVzICE9IExWUFNBX09LKSB7CisgICAgICAgIGlmIChMVlBTQV9TdGF0dXMgPT0gTFZQU0FfRVJST1JfV1JPTkdUSU1FKSB7CisgICAgICAgICAgICByZXR1cm4gKExWTV9SZXR1cm5TdGF0dXNfZW4pTFZNX1dST05HQVVESU9USU1FOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWTV9OVUxMQUREUkVTUzsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybihMVk1fU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVk1fU1VDQ0VTUyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTMyLDE1ICsxMTUsMTIgQEAKIC8qICAxLiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1NldFZvbHVtZU5vU21vb3RoaW5nKCBMVk1fSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKQotewotICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1NldFZvbHVtZU5vU21vb3RoaW5nKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWTV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CiAgICAgTFZNX1JldHVyblN0YXR1c19lbiBFcnJvcjsKIAogICAgIC8qQXBwbHkgbmV3IGNvbnRyb2xzKi8KLSAgICBFcnJvciA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhoSW5zdGFuY2UscFBhcmFtcyk7CisgICAgRXJyb3IgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMoaEluc3RhbmNlLCBwUGFyYW1zKTsKICAgICBwSW5zdGFuY2UtPk5vU21vb3RoVm9sdW1lID0gTFZNX1RSVUU7CiAgICAgcmV0dXJuIEVycm9yOwogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jcHAKaW5kZXggM2FlZGRiYi4uMWQ5MTNkNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmNwcApAQCAtNDksMTA5ICs0OSw5MCBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVk1fQnVmZmVyTWFuYWdlZEluKExWTV9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAqKnBUb1Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICoqcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgKnBOdW1TYW1wbGVzKQotewotCi0gICAgTFZNX0lOVDE2ICAgICAgICBTYW1wbGVDb3VudDsgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIGJlIHByb2Nlc3NlZCB0aGlzIGNhbGwgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgIE51bVNhbXBsZXM7ICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gc2NyYXRjaCBidWZmZXIgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICpwU3RhcnQ7Ci0gICAgTFZNX0luc3RhbmNlX3QgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVk1fQnVmZmVyX3QgICAgICpwQnVmZmVyOwotICAgIExWTV9GTE9BVCAgICAgICAgKnBEZXN0OwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICBMVk1fSU5UMTYgICAgICAgIE51bUNoYW5uZWxzID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOwotI2Vsc2UKLSAgICBMVk1fSU5UMTYgICAgICAgIE51bUNoYW5uZWxzID0gMjsKLSNlbmRpZgordm9pZCBMVk1fQnVmZmVyTWFuYWdlZEluKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogcEluRGF0YSwgTFZNX0ZMT0FUKiogcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqKiBwUHJvY2Vzc2VkLCBMVk1fVUlOVDE2KiBwTnVtU2FtcGxlcykgeworICAgIExWTV9JTlQxNiBTYW1wbGVDb3VudDsgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gYmUgcHJvY2Vzc2VkIHRoaXMgY2FsbCAqLworICAgIExWTV9JTlQxNiBOdW1TYW1wbGVzOyAgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gc2NyYXRjaCBidWZmZXIgKi8KKyAgICBMVk1fRkxPQVQqIHBTdGFydDsKKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgTFZNX0J1ZmZlcl90KiBwQnVmZmVyOworICAgIExWTV9GTE9BVCogcERlc3Q7CisgICAgTFZNX0lOVDE2IE51bUNoYW5uZWxzID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOwogCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIHByb2Nlc3NpbmcgYWRkcmVzcyBwb2ludGVycwogICAgICAqLwotICAgIHBCdWZmZXIgICAgID0gcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudDsKLSAgICBwRGVzdCAgICAgICA9IHBCdWZmZXItPnBTY3JhdGNoOworICAgIHBCdWZmZXIgPSBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50OworICAgIHBEZXN0ID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CiAgICAgKnBUb1Byb2Nlc3MgPSBwQnVmZmVyLT5wU2NyYXRjaDsKICAgICAqcFByb2Nlc3NlZCA9IHBCdWZmZXItPnBTY3JhdGNoOwogCiAgICAgLyoKICAgICAgKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCBvZiBhIGJsb2NrCiAgICAgICovCi0gICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9PSAwKQotICAgIHsKKyAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID09IDApIHsKICAgICAgICAgLyoKICAgICAgICAgICogRmlyc3QgY2FsbCBmb3IgYSBuZXcgYmxvY2sgb2Ygc2FtcGxlcwogICAgICAgICAgKi8KICAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gKExWTV9JTlQxNikoKnBOdW1TYW1wbGVzICsgcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMpOwotICAgICAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgPSAoTFZNX0ZMT0FUICopcEluRGF0YTsKLSAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgICAgICAgID0gTFZNX0ZJUlNUQ0FMTDsKKyAgICAgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzID0gKExWTV9GTE9BVCopcEluRGF0YTsKKyAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgPSBMVk1fRklSU1RDQUxMOwogICAgIH0KLSAgICBwU3RhcnQgPSBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXM7ICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBzYW1wbGVzICovCi0gICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ICA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlcyB0byBvdXRwdXQgaXMgc2FtZSBhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciByZWFkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KKyAgICBwU3RhcnQgPSBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXM7IC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IHNhbXBsZXMgKi8KKyAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgPSAwOyAgICAgIC8qIFNhbXBsZXMgdG8gb3V0cHV0IGlzIHNhbWUgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciByZWFkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KIAogICAgIC8qCiAgICAgICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzIHRoaXMgY2FsbCBhbmQgdXBkYXRlIHRoZSBidWZmZXIgc3RhdGUKICAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID4gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZSkKLSAgICB7CisgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA+IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemUpIHsKICAgICAgICAgLyoKICAgICAgICAgICogUHJvY2VzcyB0aGUgbWF4aW11bSBib2NrIHNpemUgb2Ygc2FtcGxlcy4KICAgICAgICAgICovCiAgICAgICAgIFNhbXBsZUNvdW50ID0gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKLSAgICAgICAgTnVtU2FtcGxlcyAgPSBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOwotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgICAgICBOdW1TYW1wbGVzID0gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICB9IGVsc2UgewogICAgICAgICAvKgogICAgICAgICAgKiBMYXN0IGNhbGwgZm9yIHRoZSBibG9jaywgc28gY2FsY3VsYXRlIGhvdyBtYW55IGZyYW1lcyBhbmQgc2FtcGxlcyB0byBwcm9jZXNzCi0gICAgICAgICAgKi8KLSAgICAgICAgTFZNX0lOVDE2ICAgTnVtRnJhbWVzOworICAgICAgICAgKi8KKyAgICAgICAgTFZNX0lOVDE2IE51bUZyYW1lczsKIAotICAgICAgICBOdW1TYW1wbGVzICA9IHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsKLSAgICAgICAgTnVtRnJhbWVzICAgID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyA+PiBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CisgICAgICAgIE51bVNhbXBsZXMgPSBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7CisgICAgICAgIE51bUZyYW1lcyA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPj4gTUlOX0lOVEVSTkFMX0JMT0NLU0hJRlQpOwogICAgICAgICBTYW1wbGVDb3VudCA9IChMVk1fSU5UMTYpKE51bUZyYW1lcyA8PCBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CiAKICAgICAgICAgLyoKICAgICAgICAgICogVXBkYXRlIHRoZSBidWZmZXIgc3RhdGUKICAgICAgICAgICovCi0gICAgICAgIGlmIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RDQUxMKQotICAgICAgICB7CisgICAgICAgIGlmIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RDQUxMKSB7CiAgICAgICAgICAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9IExWTV9GSVJTVExBU1RDQUxMOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgPSBMVk1fTEFTVENBTEw7CiAgICAgICAgIH0KICAgICB9Ci0gICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpU2FtcGxlQ291bnQ7ICAvKiBTZXQgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgdGhpcyBjYWxsICovCisgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpU2FtcGxlQ291bnQ7IC8qIFNldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyB0aGlzIGNhbGwgKi8KIAogICAgIC8qCiAgICAgICogQ29weSBzYW1wbGVzIGZyb20gdGhlIGRlbGF5IGJ1ZmZlciBhcyByZXF1aXJlZAogICAgICAqLwotICAgIGlmICgoKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVENBTEwpIHx8Ci0gICAgICAgIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkpICYmCi0gICAgICAgIChwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyAhPSAwKSkKLSAgICB7Ci0gICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPkluRGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtQ2hhbm5lbHMgKiBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcykpOyAgICAvKiBOdW1iZXIgb2YgZGVsYXkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLCBsZWZ0IGFuZCByaWdodCAqLworICAgIGlmICgoKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVENBTEwpIHx8IChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkpICYmCisgICAgICAgIChwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyAhPSAwKSkgeworICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5JbkRlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzICogcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMpKTsgLyogTnVtYmVyIG9mIGRlbGF5IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcywgbGVmdCBhbmQgcmlnaHQgKi8KICAgICAgICAgTnVtU2FtcGxlcyA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgLSBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyk7IC8qIFVwZGF0ZSBzYW1wbGUgY291bnQgKi8KLSAgICAgICAgcERlc3QgKz0gTnVtQ2hhbm5lbHMgKiBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlczsgICAgICAvKiBVcGRhdGUgdGhlIGRlc3RpbmF0aW9uIHBvaW50ZXIgKi8KKyAgICAgICAgcERlc3QgKz0gTnVtQ2hhbm5lbHMgKiBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlczsgLyogVXBkYXRlIHRoZSBkZXN0aW5hdGlvbiBwb2ludGVyICovCiAgICAgfQogCiAgICAgLyoKICAgICAgKiBDb3B5IHRoZSByZXN0IG9mIHRoZSBzYW1wbGVzIGZvciB0aGlzIGNhbGwgZnJvbSB0aGUgaW5wdXQgYnVmZmVyCiAgICAgICovCi0gICAgaWYgKE51bVNhbXBsZXMgPiAwKQotICAgIHsKLSAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzICogTnVtU2FtcGxlcykpOyAgICAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCi0gICAgICAgIHBTdGFydCArPSBOdW1DaGFubmVscyAqIE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBpbnB1dCBwb2ludGVyICovCisgICAgaWYgKE51bVNhbXBsZXMgPiAwKSB7CisgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzICogTnVtU2FtcGxlcykpOyAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLworICAgICAgICBwU3RhcnQgKz0gTnVtQ2hhbm5lbHMgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGlucHV0IHBvaW50ZXIgKi8KIAogICAgICAgICAvKgogICAgICAgICAgKiBVcGRhdGUgdGhlIGlucHV0IGRhdGEgcG9pbnRlciBhbmQgc2FtcGxlcyB0byBvdXRwdXQKQEAgLTE2MSwzMyArMTQyLDMwIEBACiAgICAgfQogCiAgICAgLyoKLSAgICAgICogVXBkYXRlIHRoZSBzYW1wbGUgY291bnQgYW5kIGlucHV0IHBvaW50ZXIKKyAgICAgKiBVcGRhdGUgdGhlIHNhbXBsZSBjb3VudCBhbmQgaW5wdXQgcG9pbnRlcgogICAgICAqLwogICAgIC8qIFVwZGF0ZSB0aGUgY291bnQgb2Ygc2FtcGxlcyAqLwotICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgLSBTYW1wbGVDb3VudCk7Ci0gICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgICA9IHBTdGFydDsgLyogVXBkYXRlIGlucHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gKExWTV9JTlQxNikocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzIC0gU2FtcGxlQ291bnQpOworICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyA9IHBTdGFydDsgLyogVXBkYXRlIGlucHV0IHNhbXBsZSBwb2ludGVyICovCiAKICAgICAvKgogICAgICAqIFNhdmUgc2FtcGxlcyB0byB0aGUgZGVsYXkgYnVmZmVyIGlmIGFueSBsZWZ0IHVucHJvY2Vzc2VkCiAgICAgICovCi0gICAgaWYgKChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkgfHwKLSAgICAgICAgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9MQVNUQ0FMTCkpCi0gICAgeworICAgIGlmICgocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUTEFTVENBTEwpIHx8IChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fTEFTVENBTEwpKSB7CiAgICAgICAgIE51bVNhbXBsZXMgPSBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7Ci0gICAgICAgIHBTdGFydCAgICAgPSBwQnVmZmVyLT5wU2NyYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IG9mIHRoZSBidWZmZXIgKi8KLSAgICAgICAgcFN0YXJ0ICAgICs9IE51bUNoYW5uZWxzICogU2FtcGxlQ291bnQ7IC8qIE9mZnNldCBieSB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCi0gICAgICAgIGlmIChOdW1TYW1wbGVzICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5JbkRlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzICogTnVtU2FtcGxlcykpOyAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgICAgIHBTdGFydCA9IHBCdWZmZXItPnBTY3JhdGNoOyAgICAgICAgICAvKiBTdGFydCBvZiB0aGUgYnVmZmVyICovCisgICAgICAgIHBTdGFydCArPSBOdW1DaGFubmVscyAqIFNhbXBsZUNvdW50OyAvKiBPZmZzZXQgYnkgdGhlIG51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworICAgICAgICBpZiAoTnVtU2FtcGxlcyAhPSAwKSB7CisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPkluRGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzICogTnVtU2FtcGxlcykpOyAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLwogICAgICAgICB9CiAKICAgICAgICAgLyoKICAgICAgICAgICogVXBkYXRlIHRoZSBkZWxheSBzYW1wbGUgY291bnQKICAgICAgICAgICovCi0gICAgICAgIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzICAgICA9IE51bVNhbXBsZXM7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGUgcGFpcnMgKi8KLSAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxsIFNhbXBsZXMgdXNlZCAqLworICAgICAgICBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyA9IE51bVNhbXBsZXM7IC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGUgcGFpcnMgKi8KKyAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gMDsgICAgICAvKiBBbGwgU2FtcGxlcyB1c2VkICovCiAgICAgfQogfQogCkBAIC0yMTMsMzMgKzE5MSwyNSBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVk1fQnVmZmVyVW5tYW5hZ2VkSW4oTFZNX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICoqcFRvUHJvY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKipwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAqcE51bVNhbXBsZXMpCi17Ci0KLSAgICBMVk1fSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKK3ZvaWQgTFZNX0J1ZmZlclVubWFuYWdlZEluKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWTV9GTE9BVCoqIHBUb1Byb2Nlc3MsIExWTV9GTE9BVCoqIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2KiBwTnVtU2FtcGxlcykgeworICAgIExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKIAogICAgIC8qCiAgICAgICogQ2hlY2sgaWYgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCBvZiBhIGJsb2NrCiAgICAgICovCi0gICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9PSAwKQotICAgIHsKLSAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7ICAgIC8qIEdldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBmaXJzdCBjYWxsICovCi0gICAgICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyAgICA9ICpwVG9Qcm9jZXNzOyAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIEkvTyBwb2ludGVycyAqLwotICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzICAgID0gKnBQcm9jZXNzZWQ7CisgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9PSAwKSB7CisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IChMVk1fSU5UMTYpKnBOdW1TYW1wbGVzOyAvKiBHZXQgdGhlIG51bWJlciBvZiBzYW1wbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gZmlyc3QgY2FsbCAqLworICAgICAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgPSAqcFRvUHJvY2VzczsgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBJL08gcG9pbnRlcnMgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyA9ICpwUHJvY2Vzc2VkOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0ZSBibG9jayBzaXplIHRvIHByb2Nlc3MKICAgICAgICAgICovCi0gICAgICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPiBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplKQotICAgICAgICB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPiBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplKSB7CiAgICAgICAgICAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOwogICAgICAgICB9CiAgICAgfQpAQCAtMzI5LDMyICsyOTksMTcgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZNX0J1ZmZlckluKExWTV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgKipwVG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgKipwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKQotewotCi0gICAgTFZNX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Cit2b2lkIExWTV9CdWZmZXJJbihMVk1fSGFuZGxlX3QgaEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHBJbkRhdGEsIExWTV9GTE9BVCoqIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqKiBwUHJvY2Vzc2VkLCBMVk1fVUlOVDE2KiBwTnVtU2FtcGxlcykgeworICAgIExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKIAogICAgIC8qCiAgICAgICogQ2hlY2sgd2hpY2ggbW9kZSwgbWFuYWdlZCBvciB1bm1hbmFnZWQKICAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlLT5JbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKLSAgICB7Ci0gICAgICAgIExWTV9CdWZmZXJNYW5hZ2VkSW4oaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1TYW1wbGVzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTFZNX0J1ZmZlclVubWFuYWdlZEluKGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOworICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKSB7CisgICAgICAgIExWTV9CdWZmZXJNYW5hZ2VkSW4oaEluc3RhbmNlLCBwSW5EYXRhLCBwVG9Qcm9jZXNzLCBwUHJvY2Vzc2VkLCBwTnVtU2FtcGxlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTFZNX0J1ZmZlclVubWFuYWdlZEluKGhJbnN0YW5jZSwgcFRvUHJvY2VzcywgcFByb2Nlc3NlZCwgcE51bVNhbXBsZXMpOwogICAgIH0KIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzc3LDE5NiArMzMyLDEyNCBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVk1fQnVmZmVyTWFuYWdlZE91dChMVk1fSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAqcE51bVNhbXBsZXMpCi17Ci0KLSAgICBMVk1fSW5zdGFuY2VfdCAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9CdWZmZXJfdCAgICAqcEJ1ZmZlciAgICA9IHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQ7Ci0gICAgTFZNX0lOVDE2ICAgICAgIFNhbXBsZUNvdW50ID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7Ci0gICAgTFZNX0lOVDE2ICAgICAgIE51bVNhbXBsZXM7Ci0gICAgTFZNX0ZMT0FUICAgICAgICpwU3RhcnQ7Ci0gICAgTFZNX0ZMT0FUICAgICAgICpwRGVzdDsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX0lOVDMyICAgICAgIE5yQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7Cit2b2lkIExWTV9CdWZmZXJNYW5hZ2VkT3V0KExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWTV9GTE9BVCogcE91dERhdGEsIExWTV9VSU5UMTYqIHBOdW1TYW1wbGVzKSB7CisgICAgTFZNX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCopaEluc3RhbmNlOworICAgIExWTV9CdWZmZXJfdCogcEJ1ZmZlciA9IHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQ7CisgICAgTFZNX0lOVDE2IFNhbXBsZUNvdW50ID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7CisgICAgTFZNX0lOVDE2IE51bVNhbXBsZXM7CisgICAgTFZNX0ZMT0FUKiBwU3RhcnQ7CisgICAgTFZNX0ZMT0FUKiBwRGVzdDsKKyAgICBMVk1fSU5UMzIgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKICNkZWZpbmUgTnJGcmFtZXMgTnVtU2FtcGxlcyAgLy8gYWxpYXMgZm9yIGNsYXJpdHkKICNkZWZpbmUgRnJhbWVDb3VudCBTYW1wbGVDb3VudAotI2VuZGlmCiAKICAgICAvKgogICAgICAqIFNldCB0aGUgcG9pbnRlcnMKICAgICAgKi8KICAgICBOdW1TYW1wbGVzID0gcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0OwotICAgIHBTdGFydCAgICAgPSBwQnVmZmVyLT5wU2NyYXRjaDsKKyAgICBwU3RhcnQgPSBwQnVmZmVyLT5wU2NyYXRjaDsKIAogICAgIC8qCiAgICAgICogY2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgb2YgYSBibG9jawotICAgICAgKi8KLSAgICBpZiAoKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVENBTEwpIHx8Ci0gICAgICAgIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkpCi0gICAgeworICAgICAqLworICAgIGlmICgocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUQ0FMTCkgfHwgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVExBU1RDQUxMKSkgewogICAgICAgICAvKiBGaXJzdCBjYWxsIGZvciBhIG5ldyBibG9jayAqLwotICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gcE91dERhdGE7ICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIHRoZSBkZXN0aW5hdGlvbiAqLworICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gcE91dERhdGE7IC8qIEluaXRpYWxpc2UgdGhlIGRlc3RpbmF0aW9uICovCiAgICAgfQotICAgIHBEZXN0ID0gcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIG91dHB1dCBhZGRyZXNzICovCisgICAgcERlc3QgPSBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzOyAvKiBTZXQgdGhlIG91dHB1dCBhZGRyZXNzICovCiAKICAgICAvKgogICAgICAqIElmIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub24temVybyB0aGVuIHRoZXJlIGFyZSBzdGlsbCBzYW1wbGVzIHRvIHNlbmQgdG8KICAgICAgKiB0aGUgb3V0cHV0IGJ1ZmZlcgogICAgICAqLwotICAgIGlmICgoTnVtU2FtcGxlcyAhPSAwKSAmJgotICAgICAgICAocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzICE9IDApKQotICAgIHsKKyAgICBpZiAoKE51bVNhbXBsZXMgIT0gMCkgJiYgKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyAhPSAwKSkgewogICAgICAgICAvKgogICAgICAgICAgKiBDb3B5IHRoZSBkZWxheWVkIG91dHB1dCBidWZmZXIgc2FtcGxlcyB0byB0aGUgb3V0cHV0CiAgICAgICAgICAqLwotICAgICAgICBpZiAocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzIDw9IE51bVNhbXBsZXMpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA8PSBOdW1TYW1wbGVzKSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQ29weSBhbGwgb3V0cHV0IGRlbGF5IHNhbXBsZXMgdG8gdGhlIG91dHB1dAogICAgICAgICAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwotICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOwotI2Vsc2UKLSAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7IC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCi0jZW5kaWYKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cwogICAgICAgICAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICAgICAgcERlc3QgKz0gTnJDaGFubmVscyAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCi0jZWxzZQotICAgICAgICAgICAgcERlc3QgKz0gMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCi0jZW5kaWYKICAgICAgICAgICAgIE51bVNhbXBsZXMgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKTsgLyogU2FtcGxlcyBsZWZ0IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2VuZCAqLwogICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gMDsgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDb3B5IG9ubHkgc29tZSBvZiB0aGUgb3VwdXQgZGVsYXkgc2FtcGxlcyB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgKiBDb3B5IG9ubHkgc29tZSBvZiB0aGUgb3V0cHV0IGRlbGF5IHNhbXBsZXMgdG8gdGhlIG91dHB1dAogICAgICAgICAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwotICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIE5yRnJhbWVzKSk7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCi0jZWxzZQotICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KLSNlbmRpZgorICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogTnJGcmFtZXMpKTsgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cwogICAgICAgICAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICAgICAgcERlc3QgKz0gTnJDaGFubmVscyAqIE5yRnJhbWVzOyAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KLSNlbHNlCi0gICAgICAgICAgICBwRGVzdCArPSAyICogTnVtU2FtcGxlczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCi0jZW5kaWYKICAgICAgICAgICAgIC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCiAgICAgICAgICAgICBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgLSBOdW1TYW1wbGVzKTsKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFJlYWxpZ24gdGhlIGRlbGF5IGJ1ZmZlciBkYXRhIHRvIGF2b2lkIHVzaW5nIGNpcmN1bGFyIGJ1ZmZlciBtYW5hZ2VtZW50CiAgICAgICAgICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlcltOckNoYW5uZWxzICogTnJGcmFtZXNdLCAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbTnJDaGFubmVscyAqIE5yRnJhbWVzXSwgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBtb3ZlICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsKLSNlbHNlCi0gICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclsyICogTnVtU2FtcGxlc10sICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gbW92ZSAqLwotI2VuZGlmCi0gICAgICAgICAgICBOdW1TYW1wbGVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZXMgbGVmdCB0byBzZW5kICovCisgICAgICAgICAgICBOdW1TYW1wbGVzID0gMDsgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KICAgICAgICAgfQogICAgIH0KIAogICAgIC8qCiAgICAgICogQ29weSB0aGUgcHJvY2Vzc2VkIHJlc3VsdHMgdG8gdGhlIG91dHB1dAogICAgICAqLwotICAgIGlmICgoTnVtU2FtcGxlcyAhPSAwKSAmJgotICAgICAgICAoU2FtcGxlQ291bnQgIT0gMCkpCi0gICAgewotICAgICAgICBpZiAoU2FtcGxlQ291bnQgPD0gTnVtU2FtcGxlcykKLSAgICAgICAgeworICAgIGlmICgoTnVtU2FtcGxlcyAhPSAwKSAmJiAoU2FtcGxlQ291bnQgIT0gMCkpIHsKKyAgICAgICAgaWYgKFNhbXBsZUNvdW50IDw9IE51bVNhbXBsZXMpIHsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb3B5IGFsbCBwcm9jZXNzZWQgc2FtcGxlcyB0byB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIEZyYW1lQ291bnQpKTsgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCi0jZWxzZQotICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7IC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLwotI2VuZGlmCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVyIGFuZCBzYW1wbGUgY291bnRzCiAgICAgICAgICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICBwRGVzdCAgICAgICs9IE5yQ2hhbm5lbHMgKiBGcmFtZUNvdW50OyAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCi0jZWxzZQotICAgICAgICAgICAgcERlc3QgICAgICArPSAyICogU2FtcGxlQ291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KLSNlbmRpZgotICAgICAgICAgICAgTnVtU2FtcGxlcyAgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gU2FtcGxlQ291bnQpOyAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLwotICAgICAgICAgICAgU2FtcGxlQ291bnQgPSAwOyAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICAgICAgcERlc3QgKz0gTnJDaGFubmVscyAqIEZyYW1lQ291bnQ7ICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgLSBTYW1wbGVDb3VudCk7IC8qIFNhbXBsZXMgbGVmdCB0byBzZW5kICovCisgICAgICAgICAgICBTYW1wbGVDb3VudCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb3B5IG9ubHkgc29tZSBwcm9jZXNzZWQgc2FtcGxlcyB0byB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogTnJGcmFtZXMpKTsgIC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLwotI2Vsc2UKLSAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KLSNlbmRpZgorICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogTnJGcmFtZXMpKTsgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVycyBhbmQgc2FtcGxlIGNvdW50cwotICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICBwU3RhcnQgICAgICArPSBOckNoYW5uZWxzICogTnJGcmFtZXM7ICAgICAgICAgICAgICAgLyogUHJvY2Vzc2VkIHNhbXBsZSBwb2ludGVyICovCi0gICAgICAgICAgICBwRGVzdCAgICAgICArPSBOckNoYW5uZWxzICogTnJGcmFtZXM7ICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCi0jZWxzZQotICAgICAgICAgICAgcFN0YXJ0ICAgICAgKz0gMiAqIE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvY2Vzc2VkIHNhbXBsZSBwb2ludGVyICovCi0gICAgICAgICAgICBwRGVzdCAgICAgICArPSAyICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KLSNlbmRpZgotICAgICAgICAgICAgU2FtcGxlQ291bnQgID0gKExWTV9JTlQxNikoU2FtcGxlQ291bnQgLSBOdW1TYW1wbGVzKTsgLyogUHJvY2Vzc2VkIHNhbXBsZXMgbGVmdCAqLwotICAgICAgICAgICAgTnVtU2FtcGxlcyAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIHNhbXBsZSBjb3VudCAqLworICAgICAgICAgICAgICovCisgICAgICAgICAgICBwU3RhcnQgKz0gTnJDaGFubmVscyAqIE5yRnJhbWVzOyAgICAgICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NlZCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgcERlc3QgKz0gTnJDaGFubmVscyAqIE5yRnJhbWVzOyAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIFNhbXBsZUNvdW50ID0gKExWTV9JTlQxNikoU2FtcGxlQ291bnQgLSBOdW1TYW1wbGVzKTsgLyogUHJvY2Vzc2VkIHNhbXBsZXMgbGVmdCAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgc2FtcGxlIGNvdW50ICovCiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKgogICAgICAqIENvcHkgdGhlIHJlbWFpbmluZyBwcm9jZXNzZWQgZGF0YSB0byB0aGUgb3V0cHV0IGRlbGF5IGJ1ZmZlcgogICAgICAqLwotICAgIGlmIChTYW1wbGVDb3VudCAhPSAwKQotICAgIHsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICBpZiAoU2FtcGxlQ291bnQgIT0gMCkgeworICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgLyogU291cmNlICovCiAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbTnJDaGFubmVscyAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlc10sCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIEZyYW1lQ291bnQpKTsgICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KLSNlbHNlCi0gICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlc10sIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCi0jZW5kaWYKKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogRnJhbWVDb3VudCkpOyAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KICAgICAgICAgLyogVXBkYXRlIHRoZSBidWZmZXIgY291bnQgKi8KICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gKExWTV9JTlQxNikocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzICsgU2FtcGxlQ291bnQpOwogICAgIH0KQEAgLTU3NCwxMCArNDU3LDEwIEBACiAgICAgLyoKICAgICAgKiBwb2ludGVycywgY291bnRzIGFuZCBzZXQgZGVmYXVsdCBidWZmZXIgcHJvY2Vzc2luZwogICAgICAqLwotICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCAgPSBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLwotICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgPSBwRGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KLSAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSAgICAgID0gTFZNX01BWEJMT0NLQ0FMTDsgICAgICAgICAgICAgICAgICAgLyogU2V0IGZvciB0aGUgZGVmYXVsdCBjYWxsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBzaXplICovCisgICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ID0gTnVtU2FtcGxlczsgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLworICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgPSBwRGVzdDsgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgPSBMVk1fTUFYQkxPQ0tDQUxMOyAvKiBTZXQgZm9yIHRoZSBkZWZhdWx0IGNhbGwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBzaXplICovCiAgICAgLyogVGhpcyB3aWxsIHRlcm1pbmF0ZSB0aGUgbG9vcCB3aGVuIGFsbCBzYW1wbGVzIHByb2Nlc3NlZCAqLwogICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsKIH0KQEAgLTYwMSw0NCArNDg0LDI3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIExWTV9CdWZmZXJVbm1hbmFnZWRPdXQoTFZNX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAqcE51bVNhbXBsZXMpCi17Ci0KLSAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKLSAgICBpZiAoTnVtQ2hhbm5lbHMgPT0gMSkKLSAgICB7Ci0gICAgICAgIC8qIE1vbm8gaW5wdXQgaXMgcHJvY2Vzc2VkIGFzIHN0ZXJlbyBieSBMVk0gbW9kdWxlICovCi0gICAgICAgIE51bUNoYW5uZWxzID0gMjsKLSAgICB9Cit2b2lkIExWTV9CdWZmZXJVbm1hbmFnZWRPdXQoTFZNX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZNX1VJTlQxNiogcE51bVNhbXBsZXMpIHsKKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgTFZNX0lOVDE2IE51bUNoYW5uZWxzID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOwogI3VuZGVmIE5yRnJhbWVzCi0jZGVmaW5lIE5yRnJhbWVzICgqcE51bVNhbXBsZXMpIC8vIGFsaWFzIGZvciBjbGFyaXR5Ci0jZWxzZQotICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMgPSAyOwotI2VuZGlmCisjZGVmaW5lIE5yRnJhbWVzICgqcE51bVNhbXBsZXMpICAvLyBhbGlhcyBmb3IgY2xhcml0eQogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgc2FtcGxlIGNvdW50cwogICAgICAqLwotICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyAgICArPSAoTFZNX0lOVDE2KSgqcE51bVNhbXBsZXMgKiBOdW1DaGFubmVscyk7IC8qIFVwZGF0ZSB0aGUgSS9PIHBvaW50ZXJzICovCi0jaWZkZWYgU1VQUE9SVF9NQwotICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgICArPSAoTFZNX0lOVDE2KShOckZyYW1lcyAqIE51bUNoYW5uZWxzKTsKLSNlbHNlCi0gICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyAgICs9IChMVk1fSU5UMTYpKCpwTnVtU2FtcGxlcyAqIDIpOwotI2VuZGlmCi0gICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzICA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAtICpwTnVtU2FtcGxlcyk7IC8qIFVwZGF0ZSB0aGUgc2FtcGxlIGNvdW50ICovCisgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICs9CisgICAgICAgICAgICAoTFZNX0lOVDE2KSgqcE51bVNhbXBsZXMgKiBOdW1DaGFubmVscyk7IC8qIFVwZGF0ZSB0aGUgSS9PIHBvaW50ZXJzICovCisgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyArPSAoTFZNX0lOVDE2KShOckZyYW1lcyAqIE51bUNoYW5uZWxzKTsKKyAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPQorICAgICAgICAgICAgKExWTV9JTlQxNikocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzIC0gKnBOdW1TYW1wbGVzKTsgLyogVXBkYXRlIHRoZSBzYW1wbGUgY291bnQgKi8KIAogICAgIC8qCiAgICAgICogU2V0IHRlIGJsb2NrIHNpemUgdG8gcHJvY2VzcwogICAgICAqLwotICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPiBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplKQotICAgIHsKKyAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID4gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZSkgewogICAgICAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOwotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsKICAgICB9CiB9CkBAIC02OTgsMjUgKzU2NCwxNSBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVk1fQnVmZmVyT3V0KExWTV9IYW5kbGVfdCAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgKnBOdW1TYW1wbGVzKQotewotCi0gICAgTFZNX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwordm9pZCBMVk1fQnVmZmVyT3V0KExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWTV9GTE9BVCogcE91dERhdGEsIExWTV9VSU5UMTYqIHBOdW1TYW1wbGVzKSB7CisgICAgTFZNX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCopaEluc3RhbmNlOwogCiAgICAgLyoKICAgICAgKiBDaGVjayB3aGljaCBtb2RlLCBtYW5hZ2VkIG9yIHVubWFuYWdlZAogICAgICAqLwotICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQotICAgIHsKLSAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRPdXQoaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBMVk1fQnVmZmVyVW5tYW5hZ2VkT3V0KGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CisgICAgaWYgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpIHsKKyAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRPdXQoaEluc3RhbmNlLCBwT3V0RGF0YSwgcE51bVNhbXBsZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIExWTV9CdWZmZXJVbm1hbmFnZWRPdXQoaEluc3RhbmNlLCBwTnVtU2FtcGxlcyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oCmluZGV4IDgxMmY4ZTUuLmMwMmNhYTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKQEAgLTI0LDgzMiArMjQsODMyIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBUcmVibGVCb29zdENvcm5lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDAwCi0jZGVmaW5lIFRyZWJsZUJvb3N0TWluUmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgVHJlYmxlQm9vc3RTdGVwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBUcmVibGVCb29zdENvcm5lciA4MDAwCisjZGVmaW5lIFRyZWJsZUJvb3N0TWluUmF0ZSA0CisjZGVmaW5lIFRyZWJsZUJvb3N0U3RlcHMgMTUKIAogLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAyMjA1MEh6ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wMzg0MzQKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMzE1OTkKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA4MTU1NwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI4ODQ3NQotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTI5OTQzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjQwMDkwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xODQyMzIKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODU4MDEKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI0NTE0NQotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNDg4NwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzEzNDkxCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDU2NTQxCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zOTAxNzcKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAyMDE0NCkKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ3NjIxOQotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMTA2MTg3KQotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTcyNzYxCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMDI3MjgpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjgxMDgyCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4zMTEwNDkpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuODAyNjIwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC40MzI1ODgpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTM4OTg5Ci0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41Njg5NTYpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDkxOTk3Ci0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43MjE5NjQpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMjYzNjc0Ci0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC44OTM2NDEpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNDU2MzAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4wODYyNjcpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0EwIDEuMDM4NDM0CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0ExIDAuMzMxNTk5CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0EwIDEuMDgxNTU3CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0ExIDAuMjg4NDc1CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0EwIDEuMTI5OTQzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0ExIDAuMjQwMDkwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0EwIDEuMTg0MjMyCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0ExIDAuMTg1ODAxCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0EwIDEuMjQ1MTQ1CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0ExIDAuMTI0ODg3CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0EwIDEuMzEzNDkxCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0ExIDAuMDU2NTQxCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0EwIDEuMzkwMTc3CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0ExICgtMC4wMjAxNDQpCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0EwIDEuNDc2MjE5CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0ExICgtMC4xMDYxODcpCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0EwIDEuNTcyNzYxCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0ExICgtMC4yMDI3MjgpCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTAgMS42ODEwODIKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0ExICgtMC4zMTEwNDkpCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQjEgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQTAgMS44MDI2MjAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0ExICgtMC40MzI1ODgpCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQjEgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQTAgMS45Mzg5ODkKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX0ExICgtMC41Njg5NTYpCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQjEgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTAgMi4wOTE5OTcKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0ExICgtMC43MjE5NjQpCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQjEgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQTAgMi4yNjM2NzQKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0ExICgtMC44OTM2NDEpCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQjEgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQTAgMi40NTYzMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X0ExICgtMS4wODYyNjcpCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQjEgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X0IyIDAuMDAwMDAwCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDI0MDAwSHogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA0NDY2MgotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjIyMzI4NwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDk0NzczCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTczMTc2Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xNTA5OTkKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMTY5NTAKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIxNDA4NgotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA1Mzg2MwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjg0ODcwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMTY5MjEpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM2NDI5MQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wOTYzNDIpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NTM0MDMKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjE4NTQ1NCkKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjU1MzM4OQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjg1NDQwKQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjY1NTc0Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4zOTc2MjUpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzkxNDQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41MjM0OTkpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTMyNjgyCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42NjQ3MzMpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDkxMTQ4Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC44MjMxOTkpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMjY4OTUwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4wMDEwMDEpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNDY4NDQ3Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4yMDA0OTgpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNjkyMjg3Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS40MjQzMzgpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0EwIDEuMDQ0NjYyCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0ExIDAuMjIzMjg3CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0EwIDEuMDk0NzczCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0ExIDAuMTczMTc2CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0EwIDEuMTUwOTk5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0ExIDAuMTE2OTUwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0EwIDEuMjE0MDg2CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0ExIDAuMDUzODYzCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0EwIDEuMjg0ODcwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0ExICgtMC4wMTY5MjEpCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0EwIDEuMzY0MjkxCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0ExICgtMC4wOTYzNDIpCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0EwIDEuNDUzNDAzCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0ExICgtMC4xODU0NTQpCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0EwIDEuNTUzMzg5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0ExICgtMC4yODU0NDApCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0EwIDEuNjY1NTc0CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0ExICgtMC4zOTc2MjUpCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQTAgMS43OTE0NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0ExICgtMC41MjM0OTkpCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQjEgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTAgMS45MzI2ODIKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0ExICgtMC42NjQ3MzMpCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQjEgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQTAgMi4wOTExNDgKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0ExICgtMC44MjMxOTkpCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQjEgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQTAgMi4yNjg5NTAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0ExICgtMS4wMDEwMDEpCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQjEgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTAgMi40Njg0NDcKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0ExICgtMS4yMDA0OTgpCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQjEgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQTAgMi42OTIyODcKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0ExICgtMS40MjQzMzgpCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQjEgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0IyIDAuMDAwMDAwCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDMyMDAwSHogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA2MTAwOQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDYxMDA5KQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEyOTQ2MwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjEyOTQ2MykKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMDYyNjcKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMDYyNjcpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yOTI0NDcKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI5MjQ0NykKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM4OTE0MAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzg5MTQwKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ5NzYzMQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjQ5NzYzMSkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MTkzNjEKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42MTkzNjEpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzU1OTQzCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzU1OTQzKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjkwOTE5MQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjkwOTE5MSkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDgxMTM5Ci0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMDgxMTM5KQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjI3NDA2NwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMjc0MDY3KQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNDkwNTM2Ci0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjQ5MDUzNikKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi43MzM0MTgKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjczMzQxOCkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4wMDU5MzYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjAwNTkzNikKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjMxMTcwNwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4zMTE3MDcpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0EwIDEuMDYxMDA5CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0ExICgtMC4wNjEwMDkpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0EwIDEuMTI5NDYzCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0ExICgtMC4xMjk0NjMpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0EwIDEuMjA2MjY3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0ExICgtMC4yMDYyNjcpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0EwIDEuMjkyNDQ3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0ExICgtMC4yOTI0NDcpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0EwIDEuMzg5MTQwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0ExICgtMC4zODkxNDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0EwIDEuNDk3NjMxCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0ExICgtMC40OTc2MzEpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0EwIDEuNjE5MzYxCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0ExICgtMC42MTkzNjEpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0EwIDEuNzU1OTQzCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0ExICgtMC43NTU5NDMpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0EwIDEuOTA5MTkxCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0ExICgtMC45MDkxOTEpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQTAgMi4wODExMzkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0ExICgtMS4wODExMzkpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQjEgKC0wLjAwMDAwMCkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTAgMi4yNzQwNjcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0ExICgtMS4yNzQwNjcpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQjEgKC0wLjAwMDAwMCkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQTAgMi40OTA1MzYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0ExICgtMS40OTA1MzYpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQjEgKC0wLjAwMDAwMCkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQTAgMi43MzM0MTgKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0ExICgtMS43MzM0MTgpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQjEgKC0wLjAwMDAwMCkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQTAgMy4wMDU5MzYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0ExICgtMi4wMDU5MzYpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQjEgKC0wLjAwMDAwMCkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQTAgMy4zMTE3MDcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0ExICgtMi4zMTE3MDcpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQjEgKC0wLjAwMDAwMCkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0IyIDAuMDAwMDAwCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDQ0MTAwSHogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA3NDM2NAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjkzMjU3KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE4ODk0KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTU3ODAxCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4zNzY2OTUpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI1MTQyMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC40NzAzMTMpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE4ODk0KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNTY0NjEKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NTM1NSkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ3NDMyMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjkzMjEzKQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE4ODk0KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MDY1NTkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODI1NDUzKQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43NTQ5MzUKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTczODI4KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTIxNDE0Ci0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4xNDAzMDgpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xMDgyMDgKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjMyNzEwMSkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjMxNzc5MwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS41MzY2ODcpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE4ODk0KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi41NTI5NTIKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNzcxODQ2KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuODE2ODA1Ci0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjAzNTY5OCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4xMTI4NTIKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjMzMTc0NikKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjQ0NTAyMwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi42NjM5MTYpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE4ODk0KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy44MTc3MjQKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuMDM2NjE4KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMCAxLjA3NDM2NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMSAoLTAuMjkzMjU3KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9BMCAxLjE1NzgwMQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9BMSAoLTAuMzc2Njk1KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19BMCAxLjI1MTQyMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19BMSAoLTAuNDcwMzEzKQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9BMCAxLjM1NjQ2MQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9BMSAoLTAuNTc1MzU1KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9BMCAxLjQ3NDMyMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9BMSAoLTAuNjkzMjEzKQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMCAxLjYwNjU1OQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMSAoLTAuODI1NDUzKQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMCAxLjc1NDkzNQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMSAoLTAuOTczODI4KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9BMCAxLjkyMTQxNAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9BMSAoLTEuMTQwMzA4KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9BMCAyLjEwODIwOAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9BMSAoLTEuMzI3MTAxKQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0EwIDIuMzE3NzkzCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9BMSAoLTEuNTM2Njg3KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0IxICgtMC4yMTg4OTQpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0EwIDIuNTUyOTUyCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9BMSAoLTEuNzcxODQ2KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0IxICgtMC4yMTg4OTQpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0EwIDIuODE2ODA1CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9BMSAoLTIuMDM1Njk4KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0IxICgtMC4yMTg4OTQpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0EwIDMuMTEyODUyCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19BMSAoLTIuMzMxNzQ2KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0IxICgtMC4yMTg4OTQpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0EwIDMuNDQ1MDIzCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9BMSAoLTIuNjYzOTE2KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0IxICgtMC4yMTg4OTQpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0EwIDMuODE3NzI0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMSAoLTMuMDM2NjE4KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0IxICgtMC4yMTg4OTQpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9CMiAwLjAwMDAwMAogLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA0ODAwMEh6ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDc3MzU3Ci0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzQ1MzA2KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjE2NDE1MgotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjQzMjEwMSkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yNjE1MzgKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41Mjk0ODgpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM3MDgwNwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42Mzg3NTcpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ5MzQwOQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjEzNTkpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MzA5NzEKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjg5ODkyMCkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc4NTMxOAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMDUzMjY3KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS45NTg0OTgKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMjI2NDQ3KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjE1MjgwOQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjQyMDc1OCkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDIuMzcwODI5Ci0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNjM4Nzc4KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNjE1NDUyCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjg4MzQwMSkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjg4OTkyNAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4xNTc4NzMpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMTk3ODg2Ci0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi40NjU4MzUpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy41NDM0MjUKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuODExMzc0KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMy45MzExMjcKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICgtMy4xOTkwNzYpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0EwIDEuMDc3MzU3CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0ExICgtMC4zNDUzMDYpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0EwIDEuMTY0MTUyCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0ExICgtMC40MzIxMDEpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0EwIDEuMjYxNTM4CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0ExICgtMC41Mjk0ODgpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0EwIDEuMzcwODA3CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0ExICgtMC42Mzg3NTcpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0EwIDEuNDkzNDA5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0ExICgtMC43NjEzNTkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0EwIDEuNjMwOTcxCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0ExICgtMC44OTg5MjApCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0EwIDEuNzg1MzE4CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0ExICgtMS4wNTMyNjcpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0EwIDEuOTU4NDk4CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0ExICgtMS4yMjY0NDcpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0EwIDIuMTUyODA5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0ExICgtMS40MjA3NTgpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQTAgMi4zNzA4MjkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0ExICgtMS42Mzg3NzgpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQjEgKC0wLjI2Nzk0OSkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQTAgMi42MTU0NTIKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0ExICgtMS44ODM0MDEpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQjEgKC0wLjI2Nzk0OSkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQTAgMi44ODk5MjQKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0ExICgtMi4xNTc4NzMpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQjEgKC0wLjI2Nzk0OSkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQTAgMy4xOTc4ODYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0ExICgtMi40NjU4MzUpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQjEgKC0wLjI2Nzk0OSkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTAgMy41NDM0MjUKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0ExICgtMi44MTEzNzQpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQjEgKC0wLjI2Nzk0OSkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQTAgMy45MzExMjcKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0ExICgtMy4xOTkwNzYpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQjEgKC0wLjI2Nzk0OSkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IyIDAuMDAwMDAwCiAKIC8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgODgyMDAgKi8KIC8qIEdhaW4gPSAxLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wOTQzNzRmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjQxMjU2ZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQTAgMS4wOTQzNzRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0ExICgtMC42NDEyNTZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9BMiAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQjEgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIwMDI2NGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDcxNDZmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9BMCAxLjIwMDI2NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQTEgKC0wLjc0NzE0NmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9CMSAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQjIgMC4wMDAwMDBmCiAvKiBHYWluID0gMy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzE5MDc0ZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjg2NTk1NmYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0EwIDEuMzE5MDc0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19BMSAoLTAuODY1OTU2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0IxICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSA0LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NTIzODBmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTk5MjYzZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQTAgMS40NTIzODBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0ExICgtMC45OTkyNjNmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9BMiAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQjEgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDUuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjYwMTk1M2YKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4xNDg4MzZmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9BMCAxLjYwMTk1M2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQTEgKC0xLjE0ODgzNmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9CMSAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQjIgMC4wMDAwMDBmCiAvKiBHYWluID0gNi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzY5Nzc3ZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjMxNjY1OWYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0EwIDEuNzY5Nzc3ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9BMSAoLTEuMzE2NjU5ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0IxICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSA3LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS45NTgwNzhmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNTA0OTYwZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQTAgMS45NTgwNzhmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0ExICgtMS41MDQ5NjBmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19BMiAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQjEgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDguMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjE2OTM1NWYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS43MTYyMzhmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9BMCAyLjE2OTM1NWYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQTEgKC0xLjcxNjIzOGYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9CMSAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQjIgMC4wMDAwMDBmCiAvKiBHYWluID0gOS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNDA2NDEyZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1MzI5NWYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0EwIDIuNDA2NDEyZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9BMSAoLTEuOTUzMjk1ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0IxICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSAxMC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjY3MjM5NWYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMjE5Mjc3ZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0EwIDIuNjcyMzk1ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQTEgKC0yLjIxOTI3N2YpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMF9BMiAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0IxICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQjIgMC4wMDAwMDBmCiAvKiBHYWluID0gMTEuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi45NzA4MzJmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjUxNzcxNGYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMV9BMCAyLjk3MDgzMmYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0ExICgtMi41MTc3MTRmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMV9CMSAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDEyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMzA1Njg0ZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi44NTI1NjZmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQTAgMy4zMDU2ODRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMl9BMSAoLTIuODUyNTY2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQjEgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMl9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSAxMy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjY4MTM5NGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuMjI4Mjc2ZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0EwIDMuNjgxMzk0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQTEgKC0zLjIyODI3NmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xM19BMiAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0IxICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQjIgMC4wMDAwMDBmCiAvKiBHYWluID0gMTQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNC4xMDI5NDdmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjY0OTgzMGYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNF9BMCA0LjEwMjk0N2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0ExICgtMy42NDk4MzBmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNF9CMSAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDE1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNTc1OTM4ZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtNC4xMjI4MjBmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQTAgNC41NzU5MzhmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNV9BMSAoLTQuMTIyODIwZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQjEgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNV9CMiAwLjAwMDAwMGYKIAogLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA5NjAwMEh6ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDk2MjMzCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjczNTgzKQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIwNDIwOAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc4MTU1OCkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zMjUzNTgKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC45MDI3MDgpCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ2MTI5MQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4wMzg2NDEpCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjYxMzgxMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4xOTExNjApCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43ODQ5MzkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjM2MjI4OSkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTc2OTQ5Ci0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS41NTQyOTkpCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjE5MjM4NwotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS43Njk3MzgpCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi40MzQxMTMKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4wMTE0NjQpCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAyLjcwNTMzNQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMjgyNjg1KQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMDA5NjUwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjU4NzAwMCkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4zNTEwOTcKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuOTI4NDQ3KQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNzM0MjA3Ci0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy4zMTE1NTgpCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICA0LjE2NDA2NAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjc0MTQxNCkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDQuNjQ2MzcxCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTQuMjIzNzIxKQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9BMCAxLjA5NjIzMworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9BMSAoLTAuNjczNTgzKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9BMCAxLjIwNDIwOAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9BMSAoLTAuNzgxNTU4KQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19BMCAxLjMyNTM1OAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19BMSAoLTAuOTAyNzA4KQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9BMCAxLjQ2MTI5MQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9BMSAoLTEuMDM4NjQxKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9BMCAxLjYxMzgxMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9BMSAoLTEuMTkxMTYwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9BMCAxLjc4NDkzOQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9BMSAoLTEuMzYyMjg5KQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19BMCAxLjk3Njk0OQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19BMSAoLTEuNTU0Mjk5KQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9BMCAyLjE5MjM4NworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9BMSAoLTEuNzY5NzM4KQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9BMCAyLjQzNDExMworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9BMSAoLTIuMDExNDY0KQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0EwIDIuNzA1MzM1CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9BMSAoLTIuMjgyNjg1KQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0IxICgtMC41NzczNTApCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0EwIDMuMDA5NjUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9BMSAoLTIuNTg3MDAwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0IxICgtMC41NzczNTApCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0EwIDMuMzUxMDk3CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9BMSAoLTIuOTI4NDQ3KQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTJfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0IxICgtMC41NzczNTApCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEzX0EwIDMuNzM0MjA3CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19BMSAoLTMuMzExNTU4KQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEzX0IxICgtMC41NzczNTApCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0EwIDQuMTY0MDY0CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9BMSAoLTMuNzQxNDE0KQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0IxICgtMC41NzczNTApCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0EwIDQuNjQ2MzcxCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9BMSAoLTQuMjIzNzIxKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0IxICgtMC41NzczNTApCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9CMiAwLjAwMDAwMAogCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDE3NjQwMCAqLwogLyogR2FpbiA9IDEuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMDY3MTFmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjg1NTgwN2YpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9BMCAxLjEwNjcxMWYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0ExICgtMC44NTU4MDdmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjFfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMjY0NDNmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjk3NTUzOWYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMl9BMCAxLjIyNjQ0M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0ExICgtMC45NzU1MzlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMl9CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNjA3ODRmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjEwOTg4MGYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19BMCAxLjM2MDc4NGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4zX0ExICgtMS4xMDk4ODBmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4zX0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS41MTE1MTdmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjI2MDYxM2YpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9BMCAxLjUxMTUxN2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0ExICgtMS4yNjA2MTNmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjRfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDUuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS42ODA2NDNmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjQyOTczOWYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNV9BMCAxLjY4MDY0M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0ExICgtMS40Mjk3MzlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNV9CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDYuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS44NzA0MDVmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjYxOTUwMWYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9BMCAxLjg3MDQwNWYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW42X0ExICgtMS42MTk1MDFmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW42X0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDcuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wODMzMjFmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjgzMjQxN2YpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19BMCAyLjA4MzMyMWYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0ExICgtMS44MzI0MTdmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjdfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDguMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4zMjIyMTdmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjA3MTMxM2YpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOF9BMCAyLjMyMjIxN2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0ExICgtMi4wNzEzMTNmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOF9CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDkuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi41OTAyNjNmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjMzOTM1OWYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9BMCAyLjU5MDI2M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW45X0ExICgtMi4zMzkzNTlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW45X0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDEwLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjg5MTAxNmYKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjY0MDExMmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQTAgMi44OTEwMTZmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQTEgKC0yLjY0MDExMmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQjEgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQjIgMC4wMDAwMDBmCiAvKiBHYWluID0gMTEuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMjI4NDY1ZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuOTc3NTYxZikKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9BMCAzLjIyODQ2NWYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9BMSAoLTIuOTc3NTYxZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9BMiAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSAxMi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy42MDcwOTBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy4zNTYxODZmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0EwIDMuNjA3MDkwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0ExICgtMy4zNTYxODZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0IxICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDEzLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICA0LjAzMTkxNGYKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjc4MTAxMGYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQTAgNC4wMzE5MTRmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQTEgKC0zLjc4MTAxMGYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQjEgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQjIgMC4wMDAwMDBmCiAvKiBHYWluID0gMTQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNTA4NTc1ZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTQuMjU3NjcxZikKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9BMCA0LjUwODU3NWYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9BMSAoLTQuMjU3NjcxZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9BMiAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSAxNS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNS4wNDMzOTdmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtNC43OTI0OTNmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0EwIDUuMDQzMzk3ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0ExICgtNC43OTI0OTNmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0IxICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0IyIDAuMDAwMDAwZgogCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDE5MjAwMEh6ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMDc4MjMKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODc1MTUwKQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc2NzMyNykKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjI4ODAzCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjk5NjEzMCkKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNjQ1NDQKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMTMxODcxKQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc2NzMyNykKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjUxNjg0OQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4yODQxNzYpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjY4NzczNwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNDU1MDY0KQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuODc5NDc3Ci0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNjQ2ODA0KQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjA5NDYxMwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjg2MTk0MCkKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMzM1OTk5Ci0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4xMDMzMjYpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNjA2ODM5Ci0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjM3NDE2NikKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDIuOTEwNzI2Ci0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAoLTIuNjc4MDUzKQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc2NzMyNykKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4yNTE2OTMKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjAxOTAyMCkKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc2NzMyNykKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNjM0MjY0Ci0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy40MDE1OTEpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDYzNTE2Ci0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuODMwODQzKQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNTQ1MTQ1Ci0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtNC4zMTI0NzIpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDUuMDg1NTQyCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC00Ljg1Mjg2OCkKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0EwIDEuMTA3ODIzCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9BMSAoLTAuODc1MTUwKQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0IxICgtMC43NjczMjcpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQTAgMS4yMjg4MDMKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0ExICgtMC45OTYxMzApCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQjEgKC0wLjc2NzMyNykKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19BMCAxLjM2NDU0NAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQTEgKC0xLjEzMTg3MSkKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19CMSAoLTAuNzY3MzI3KQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0EwIDEuNTE2ODQ5CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9BMSAoLTEuMjg0MTc2KQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0IxICgtMC43NjczMjcpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQTAgMS42ODc3MzcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0ExICgtMS40NTUwNjQpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQjEgKC0wLjc2NzMyNykKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9BMCAxLjg3OTQ3NworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQTEgKC0xLjY0NjgwNCkKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW42X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9CMSAoLTAuNzY3MzI3KQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW43X0EwIDIuMDk0NjEzCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19BMSAoLTEuODYxOTQwKQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW43X0IxICgtMC43NjczMjcpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQTAgMi4zMzU5OTkKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW44X0ExICgtMi4xMDMzMjYpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQjEgKC0wLjc2NzMyNykKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW44X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9BMCAyLjYwNjgzOQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQTEgKC0yLjM3NDE2NikKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW45X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9CMSAoLTAuNzY3MzI3KQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQTAgMi45MTA3MjYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9BMSAoLTIuNjc4MDUzKQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEwX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQjEgKC0wLjc2NzMyNykKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMCAzLjI1MTY5MworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjExX0ExICgtMy4wMTkwMjApCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9CMSAoLTAuNzY3MzI3KQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjExX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0EwIDMuNjM0MjY0CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQTEgKC0zLjQwMTU5MSkKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0IxICgtMC43NjczMjcpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQTAgNC4wNjM1MTYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19BMSAoLTMuODMwODQzKQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEzX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQjEgKC0wLjc2NzMyNykKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNF9BMCA0LjU0NTE0NQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0ExICgtNC4zMTI0NzIpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNF9CMSAoLTAuNzY3MzI3KQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0EwIDUuMDg1NTQyCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQTEgKC00Ljg1Mjg2OCkKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0IxICgtMC43NjczMjcpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQjIgMC4wMDAwMDAKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jcHAKaW5kZXggZmYyYzkwYS4uYjJhMzVkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmNwcApAQCAtNTAsNzggKzUwLDYyIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhMVk1fSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpCi17Ci0gICAgTFZNX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWTV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CiAKLSAgICBpZiAoKHBQYXJhbXMgPT0gTFZNX05VTEwpIHx8IChoSW5zdGFuY2UgPT0gTFZNX05VTEwpKQotICAgIHsKKyAgICBpZiAoKHBQYXJhbXMgPT0gTFZNX05VTEwpIHx8IChoSW5zdGFuY2UgPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKICAgICB9CiAKICAgICBwSW5zdGFuY2UtPk5ld1BhcmFtcyA9ICpwUGFyYW1zOwogCi0gICAgaWYoCi0gICAgICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLwotICAgICAgICAoKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT0ZGKSAmJiAocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PTikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICgocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCi0gICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzIyMDUwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjQwMDApICAgICAgJiYKLSAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkgICAgICAmJgotICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODgyMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU185NjAwMCkgJiYKLSAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE3NjQwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE5MjAwMCkpICAgICAgfHwKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICgocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmCi0gICAgICAgICAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmCi0gICAgICAgICAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSAmJgotICAgICAgICAgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTVVMVElDSEFOTkVMKSkgfHwKLSNlbHNlCi0gICAgICAgICgocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykpIHx8Ci0jZW5kaWYKLSAgICAgICAgKHBQYXJhbXMtPlNwZWFrZXJUeXBlID4gTFZNX0VYX0hFQURQSE9ORVMpKQotICAgIHsKKyAgICBpZiAoCisgICAgICAgICAgICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgICgocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PRkYpICYmIChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09OKSkgfHwKKyAgICAgICAgICAgICgocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJgorICAgICAgICAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE2MDAwKSAmJgorICAgICAgICAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAmJgorICAgICAgICAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJgorICAgICAgICAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzg4MjAwKSAmJgorICAgICAgICAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU185NjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE3NjQwMCkgJiYKKyAgICAgICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKSkgfHwKKyAgICAgICAgICAgICgocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYKKyAgICAgICAgICAgICAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSAmJiAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NVUxUSUNIQU5ORUwpKSB8fAorICAgICAgICAgICAgKHBQYXJhbXMtPlNwZWFrZXJUeXBlID4gTFZNX0VYX0hFQURQSE9ORVMpKSB7CiAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwogICAgIH0KIAotI2lmZGVmIFNVUFBPUlRfTUMKICAgICBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzID0gcFBhcmFtcy0+TnJDaGFubmVsczsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5DaE1hc2sgICAgID0gcFBhcmFtcy0+Q2hNYXNrOwotI2VuZGlmCisgICAgcEluc3RhbmNlLT5QYXJhbXMuQ2hNYXNrID0gcFBhcmFtcy0+Q2hNYXNrOwogICAgIC8qCiAgICAgICogQ2luZW1hIFNvdW5kIHBhcmFtZXRlcnMKICAgICAgKi8KLSAgICBpZigocFBhcmFtcy0+VmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09GRikgJiYgKHBQYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PTikpCi0gICAgeworICAgIGlmICgocFBhcmFtcy0+VmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09GRikgJiYKKyAgICAgICAgKHBQYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PTikpIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQogCi0gICAgaWYocFBhcmFtcy0+VmlydHVhbGl6ZXJUeXBlICE9IExWTV9DT05DRVJUU09VTkQpCi0gICAgeworICAgIGlmIChwUGFyYW1zLT5WaXJ0dWFsaXplclR5cGUgIT0gTFZNX0NPTkNFUlRTT1VORCkgewogICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKICAgICB9CiAKLSAgICBpZihwUGFyYW1zLT5WaXJ0dWFsaXplclJldmVyYkxldmVsID4gTFZNX1ZJUlRVQUxJWkVSX01BWF9SRVZFUkJfTEVWRUwpCi0gICAgeworICAgIGlmIChwUGFyYW1zLT5WaXJ0dWFsaXplclJldmVyYkxldmVsID4gTFZNX1ZJUlRVQUxJWkVSX01BWF9SRVZFUkJfTEVWRUwpIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQogCi0gICAgaWYocFBhcmFtcy0+Q1NfRWZmZWN0TGV2ZWwgPCBMVk1fQ1NfTUlOX0VGRkVDVF9MRVZFTCkKLSAgICB7CisgICAgaWYgKHBQYXJhbXMtPkNTX0VmZmVjdExldmVsIDwgTFZNX0NTX01JTl9FRkZFQ1RfTEVWRUwpIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBOLUJhbmQgRXF1YWxpemVyCiAgICAgICovCi0gICAgaWYocFBhcmFtcy0+RVFOQl9OQmFuZHMgPiBwSW5zdGFuY2UtPkluc3RQYXJhbXMuRVFOQl9OdW1CYW5kcykKLSAgICB7CisgICAgaWYgKHBQYXJhbXMtPkVRTkJfTkJhbmRzID4gcEluc3RhbmNlLT5JbnN0UGFyYW1zLkVRTkJfTnVtQmFuZHMpIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQogCiAgICAgLyogRGVmaW5pdGlvbiBwb2ludGVyICovCi0gICAgaWYgKChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9PSBMVk1fTlVMTCkgJiYKLSAgICAgICAgKHBQYXJhbXMtPkVRTkJfTkJhbmRzICE9IDApKQotICAgIHsKKyAgICBpZiAoKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uID09IExWTV9OVUxMKSAmJiAocFBhcmFtcy0+RVFOQl9OQmFuZHMgIT0gMCkpIHsKICAgICAgICAgcmV0dXJuIChMVk1fTlVMTEFERFJFU1MpOwogICAgIH0KIApAQCAtMTI5LDM1ICsxMTMsMzEgQEAKICAgICAgKiBDb3B5IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBFcXVhbGlzZXIKICAgICAgKi8KICAgICB7Ci0gICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKKyAgICAgICAgTFZNX0lOVDE2IGk7CiAKLSAgICAgICAgaWYgKHBQYXJhbXMtPkVRTkJfTkJhbmRzICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpPHBQYXJhbXMtPkVRTkJfTkJhbmRzOyBpKyspCi0gICAgICAgICAgICB7CisgICAgICAgIGlmIChwUGFyYW1zLT5FUU5CX05CYW5kcyAhPSAwKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBhcmFtcy0+RVFOQl9OQmFuZHM7IGkrKykgewogICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cEVRTkJfQmFuZERlZnNbaV0gPSBwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBJbnN0YW5jZS0+TmV3UGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uID0gcEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmczsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiggLyogTi1CYW5kIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCi0gICAgICAgICgocFBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlICE9IExWTV9FUU5CX09GRikgJiYgKHBQYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSAhPSBMVk1fRVFOQl9PTikpIHx8Ci0gICAgICAgIChwUGFyYW1zLT5FUU5CX05CYW5kcyA+IHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5FUU5CX051bUJhbmRzKSkKLSAgICB7CisgICAgaWYgKC8qIE4tQmFuZCBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLworICAgICAgICAoKHBQYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSAhPSBMVk1fRVFOQl9PRkYpICYmCisgICAgICAgICAocFBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlICE9IExWTV9FUU5CX09OKSkgfHwKKyAgICAgICAgKHBQYXJhbXMtPkVRTkJfTkJhbmRzID4gcEluc3RhbmNlLT5JbnN0UGFyYW1zLkVRTkJfTnVtQmFuZHMpKSB7CiAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwogICAgIH0KICAgICAvKiBCYW5kIHBhcmFtZXRlcnMqLwogICAgIHsKICAgICAgICAgTFZNX0lOVDE2IGk7Ci0gICAgICAgIGZvcihpID0gMDsgaSA8IHBQYXJhbXMtPkVRTkJfTkJhbmRzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5IDwgTFZNX0VRTkJfTUlOX0JBTkRfRlJFUSkgIHx8Ci0gICAgICAgICAgICAgICAgKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeSA+IExWTV9FUU5CX01BWF9CQU5EX0ZSRVEpKSB8fAotICAgICAgICAgICAgICAgICgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uR2FpbiAgICAgPCBMVk1fRVFOQl9NSU5fQkFORF9HQUlOKSAgfHwKLSAgICAgICAgICAgICAgICAocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uR2FpbiAgICAgID4gTFZNX0VRTkJfTUFYX0JBTkRfR0FJTikpIHx8Ci0gICAgICAgICAgICAgICAgKChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXS5RRmFjdG9yICA8IExWTV9FUU5CX01JTl9RRkFDVE9SKSAgICAgfHwKLSAgICAgICAgICAgICAgICAocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uUUZhY3RvciAgID4gTFZNX0VRTkJfTUFYX1FGQUNUT1IpKSkKLSAgICAgICAgICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQYXJhbXMtPkVRTkJfTkJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeSA8IExWTV9FUU5CX01JTl9CQU5EX0ZSRVEpIHx8CisgICAgICAgICAgICAgICAgIChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXS5GcmVxdWVuY3kgPiBMVk1fRVFOQl9NQVhfQkFORF9GUkVRKSkgfHwKKyAgICAgICAgICAgICAgICAoKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkdhaW4gPCBMVk1fRVFOQl9NSU5fQkFORF9HQUlOKSB8fAorICAgICAgICAgICAgICAgICAocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uR2FpbiA+IExWTV9FUU5CX01BWF9CQU5EX0dBSU4pKSB8fAorICAgICAgICAgICAgICAgICgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uUUZhY3RvciA8IExWTV9FUU5CX01JTl9RRkFDVE9SKSB8fAorICAgICAgICAgICAgICAgICAocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uUUZhY3RvciA+IExWTV9FUU5CX01BWF9RRkFDVE9SKSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTY2LDI0ICsxNDYsMjUgQEAKICAgICAvKgogICAgICAqIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycwogICAgICAqLwotICAgIGlmKCgocFBhcmFtcy0+QkVfT3BlcmF0aW5nTW9kZSAhPSBMVk1fQkVfT0ZGKSAmJiAocFBhcmFtcy0+QkVfT3BlcmF0aW5nTW9kZSAhPSBMVk1fQkVfT04pKSAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAoKHBQYXJhbXMtPkJFX0VmZmVjdExldmVsIDwgTFZNX0JFX01JTl9FRkZFQ1RMRVZFTCApIHx8IChwUGFyYW1zLT5CRV9FZmZlY3RMZXZlbCA+IExWTV9CRV9NQVhfRUZGRUNUTEVWRUwgKSl8fAotICAgICAgICAoKHBQYXJhbXMtPkJFX0NlbnRyZUZyZXEgIT0gTFZNX0JFX0NFTlRSRV81NUh6KSAmJiAocFBhcmFtcy0+QkVfQ2VudHJlRnJlcSAhPSBMVk1fQkVfQ0VOVFJFXzY2SHopICAgICAgICAgICAmJgotICAgICAgICAocFBhcmFtcy0+QkVfQ2VudHJlRnJlcSAhPSBMVk1fQkVfQ0VOVFJFXzc4SHopICYmIChwUGFyYW1zLT5CRV9DZW50cmVGcmVxICE9IExWTV9CRV9DRU5UUkVfOTBIeikpICAgICAgICAgICB8fAotICAgICAgICAoKHBQYXJhbXMtPkJFX0hQRiAhPSBMVk1fQkVfSFBGX09GRikgJiYgKHBQYXJhbXMtPkJFX0hQRiAhPSBMVk1fQkVfSFBGX09OKSkpCi0gICAgeworICAgIGlmICgoKHBQYXJhbXMtPkJFX09wZXJhdGluZ01vZGUgIT0gTFZNX0JFX09GRikgJiYgKHBQYXJhbXMtPkJFX09wZXJhdGluZ01vZGUgIT0gTFZNX0JFX09OKSkgfHwKKyAgICAgICAgKChwUGFyYW1zLT5CRV9FZmZlY3RMZXZlbCA8IExWTV9CRV9NSU5fRUZGRUNUTEVWRUwpIHx8CisgICAgICAgICAocFBhcmFtcy0+QkVfRWZmZWN0TGV2ZWwgPiBMVk1fQkVfTUFYX0VGRkVDVExFVkVMKSkgfHwKKyAgICAgICAgKChwUGFyYW1zLT5CRV9DZW50cmVGcmVxICE9IExWTV9CRV9DRU5UUkVfNTVIeikgJiYKKyAgICAgICAgIChwUGFyYW1zLT5CRV9DZW50cmVGcmVxICE9IExWTV9CRV9DRU5UUkVfNjZIeikgJiYKKyAgICAgICAgIChwUGFyYW1zLT5CRV9DZW50cmVGcmVxICE9IExWTV9CRV9DRU5UUkVfNzhIeikgJiYKKyAgICAgICAgIChwUGFyYW1zLT5CRV9DZW50cmVGcmVxICE9IExWTV9CRV9DRU5UUkVfOTBIeikpIHx8CisgICAgICAgICgocFBhcmFtcy0+QkVfSFBGICE9IExWTV9CRV9IUEZfT0ZGKSAmJiAocFBhcmFtcy0+QkVfSFBGICE9IExWTV9CRV9IUEZfT04pKSkgewogICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKICAgICB9CiAKICAgICAvKgogICAgICAqIFZvbHVtZSBDb250cm9sIHBhcmFtZXRlcnMKICAgICAgKi8KLSAgICBpZigocFBhcmFtcy0+VkNfRWZmZWN0TGV2ZWwgPCBMVk1fVkNfTUlOX0VGRkVDVExFVkVMICkgfHwgKHBQYXJhbXMtPlZDX0VmZmVjdExldmVsID4gTFZNX1ZDX01BWF9FRkZFQ1RMRVZFTCApKQotICAgIHsKKyAgICBpZiAoKHBQYXJhbXMtPlZDX0VmZmVjdExldmVsIDwgTFZNX1ZDX01JTl9FRkZFQ1RMRVZFTCkgfHwKKyAgICAgICAgKHBQYXJhbXMtPlZDX0VmZmVjdExldmVsID4gTFZNX1ZDX01BWF9FRkZFQ1RMRVZFTCkpIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQotICAgIGlmKChwUGFyYW1zLT5WQ19CYWxhbmNlIDwgTFZNX1ZDX0JBTEFOQ0VfTUlOICkgfHwgKHBQYXJhbXMtPlZDX0JhbGFuY2UgPiBMVk1fVkNfQkFMQU5DRV9NQVggKSkKLSAgICB7CisgICAgaWYgKChwUGFyYW1zLT5WQ19CYWxhbmNlIDwgTFZNX1ZDX0JBTEFOQ0VfTUlOKSB8fCAocFBhcmFtcy0+VkNfQmFsYW5jZSA+IExWTV9WQ19CQUxBTkNFX01BWCkpIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQogCkBAIC0xOTEsMjIgKzE3MiwyMSBAQAogICAgICAqIFBTQSBwYXJhbWV0ZXJzCiAgICAgICovCiAgICAgaWYgKCgoTFZQU0FfTGV2ZWxEZXRlY3RTcGVlZF9lbilwUGFyYW1zLT5QU0FfUGVha0RlY2F5UmF0ZSA+IExWUFNBX1NQRUVEX0hJR0gpIHx8Ci0gICAgICAgIChwUGFyYW1zLT5QU0FfRW5hYmxlID4gTFZNX1BTQV9PTikpCi0gICAgeworICAgICAgICAocFBhcmFtcy0+UFNBX0VuYWJsZSA+IExWTV9QU0FfT04pKSB7CiAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwogICAgIH0KIAogICAgIC8qCi0gICAgKiBTZXQgdGhlIGZsYWcgdG8gaW5kaWNhdGUgdGhlcmUgYXJlIG5ldyBwYXJhbWV0ZXJzIHRvIHVzZQotICAgICoKLSAgICAqIFByb3RlY3QgdGhlIGNvcHkgb2YgdGhlIG5ldyBwYXJhbWV0ZXJzIGZyb20gaW50ZXJydXB0cyB0byBhdm9pZCBwb3NzaWJsZSBwcm9ibGVtcwotICAgICogd2l0aCBsb3NzIGNvbnRyb2wgcGFyYW1ldGVycy4gVGhpcyBwcm9ibGVtIGNhbiBvY2N1ciBpZiB0aGlzIGNvbnRyb2wgZnVuY3Rpb24gaXMgY2FsbGVkIG1vcmUKLSAgICAqIHRoYW4gb25jZSBiZWZvcmUgYSBjYWxsIHRvIHRoZSBwcm9jZXNzIGZ1bmN0aW9uLiBJZiB0aGUgcHJvY2VzcyBmdW5jdGlvbiBpbnRlcnJ1cHRzCi0gICAgKiB0aGUgY29weSB0byBOZXdQYXJhbXMgdGhlbiBvbmUgZnJhbWUgbWF5IGhhdmUgbWl4ZWQgcGFyYW1ldGVycywgc29tZSBvbGQgYW5kIHNvbWUgbmV3LgotICAgICovCisgICAgICogU2V0IHRoZSBmbGFnIHRvIGluZGljYXRlIHRoZXJlIGFyZSBuZXcgcGFyYW1ldGVycyB0byB1c2UKKyAgICAgKgorICAgICAqIFByb3RlY3QgdGhlIGNvcHkgb2YgdGhlIG5ldyBwYXJhbWV0ZXJzIGZyb20gaW50ZXJydXB0cyB0byBhdm9pZCBwb3NzaWJsZSBwcm9ibGVtcworICAgICAqIHdpdGggbG9zcyBjb250cm9sIHBhcmFtZXRlcnMuIFRoaXMgcHJvYmxlbSBjYW4gb2NjdXIgaWYgdGhpcyBjb250cm9sIGZ1bmN0aW9uIGlzIGNhbGxlZCBtb3JlCisgICAgICogdGhhbiBvbmNlIGJlZm9yZSBhIGNhbGwgdG8gdGhlIHByb2Nlc3MgZnVuY3Rpb24uIElmIHRoZSBwcm9jZXNzIGZ1bmN0aW9uIGludGVycnVwdHMKKyAgICAgKiB0aGUgY29weSB0byBOZXdQYXJhbXMgdGhlbiBvbmUgZnJhbWUgbWF5IGhhdmUgbWl4ZWQgcGFyYW1ldGVycywgc29tZSBvbGQgYW5kIHNvbWUgbmV3LgorICAgICAqLwogICAgIHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPSBMVk1fVFJVRTsKIAotICAgIHJldHVybihMVk1fU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVk1fU1VDQ0VTUyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjMwLDE2ICsyMTAsMTMgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKExWTV9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcykKLXsKLSAgICBMVk1fSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMoTFZNX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZNX0NvbnRyb2xQYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKIAogICAgIC8qCiAgICAgICogQ2hlY2sgcG9pbnRlcgogICAgICAqLwotICAgIGlmICgocFBhcmFtcyA9PSBMVk1fTlVMTCkgfHwgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkpCi0gICAgeworICAgIGlmICgocFBhcmFtcyA9PSBMVk1fTlVMTCkgfHwgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkpIHsKICAgICAgICAgcmV0dXJuIChMVk1fTlVMTEFERFJFU1MpOwogICAgIH0KICAgICAqcFBhcmFtcyA9IHBJbnN0YW5jZS0+TmV3UGFyYW1zOwpAQCAtMjQ4LDE3ICsyMjUsMTYgQEAKICAgICAgKiBDb3B5IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBFcXVhbGlzZXIKICAgICAgKi8KICAgICB7Ci0gICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKKyAgICAgICAgTFZNX0lOVDE2IGk7CiAKICAgICAgICAgaWYgKHBJbnN0YW5jZS0+TmV3UGFyYW1zLkVRTkJfTkJhbmRzICE9IDApCi0gICAgICAgIGZvciAoaT0wOyBpPHBJbnN0YW5jZS0+TmV3UGFyYW1zLkVRTkJfTkJhbmRzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnNbaV0gPSBwSW5zdGFuY2UtPnBFUU5CX0JhbmREZWZzW2ldOwotICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEluc3RhbmNlLT5OZXdQYXJhbXMuRVFOQl9OQmFuZHM7IGkrKykgeworICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnNbaV0gPSBwSW5zdGFuY2UtPnBFUU5CX0JhbmREZWZzW2ldOworICAgICAgICAgICAgfQogICAgICAgICBwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9IHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnM7CiAgICAgfQogCi0gICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWTV9TVUNDRVNTKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNzQsNTYgKzI1MCw0MiBAQAogLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlcnMgdG8gdXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVk1fU2V0VHJlYmxlQm9vc3QoTFZNX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcykKLXsKLSAgICBleHRlcm4gRk9fRkxPQVRfTFNoeF9Db2Vmc190ICBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdOwordm9pZCBMVk1fU2V0VHJlYmxlQm9vc3QoTFZNX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX0NvbnRyb2xQYXJhbXNfdCogcFBhcmFtcykgeworICAgIGV4dGVybiBGT19GTE9BVF9MU2h4X0NvZWZzX3QgTFZNX1RyZWJsZUJvb3N0Q29lZnNbXTsKIAotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE9mZnNldDsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBFZmZlY3RMZXZlbCA9IDA7CisgICAgTFZNX0lOVDE2IE9mZnNldDsKKyAgICBMVk1fSU5UMTYgRWZmZWN0TGV2ZWwgPSAwOwogCiAgICAgLyoKICAgICAgKiBMb2FkIHRoZSBjb2VmZmljaWVudHMKICAgICAgKi8KLSAgICBpZiAoKHBQYXJhbXMtPlRFX09wZXJhdGluZ01vZGUgPT0gTFZNX1RFX09OKSAmJgotICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSA+PSBUcmVibGVCb29zdE1pblJhdGUpICYmCi0gICAgICAgIChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKSAmJgotICAgICAgICAocFBhcmFtcy0+VEVfRWZmZWN0TGV2ZWwgPiAwKSkKLSAgICB7Ci0gICAgICAgIGlmKChwUGFyYW1zLT5URV9FZmZlY3RMZXZlbCA9PSBMVk1fVEVfTE9XX01JUFMpICYmCi0gICAgICAgICAgICAoKHBQYXJhbXMtPlNwZWFrZXJUeXBlID09IExWTV9IRUFEUEhPTkVTKXx8Ci0gICAgICAgICAgICAocFBhcmFtcy0+U3BlYWtlclR5cGUgPT0gTFZNX0VYX0hFQURQSE9ORVMpKSkKLSAgICAgICAgeworICAgIGlmICgocFBhcmFtcy0+VEVfT3BlcmF0aW5nTW9kZSA9PSBMVk1fVEVfT04pICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlID49IFRyZWJsZUJvb3N0TWluUmF0ZSkgJiYKKyAgICAgICAgKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pICYmIChwUGFyYW1zLT5URV9FZmZlY3RMZXZlbCA+IDApKSB7CisgICAgICAgIGlmICgocFBhcmFtcy0+VEVfRWZmZWN0TGV2ZWwgPT0gTFZNX1RFX0xPV19NSVBTKSAmJgorICAgICAgICAgICAgKChwUGFyYW1zLT5TcGVha2VyVHlwZSA9PSBMVk1fSEVBRFBIT05FUykgfHwKKyAgICAgICAgICAgICAocFBhcmFtcy0+U3BlYWtlclR5cGUgPT0gTFZNX0VYX0hFQURQSE9ORVMpKSkgewogICAgICAgICAgICAgcEluc3RhbmNlLT5URV9BY3RpdmUgPSBMVk1fRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBFZmZlY3RMZXZlbCA9IHBQYXJhbXMtPlRFX0VmZmVjdExldmVsOwogICAgICAgICAgICAgcEluc3RhbmNlLT5URV9BY3RpdmUgPSBMVk1fVFJVRTsKICAgICAgICAgfQogCi0gICAgICAgIGlmKHBJbnN0YW5jZS0+VEVfQWN0aXZlID09IExWTV9UUlVFKQotICAgICAgICB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRFX0FjdGl2ZSA9PSBMVk1fVFJVRSkgewogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIExvYWQgdGhlIGNvZWZmaWNpZW50cyBhbmQgZW5hYmxlZCB0aGUgdHJlYmxlIGJvb3N0CiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE9mZnNldCA9IChMVk1fSU5UMTYpKEVmZmVjdExldmVsIC0gMSArIFRyZWJsZUJvb3N0U3RlcHMgKiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAtIFRyZWJsZUJvb3N0TWluUmF0ZSkpOwotICAgICAgICAgICAgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBURV9TdGF0ZS0+VHJlYmxlQm9vc3RfU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTFZNX1RyZWJsZUJvb3N0Q29lZnNbT2Zmc2V0XSk7Ci0KKyAgICAgICAgICAgIE9mZnNldCA9IChMVk1fSU5UMTYpKEVmZmVjdExldmVsIC0gMSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmVibGVCb29zdFN0ZXBzICogKHBQYXJhbXMtPlNhbXBsZVJhdGUgLSBUcmVibGVCb29zdE1pblJhdGUpKTsKICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDbGVhciB0aGUgdGFwcworICAgICAgICAgICAgICogQ3JlYXRlIGJpcXVhZCBpbnN0YW5jZQogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBMb2FkQ29uc3RfRmxvYXQoKExWTV9GTE9BVCkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcEluc3RhbmNlLT5wVEVfVGFwcy0+VHJlYmxlQm9vc3RfVGFwcywgIC8qIERlc3RpbmF0aW9uLlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzdCB0byB2b2lkOiBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzKSAvIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgICAgICAgICBzdGQ6OmFycmF5PExWTV9GTE9BVCwgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OmtCaXF1YWROdW1Db2Vmcz4gY29lZnMgPSB7CisgICAgICAgICAgICAgICAgICAgIExWTV9UcmVibGVCb29zdENvZWZzW09mZnNldF0uQTAsIExWTV9UcmVibGVCb29zdENvZWZzW09mZnNldF0uQTEsIDAuMCwKKyAgICAgICAgICAgICAgICAgICAgLShMVk1fVHJlYmxlQm9vc3RDb2Vmc1tPZmZzZXRdLkIxKSwgMC4wfTsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+cFRFQmlxdWFkLnJlc2V0KAorICAgICAgICAgICAgICAgICAgICBuZXcgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxMVk1fRkxPQVQ+KHBQYXJhbXMtPk5yQ2hhbm5lbHMsIGNvZWZzKSk7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgICAvKgogICAgICAgICAgKiBEaXNhYmxlIHRoZSB0cmVibGUgYm9vc3QKICAgICAgICAgICovCkBAIC0zNDUsOTQgKzMwNyw3NiBAQAogLyogIHBQYXJhbXMgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAgICBMVk1fU2V0Vm9sdW1lKExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKQotewotCi0gICAgTFZNX1VJTlQxNiAgICAgIGRCU2hpZnRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNmRCIHNoaWZ0cyAqLwotICAgIExWTV9VSU5UMTYgICAgICBkQk9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRhYmxlIG9mZnNldCAqLwotICAgIExWTV9JTlQxNiAgICAgICBWb2x1bWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcXVpcmVkIHZvbHVtZSBpbiBkQnMgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgIFRlbXA7Cit2b2lkIExWTV9TZXRWb2x1bWUoTFZNX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX0NvbnRyb2xQYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWTV9VSU5UMTYgZEJTaGlmdHM7ICAvKiA2ZEIgc2hpZnRzICovCisgICAgTFZNX1VJTlQxNiBkQk9mZnNldDsgIC8qIFRhYmxlIG9mZnNldCAqLworICAgIExWTV9JTlQxNiBWb2x1bWUgPSAwOyAvKiBSZXF1aXJlZCB2b2x1bWUgaW4gZEJzICovCisgICAgTFZNX0ZMT0FUIFRlbXA7CiAKICAgICAvKgogICAgICAqIExpbWl0IHRoZSBnYWluIHRvIHRoZSBtYXhpbXVtIGFsbG93ZWQKICAgICAgKi8KLSAgICAgaWYgIChwUGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA+IDApCi0gICAgIHsKLSAgICAgICAgIFZvbHVtZSA9IDA7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgICBWb2x1bWUgPSBwUGFyYW1zLT5WQ19FZmZlY3RMZXZlbDsKLSAgICAgfQorICAgIGlmIChwUGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA+IDApIHsKKyAgICAgICAgVm9sdW1lID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBWb2x1bWUgPSBwUGFyYW1zLT5WQ19FZmZlY3RMZXZlbDsKKyAgICB9CiAKLSAgICAgLyogQ29tcGVuc2F0ZSB0aGlzIHZvbHVtZSBpbiBQU0EgcGxvdCAqLwotICAgICBpZihWb2x1bWUgPiAtNjApICAvKiBMaW1pdCB2b2x1bWUgbG9zcyB0byBQU0EgTGltaXRzKi8KLSAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0dhaW5PZmZzZXQ9KExWTV9JTlQxNikoLVZvbHVtZSk7LyogTG9zcyBpcyBjb21wZW5zYXRlZCBieSBHYWluKi8KLSAgICAgZWxzZQotICAgICAgICAgcEluc3RhbmNlLT5QU0FfR2Fpbk9mZnNldD0oTFZNX0lOVDE2KTYwOy8qIExvc3MgaXMgY29tcGVuc2F0ZWQgYnkgR2FpbiovCisgICAgLyogQ29tcGVuc2F0ZSB0aGlzIHZvbHVtZSBpbiBQU0EgcGxvdCAqLworICAgIGlmIChWb2x1bWUgPiAtNjApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExpbWl0IHZvbHVtZSBsb3NzIHRvIFBTQSBMaW1pdHMqLworICAgICAgICBwSW5zdGFuY2UtPlBTQV9HYWluT2Zmc2V0ID0gKExWTV9JTlQxNikoLVZvbHVtZSk7IC8qIExvc3MgaXMgY29tcGVuc2F0ZWQgYnkgR2FpbiovCisgICAgZWxzZQorICAgICAgICBwSW5zdGFuY2UtPlBTQV9HYWluT2Zmc2V0ID0gKExWTV9JTlQxNik2MDsgLyogTG9zcyBpcyBjb21wZW5zYXRlZCBieSBHYWluKi8KIAogICAgIHBJbnN0YW5jZS0+VkNfQVZMRml4ZWRWb2x1bWUgPSAwOwogCiAgICAgLyoKICAgICAgKiBTZXQgdm9sdW1lIGNvbnRyb2wgYW5kIEFWTCB2b2x1bWVzIGFjY29yZGluZyB0byBoZWFkcm9vbSBhbmQgdm9sdW1lIHVzZXIgc2V0dGluZwogICAgICAqLwotICAgIGlmKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pCi0gICAgeworICAgIGlmIChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKSB7CiAgICAgICAgIC8qIERlZmF1bHQgU2l0dWF0aW9uIHdpdGggbm8gQVZMIGFuZCBubyBSUyAqLwotICAgICAgICBpZihwUGFyYW1zLT5FUU5CX09wZXJhdGluZ01vZGUgPT0gTFZNX0VRTkJfT04pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFZvbHVtZSA+IC1wSW5zdGFuY2UtPkhlYWRyb29tKQotICAgICAgICAgICAgICAgIFZvbHVtZSA9IChMVk1fSU5UMTYpLXBJbnN0YW5jZS0+SGVhZHJvb207CisgICAgICAgIGlmIChwUGFyYW1zLT5FUU5CX09wZXJhdGluZ01vZGUgPT0gTFZNX0VRTkJfT04pIHsKKyAgICAgICAgICAgIGlmIChWb2x1bWUgPiAtcEluc3RhbmNlLT5IZWFkcm9vbSkgVm9sdW1lID0gKExWTV9JTlQxNiktcEluc3RhbmNlLT5IZWFkcm9vbTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qCiAgICAgICogQWN0aXZhdGUgdm9sdW1lIGNvbnRyb2wgaWYgbmVjZXNzYXJ5CiAgICAgICovCi0gICAgcEluc3RhbmNlLT5WQ19BY3RpdmUgICA9IExWTV9UUlVFOwotICAgIGlmIChWb2x1bWUgIT0gMCkKLSAgICB7CisgICAgcEluc3RhbmNlLT5WQ19BY3RpdmUgPSBMVk1fVFJVRTsKKyAgICBpZiAoVm9sdW1lICE9IDApIHsKICAgICAgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWVkQiA9IFZvbHVtZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZWRCID0gMDsKICAgICB9CiAKICAgICAvKgogICAgICAqIENhbGN1bGF0ZSB0aGUgcmVxdWlyZWQgZ2FpbiBhbmQgc2hpZnRzCiAgICAgICovCi0gICAgZEJPZmZzZXQgPSAoTFZNX1VJTlQxNikoKC1Wb2x1bWUpICUgNik7ICAgICAgICAgICAgIC8qIEdldCB0aGUgZEJzIDAtNSAqLwotICAgIGRCU2hpZnRzID0gKExWTV9VSU5UMTYpKFZvbHVtZSAvIC02KTsgICAgICAgICAgICAgICAvKiBHZXQgdGhlIDZkQiBzaGlmdHMgKi8KKyAgICBkQk9mZnNldCA9IChMVk1fVUlOVDE2KSgoLVZvbHVtZSkgJSA2KTsgLyogR2V0IHRoZSBkQnMgMC01ICovCisgICAgZEJTaGlmdHMgPSAoTFZNX1VJTlQxNikoVm9sdW1lIC8gLTYpOyAgIC8qIEdldCB0aGUgNmRCIHNoaWZ0cyAqLwogCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIHBhcmFtZXRlcnMKICAgICAgKi8KLSAgICBpZihkQlNoaWZ0cyA9PSAwKQotICAgIHsKKyAgICBpZiAoZEJTaGlmdHMgPT0gMCkgewogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVClMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKLSAgICAgICAgfQotICAgIGVsc2UKLSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVClMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKKyAgICB9IGVsc2UgewogICAgICAgICBUZW1wID0gTFZNX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XTsKLSAgICAgICAgd2hpbGUoZEJTaGlmdHMpIHsKKyAgICAgICAgd2hpbGUgKGRCU2hpZnRzKSB7CiAgICAgICAgICAgICBUZW1wID0gVGVtcCAvIDIuMGY7CiAgICAgICAgICAgICBkQlNoaWZ0cy0tOwogICAgICAgICB9CiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLCBUZW1wKTsKICAgICB9CiAgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSAxOwotICAgIGlmKHBJbnN0YW5jZS0+Tm9TbW9vdGhWb2x1bWUgPT0gTFZNX1RSVUUpCi0gICAgeworICAgIGlmIChwSW5zdGFuY2UtPk5vU21vb3RoVm9sdW1lID09IExWTV9UUlVFKSB7CiAgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsIDIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSwgcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwgMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sIExWTV9WQ19NSVhFUl9USU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsIDIpOwogICAgIH0KIH0KIApAQCAtNDUzLDQzICszOTcsMzkgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgICAgTFZNX1NldEhlYWRyb29tKExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpCi17Ci0gICAgTFZNX0lOVDE2ICAgaWksIGpqOwotICAgIExWTV9JTlQxNiAgIEhlYWRyb29tID0gMDsKLSAgICBMVk1fSU5UMTYgICBNYXhHYWluID0gMDsKK3ZvaWQgTFZNX1NldEhlYWRyb29tKExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVk1fSU5UMTYgaWksIGpqOworICAgIExWTV9JTlQxNiBIZWFkcm9vbSA9IDA7CisgICAgTFZNX0lOVDE2IE1heEdhaW4gPSAwOwogCi0gICAgaWYgKCgoTFZFUU5CX01vZGVfZW4pcFBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikKLSAgICAgICAgICAgJiYgKHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMuSGVhZHJvb21fT3BlcmF0aW5nTW9kZSA9PSBMVk1fSEVBRFJPT01fT04pKQotICAgIHsKKyAgICBpZiAoKChMVkVRTkJfTW9kZV9lbilwUGFyYW1zLT5FUU5CX09wZXJhdGluZ01vZGUgPT0gTFZFUU5CX09OKSAmJgorICAgICAgICAocEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcy5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlID09IExWTV9IRUFEUk9PTV9PTikpIHsKICAgICAgICAgLyogRmluZCB0eXBpY2FsIGhlYWRyb29tIHZhbHVlICovCi0gICAgICAgIGZvcihqaiA9IDA7IGpqIDwgcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kczsgamorKykKLSAgICAgICAgeworICAgICAgICBmb3IgKGpqID0gMDsgamogPCBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzOyBqaisrKSB7CiAgICAgICAgICAgICBNYXhHYWluID0gMDsKLSAgICAgICAgICAgIGZvciggaWkgPSAwOyBpaSA8IHBQYXJhbXMtPkVRTkJfTkJhbmRzOyBpaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpaV0uRnJlcXVlbmN5ID49IHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbltqal0uTGltaXRfTG93KSAmJgotICAgICAgICAgICAgICAgICAgIChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpaV0uRnJlcXVlbmN5IDw9IHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbltqal0uTGltaXRfSGlnaCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpaV0uR2FpbiA+IE1heEdhaW4pCi0gICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IHBQYXJhbXMtPkVRTkJfTkJhbmRzOyBpaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpaV0uRnJlcXVlbmN5ID49CisgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bampdLkxpbWl0X0xvdykgJiYKKyAgICAgICAgICAgICAgICAgICAgKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2lpXS5GcmVxdWVuY3kgPD0KKyAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbltqal0uTGltaXRfSGlnaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2lpXS5HYWluID4gTWF4R2FpbikgewogICAgICAgICAgICAgICAgICAgICAgICAgTWF4R2FpbiA9IHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2lpXS5HYWluOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZigoTWF4R2FpbiAtIHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbltqal0uSGVhZHJvb21fT2Zmc2V0KSA+IEhlYWRyb29tKXsKLSAgICAgICAgICAgICAgICBIZWFkcm9vbSA9IChMVk1fSU5UMTYpKE1heEdhaW4gLSBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bampdLkhlYWRyb29tX09mZnNldCk7CisgICAgICAgICAgICBpZiAoKE1heEdhaW4gLSBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bampdLkhlYWRyb29tX09mZnNldCkgPgorICAgICAgICAgICAgICAgIEhlYWRyb29tKSB7CisgICAgICAgICAgICAgICAgSGVhZHJvb20gPSAoTFZNX0lOVDE2KSgKKyAgICAgICAgICAgICAgICAgICAgICAgIE1heEdhaW4gLQorICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uW2pqXS5IZWFkcm9vbV9PZmZzZXQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLyogU2F0dXJhdGUgKi8KLSAgICAgICAgaWYoSGVhZHJvb20gPCAwKQotICAgICAgICAgICAgSGVhZHJvb20gPSAwOworICAgICAgICBpZiAoSGVhZHJvb20gPCAwKSBIZWFkcm9vbSA9IDA7CiAgICAgfQotICAgIHBJbnN0YW5jZS0+SGVhZHJvb20gPSAoTFZNX1VJTlQxNilIZWFkcm9vbSA7Ci0KKyAgICBwSW5zdGFuY2UtPkhlYWRyb29tID0gKExWTV9VSU5UMTYpSGVhZHJvb207CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTEwLDMyICs0NTAsMjYgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0FwcGx5TmV3U2V0dGluZ3MoTFZNX0hhbmRsZV90ICAgaEluc3RhbmNlKQotewotICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICopaEluc3RhbmNlOwotICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgTG9jYWxQYXJhbXM7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICBDb3VudCA9IDU7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9BcHBseU5ld1NldHRpbmdzKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UpIHsKKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCBMb2NhbFBhcmFtczsKKyAgICBMVk1fSU5UMTYgQ291bnQgPSA1OwogCiAgICAgLyoKICAgICAgKiBDb3B5IHRoZSBuZXcgcGFyYW1ldGVycyBidXQgbWFrZSBzdXJlIHRoZXkgZGlkbid0IGNoYW5nZSB3aGlsZSBjb3B5aW5nCiAgICAgICovCi0gICAgZG8KLSAgICB7CisgICAgZG8gewogICAgICAgICBwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID0gTFZNX0ZBTFNFOwogICAgICAgICBMb2NhbFBhcmFtcyA9IHBJbnN0YW5jZS0+TmV3UGFyYW1zOwogICAgICAgICBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zID0gcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtczsKICAgICAgICAgQ291bnQtLTsKLSAgICB9IHdoaWxlICgocEluc3RhbmNlLT5Db250cm9sUGVuZGluZyAhPSBMVk1fRkFMU0UpICYmCi0gICAgICAgICAgICAgKENvdW50ID4gMCkpOworICAgIH0gd2hpbGUgKChwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nICE9IExWTV9GQUxTRSkgJiYgKENvdW50ID4gMCkpOwogCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgIHBJbnN0YW5jZS0+TnJDaGFubmVscyA9IExvY2FsUGFyYW1zLk5yQ2hhbm5lbHM7CiAgICAgcEluc3RhbmNlLT5DaE1hc2sgPSBMb2NhbFBhcmFtcy5DaE1hc2s7Ci0jZW5kaWYKIAogICAgIC8qIENsZWFyIGFsbCBpbnRlcm5hbCBkYXRhIGlmIGZvcm1hdCBjaGFuZ2UqLwotICAgIGlmKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCAhPSBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQpCi0gICAgeworICAgIGlmIChMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgIT0gcEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0KSB7CiAgICAgICAgIExWTV9DbGVhckF1ZGlvQnVmZmVycyhwSW5zdGFuY2UpOwogICAgICAgICBwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID0gTFZNX0ZBTFNFOwogICAgIH0KQEAgLTU0NywzMSArNDgxLDI3IEBACiAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5URV9FZmZlY3RMZXZlbCAhPSBMb2NhbFBhcmFtcy5URV9FZmZlY3RMZXZlbCkgfHwKICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlRFX09wZXJhdGluZ01vZGUgIT0gTG9jYWxQYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSkgfHwKICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gTG9jYWxQYXJhbXMuT3BlcmF0aW5nTW9kZSkgfHwKLSAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlICE9IExvY2FsUGFyYW1zLlNwZWFrZXJUeXBlKSkKLSAgICB7Ci0gICAgICAgIExWTV9TZXRUcmVibGVCb29zdChwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmTG9jYWxQYXJhbXMpOworICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gTG9jYWxQYXJhbXMuU3BlYWtlclR5cGUpKSB7CisgICAgICAgIExWTV9TZXRUcmVibGVCb29zdChwSW5zdGFuY2UsICZMb2NhbFBhcmFtcyk7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgdGhlIGhlYWRyb29tIGlmIHJlcXVpcmVkCiAgICAgICovCi0gICAgICAgIExWTV9TZXRIZWFkcm9vbShwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICZMb2NhbFBhcmFtcyk7ICAgICAgICAgICAgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fU2V0SGVhZHJvb20ocEluc3RhbmNlLCAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAmTG9jYWxQYXJhbXMpOyAvKiBOZXcgcGFyYW1ldGVycyAqLwogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgdGhlIHZvbHVtZSBpZiByZXF1aXJlZAogICAgICAqLwogICAgIHsKLSAgICAgICAgTFZNX1NldFZvbHVtZShwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAmTG9jYWxQYXJhbXMpOyAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzICovCisgICAgICAgIExWTV9TZXRWb2x1bWUocEluc3RhbmNlLCAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICZMb2NhbFBhcmFtcyk7IC8qIE5ldyBwYXJhbWV0ZXJzICovCiAgICAgfQogICAgIC8qIEFwcGx5IGJhbGFuY2UgY2hhbmdlcyovCi0gICAgaWYocEluc3RhbmNlLT5QYXJhbXMuVkNfQmFsYW5jZSAhPSBMb2NhbFBhcmFtcy5WQ19CYWxhbmNlKQotICAgIHsKKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuVkNfQmFsYW5jZSAhPSBMb2NhbFBhcmFtcy5WQ19CYWxhbmNlKSB7CiAgICAgICAgIC8qIENvbmZpZ3VyZSBNaXhlciBtb2R1bGUgZm9yIGdyYWR1YWwgY2hhbmdlcyB0byB2b2x1bWUqLwotICAgICAgICBpZihMb2NhbFBhcmFtcy5WQ19CYWxhbmNlIDwgMCkKLSAgICAgICAgeworICAgICAgICBpZiAoTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSA8IDApIHsKICAgICAgICAgICAgIExWTV9GTE9BVCBUYXJnZXRfRmxvYXQ7CiAgICAgICAgICAgICAvKiBEcm9wIGluIHJpZ2h0IGNoYW5uZWwgdm9sdW1lKi8KICAgICAgICAgICAgIFRhcmdldF9GbG9hdCA9IExWTV9NQVhGTE9BVDsKQEAgLTU4Myw5ICs1MTMsNyBAQAogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLCBUYXJnZXRfRmxvYXQpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSwgTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihMb2NhbFBhcmFtcy5WQ19CYWxhbmNlID4wKQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSBpZiAoTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSA+IDApIHsKICAgICAgICAgICAgIExWTV9GTE9BVCBUYXJnZXRfRmxvYXQ7CiAgICAgICAgICAgICAvKiBEcm9wIGluIGxlZnQgY2hhbm5lbCB2b2x1bWUqLwogICAgICAgICAgICAgVGFyZ2V0X0Zsb2F0ID0gZEJfdG9fTGluRmxvYXQoKExWTV9JTlQxNikoKC1Mb2NhbFBhcmFtcy5WQ19CYWxhbmNlKSA8PCA0KSk7CkBAIC01OTcsNjMgKzUyNSw1NCBAQAogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLCBUYXJnZXRfRmxvYXQpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSwgTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBMVk1fRkxPQVQgVGFyZ2V0X0Zsb2F0OwogICAgICAgICAgICAgLyogTm8gZHJvcCovCiAgICAgICAgICAgICBUYXJnZXRfRmxvYXQgPSBMVk1fTUFYRkxPQVQ7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sVGFyZ2V0X0Zsb2F0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwgVGFyZ2V0X0Zsb2F0KTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLCBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLCAxKTsKIAotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLFRhcmdldF9GbG9hdCk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sIFRhcmdldF9GbG9hdCk7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSwgTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgLyoKICAgICAgKiBVcGRhdGUgdGhlIGJhc3MgZW5oYW5jZW1lbnQKICAgICAgKi8KICAgICB7Ci0gICAgICAgIExWREJFX1JldHVyblN0YXR1c19lbiAgICAgICBEQkVfU3RhdHVzOwotICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAgICAgICAgREJFX1BhcmFtczsKLSAgICAgICAgTFZEQkVfSGFuZGxlX3QgICAgICAgICAgICAgICpoREJFSW5zdGFuY2UgPSAoTFZEQkVfSGFuZGxlX3QgKilwSW5zdGFuY2UtPmhEQkVJbnN0YW5jZTsKKyAgICAgICAgTFZEQkVfUmV0dXJuU3RhdHVzX2VuIERCRV9TdGF0dXM7CisgICAgICAgIExWREJFX1BhcmFtc190IERCRV9QYXJhbXM7CisgICAgICAgIExWREJFX0hhbmRsZV90KiBoREJFSW5zdGFuY2UgPSAoTFZEQkVfSGFuZGxlX3QqKXBJbnN0YW5jZS0+aERCRUluc3RhbmNlOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgbmV3IHBhcmFtZXRlcnMKICAgICAgICAgICovCi0gICAgICAgIGlmKExvY2FsUGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT0ZGKQotICAgICAgICB7CisgICAgICAgIGlmIChMb2NhbFBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09GRikgewogICAgICAgICAgICAgREJFX1BhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZEQkVfT0ZGOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgREJFX1BhcmFtcy5PcGVyYXRpbmdNb2RlID0gKExWREJFX01vZGVfZW4pTG9jYWxQYXJhbXMuQkVfT3BlcmF0aW5nTW9kZTsKICAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIERCRV9QYXJhbXMuT3BlcmF0aW5nTW9kZSAgICA9IChMVkRCRV9Nb2RlX2VuKUxvY2FsUGFyYW1zLkJFX09wZXJhdGluZ01vZGU7Ci0gICAgICAgIH0KLSAgICAgICAgREJFX1BhcmFtcy5TYW1wbGVSYXRlICAgICAgID0gKExWREJFX0ZzX2VuKUxvY2FsUGFyYW1zLlNhbXBsZVJhdGU7Ci0gICAgICAgIERCRV9QYXJhbXMuRWZmZWN0TGV2ZWwgICAgICA9IExvY2FsUGFyYW1zLkJFX0VmZmVjdExldmVsOwotICAgICAgICBEQkVfUGFyYW1zLkNlbnRyZUZyZXF1ZW5jeSAgPSAoTFZEQkVfQ2VudHJlRnJlcV9lbilMb2NhbFBhcmFtcy5CRV9DZW50cmVGcmVxOwotICAgICAgICBEQkVfUGFyYW1zLkhQRlNlbGVjdCAgICAgICAgPSAoTFZEQkVfRmlsdGVyU2VsZWN0X2VuKUxvY2FsUGFyYW1zLkJFX0hQRjsKLSAgICAgICAgREJFX1BhcmFtcy5IZWFkcm9vbWRCICAgICAgID0gMDsKLSAgICAgICAgREJFX1BhcmFtcy5Wb2x1bWVDb250cm9sICAgID0gTFZEQkVfVk9MVU1FX09GRjsKLSAgICAgICAgREJFX1BhcmFtcy5Wb2x1bWVkQiAgICAgICAgID0gMDsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgIERCRV9QYXJhbXMuTnJDaGFubmVscyAgICAgICAgID0gTG9jYWxQYXJhbXMuTnJDaGFubmVsczsKLSNlbmRpZgorICAgICAgICBEQkVfUGFyYW1zLlNhbXBsZVJhdGUgPSAoTFZEQkVfRnNfZW4pTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZTsKKyAgICAgICAgREJFX1BhcmFtcy5FZmZlY3RMZXZlbCA9IExvY2FsUGFyYW1zLkJFX0VmZmVjdExldmVsOworICAgICAgICBEQkVfUGFyYW1zLkNlbnRyZUZyZXF1ZW5jeSA9IChMVkRCRV9DZW50cmVGcmVxX2VuKUxvY2FsUGFyYW1zLkJFX0NlbnRyZUZyZXE7CisgICAgICAgIERCRV9QYXJhbXMuSFBGU2VsZWN0ID0gKExWREJFX0ZpbHRlclNlbGVjdF9lbilMb2NhbFBhcmFtcy5CRV9IUEY7CisgICAgICAgIERCRV9QYXJhbXMuSGVhZHJvb21kQiA9IDA7CisgICAgICAgIERCRV9QYXJhbXMuVm9sdW1lQ29udHJvbCA9IExWREJFX1ZPTFVNRV9PRkY7CisgICAgICAgIERCRV9QYXJhbXMuVm9sdW1lZEIgPSAwOworICAgICAgICBEQkVfUGFyYW1zLk5yQ2hhbm5lbHMgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIE1ha2UgdGhlIGNoYW5nZXMKICAgICAgICAgICovCi0gICAgICAgIERCRV9TdGF0dXMgPSBMVkRCRV9Db250cm9sKGhEQkVJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRCRV9QYXJhbXMpOworICAgICAgICBEQkVfU3RhdHVzID0gTFZEQkVfQ29udHJvbChoREJFSW5zdGFuY2UsICZEQkVfUGFyYW1zKTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBRdWl0IGlmIHRoZSBjaGFuZ2VzIHdlcmUgbm90IGFjY2VwdGVkCiAgICAgICAgICAqLwotICAgICAgICBpZiAoREJFX1N0YXR1cyAhPSBMVkRCRV9TVUNDRVNTKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pREJFX1N0YXR1cyk7CisgICAgICAgIGlmIChEQkVfU3RhdHVzICE9IExWREJFX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHJldHVybiAoKExWTV9SZXR1cm5TdGF0dXNfZW4pREJFX1N0YXR1cyk7CiAgICAgICAgIH0KIAogICAgICAgICAvKgpAQCAtNjY2LDE2OCArNTg1LDEzMiBAQAogICAgICAqIFVwZGF0ZSB0aGUgTi1CYW5kIEVxdWFsaXNlcgogICAgICAqLwogICAgIHsKLSAgICAgICAgTFZFUU5CX1JldHVyblN0YXR1c19lbiAgICAgIEVRTkJfU3RhdHVzOwotICAgICAgICBMVkVRTkJfUGFyYW1zX3QgICAgICAgICAgICAgRVFOQl9QYXJhbXM7Ci0gICAgICAgIExWRVFOQl9IYW5kbGVfdCAgICAgICAgICAgICAqaEVRTkJJbnN0YW5jZSA9IChMVkVRTkJfSGFuZGxlX3QgKilwSW5zdGFuY2UtPmhFUU5CSW5zdGFuY2U7CisgICAgICAgIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gRVFOQl9TdGF0dXM7CisgICAgICAgIExWRVFOQl9QYXJhbXNfdCBFUU5CX1BhcmFtczsKKyAgICAgICAgTFZFUU5CX0hhbmRsZV90KiBoRVFOQkluc3RhbmNlID0gKExWRVFOQl9IYW5kbGVfdCopcEluc3RhbmNlLT5oRVFOQkluc3RhbmNlOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgbmV3IHBhcmFtZXRlcnMKICAgICAgICAgICovCiAKLSAgICAgICAgaWYoTG9jYWxQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PRkYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVRTkJfUGFyYW1zLk9wZXJhdGluZ01vZGUgICAgPSBMVkVRTkJfQllQQVNTOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRVFOQl9QYXJhbXMuT3BlcmF0aW5nTW9kZSAgICA9IChMVkVRTkJfTW9kZV9lbilMb2NhbFBhcmFtcy5FUU5CX09wZXJhdGluZ01vZGU7CisgICAgICAgIGlmIChMb2NhbFBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09GRikgeworICAgICAgICAgICAgRVFOQl9QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWRVFOQl9CWVBBU1M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFUU5CX1BhcmFtcy5PcGVyYXRpbmdNb2RlID0gKExWRVFOQl9Nb2RlX2VuKUxvY2FsUGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZTsKICAgICAgICAgfQogCi0gICAgICAgIEVRTkJfUGFyYW1zLlNhbXBsZVJhdGUgICAgICAgPSAoTFZFUU5CX0ZzX2VuKUxvY2FsUGFyYW1zLlNhbXBsZVJhdGU7Ci0gICAgICAgIEVRTkJfUGFyYW1zLk5CYW5kcyAgICAgICAgICAgPSBMb2NhbFBhcmFtcy5FUU5CX05CYW5kczsKLSAgICAgICAgRVFOQl9QYXJhbXMucEJhbmREZWZpbml0aW9uICA9IChMVkVRTkJfQmFuZERlZl90ICopTG9jYWxQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb247Ci0gICAgICAgIGlmIChMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX1NURVJFTykgICAgLyogTW9ubyBmb3JtYXQgbm90IHN1cHBvcnRlZCAqLworICAgICAgICBFUU5CX1BhcmFtcy5TYW1wbGVSYXRlID0gKExWRVFOQl9Gc19lbilMb2NhbFBhcmFtcy5TYW1wbGVSYXRlOworICAgICAgICBFUU5CX1BhcmFtcy5OQmFuZHMgPSBMb2NhbFBhcmFtcy5FUU5CX05CYW5kczsKKyAgICAgICAgRVFOQl9QYXJhbXMucEJhbmREZWZpbml0aW9uID0gKExWRVFOQl9CYW5kRGVmX3QqKUxvY2FsUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uOworICAgICAgICBpZiAoTG9jYWxQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9TVEVSRU8pIC8qIE1vbm8gZm9ybWF0IG5vdCBzdXBwb3J0ZWQgKi8KICAgICAgICAgewogICAgICAgICAgICAgRVFOQl9QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZFUU5CX1NURVJFTzsKICAgICAgICAgfQotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgLyogTm90ZTogQ3VycmVudGx5IFNvdXJjZUZvcm1hdCBmaWVsZCBvZiBFUU5CIGlzIG5vdCBiZWVuCiAgICAgICAgICAqICAgICAgIHVzZWQgYnkgdGhlIG1vZHVsZS4KICAgICAgICAgICovCi0gICAgICAgIGVsc2UgaWYgKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTVVMVElDSEFOTkVMKQotICAgICAgICB7CisgICAgICAgIGVsc2UgaWYgKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTVVMVElDSEFOTkVMKSB7CiAgICAgICAgICAgICBFUU5CX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfTVVMVElDSEFOTkVMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRVFOQl9QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZFUU5CX01PTk9JTlNURVJFTzsgLyogRm9yY2UgdG8gTW9uby1pbi1TdGVyZW8gbW9kZSAqLwogICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBFUU5CX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfTU9OT0lOU1RFUkVPOyAgICAgLyogRm9yY2UgdG8gTW9uby1pbi1TdGVyZW8gbW9kZSAqLwotICAgICAgICB9Ci0jaWZkZWYgU1VQUE9SVF9NQwotICAgICAgICBFUU5CX1BhcmFtcy5OckNoYW5uZWxzICAgICAgICAgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOwotI2VuZGlmCisgICAgICAgIEVRTkJfUGFyYW1zLk5yQ2hhbm5lbHMgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgY29udHJvbCBmbGFnCiAgICAgICAgICAqLwogICAgICAgICBpZiAoKExvY2FsUGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pICYmCi0gICAgICAgICAgICAoTG9jYWxQYXJhbXMuRVFOQl9PcGVyYXRpbmdNb2RlID09IExWTV9FUU5CX09OKSkKLSAgICAgICAgeworICAgICAgICAgICAgKExvY2FsUGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSA9PSBMVk1fRVFOQl9PTikpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+RVFOQl9BY3RpdmUgPSBMVk1fVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEVRTkJfUGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkVRTkJfQllQQVNTOwogICAgICAgICB9CiAKICAgICAgICAgLyoKICAgICAgICAgICogTWFrZSB0aGUgY2hhbmdlcwogICAgICAgICAgKi8KLSAgICAgICAgRVFOQl9TdGF0dXMgPSBMVkVRTkJfQ29udHJvbChoRVFOQkluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFUU5CX1BhcmFtcyk7CisgICAgICAgIEVRTkJfU3RhdHVzID0gTFZFUU5CX0NvbnRyb2woaEVRTkJJbnN0YW5jZSwgJkVRTkJfUGFyYW1zKTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBRdWl0IGlmIHRoZSBjaGFuZ2VzIHdlcmUgbm90IGFjY2VwdGVkCiAgICAgICAgICAqLwotICAgICAgICBpZiAoRVFOQl9TdGF0dXMgIT0gTFZFUU5CX1NVQ0NFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbilFUU5CX1N0YXR1cyk7CisgICAgICAgIGlmIChFUU5CX1N0YXR1cyAhPSBMVkVRTkJfU1VDQ0VTUykgeworICAgICAgICAgICAgcmV0dXJuICgoTFZNX1JldHVyblN0YXR1c19lbilFUU5CX1N0YXR1cyk7CiAgICAgICAgIH0KLQogICAgIH0KIAogICAgIC8qCiAgICAgICogVXBkYXRlIGNvbmNlcnQgc291bmQKICAgICAgKi8KICAgICB7Ci0gICAgICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuICAgICAgICBDU19TdGF0dXM7Ci0gICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgICAgICAgICBDU19QYXJhbXM7Ci0gICAgICAgIExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgICAqaENTSW5zdGFuY2UgPSAoTFZDU19IYW5kbGVfdCAqKXBJbnN0YW5jZS0+aENTSW5zdGFuY2U7Ci0gICAgICAgIExWTV9Nb2RlX2VuICAgICAgICAgICAgICAgICBDb21wcmVzc29yTW9kZT1MVk1fTU9ERV9PTjsKKyAgICAgICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gQ1NfU3RhdHVzOworICAgICAgICBMVkNTX1BhcmFtc190IENTX1BhcmFtczsKKyAgICAgICAgTFZDU19IYW5kbGVfdCogaENTSW5zdGFuY2UgPSAoTFZDU19IYW5kbGVfdCopcEluc3RhbmNlLT5oQ1NJbnN0YW5jZTsKKyAgICAgICAgTFZNX01vZGVfZW4gQ29tcHJlc3Nvck1vZGUgPSBMVk1fTU9ERV9PTjsKIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIG5ldyBwYXJhbWV0ZXJzCiAgICAgICAgICAqLwotICAgICAgICBpZihMb2NhbFBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pCi0gICAgICAgIHsKLSAgICAgICAgICAgIENTX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZDU19PTjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIENTX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZDU19PRkY7CisgICAgICAgIGlmIChMb2NhbFBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pIHsKKyAgICAgICAgICAgIENTX1BhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZDU19PTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENTX1BhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZDU19PRkY7CiAgICAgICAgIH0KIAotICAgICAgICBpZigoTG9jYWxQYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSA9PSBMVk1fVEVfT04pICYmIChMb2NhbFBhcmFtcy5URV9FZmZlY3RMZXZlbCA9PSBMVk1fVEVfTE9XX01JUFMpKQotICAgICAgICB7Ci0gICAgICAgICAgICBDU19QYXJhbXMuU3BlYWtlclR5cGUgID0gTFZDU19FWF9IRUFEUEhPTkVTOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgQ1NfUGFyYW1zLlNwZWFrZXJUeXBlICA9IExWQ1NfSEVBRFBIT05FUzsKKyAgICAgICAgaWYgKChMb2NhbFBhcmFtcy5URV9PcGVyYXRpbmdNb2RlID09IExWTV9URV9PTikgJiYKKyAgICAgICAgICAgIChMb2NhbFBhcmFtcy5URV9FZmZlY3RMZXZlbCA9PSBMVk1fVEVfTE9XX01JUFMpKSB7CisgICAgICAgICAgICBDU19QYXJhbXMuU3BlYWtlclR5cGUgPSBMVkNTX0VYX0hFQURQSE9ORVM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDU19QYXJhbXMuU3BlYWtlclR5cGUgPSBMVkNTX0hFQURQSE9ORVM7CiAgICAgICAgIH0KIAotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgLyogQ29uY2VydCBzb3VuZCBtb2R1bGUgcHJvY2Vzc2VzIG9ubHkgdGhlIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzCiAgICAgICAgICAqIGRhdGEuIFNvIHRoZSBTb3VyY2UgRm9ybWF0IGlzIHNldCB0byBMVkNTX1NURVJFTyBmb3IgbXVsdGljaGFubmVsCiAgICAgICAgICAqIGlucHV0IGFsc28uCiAgICAgICAgICAqLwogICAgICAgICBpZiAoTG9jYWxQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9TVEVSRU8gfHwKLSAgICAgICAgICAgIExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTVVMVElDSEFOTkVMKQotI2Vsc2UKLSAgICAgICAgaWYgKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fU1RFUkVPKSAgICAvKiBNb25vIGZvcm1hdCBub3Qgc3VwcG9ydGVkICovCi0jZW5kaWYKLSAgICAgICAgeworICAgICAgICAgICAgTG9jYWxQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NVUxUSUNIQU5ORUwpIHsKICAgICAgICAgICAgIENTX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkNTX1NURVJFTzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENTX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkNTX01PTk9JTlNURVJFTzsgLyogRm9yY2UgdG8gTW9uby1pbi1TdGVyZW8gbW9kZSAqLwogICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgQ1NfUGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWQ1NfTU9OT0lOU1RFUkVPOyAgICAgICAgICAvKiBGb3JjZSB0byBNb25vLWluLVN0ZXJlbyBtb2RlICovCi0gICAgICAgIH0KLSAgICAgICAgQ1NfUGFyYW1zLlNhbXBsZVJhdGUgID0gTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZTsKKyAgICAgICAgQ1NfUGFyYW1zLlNhbXBsZVJhdGUgPSBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlOwogICAgICAgICBDU19QYXJhbXMuUmV2ZXJiTGV2ZWwgPSBMb2NhbFBhcmFtcy5WaXJ0dWFsaXplclJldmVyYkxldmVsOwogICAgICAgICBDU19QYXJhbXMuRWZmZWN0TGV2ZWwgPSBMb2NhbFBhcmFtcy5DU19FZmZlY3RMZXZlbDsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgIENTX1BhcmFtcy5OckNoYW5uZWxzICA9IExvY2FsUGFyYW1zLk5yQ2hhbm5lbHM7Ci0jZW5kaWYKKyAgICAgICAgQ1NfUGFyYW1zLk5yQ2hhbm5lbHMgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgY29udHJvbCBmbGFnCiAgICAgICAgICAqLwogICAgICAgICBpZiAoKChMVk1fTW9kZV9lbilMb2NhbFBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKSAmJgotICAgICAgICAgICAgKChMVkNTX01vZGVzX2VuKUxvY2FsUGFyYW1zLlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSAhPSBMVkNTX09GRikpCi0gICAgICAgIHsKKyAgICAgICAgICAgICgoTFZDU19Nb2Rlc19lbilMb2NhbFBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgIT0gTFZDU19PRkYpKSB7CiAgICAgICAgICAgICBwSW5zdGFuY2UtPkNTX0FjdGl2ZSA9IExWTV9UUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQ1NfUGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkNTX09GRjsKICAgICAgICAgfQogCi0gICAgICAgIENTX1BhcmFtcy5Db21wcmVzc29yTW9kZT1Db21wcmVzc29yTW9kZTsKKyAgICAgICAgQ1NfUGFyYW1zLkNvbXByZXNzb3JNb2RlID0gQ29tcHJlc3Nvck1vZGU7CiAKICAgICAgICAgLyoKICAgICAgICAgICogTWFrZSB0aGUgY2hhbmdlcwogICAgICAgICAgKi8KLSAgICAgICAgQ1NfU3RhdHVzID0gTFZDU19Db250cm9sKGhDU0luc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNTX1BhcmFtcyk7CisgICAgICAgIENTX1N0YXR1cyA9IExWQ1NfQ29udHJvbChoQ1NJbnN0YW5jZSwgJkNTX1BhcmFtcyk7CiAKICAgICAgICAgLyoKICAgICAgICAgICogUXVpdCBpZiB0aGUgY2hhbmdlcyB3ZXJlIG5vdCBhY2NlcHRlZAogICAgICAgICAgKi8KLSAgICAgICAgaWYgKENTX1N0YXR1cyAhPSBMVkNTX1NVQ0NFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbilDU19TdGF0dXMpOworICAgICAgICBpZiAoQ1NfU3RhdHVzICE9IExWQ1NfU1VDQ0VTUykgeworICAgICAgICAgICAgcmV0dXJuICgoTFZNX1JldHVyblN0YXR1c19lbilDU19TdGF0dXMpOwogICAgICAgICB9Ci0KICAgICB9CiAKICAgICAvKgogICAgICAqIFVwZGF0ZSB0aGUgUG93ZXIgU3BlY3RydW0gQW5hbHlzZXIKICAgICAgKi8KICAgICB7Ci0gICAgICAgIExWUFNBX1JFVFVSTiAgICAgICAgICAgICAgICBQU0FfU3RhdHVzOwotICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAgUFNBX1BhcmFtczsKLSAgICAgICAgcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgICpoUFNBSW5zdGFuY2UgPSAocExWUFNBX0hhbmRsZV90ICopcEluc3RhbmNlLT5oUFNBSW5zdGFuY2U7CisgICAgICAgIExWUFNBX1JFVFVSTiBQU0FfU3RhdHVzOworICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgUFNBX1BhcmFtczsKKyAgICAgICAgcExWUFNBX0hhbmRsZV90KiBoUFNBSW5zdGFuY2UgPSAocExWUFNBX0hhbmRsZV90KilwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIG5ldyBwYXJhbWV0ZXJzCkBAIC04MzgsMjMgKzcyMSwxOSBAQAogICAgICAgICAvKgogICAgICAgICAgKiBNYWtlIHRoZSBjaGFuZ2VzCiAgICAgICAgICAqLwotICAgICAgICBpZihwSW5zdGFuY2UtPkluc3RQYXJhbXMuUFNBX0luY2x1ZGVkPT1MVk1fUFNBX09OKQotICAgICAgICB7Ci0gICAgICAgICAgICBQU0FfU3RhdHVzID0gTFZQU0FfQ29udHJvbChoUFNBSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgJlBTQV9QYXJhbXMpOworICAgICAgICBpZiAocEluc3RhbmNlLT5JbnN0UGFyYW1zLlBTQV9JbmNsdWRlZCA9PSBMVk1fUFNBX09OKSB7CisgICAgICAgICAgICBQU0FfU3RhdHVzID0gTFZQU0FfQ29udHJvbChoUFNBSW5zdGFuY2UsICZQU0FfUGFyYW1zKTsKIAotICAgICAgICAgICAgaWYgKFBTQV9TdGF0dXMgIT0gTFZQU0FfT0spCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKVBTQV9TdGF0dXMpOworICAgICAgICAgICAgaWYgKFBTQV9TdGF0dXMgIT0gTFZQU0FfT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChMVk1fUmV0dXJuU3RhdHVzX2VuKVBTQV9TdGF0dXMpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQXBwbHkgbmV3IHNldHRpbmdzCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9BcHBseU5ld1NldHRpbmdzICgoTFZQU0FfSW5zdGFuY2VQcl90KiloUFNBSW5zdGFuY2UpOwotICAgICAgICAgICAgaWYoUFNBX1N0YXR1cyAhPSBMVlBTQV9PSykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pUFNBX1N0YXR1cyk7CisgICAgICAgICAgICBQU0FfU3RhdHVzID0gTFZQU0FfQXBwbHlOZXdTZXR0aW5ncygoTFZQU0FfSW5zdGFuY2VQcl90KiloUFNBSW5zdGFuY2UpOworICAgICAgICAgICAgaWYgKFBTQV9TdGF0dXMgIT0gTFZQU0FfT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChMVk1fUmV0dXJuU3RhdHVzX2VuKVBTQV9TdGF0dXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtODYzLDkgKzc0Miw5IEBACiAgICAgICogVXBkYXRlIHRoZSBwYXJhbWV0ZXJzIGFuZCBjbGVhciB0aGUgZmxhZwogICAgICAqLwogICAgIHBJbnN0YW5jZS0+Tm9TbW9vdGhWb2x1bWUgPSBMVk1fRkFMU0U7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMgPSAgTG9jYWxQYXJhbXM7CisgICAgcEluc3RhbmNlLT5QYXJhbXMgPSBMb2NhbFBhcmFtczsKIAotICAgIHJldHVybihMVk1fU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVk1fU1VDQ0VTUyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtODg3LDM2ICs3NjYsMzAgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1NldEhlYWRyb29tUGFyYW1zKExWTV9IYW5kbGVfdCAgICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgICAqcEhlYWRyb29tUGFyYW1zKQotewotICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgIGlpLCBOQmFuZHM7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRIZWFkcm9vbVBhcmFtcyhMVk1fSGFuZGxlX3QgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QqIHBIZWFkcm9vbVBhcmFtcykgeworICAgIExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKKyAgICBMVk1fVUlOVDE2IGlpLCBOQmFuZHM7CiAKICAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLwotICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEhlYWRyb29tUGFyYW1zID09IExWTV9OVUxMKSkKLSAgICB7CisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSGVhZHJvb21QYXJhbXMgPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKICAgICB9Ci0gICAgaWYgKChwSGVhZHJvb21QYXJhbXMtPk5IZWFkcm9vbUJhbmRzICE9IDApICYmIChwSGVhZHJvb21QYXJhbXMtPnBIZWFkcm9vbURlZmluaXRpb24gPT0gTFZNX05VTEwpKQotICAgIHsKKyAgICBpZiAoKHBIZWFkcm9vbVBhcmFtcy0+TkhlYWRyb29tQmFuZHMgIT0gMCkgJiYKKyAgICAgICAgKHBIZWFkcm9vbVBhcmFtcy0+cEhlYWRyb29tRGVmaW5pdGlvbiA9PSBMVk1fTlVMTCkpIHsKICAgICAgICAgcmV0dXJuIChMVk1fTlVMTEFERFJFU1MpOwogICAgIH0KIAogICAgIC8qIENvbnNpZGVyIG9ubHkgdGhlIExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTIGZpcnN0IGJhbmRzKi8KLSAgICBpZiAocEhlYWRyb29tUGFyYW1zLT5OSGVhZHJvb21CYW5kcyA+IExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTKQotICAgIHsKKyAgICBpZiAocEhlYWRyb29tUGFyYW1zLT5OSGVhZHJvb21CYW5kcyA+IExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTKSB7CiAgICAgICAgIE5CYW5kcyA9IExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTOwotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICAgIE5CYW5kcyA9IHBIZWFkcm9vbVBhcmFtcy0+TkhlYWRyb29tQmFuZHM7CiAgICAgfQogICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHMgPSBOQmFuZHM7CiAKICAgICAvKiBDb3B5IHNldHRpbmdzIGluIG1lbW9yeSAqLwotICAgIGZvcihpaSA9IDA7IGlpIDwgTkJhbmRzOyBpaSsrKQotICAgIHsKKyAgICBmb3IgKGlpID0gMDsgaWkgPCBOQmFuZHM7IGlpKyspIHsKICAgICAgICAgcEluc3RhbmNlLT5wSGVhZHJvb21fQmFuZERlZnNbaWldID0gcEhlYWRyb29tUGFyYW1zLT5wSGVhZHJvb21EZWZpbml0aW9uW2lpXTsKICAgICB9CiAKQEAgLTkyNCw3ICs3OTcsNyBAQAogICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuSGVhZHJvb21fT3BlcmF0aW5nTW9kZSA9IHBIZWFkcm9vbVBhcmFtcy0+SGVhZHJvb21fT3BlcmF0aW5nTW9kZTsKICAgICBwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID0gTFZNX1RSVUU7CiAKLSAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZNX1NVQ0NFU1MpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTk0NywyOSArODIwLDI2IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRIZWFkcm9vbVBhcmFtcyhMVk1fSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICpwSGVhZHJvb21QYXJhbXMpCi17Ci0gICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlID0oTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9VSU5UMTYgICAgICAgICAgaWk7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRIZWFkcm9vbVBhcmFtcyhMVk1fSGFuZGxlX3QgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QqIHBIZWFkcm9vbVBhcmFtcykgeworICAgIExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKKyAgICBMVk1fVUlOVDE2IGlpOwogCiAgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KLSAgICBpZiAoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBIZWFkcm9vbVBhcmFtcyA9PSBMVk1fTlVMTCkpCi0gICAgeworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEhlYWRyb29tUGFyYW1zID09IExWTV9OVUxMKSkgewogICAgICAgICByZXR1cm4gKExWTV9OVUxMQUREUkVTUyk7CiAgICAgfQogCiAgICAgcEhlYWRyb29tUGFyYW1zLT5OSGVhZHJvb21CYW5kcyA9IHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHM7CiAKICAgICAvKiBDb3B5IHNldHRpbmdzIGluIG1lbW9yeSAqLwotICAgIGZvcihpaSA9IDA7IGlpIDwgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kczsgaWkrKykKLSAgICB7CisgICAgZm9yIChpaSA9IDA7IGlpIDwgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kczsgaWkrKykgewogICAgICAgICBwSW5zdGFuY2UtPnBIZWFkcm9vbV9Vc2VyRGVmc1tpaV0gPSBwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmc1tpaV07CiAgICAgfQogCiAgICAgcEhlYWRyb29tUGFyYW1zLT5wSGVhZHJvb21EZWZpbml0aW9uID0gcEluc3RhbmNlLT5wSGVhZHJvb21fVXNlckRlZnM7CiAgICAgcEhlYWRyb29tUGFyYW1zLT5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlID0gcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlOwotICAgIHJldHVybihMVk1fU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVk1fU1VDQ0VTUyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTg4LDE4ICs4NTgsMTQgQEAKIC8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWTV9JTlQzMiBMVk1fQWxnb0NhbGxCYWNrKCB2b2lkICAgICAgICAgICpwQnVuZGxlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgY2FsbGJhY2tJZCkKLXsKLSAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKilwQnVuZGxlSGFuZGxlOworTFZNX0lOVDMyIExWTV9BbGdvQ2FsbEJhY2sodm9pZCogcEJ1bmRsZUhhbmRsZSwgdm9pZCogcERhdGEsIExWTV9JTlQxNiBjYWxsYmFja0lkKSB7CisgICAgTFZNX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCopcEJ1bmRsZUhhbmRsZTsKIAotICAgICh2b2lkKSBwRGF0YTsKKyAgICAodm9pZClwRGF0YTsKIAotICAgIHN3aXRjaChjYWxsYmFja0lkICYgMHhGRjAwKXsKKyAgICBzd2l0Y2ggKGNhbGxiYWNrSWQgJiAweEZGMDApIHsKICAgICAgICAgY2FzZSBBTEdPUklUSE1fQ1NfSUQ6Ci0gICAgICAgICAgICBzd2l0Y2goY2FsbGJhY2tJZCAmIDB4MDBGRikKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoY2FsbGJhY2tJZCAmIDB4MDBGRikgewogICAgICAgICAgICAgICAgIGNhc2UgTFZDU19FVkVOVF9BTEdPRkY6CiAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q1NfQWN0aXZlID0gTFZNX0ZBTFNFOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEwMDgsOCArODc0LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFMR09SSVRITV9FUU5CX0lEOgotICAgICAgICAgICAgc3dpdGNoKGNhbGxiYWNrSWQgJiAweDAwRkYpCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKGNhbGxiYWNrSWQgJiAweDAwRkYpIHsKICAgICAgICAgICAgICAgICBjYXNlIExWRVFOQl9FVkVOVF9BTEdPRkY6CiAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+RVFOQl9BY3RpdmUgPSBMVk1fRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTA0MCwyMSArOTA1LDE3IEBACiAvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fSU5UMzIgICAgTFZNX1ZDQ2FsbEJhY2sodm9pZCogICBwQnVuZGxlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgcEdlbmVyYWxQdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICAgQ2FsbEJhY2tQYXJhbSkKLXsKLSAgICBMVk1fSW5zdGFuY2VfdCAqcEluc3RhbmNlID0oTFZNX0luc3RhbmNlX3QgICopcEJ1bmRsZUhhbmRsZTsKLSAgICBMVk1fRkxPQVQgICAgVGFyZ2V0OworTFZNX0lOVDMyIExWTV9WQ0NhbGxCYWNrKHZvaWQqIHBCdW5kbGVIYW5kbGUsIHZvaWQqIHBHZW5lcmFsUHVycG9zZSwgc2hvcnQgQ2FsbEJhY2tQYXJhbSkgeworICAgIExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKXBCdW5kbGVIYW5kbGU7CisgICAgTFZNX0ZMT0FUIFRhcmdldDsKIAotICAgICh2b2lkKSBwR2VuZXJhbFB1cnBvc2U7Ci0gICAgKHZvaWQpIENhbGxCYWNrUGFyYW07CisgICAgKHZvaWQpcEdlbmVyYWxQdXJwb3NlOworICAgICh2b2lkKUNhbGxCYWNrUGFyYW07CiAKICAgICAvKiBXaGVuIHZvbHVtZSBtaXhlciBoYXMgcmVhY2hlZCAwIGRCIHRhcmdldCB0aGVuIHN0b3AgaXQgdG8gYXZvaWQKICAgICAgICB1bm5lY2Vzc2FyeSBwcm9jZXNzaW5nLiAqLwogICAgIFRhcmdldCA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdKTsKLSAgICBpZihUYXJnZXQgPT0gMS4wZikKLSAgICB7CisgICAgaWYgKFRhcmdldCA9PSAxLjBmKSB7CiAgICAgICAgIHBJbnN0YW5jZS0+VkNfQWN0aXZlID0gTFZNX0ZBTFNFOwogICAgIH0KICAgICByZXR1cm4gMTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmNwcAppbmRleCA1NjIwNTI5Li4xMmI4NmYzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuY3BwCkBAIC0yMCw1NzggKzIwLDk1IEBACiAvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8c3RkbGliLmg+CiAKICNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkxWTV9UYWJsZXMuaCIKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCi0jaW5jbHVkZSAiSW5zdEFsbG9jLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0dldE1lbW9yeVRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KLS8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLwotLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLwotLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KLS8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIFdoZW4gb25lIG9mIHBNZW1vcnlUYWJsZSBvciBwSW5zdFBhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICovCi0vKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIEluc3RhbmNlIHBhcmFtZXRlcnMgYXJlIG91dCBvZiByYW5nZSAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAyLiAgVGhlIHNjcmF0Y2ggbWVtb3J5IGlzIHRoZSBsYXJnZXN0IHJlcXVpcmVkIGJ5IGFueSBvZiB0aGUgc3ViLW1vZHVsZXMgcGx1cyBhbnkgICAqLwotLyogICAgICBhZGRpdGlvbmFsIHNjcmF0Y2ggcmVxdWlyZW1lbnRzIG9mIHRoZSBidW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogNCBUeXBlcyBvZiBNZW1vcnkgUmVnaW9ucyBvZiBMVk0KLSAqIFRPRE86IEFsbG9jYXRlIG9uIHRoZSBmbHkuCi0gKiBpKSAgIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEEgLSBGb3IgSW5zdGFuY2UgSGFuZGxlcwotICogaWkpICBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBIC0gUGVyc2lzdGVudCBCdWZmZXJzCi0gKiBpaWkpIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUYgLSBGb3IgSG9sZGluZyBTdHJ1Y3R1cmUgdmFsdWVzCi0gKiBpdikgIExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QgICAgICAgLSBGb3IgSG9sZGluZyBTdHJ1Y3R1cmUgdmFsdWVzCi0gKgotICogTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQToKLSAqICAgVG90YWwgTWVtb3J5IHNpemU6Ci0gKiAgICAgc2l6ZW9mKExWTV9JbnN0YW5jZV90KSArIFwKLSAqICAgICBzaXplb2YoTFZNX0J1ZmZlcl90KSArIFwKLSAqICAgICBzaXplb2YoTFZQU0FfSW5zdGFuY2VQcl90KSArIFwKLSAqICAgICBzaXplb2YoTFZNX0J1ZmZlcl90KSAtIG5lZWRlZCBpZiBidWZmZXIgbW9kZSBpcyBMVk1fTUFOQUdFRF9CVUZGRVIKLSAqCi0gKiBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBOgotICogICBUb3RhbCBNZW1vcnkgc2l6ZToKLSAqICAgICBzaXplb2YoTFZNX1RFX0RhdGFfdCkgKyBcCi0gKiAgICAgMiAqIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWTV9FUU5CX0JhbmREZWZfdCkgKyBcCi0gKiAgICAgc2l6ZW9mKExWQ1NfRGF0YV90KSArIFwKLSAqICAgICBzaXplb2YoTFZEQkVfRGF0YV9GTE9BVF90KSArIFwKLSAqICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpICsgXAotICogICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkgKyBcCi0gKiAgICAgcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpICsgXAotICogICAgIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpICsgXAotICogICAgIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWRVFOQl9CaXF1YWRUeXBlX2VuKSArIFwKLSAqICAgICAyICogTFZNX0hFQURST09NX01BWF9OQkFORFMgKiBzaXplb2YoTFZNX0hlYWRyb29tQmFuZERlZl90KSArIFwKLSAqICAgICBQU0FfSW5pdFBhcmFtcy5uQmFuZHMgKiBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QpICsgXAotICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihRUERfVGFwc190KQotICoKLSAqIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUY6Ci0gKiAgIFRvdGFsIE1lbW9yeSBzaXplOgotICogICAgIHNpemVvZihMVk1fVEVfQ29lZnNfdCkgKyBcCi0gKiAgICAgc2l6ZW9mKExWQ1NfQ29lZmZpY2llbnRfdCkgKyBcCi0gKiAgICAgc2l6ZW9mKExWREJFX0NvZWZfRkxPQVRfdCkgKyBcCi0gKiAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSArIFwKLSAqICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpICsgXAotICogICAgIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSArIFwKLSAqICAgICBQU0FfSW5pdFBhcmFtcy5uQmFuZHMgKiBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpICsgXAotICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihRUERfU3RhdGVfdCkKLSAqCi0gKiBMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUIChTY3JhdGNoKToKLSAqICAgVG90YWwgTWVtb3J5IFNpemU6Ci0gKiAgICAgQnVuZGxlU2NyYXRjaFNpemUgKyBcCi0gKiAgICAgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSAqIHNpemVvZihMVk1fRkxPQVQpICsgXAotICogICAgIE1heFNjcmF0Y2hPZiAoQ1MsIEVRTkIsIERCRSwgUFNBKQotICoKLSAqICAgICBhKUJ1bmRsZVNjcmF0Y2hTaXplOgotICogICAgICAgICAzICogTFZNX01BWF9DSEFOTkVMUyBcCi0gKiAgICAgICAgICogKE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKyBJbnRlcm5hbEJsb2NrU2l6ZSkgKiBzaXplb2YoTFZNX0ZMT0FUKQotICogICAgICAgVGhpcyBNZW1vcnkgaXMgYWxsb2NhdGVkIG9ubHkgd2hlbiBCdWZmZXIgbW9kZSBpcyBMVk1fTUFOQUdFRF9CVUZGRVIuCi0gKiAgICAgYilNYXhTY3JhdGNoT2YgKENTLCBFUU5CLCBEQkUsIFBTQSkKLSAqICAgICAgIFRoaXMgTWVtb3J5IGlzIG5lZWRlZCBmb3Igc2NyYXRjaCB1c2FnZSBmb3IgQ1MsIEVRTkIsIERCRSwgUFNBLgotICogICAgICAgQ1MgICA9IChMVkNTX1NDUkFUQ0hCVUZGRVJTICogc2l6ZW9mKExWTV9GTE9BVCkKLSAqICAgICAgICAgICAgICAgKiBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpCi0gKiAgICAgICBFUU5CID0gKExWRVFOQl9TQ1JBVENIQlVGRkVSUyAqIHNpemVvZihMVk1fRkxPQVQpCi0gKiAgICAgICAgICAgICAgICogcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKQotICogICAgICAgREJFICA9IChMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFKnNpemVvZihMVk1fRkxPQVQpCi0gKiAgICAgICAgICAgICAgICogcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKQotICogICAgICAgUFNBICA9ICgyICogcEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplICogc2l6ZW9mKExWTV9GTE9BVCkpCi0gKiAgICAgICAgICAgICAgb25lIE1heElucHV0QmxvY2tTaXplIGZvciBpbnB1dCBhbmQgYW5vdGhlciBmb3IgZmlsdGVyIG91dHB1dAotICogICAgIGMpTUFYX0lOVEVSTkFMX0JMT0NLU0laRQotICogICAgICAgVGhpcyBNZW1vcnkgaXMgbmVlZGVkIGZvciBQU0FJbnB1dCAtIFRlbXAgbWVtb3J5IHRvIHN0b3JlIG91dHB1dAotICogICAgICAgZnJvbSBNY1RvTW9ubyBibG9jayBhbmQgZ2l2ZW4gYXMgaW5wdXQgdG8gUFNBIGJsb2NrCi0gKi8KLQotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0TWVtb3J5VGFibGUoTFZNX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01lbVRhYl90ICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JbnN0UGFyYW1zX3QgICAgICpwSW5zdFBhcmFtcykKLXsKLQotICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKLSAgICBMVk1fVUlOVDMyICAgICAgICAgIEFsZ1NjcmF0Y2hTaXplOwotICAgIExWTV9VSU5UMzIgICAgICAgICAgQnVuZGxlU2NyYXRjaFNpemU7Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICBJbnRlcm5hbEJsb2NrU2l6ZTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgIEFsbG9jTWVtW0xWTV9OUl9NRU1PUllfUkVHSU9OU107Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICBpOwotCi0gICAgLyoKLSAgICAgKiBDaGVjayBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgaWYocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybiBtZW1vcnkgdGFibGUgaWYgdGhlIGluc3RhbmNlIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZAotICAgICAqLwotICAgIGlmIChoSW5zdGFuY2UgIT0gTFZNX05VTEwpCi0gICAgewotICAgICAgIC8qIFJlYWQgYmFjayBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLwotICAgICAgICAqcE1lbW9yeVRhYmxlID0gcEluc3RhbmNlLT5NZW1vcnlUYWJsZTsKLSAgICAgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKLSAgICB9Ci0KLSAgICBpZihwSW5zdFBhcmFtcyA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgUG93ZXIgU3BlY3RydW0gQW5hbHlzZXIKLSAgICAgKi8KLSAgICBpZihwSW5zdFBhcmFtcy0+UFNBX0luY2x1ZGVkID4gTFZNX1BTQV9PTikKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ2hlY2sgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMKLSAgICAgKi8KLSAgICBpZiggKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlICE9IExWTV9NQU5BR0VEX0JVRkZFUlMpICYmIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSAhPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlMpICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwotICAgIH0KLQotICAgIC8qIE4tQmFuZCBFcXVhbGl6ZXIgKi8KLSAgICBpZiggcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgPiAzMiApCi0gICAgewotICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKLSAgICB9Ci0KLSAgICBpZihwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQotICAgIHsKLSAgICAgICAgaWYoIChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplIDwgTFZNX01JTl9NQVhCTE9DS1NJWkUgKSB8fCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA+IExWTV9NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA8IExWTV9NSU5fTUFYQkxPQ0tTSVpFICkgfHwgKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPiBMVk1fVU5NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICogSW5pdGlhbGlzZSB0aGUgQWxsb2NNZW0gc3RydWN0dXJlcwotICAgICovCi0gICAgZm9yIChpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspCi0gICAgewotICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW1baV0sIExWTV9OVUxMKTsKLSAgICB9Ci0gICAgSW50ZXJuYWxCbG9ja1NpemUgPSAoTFZNX1VJTlQxNikoKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUpICYgTUlOX0lOVEVSTkFMX0JMT0NLTUFTSyk7IC8qIEZvcmNlIHRvIGEgbXVsdGlwbGUgb2YgTUlOX0lOVEVSTkFMX0JMT0NLU0laRSAqLwotCi0gICAgaWYgKEludGVybmFsQmxvY2tTaXplIDwgTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkKLSAgICB7Ci0gICAgICAgIEludGVybmFsQmxvY2tTaXplID0gTUlOX0lOVEVSTkFMX0JMT0NLU0laRTsKLSAgICB9Ci0KLSAgICAvKiBNYXhpbXVtIEludGVybmFsIEJsYWNrIFNpemUgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYW4gTUFYX0lOVEVSTkFMX0JMT0NLU0laRSovCi0gICAgaWYoSW50ZXJuYWxCbG9ja1NpemUgPiBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFKQotICAgIHsKLSAgICAgICAgSW50ZXJuYWxCbG9ja1NpemUgPSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBCdW5kbGUgcmVxdWlyZW1lbnRzCi0gICAgKi8KLSAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgc2l6ZW9mKExWTV9JbnN0YW5jZV90KSk7Ci0KLSAgICAvKgotICAgICAqIFNldCB0aGUgYWxnb3JpdGhtIGFuZCBidW5kbGUgc2NyYXRjaCByZXF1aXJlbWVudHMKLSAgICAgKi8KLSAgICBBbGdTY3JhdGNoU2l6ZSAgICA9IDA7Ci0gICAgaWYgKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpCi0gICAgewotICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSA9IDMgKiBMVk1fTUFYX0NIQU5ORUxTIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICsgSW50ZXJuYWxCbG9ja1NpemUpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihMVk1fRkxPQVQpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwgICAgICAgIC8qIFNjcmF0Y2ggYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlU2NyYXRjaFNpemUpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0J1ZmZlcl90KSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUcmVibGUgRW5oYW5jZW1lbnQgcmVxdWlyZW1lbnRzCi0gICAgICovCi0gICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX1RFX0RhdGFfdCkpOwotICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9URV9Db2Vmc190KSk7Ci0KLSAgICAvKgotICAgICAqIE4tQmFuZCBFcXVhbGl6ZXIgcmVxdWlyZW1lbnRzCi0gICAgICovCi0gICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sICAgICAgLyogTG9jYWwgc3RvcmFnZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWTV9FUU5CX0JhbmREZWZfdCkpKTsKLSAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwgICAgICAvKiBVc2VyIHN0b3JhZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcyAqIHNpemVvZihMVk1fRVFOQl9CYW5kRGVmX3QpKSk7Ci0KLSAgICAvKgotICAgICAqIENvbmNlcnQgU291bmQgcmVxdWlyZW1lbnRzCi0gICAgICovCi0gICAgewotICAgICAgICBMVkNTX01lbVRhYl90ICAgICAgICAgICBDU19NZW1UYWI7Ci0gICAgICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgICAgIENTX0NhcGFiaWxpdGllczsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTZXQgdGhlIGNhcGFiaWxpdGllcwotICAgICAgICAgKi8KLSAgICAgICAgQ1NfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICAgPSBJbnRlcm5hbEJsb2NrU2l6ZTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMKLSAgICAgICAgICovCi0gICAgICAgIExWQ1NfTWVtb3J5KExWTV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAmQ1NfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAmQ1NfQ2FwYWJpbGl0aWVzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBVcGRhdGUgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHN0cnVjdHVyZXMKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSk7Ci0gICAgICAgIGlmIChDU19NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgPiBBbGdTY3JhdGNoU2l6ZSkgQWxnU2NyYXRjaFNpemUgPSBDU19NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemU7Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCByZXF1aXJlbWVudHMKLSAgICAgKi8KLSAgICB7Ci0gICAgICAgIExWREJFX01lbVRhYl90ICAgICAgICAgIERCRV9NZW1UYWI7Ci0gICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgIERCRV9DYXBhYmlsaXRpZXM7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2V0IHRoZSBjYXBhYmlsaXRpZXMKLSAgICAgICAgICovCi0gICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU184ODIwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE3NjQwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKLSAgICAgICAgREJFX0NhcGFiaWxpdGllcy5DZW50cmVGcmVxdWVuY3kgPSBMVkRCRV9DQVBfQ0VOVFJFXzU1SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzU1SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzY2SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzc4SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzkwSHo7Ci0gICAgICAgIERCRV9DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplICAgID0gSW50ZXJuYWxCbG9ja1NpemU7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzCi0gICAgICAgICAqLwotICAgICAgICBMVkRCRV9NZW1vcnkoTFZNX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICZEQkVfTWVtVGFiLAotCi0gICAgICAgICAgICAgICAgICAgICZEQkVfQ2FwYWJpbGl0aWVzKTsKLSAgICAgICAgLyoKLSAgICAgICAgICogVXBkYXRlIHRoZSBidW5kbGUgdGFibGUKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKLSAgICAgICAgaWYgKERCRV9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgPiBBbGdTY3JhdGNoU2l6ZSkgQWxnU2NyYXRjaFNpemUgPSBEQkVfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplOwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBOLUJhbmQgZXF1YWxpc2VyIHJlcXVpcmVtZW50cwotICAgICAqLwotICAgIHsKLSAgICAgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgRVFOQl9NZW1UYWI7ICAgICAgICAgICAgLyogRm9yIE4tQmFuZCBFcXVhbGlzZXIgKi8KLSAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgRVFOQl9DYXBhYmlsaXRpZXM7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2V0IHRoZSBjYXBhYmlsaXRpZXMKLSAgICAgICAgICovCi0gICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU184ODIwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfOTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE3NjQwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMTkyMDAwOwotICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfQ0FQX1NURVJFTyB8IExWRVFOQl9DQVBfTU9OT0lOU1RFUkVPOwotICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgPSBJbnRlcm5hbEJsb2NrU2l6ZTsKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmFuZHMgICAgID0gcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHM7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzCi0gICAgICAgICAqLwotICAgICAgICBMVkVRTkJfTWVtb3J5KExWTV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICZFUU5CX01lbVRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9DYXBhYmlsaXRpZXMpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFVwZGF0ZSB0aGUgYnVuZGxlIHRhYmxlCi0gICAgICAgICAqLwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVRTkJfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKLSAgICAgICAgaWYgKEVRTkJfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplID4gQWxnU2NyYXRjaFNpemUpIEFsZ1NjcmF0Y2hTaXplID0gRVFOQl9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemU7Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEhlYWRyb29tIG1hbmFnZW1lbnQgbWVtb3J5IGFsbG9jYXRpb24KLSAgICAgKi8KLSAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTICogc2l6ZW9mKExWTV9IZWFkcm9vbUJhbmREZWZfdCkpKTsKLSAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTICogc2l6ZW9mKExWTV9IZWFkcm9vbUJhbmREZWZfdCkpKTsKLQotICAgIC8qCi0gICAgICogU3BlY3RydW0gQW5hbHl6ZXIgbWVtb3J5IHJlcXVpcmVtZW50cwotICAgICAqLwotICAgIHsKLSAgICAgICAgcExWUFNBX0hhbmRsZV90ICAgICBoUFNBSW5zdCA9IExWTV9OVUxMOwotICAgICAgICBMVlBTQV9NZW1UYWJfdCAgICAgIFBTQV9NZW1UYWI7Ci0gICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgUFNBX0luaXRQYXJhbXM7Ci0gICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgRmlsdGVyc1BhcmFtc1s5XTsKLSAgICAgICAgTFZQU0FfUkVUVVJOICAgICAgICBQU0FfU3RhdHVzOwotCi0gICAgICAgIGlmKHBJbnN0UGFyYW1zLT5QU0FfSW5jbHVkZWQgPT0gTFZNX1BTQV9PTikKLSAgICAgICAgewotICAgICAgICAgICAgUFNBX0luaXRQYXJhbXMuU3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gICA9IChMVk1fVUlOVDE2KSA1MDA7Ci0gICAgICAgICAgICBQU0FfSW5pdFBhcmFtcy5NYXhJbnB1dEJsb2NrU2l6ZSAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDEwMDA7Ci0gICAgICAgICAgICBQU0FfSW5pdFBhcmFtcy5uQmFuZHMgICAgICAgICAgICAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDk7Ci0KLSAgICAgICAgICAgIFBTQV9Jbml0UGFyYW1zLnBGaWx0ZXJzUGFyYW1zID0gJkZpbHRlcnNQYXJhbXNbMF07Ci0gICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBQU0FfSW5pdFBhcmFtcy5uQmFuZHM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWx0ZXJzUGFyYW1zW2ldLkNlbnRlckZyZXF1ZW5jeSAgICA9IChMVk1fVUlOVDE2KSAxMDAwOwotICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uUUZhY3RvciAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDI1OwotICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uUG9zdEdhaW4gICAgICAgICAgID0gKExWTV9JTlQxNikgIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cwotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9NZW1vcnkgKGhQU0FJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfSW5pdFBhcmFtcyk7Ci0KLSAgICAgICAgICAgIGlmIChQU0FfU3RhdHVzICE9IExWUFNBX09LKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbikgTFZNX0FMR09SSVRITVBTQSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIFVwZGF0ZSB0aGUgYnVuZGxlIHRhYmxlCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogU2xvdyBEYXRhICovCi0gICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpOwotCi0gICAgICAgICAgICAvKiBGYXN0IERhdGEgKi8KLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7Ci0KLSAgICAgICAgICAgIC8qIEZhc3QgQ29lZiAqLwotICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCi0gICAgICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKLQotICAgICAgICAgICAgLyogRmFzdCBUZW1wb3JhcnkgKi8KLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9URU1QT1JBUllfRkFTVF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgKiBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0KLSAgICAgICAgICAgIGlmIChQU0FfTWVtVGFiLlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlNpemUgPiBBbGdTY3JhdGNoU2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBbGdTY3JhdGNoU2l6ZSA9IFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogUmV0dXJuIHRoZSBtZW1vcnkgdGFibGUKLSAgICAgKi8KLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdKTsKLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEE7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdKTsKLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEE7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0gICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUgPCA0KQotICAgIHsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSA9IDA7Ci0gICAgfQotCi0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSk7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGOwotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplIDwgNCkKLSAgICB7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUgPSAwOwotICAgIH0KLQotICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLAotICAgICAgICAgICAgICAgICAgICAgICAgQWxnU2NyYXRjaFNpemUpOwotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgICAgICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdKTsKLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5UeXBlICAgICAgICAgICAgID0gTFZNX1RFTVBPUkFSWV9GQVNUOwotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgPSBMVk1fTlVMTDsKLSAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSA8IDQpCi0gICAgewotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOwotCi19CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0dldEluc3RhbmNlSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIGJ1bmRsZSBpbnN0YW5jZS4gSXQgcmV0dXJucyB0aGUgY3JlYXRlZCBpbnN0YW5jZSAgKi8KLS8qICBoYW5kbGUgdGhyb3VnaCBwaEluc3RhbmNlLiBBbGwgcGFyYW1ldGVycyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQsIGluYWN0aXZlIHN0YXRlLiAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBidW5kbGUgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWxsIHBhcmFtZXRlcnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0LCBpbmFjdGl2ZSBzdGF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBJbnN0UGFyYW1zICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIE9uZSBvciBtb3JlIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIEluc3RhbmNlIHBhcmFtZXRlcnMgYXJlIG91dCBvZiByYW5nZSAgICAgICAgKi8KLS8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgICBXaGVuIG9uZSBvZiBwaEluc3RhbmNlLCBwTWVtb3J5VGFibGUgb3IgcEluc3RQYXJhbXMgYXJlIE5VTEwqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAxLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0SW5zdGFuY2VIYW5kbGUoTFZNX0hhbmRsZV90ICAgICAgICAgICAqcGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NZW1UYWJfdCAgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JbnN0UGFyYW1zX3QgICAgICAgKnBJbnN0UGFyYW1zKQotewotCi0gICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgU3RhdHVzID0gTFZNX1NVQ0NFU1M7Ci0gICAgTFZNX0luc3RhbmNlX3QgICAgICAgICAgKnBJbnN0YW5jZTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICBBbGxvY01lbVtMVk1fTlJfTUVNT1JZX1JFR0lPTlNdOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIGk7Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgSW50ZXJuYWxCbG9ja1NpemU7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQnVuZGxlU2NyYXRjaFNpemU7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRJbnN0YW5jZUhhbmRsZShMVk1fSGFuZGxlX3QqIHBoSW5zdGFuY2UsIExWTV9JbnN0UGFyYW1zX3QqIHBJbnN0UGFyYW1zKSB7CisgICAgTFZNX1JldHVyblN0YXR1c19lbiBTdGF0dXMgPSBMVk1fU1VDQ0VTUzsKKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlOworICAgIExWTV9JTlQxNiBpOworICAgIExWTV9VSU5UMTYgSW50ZXJuYWxCbG9ja1NpemU7CisgICAgTFZNX0lOVDMyIEJ1bmRsZVNjcmF0Y2hTaXplOwogCiAgICAgLyoKICAgICAgKiBDaGVjayB2YWxpZCBwb2ludHMgaGF2ZSBiZWVuIGdpdmVuCiAgICAgICovCi0gICAgaWYgKChwaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKSB8fCAocEluc3RQYXJhbXMgPT0gTFZNX05VTEwpKQotICAgIHsKKyAgICBpZiAoKHBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5zdFBhcmFtcyA9PSBMVk1fTlVMTCkpIHsKICAgICAgICAgcmV0dXJuIChMVk1fTlVMTEFERFJFU1MpOwogICAgIH0KIAogICAgIC8qCi0gICAgICogQ2hlY2sgdGhlIG1lbW9yeSB0YWJsZSBmb3IgTlVMTCBwb2ludGVycwotICAgICAqLwotICAgIGZvciAoaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5TaXplICE9IDApICYmCi0gICAgICAgICAgICAocE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzPT1MVk1fTlVMTCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybihMVk1fTlVMTEFERFJFU1MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKICAgICAgKiBDaGVjayB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycwogICAgICAqLwotICAgIGlmKCAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgIT0gTFZNX01BTkFHRURfQlVGRkVSUykgJiYgKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlICE9IExWTV9VTk1BTkFHRURfQlVGRkVSUykgKQotICAgIHsKKyAgICBpZiAoKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlICE9IExWTV9NQU5BR0VEX0JVRkZFUlMpICYmCisgICAgICAgIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSAhPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlMpKSB7CiAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwogICAgIH0KIAotICAgIGlmKCBwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcyA+IDMyICkKLSAgICB7CisgICAgaWYgKHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzID4gMzIpIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQogCi0gICAgaWYocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKLSAgICB7Ci0gICAgICAgIGlmKCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA8IExWTV9NSU5fTUFYQkxPQ0tTSVpFICkgfHwgKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPiBMVk1fTUFOQUdFRF9NQVhfTUFYQkxPQ0tTSVpFICkgKQotICAgICAgICB7CisgICAgaWYgKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpIHsKKyAgICAgICAgaWYgKChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplIDwgTFZNX01JTl9NQVhCTE9DS1NJWkUpIHx8CisgICAgICAgICAgICAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA+IExWTV9NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUpKSB7CiAgICAgICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKICAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiggKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPCBMVk1fTUlOX01BWEJMT0NLU0laRSApIHx8IChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplID4gTFZNX1VOTUFOQUdFRF9NQVhfTUFYQkxPQ0tTSVpFKSApCi0gICAgICAgIHsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPCBMVk1fTUlOX01BWEJMT0NLU0laRSkgfHwKKyAgICAgICAgICAgIChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplID4gTFZNX1VOTUFOQUdFRF9NQVhfTUFYQkxPQ0tTSVpFKSkgewogICAgICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZihwSW5zdFBhcmFtcy0+UFNBX0luY2x1ZGVkID4gTFZNX1BTQV9PTikKLSAgICB7CisgICAgaWYgKHBJbnN0UGFyYW1zLT5QU0FfSW5jbHVkZWQgPiBMVk1fUFNBX09OKSB7CiAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwogICAgIH0KIAogICAgIC8qCi0gICAgICogSW5pdGlhbGlzZSB0aGUgQWxsb2NNZW0gc3RydWN0dXJlcworICAgICAqIENyZWF0ZSB0aGUgaW5zdGFuY2UgaGFuZGxlCiAgICAgICovCi0gICAgZm9yIChpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspCi0gICAgewotICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW1baV0sCi0gICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgfQorICAgICpwaEluc3RhbmNlID0gbmV3IExWTV9JbnN0YW5jZV90e307CisgICAgcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90KikqcGhJbnN0YW5jZTsKKworICAgIHBJbnN0YW5jZS0+SW5zdFBhcmFtcyA9ICpwSW5zdFBhcmFtczsKIAogICAgIC8qCi0gICAgICogU2V0IHRoZSBpbnN0YW5jZSBoYW5kbGUKKyAgICAgKiBDcmVhdGUgdGhlIGJ1bmRsZSBzY3JhdGNoIG1lbW9yeSBhbmQgaW5pdGlhbHNlIHRoZSBidWZmZXIgbWFuYWdlbWVudAogICAgICAqLwotICAgICpwaEluc3RhbmNlICA9IChMVk1fSGFuZGxlX3QpSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fSW5zdGFuY2VfdCkpOwotICAgIHBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKSpwaEluc3RhbmNlOwotCi0gICAgLyoKLSAgICAgKiBTYXZlIHRoZSBtZW1vcnkgdGFibGUsIHBhcmFtZXRlcnMgYW5kIGNhcGFiaWxpdGllcwotICAgICAqLwotICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUgICAgPSAqcE1lbW9yeVRhYmxlOwotICAgIHBJbnN0YW5jZS0+SW5zdFBhcmFtcyAgICAgPSAqcEluc3RQYXJhbXM7Ci0KLSAgICAvKgotICAgICAqIFNldCB0aGUgYnVuZGxlIHNjcmF0Y2ggbWVtb3J5IGFuZCBpbml0aWFsc2UgdGhlIGJ1ZmZlciBtYW5hZ2VtZW50Ci0gICAgICovCi0gICAgSW50ZXJuYWxCbG9ja1NpemUgPSAoTFZNX1VJTlQxNikoKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUpICYgTUlOX0lOVEVSTkFMX0JMT0NLTUFTSyk7IC8qIEZvcmNlIHRvIGEgbXVsdGlwbGUgb2YgTUlOX0lOVEVSTkFMX0JMT0NLU0laRSAqLwotICAgIGlmIChJbnRlcm5hbEJsb2NrU2l6ZSA8IE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUpCi0gICAgeworICAgIEludGVybmFsQmxvY2tTaXplID0gKExWTV9VSU5UMTYpKAorICAgICAgICAgICAgKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUpICYKKyAgICAgICAgICAgIE1JTl9JTlRFUk5BTF9CTE9DS01BU0spOyAvKiBGb3JjZSB0byBhIG11bHRpcGxlIG9mIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKi8KKyAgICBpZiAoSW50ZXJuYWxCbG9ja1NpemUgPCBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKSB7CiAgICAgICAgIEludGVybmFsQmxvY2tTaXplID0gTUlOX0lOVEVSTkFMX0JMT0NLU0laRTsKICAgICB9CiAKICAgICAvKiBNYXhpbXVtIEludGVybmFsIEJsYWNrIFNpemUgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYW4gTUFYX0lOVEVSTkFMX0JMT0NLU0laRSovCi0gICAgaWYoSW50ZXJuYWxCbG9ja1NpemUgPiBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFKQotICAgIHsKKyAgICBpZiAoSW50ZXJuYWxCbG9ja1NpemUgPiBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFKSB7CiAgICAgICAgIEludGVybmFsQmxvY2tTaXplID0gTUFYX0lOVEVSTkFMX0JMT0NLU0laRTsKICAgICB9CiAgICAgcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZSA9IChMVk1fSU5UMTYpSW50ZXJuYWxCbG9ja1NpemU7CkBAIC01OTksNDAgKzExNiw0NiBAQAogICAgIC8qCiAgICAgICogQ29tbW9uIHNldHRpbmdzIGZvciBtYW5hZ2VkIGFuZCB1bm1hbmFnZWQgYnVmZmVycwogICAgICAqLwotICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IDA7ICAgICAgICAgICAgICAgIC8qIE5vIHNhbXBsZXMgbGVmdCB0byBwcm9jZXNzICovCi0gICAgaWYgKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpCi0gICAgeworICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IDA7IC8qIE5vIHNhbXBsZXMgbGVmdCB0byBwcm9jZXNzICovCisgICAgQnVuZGxlU2NyYXRjaFNpemUgPQorICAgICAgICAgICAgKExWTV9JTlQzMikoMyAqIExWTV9NQVhfQ0hBTk5FTFMgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSAqCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgcEluc3RhbmNlLT5wU2NyYXRjaCA9IGNhbGxvYygxLCBCdW5kbGVTY3JhdGNoU2l6ZSk7CisgICAgaWYgKHBJbnN0YW5jZS0+cFNjcmF0Y2ggPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICBpZiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykgewogICAgICAgICAvKgogICAgICAgICAgKiBNYW5hZ2VkIGJ1ZmZlcnMgcmVxdWlyZWQKICAgICAgICAgICovCi0gICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQgPSAoTFZNX0J1ZmZlcl90ICopCi0gICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9CdWZmZXJfdCkpOwotICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSA9IChMVk1fSU5UMzIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMgKiBMVk1fTUFYX0NIQU5ORUxTIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKExWTV9GTE9BVCkpOwotICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5wU2NyYXRjaCA9IChMVk1fRkxPQVQgKikKLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLCAvKiBTY3JhdGNoIDEgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKUJ1bmRsZVNjcmF0Y2hTaXplKTsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopJnBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkluRGVsYXlCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShMVk1fTUFYX0NIQU5ORUxTICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkpOwotICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5JbkRlbGF5U2FtcGxlcyA9IE1JTl9JTlRFUk5BTF9CTE9DS1NJWkU7IC8qIFNldCB0aGUgbnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KLSAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+T3V0RGVsYXlTYW1wbGVzID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBObyBzYW1wbGVzIGluIHRoZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkJ1ZmZlclN0YXRlID0gTFZNX0ZJUlNUQ0FMTDsgICAgICAgICAgICAgLyogU2V0IHRoZSBzdGF0ZSByZWFkeSBmb3IgdGhlIGZpcnN0IGNhbGwgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudCA9CisgICAgICAgICAgICAgICAgKExWTV9CdWZmZXJfdCopY2FsbG9jKDEsIHNpemVvZigqKHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQpKSk7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50ID09IExWTV9OVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOworICAgICAgICB9CisKKyAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+cFNjcmF0Y2ggPSAoTFZNX0ZMT0FUKilwSW5zdGFuY2UtPnBTY3JhdGNoOworCisgICAgICAgIG1lbXNldChwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5JbkRlbGF5QnVmZmVyLCAwLAorICAgICAgICAgICAgICAgIExWTV9NQVhfQ0hBTk5FTFMgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICoKKyAgICAgICAgICAgICAgICBzaXplb2YocEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+SW5EZWxheUJ1ZmZlclswXSkpOworICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5JbkRlbGF5U2FtcGxlcyA9CisgICAgICAgICAgICAgICAgTUlOX0lOVEVSTkFMX0JMT0NLU0laRTsgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgbnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+T3V0RGVsYXlTYW1wbGVzID0gMDsgLyogTm8gc2FtcGxlcyBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5CdWZmZXJTdGF0ZSA9CisgICAgICAgICAgICAgICAgTFZNX0ZJUlNUQ0FMTDsgLyogU2V0IHRoZSBzdGF0ZSByZWFkeSBmb3IgdGhlIGZpcnN0IGNhbGwgKi8KICAgICB9CiAKICAgICAvKgogICAgICAqIFNldCBkZWZhdWx0IHBhcmFtZXRlcnMKICAgICAgKi8KLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZNX01PREVfT0ZGOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgICAgICAgPSBMVk1fRlNfODAwMDsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgICAgID0gTFZNX01PTk87Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgICAgICA9IExWTV9IRUFEUEhPTkVTOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZDX0VmZmVjdExldmVsICAgPSAwOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZDX0JhbGFuY2UgICAgICAgPSAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PRkY7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSA9IExWTV9GU184MDAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWTV9NT05POworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlID0gTFZNX0hFQURQSE9ORVM7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuVkNfRWZmZWN0TGV2ZWwgPSAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZDX0JhbGFuY2UgPSAwOwogCiAgICAgLyoKICAgICAgKiBTZXQgY2FsbGJhY2sKQEAgLTY0MiwzMzggKzE2NSwyNTcgQEAKICAgICAvKgogICAgICAqIERDIHJlbW92YWwgZmlsdGVyCiAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKLSNlbHNlCi0gICAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOwotI2VuZGlmCiAKICAgICAvKgogICAgICAqIFRyZWJsZSBFbmhhbmNlbWVudAogICAgICAqLwotICAgIHBJbnN0YW5jZS0+cFRFX1RhcHMgID0gKExWTV9URV9EYXRhX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX1RFX0RhdGFfdCkpOwotCi0gICAgcEluc3RhbmNlLT5wVEVfU3RhdGUgPSAoTFZNX1RFX0NvZWZzX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9URV9Db2Vmc190KSk7CiAgICAgcEluc3RhbmNlLT5QYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSA9IExWTV9URV9PRkY7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuVEVfRWZmZWN0TGV2ZWwgICA9IDA7Ci0gICAgcEluc3RhbmNlLT5URV9BY3RpdmUgICAgICAgICAgICAgICA9IExWTV9GQUxTRTsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5URV9FZmZlY3RMZXZlbCA9IDA7CisgICAgcEluc3RhbmNlLT5URV9BY3RpdmUgPSBMVk1fRkFMU0U7CiAKICAgICAvKgogICAgICAqIFNldCB0aGUgdm9sdW1lIGNvbnRyb2wgYW5kIGluaXRpYWxpc2UgQ3VycmVudCB0byBUYXJnZXQKICAgICAgKi8KLSAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICAgICAgPSAwOwotICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ICAgICAgICA9IDA7Ci0gICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlICAgID0gcEluc3RhbmNlOwotICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9WQ0NhbGxCYWNrOworICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gPSAwOworICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgPSBwSW5zdGFuY2U7CisgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrID0gTFZNX1ZDQ2FsbEJhY2s7CiAKLSAgICAvKiBJbiBtYW5hZ2VkIGJ1ZmZlcmluZywgc3RhcnQgd2l0aCBsb3cgc2lnbmFsIGxldmVsIGFzIGRlbGF5IGluIGJ1ZmZlciBtYW5hZ2VtZW50IGNhdXNlcyBhIGNsaWNrKi8KLSAgICBpZiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKLSAgICB7CisgICAgLyogSW4gbWFuYWdlZCBidWZmZXJpbmcsIHN0YXJ0IHdpdGggbG93IHNpZ25hbCBsZXZlbCBhcyBkZWxheSBpbiBidWZmZXIgbWFuYWdlbWVudCBjYXVzZXMgYQorICAgICAqIGNsaWNrKi8KKyAgICBpZiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykgewogICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sIDAsIDApOwotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwgTFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVQpOwogICAgIH0KIAotICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLDAsTFZNX0ZTXzgwMDAsMik7CisgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sIDAsIExWTV9GU184MDAwLCAyKTsKIAotICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lZEIgICAgICAgICAgICAgICAgICA9IDA7Ci0gICAgcEluc3RhbmNlLT5WQ19BVkxGaXhlZFZvbHVtZSAgICAgICAgICAgID0gMDsKLSAgICBwSW5zdGFuY2UtPlZDX0FjdGl2ZSAgICAgICAgICAgICAgICAgICAgPSBMVk1fRkFMU0U7CisgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWVkQiA9IDA7CisgICAgcEluc3RhbmNlLT5WQ19BVkxGaXhlZFZvbHVtZSA9IDA7CisgICAgcEluc3RhbmNlLT5WQ19BY3RpdmUgPSBMVk1fRkFMU0U7CiAKLSAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKLSAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMDsKLSAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlICAgID0gcEluc3RhbmNlOwotICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fVkNDYWxsQmFjazsKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSA9IDA7CisgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlID0gcEluc3RhbmNlOworICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgPSBMVk1fVkNDYWxsQmFjazsKICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLCBMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVCk7Ci0gICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLExWTV9WQ19NSVhFUl9USU1FLExWTV9GU184MDAwLDIpOworICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwgTFZNX1ZDX01JWEVSX1RJTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRlNfODAwMCwgMik7CiAKLSAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKLSAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMDsKLSAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlICAgID0gcEluc3RhbmNlOwotICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fVkNDYWxsQmFjazsKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSA9IDA7CisgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlID0gcEluc3RhbmNlOworICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgPSBMVk1fVkNDYWxsQmFjazsKICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLCBMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVCk7Ci0gICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9WQ19NSVhFUl9USU1FLExWTV9GU184MDAwLDIpOworICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwgTFZNX1ZDX01JWEVSX1RJTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRlNfODAwMCwgMik7CiAKICAgICAvKgotICAgICAqIFNldCB0aGUgZGVmYXVsdCBFUU5CIHByZS1nYWluIGFuZCBwb2ludGVyIHRvIHRoZSBiYW5kIGRlZmluaXRpb25zCisgICAgICogQ3JlYXRlIHRoZSBkZWZhdWx0IEVRTkIgcHJlLWdhaW4gYW5kIHBvaW50ZXIgdG8gdGhlIGJhbmQgZGVmaW5pdGlvbnMKICAgICAgKi8KLSAgICBwSW5zdGFuY2UtPnBFUU5CX0JhbmREZWZzID0KLSAgICAgICAgKExWTV9FUU5CX0JhbmREZWZfdCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZNX0VRTkJfQmFuZERlZl90KSkpOwotICAgIHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnMgPQotICAgICAgICAoTFZNX0VRTkJfQmFuZERlZl90ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcyAqIHNpemVvZihMVk1fRVFOQl9CYW5kRGVmX3QpKSk7CisgICAgcEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmcyA9IChMVk1fRVFOQl9CYW5kRGVmX3QqKWNhbGxvYyhwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqKHBJbnN0YW5jZS0+cEVRTkJfQmFuZERlZnMpKSk7CisgICAgaWYgKHBJbnN0YW5jZS0+cEVRTkJfQmFuZERlZnMgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKKyAgICB9CisgICAgcEluc3RhbmNlLT5wRVFOQl9Vc2VyRGVmcyA9IChMVk1fRVFOQl9CYW5kRGVmX3QqKWNhbGxvYyhwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqKHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnMpKSk7CisgICAgaWYgKHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnMgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKKyAgICB9CiAKICAgICAvKgogICAgICAqIEluaXRpYWxpc2UgdGhlIENvbmNlcnQgU291bmQgbW9kdWxlCiAgICAgICovCiAgICAgewotICAgICAgICBMVkNTX0hhbmRsZV90ICAgICAgICAgICBoQ1NJbnN0YW5jZTsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgIExWQ1NfTWVtVGFiX3QgICAgICAgICAgIENTX01lbVRhYjsgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KLSAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAgQ1NfQ2FwYWJpbGl0aWVzOyAgICAgICAgICAgIC8qIEluaXRpYWwgY2FwYWJpbGl0aWVzICovCi0gICAgICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuICAgIExWQ1NfU3RhdHVzOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgICAgICBMVkNTX0hhbmRsZV90IGhDU0luc3RhbmNlOyAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgQ1NfQ2FwYWJpbGl0aWVzOyAvKiBJbml0aWFsIGNhcGFiaWxpdGllcyAqLworICAgICAgICBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1N0YXR1czsgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgZGVmYXVsdCBwYXJhbWV0ZXJzCiAgICAgICAgICAqLwotICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5WaXJ0dWFsaXplclJldmVyYkxldmVsICAgID0gMTAwOwotICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5WaXJ0dWFsaXplclR5cGUgICAgICAgICAgID0gTFZNX0NPTkNFUlRTT1VORDsKLSAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlICA9IExWTV9NT0RFX09GRjsKLSAgICAgICAgcEluc3RhbmNlLT5DU19BY3RpdmUgICAgICAgICAgICAgICAgICAgICAgICA9IExWTV9GQUxTRTsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuVmlydHVhbGl6ZXJSZXZlcmJMZXZlbCA9IDEwMDsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuVmlydHVhbGl6ZXJUeXBlID0gTFZNX0NPTkNFUlRTT1VORDsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT0ZGOworICAgICAgICBwSW5zdGFuY2UtPkNTX0FjdGl2ZSA9IExWTV9GQUxTRTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KLSAgICAgICAgQ1NfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICA9IChMVk1fVUlOVDE2KUludGVybmFsQmxvY2tTaXplOworICAgICAgICBDU19DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplID0gKExWTV9VSU5UMTYpSW50ZXJuYWxCbG9ja1NpemU7CiAgICAgICAgIENTX0NhcGFiaWxpdGllcy5DYWxsQmFjayA9IHBJbnN0YW5jZS0+Q2FsbEJhY2s7CiAgICAgICAgIENTX0NhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UgPSAodm9pZCopcEluc3RhbmNlOwogCiAgICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgdGhlbiBzZXQgdGhlIGFkZHJlc3MgcG9pbnRlcnMsIGZvcmNpbmcgYWxpZ25tZW50Ci0gICAgICAgICAqLwotICAgICAgICBMVkNTX1N0YXR1cyA9IExWQ1NfTWVtb3J5KExWTV9OVUxMLCAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ1NfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19DYXBhYmlsaXRpZXMpOwotICAgICAgICBDU19NZW1UYWIuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MgPSAmcEluc3RhbmNlLT5DU19JbnN0YW5jZTsKLSAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpOwotICAgICAgICBDU19NZW1UYWIuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSk7Ci0gICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLQotICAgICAgICAvKgogICAgICAgICAgKiBJbml0aWFsaXNlIHRoZSBDb25jZXJ0IFNvdW5kIGluc3RhbmNlIGFuZCBzYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUKICAgICAgICAgICovCi0gICAgICAgIGhDU0luc3RhbmNlID0gTFZNX05VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0byBOVUxMIHRvIHJldHVybiBoYW5kbGUgKi8KLSAgICAgICAgTFZDU19TdGF0dXMgPSBMVkNTX0luaXQoJmhDU0luc3RhbmNlLCAgICAgICAgICAgICAgLyogSW5pdGlhaWxzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ1NfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ1NfQ2FwYWJpbGl0aWVzKTsKLSAgICAgICAgaWYgKExWQ1NfU3RhdHVzICE9IExWQ1NfU1VDQ0VTUykgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWQ1NfU3RhdHVzKTsKLSAgICAgICAgcEluc3RhbmNlLT5oQ1NJbnN0YW5jZSA9IGhDU0luc3RhbmNlOyAgICAgICAgICAgICAgLyogU2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlICovCi0KKyAgICAgICAgaENTSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAgICAgICAgICAgICAvKiBTZXQgdG8gTlVMTCB0byByZXR1cm4gaGFuZGxlICovCisgICAgICAgIExWQ1NfU3RhdHVzID0gTFZDU19Jbml0KCZoQ1NJbnN0YW5jZSwgLyogQ3JlYXRlIGFuZCBpbml0aWFpbHNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19DYXBhYmlsaXRpZXMsIHBJbnN0YW5jZS0+cFNjcmF0Y2gpOworICAgICAgICBpZiAoTFZDU19TdGF0dXMgIT0gTFZDU19TVUNDRVNTKSByZXR1cm4gKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWQ1NfU3RhdHVzKTsKKyAgICAgICAgcEluc3RhbmNlLT5oQ1NJbnN0YW5jZSA9IGhDU0luc3RhbmNlOyAvKiBTYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KICAgICB9CiAKICAgICAvKgogICAgICAqIEluaXRpYWxpc2UgdGhlIEJhc3MgRW5oYW5jZW1lbnQgbW9kdWxlCiAgICAgICovCiAgICAgewotICAgICAgICBMVkRCRV9IYW5kbGVfdCAgICAgICAgICBoREJFSW5zdGFuY2U7ICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgIExWREJFX01lbVRhYl90ICAgICAgICAgIERCRV9NZW1UYWI7ICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KLSAgICAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgICAgREJFX0NhcGFiaWxpdGllczsgICAgICAgICAgIC8qIEluaXRpYWwgY2FwYWJpbGl0aWVzICovCi0gICAgICAgIExWREJFX1JldHVyblN0YXR1c19lbiAgIExWREJFX1N0YXR1czsgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgICAgICBMVkRCRV9IYW5kbGVfdCBoREJFSW5zdGFuY2U7ICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgREJFX0NhcGFiaWxpdGllczsgLyogSW5pdGlhbCBjYXBhYmlsaXRpZXMgKi8KKyAgICAgICAgTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1N0YXR1czsgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMKICAgICAgICAgICovCiAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkJFX09wZXJhdGluZ01vZGUgPSBMVk1fQkVfT0ZGOwotICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5CRV9DZW50cmVGcmVxICAgID0gTFZNX0JFX0NFTlRSRV81NUh6OwotICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5CRV9FZmZlY3RMZXZlbCAgID0gMDsKLSAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuQkVfSFBGICAgICAgICAgICA9IExWTV9CRV9IUEZfT0ZGOworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5CRV9DZW50cmVGcmVxID0gTFZNX0JFX0NFTlRSRV81NUh6OworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5CRV9FZmZlY3RMZXZlbCA9IDA7CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkJFX0hQRiA9IExWTV9CRV9IUEZfT0ZGOwogCi0gICAgICAgIHBJbnN0YW5jZS0+REJFX0FjdGl2ZSAgICAgICAgICAgICAgPSBMVk1fRkFMU0U7CisgICAgICAgIHBJbnN0YW5jZS0+REJFX0FjdGl2ZSA9IExWTV9GQUxTRTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KLSAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzg4MjAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfOTYwMDAgfCBMVkRCRV9DQVBfRlNfMTc2NDAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMTkyMDAwOwotICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLkNlbnRyZUZyZXF1ZW5jeSA9IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNjZIeiB8IExWREJFX0NBUF9DRU5UUkVfNzhIeiB8IExWREJFX0NBUF9DRU5UUkVfOTBIejsKLSAgICAgICAgREJFX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgICAgPSAoTFZNX1VJTlQxNilJbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfCBMVkRCRV9DQVBfRlNfMTIwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMTYwMDAgfCBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfCBMVkRCRV9DQVBfRlNfNDgwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfODgyMDAgfCBMVkRCRV9DQVBfRlNfOTYwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMTc2NDAwIHwgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKIAotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kIHRoZW4gc2V0IHRoZSBhZGRyZXNzIHBvaW50ZXJzCi0gICAgICAgICAqLwotICAgICAgICBMVkRCRV9TdGF0dXMgPSBMVkRCRV9NZW1vcnkoTFZNX05VTEwsICAgICAgICAgICAgICAgLyogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmREJFX01lbVRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEQkVfQ2FwYWJpbGl0aWVzKTsKLSAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MgICAgICAgID0gJnBJbnN0YW5jZS0+REJFX0luc3RhbmNlOwotICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSk7Ci0gICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplKTsKLSAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzcyAgICAgICAgID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLkNlbnRyZUZyZXF1ZW5jeSA9IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0NFTlRSRV82Nkh6IHwgTFZEQkVfQ0FQX0NFTlRSRV83OEh6IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfQ0VOVFJFXzkwSHo7CisgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplID0gKExWTV9VSU5UMTYpSW50ZXJuYWxCbG9ja1NpemU7CiAKICAgICAgICAgLyoKICAgICAgICAgICogSW5pdGlhbGlzZSB0aGUgRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGluc3RhbmNlIGFuZCBzYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUKICAgICAgICAgICovCi0gICAgICAgIGhEQkVJbnN0YW5jZSA9IExWTV9OVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdG8gTlVMTCB0byByZXR1cm4gaGFuZGxlICovCi0gICAgICAgIExWREJFX1N0YXR1cyA9IExWREJFX0luaXQoJmhEQkVJbnN0YW5jZSwgICAgICAgICAgICAvKiBJbml0aWFpbHNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRCRV9NZW1UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRCRV9DYXBhYmlsaXRpZXMpOwotICAgICAgICBpZiAoTFZEQkVfU3RhdHVzICE9IExWREJFX1NVQ0NFU1MpIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbilMVkRCRV9TdGF0dXMpOwotICAgICAgICBwSW5zdGFuY2UtPmhEQkVJbnN0YW5jZSA9IGhEQkVJbnN0YW5jZTsgICAgICAgICAgICAgLyogU2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgIGhEQkVJbnN0YW5jZSA9IExWTV9OVUxMOyAgICAgICAgICAgICAgICAgLyogU2V0IHRvIE5VTEwgdG8gcmV0dXJuIGhhbmRsZSAqLworICAgICAgICBMVkRCRV9TdGF0dXMgPSBMVkRCRV9Jbml0KCZoREJFSW5zdGFuY2UsIC8qIENyZWF0ZSBhbmQgaW5pdGlhaWxzZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEQkVfQ2FwYWJpbGl0aWVzLCBwSW5zdGFuY2UtPnBTY3JhdGNoKTsKKyAgICAgICAgaWYgKExWREJFX1N0YXR1cyAhPSBMVkRCRV9TVUNDRVNTKSByZXR1cm4gKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWREJFX1N0YXR1cyk7CisgICAgICAgIHBJbnN0YW5jZS0+aERCRUluc3RhbmNlID0gaERCRUluc3RhbmNlOyAvKiBTYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KICAgICB9CiAKICAgICAvKgogICAgICAqIEluaXRpYWxpc2UgdGhlIE4tQmFuZCBFcXVhbGlzZXIgbW9kdWxlCiAgICAgICovCiAgICAgewotICAgICAgICBMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgaEVRTkJJbnN0YW5jZTsgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgIExWRVFOQl9NZW1UYWJfdCAgICAgICAgICBFUU5CX01lbVRhYjsgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KLSAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgIEVRTkJfQ2FwYWJpbGl0aWVzOyAgICAgICAgIC8qIEluaXRpYWwgY2FwYWJpbGl0aWVzICovCi0gICAgICAgIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gICBMVkVRTkJfU3RhdHVzOyAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgICAgICBMVkVRTkJfSGFuZGxlX3QgaEVRTkJJbnN0YW5jZTsgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgRVFOQl9DYXBhYmlsaXRpZXM7IC8qIEluaXRpYWwgY2FwYWJpbGl0aWVzICovCisgICAgICAgIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1N0YXR1czsgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMKICAgICAgICAgICovCi0gICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSAgID0gTFZNX0VRTkJfT0ZGOwotICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5FUU5CX05CYW5kcyAgICAgICAgICA9IDA7CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSA9IExWTV9FUU5CX09GRjsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuRVFOQl9OQmFuZHMgPSAwOwogICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9IExWTV9OVUxMOwotICAgICAgICBwSW5zdGFuY2UtPkVRTkJfQWN0aXZlICAgICAgICAgICAgICAgICA9IExWTV9GQUxTRTsKKyAgICAgICAgcEluc3RhbmNlLT5FUU5CX0FjdGl2ZSA9IExWTV9GQUxTRTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfNDgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzg4MjAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU185NjAwMCB8IExWRVFOQl9DQVBfRlNfMTc2NDAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18xOTIwMDA7Ci0gICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICA9IChMVk1fVUlOVDE2KUludGVybmFsQmxvY2tTaXplOwotICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCYW5kcyAgICAgICAgPSBwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kczsKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU291cmNlRm9ybWF0ICAgID0gTFZFUU5CX0NBUF9TVEVSRU8gfCBMVkVRTkJfQ0FQX01PTk9JTlNURVJFTzsKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuQ2FsbEJhY2sgICAgICAgID0gcEluc3RhbmNlLT5DYWxsQmFjazsKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMucEJ1bmRsZUluc3RhbmNlICA9ICh2b2lkKilwSW5zdGFuY2U7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgPQorICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwKKyAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfAorICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwgTFZFUU5CX0NBUF9GU180ODAwMCB8CisgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU184ODIwMCB8IExWRVFOQl9DQVBfRlNfOTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE3NjQwMCB8CisgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18xOTIwMDA7CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCB0aGVuIHNldCB0aGUgYWRkcmVzcyBwb2ludGVycywgZm9yY2luZyBhbGlnbm1lbnQKLSAgICAgICAgICovCi0gICAgICAgIExWRVFOQl9TdGF0dXMgPSBMVkVRTkJfTWVtb3J5KExWTV9OVUxMLCAgICAgICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkVRTkJfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9DYXBhYmlsaXRpZXMpOwotICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzICAgICAgICA9ICZwSW5zdGFuY2UtPkVRTkJfSW5zdGFuY2U7Ci0gICAgICAgIEVRTkJfTWVtVGFiLlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplKTsKLSAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUpOwotICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgICAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgPSAoTFZNX1VJTlQxNilJbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmFuZHMgPSBwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kczsKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU291cmNlRm9ybWF0ID0gTFZFUU5CX0NBUF9TVEVSRU8gfCBMVkVRTkJfQ0FQX01PTk9JTlNURVJFTzsKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuQ2FsbEJhY2sgPSBwSW5zdGFuY2UtPkNhbGxCYWNrOworICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UgPSAodm9pZCopcEluc3RhbmNlOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIEluaXRpYWxpc2UgdGhlIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCBpbnN0YW5jZSBhbmQgc2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlCiAgICAgICAgICAqLwotICAgICAgICBoRVFOQkluc3RhbmNlID0gTFZNX05VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRvIE5VTEwgdG8gcmV0dXJuIGhhbmRsZSAqLwotICAgICAgICBMVkVRTkJfU3RhdHVzID0gTFZFUU5CX0luaXQoJmhFUU5CSW5zdGFuY2UsICAgICAgICAgLyogSW5pdGlhaWxzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkVRTkJfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkVRTkJfQ2FwYWJpbGl0aWVzKTsKLSAgICAgICAgaWYgKExWRVFOQl9TdGF0dXMgIT0gTFZFUU5CX1NVQ0NFU1MpIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbilMVkVRTkJfU3RhdHVzKTsKLSAgICAgICAgcEluc3RhbmNlLT5oRVFOQkluc3RhbmNlID0gaEVRTkJJbnN0YW5jZTsgICAgICAgICAgIC8qIFNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICBoRVFOQkluc3RhbmNlID0gTFZNX05VTEw7ICAgICAgICAgICAgICAgICAgIC8qIFNldCB0byBOVUxMIHRvIHJldHVybiBoYW5kbGUgKi8KKyAgICAgICAgTFZFUU5CX1N0YXR1cyA9IExWRVFOQl9Jbml0KCZoRVFOQkluc3RhbmNlLCAvKiBDcmVhdGUgYW5kIGluaXRpYWlsc2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFUU5CX0NhcGFiaWxpdGllcywgcEluc3RhbmNlLT5wU2NyYXRjaCk7CisgICAgICAgIGlmIChMVkVRTkJfU3RhdHVzICE9IExWRVFOQl9TVUNDRVNTKSByZXR1cm4gKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWRVFOQl9TdGF0dXMpOworICAgICAgICBwSW5zdGFuY2UtPmhFUU5CSW5zdGFuY2UgPSBoRVFOQkluc3RhbmNlOyAvKiBTYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KICAgICB9CiAKICAgICAvKgogICAgICAqIEhlYWRyb29tIG1hbmFnZW1lbnQgbWVtb3J5IGFsbG9jYXRpb24KICAgICAgKi8KICAgICB7Ci0gICAgICAgIHBJbnN0YW5jZS0+cEhlYWRyb29tX0JhbmREZWZzID0gKExWTV9IZWFkcm9vbUJhbmREZWZfdCAqKQotICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpKSk7Ci0gICAgICAgIHBJbnN0YW5jZS0+cEhlYWRyb29tX1VzZXJEZWZzID0gKExWTV9IZWFkcm9vbUJhbmREZWZfdCAqKQotICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpKSk7CisgICAgICAgIHBJbnN0YW5jZS0+cEhlYWRyb29tX0JhbmREZWZzID0gKExWTV9IZWFkcm9vbUJhbmREZWZfdCopY2FsbG9jKAorICAgICAgICAgICAgICAgIExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTLCBzaXplb2YoKihwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmcykpKTsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+cEhlYWRyb29tX0JhbmREZWZzID09IExWTV9OVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOworICAgICAgICB9CisgICAgICAgIHBJbnN0YW5jZS0+cEhlYWRyb29tX1VzZXJEZWZzID0gKExWTV9IZWFkcm9vbUJhbmREZWZfdCopY2FsbG9jKAorICAgICAgICAgICAgICAgIExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTLCBzaXplb2YoKihwSW5zdGFuY2UtPnBIZWFkcm9vbV9Vc2VyRGVmcykpKTsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+cEhlYWRyb29tX1VzZXJEZWZzID09IExWTV9OVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOworICAgICAgICB9CiAKICAgICAgICAgLyogSGVhZHJvb20gbWFuYWdlbWVudCBwYXJhbWV0ZXJzIGluaXRpYWxpc2F0aW9uICovCiAgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHMgPSAyOwogICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb24gPSBwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmczsKLSAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uWzBdLkxpbWl0X0xvdyAgICAgICAgICA9IDIwOwotICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMF0uTGltaXRfSGlnaCAgICAgICAgID0gNDk5OTsKLSAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uWzBdLkhlYWRyb29tX09mZnNldCAgICA9IDM7Ci0gICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblsxXS5MaW1pdF9Mb3cgICAgICAgICAgPSA1MDAwOwotICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMV0uTGltaXRfSGlnaCAgICAgICAgID0gMjQwMDA7Ci0gICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblsxXS5IZWFkcm9vbV9PZmZzZXQgICAgPSA0OworICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMF0uTGltaXRfTG93ID0gMjA7CisgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblswXS5MaW1pdF9IaWdoID0gNDk5OTsKKyAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uWzBdLkhlYWRyb29tX09mZnNldCA9IDM7CisgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblsxXS5MaW1pdF9Mb3cgPSA1MDAwOworICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMV0uTGltaXRfSGlnaCA9IDI0MDAwOworICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMV0uSGVhZHJvb21fT2Zmc2V0ID0gNDsKICAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlID0gTFZNX0hFQURST09NX09OOwogCi0gICAgICAgIHBJbnN0YW5jZS0+SGVhZHJvb20gPTA7CisgICAgICAgIHBJbnN0YW5jZS0+SGVhZHJvb20gPSAwOwogICAgIH0KIAogICAgIC8qCiAgICAgICogSW5pdGlhbGlzZSB0aGUgUFNBIG1vZHVsZQogICAgICAqLwogICAgIHsKLSAgICAgICAgcExWUFNBX0hhbmRsZV90ICAgICBoUFNBSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgTFZQU0FfTWVtVGFiX3QgICAgICBQU0FfTWVtVGFiOwotICAgICAgICBMVlBTQV9SRVRVUk4gICAgICAgIFBTQV9TdGF0dXM7ICAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgICAgICBwTFZQU0FfSGFuZGxlX3QgaFBTQUluc3RhbmNlID0gTFZNX05VTEw7IC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICBMVlBTQV9SRVRVUk4gUFNBX1N0YXR1czsgICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgRmlsdGVyc1BhcmFtc1s5XTsKIAotICAgICAgICBpZihwSW5zdFBhcmFtcy0+UFNBX0luY2x1ZGVkPT1MVk1fUFNBX09OKQotICAgICAgICB7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Jbml0UGFyYW1zLlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uICAgPSAoTFZNX1VJTlQxNikgNTAwOwotICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcy5NYXhJbnB1dEJsb2NrU2l6ZSAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDIwNDg7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Jbml0UGFyYW1zLm5CYW5kcyAgICAgICAgICAgICAgICAgICAgICAgPSAoTFZNX1VJTlQxNikgOTsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMucEZpbHRlcnNQYXJhbXMgICAgICAgICAgICAgICA9ICZGaWx0ZXJzUGFyYW1zWzBdOwotICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcy5uQmFuZHM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWx0ZXJzUGFyYW1zW2ldLkNlbnRlckZyZXF1ZW5jeSAgICA9IChMVk1fVUlOVDE2KSAxMDAwOwotICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uUUZhY3RvciAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDEwMDsKLSAgICAgICAgICAgICAgICBGaWx0ZXJzUGFyYW1zW2ldLlBvc3RHYWluICAgICAgICAgICA9IChMVk1fSU5UMTYpICAwOworICAgICAgICBpZiAocEluc3RQYXJhbXMtPlBTQV9JbmNsdWRlZCA9PSBMVk1fUFNBX09OKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Jbml0UGFyYW1zLlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uID0gKExWTV9VSU5UMTYpNTAwOworICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcy5NYXhJbnB1dEJsb2NrU2l6ZSA9IChMVk1fVUlOVDE2KTIwNDg7CisgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Jbml0UGFyYW1zLm5CYW5kcyA9IChMVk1fVUlOVDE2KTk7CisgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Jbml0UGFyYW1zLnBGaWx0ZXJzUGFyYW1zID0gJkZpbHRlcnNQYXJhbXNbMF07CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcy5uQmFuZHM7IGkrKykgeworICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uQ2VudGVyRnJlcXVlbmN5ID0gKExWTV9VSU5UMTYpMTAwMDsKKyAgICAgICAgICAgICAgICBGaWx0ZXJzUGFyYW1zW2ldLlFGYWN0b3IgPSAoTFZNX1VJTlQxNikxMDA7CisgICAgICAgICAgICAgICAgRmlsdGVyc1BhcmFtc1tpXS5Qb3N0R2FpbiA9IChMVk1fSU5UMTYpMDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLypHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kIHRoZW4gc2V0IHRoZSBhZGRyZXNzIHBvaW50ZXJzKi8KLSAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9NZW1vcnkgKGhQU0FJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMpOwotCi0gICAgICAgICAgICBpZiAoUFNBX1N0YXR1cyAhPSBMVlBTQV9PSykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pIExWTV9BTEdPUklUSE1QU0EpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBTbG93IERhdGEgKi8KLSAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpOwotCi0gICAgICAgICAgICAvKiBGYXN0IERhdGEgKi8KLSAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpOwotCi0gICAgICAgICAgICAvKiBGYXN0IENvZWYgKi8KLSAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKLSAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpOwotCi0gICAgICAgICAgICAvKiBGYXN0IFRlbXBvcmFyeSAqLwotICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQgPSAoTFZNX0ZMT0FUICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX1RFTVBPUkFSWV9GQVNUXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQzMikgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0gICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sMCk7Ci0KICAgICAgICAgICAgIC8qSW5pdGlhbGlzZSBQU0EgaW5zdGFuY2UgYW5kIHNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZSovCiAgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Db250cm9sUGFyYW1zLkZzID0gTFZNX0ZTXzQ4MDAwOwotICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfQ29udHJvbFBhcmFtcy5MZXZlbERldGVjdGlvblNwZWVkICA9IExWUFNBX1NQRUVEX01FRElVTTsKLSAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9Jbml0ICgmaFBTQUluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QU0FfQ29udHJvbFBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfTWVtVGFiKTsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0NvbnRyb2xQYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZCA9IExWUFNBX1NQRUVEX01FRElVTTsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0ID0gKExWTV9GTE9BVCopY2FsbG9jKE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUsIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPnBQU0FJbnB1dCA9PSBMVk1fTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQU0FfU3RhdHVzID0gTFZQU0FfSW5pdCgmaFBTQUluc3RhbmNlLCAmcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBTQV9Db250cm9sUGFyYW1zLCBwSW5zdGFuY2UtPnBTY3JhdGNoKTsKIAotICAgICAgICAgICAgaWYgKFBTQV9TdGF0dXMgIT0gTFZQU0FfT0spCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKSBMVk1fQUxHT1JJVEhNUFNBKTsKKyAgICAgICAgICAgIGlmIChQU0FfU3RhdHVzICE9IExWUFNBX09LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoTFZNX1JldHVyblN0YXR1c19lbilMVk1fQUxHT1JJVEhNUFNBKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcEluc3RhbmNlLT5oUFNBSW5zdGFuY2UgPSBoUFNBSW5zdGFuY2U7ICAgICAgIC8qIFNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgcEluc3RhbmNlLT5oUFNBSW5zdGFuY2UgPSBoUFNBSW5zdGFuY2U7IC8qIFNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZSAqLwogICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfR2Fpbk9mZnNldCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSA9IExWTV9OVUxMOwogICAgICAgICB9CiAKICAgICAgICAgLyoKICAgICAgICAgICogU2V0IHRoZSBpbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzLgogICAgICAgICAgKi8KLSAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuUFNBX1BlYWtEZWNheVJhdGUgICA9IExWTV9QU0FfU1BFRURfTUVESVVNOwotICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5QU0FfRW5hYmxlICAgICAgICAgID0gTFZNX1BTQV9PRkY7CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlBTQV9QZWFrRGVjYXlSYXRlID0gTFZNX1BTQV9TUEVFRF9NRURJVU07CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlBTQV9FbmFibGUgPSBMVk1fUFNBX09GRjsKICAgICB9CiAKICAgICAvKgpAQCAtOTkyLDIwICs0MzQsMTEzIEBACiAgICAgcEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICs9IExWTV9WQ19NQVNLOwogICAgIHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciArPSBMVk1fUFNBX01BU0s7CiAKLSAgICBpZigoKHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciAgJiBMVk1fQ1NfTUFTSykhPTApICB8fAotICAgICAgICAoKHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciAmIExWTV9EQkVfTUFTSykhPTApIHx8Ci0gICAgICAgICgocEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICYgTFZNX0VRTkJfTUFTSykhPTApfHwKLSAgICAgICAgKChwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgJiBMVk1fVEVfTUFTSykhPTApICB8fAotICAgICAgICAoKHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciAmIExWTV9WQ19NQVNLKSE9MCkpCi0gICAgewotICAgICAgICBwSW5zdGFuY2UtPkJsaWNrU2l6ZU11bHRpcGxlICAgID0gNDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEluc3RhbmNlLT5CbGlja1NpemVNdWx0aXBsZSAgICA9IDE7CisgICAgaWYgKCgocEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICYgTFZNX0NTX01BU0spICE9IDApIHx8CisgICAgICAgICgocEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICYgTFZNX0RCRV9NQVNLKSAhPSAwKSB8fAorICAgICAgICAoKHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciAmIExWTV9FUU5CX01BU0spICE9IDApIHx8CisgICAgICAgICgocEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICYgTFZNX1RFX01BU0spICE9IDApIHx8CisgICAgICAgICgocEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICYgTFZNX1ZDX01BU0spICE9IDApKSB7CisgICAgICAgIHBJbnN0YW5jZS0+QmxpY2tTaXplTXVsdGlwbGUgPSA0OworICAgIH0gZWxzZSB7CisgICAgICAgIHBJbnN0YW5jZS0+QmxpY2tTaXplTXVsdGlwbGUgPSAxOwogICAgIH0KIAotICAgIHJldHVybihTdGF0dXMpOworICAgIHJldHVybiAoU3RhdHVzKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0RlbEluc3RhbmNlSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIGJ1bmRsZSBpbnN0YW5jZS4gSXQgcmV0dXJucyB0aGUgY3JlYXRlZCBpbnN0YW5jZSAgKi8KKy8qICBoYW5kbGUgdGhyb3VnaCBwaEluc3RhbmNlLiBBbGwgcGFyYW1ldGVycyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQsIGluYWN0aXZlIHN0YXRlLiAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZNX0RlbEluc3RhbmNlSGFuZGxlKExWTV9IYW5kbGVfdCogcGhJbnN0YW5jZSkgeworICAgIExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKSpwaEluc3RhbmNlOworCisgICAgaWYgKHBJbnN0YW5jZS0+cFNjcmF0Y2ggIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwSW5zdGFuY2UtPnBTY3JhdGNoKTsKKyAgICAgICAgcEluc3RhbmNlLT5wU2NyYXRjaCA9IExWTV9OVUxMOworICAgIH0KKworICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIE1hbmFnZWQgYnVmZmVycyByZXF1aXJlZAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgICAgIGZyZWUocEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudCk7CisgICAgICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50ID0gTFZNX05VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFRyZWJsZSBFbmhhbmNlbWVudAorICAgICAqLworCisgICAgLyoKKyAgICAgKiBGcmVlIHRoZSBkZWZhdWx0IEVRTkIgcHJlLWdhaW4gYW5kIHBvaW50ZXIgdG8gdGhlIGJhbmQgZGVmaW5pdGlvbnMKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmcyAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBJbnN0YW5jZS0+cEVRTkJfQmFuZERlZnMpOworICAgICAgICBwSW5zdGFuY2UtPnBFUU5CX0JhbmREZWZzID0gTFZNX05VTEw7CisgICAgfQorICAgIGlmIChwSW5zdGFuY2UtPnBFUU5CX1VzZXJEZWZzICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocEluc3RhbmNlLT5wRVFOQl9Vc2VyRGVmcyk7CisgICAgICAgIHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnMgPSBMVk1fTlVMTDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIERlLWluaXRpYWxpc2UgdGhlIENvbmNlcnQgU291bmQgbW9kdWxlCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+aENTSW5zdGFuY2UgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgTFZDU19EZUluaXQoJnBJbnN0YW5jZS0+aENTSW5zdGFuY2UpOworICAgIH0KKworICAgIC8qCisgICAgICogRGUtaW5pdGlhbGlzZSB0aGUgQmFzcyBFbmhhbmNlbWVudCBtb2R1bGUKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5oREJFSW5zdGFuY2UgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgTFZEQkVfRGVJbml0KCZwSW5zdGFuY2UtPmhEQkVJbnN0YW5jZSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEZS1pbml0aWFsaXNlIHRoZSBOLUJhbmQgRXF1YWxpc2VyIG1vZHVsZQorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPmhFUU5CSW5zdGFuY2UgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgTFZFUU5CX0RlSW5pdCgmcEluc3RhbmNlLT5oRVFOQkluc3RhbmNlKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZyZWUgSGVhZHJvb20gbWFuYWdlbWVudCBtZW1vcnkuCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+cEhlYWRyb29tX0JhbmREZWZzICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocEluc3RhbmNlLT5wSGVhZHJvb21fQmFuZERlZnMpOworICAgICAgICBwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmcyA9IExWTV9OVUxMOworICAgIH0KKyAgICBpZiAocEluc3RhbmNlLT5wSGVhZHJvb21fVXNlckRlZnMgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwSW5zdGFuY2UtPnBIZWFkcm9vbV9Vc2VyRGVmcyk7CisgICAgICAgIHBJbnN0YW5jZS0+cEhlYWRyb29tX1VzZXJEZWZzID0gTFZNX05VTEw7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEZS1pbml0aWFsaXNlIHRoZSBQU0EgbW9kdWxlCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlICE9IExWTV9OVUxMKSB7CisgICAgICAgIExWUFNBX0RlSW5pdCgmcEluc3RhbmNlLT5oUFNBSW5zdGFuY2UpOworICAgIH0KKyAgICBpZiAocEluc3RhbmNlLT5wUFNBSW5wdXQgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwSW5zdGFuY2UtPnBQU0FJbnB1dCk7CisgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0ID0gTFZNX05VTEw7CisgICAgfQorCisgICAgZGVsZXRlIHBJbnN0YW5jZTsKKyAgICByZXR1cm47CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTAyNyw0OCArNTYyLDM2IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9DbGVhckF1ZGlvQnVmZmVycyhMVk1fSGFuZGxlX3QgIGhJbnN0YW5jZSkKLXsKLSAgICBMVk1fTWVtVGFiX3QgICAgICAgICAgICBNZW1UYWI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSB0YWJsZSAqLwotICAgIExWTV9JbnN0UGFyYW1zX3QgICAgICAgIEluc3RQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLwotICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIFBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZNX0luc3RhbmNlX3QgICAgICAgICAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOyAvKiBQb2ludGVyIHRvIEluc3RhbmNlICovCi0gICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgSGVhZHJvb21QYXJhbXM7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9DbGVhckF1ZGlvQnVmZmVycyhMVk1fSGFuZGxlX3QgaEluc3RhbmNlKSB7CisgICAgTFZNX0luc3RQYXJhbXNfdCBJbnN0UGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwYXJhbWV0ZXJzICovCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCBQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90KiloSW5zdGFuY2U7IC8qIFBvaW50ZXIgdG8gSW5zdGFuY2UgKi8KKyAgICBMVk1fSGVhZHJvb21QYXJhbXNfdCBIZWFkcm9vbVBhcmFtczsKIAotICAgIGlmKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCl7CisgICAgaWYgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgewogICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOwogICAgIH0KIAotICAgIC8qIFNhdmUgdGhlIGNvbnRyb2wgcGFyYW1ldGVycyAqLyAvKiBjb3Zlcml0eVt1bmNoZWNrZWRfdmFsdWVdICovIC8qIERvIG5vdCBjaGVjayByZXR1cm4gdmFsdWUgaW50ZXJuYWwgZnVuY3Rpb24gY2FsbHMgKi8KKyAgICAvKiBTYXZlIHRoZSBjb250cm9sIHBhcmFtZXRlcnMgKi8gLyogY292ZXJpdHlbdW5jaGVja2VkX3ZhbHVlXSAqLyAvKiBEbyBub3QgY2hlY2sgcmV0dXJuIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgZnVuY3Rpb24gY2FsbHMgKi8KICAgICBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMoaEluc3RhbmNlLCAmUGFyYW1zKTsKIAogICAgIC8qU2F2ZSB0aGUgaGVhZHJvb20gcGFyYW1ldGVycyovCiAgICAgTFZNX0dldEhlYWRyb29tUGFyYW1zKGhJbnN0YW5jZSwgJkhlYWRyb29tUGFyYW1zKTsKIAotICAgIC8qICBSZXRyaWV2ZSBhbGxvY2F0ZWQgYnVmZmVycyBpbiBtZW10YWIgKi8KLSAgICBMVk1fR2V0TWVtb3J5VGFibGUoaEluc3RhbmNlLCAmTWVtVGFiLCAgTFZNX05VTEwpOwotCiAgICAgLyogIFNhdmUgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgKi8KICAgICBJbnN0UGFyYW1zID0gcEluc3RhbmNlLT5JbnN0UGFyYW1zOwogCiAgICAgLyogIENhbGwgIExWTV9HZXRJbnN0YW5jZUhhbmRsZSB0byByZS1pbml0aWFsaXNlIHRoZSBidW5kbGUgKi8KLSAgICBMVk1fR2V0SW5zdGFuY2VIYW5kbGUoICZoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJkluc3RQYXJhbXMpOwotCi0gICAgLyogUmVzdG9yZSBjb250cm9sIHBhcmFtZXRlcnMgKi8gLyogY292ZXJpdHlbdW5jaGVja2VkX3ZhbHVlXSAqLyAvKiBEbyBub3QgY2hlY2sgcmV0dXJuIHZhbHVlIGludGVybmFsIGZ1bmN0aW9uIGNhbGxzICovCisgICAgLyogUmVzdG9yZSBjb250cm9sIHBhcmFtZXRlcnMgKi8gLyogY292ZXJpdHlbdW5jaGVja2VkX3ZhbHVlXSAqLyAvKiBEbyBub3QgY2hlY2sgcmV0dXJuIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCBmdW5jdGlvbiBjYWxscyAqLwogICAgIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhoSW5zdGFuY2UsICZQYXJhbXMpOwogCiAgICAgLypSZXN0b3JlIHRoZSBoZWFkcm9vbSBwYXJhbWV0ZXJzKi8KICAgICBMVk1fU2V0SGVhZHJvb21QYXJhbXMoaEluc3RhbmNlLCAmSGVhZHJvb21QYXJhbXMpOwogCiAgICAgLyogREMgcmVtb3ZhbCBmaWx0ZXIgKi8KLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgRENfTWNfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOwotI2Vsc2UKLSAgICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSk7Ci0jZW5kaWYKIAogICAgIHJldHVybiBMVk1fU1VDQ0VTUzsKIH0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKaW5kZXggZGRhYWM5OS4uNjNjODNjMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oCkBAIC0zMywxNCArMzMsMTUgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaW5jbHVkZSAiTFZNLmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMaWZlVmliZXMgKi8KLSNpbmNsdWRlICJMVk1fQ29tbW9uLmgiICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExpZmVWaWJlcyBjb21tb24gKi8KLSNpbmNsdWRlICJCSVFVQUQuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJpcXVhZCBsaWJyYXJ5ICovCi0jaW5jbHVkZSAiTFZDX01peGVyLmgiICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNaXhlciBsaWJyYXJ5ICovCi0jaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiICAgICAgICAgICAgICAgICAgICAgICAvKiBDb25jZXJ0IFNvdW5kICovCi0jaW5jbHVkZSAiTFZEQkVfUHJpdmF0ZS5oIiAgICAgICAgICAgICAgICAgICAgICAvKiBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgKi8KLSNpbmNsdWRlICJMVkVRTkJfUHJpdmF0ZS5oIiAgICAgICAgICAgICAgICAgICAgIC8qIE4tQmFuZCBlcXVhbGlzZXIgKi8KLSNpbmNsdWRlICJMVlBTQV9Qcml2YXRlLmgiICAgICAgICAgICAgICAgICAgICAgIC8qIFBhcmFtZXRyaWMgU3BlY3RydW0gQW5hbHl6ZXIgKi8KKyNpbmNsdWRlIDxhdWRpb191dGlscy9CaXF1YWRGaWx0ZXIuaD4KKyNpbmNsdWRlICJMVk0uaCIgICAgICAgICAgICAvKiBMaWZlVmliZXMgKi8KKyNpbmNsdWRlICJMVk1fQ29tbW9uLmgiICAgICAvKiBMaWZlVmliZXMgY29tbW9uICovCisjaW5jbHVkZSAiQklRVUFELmgiICAgICAgICAgLyogQmlxdWFkIGxpYnJhcnkgKi8KKyNpbmNsdWRlICJMVkNfTWl4ZXIuaCIgICAgICAvKiBNaXhlciBsaWJyYXJ5ICovCisjaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiICAgLyogQ29uY2VydCBTb3VuZCAqLworI2luY2x1ZGUgIkxWREJFX1ByaXZhdGUuaCIgIC8qIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCAqLworI2luY2x1ZGUgIkxWRVFOQl9Qcml2YXRlLmgiIC8qIE4tQmFuZCBlcXVhbGlzZXIgKi8KKyNpbmNsdWRlICJMVlBTQV9Qcml2YXRlLmgiICAvKiBQYXJhbWV0cmljIFNwZWN0cnVtIEFuYWx5emVyICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDksNjMgKzUwLDY0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBHZW5lcmFsICovCi0jZGVmaW5lIExWTV9JTlZBTElEICAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAgIC8qIEludmFsaWQgaW5pdCBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgTFZNX0lOVkFMSUQgMHhGRkZGIC8qIEludmFsaWQgaW5pdCBwYXJhbWV0ZXIgKi8KIAogLyogTWVtb3J5ICovCi0jZGVmaW5lIExWTV9JTlNUQU5DRV9BTElHTiAgICAgICAgICAgICAgNCAgICAgICAgIC8qIDMyLWJpdCBmb3Igc3RydWN0dXJlcyAqLwotI2RlZmluZSBMVk1fRklSU1RDQUxMICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGaXJzdCBjYWxsIHRvIHRoZSBidWZmZXIgKi8KLSNkZWZpbmUgTFZNX01BWEJMT0NLQ0FMTCAgICAgICAgICAgICAgICAxICAgICAgICAgLyogTWF4aW11bSBibG9jayBzaXplIGNhbGxzIHRvIHRoZSBidWZmZXIgKi8KLSNkZWZpbmUgTFZNX0xBU1RDQUxMICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogTGFzdCBjYWxsIHRvIHRoZSBidWZmZXIgKi8KLSNkZWZpbmUgTFZNX0ZJUlNUTEFTVENBTEwgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2luZ2xlIGNhbGwgZm9yIHNtYWxsIG51bWJlciBvZiBzYW1wbGVzICovCisjZGVmaW5lIExWTV9JTlNUQU5DRV9BTElHTiA0IC8qIDMyLWJpdCBmb3Igc3RydWN0dXJlcyAqLworI2RlZmluZSBMVk1fRklSU1RDQUxMIDAgICAgICAvKiBGaXJzdCBjYWxsIHRvIHRoZSBidWZmZXIgKi8KKyNkZWZpbmUgTFZNX01BWEJMT0NLQ0FMTCAxICAgLyogTWF4aW11bSBibG9jayBzaXplIGNhbGxzIHRvIHRoZSBidWZmZXIgKi8KKyNkZWZpbmUgTFZNX0xBU1RDQUxMIDIgICAgICAgLyogTGFzdCBjYWxsIHRvIHRoZSBidWZmZXIgKi8KKyNkZWZpbmUgTFZNX0ZJUlNUTEFTVENBTEwgMyAgLyogU2luZ2xlIGNhbGwgZm9yIHNtYWxsIG51bWJlciBvZiBzYW1wbGVzICovCiAKIC8qIEJsb2NrIFNpemUgKi8KLSNkZWZpbmUgTFZNX01JTl9NQVhCTE9DS1NJWkUgICAgICAgICAgICAxNiAgICAgICAgLyogTWluaW11bSBNYXhCbG9ja1NpemUgTGltaXQqLwotI2RlZmluZSBMVk1fTUFOQUdFRF9NQVhfTUFYQkxPQ0tTSVpFICAgIDgxOTEgICAgICAvKiBNYXhpbXVtIE1heEJsb2NrU3ppZSBMaW1pdCBmb3IgTWFuYWdlZCBCdWZmZXIgTW9kZSovCi0jZGVmaW5lIExWTV9VTk1BTkFHRURfTUFYX01BWEJMT0NLU0laRSAgNDA5NiAgICAgIC8qIE1heGltdW0gTWF4QmxvY2tTemllIExpbWl0IGZvciBVbm1hbmFnZWQgQnVmZmVyIE1vZGUgKi8KKyNkZWZpbmUgTFZNX01JTl9NQVhCTE9DS1NJWkUgMTYgICAgICAgICAgIC8qIE1pbmltdW0gTWF4QmxvY2tTaXplIExpbWl0Ki8KKyNkZWZpbmUgTFZNX01BTkFHRURfTUFYX01BWEJMT0NLU0laRSA4MTkxIC8qIE1heGltdW0gTWF4QmxvY2tTemllIExpbWl0IGZvciBNYW5hZ2VkIEJ1ZmZlciBNb2RlKi8KKyNkZWZpbmUgTFZNX1VOTUFOQUdFRF9NQVhfTUFYQkxPQ0tTSVpFIFwKKyAgICA0MDk2IC8qIE1heGltdW0gTWF4QmxvY2tTemllIExpbWl0IGZvciBVbm1hbmFnZWQgQnVmZmVyIE1vZGUgKi8KIAotI2RlZmluZSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICAgICAgICAgIDgxMjggICAgICAvKiBNYXhpbXVtIG11bHRpcGxlIG9mIDY0ICBiZWxvdyA4MTkxKi8KKyNkZWZpbmUgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSA4MTI4IC8qIE1heGltdW0gbXVsdGlwbGUgb2YgNjQgIGJlbG93IDgxOTEqLwogCi0jZGVmaW5lIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgICAgICAgICAgMTYgICAgICAgIC8qIE1pbmltdW0gaW50ZXJuYWwgYmxvY2sgc2l6ZSAqLwotI2RlZmluZSBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCAgICAgICAgIDQgICAgICAgICAvKiBNaW5pbXVtIGludGVybmFsIGJsb2NrIHNpemUgYXMgYSBwb3dlciBvZiAyICovCi0jZGVmaW5lIE1JTl9JTlRFUk5BTF9CTE9DS01BU0sgICAgICAgICAgMHhGRkYwICAgIC8qIE1pbmltdW0gaW50ZXJuYWwgYmxvY2sgc2l6ZSBtYXNrICovCisjZGVmaW5lIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgMTYgICAgIC8qIE1pbmltdW0gaW50ZXJuYWwgYmxvY2sgc2l6ZSAqLworI2RlZmluZSBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCA0ICAgICAvKiBNaW5pbXVtIGludGVybmFsIGJsb2NrIHNpemUgYXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIE1JTl9JTlRFUk5BTF9CTE9DS01BU0sgMHhGRkYwIC8qIE1pbmltdW0gaW50ZXJuYWwgYmxvY2sgc2l6ZSBtYXNrICovCiAKLSNkZWZpbmUgTFZNX1BTQV9EWU5BTUlDUkFOR0UgICAgICAgICAgICA2MCAgICAgICAgLyogU3BlY3RyYWwgRHluYW1pYyByYW5nZTogdXNlZCBmb3Igb2Zmc2V0aW5nIG91dHB1dCovCi0jZGVmaW5lIExWTV9QU0FfQkFSSEVJR0hUICAgICAgICAgICAgICAgMTI3ICAgICAgIC8qIFNwZWN0cmFsIEJhciBIZWlnaHQqLworI2RlZmluZSBMVk1fUFNBX0RZTkFNSUNSQU5HRSA2MCAvKiBTcGVjdHJhbCBEeW5hbWljIHJhbmdlOiB1c2VkIGZvciBvZmZzZXRpbmcgb3V0cHV0Ki8KKyNkZWZpbmUgTFZNX1BTQV9CQVJIRUlHSFQgMTI3ICAgLyogU3BlY3RyYWwgQmFyIEhlaWdodCovCiAKLSNkZWZpbmUgTFZNX1RFX01JTl9FRkZFQ1RMRVZFTCAgICAgICAgICAwICAgICAgICAgLypURSBNaW5pbXVtIEVmZmVjdExldmVsKi8KLSNkZWZpbmUgTFZNX1RFX01BWF9FRkZFQ1RMRVZFTCAgICAgICAgICAxNSAgICAgICAgLypURSBNYXhpbXVtIEVmZmVjdCBsZXZlbCovCisjZGVmaW5lIExWTV9URV9NSU5fRUZGRUNUTEVWRUwgMCAgLypURSBNaW5pbXVtIEVmZmVjdExldmVsKi8KKyNkZWZpbmUgTFZNX1RFX01BWF9FRkZFQ1RMRVZFTCAxNSAvKlRFIE1heGltdW0gRWZmZWN0IGxldmVsKi8KIAotI2RlZmluZSBMVk1fVkNfTUlOX0VGRkVDVExFVkVMICAgICAgICAgICgtOTYpICAgICAvKlZDIE1pbmltdW0gRWZmZWN0TGV2ZWwqLwotI2RlZmluZSBMVk1fVkNfTUFYX0VGRkVDVExFVkVMICAgICAgICAgIDAgICAgICAgICAvKlZDIE1heGltdW0gRWZmZWN0IGxldmVsKi8KKyNkZWZpbmUgTFZNX1ZDX01JTl9FRkZFQ1RMRVZFTCAoLTk2KSAvKlZDIE1pbmltdW0gRWZmZWN0TGV2ZWwqLworI2RlZmluZSBMVk1fVkNfTUFYX0VGRkVDVExFVkVMIDAgICAgIC8qVkMgTWF4aW11bSBFZmZlY3QgbGV2ZWwqLwogCi0jZGVmaW5lIExWTV9CRV9NSU5fRUZGRUNUTEVWRUwgICAgICAgICAgMCAgICAgICAgIC8qQkUgTWluaW11bSBFZmZlY3RMZXZlbCovCi0jZGVmaW5lIExWTV9CRV9NQVhfRUZGRUNUTEVWRUwgICAgICAgICAgMTUgICAgICAgIC8qQkUgTWF4aW11bSBFZmZlY3QgbGV2ZWwqLworI2RlZmluZSBMVk1fQkVfTUlOX0VGRkVDVExFVkVMIDAgIC8qQkUgTWluaW11bSBFZmZlY3RMZXZlbCovCisjZGVmaW5lIExWTV9CRV9NQVhfRUZGRUNUTEVWRUwgMTUgLypCRSBNYXhpbXVtIEVmZmVjdCBsZXZlbCovCiAKLSNkZWZpbmUgTFZNX0VRTkJfTUlOX0JBTkRfRlJFUSAgICAgICAgICAyMCAgICAgICAgLypFUU5CIE1pbmltdW0gQmFuZCBGcmVxdWVuY3kqLwotI2RlZmluZSBMVk1fRVFOQl9NQVhfQkFORF9GUkVRICAgICAgICAgIDI0MDAwICAgICAvKkVRTkIgTWF4aW11bSBCYW5kIEZyZXF1ZW5jeSovCi0jZGVmaW5lIExWTV9FUU5CX01JTl9CQU5EX0dBSU4gICAgICAgICAgKC0xNSkgICAgIC8qRVFOQiBNaW5pbXVtIEJhbmQgRnJlcXVlbmN5Ki8KLSNkZWZpbmUgTFZNX0VRTkJfTUFYX0JBTkRfR0FJTiAgICAgICAgICAxNSAgICAgICAgLypFUU5CIE1heGltdW0gQmFuZCBGcmVxdWVuY3kqLwotI2RlZmluZSBMVk1fRVFOQl9NSU5fUUZBQ1RPUiAgICAgICAgICAgIDI1ICAgICAgICAvKkVRTkIgTWluaW11bSBRIEZhY3RvciovCi0jZGVmaW5lIExWTV9FUU5CX01BWF9RRkFDVE9SICAgICAgICAgICAgMTIwMCAgICAgIC8qRVFOQiBNYXhpbXVtIFEgRmFjdG9yKi8KLSNkZWZpbmUgTFZNX0VRTkJfTUlOX0xQRl9GUkVRICAgICAgICAgICAxMDAwICAgICAgLypFUU5CIE1pbmltdW0gTG93IFBhc3MgQ29ybmVyIGZyZXF1ZW5jeSovCi0jZGVmaW5lIExWTV9FUU5CX01JTl9IUEZfRlJFUSAgICAgICAgICAgMjAgICAgICAgIC8qRVFOQiBNaW5pbXVtIEhpZ2ggUGFzcyBDb3JuZXIgZnJlcXVlbmN5Ki8KLSNkZWZpbmUgTFZNX0VRTkJfTUFYX0hQRl9GUkVRICAgICAgICAgICAxMDAwICAgICAgLypFUU5CIE1heGltdW0gSGlnaCBQYXNzIENvcm5lciBmcmVxdWVuY3kqLworI2RlZmluZSBMVk1fRVFOQl9NSU5fQkFORF9GUkVRIDIwICAgIC8qRVFOQiBNaW5pbXVtIEJhbmQgRnJlcXVlbmN5Ki8KKyNkZWZpbmUgTFZNX0VRTkJfTUFYX0JBTkRfRlJFUSAyNDAwMCAvKkVRTkIgTWF4aW11bSBCYW5kIEZyZXF1ZW5jeSovCisjZGVmaW5lIExWTV9FUU5CX01JTl9CQU5EX0dBSU4gKC0xNSkgLypFUU5CIE1pbmltdW0gQmFuZCBGcmVxdWVuY3kqLworI2RlZmluZSBMVk1fRVFOQl9NQVhfQkFORF9HQUlOIDE1ICAgIC8qRVFOQiBNYXhpbXVtIEJhbmQgRnJlcXVlbmN5Ki8KKyNkZWZpbmUgTFZNX0VRTkJfTUlOX1FGQUNUT1IgMjUgICAgICAvKkVRTkIgTWluaW11bSBRIEZhY3RvciovCisjZGVmaW5lIExWTV9FUU5CX01BWF9RRkFDVE9SIDEyMDAgICAgLypFUU5CIE1heGltdW0gUSBGYWN0b3IqLworI2RlZmluZSBMVk1fRVFOQl9NSU5fTFBGX0ZSRVEgMTAwMCAgIC8qRVFOQiBNaW5pbXVtIExvdyBQYXNzIENvcm5lciBmcmVxdWVuY3kqLworI2RlZmluZSBMVk1fRVFOQl9NSU5fSFBGX0ZSRVEgMjAgICAgIC8qRVFOQiBNaW5pbXVtIEhpZ2ggUGFzcyBDb3JuZXIgZnJlcXVlbmN5Ki8KKyNkZWZpbmUgTFZNX0VRTkJfTUFYX0hQRl9GUkVRIDEwMDAgICAvKkVRTkIgTWF4aW11bSBIaWdoIFBhc3MgQ29ybmVyIGZyZXF1ZW5jeSovCiAKLSNkZWZpbmUgTFZNX0NTX01JTl9FRkZFQ1RfTEVWRUwgICAgICAgICAwICAgICAgICAgLypDUyBNaW5pbXVtIEVmZmVjdCBMZXZlbCovCi0jZGVmaW5lIExWTV9DU19NQVhfUkVWRVJCX0xFVkVMICAgICAgICAgMTAwICAgICAgIC8qQ1MgTWF4aW11bSBSZXZlcmIgTGV2ZWwqLwotI2RlZmluZSBMVk1fVklSVFVBTElaRVJfTUFYX1JFVkVSQl9MRVZFTCAxMDAgICAgICAvKlZpdHJ1YWxpemVyIE1heGltdW0gUmV2ZXJiIExldmVsKi8KKyNkZWZpbmUgTFZNX0NTX01JTl9FRkZFQ1RfTEVWRUwgMCAgICAgICAgICAgIC8qQ1MgTWluaW11bSBFZmZlY3QgTGV2ZWwqLworI2RlZmluZSBMVk1fQ1NfTUFYX1JFVkVSQl9MRVZFTCAxMDAgICAgICAgICAgLypDUyBNYXhpbXVtIFJldmVyYiBMZXZlbCovCisjZGVmaW5lIExWTV9WSVJUVUFMSVpFUl9NQVhfUkVWRVJCX0xFVkVMIDEwMCAvKlZpdHJ1YWxpemVyIE1heGltdW0gUmV2ZXJiIExldmVsKi8KIAotI2RlZmluZSBMVk1fVkNfTUlYRVJfVElNRSAgICAgICAgICAgICAgMTAwICAgICAgIC8qVkMgbWl4ZXIgdGltZSovCi0jZGVmaW5lIExWTV9WQ19CQUxBTkNFX01BWCAgICAgICAgICAgICA5NiAgICAgICAgLypWQyBiYWxhbmNlIG1heCB2YWx1ZSovCi0jZGVmaW5lIExWTV9WQ19CQUxBTkNFX01JTiAgICAgICAgICAgICAoLTk2KSAgICAgLypWQyBiYWxhbmNlIG1pbiB2YWx1ZSovCisjZGVmaW5lIExWTV9WQ19NSVhFUl9USU1FIDEwMCAgICAvKlZDIG1peGVyIHRpbWUqLworI2RlZmluZSBMVk1fVkNfQkFMQU5DRV9NQVggOTYgICAgLypWQyBiYWxhbmNlIG1heCB2YWx1ZSovCisjZGVmaW5lIExWTV9WQ19CQUxBTkNFX01JTiAoLTk2KSAvKlZDIGJhbGFuY2UgbWluIHZhbHVlKi8KIAogLyogQWxnb3JpdGhtIG1hc2tzICovCi0jZGVmaW5lIExWTV9DU19NQVNLICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBMVk1fRVFOQl9NQVNLICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTFZNX0RCRV9NQVNLICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIExWTV9WQ19NQVNLICAgICAgICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgTFZNX1RFX01BU0sgICAgICAgICAgICAgICAgICAgICAzMgotI2RlZmluZSBMVk1fUFNBX01BU0sgICAgICAgICAgICAgICAgICAgIDIwNDgKKyNkZWZpbmUgTFZNX0NTX01BU0sgMQorI2RlZmluZSBMVk1fRVFOQl9NQVNLIDIKKyNkZWZpbmUgTFZNX0RCRV9NQVNLIDQKKyNkZWZpbmUgTFZNX1ZDX01BU0sgMTYKKyNkZWZpbmUgTFZNX1RFX01BU0sgMzIKKyNkZWZpbmUgTFZNX1BTQV9NQVNLIDIwNDgKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMTMsMTMzICsxMTUsOTMgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBNZW1vcnkgcmVnaW9uIGRlZmluaXRpb24gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgU2l6ZTsgICAgICAgICAgICAgICAvKiBSZWdpb24gc2l6ZSBpbiBieXRlcyAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIEFsaWdubWVudDsgICAgICAgICAgLyogQnl0ZSBhbGlnbm1lbnQgKi8KLSAgICBMVk1fTWVtb3J5VHlwZXNfZW4gICAgICBUeXBlOyAgICAgICAgICAgICAgIC8qIFJlZ2lvbiB0eXBlICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnBCYXNlQWRkcmVzczsgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZWdpb24gYmFzZSBhZGRyZXNzICovCi19IExWTV9JbnRNZW1vcnlSZWdpb25fdDsKLQotLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fSW50TWVtb3J5UmVnaW9uX3QgICBSZWdpb25bTFZNX05SX01FTU9SWV9SRUdJT05TXTsgIC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLwotfSBMVk1fSW50TWVtVGFiX3Q7Ci0KIC8qIEJ1ZmZlciBNYW5hZ2VtZW50ICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwU2NyYXRjaDsgICAgICAgICAgLyogQnVuZGxlIHNjcmF0Y2ggYnVmZmVyICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0ZMT0FUKiBwU2NyYXRjaDsgLyogQnVuZGxlIHNjcmF0Y2ggYnVmZmVyICovCiAKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBCdWZmZXJTdGF0ZTsgICAgICAgIC8qIEJ1ZmZlciBzdGF0dXMgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgSW5EZWxheUJ1ZmZlclszICogTFZNX01BWF9DSEFOTkVMUyAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOwotI2Vsc2UKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBJbkRlbGF5QnVmZmVyWzYgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsgLyogSW5wdXQgYnVmZmVyIGRlbGF5IGxpbmUsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgYW5kIHJpZ2h0ICovCi0jZW5kaWYKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBJbkRlbGF5U2FtcGxlczsgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgT3V0RGVsYXlCdWZmZXJbTFZNX01BWF9DSEFOTkVMUyAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOwotI2Vsc2UKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBPdXREZWxheUJ1ZmZlclsyICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07IC8qIE91dHB1dCBidWZmZXIgZGVsYXkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lICovCi0jZW5kaWYKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPdXREZWxheVNhbXBsZXM7ICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgYW5kIHJpZ2h0ICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgU2FtcGxlc1RvT3V0cHV0OyAgICAvKiBTYW1wbGVzIHRvIHdyaXRlIHRvIHRoZSBvdXRwdXQgKi8KKyAgICBMVk1fSU5UMTYgQnVmZmVyU3RhdGU7IC8qIEJ1ZmZlciBzdGF0dXMgKi8KKyAgICBMVk1fRkxPQVQgSW5EZWxheUJ1ZmZlclszICogTFZNX01BWF9DSEFOTkVMUyAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOworICAgIExWTV9JTlQxNiBJbkRlbGF5U2FtcGxlczsgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGRlbGF5IGJ1ZmZlciAqLworICAgIExWTV9GTE9BVCBPdXREZWxheUJ1ZmZlcltMVk1fTUFYX0NIQU5ORUxTICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07CisgICAgTFZNX0lOVDE2IE91dERlbGF5U2FtcGxlczsgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIG91dHB1dCBkZWxheSBidWZmZXIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgYW5kIHJpZ2h0ICovCisgICAgTFZNX0lOVDE2IFNhbXBsZXNUb091dHB1dDsgLyogU2FtcGxlcyB0byB3cml0ZSB0byB0aGUgb3V0cHV0ICovCiB9IExWTV9CdWZmZXJfdDsKIAotLyogRmlsdGVyIHRhcHMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgQmlxdWFkXzJJX09yZGVyMV9GTE9BVF9UYXBzX3QgVHJlYmxlQm9vc3RfVGFwczsgICAvKiBUcmVibGUgYm9vc3QgVGFwcyAqLwotfSBMVk1fVEVfRGF0YV90OwogCi0vKiBDb2VmZmljaWVudHMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgVHJlYmxlQm9vc3RfU3RhdGU7ICAvKiBTdGF0ZSBmb3IgdGhlIHRyZWJsZSBib29zdCBmaWx0ZXIgKi8KLX0gTFZNX1RFX0NvZWZzX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogUHVibGljIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fTWVtVGFiX3QgICAgICAgICAgICBNZW1vcnlUYWJsZTsgICAgICAgIC8qIEluc3RhbmNlIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCi0gICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgUGFyYW1zOyAgICAgICAgICAgICAvKiBDb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fSW5zdFBhcmFtc190ICAgICAgICBJbnN0UGFyYW1zOyAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fQ29udHJvbFBhcmFtc190IFBhcmFtczsgIC8qIENvbnRyb2wgcGFyYW1ldGVycyAqLworICAgIExWTV9JbnN0UGFyYW1zX3QgSW5zdFBhcmFtczsgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLwogCiAgICAgLyogUHJpdmF0ZSBwYXJhbWV0ZXJzICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgQ29udHJvbFBlbmRpbmc7ICAgICAvKiBDb250cm9sIGZsYWcgdG8gaW5kaWNhdGUgdXBkYXRlIHBlbmRpbmcgKi8KLSAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBOZXdQYXJhbXM7ICAgICAgICAgIC8qIE5ldyBjb250cm9sIHBhcmFtZXRlcnMgcGVuZGluZyB1cGRhdGUgKi8KKyAgICBMVk1fVUlOVDE2IENvbnRyb2xQZW5kaW5nOyAgICAgLyogQ29udHJvbCBmbGFnIHRvIGluZGljYXRlIHVwZGF0ZSBwZW5kaW5nICovCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCBOZXdQYXJhbXM7IC8qIE5ldyBjb250cm9sIHBhcmFtZXRlcnMgcGVuZGluZyB1cGRhdGUgKi8KIAogICAgIC8qIEJ1ZmZlciBjb250cm9sICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSW50ZXJuYWxCbG9ja1NpemU7ICAvKiBNYXhpbXVtIGludGVybmFsIGJsb2NrIHNpemUgKi8KLSAgICBMVk1fQnVmZmVyX3QgICAgICAgICAgICAqcEJ1ZmZlck1hbmFnZW1lbnQ7IC8qIEJ1ZmZlciBtYW5hZ2VtZW50IHZhcmlhYmxlcyAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFNhbXBsZXNUb1Byb2Nlc3M7ICAgLyogSW5wdXQgc2FtcGxlcyBsZWZ0IHRvIHByb2Nlc3MgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcElucHV0U2FtcGxlczsgICAgIC8qIEV4dGVybmFsIGlucHV0IHNhbXBsZSBwb2ludGVyICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBPdXRwdXRTYW1wbGVzOyAgICAvKiBFeHRlcm5hbCBvdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICBMVk1fSU5UMTYgSW50ZXJuYWxCbG9ja1NpemU7ICAgICAvKiBNYXhpbXVtIGludGVybmFsIGJsb2NrIHNpemUgKi8KKyAgICBMVk1fQnVmZmVyX3QqIHBCdWZmZXJNYW5hZ2VtZW50OyAvKiBCdWZmZXIgbWFuYWdlbWVudCB2YXJpYWJsZXMgKi8KKyAgICBMVk1fSU5UMTYgU2FtcGxlc1RvUHJvY2VzczsgICAgICAvKiBJbnB1dCBzYW1wbGVzIGxlZnQgdG8gcHJvY2VzcyAqLworICAgIExWTV9GTE9BVCogcElucHV0U2FtcGxlczsgICAgICAgIC8qIEV4dGVybmFsIGlucHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgTFZNX0ZMT0FUKiBwT3V0cHV0U2FtcGxlczsgICAgICAgLyogRXh0ZXJuYWwgb3V0cHV0IHNhbXBsZSBwb2ludGVyICovCiAKICAgICAvKiBDb25maWd1cmF0aW9uIG51bWJlciAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25OdW1iZXI7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQmxpY2tTaXplTXVsdGlwbGU7CisgICAgTFZNX0lOVDMyIENvbmZpZ3VyYXRpb25OdW1iZXI7CisgICAgTFZNX0lOVDMyIEJsaWNrU2l6ZU11bHRpcGxlOwogCiAgICAgLyogREMgcmVtb3ZhbCAqLwotICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIERDX1JlbW92YWxJbnN0YW5jZTsgLyogREMgcmVtb3ZhbCBmaWx0ZXIgaW5zdGFuY2UgKi8KKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCBEQ19SZW1vdmFsSW5zdGFuY2U7IC8qIERDIHJlbW92YWwgZmlsdGVyIGluc3RhbmNlICovCiAKICAgICAvKiBDb25jZXJ0IFNvdW5kICovCi0gICAgTFZDU19IYW5kbGVfdCAgICAgICAgICAgaENTSW5zdGFuY2U7ICAgICAgICAvKiBDb25jZXJ0IFNvdW5kIGluc3RhbmNlIGhhbmRsZSAqLwotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgIENTX0luc3RhbmNlOyAgICAgICAgLyogQ29uY2VydCBTb3VuZCBpbnN0YW5jZSAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIENTX0FjdGl2ZTsgICAgICAgICAgLyogQ29udHJvbCBmbGFnICovCisgICAgTFZDU19IYW5kbGVfdCBoQ1NJbnN0YW5jZTsgICAvKiBDb25jZXJ0IFNvdW5kIGluc3RhbmNlIGhhbmRsZSAqLworICAgIExWQ1NfSW5zdGFuY2VfdCBDU19JbnN0YW5jZTsgLyogQ29uY2VydCBTb3VuZCBpbnN0YW5jZSAqLworICAgIExWTV9JTlQxNiBDU19BY3RpdmU7ICAgICAgICAgLyogQ29udHJvbCBmbGFnICovCiAKICAgICAvKiBFcXVhbGl6ZXIgKi8KLSAgICBMVkVRTkJfSGFuZGxlX3QgICAgICAgICBoRVFOQkluc3RhbmNlOyAgICAgIC8qIE4tQmFuZCBFcXVhbGlzZXIgaW5zdGFuY2UgaGFuZGxlICovCi0gICAgTFZFUU5CX0luc3RhbmNlX3QgICAgICAgRVFOQl9JbnN0YW5jZTsgICAgICAvKiBOLUJhbmQgRXF1YWxpc2VyIGluc3RhbmNlICovCi0gICAgTFZNX0VRTkJfQmFuZERlZl90ICAgICAgKnBFUU5CX0JhbmREZWZzOyAgICAvKiBMb2NhbCBzdG9yYWdlIGZvciBuZXcgZGVmaW5pdGlvbnMgKi8KLSAgICBMVk1fRVFOQl9CYW5kRGVmX3QgICAgICAqcEVRTkJfVXNlckRlZnM7ICAgIC8qIExvY2FsIHN0b3JhZ2UgZm9yIHRoZSB1c2VyJ3MgZGVmaW5pdGlvbnMgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBFUU5CX0FjdGl2ZTsgICAgICAgIC8qIENvbnRyb2wgZmxhZyAqLworICAgIExWRVFOQl9IYW5kbGVfdCBoRVFOQkluc3RhbmNlOyAgICAgIC8qIE4tQmFuZCBFcXVhbGlzZXIgaW5zdGFuY2UgaGFuZGxlICovCisgICAgTFZFUU5CX0luc3RhbmNlX3QgRVFOQl9JbnN0YW5jZTsgICAgLyogTi1CYW5kIEVxdWFsaXNlciBpbnN0YW5jZSAqLworICAgIExWTV9FUU5CX0JhbmREZWZfdCogcEVRTkJfQmFuZERlZnM7IC8qIExvY2FsIHN0b3JhZ2UgZm9yIG5ldyBkZWZpbml0aW9ucyAqLworICAgIExWTV9FUU5CX0JhbmREZWZfdCogcEVRTkJfVXNlckRlZnM7IC8qIExvY2FsIHN0b3JhZ2UgZm9yIHRoZSB1c2VyJ3MgZGVmaW5pdGlvbnMgKi8KKyAgICBMVk1fSU5UMTYgRVFOQl9BY3RpdmU7ICAgICAgICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KIAogICAgIC8qIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCAqLwotICAgIExWREJFX0hhbmRsZV90ICAgICAgICAgIGhEQkVJbnN0YW5jZTsgICAgICAgLyogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGluc3RhbmNlIGhhbmRsZSAqLwotICAgIExWREJFX0luc3RhbmNlX3QgICAgICAgIERCRV9JbnN0YW5jZTsgICAgICAgLyogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGluc3RhbmNlICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgREJFX0FjdGl2ZTsgICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KKyAgICBMVkRCRV9IYW5kbGVfdCBoREJFSW5zdGFuY2U7ICAgLyogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGluc3RhbmNlIGhhbmRsZSAqLworICAgIExWREJFX0luc3RhbmNlX3QgREJFX0luc3RhbmNlOyAvKiBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgaW5zdGFuY2UgKi8KKyAgICBMVk1fSU5UMTYgREJFX0FjdGl2ZTsgICAgICAgICAgLyogQ29udHJvbCBmbGFnICovCiAKICAgICAvKiBWb2x1bWUgQ29udHJvbCAqLwotICAgIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAgIFZDX1ZvbHVtZTsgICAgICAgICAgLyogVm9sdW1lIHNjYWxlciAqLwotICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAgIFZDX0JhbGFuY2VNaXg7ICAgICAgLyogVkMgYmFsYW5jZSBtaXhlciAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFZDX1ZvbHVtZWRCOyAgICAgICAgLyogR2FpbiBpbiBkQiAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFZDX0FjdGl2ZTsgICAgICAgICAgLyogQ29udHJvbCBmbGFnICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVkNfQVZMRml4ZWRWb2x1bWU7ICAvKiBBVkwgZml4ZWQgdm9sdW1lICovCisgICAgTFZNaXhlcjNfMVN0X0ZMT0FUX3N0IFZDX1ZvbHVtZTsgICAgIC8qIFZvbHVtZSBzY2FsZXIgKi8KKyAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QgVkNfQmFsYW5jZU1peDsgLyogVkMgYmFsYW5jZSBtaXhlciAqLworICAgIExWTV9JTlQxNiBWQ19Wb2x1bWVkQjsgICAgICAgICAgICAgICAvKiBHYWluIGluIGRCICovCisgICAgTFZNX0lOVDE2IFZDX0FjdGl2ZTsgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgZmxhZyAqLworICAgIExWTV9JTlQxNiBWQ19BVkxGaXhlZFZvbHVtZTsgICAgICAgICAvKiBBVkwgZml4ZWQgdm9sdW1lICovCiAKICAgICAvKiBUcmVibGUgRW5oYW5jZW1lbnQgKi8KLSAgICBMVk1fVEVfRGF0YV90ICAgICAgICAgICAqcFRFX1RhcHM7ICAgICAgICAgIC8qIFRyZWJsZSBib29zdCBUYXBzICovCi0gICAgTFZNX1RFX0NvZWZzX3QgICAgICAgICAgKnBURV9TdGF0ZTsgICAgICAgICAvKiBTdGF0ZSBmb3IgdGhlIHRyZWJsZSBib29zdCBmaWx0ZXIgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBURV9BY3RpdmU7ICAgICAgICAgIC8qIENvbnRyb2wgZmxhZyAqLworICAgIHN0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjphdWRpb191dGlsczo6QmlxdWFkRmlsdGVyPExWTV9GTE9BVD4+CisgICAgICAgICAgICBwVEVCaXF1YWQ7IC8qIEJpcXVhZCBmaWx0ZXIgaW5zdGFuY2UgKi8KKyAgICBMVk1fSU5UMTYgVEVfQWN0aXZlOyAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KIAogICAgIC8qIEhlYWRyb29tICovCi0gICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgTmV3SGVhZHJvb21QYXJhbXM7ICAgLyogTmV3IGhlYWRyb29tIHBhcmFtZXRlcnMgcGVuZGluZyB1cGRhdGUgKi8KLSAgICBMVk1fSGVhZHJvb21QYXJhbXNfdCAgICBIZWFkcm9vbVBhcmFtczsgICAgICAvKiBIZWFkcm9vbSBwYXJhbWV0ZXJzICovCi0gICAgTFZNX0hlYWRyb29tQmFuZERlZl90ICAgKnBIZWFkcm9vbV9CYW5kRGVmczsgLyogTG9jYWwgc3RvcmFnZSBmb3IgbmV3IGRlZmluaXRpb25zICovCi0gICAgTFZNX0hlYWRyb29tQmFuZERlZl90ICAgKnBIZWFkcm9vbV9Vc2VyRGVmczsgLyogTG9jYWwgc3RvcmFnZSBmb3IgdGhlIHVzZXIncyBkZWZpbml0aW9ucyAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIEhlYWRyb29tOyAgICAgICAgICAgIC8qIFZhbHVlIG9mIHRoZSBjdXJyZW50IGhlYWRyb29tICovCisgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgTmV3SGVhZHJvb21QYXJhbXM7ICAgIC8qIE5ldyBoZWFkcm9vbSBwYXJhbWV0ZXJzIHBlbmRpbmcgdXBkYXRlICovCisgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgSGVhZHJvb21QYXJhbXM7ICAgICAgIC8qIEhlYWRyb29tIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fSGVhZHJvb21CYW5kRGVmX3QqIHBIZWFkcm9vbV9CYW5kRGVmczsgLyogTG9jYWwgc3RvcmFnZSBmb3IgbmV3IGRlZmluaXRpb25zICovCisgICAgTFZNX0hlYWRyb29tQmFuZERlZl90KiBwSGVhZHJvb21fVXNlckRlZnM7IC8qIExvY2FsIHN0b3JhZ2UgZm9yIHRoZSB1c2VyJ3MgZGVmaW5pdGlvbnMgKi8KKyAgICBMVk1fVUlOVDE2IEhlYWRyb29tOyAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgb2YgdGhlIGN1cnJlbnQgaGVhZHJvb20gKi8KIAogICAgIC8qIFNwZWN0cnVtIEFuYWx5emVyICovCi0gICAgcExWUFNBX0hhbmRsZV90ICAgICAgICAgaFBTQUluc3RhbmNlOyAgICAgICAvKiBTcGVjdHJ1bSBBbmFseXplciBpbnN0YW5jZSBoYW5kbGUgKi8KLSAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICBQU0FfSW5zdGFuY2U7ICAgICAgIC8qIFNwZWN0cnVtIEFuYWx5emVyIGluc3RhbmNlICovCi0gICAgTFZQU0FfSW5pdFBhcmFtc190ICAgICAgUFNBX0luaXRQYXJhbXM7ICAgICAvKiBTcGVjdHJ1bSBBbmFseXplciBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgUFNBX0NvbnRyb2xQYXJhbXM7ICAvKiBTcGVjdHJ1bSBBbmFseXplciBjb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBQU0FfR2Fpbk9mZnNldDsgICAgIC8qIFRvbmUgY29udHJvbCBmbGFnICovCi0gICAgTFZNX0NhbGxiYWNrICAgICAgICAgICAgQ2FsbEJhY2s7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBQU0FJbnB1dDsgICAgICAgICAvKiBQU0EgaW5wdXQgcG9pbnRlciAqLworICAgIHBMVlBTQV9IYW5kbGVfdCBoUFNBSW5zdGFuY2U7ICAgICAgICAgICAgLyogU3BlY3RydW0gQW5hbHl6ZXIgaW5zdGFuY2UgaGFuZGxlICovCisgICAgTFZQU0FfSW5zdGFuY2VQcl90IFBTQV9JbnN0YW5jZTsgICAgICAgICAvKiBTcGVjdHJ1bSBBbmFseXplciBpbnN0YW5jZSAqLworICAgIExWUFNBX0luaXRQYXJhbXNfdCBQU0FfSW5pdFBhcmFtczsgICAgICAgLyogU3BlY3RydW0gQW5hbHl6ZXIgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyAqLworICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCBQU0FfQ29udHJvbFBhcmFtczsgLyogU3BlY3RydW0gQW5hbHl6ZXIgY29udHJvbCBwYXJhbWV0ZXJzICovCisgICAgTFZNX0lOVDE2IFBTQV9HYWluT2Zmc2V0OyAgICAgICAgICAgICAgICAvKiBUb25lIGNvbnRyb2wgZmxhZyAqLworICAgIExWTV9DYWxsYmFjayBDYWxsQmFjazsKKyAgICBMVk1fRkxPQVQqIHBQU0FJbnB1dDsgLyogUFNBIGlucHV0IHBvaW50ZXIgKi8KIAotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgTm9TbW9vdGhWb2x1bWU7ICAgICAgLyogRW5hYmxlIG9yIGRpc2FibGUgc21vb3RoIHZvbHVtZSBjaGFuZ2VzKi8KKyAgICBMVk1fSU5UMTYgTm9TbW9vdGhWb2x1bWU7IC8qIEVuYWJsZSBvciBkaXNhYmxlIHNtb290aCB2b2x1bWUgY2hhbmdlcyovCiAKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICBOckNoYW5uZWxzOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgQ2hNYXNrOwotI2VuZGlmCisgICAgTFZNX0lOVDE2IE5yQ2hhbm5lbHM7CisgICAgTFZNX0lOVDMyIENoTWFzazsKKyAgICB2b2lkKiBwU2NyYXRjaDsgLyogUG9pbnRlciB0byBidW5kbGUgc2NyYXRjaCBidWZmZXIqLwogCiB9IExWTV9JbnN0YW5jZV90OwogCkBAIC0yNDksMzIgKzIxMSwxOSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0FwcGx5TmV3U2V0dGluZ3MoTFZNX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSk7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9BcHBseU5ld1NldHRpbmdzKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UpOwogCi12b2lkICAgIExWTV9TZXRUcmVibGVCb29zdCggTFZNX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpOwordm9pZCBMVk1fU2V0VHJlYmxlQm9vc3QoTFZNX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX0NvbnRyb2xQYXJhbXNfdCogcFBhcmFtcyk7CiAKLXZvaWQgICAgTFZNX1NldFZvbHVtZSggIExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpOwordm9pZCBMVk1fU2V0Vm9sdW1lKExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpOwogCi1MVk1fSU5UMzIgICAgTFZNX1ZDQ2FsbEJhY2sodm9pZCogICBwQnVuZGxlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgcEdlbmVyYWxQdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICAgQ2FsbEJhY2tQYXJhbSk7CitMVk1fSU5UMzIgTFZNX1ZDQ2FsbEJhY2sodm9pZCogcEJ1bmRsZUhhbmRsZSwgdm9pZCogcEdlbmVyYWxQdXJwb3NlLCBzaG9ydCBDYWxsQmFja1BhcmFtKTsKIAotdm9pZCAgICBMVk1fU2V0SGVhZHJvb20oICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKTsKLXZvaWQgICAgTFZNX0J1ZmZlckluKCAgIExWTV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgKipwVG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgKipwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKTsKLXZvaWQgICAgTFZNX0J1ZmZlck91dCggIExWTV9IYW5kbGVfdCAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcyk7Cit2b2lkIExWTV9TZXRIZWFkcm9vbShMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fQ29udHJvbFBhcmFtc190KiBwUGFyYW1zKTsKK3ZvaWQgTFZNX0J1ZmZlckluKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogcEluRGF0YSwgTFZNX0ZMT0FUKiogcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCoqIHBQcm9jZXNzZWQsIExWTV9VSU5UMTYqIHBOdW1TYW1wbGVzKTsKK3ZvaWQgTFZNX0J1ZmZlck91dChMVk1fSGFuZGxlX3QgaEluc3RhbmNlLCBMVk1fRkxPQVQqIHBPdXREYXRhLCBMVk1fVUlOVDE2KiBwTnVtU2FtcGxlcyk7CiAKLUxWTV9JTlQzMiBMVk1fQWxnb0NhbGxCYWNrKCAgICAgdm9pZCAgICAgICAgICAqcEJ1bmRsZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgY2FsbGJhY2tJZCk7CitMVk1fSU5UMzIgTFZNX0FsZ29DYWxsQmFjayh2b2lkKiBwQnVuZGxlSGFuZGxlLCB2b2lkKiBwRGF0YSwgTFZNX0lOVDE2IGNhbGxiYWNrSWQpOwogCi0jZW5kaWYgICAgICAvKiBfX0xWTV9QUklWQVRFX0hfXyAqLwotCisjZW5kaWYgLyogX19MVk1fUFJJVkFURV9IX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmNwcAppbmRleCBkYzg2Y2ZkLi40ZWVhMDRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKICNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgorI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAjaW5jbHVkZSAiTFZNX0NvZWZmcy5oIgogCkBAIC01MSwyNzkgKzUyLDE2NiBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fUHJvY2VzcyhMVk1fSGFuZGxlX3QgICAgICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lKQotewotCi0gICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlICA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICBTYW1wbGVDb3VudCA9IE51bVNhbXBsZXM7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICAqcElucHV0ICAgICA9IChMVk1fRkxPQVQgKilwSW5EYXRhOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBUb1Byb2Nlc3MgPSAoTFZNX0ZMT0FUICopcEluRGF0YTsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICpwUHJvY2Vzc2VkID0gcE91dERhdGE7Ci0gICAgTFZNX1JldHVyblN0YXR1c19lbiAgU3RhdHVzOwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICBMVk1fSU5UMzIgICAgICAgICAgIE5yQ2hhbm5lbHMgID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgQ2hNYXNrICAgICAgPSBwSW5zdGFuY2UtPkNoTWFzazsKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1Byb2Nlc3MoTFZNX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBPdXREYXRhLCBMVk1fVUlOVDE2IE51bVNhbXBsZXMsIExWTV9VSU5UMzIgQXVkaW9UaW1lKSB7CisgICAgTFZNX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCopaEluc3RhbmNlOworICAgIExWTV9VSU5UMTYgU2FtcGxlQ291bnQgPSBOdW1TYW1wbGVzOworICAgIExWTV9GTE9BVCogcElucHV0ID0gKExWTV9GTE9BVCopcEluRGF0YTsKKyAgICBMVk1fRkxPQVQqIHBUb1Byb2Nlc3MgPSAoTFZNX0ZMT0FUKilwSW5EYXRhOworICAgIExWTV9GTE9BVCogcFByb2Nlc3NlZCA9IHBPdXREYXRhOworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gU3RhdHVzOworICAgIExWTV9JTlQzMiBOckNoYW5uZWxzID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOworICAgIExWTV9JTlQzMiBDaE1hc2sgPSBwSW5zdGFuY2UtPkNoTWFzazsKICNkZWZpbmUgTnJGcmFtZXMgU2FtcGxlQ291bnQgIC8vIGFsaWFzIGZvciBjbGFyaXR5Ci0jZW5kaWYKIAogICAgIC8qCiAgICAgICogQ2hlY2sgaWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIHplcm8KICAgICAgKi8KLSAgICBpZiAoTnVtU2FtcGxlcyA9PSAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKKyAgICBpZiAoTnVtU2FtcGxlcyA9PSAwKSB7CisgICAgICAgIHJldHVybiAoTFZNX1NVQ0NFU1MpOwogICAgIH0KIAogICAgIC8qCiAgICAgICogQ2hlY2sgdmFsaWQgcG9pbnRzIGhhdmUgYmVlbiBnaXZlbgogICAgICAqLwotICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKLSAgICB7CisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5EYXRhID09IExWTV9OVUxMKSB8fCAocE91dERhdGEgPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKICAgICB9CiAKICAgICAvKgogICAgICAqIEZvciB1bm1hbmFnZWQgbW9kZSBvbmx5CiAgICAgICovCi0gICAgaWYocEluc3RhbmNlLT5JbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPT0gTFZNX1VOTUFOQUdFRF9CVUZGRVJTKQotICAgIHsKLSAgICAgICAgIC8qCisgICAgaWYgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5CdWZmZXJNb2RlID09IExWTV9VTk1BTkFHRURfQlVGRkVSUykgeworICAgICAgICAvKgogICAgICAgICAgKiBDaGVjayBpZiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgYSBnb29kIG11bHRpcGxlICh1bm1hbmFnZWQgbW9kZSBvbmx5KQogICAgICAgICAgKi8KLSAgICAgICAgaWYoKE51bVNhbXBsZXMgJSBwSW5zdGFuY2UtPkJsaWNrU2l6ZU11bHRpcGxlKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4oTFZNX0lOVkFMSUROVU1TQU1QTEVTKTsKKyAgICAgICAgaWYgKChOdW1TYW1wbGVzICUgcEluc3RhbmNlLT5CbGlja1NpemVNdWx0aXBsZSkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIChMVk1fSU5WQUxJRE5VTVNBTVBMRVMpOwogICAgICAgICB9CiAKICAgICAgICAgLyoKICAgICAgICAgICogQ2hlY2sgdGhlIGJ1ZmZlciBhbGlnbm1lbnQKICAgICAgICAgICovCi0gICAgICAgIGlmKCgoKHVpbnRwdHJfdClwSW5EYXRhICUgNCkgIT0gMCkgfHwgKCgodWludHB0cl90KXBPdXREYXRhICUgNCkgIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybihMVk1fQUxJR05NRU5URVJST1IpOworICAgICAgICBpZiAoKCgodWludHB0cl90KXBJbkRhdGEgJSA0KSAhPSAwKSB8fCAoKCh1aW50cHRyX3QpcE91dERhdGEgJSA0KSAhPSAwKSkgeworICAgICAgICAgICAgcmV0dXJuIChMVk1fQUxJR05NRU5URVJST1IpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgbmV3IHBhcmFtZXRlcnMgaWYgbmVjZXNzYXJ5CiAgICAgICovCi0gICAgaWYgKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCi0gICAgeworICAgIGlmIChwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKSB7CiAgICAgICAgIFN0YXR1cyA9IExWTV9BcHBseU5ld1NldHRpbmdzKGhJbnN0YW5jZSk7Ci0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICAvKiBVcGRhdGUgdGhlIGxvY2FsIHZhcmlhYmxlIE5yQ2hhbm5lbHMgZnJvbSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHMgdmFsdWUgKi8KICAgICAgICAgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKLSAgICAgICAgQ2hNYXNrICAgICA9IHBJbnN0YW5jZS0+Q2hNYXNrOwotI2VuZGlmCisgICAgICAgIENoTWFzayA9IHBJbnN0YW5jZS0+Q2hNYXNrOwogCi0gICAgICAgIGlmKFN0YXR1cyAhPSBMVk1fU1VDQ0VTUykKLSAgICAgICAgeworICAgICAgICBpZiAoU3RhdHVzICE9IExWTV9TVUNDRVNTKSB7CiAgICAgICAgICAgICByZXR1cm4gU3RhdHVzOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoKLSAgICAgKiBDb252ZXJ0IGZyb20gTW9ubyBpZiBuZWNlc3NhcnkKLSAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKQotICAgIHsKLSAgICAgICAgTW9ub1RvMklfRmxvYXQocEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCi0gICAgICAgIHBJbnB1dCAgICAgPSBwT3V0RGF0YTsKLSAgICAgICAgcFRvUHJvY2VzcyA9IHBPdXREYXRhOwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICAgICAgTnJDaGFubmVscyA9IDI7Ci0gICAgICAgIENoTWFzayAgICAgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICAvKgogICAgICAqIFByb2Nlc3MgdGhlIGRhdGEgd2l0aCBtYW5hZ2VkIGJ1ZmZlcnMKICAgICAgKi8KLSAgICB3aGlsZSAoU2FtcGxlQ291bnQgIT0gMCkKLSAgICB7CisgICAgd2hpbGUgKFNhbXBsZUNvdW50ICE9IDApIHsKICAgICAgICAgLyoKICAgICAgICAgICogTWFuYWdlIHRoZSBpbnB1dCBidWZmZXIgYW5kIGZyYW1lIHByb2Nlc3NpbmcKICAgICAgICAgICovCi0gICAgICAgIExWTV9CdWZmZXJJbihoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICBwSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAmcFRvUHJvY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICZwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgJlNhbXBsZUNvdW50KTsKKyAgICAgICAgTFZNX0J1ZmZlckluKGhJbnN0YW5jZSwgcElucHV0LCAmcFRvUHJvY2VzcywgJnBQcm9jZXNzZWQsICZTYW1wbGVDb3VudCk7CiAKICAgICAgICAgLyoKICAgICAgICAgICogT25seSBwcm9jZXNzIGRhdGEgd2hlbiBTYW1wbGVDb3VudCBpcyBub25lIHplcm8sIGEgemVybyBjb3VudCBjYW4gb2NjdXIgd2hlbgogICAgICAgICAgKiB0aGUgQnVmZmVySW4gcm91dGluZSBpcyB3b3JraW5nIGluIG1hbmFnZWQgbW9kZS4KICAgICAgICAgICovCi0gICAgICAgIGlmIChTYW1wbGVDb3VudCAhPSAwKQotICAgICAgICB7CisgICAgICAgIGlmIChTYW1wbGVDb3VudCAhPSAwKSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQXBwbHkgQ29uY2VydFNvdW5kIGlmIHJlcXVpcmVkCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPkNTX0FjdGl2ZSA9PSBMVk1fVFJVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAodm9pZClMVkNTX1Byb2Nlc3MocEluc3RhbmNlLT5oQ1NJbnN0YW5jZSwgICAgIC8qIENvbmNlcnQgU291bmQgaW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPkNTX0FjdGl2ZSA9PSBMVk1fVFJVRSkgeworICAgICAgICAgICAgICAgICh2b2lkKUxWQ1NfUHJvY2VzcyhwSW5zdGFuY2UtPmhDU0luc3RhbmNlLCAvKiBDb25jZXJ0IFNvdW5kIGluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLCBwUHJvY2Vzc2VkLCBTYW1wbGVDb3VudCk7CiAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBBcHBseSB2b2x1bWUgaWYgcmVxdWlyZWQKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+VkNfQWN0aXZlIT0wKQotICAgICAgICAgICAgewotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICAgICAgICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX1ZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJGcmFtZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7Ci0jZWxzZQotICAgICAgICAgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX1ZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCovCi0jZW5kaWYKKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPlZDX0FjdGl2ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUsIHBUb1Byb2Nlc3MsIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckZyYW1lcyksIE5yQ2hhbm5lbHMpOwogICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQ2FsbCBOLUJhbmQgZXF1YWxpc2VyIGlmIGVuYWJsZWQKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+RVFOQl9BY3RpdmUgPT0gTFZNX1RSVUUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTFZFUU5CX1Byb2Nlc3MocEluc3RhbmNlLT5oRVFOQkluc3RhbmNlLCAgICAvKiBOLUJhbmQgZXF1YWxpc2VyIGluc3RhbmNlIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5FUU5CX0FjdGl2ZSA9PSBMVk1fVFJVRSkgeworICAgICAgICAgICAgICAgIExWRVFOQl9Qcm9jZXNzKHBJbnN0YW5jZS0+aEVRTkJJbnN0YW5jZSwgLyogTi1CYW5kIGVxdWFsaXNlciBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLCBwUHJvY2Vzc2VkLCBTYW1wbGVDb3VudCk7CiAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDYWxsIGJhc3MgZW5oYW5jZW1lbnQgaWYgZW5hYmxlZAogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocEluc3RhbmNlLT5EQkVfQWN0aXZlID09IExWTV9UUlVFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExWREJFX1Byb2Nlc3MocEluc3RhbmNlLT5oREJFSW5zdGFuY2UsICAgICAgIC8qIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPkRCRV9BY3RpdmUgPT0gTFZNX1RSVUUpIHsKKyAgICAgICAgICAgICAgICBMVkRCRV9Qcm9jZXNzKHBJbnN0YW5jZS0+aERCRUluc3RhbmNlLCAvKiBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywgcFByb2Nlc3NlZCwgU2FtcGxlQ291bnQpOwogICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQnlwYXNzIG1vZGUgb3IgZXZlcnl0aGluZyBvZmYsIHNvIGNvcHkgdGhlIGlucHV0IHRvIHRoZSBvdXRwdXQKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHBUb1Byb2Nlc3MgIT0gcFByb2Nlc3NlZCkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICAgICAgQ29weV9GbG9hdChwVG9Qcm9jZXNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBOckZyYW1lcykpOyAgICAvKiBDb3B5IGFsbCBzYW1wbGVzICovCi0jZWxzZQotICAgICAgICAgICAgICAgIENvcHlfRmxvYXQocFRvUHJvY2VzcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KLSNlbmRpZgorICAgICAgICAgICAgaWYgKHBUb1Byb2Nlc3MgIT0gcFByb2Nlc3NlZCkgeworICAgICAgICAgICAgICAgIENvcHlfRmxvYXQocFRvUHJvY2VzcywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogTnJGcmFtZXMpKTsgLyogQ29weSBhbGwgc2FtcGxlcyAqLwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQXBwbHkgdHJlYmxlIGJvb3N0IGlmIHJlcXVpcmVkCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPlRFX0FjdGl2ZSA9PSBMVk1fVFJVRSkKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPlRFX0FjdGl2ZSA9PSBMVk1fVFJVRSkgewogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGZpbHRlcgogICAgICAgICAgICAgICAgICAqLwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICAgICAgICAgICAgICBGT19NY19EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBURV9TdGF0ZS0+VHJlYmxlQm9vc3RfU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wVEVfU3RhdGUtPlRyZWJsZUJvb3N0X1N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KVNhbXBsZUNvdW50KTsKLSNlbmRpZgotCisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wVEVCaXF1YWQtPnByb2Nlc3MocFByb2Nlc3NlZCwgcFByb2Nlc3NlZCwgTnJGcmFtZXMpOworICAgICAgICAgICAgICAgIGZvciAoYXV0byBpID0gMDsgaSA8IE5yQ2hhbm5lbHMgKiBOckZyYW1lczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWRbaV0gPSBMVk1fQ2xhbXAocFByb2Nlc3NlZFtpXSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBWb2x1bWUgYmFsYW5jZQogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfTUNfZmxvYXRfU0FUKCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoTWFzayk7Ci0jZWxzZQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFZvbHVtZSBiYWxhbmNlCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKLSNlbmRpZgorICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0X01DX2Zsb2F0X1NBVCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4LCBwUHJvY2Vzc2VkLCBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywgTnJDaGFubmVscywgQ2hNYXNrKTsKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFBlcmZvcm0gUGFyYW1ldHJpYyBTcGVjdHVtIEFuYWx5c2lzCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuUFNBX0VuYWJsZSA9PSBMVk1fUFNBX09OKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5JbnN0UGFyYW1zLlBTQV9JbmNsdWRlZCA9PSBMVk1fUFNBX09OKSkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICAgICAgRnJvbU1jVG9Nb25vX0Zsb2F0KHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckZyYW1lcyksCisgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgPT0gTFZNX1BTQV9PTikpIHsKKyAgICAgICAgICAgICAgICBGcm9tTWNUb01vbm9fRmxvYXQocFByb2Nlc3NlZCwgcEluc3RhbmNlLT5wUFNBSW5wdXQsIChMVk1fSU5UMTYpKE5yRnJhbWVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7Ci0jZWxzZQotICAgICAgICAgICAgICAgIEZyb20yaVRvTW9ub19GbG9hdChwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoU2FtcGxlQ291bnQpKTsKLSNlbmRpZgogCi0gICAgICAgICAgICAgICAgTFZQU0FfUHJvY2VzcyhwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKFNhbXBsZUNvdW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSk7CisgICAgICAgICAgICAgICAgTFZQU0FfUHJvY2VzcyhwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSwgcEluc3RhbmNlLT5wUFNBSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoU2FtcGxlQ291bnQpLCBBdWRpb1RpbWUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogREMgcmVtb3ZhbAogICAgICAgICAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwotICAgICAgICAgICAgRENfTWNfRDE2X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7Ci0jZWxzZQotICAgICAgICAgICAgRENfMklfRDE2X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KVNhbXBsZUNvdW50KTsKLSNlbmRpZgorICAgICAgICAgICAgRENfTWNfRDE2X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlLCBwUHJvY2Vzc2VkLCBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywgTnJDaGFubmVscyk7CiAgICAgICAgIH0KICAgICAgICAgLyoKICAgICAgICAgICogTWFuYWdlIHRoZSBvdXRwdXQgYnVmZmVyCiAgICAgICAgICAqLwotICAgICAgICBMVk1fQnVmZmVyT3V0KGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAmU2FtcGxlQ291bnQpOwotCisgICAgICAgIExWTV9CdWZmZXJPdXQoaEluc3RhbmNlLCBwT3V0RGF0YSwgJlNhbXBsZUNvdW50KTsKICAgICB9CiAKLSAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZNX1NVQ0NFU1MpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmNwcAppbmRleCA2NjM5MmUyLi44NjAxOTZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmNwcApAQCAtMzAsNDMxICszMCwyOTcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1GT19GTE9BVF9MU2h4X0NvZWZzX3QgICAgTFZNX1RyZWJsZUJvb3N0Q29lZnNbXSA9IHsKK0ZPX0ZMT0FUX0xTaHhfQ29lZnNfdCBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdID0gewogCi0gICAgICAgICAgICAgICAgICAgIC8qIDIya0h6IHNhbXBsaW5nIHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjFfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4zX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4zX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjRfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluNV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW42X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW42X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjdfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjdfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluOF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluOF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW45X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW45X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTBfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjEwX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjExX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTJfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjEyX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTNfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjEzX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjE0X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTVfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjE1X0IxfSwKKyAgICAgICAgLyogMjJrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjFfQTEsIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMV9BMCwgLUhQRl9GczIyMDUwX0dhaW4xX0IxfSwKKyAgICAgICAge0hQRl9GczIyMDUwX0dhaW4yX0ExLCAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjJfQTAsIC1IUEZfRnMyMjA1MF9HYWluMl9CMX0sCisgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluM19BMSwgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4zX0EwLCAtSFBGX0ZzMjIwNTBfR2FpbjNfQjF9LAorICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjRfQTEsIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNF9BMCwgLUhQRl9GczIyMDUwX0dhaW40X0IxfSwKKyAgICAgICAge0hQRl9GczIyMDUwX0dhaW41X0ExLCAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjVfQTAsIC1IUEZfRnMyMjA1MF9HYWluNV9CMX0sCisgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluNl9BMSwgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgIEhQRl9GczIyMDUwX0dhaW42X0EwLCAtSFBGX0ZzMjIwNTBfR2FpbjZfQjF9LAorICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjdfQTEsIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICBIUEZfRnMyMjA1MF9HYWluN19BMCwgLUhQRl9GczIyMDUwX0dhaW43X0IxfSwKKyAgICAgICAge0hQRl9GczIyMDUwX0dhaW44X0ExLCAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjhfQTAsIC1IUEZfRnMyMjA1MF9HYWluOF9CMX0sCisgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluOV9BMSwgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgIEhQRl9GczIyMDUwX0dhaW45X0EwLCAtSFBGX0ZzMjIwNTBfR2FpbjlfQjF9LAorICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEwX0ExLCAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMF9BMCwgLUhQRl9GczIyMDUwX0dhaW4xMF9CMX0sCisgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTFfQTEsIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjExX0EwLCAtSFBGX0ZzMjIwNTBfR2FpbjExX0IxfSwKKyAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xMl9BMSwgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTJfQTAsIC1IUEZfRnMyMjA1MF9HYWluMTJfQjF9LAorICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEzX0ExLCAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xM19BMCwgLUhQRl9GczIyMDUwX0dhaW4xM19CMX0sCisgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTRfQTEsIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjE0X0EwLCAtSFBGX0ZzMjIwNTBfR2FpbjE0X0IxfSwKKyAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xNV9BMSwgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTVfQTAsIC1IUEZfRnMyMjA1MF9HYWluMTVfQjF9LAogCi0gICAgICAgICAgICAgICAgICAgIC8qIDI0a0h6IHNhbXBsaW5nIHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjFfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4zX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4zX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjRfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluNV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW42X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW42X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjdfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjdfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluOF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluOF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW45X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW45X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTBfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjEwX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjExX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTJfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjEyX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTNfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjEzX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjE0X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTVfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjE1X0IxfSwKKyAgICAgICAgLyogMjRrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjFfQTEsIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMV9BMCwgLUhQRl9GczI0MDAwX0dhaW4xX0IxfSwKKyAgICAgICAge0hQRl9GczI0MDAwX0dhaW4yX0ExLCAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjJfQTAsIC1IUEZfRnMyNDAwMF9HYWluMl9CMX0sCisgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluM19BMSwgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4zX0EwLCAtSFBGX0ZzMjQwMDBfR2FpbjNfQjF9LAorICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjRfQTEsIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNF9BMCwgLUhQRl9GczI0MDAwX0dhaW40X0IxfSwKKyAgICAgICAge0hQRl9GczI0MDAwX0dhaW41X0ExLCAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjVfQTAsIC1IUEZfRnMyNDAwMF9HYWluNV9CMX0sCisgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluNl9BMSwgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgIEhQRl9GczI0MDAwX0dhaW42X0EwLCAtSFBGX0ZzMjQwMDBfR2FpbjZfQjF9LAorICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjdfQTEsIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICBIUEZfRnMyNDAwMF9HYWluN19BMCwgLUhQRl9GczI0MDAwX0dhaW43X0IxfSwKKyAgICAgICAge0hQRl9GczI0MDAwX0dhaW44X0ExLCAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjhfQTAsIC1IUEZfRnMyNDAwMF9HYWluOF9CMX0sCisgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluOV9BMSwgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgIEhQRl9GczI0MDAwX0dhaW45X0EwLCAtSFBGX0ZzMjQwMDBfR2FpbjlfQjF9LAorICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEwX0ExLCAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMF9BMCwgLUhQRl9GczI0MDAwX0dhaW4xMF9CMX0sCisgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMTFfQTEsIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjExX0EwLCAtSFBGX0ZzMjQwMDBfR2FpbjExX0IxfSwKKyAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMl9BMSwgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTJfQTAsIC1IUEZfRnMyNDAwMF9HYWluMTJfQjF9LAorICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEzX0ExLCAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xM19BMCwgLUhQRl9GczI0MDAwX0dhaW4xM19CMX0sCisgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMTRfQTEsIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjE0X0EwLCAtSFBGX0ZzMjQwMDBfR2FpbjE0X0IxfSwKKyAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xNV9BMSwgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTVfQTAsIC1IUEZfRnMyNDAwMF9HYWluMTVfQjF9LAogCi0gICAgICAgICAgICAgICAgICAgIC8qIDMya0h6IHNhbXBsaW5nIHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjFfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4zX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4zX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjRfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluNV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW42X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW42X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjdfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjdfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluOF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluOF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW45X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW45X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTBfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjEwX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjExX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTJfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjEyX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTNfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjEzX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjE0X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTVfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjE1X0IxfSwKKyAgICAgICAgLyogMzJrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjFfQTEsIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMV9BMCwgLUhQRl9GczMyMDAwX0dhaW4xX0IxfSwKKyAgICAgICAge0hQRl9GczMyMDAwX0dhaW4yX0ExLCAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjJfQTAsIC1IUEZfRnMzMjAwMF9HYWluMl9CMX0sCisgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluM19BMSwgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4zX0EwLCAtSFBGX0ZzMzIwMDBfR2FpbjNfQjF9LAorICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjRfQTEsIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNF9BMCwgLUhQRl9GczMyMDAwX0dhaW40X0IxfSwKKyAgICAgICAge0hQRl9GczMyMDAwX0dhaW41X0ExLCAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjVfQTAsIC1IUEZfRnMzMjAwMF9HYWluNV9CMX0sCisgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluNl9BMSwgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgIEhQRl9GczMyMDAwX0dhaW42X0EwLCAtSFBGX0ZzMzIwMDBfR2FpbjZfQjF9LAorICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjdfQTEsIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICBIUEZfRnMzMjAwMF9HYWluN19BMCwgLUhQRl9GczMyMDAwX0dhaW43X0IxfSwKKyAgICAgICAge0hQRl9GczMyMDAwX0dhaW44X0ExLCAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjhfQTAsIC1IUEZfRnMzMjAwMF9HYWluOF9CMX0sCisgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluOV9BMSwgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgIEhQRl9GczMyMDAwX0dhaW45X0EwLCAtSFBGX0ZzMzIwMDBfR2FpbjlfQjF9LAorICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjEwX0ExLCAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xMF9BMCwgLUhQRl9GczMyMDAwX0dhaW4xMF9CMX0sCisgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTFfQTEsIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjExX0EwLCAtSFBGX0ZzMzIwMDBfR2FpbjExX0IxfSwKKyAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMl9BMSwgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTJfQTAsIC1IUEZfRnMzMjAwMF9HYWluMTJfQjF9LAorICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjEzX0ExLCAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xM19BMCwgLUhQRl9GczMyMDAwX0dhaW4xM19CMX0sCisgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTRfQTEsIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjE0X0EwLCAtSFBGX0ZzMzIwMDBfR2FpbjE0X0IxfSwKKyAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xNV9BMSwgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTVfQTAsIC1IUEZfRnMzMjAwMF9HYWluMTVfQjF9LAogCi0gICAgICAgICAgICAgICAgICAgIC8qIDQ0a0h6IHNhbXBsaW5nIHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjFfQjEsfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjJfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluM19BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluM19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW40X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW40X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjVfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjVfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluNl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW43X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW43X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjhfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjhfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluOV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluOV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjEwX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xMF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjExX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjEyX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjEzX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xM19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjE0X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjE1X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xNV9CMX0sCisgICAgICAgIC8qIDQ0a0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgeworICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xX0ExLCAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMV9CMSwKKyAgICAgICAgfSwKKyAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4yX0ExLCAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjJfQTAsIC1IUEZfRnM0NDEwMF9HYWluMl9CMX0sCisgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluM19BMSwgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4zX0EwLCAtSFBGX0ZzNDQxMDBfR2FpbjNfQjF9LAorICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjRfQTEsIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNF9BMCwgLUhQRl9GczQ0MTAwX0dhaW40X0IxfSwKKyAgICAgICAge0hQRl9GczQ0MTAwX0dhaW41X0ExLCAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjVfQTAsIC1IUEZfRnM0NDEwMF9HYWluNV9CMX0sCisgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluNl9BMSwgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW42X0EwLCAtSFBGX0ZzNDQxMDBfR2FpbjZfQjF9LAorICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjdfQTEsIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICBIUEZfRnM0NDEwMF9HYWluN19BMCwgLUhQRl9GczQ0MTAwX0dhaW43X0IxfSwKKyAgICAgICAge0hQRl9GczQ0MTAwX0dhaW44X0ExLCAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjhfQTAsIC1IUEZfRnM0NDEwMF9HYWluOF9CMX0sCisgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluOV9BMSwgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW45X0EwLCAtSFBGX0ZzNDQxMDBfR2FpbjlfQjF9LAorICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEwX0ExLCAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMF9BMCwgLUhQRl9GczQ0MTAwX0dhaW4xMF9CMX0sCisgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTFfQTEsIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjExX0EwLCAtSFBGX0ZzNDQxMDBfR2FpbjExX0IxfSwKKyAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xMl9BMSwgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTJfQTAsIC1IUEZfRnM0NDEwMF9HYWluMTJfQjF9LAorICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEzX0ExLCAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xM19BMCwgLUhQRl9GczQ0MTAwX0dhaW4xM19CMX0sCisgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTRfQTEsIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjE0X0EwLCAtSFBGX0ZzNDQxMDBfR2FpbjE0X0IxfSwKKyAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xNV9BMSwgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTVfQTAsIC1IUEZfRnM0NDEwMF9HYWluMTVfQjF9LAogCi0gICAgICAgICAgICAgICAgICAgIC8qIDQ4a0h6IHNhbXBsaW5nIHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjFfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4zX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4zX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjRfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluNV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW42X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW42X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjdfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjdfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluOF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluOF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW45X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW45X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTBfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEwX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjExX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTJfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEyX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTNfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEzX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjE0X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTVfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjE1X0IxfQotICAgICAgICAgICAgICAgICAgICAsCi0gICAgICAgICAgICAgICAgICAgIC8qIDg4a0h6IFNhbXBsaW5nIHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjFfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAyICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4yX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMyAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluM19BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4zX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDQgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjRfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA1ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW41X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjVfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNiAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluNl9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW42X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDcgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjdfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluN19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA4ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW44X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjhfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgOSAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluOV9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW45X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMCAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTBfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTBfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDExICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTIgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjEyX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjEyX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMyAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTNfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDE0ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xNF9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTUgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjE1X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjE1X0IxfSwKKyAgICAgICAgLyogNDhrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjFfQTEsIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMV9BMCwgLUhQRl9GczQ4MDAwX0dhaW4xX0IxfSwKKyAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4yX0ExLCAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjJfQTAsIC1IUEZfRnM0ODAwMF9HYWluMl9CMX0sCisgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluM19BMSwgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4zX0EwLCAtSFBGX0ZzNDgwMDBfR2FpbjNfQjF9LAorICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjRfQTEsIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNF9BMCwgLUhQRl9GczQ4MDAwX0dhaW40X0IxfSwKKyAgICAgICAge0hQRl9GczQ4MDAwX0dhaW41X0ExLCAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjVfQTAsIC1IUEZfRnM0ODAwMF9HYWluNV9CMX0sCisgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluNl9BMSwgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW42X0EwLCAtSFBGX0ZzNDgwMDBfR2FpbjZfQjF9LAorICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjdfQTEsIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICBIUEZfRnM0ODAwMF9HYWluN19BMCwgLUhQRl9GczQ4MDAwX0dhaW43X0IxfSwKKyAgICAgICAge0hQRl9GczQ4MDAwX0dhaW44X0ExLCAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjhfQTAsIC1IUEZfRnM0ODAwMF9HYWluOF9CMX0sCisgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluOV9BMSwgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW45X0EwLCAtSFBGX0ZzNDgwMDBfR2FpbjlfQjF9LAorICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjEwX0ExLCAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xMF9BMCwgLUhQRl9GczQ4MDAwX0dhaW4xMF9CMX0sCisgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTFfQTEsIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjExX0EwLCAtSFBGX0ZzNDgwMDBfR2FpbjExX0IxfSwKKyAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMl9BMSwgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTJfQTAsIC1IUEZfRnM0ODAwMF9HYWluMTJfQjF9LAorICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjEzX0ExLCAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xM19BMCwgLUhQRl9GczQ4MDAwX0dhaW4xM19CMX0sCisgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTRfQTEsIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjE0X0EwLCAtSFBGX0ZzNDgwMDBfR2FpbjE0X0IxfSwKKyAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xNV9BMSwgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTVfQTAsIC1IUEZfRnM0ODAwMF9HYWluMTVfQjF9LAorICAgICAgICAvKiA4OGtIeiBTYW1wbGluZyByYXRlICovCisgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMV9BMSwgLyogR2FpbiBTZXR0aW5nICAxICovCisgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMV9BMCwgLUhQRl9Gczg4MjAwX0dhaW4xX0IxfSwKKyAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4yX0ExLCAvKiBHYWluIFNldHRpbmcgIDIgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4yX0EwLCAtSFBGX0ZzODgyMDBfR2FpbjJfQjF9LAorICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjNfQTEsIC8qIEdhaW4gU2V0dGluZyAgMyAqLworICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjNfQTAsIC1IUEZfRnM4ODIwMF9HYWluM19CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluNF9BMSwgLyogR2FpbiBTZXR0aW5nICA0ICovCisgICAgICAgICBIUEZfRnM4ODIwMF9HYWluNF9BMCwgLUhQRl9Gczg4MjAwX0dhaW40X0IxfSwKKyAgICAgICAge0hQRl9Gczg4MjAwX0dhaW41X0ExLCAvKiBHYWluIFNldHRpbmcgIDUgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW41X0EwLCAtSFBGX0ZzODgyMDBfR2FpbjVfQjF9LAorICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjZfQTEsIC8qIEdhaW4gU2V0dGluZyAgNiAqLworICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjZfQTAsIC1IUEZfRnM4ODIwMF9HYWluNl9CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluN19BMSwgLyogR2FpbiBTZXR0aW5nICA3ICovCisgICAgICAgICBIUEZfRnM4ODIwMF9HYWluN19BMCwgLUhQRl9Gczg4MjAwX0dhaW43X0IxfSwKKyAgICAgICAge0hQRl9Gczg4MjAwX0dhaW44X0ExLCAvKiBHYWluIFNldHRpbmcgIDggKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW44X0EwLCAtSFBGX0ZzODgyMDBfR2FpbjhfQjF9LAorICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjlfQTEsIC8qIEdhaW4gU2V0dGluZyAgOSAqLworICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjlfQTAsIC1IUEZfRnM4ODIwMF9HYWluOV9CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTBfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTAgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xMF9BMCwgLUhQRl9Gczg4MjAwX0dhaW4xMF9CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTFfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTEgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xMV9BMCwgLUhQRl9Gczg4MjAwX0dhaW4xMV9CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTJfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTIgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xMl9BMCwgLUhQRl9Gczg4MjAwX0dhaW4xMl9CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTNfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTMgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xM19BMCwgLUhQRl9Gczg4MjAwX0dhaW4xM19CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTRfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTQgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xNF9BMCwgLUhQRl9Gczg4MjAwX0dhaW4xNF9CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTVfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTUgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xNV9BMCwgLUhQRl9Gczg4MjAwX0dhaW4xNV9CMX0sCiAKLSAgICAgICAgICAgICAgICAgICAgLyogOTZrSHogc2FtcGxpbmcgcmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjFfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4yX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4zX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW40X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjRfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW41X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjVfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW42X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjZfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW43X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjdfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW44X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjhfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW45X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjlfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjEwX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjEwX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTJfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjEzX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjEzX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xNF9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTVfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTVfQjF9LAorICAgICAgICAvKiA5NmtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMV9BMSwgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xX0EwLCAtSFBGX0ZzOTYwMDBfR2FpbjFfQjF9LAorICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjJfQTEsIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMl9BMCwgLUhQRl9Gczk2MDAwX0dhaW4yX0IxfSwKKyAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4zX0ExLCAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjNfQTAsIC1IUEZfRnM5NjAwMF9HYWluM19CMX0sCisgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluNF9BMSwgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW40X0EwLCAtSFBGX0ZzOTYwMDBfR2FpbjRfQjF9LAorICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjVfQTEsIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICBIUEZfRnM5NjAwMF9HYWluNV9BMCwgLUhQRl9Gczk2MDAwX0dhaW41X0IxfSwKKyAgICAgICAge0hQRl9Gczk2MDAwX0dhaW42X0ExLCAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjZfQTAsIC1IUEZfRnM5NjAwMF9HYWluNl9CMX0sCisgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluN19BMSwgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW43X0EwLCAtSFBGX0ZzOTYwMDBfR2FpbjdfQjF9LAorICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjhfQTEsIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICBIUEZfRnM5NjAwMF9HYWluOF9BMCwgLUhQRl9Gczk2MDAwX0dhaW44X0IxfSwKKyAgICAgICAge0hQRl9Gczk2MDAwX0dhaW45X0ExLCAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjlfQTAsIC1IUEZfRnM5NjAwMF9HYWluOV9CMX0sCisgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTBfQTEsIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjEwX0EwLCAtSFBGX0ZzOTYwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xMV9BMSwgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTFfQTAsIC1IUEZfRnM5NjAwMF9HYWluMTFfQjF9LAorICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjEyX0ExLCAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xMl9BMCwgLUhQRl9Gczk2MDAwX0dhaW4xMl9CMX0sCisgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTNfQTEsIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjEzX0EwLCAtSFBGX0ZzOTYwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xNF9BMSwgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTRfQTAsIC1IUEZfRnM5NjAwMF9HYWluMTRfQjF9LAorICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjE1X0ExLCAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xNV9BMCwgLUhQRl9Gczk2MDAwX0dhaW4xNV9CMX0sCiAKLSAgICAgICAgICAgICAgICAgICAgLyogMTc2a0h6IFNhbXBsaW5nIHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMiAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjJfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4zX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4zX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA0ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluNF9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNSAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjVfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjVfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDYgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW42X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW42X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA3ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluN19BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluN19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgOCAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjhfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjhfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDkgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW45X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW45X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTAgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xMF9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTBfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMSAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjExX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEyICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTJfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjEyX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTMgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xM19BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxNCAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjE0X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDE1ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTVfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjE1X0IxfSwKKyAgICAgICAgLyogMTc2a0h6IFNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMV9BMSwgLyogR2FpbiBTZXR0aW5nICAxICovCisgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjFfQTAsIC1IUEZfRnMxNzY0MDBfR2FpbjFfQjF9LAorICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4yX0ExLCAvKiBHYWluIFNldHRpbmcgIDIgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMl9BMCwgLUhQRl9GczE3NjQwMF9HYWluMl9CMX0sCisgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjNfQTEsIC8qIEdhaW4gU2V0dGluZyAgMyAqLworICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4zX0EwLCAtSFBGX0ZzMTc2NDAwX0dhaW4zX0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9HYWluNF9BMSwgLyogR2FpbiBTZXR0aW5nICA0ICovCisgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjRfQTAsIC1IUEZfRnMxNzY0MDBfR2FpbjRfQjF9LAorICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW41X0ExLCAvKiBHYWluIFNldHRpbmcgIDUgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluNV9BMCwgLUhQRl9GczE3NjQwMF9HYWluNV9CMX0sCisgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjZfQTEsIC8qIEdhaW4gU2V0dGluZyAgNiAqLworICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW42X0EwLCAtSFBGX0ZzMTc2NDAwX0dhaW42X0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9HYWluN19BMSwgLyogR2FpbiBTZXR0aW5nICA3ICovCisgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjdfQTAsIC1IUEZfRnMxNzY0MDBfR2FpbjdfQjF9LAorICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW44X0ExLCAvKiBHYWluIFNldHRpbmcgIDggKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluOF9BMCwgLUhQRl9GczE3NjQwMF9HYWluOF9CMX0sCisgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjlfQTEsIC8qIEdhaW4gU2V0dGluZyAgOSAqLworICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW45X0EwLCAtSFBGX0ZzMTc2NDAwX0dhaW45X0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTBfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTAgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTBfQTAsIC1IUEZfRnMxNzY0MDBfR2FpbjEwX0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTFfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTEgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTFfQTAsIC1IUEZfRnMxNzY0MDBfR2FpbjExX0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTJfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTIgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTJfQTAsIC1IUEZfRnMxNzY0MDBfR2FpbjEyX0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTNfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTMgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTNfQTAsIC1IUEZfRnMxNzY0MDBfR2FpbjEzX0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTRfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTQgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTRfQTAsIC1IUEZfRnMxNzY0MDBfR2FpbjE0X0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTVfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTUgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTVfQTAsIC1IUEZfRnMxNzY0MDBfR2FpbjE1X0IxfSwKIAotICAgICAgICAgICAgICAgICAgICAvKiAxOTJrSHogc2FtcGxpbmcgcmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjFfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjFfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjJfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjNfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjRfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjRfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjVfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjVfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjZfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjZfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjdfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjdfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjhfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjhfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjlfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjlfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTBfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjEwX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjExX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTNfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjEzX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjE0X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTVfQjF9Ci0gICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgIC8qIDE5MmtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjFfQTEsIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjFfQTAsIC1IUEZfRnMxOTIwMDBfR2FpbjFfQjF9LAorICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4yX0ExLCAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4yX0EwLCAtSFBGX0ZzMTkyMDAwX0dhaW4yX0IxfSwKKyAgICAgICAge0hQRl9GczE5MjAwMF9HYWluM19BMSwgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluM19BMCwgLUhQRl9GczE5MjAwMF9HYWluM19CMX0sCisgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjRfQTEsIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjRfQTAsIC1IUEZfRnMxOTIwMDBfR2FpbjRfQjF9LAorICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW41X0ExLCAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW41X0EwLCAtSFBGX0ZzMTkyMDAwX0dhaW41X0IxfSwKKyAgICAgICAge0hQRl9GczE5MjAwMF9HYWluNl9BMSwgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluNl9BMCwgLUhQRl9GczE5MjAwMF9HYWluNl9CMX0sCisgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjdfQTEsIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjdfQTAsIC1IUEZfRnMxOTIwMDBfR2FpbjdfQjF9LAorICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW44X0ExLCAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW44X0EwLCAtSFBGX0ZzMTkyMDAwX0dhaW44X0IxfSwKKyAgICAgICAge0hQRl9GczE5MjAwMF9HYWluOV9BMSwgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluOV9BMCwgLUhQRl9GczE5MjAwMF9HYWluOV9CMX0sCisgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjEwX0ExLCAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTBfQTAsIC1IUEZfRnMxOTIwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTFfQTEsIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMCwgLUhQRl9GczE5MjAwMF9HYWluMTFfQjF9LAorICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xMl9BMSwgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjEyX0EwLCAtSFBGX0ZzMTkyMDAwX0dhaW4xMl9CMX0sCisgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjEzX0ExLCAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTNfQTAsIC1IUEZfRnMxOTIwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTRfQTEsIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xNF9BMCwgLUhQRl9GczE5MjAwMF9HYWluMTRfQjF9LAorICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xNV9BMSwgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjE1X0EwLCAtSFBGX0ZzMTkyMDAwX0dhaW4xNV9CMX19OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDYzLDE0ICszMjksMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIGRCIHRvIGxpbmVhciBjb252ZXJzaW9uIHRhYmxlICovCi1jb25zdCBMVk1fRkxPQVQgTFZNX1ZvbHVtZVRhYmxlW10gPSB7Ci0gICAgMS4wMDBmLCAgICAgICAgICAgICAvKiAgMGRCICovCi0gICAgMC44OTFmLCAgICAgICAgICAgICAvKiAtMWRCICovCi0gICAgMC43OTRmLCAgICAgICAgICAgICAvKiAtMmRCICovCi0gICAgMC43MDhmLCAgICAgICAgICAgICAvKiAtM2RCICovCi0gICAgMC42MzFmLCAgICAgICAgICAgICAvKiAtNGRCICovCi0gICAgMC41NjJmLCAgICAgICAgICAgICAvKiAtNWRCICovCi0gICAgMC41MDFmfTsgICAgICAgICAgICAvKiAtNmRCICovCitjb25zdCBMVk1fRkxPQVQgTFZNX1ZvbHVtZVRhYmxlW10gPSB7MS4wMDBmLCAgLyogIDBkQiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuODkxZiwgIC8qIC0xZEIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjc5NGYsICAvKiAtMmRCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43MDhmLCAgLyogLTNkQiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNjMxZiwgIC8qIC00ZEIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjU2MmYsICAvKiAtNWRCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41MDFmfTsgLyogLTZkQiAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQ3OCwyNCArMzQzLDE2IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBMVk1fTUlYX1RDX0ZzODAwMCAgICAgIDMyNTgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTQyNjI2OTUgKi8KLSNkZWZpbmUgTFZNX01JWF9UQ19GczExMDI1ICAgICAzMjYzMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk1ODQ5NjA5ICovCi0jZGVmaW5lIExWTV9NSVhfVENfRnMxMjAwMCAgICAgMzI2NDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NjE4NTMwMyAqLwotI2RlZmluZSBMVk1fTUlYX1RDX0ZzMTYwMDAgICAgIDMyNjc0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTcxMzEzNDggKi8KLSNkZWZpbmUgTFZNX01JWF9UQ19GczIyMDUwICAgICAzMjcwMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk3OTI0ODA1ICovCi0jZGVmaW5lIExWTV9NSVhfVENfRnMyNDAwMCAgICAgMzI3MDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODA3NzM5MyAqLwotI2RlZmluZSBMVk1fTUlYX1RDX0ZzMzIwMDAgICAgIDMyNzIxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg1NjU2NzQgKi8KLSNkZWZpbmUgTFZNX01JWF9UQ19GczQ0MTAwICAgICAzMjczNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4OTYyNDAyICovCi0jZGVmaW5lIExWTV9NSVhfVENfRnM0ODAwMCAgICAgMzI3MzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTA1Mzk1NSAqLworI2RlZmluZSBMVk1fTUlYX1RDX0ZzODAwMCAzMjU4MCAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTQyNjI2OTUgKi8KKyNkZWZpbmUgTFZNX01JWF9UQ19GczExMDI1IDMyNjMyIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk1ODQ5NjA5ICovCisjZGVmaW5lIExWTV9NSVhfVENfRnMxMjAwMCAzMjY0MyAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NjE4NTMwMyAqLworI2RlZmluZSBMVk1fTUlYX1RDX0ZzMTYwMDAgMzI2NzQgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTcxMzEzNDggKi8KKyNkZWZpbmUgTFZNX01JWF9UQ19GczIyMDUwIDMyNzAwIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk3OTI0ODA1ICovCisjZGVmaW5lIExWTV9NSVhfVENfRnMyNDAwMCAzMjcwNSAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODA3NzM5MyAqLworI2RlZmluZSBMVk1fTUlYX1RDX0ZzMzIwMDAgMzI3MjEgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg1NjU2NzQgKi8KKyNkZWZpbmUgTFZNX01JWF9UQ19GczQ0MTAwIDMyNzM0IC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4OTYyNDAyICovCisjZGVmaW5lIExWTV9NSVhfVENfRnM0ODAwMCAzMjczNyAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTA1Mzk1NSAqLwogCi1jb25zdCBMVk1fSU5UMTYgTFZNX01peGVyVENUYWJsZVtdID0gewotICAgIExWTV9NSVhfVENfRnM4MDAwLAotICAgIExWTV9NSVhfVENfRnMxMTAyNSwKLSAgICBMVk1fTUlYX1RDX0ZzMTIwMDAsCi0gICAgTFZNX01JWF9UQ19GczE2MDAwLAotICAgIExWTV9NSVhfVENfRnMyMjA1MCwKLSAgICBMVk1fTUlYX1RDX0ZzMjQwMDAsCi0gICAgTFZNX01JWF9UQ19GczMyMDAwLAotICAgIExWTV9NSVhfVENfRnM0NDEwMCwKLSAgICBMVk1fTUlYX1RDX0ZzNDgwMDB9OwotCitjb25zdCBMVk1fSU5UMTYgTFZNX01peGVyVENUYWJsZVtdID0ge0xWTV9NSVhfVENfRnM4MDAwLCAgTFZNX01JWF9UQ19GczExMDI1LCBMVk1fTUlYX1RDX0ZzMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NSVhfVENfRnMxNjAwMCwgTFZNX01JWF9UQ19GczIyMDUwLCBMVk1fTUlYX1RDX0ZzMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NSVhfVENfRnMzMjAwMCwgTFZNX01JWF9UQ19GczQ0MTAwLCBMVk1fTUlYX1RDX0ZzNDgwMDB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5oCmluZGV4IGZjODIxOTQuLmNmMmZiNWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmgKQEAgLTMzLDcgKzMzLDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1leHRlcm4gRk9fRkxPQVRfTFNoeF9Db2Vmc190ICAgICBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdOworZXh0ZXJuIEZPX0ZMT0FUX0xTaHhfQ29lZnNfdCBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQ1LDQgKzQ1LDMgQEAKIGV4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZNX01peGVyVENUYWJsZVtdOwogCiAjZW5kaWYgLyogX19MVk1fVEFCTEVTX0hfXyAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCmluZGV4IGJlZjdmYTEuLjMxYzgyMDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCkBAIC0zMSwxNiArMzEsMTUgQEAKIC8qICAgIFR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0ZMT0FUICBBR0NfR2FpbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgY3VycmVudCBBR0MgZ2FpbiAqLwotICAgIExWTV9GTE9BVCAgQUdDX01heEdhaW47ICAgICAgICAgICAgICAgICAgICAgLyogVGhlIG1heGltdW0gQUdDIGdhaW4gKi8KLSAgICBMVk1fRkxPQVQgIFZvbHVtZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBjdXJyZW50IHZvbHVtZSBzZXR0aW5nICovCi0gICAgTFZNX0ZMT0FUICBUYXJnZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgdGFyZ2V0IHZvbHVtZSBzZXR0aW5nICovCi0gICAgTFZNX0ZMT0FUICBBR0NfVGFyZ2V0OyAgICAgICAgICAgICAgICAgICAgICAvKiBBR0MgdGFyZ2V0IGxldmVsICovCi0gICAgTFZNX0ZMT0FUICBBR0NfQXR0YWNrOyAgICAgICAgICAgICAgICAgICAgICAvKiBBR0MgYXR0YWNrIHNjYWxlciAqLwotICAgIExWTV9GTE9BVCAgQUdDX0RlY2F5OyAgICAgICAgICAgICAgICAgICAgICAgLyogQUdDIGRlY2F5IHNjYWxlciAqLwotICAgIExWTV9GTE9BVCAgVm9sdW1lVEM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVm9sdW1lIHVwZGF0ZSB0aW1lIGNvbnN0YW50ICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0ZMT0FUIEFHQ19HYWluOyAgICAvKiBUaGUgY3VycmVudCBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCBBR0NfTWF4R2FpbjsgLyogVGhlIG1heGltdW0gQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgVm9sdW1lOyAgICAgIC8qIFRoZSBjdXJyZW50IHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUIFRhcmdldDsgICAgICAvKiBUaGUgdGFyZ2V0IHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUIEFHQ19UYXJnZXQ7ICAvKiBBR0MgdGFyZ2V0IGxldmVsICovCisgICAgTFZNX0ZMT0FUIEFHQ19BdHRhY2s7ICAvKiBBR0MgYXR0YWNrIHNjYWxlciAqLworICAgIExWTV9GTE9BVCBBR0NfRGVjYXk7ICAgLyogQUdDIGRlY2F5IHNjYWxlciAqLworICAgIExWTV9GTE9BVCBWb2x1bWVUQzsgICAgLyogVm9sdW1lIHVwZGF0ZSB0aW1lIGNvbnN0YW50ICovCiAKIH0gQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90OwogCkBAIC00OSwxOSArNDgsMTEgQEAKIC8qICAgIEZ1bmN0aW9uIFByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90ICAqcEluc3RhbmNlLCAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBTdFNyYywgICAgICAgIC8qIFN0ZXJlbyBzb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTW9ub1NyYywgICAgICAvKiBNb25vIHNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsICAgICAgICAgIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgbik7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCi0jaWZkZWYgU1VQUE9SVF9NQwotdm9pZCBBR0NfTUlYX1ZPTF9NYzFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QgICpwSW5zdGFuY2UsICAvKiBJbnN0YW5jZSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcFN0U3JjLCAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBNb25vU3JjLCAgICAvKiBNb25vIHNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnJGcmFtZXMsICAgICAvKiBOdW1iZXIgb2YgZnJhbWVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsgIC8qIE51bWJlciBvZiBjaGFubmVscyAqLwotI2VuZGlmCit2b2lkIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCogcEluc3RhbmNlLCAgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQqIHBTdFNyYywgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQqIHBNb25vU3JjLCAgICAgICAgICAgICAgIC8qIE1vbm8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcERzdCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBOckZyYW1lcywgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZnJhbWVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgTnJDaGFubmVscyk7ICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGNoYW5uZWxzICovCiAKLSNlbmRpZiAgLyogX19BR0NfSF9fICovCi0KKyNlbmRpZiAvKiBfX0FHQ19IX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmgKaW5kZXggYzA1MGNkMC4uMDBiNTM5YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmgKQEAgLTIyLDI4MSArMjIsNjcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBJTlNUQU5DRSBNRU1PUlkgVFlQRSBERUZJTklUSU9OCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0jaWZkZWYgU1VQUE9SVF9NQwordHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIFRoZSBtZW1vcnkgcmVnaW9uIGNyZWF0ZWQgYnkgdGhpcyBzdHJ1Y3R1cmUgaW5zdGFuY2UgaXMgdHlwZWNhc3QKICAgICAgKiBpbnRvIGFub3RoZXIgc3RydWN0dXJlIGNvbnRhaW5pbmcgYSBwb2ludGVyIGFuZCBhbiBhcnJheSBvZiBmaWx0ZXIKICAgICAgKiBjb2VmZmljaWVudHMuIEluIG9uZSBjYXNlIHRoaXMgbWVtb3J5IHJlZ2lvbiBpcyB1c2VkIGZvciBzdG9yaW5nCiAgICAgICogREMgY29tcG9uZW50IG9mIGNoYW5uZWxzCiAgICAgICovCi0gICAgTFZNX0ZMT0FUICpwU3RvcmFnZTsKKyAgICBMVk1fRkxPQVQqIHBTdG9yYWdlOwogICAgIExWTV9GTE9BVCBTdG9yYWdlW0xWTV9NQVhfQ0hBTk5FTFNdOwotI2Vsc2UKLSAgICBMVk1fRkxPQVQgU3RvcmFnZVs2XTsKLSNlbmRpZgogfSBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdDsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBDT0VGRklDSUVOVCBUWVBFIERFRklOSVRJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKiBCaXF1YWQgY29lZmZpY2llbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9GTE9BVCAgQTI7ICAgLyogIGEyICAqLwotICAgIExWTV9GTE9BVCAgQTE7ICAgLyogIGExICAqLwotICAgIExWTV9GTE9BVCAgQTA7ICAgLyogIGEwICAqLwotICAgIExWTV9GTE9BVCAgQjI7ICAgLyogLWIyISAqLwotICAgIExWTV9GTE9BVCAgQjE7ICAgLyogLWIxISAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9GTE9BVCBBMjsgLyogIGEyICAqLworICAgIExWTV9GTE9BVCBBMTsgLyogIGExICAqLworICAgIExWTV9GTE9BVCBBMDsgLyogIGEwICAqLworICAgIExWTV9GTE9BVCBCMjsgLyogLWIyISAqLworICAgIExWTV9GTE9BVCBCMTsgLyogLWIxISAqLwogfSBCUV9GTE9BVF9Db2Vmc190OwogCiAvKioqIEZpcnN0IG9yZGVyIGNvZWZmaWNpZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0ZMT0FUIEExOyAgIC8qICBhMSAgKi8KLSAgICBMVk1fRkxPQVQgQTA7ICAgLyogIGEwICAqLwotICAgIExWTV9GTE9BVCBCMTsgICAvKiAtYjEhICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0ZMT0FUIEExOyAvKiAgYTEgICovCisgICAgTFZNX0ZMT0FUIEEwOyAvKiAgYTAgICovCisgICAgTFZNX0ZMT0FUIEIxOyAvKiAtYjEhICovCiB9IEZPX0ZMT0FUX0NvZWZzX3Q7CiAKIC8qKiogRmlyc3Qgb3JkZXIgY29lZmZpY2llbnRzIHdpdGggU2hpZnQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0ZMT0FUIEExOyAgICAvKiAgYTEgICovCi0gICAgTFZNX0ZMT0FUIEEwOyAgICAvKiAgYTAgICovCi0gICAgTFZNX0ZMT0FUIEIxOyAgICAvKiAtYjEhICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0ZMT0FUIEExOyAvKiAgYTEgICovCisgICAgTFZNX0ZMT0FUIEEwOyAvKiAgYTAgICovCisgICAgTFZNX0ZMT0FUIEIxOyAvKiAtYjEhICovCiB9IEZPX0ZMT0FUX0xTaHhfQ29lZnNfdDsKIC8qKiogQmFuZCBwYXNzIGNvZWZmaWNpZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fRkxPQVQgIEEwOyAgIC8qICBhMCAgKi8KLSAgICBMVk1fRkxPQVQgIEIyOyAgIC8qIC1iMiEgKi8KLSAgICBMVk1fRkxPQVQgIEIxOyAgIC8qIC1iMSEgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fRkxPQVQgQTA7IC8qICBhMCAgKi8KKyAgICBMVk1fRkxPQVQgQjI7IC8qIC1iMiEgKi8KKyAgICBMVk1fRkxPQVQgQjE7IC8qIC1iMSEgKi8KIH0gQlBfRkxPQVRfQ29lZnNfdDsKIAogLyoqKiBQZWFraW5nIGNvZWZmaWNpZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9GTE9BVCBBMDsgICAvKiAgYTAgICovCi0gICAgTFZNX0ZMT0FUIEIyOyAgIC8qIC1iMiEgKi8KLSAgICBMVk1fRkxPQVQgQjE7ICAgLyogLWIxISAqLwotICAgIExWTV9GTE9BVCAgRzsgICAvKiBHYWluICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0ZMT0FUIEEwOyAvKiAgYTAgICovCisgICAgTFZNX0ZMT0FUIEIyOyAvKiAtYjIhICovCisgICAgTFZNX0ZMT0FUIEIxOyAvKiAtYjEhICovCisgICAgTFZNX0ZMT0FUIEc7ICAvKiBHYWluICovCiB9IFBLX0ZMT0FUX0NvZWZzX3Q7CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBUQVBTIFRZUEUgREVGSU5JVElPTlMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqIFR5cGVzIHVzZWQgZm9yIGZpcnN0IG9yZGVyIGFuZCBzaGVsdmluZyBmaWx0ZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgxICogMikgXTsgIC8qIE9uZSBjaGFubmVsLCB0d28gdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLwotfSBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgLyogTFZNX01BWF9DSEFOTkVMUyBjaGFubmVscywgdHdvIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KLSAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKExWTV9NQVhfQ0hBTk5FTFMgKiAyKSBdOwotI2Vsc2UKLSAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiAyKSBdOyAgLyogVHdvIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLwotI2VuZGlmCi19IEJpcXVhZF8ySV9PcmRlcjFfRkxPQVRfVGFwc190OwotCi0vKioqIFR5cGVzIHVzZWQgZm9yIGJpcXVhZCwgYmFuZCBwYXNzIGFuZCBwZWFraW5nIGZpbHRlciAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgxICogNCkgXTsgIC8qIE9uZSBjaGFubmVsLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KLX0gQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0jaWZkZWYgU1VQUE9SVF9NQwotICAgIC8qIExWTV9NQVhfQ0hBTk5FTFMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLwotICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoTFZNX01BWF9DSEFOTkVMUyAqIDQpIF07Ci0jZWxzZQotICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMiAqIDQpIF07ICAvKiBUd28gY2hhbm5lbHMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLwotI2VuZGlmCi19IEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190OwotLyogVGhlIG5hbWVzIG9mIHRoZSBmdW5jdGlvbnMgYXJlIGNoYW5nZWQgdG8gc2F0aXNmeSBRQUMgcnVsZXM6IE5hbWUgc2hvdWxkIGJlIFVuaXF1ZSB3aXRoaW5nIDE2IGNoYXJhY3RlcnMqLwotI2RlZmluZSBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICBJbml0X0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxCi0jZGVmaW5lIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyICAgICAgIFRXT19CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gUFJPVE9UWVBFUzogQklRVUFEIEZJTFRFUlMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqIDE2IGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKTsKLQotdm9pZCBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotCi12b2lkIEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0KLXZvaWQgQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQotdm9pZCBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKTsKLQotdm9pZCBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQotdm9pZCBCUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQotdm9pZCBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKTsKLQotdm9pZCBCUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0KLXZvaWQgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZik7Ci0KLXZvaWQgQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0vKioqIDMyIGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Ci12b2lkIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotI2lmZGVmIFNVUFBPUlRfTUMKLXZvaWQgQlFfTUNfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gUFJPVE9UWVBFUzogRklSU1QgT1JERVIgRklMVEVSUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKiogMTYgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKTsKLQotdm9pZCBGT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQotdm9pZCBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjFfRkxPQVRfVGFwc190ICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0xTaHhfQ29lZnNfdCAgICAgKnBDb2VmKTsKLQotdm9pZCBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0vKioqIDMyIGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Ci12b2lkIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotI2lmZGVmIFNVUFBPUlRfTUMKLXZvaWQgRk9fTWNfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOwotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gUFJPVE9UWVBFUzogQkFORCBQQVNTIEZJTFRFUlMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqIDE2IGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgICAqcENvZWYpOwotdm9pZCBCUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAoICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotdm9pZCBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0IChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAgICpwQ29lZik7Ci12b2lkIEJQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0vKioqIDMyIGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdCAoICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Ci12b2lkIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyKCAgICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0KLS8qKiogMzIgYml0IGRhdGEgcGF0aCBTVEVSRU8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKLXZvaWQgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0jaWZkZWYgU1VQUE9SVF9NQwotdm9pZCBQS19NY19EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVscyk7Ci0jZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFBST1RPVFlQRVM6IERDIFJFTU9WQUwgRklMVEVSUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKiogMTYgYml0IGRhdGEgcGF0aCBTVEVSRU8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIFNVUFBPUlRfTUMKLXZvaWQgRENfTWNfRDE2X1RSQ19XUkFfMDFfSW5pdCAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSk7Cit2b2lkIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBJbnN0YW5jZSk7CiAKLXZvaWQgRENfTWNfRDE2X1RSQ19XUkFfMDEgICAgICAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOwotI2Vsc2UKLXZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSk7Ci0KLXZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEgICAgICAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLSNlbmRpZgordm9pZCBEQ19NY19EMTZfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fRkxPQVQqIHBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcERhdGFPdXQsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2VuZGlmICAvKiogX0JJUVVBRF9IXyAqKi8KLQorI2VuZGlmIC8qKiBfQklRVUFEX0hfICoqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQ29tcExpbS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQ29tcExpbS5oCmluZGV4IDViN2NiMWIuLjJmYzc4YjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0NvbXBMaW0uaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9Db21wTGltLmgKQEAgLTM1LDIxICszNSwyMSBAQAogdHlwZWRlZiBzdHJ1Y3QgLyogQ29tcHJlc3NvciBzdGF0ZSAqLwogewogICAgIC8qIE5vcm1hbGlzZXIgKi8KLSAgICBMVk1fSU5UMTYgICBOb3JtX0F0dGFjazsgICAgICAgIC8qIEF0dGFjayB0aW1lIGNvbnN0YW50IG9mIHRoZSBOb3JtYWxpc2VyIGludGVncmF0b3IgKi8KLSAgICBMVk1fSU5UMTYgICBOb3JtX0RlY2F5OyAgICAgICAgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQgb2YgdGhlIE5vcm1hbGlzZXIgaW50ZWdyYXRvciAqLwotICAgIExWTV9JTlQzMiAgIE5vcm1JbnQ7ICAgICAgICAgICAgLyogTm9ybWFsaXNlciBpbnRlZ3JhdG9yIGN1cnJlbnQgdmFsdWUgKi8KLSAgICBMVk1fSU5UMTYgICBTaGlmdDsgICAgICAgICAgICAgIC8qIFNoaWZ0IGdhaW4gKi8KLSAgICBMVk1fSU5UMTYgICBUaHJlc2hvbGQ7ICAgICAgICAgIC8qIFRhcmdldCB0aHJlc2hvbGQgKi8KKyAgICBMVk1fSU5UMTYgTm9ybV9BdHRhY2s7IC8qIEF0dGFjayB0aW1lIGNvbnN0YW50IG9mIHRoZSBOb3JtYWxpc2VyIGludGVncmF0b3IgKi8KKyAgICBMVk1fSU5UMTYgTm9ybV9EZWNheTsgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQgb2YgdGhlIE5vcm1hbGlzZXIgaW50ZWdyYXRvciAqLworICAgIExWTV9JTlQzMiBOb3JtSW50OyAgICAgLyogTm9ybWFsaXNlciBpbnRlZ3JhdG9yIGN1cnJlbnQgdmFsdWUgKi8KKyAgICBMVk1fSU5UMTYgU2hpZnQ7ICAgICAgIC8qIFNoaWZ0IGdhaW4gKi8KKyAgICBMVk1fSU5UMTYgVGhyZXNob2xkOyAgIC8qIFRhcmdldCB0aHJlc2hvbGQgKi8KIAogICAgIC8qIENvbXByZXNzb3IgKi8KLSAgICBMVk1fSU5UMTYgICBDb21wX0F0dGVuOyAgICAgICAgIC8qIEF0dGVudWF0aW9uIGFwcGxpZWQgYmVmb3JlIHNvZnQga25lZSBjb21wcmVzc29yICovCi0gICAgTFZNX0lOVDE2ICAgQ29tcF9BdHRhY2tfUzsgICAgICAvKiBBdHRhY2sgdGltZSBjb25zdGFudCBvZiB0aGUgc2xvdyBpbnRlZ3JhdG9yICovCi0gICAgTFZNX0lOVDE2ICAgQ29tcF9EZWNheV9TOyAgICAgICAvKiBEZWNheSB0aW1lIGNvbnN0YW50IG9mIHNsb3cgdGhlIGludGVncmF0b3IgKi8KLSAgICBMVk1fSU5UMTYgICBDb21wX0F0dGFja19GOyAgICAgIC8qIEF0dGFjayB0aW1lIGNvbnN0YW50IG9mIGZhc3QgdGhlIGludGVncmF0b3IgKi8KLSAgICBMVk1fSU5UMTYgICBDb21wX0RlY2F5X0Y7ICAgICAgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQgb2YgZmFzdCB0aGUgaW50ZWdyYXRvciAqLwotICAgIExWTV9JTlQxNiAgIFNvZnRDbGlwR2FpbjsgICAgICAgLyogU29mdCBjbGlwIGdhaW4gY29udHJvbCAqLwotICAgIExWTV9JTlQzMiAgIENvbXBJbnRTbG93OyAgICAgICAgLyogQ29tcHJlc3NvciBzbG93IGludGVncmF0b3IgY3VycmVudCB2YWx1ZSAqLwotICAgIExWTV9JTlQzMiAgIENvbXBJbnRGYXN0OyAgICAgICAgLyogQ29tcHJlc3NvciBmYXN0IGludGVncmF0b3IgY3VycmVudCB2YWx1ZSAqLworICAgIExWTV9JTlQxNiBDb21wX0F0dGVuOyAgICAvKiBBdHRlbnVhdGlvbiBhcHBsaWVkIGJlZm9yZSBzb2Z0IGtuZWUgY29tcHJlc3NvciAqLworICAgIExWTV9JTlQxNiBDb21wX0F0dGFja19TOyAvKiBBdHRhY2sgdGltZSBjb25zdGFudCBvZiB0aGUgc2xvdyBpbnRlZ3JhdG9yICovCisgICAgTFZNX0lOVDE2IENvbXBfRGVjYXlfUzsgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQgb2Ygc2xvdyB0aGUgaW50ZWdyYXRvciAqLworICAgIExWTV9JTlQxNiBDb21wX0F0dGFja19GOyAvKiBBdHRhY2sgdGltZSBjb25zdGFudCBvZiBmYXN0IHRoZSBpbnRlZ3JhdG9yICovCisgICAgTFZNX0lOVDE2IENvbXBfRGVjYXlfRjsgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQgb2YgZmFzdCB0aGUgaW50ZWdyYXRvciAqLworICAgIExWTV9JTlQxNiBTb2Z0Q2xpcEdhaW47ICAvKiBTb2Z0IGNsaXAgZ2FpbiBjb250cm9sICovCisgICAgTFZNX0lOVDMyIENvbXBJbnRTbG93OyAgIC8qIENvbXByZXNzb3Igc2xvdyBpbnRlZ3JhdG9yIGN1cnJlbnQgdmFsdWUgKi8KKyAgICBMVk1fSU5UMzIgQ29tcEludEZhc3Q7ICAgLyogQ29tcHJlc3NvciBmYXN0IGludGVncmF0b3IgY3VycmVudCB2YWx1ZSAqLwogCiB9IENvbXBMaW1fSW5zdGFuY2VfdDsKIApAQCAtNTgsMTAgKzU4LDcgQEAKIC8qICBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTm9uTGluQ29tcF9GbG9hdChMVk1fRkxPQVQgICAgICAgIEdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgIEJsb2NrTGVuZ3RoKTsKK3ZvaWQgTm9uTGluQ29tcF9GbG9hdChMVk1fRkxPQVQgR2FpbiwgTFZNX0ZMT0FUKiBwRGF0YUluLCBMVk1fRkxPQVQqIHBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBCbG9ja0xlbmd0aCk7CiAKICNlbmRpZiAvKiAjaWZuZGVmIF9DT01QX0xJTV9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0ZpbHRlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvRmlsdGVyLmgKaW5kZXggMWVlYjMyMS4uMGJhNTIyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvRmlsdGVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvRmlsdGVyLmgKQEAgLTI3LDI2ICsyNywyMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIERFRklORVMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBGSUxURVJfTE9TUyAgICAgMzI3MzAgICAgICAgLyogLTAuMDFkQiBsb3NzIHRvIGF2b2lkIHdyYXBwaW5nIGR1ZSB0byBiYW5kIHJpcHBsZSAqLwotI2RlZmluZSBGSUxURVJfTE9TU19GTE9BVCAgICAwLjk5ODg0OWYKKyNkZWZpbmUgRklMVEVSX0xPU1MgMzI3MzAgLyogLTAuMDFkQiBsb3NzIHRvIGF2b2lkIHdyYXBwaW5nIGR1ZSB0byBiYW5kIHJpcHBsZSAqLworI2RlZmluZSBGSUxURVJfTE9TU19GTE9BVCAwLjk5ODg0OWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBQUk9UT1RZUEVTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZNX0ZMT0FUIExWTV9Qb3dlcjEwKCAgIExWTV9GTE9BVCAgWCk7CitMVk1fRkxPQVQgTFZNX1Bvd2VyMTAoTFZNX0ZMT0FUIFgpOwogCi1MVk1fRkxPQVQgTFZNX1BvbHlub21pYWwoTFZNX1VJTlQxNiBOLAotICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKnBDb2VmZmljaWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICBYKTsKLUxWTV9GTE9BVCAgIExWTV9HZXRPbWVnYShMVk1fVUlOVDMyICBGYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICBTYW1wbGVSYXRlKTsKK0xWTV9GTE9BVCBMVk1fUG9seW5vbWlhbChMVk1fVUlOVDE2IE4sIExWTV9GTE9BVCogcENvZWZmaWNpZW50cywgTFZNX0ZMT0FUIFgpOworTFZNX0ZMT0FUIExWTV9HZXRPbWVnYShMVk1fVUlOVDMyIEZjLCBMVk1fRnNfZW4gU2FtcGxlUmF0ZSk7CiAKLUxWTV9GTE9BVCBMVk1fRk9fTFBGKCAgICBMVk1fRkxPQVQgIHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgKnBDb2VmZnMpOworTFZNX0ZMT0FUIExWTV9GT19MUEYoTFZNX0ZMT0FUIHcsIEZPX0ZMT0FUX0NvZWZzX3QqIHBDb2VmZnMpOwogCi1MVk1fRkxPQVQgTFZNX0ZPX0hQRiggICAgTFZNX0ZMT0FUICB3LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgICpwQ29lZmZzKTsKK0xWTV9GTE9BVCBMVk1fRk9fSFBGKExWTV9GTE9BVCB3LCBGT19GTE9BVF9Db2Vmc190KiBwQ29lZmZzKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZW5kaWYgIC8qKiBfRklMVEVSX0hfICoqLwotCisjZW5kaWYgLyoqIF9GSUxURVJfSF8gKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9JbnN0QWxsb2MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0luc3RBbGxvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWU4NGU3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0luc3RBbGxvYy5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX0lOU1RBTExPQ19IX18KLSNkZWZpbmUgX19JTlNUQUxMT0NfSF9fCi0KLSNpbmNsdWRlICJMVk1fVHlwZXMuaCIKLS8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwotLyogIFR5cGUgZGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgVG90YWxTaXplOyAgICAgIC8qICBBY2N1bXVsYXRpdmUgdG90YWwgbWVtb3J5IHNpemUgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB1aW50cHRyX3QgICAgICAgICAgICAgICBwTmV4dE1lbWJlcjsgICAgLyogIFBvaW50ZXIgdG8gdGhlIG5leHQgaW5zdGFuY2UgbWVtYmVyIHRvIGJlIGFsbG9jYXRlZCAqLwotfSAgIElOU1RfQUxMT0M7Ci0KLS8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwotLyogIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIE5hbWUgICAgICAgIDogSW5zdEFsbG9jX0luaXQoKQotICogIElucHV0ICAgICAgIDogcG1zICAtIFBvaW50ZXIgdG8gdGhlIElOU1RfQUxMT0MgaW5zdGFuY2UKLSAgICAgICAgICAgICAgICAgIFN0YXJ0QWRkciAtIEJhc2UgYWRkcmVzcyBvZiB0aGUgaW5zdGFuY2UgbWVtb3J5Ci0gKiAgUmV0dXJucyAgICAgOiBFcnJvciBjb2RlCi0gKiAgRGVzY3JpcHRpb24gOiBJbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgZGlzdHJpYnV0aW9uIGFuZCBtZW1vcnkgc2l6ZSBjYWxjdWxhdGlvbiBmdW5jdGlvbgotICogIFJlbWFya3MgICAgIDoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkICAgSW5zdEFsbG9jX0luaXQoIElOU1RfQUxMT0MgKnBtcywgdm9pZCAqU3RhcnRBZGRyICk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgTmFtZSAgICAgICAgOiBJbnN0QWxsb2NfQWRkTWVtYmVyKCkKLSAqICBJbnB1dCAgICAgICA6IHBtcyAgLSBQb2ludGVyIHRvIHRoZSBJTlNUX0FMTE9DIGluc3RhbmNlCi0gICAgICAgICAgICAgICAgICBTaXplIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG5ldyBhZGRlZCBtZW1iZXIKLSAqICBSZXR1cm5zICAgICA6IEEgcG9pbnRlciB0byB0aGUgbmV3IGFkZGVkIG1lbWJlcgotICogIERlc2NyaXB0aW9uIDogQWxsb2NhdGVzIHNwYWNlIGZvciBhIG5ldyBtZW1iZXIgaW4gdGhlIGluc3RhbmNlIG1lbW9yeSBhbmQgcmV0dXJucwotICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIHRvIHRoaXMgbmV3IG1lbWJlci4gIFRoZSBzdGFydCBhZGRyZXNzIG9mIGFsbCBtZW1iZXJzIHdpbGwKLSAgICAgICAgICAgICAgICAgIGJlIDMyIGJpdCBhbGxpZ25lZC4KLSAqICBSZW1hcmtzICAgICA6Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCogSW5zdEFsbG9jX0FkZE1lbWJlciggSU5TVF9BTExPQyAqcG1zLCBMVk1fVUlOVDMyIFNpemUgKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBOYW1lICAgICAgICA6IEluc3RBbGxvY19HZXRUb3RhbCgpCi0gKiAgSW5wdXQgICAgICAgOiBwbXMgIC0gUG9pbnRlciB0byB0aGUgSU5TVF9BTExPQyBpbnN0YW5jZQotICogIFJldHVybnMgICAgIDogVGhlIGluc3RhbmNlIG1lbW9yeSBzaXplCi0gKiAgRGVzY3JpcHRpb24gOiBUaGlzIGZ1bmN0aW9ucyByZXR1cm5zIHRoZSBjYWxjdWxhdGVkIGluc3RhbmNlIG1lbW9yeSBzaXplCi0gKiAgUmVtYXJrcyAgICAgOgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWTV9VSU5UMzIgSW5zdEFsbG9jX0dldFRvdGFsKCBJTlNUX0FMTE9DICpwbXMpOwotCi12b2lkKiAgIEluc3RBbGxvY19BZGRNZW1iZXJBbGxSZXQoICAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICAgICAqcG1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICBTaXplW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKipwdHIpOwotCi12b2lkKiAgIEluc3RBbGxvY19BZGRNZW1iZXJBbGwoIElOU1RfQUxMT0MgICAgICAgICAgICAgICAgICAgICAqcG1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgICBTaXplW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtb3J5VGFibGVfc3QgICAgICAgICAgICpwTWVtb3J5VGFibGUpOwotCi12b2lkICAgIEluc3RBbGxvY19Jbml0QWxsKCBJTlNUX0FMTE9DICAgICAgICAgICAgICAgICAgICAgICpwbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtb3J5VGFibGVfc3QgICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSk7Ci0KLXZvaWQgICAgSW5zdEFsbG9jX0luaXRBbGxfTlVMTCggSU5TVF9BTExPQyAgICAgICAgICAgICAgKnBtcyk7Ci0KLSNlbmRpZiAvKiBfX0pCU19JTlNUQUxMT0NfSF9fICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fQ29tbW9uLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fQ29tbW9uLmgKaW5kZXggNDlmMTZhZC4uZDNkMTI4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX0NvbW1vbi5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9Db21tb24uaApAQCAtMzksMTIgKzM5LDExIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogQWxnb3JpdGhtIGlkZW50aWZpY2F0aW9uICovCi0jZGVmaW5lIEFMR09SSVRITV9OT05FX0lEICAgICAgMHgwMDAwCi0jZGVmaW5lIEFMR09SSVRITV9DU19JRCAgICAgICAgMHgwMTAwCi0jZGVmaW5lIEFMR09SSVRITV9FUU5CX0lEICAgICAgMHgwMjAwCi0jZGVmaW5lIEFMR09SSVRITV9EQkVfSUQgICAgICAgMHgwMzAwCi0jZGVmaW5lIEFMR09SSVRITV9WQ19JRCAgICAgICAgMHgwNTAwCi0jZGVmaW5lIEFMR09SSVRITV9URV9JRCAgICAgICAgMHgwNjAwCisjZGVmaW5lIEFMR09SSVRITV9OT05FX0lEIDB4MDAwMAorI2RlZmluZSBBTEdPUklUSE1fQ1NfSUQgMHgwMTAwCisjZGVmaW5lIEFMR09SSVRITV9FUU5CX0lEIDB4MDIwMAorI2RlZmluZSBBTEdPUklUSE1fREJFX0lEIDB4MDMwMAorI2RlZmluZSBBTEdPUklUSE1fVkNfSUQgMHgwNTAwCisjZGVmaW5lIEFMR09SSVRITV9URV9JRCAweDA2MDAKIAotI2VuZGlmICAgICAgLyogX19MVk1fQ09NTU9OX0hfXyAqLwotCisjZW5kaWYgLyogX19MVk1fQ09NTU9OX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX01hY3Jvcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX01hY3Jvcy5oCmluZGV4IDFhMTUxMjUuLmI5ODQ3NDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9NYWNyb3MuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fTWFjcm9zLmgKQEAgLTI4LDMxICsyOCwzNiBAQAogICAgICAgICBvZiBvdmVyZmxvdyBpcyB1bmRlZmluZWQuCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBNVUwzMngzMklOVE8zMihBLEIsQyxTaGlmdFIpICAgXAotICAgICAgICB7TFZNX0lOVDMyIE1VTDMyeDMySU5UTzMyX3RlbXAsTVVMMzJ4MzJJTlRPMzJfdGVtcDIsTVVMMzJ4MzJJTlRPMzJfbWFzayxNVUwzMngzMklOVE8zMl9ISCxNVUwzMngzMklOVE8zMl9ITCxNVUwzMngzMklOVE8zMl9MSCxNVUwzMngzMklOVE8zMl9MTDtcCi0gICAgICAgICBMVk1fSU5UMzIgIHNoaWZ0VmFsdWU7XAotICAgICAgICBzaGlmdFZhbHVlID0gKFNoaWZ0Uik7XAotICAgICAgICBNVUwzMngzMklOVE8zMl9tYXNrPTB4MDAwMEZGRkY7XAotICAgICAgICBNVUwzMngzMklOVE8zMl9ISD0gKChMVk1fSU5UMzIpKChMVk1fSU5UMTYpKChBKT4+MTYpKSooKExWTV9JTlQxNikoKEIpPj4xNikpICk7XAotICAgICAgICBNVUwzMngzMklOVE8zMl9ITD0gKChMVk1fSU5UMzIpKChCKSZNVUwzMngzMklOVE8zMl9tYXNrKSooKExWTV9JTlQxNikoKEEpPj4xNikpKSA7XAotICAgICAgICBNVUwzMngzMklOVE8zMl9MSD0gKChMVk1fSU5UMzIpKChBKSZNVUwzMngzMklOVE8zMl9tYXNrKSooKExWTV9JTlQxNikoKEIpPj4xNikpKTtcCi0gICAgICAgIE1VTDMyeDMySU5UTzMyX0xMPSAoTFZNX0lOVDMyKSgoQSkmTVVMMzJ4MzJJTlRPMzJfbWFzaykqKExWTV9JTlQzMikoKEIpJk1VTDMyeDMySU5UTzMyX21hc2spO1wKLSAgICAgICAgTVVMMzJ4MzJJTlRPMzJfdGVtcD0gKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfSEwmTVVMMzJ4MzJJTlRPMzJfbWFzaykrKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfTEgmTVVMMzJ4MzJJTlRPMzJfbWFzaykrKExWTV9JTlQzMikoKE1VTDMyeDMySU5UTzMyX0xMPj4xNikmTVVMMzJ4MzJJTlRPMzJfbWFzayk7XAotICAgICAgICBNVUwzMngzMklOVE8zMl9ISD0gTVVMMzJ4MzJJTlRPMzJfSEgrKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfSEw+PjE2KSsoTFZNX0lOVDMyKShNVUwzMngzMklOVE8zMl9MSD4+MTYpKyhMVk1fSU5UMzIpKE1VTDMyeDMySU5UTzMyX3RlbXA+PjE2KTtcCi0gICAgICAgIE1VTDMyeDMySU5UTzMyX0xMPU1VTDMyeDMySU5UTzMyX0xMKyhMVk1fSU5UMzIpKE1VTDMyeDMySU5UTzMyX0hMPDwxNikrKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfTEg8PDE2KTtcCi0gICAgICAgIGlmKHNoaWZ0VmFsdWU8MzIpXAotICAgICAgICB7XAotICAgICAgICBNVUwzMngzMklOVE8zMl9ISD1NVUwzMngzMklOVE8zMl9ISDw8KDMyLXNoaWZ0VmFsdWUpO1wKLSAgICAgICAgTVVMMzJ4MzJJTlRPMzJfbWFzaz0oKExWTV9JTlQzMikxPDwoMzItc2hpZnRWYWx1ZSkpLTE7XAotICAgICAgICBNVUwzMngzMklOVE8zMl9MTD0oTVVMMzJ4MzJJTlRPMzJfTEw+PnNoaWZ0VmFsdWUpJk1VTDMyeDMySU5UTzMyX21hc2s7XAotICAgICAgICBNVUwzMngzMklOVE8zMl90ZW1wMj1NVUwzMngzMklOVE8zMl9ISHxNVUwzMngzMklOVE8zMl9MTDtcCi0gICAgICAgIH1cCi0gICAgICAgIGVsc2VcCi0gICAgICAge1wKLSAgICAgICAgTVVMMzJ4MzJJTlRPMzJfdGVtcDI9KExWTV9JTlQzMilNVUwzMngzMklOVE8zMl9ISD4+KHNoaWZ0VmFsdWUtMzIpO1wKLSAgICAgICB9XAotICAgICAgIChDKSA9IE1VTDMyeDMySU5UTzMyX3RlbXAyO1wKLSAgICAgICB9CisjZGVmaW5lIE1VTDMyeDMySU5UTzMyKEEsIEIsIEMsIFNoaWZ0UikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMVk1fSU5UMzIgTVVMMzJ4MzJJTlRPMzJfdGVtcCwgTVVMMzJ4MzJJTlRPMzJfdGVtcDIsIE1VTDMyeDMySU5UTzMyX21hc2ssICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzJfSEgsIE1VTDMyeDMySU5UTzMyX0hMLCBNVUwzMngzMklOVE8zMl9MSCwgTVVMMzJ4MzJJTlRPMzJfTEw7ICAgIFwKKyAgICAgICAgTFZNX0lOVDMyIHNoaWZ0VmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzaGlmdFZhbHVlID0gKFNoaWZ0Uik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1VTDMyeDMySU5UTzMyX21hc2sgPSAweDAwMDBGRkZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzJfSEggPSAoKExWTV9JTlQzMikoKExWTV9JTlQxNikoKEEpID4+IDE2KSkgKiAoKExWTV9JTlQxNikoKEIpID4+IDE2KSkpOyAgXAorICAgICAgICBNVUwzMngzMklOVE8zMl9ITCA9ICgoTFZNX0lOVDMyKSgoQikmTVVMMzJ4MzJJTlRPMzJfbWFzaykgKiAoKExWTV9JTlQxNikoKEEpID4+IDE2KSkpOyBcCisgICAgICAgIE1VTDMyeDMySU5UTzMyX0xIID0gKChMVk1fSU5UMzIpKChBKSZNVUwzMngzMklOVE8zMl9tYXNrKSAqICgoTFZNX0lOVDE2KSgoQikgPj4gMTYpKSk7IFwKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzJfTEwgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKChBKSZNVUwzMngzMklOVE8zMl9tYXNrKSAqIChMVk1fSU5UMzIpKChCKSZNVUwzMngzMklOVE8zMl9tYXNrKTsgICBcCisgICAgICAgIE1VTDMyeDMySU5UTzMyX3RlbXAgPSAoTFZNX0lOVDMyKShNVUwzMngzMklOVE8zMl9ITCAmIE1VTDMyeDMySU5UTzMyX21hc2spICsgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKE1VTDMyeDMySU5UTzMyX0xIICYgTVVMMzJ4MzJJTlRPMzJfbWFzaykgKyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoKE1VTDMyeDMySU5UTzMyX0xMID4+IDE2KSAmIE1VTDMyeDMySU5UTzMyX21hc2spOyAgICBcCisgICAgICAgIE1VTDMyeDMySU5UTzMyX0hIID0gTVVMMzJ4MzJJTlRPMzJfSEggKyAoTFZNX0lOVDMyKShNVUwzMngzMklOVE8zMl9ITCA+PiAxNikgKyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKShNVUwzMngzMklOVE8zMl9MSCA+PiAxNikgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKE1VTDMyeDMySU5UTzMyX3RlbXAgPj4gMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1VTDMyeDMySU5UTzMyX0xMID0gTVVMMzJ4MzJJTlRPMzJfTEwgKyAoTFZNX0lOVDMyKShNVUwzMngzMklOVE8zMl9ITCA8PCAxNikgKyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKShNVUwzMngzMklOVE8zMl9MSCA8PCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc2hpZnRWYWx1ZSA8IDMyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMl9ISCA9IE1VTDMyeDMySU5UTzMyX0hIIDw8ICgzMiAtIHNoaWZ0VmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyX21hc2sgPSAoKExWTV9JTlQzMikxIDw8ICgzMiAtIHNoaWZ0VmFsdWUpKSAtIDE7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzJfTEwgPSAoTVVMMzJ4MzJJTlRPMzJfTEwgPj4gc2hpZnRWYWx1ZSkgJiBNVUwzMngzMklOVE8zMl9tYXNrOyAgICAgICBcCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMl90ZW1wMiA9IE1VTDMyeDMySU5UTzMyX0hIIHwgTVVMMzJ4MzJJTlRPMzJfTEw7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzJfdGVtcDIgPSAoTFZNX0lOVDMyKU1VTDMyeDMySU5UTzMyX0hIID4+IChzaGlmdFZhbHVlIC0gMzIpOyAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKEMpID0gTVVMMzJ4MzJJTlRPMzJfdGVtcDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIE1VTDMyeDE2SU5UTzMyKEEsQixDLFNoaWZ0UikKQEAgLTY1LDI1ICs3MCwyNCBAQAogICAgICAgICBvZiBvdmVyZmxvdyBpcyB1bmRlZmluZWQuCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBNVUwzMngxNklOVE8zMihBLEIsQyxTaGlmdFIpICAgXAotICAgICAgICB7TFZNX0lOVDMyIE1VTDMyeDE2SU5UTzMyX21hc2ssTVVMMzJ4MTZJTlRPMzJfSEgsTVVMMzJ4MTZJTlRPMzJfTEw7XAotICAgICAgICAgTFZNX0lOVDMyICBzaGlmdFZhbHVlO1wKLSAgICAgICAgc2hpZnRWYWx1ZSA9IChTaGlmdFIpO1wKLSAgICAgICAgTVVMMzJ4MTZJTlRPMzJfbWFzaz0weDAwMDBGRkZGO1wKLSAgICAgICAgTVVMMzJ4MTZJTlRPMzJfSEg9ICgoTFZNX0lOVDMyKShCKSooKExWTV9JTlQxNikoKEEpPj4xNikpKTtcCi0gICAgICAgIE1VTDMyeDE2SU5UTzMyX0xMPSAoKExWTV9JTlQzMikoKEEpJk1VTDMyeDE2SU5UTzMyX21hc2spKihCKSk7XAotICAgICAgICBpZihzaGlmdFZhbHVlPDE2KVwKLSAgICAgICAge1wKLSAgICAgICAgTVVMMzJ4MTZJTlRPMzJfSEg9KExWTV9JTlQzMikoKExWTV9VSU5UMzIpTVVMMzJ4MTZJTlRPMzJfSEg8PCgxNi1zaGlmdFZhbHVlKSk7XAotICAgICAgICAoQyk9TVVMMzJ4MTZJTlRPMzJfSEgrKExWTV9JTlQzMikoTVVMMzJ4MTZJTlRPMzJfTEw+PnNoaWZ0VmFsdWUpO1wKLSAgICAgICAgfVwKLSAgICAgICAgZWxzZSBpZihzaGlmdFZhbHVlPDMyKSB7XAotICAgICAgICBNVUwzMngxNklOVE8zMl9ISD0oTFZNX0lOVDMyKShNVUwzMngxNklOVE8zMl9ISD4+KHNoaWZ0VmFsdWUtMTYpKTtcCi0gICAgICAgIChDKT1NVUwzMngxNklOVE8zMl9ISCsoTFZNX0lOVDMyKShNVUwzMngxNklOVE8zMl9MTD4+c2hpZnRWYWx1ZSk7XAotICAgICAgICB9XAotICAgICAgICBlbHNlIHtcCi0gICAgICAgIChDKT1NVUwzMngxNklOVE8zMl9ISD4+KHNoaWZ0VmFsdWUtMTYpO31cCi0gICAgICAgIH0KKyNkZWZpbmUgTVVMMzJ4MTZJTlRPMzIoQSwgQiwgQywgU2hpZnRSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMVk1fSU5UMzIgTVVMMzJ4MTZJTlRPMzJfbWFzaywgTVVMMzJ4MTZJTlRPMzJfSEgsIE1VTDMyeDE2SU5UTzMyX0xMOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTFZNX0lOVDMyIHNoaWZ0VmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNoaWZ0VmFsdWUgPSAoU2hpZnRSKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNVUwzMngxNklOVE8zMl9tYXNrID0gMHgwMDAwRkZGRjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTVVMMzJ4MTZJTlRPMzJfSEggPSAoKExWTV9JTlQzMikoQikgKiAoKExWTV9JTlQxNikoKEEpID4+IDE2KSkpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1VTDMyeDE2SU5UTzMyX0xMID0gKChMVk1fSU5UMzIpKChBKSZNVUwzMngxNklOVE8zMl9tYXNrKSAqIChCKSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc2hpZnRWYWx1ZSA8IDE2KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyX0hIID0gKExWTV9JTlQzMikoKExWTV9VSU5UMzIpTVVMMzJ4MTZJTlRPMzJfSEggPDwgKDE2IC0gc2hpZnRWYWx1ZSkpOyBcCisgICAgICAgICAgICAoQykgPSBNVUwzMngxNklOVE8zMl9ISCArIChMVk1fSU5UMzIpKE1VTDMyeDE2SU5UTzMyX0xMID4+IHNoaWZ0VmFsdWUpOyAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgaWYgKHNoaWZ0VmFsdWUgPCAzMikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyX0hIID0gKExWTV9JTlQzMikoTVVMMzJ4MTZJTlRPMzJfSEggPj4gKHNoaWZ0VmFsdWUgLSAxNikpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAoQykgPSBNVUwzMngxNklOVE8zMl9ISCArIChMVk1fSU5UMzIpKE1VTDMyeDE2SU5UTzMyX0xMID4+IHNoaWZ0VmFsdWUpOyAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChDKSA9IE1VTDMyeDE2SU5UTzMyX0hIID4+IChzaGlmdFZhbHVlIC0gMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEFERDJfU0FUXzMyeDMyKEEsQixDKQpAQCAtOTEsMTYgKzk1LDE2IEBACiAKICAgICAgICAgQSxCIGFuZCBDIGFyZSAzMiBiaXQgU0lHTkVEIG51bWJlcnMuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgQUREMl9TQVRfMzJ4MzIoQSxCLEMpICAgXAotICAgICAgICB7KEMpPShBKSsoQik7XAotICAgICAgICAgaWYgKCgoKEMpIF4gKEEpKSAmICgoQykgXiAoQikpKSA+PiAzMSlcCi0gICAgICAgICAgICB7XAotICAgICAgICAgICAgICAgIGlmKChBKTwwKVwKLSAgICAgICAgICAgICAgICAgICAgKEMpPTB4ODAwMDAwMDBsO1wKLSAgICAgICAgICAgICAgICBlbHNlXAotICAgICAgICAgICAgICAgICAgICAoQyk9MHg3RkZGRkZGRmw7XAotICAgICAgICAgICAgfVwKLSAgICAgICAgfQorI2RlZmluZSBBREQyX1NBVF8zMngzMihBLCBCLCBDKSAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChDKSA9IChBKSArIChCKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKCgoQykgXiAoQSkpICYgKChDKSBeIChCKSkpID4+IDMxKSB7IFwKKyAgICAgICAgICAgIGlmICgoQSkgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKEMpID0gMHg4MDAwMDAwMGw7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoQykgPSAweDdGRkZGRkZGbDsgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KIAogI2VuZGlmIC8qIF9MVk1fTUFDUk9TX0hfICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UaW1lci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmgKaW5kZXggZGJmOWU2YS4uNzVmNDc4NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmgKQEAgLTM3LDggKzM3LDcgQEAKIC8qICBUWVBFIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyoKICAgICAgKiBUaGUgbWVtb3J5IGFyZWEgY3JlYXRlZCB1c2luZyB0aGlzIHN0cnVjdHVyZSBpcyBpbnRlcm5hbGx5CiAgICAgICogdHlwZWNhc3QgdG8gTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCBhbmQgdXNlZC4KQEAgLTUxLDE0ICs1MCwxMyBAQAogCiB9IExWTV9UaW1lcl9JbnN0YW5jZV90OwogCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9JTlQzMiAgU2FtcGxpbmdSYXRlOwotICAgIExWTV9JTlQxNiAgVGltZUluTXM7Ci0gICAgTFZNX0lOVDMyICBDYWxsQmFja1BhcmFtOwotICAgIHZvaWQgICAgICAgKnBDYWxsQmFja1BhcmFtczsKLSAgICB2b2lkICAgICAgICpwQ2FsbGJhY2tJbnN0YW5jZTsKLSAgICB2b2lkICAgICAgICgqcENhbGxCYWNrKSh2b2lkKix2b2lkKixMVk1fSU5UMzIpOwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9JTlQzMiBTYW1wbGluZ1JhdGU7CisgICAgTFZNX0lOVDE2IFRpbWVJbk1zOworICAgIExWTV9JTlQzMiBDYWxsQmFja1BhcmFtOworICAgIHZvaWQqIHBDYWxsQmFja1BhcmFtczsKKyAgICB2b2lkKiBwQ2FsbGJhY2tJbnN0YW5jZTsKKyAgICB2b2lkICgqcENhbGxCYWNrKSh2b2lkKiwgdm9pZCosIExWTV9JTlQzMik7CiAKIH0gTFZNX1RpbWVyX1BhcmFtc190OwogCkBAIC02NiwxNCArNjQsMTIgQEAKIC8qICBGVU5DVElPTiBQUk9UT1RZUEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgTFZNX1RpbWVyX0luaXQgKCAgIExWTV9UaW1lcl9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVk1fVGltZXJfUGFyYW1zX3QgICAgICAgICAqcFBhcmFtcyAgICAgKTsKK3ZvaWQgTFZNX1RpbWVyX0luaXQoTFZNX1RpbWVyX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX1RpbWVyX1BhcmFtc190KiBwUGFyYW1zKTsKIAotdm9pZCBMVk1fVGltZXIgICAgICAoICAgTFZNX1RpbWVyX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tTaXplICk7Cit2b2lkIExWTV9UaW1lcihMVk1fVGltZXJfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fSU5UMTYgQmxvY2tTaXplKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgRU5EIE9GIEhFQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZW5kaWYgIC8qIF9fTFZNX1RJTUVSX0hfXyAqLworI2VuZGlmIC8qIF9fTFZNX1RJTUVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAppbmRleCA4YjY4N2Y2Li43Y2ZhZjI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaApAQCAtMjYsNTMgKzI2LDM0IEBACiAjZGVmaW5lIExWTV9UWVBFU19ICiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KLQorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBMVk1fTlVMTCAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgIC8qIE5VTEwgcG9pbnRlciAqLworI2RlZmluZSBMVk1fTlVMTCAwIC8qIE5VTEwgcG9pbnRlciAqLwogCi0jZGVmaW5lIExWTV9UUlVFICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgLyogQm9vbGVhbnMgKi8KLSNkZWZpbmUgTFZNX0ZBTFNFICAgICAgICAgICAgICAgMAorI2RlZmluZSBMVk1fVFJVRSAxIC8qIEJvb2xlYW5zICovCisjZGVmaW5lIExWTV9GQUxTRSAwCiAKLSNkZWZpbmUgTFZNX01BWElOVF84ICAgICAgICAgICAgMTI3ICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIHBvc2l0aXZlIGludGVnZXIgc2l6ZSAqLwotI2RlZmluZSBMVk1fTUFYSU5UXzE2ICAgICAgICAgICAzMjc2NwotI2RlZmluZSBMVk1fTUFYSU5UXzMyICAgICAgICAgICAyMTQ3NDgzNjQ3Ci0jZGVmaW5lIExWTV9NQVhFTlVNICAgICAgICAgICAgIDIxNDc0ODM2NDcKKyNkZWZpbmUgTFZNX01BWElOVF84IDEyNyAvKiBNYXhpbXVtIHBvc2l0aXZlIGludGVnZXIgc2l6ZSAqLworI2RlZmluZSBMVk1fTUFYSU5UXzE2IDMyNzY3CisjZGVmaW5lIExWTV9NQVhJTlRfMzIgMjE0NzQ4MzY0NworI2RlZmluZSBMVk1fTUFYRU5VTSAyMTQ3NDgzNjQ3CiAKLSNkZWZpbmUgTFZNX01PRFVMRUlEX01BU0sgICAgICAgMHhGRjAwICAgICAgICAgICAgICAvKiBNYXNrIHRvIGV4dHJhY3QgdGhlIGNhbGxpbmcgbW9kdWxlIElEIGZyb20gY2FsbGJhY2tJZCAqLwotI2RlZmluZSBMVk1fRVZFTlRJRF9NQVNLICAgICAgICAweDAwRkYgICAgICAgICAgICAgIC8qIE1hc2sgdG8gZXh0cmFjdCB0aGUgY2FsbGJhY2sgZXZlbnQgZnJvbSBjYWxsYmFja0lkICovCisjZGVmaW5lIExWTV9NT0RVTEVJRF9NQVNLIDB4RkYwMCAvKiBNYXNrIHRvIGV4dHJhY3QgdGhlIGNhbGxpbmcgbW9kdWxlIElEIGZyb20gY2FsbGJhY2tJZCAqLworI2RlZmluZSBMVk1fRVZFTlRJRF9NQVNLIDB4MDBGRiAgLyogTWFzayB0byBleHRyYWN0IHRoZSBjYWxsYmFjayBldmVudCBmcm9tIGNhbGxiYWNrSWQgKi8KIAogLyogTWVtb3J5IHRhYmxlKi8KLSNkZWZpbmUgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQSAgICAgIDAgICAvKiBPZmZzZXQgdG8gdGhlIGluc3RhbmNlIG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQSAgICAgIDEgICAvKiBPZmZzZXQgdG8gdGhlIHBlcnNpc3RlbnQgZGF0YSBtZW1vcnkgcmVnaW9uICovCi0jZGVmaW5lIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUYgICAgICAyICAgLyogT2Zmc2V0IHRvIHRoZSBwZXJzaXN0ZW50IGNvZWZmaWNpZW50IG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVCAgICAgICAgICAgIDMgICAvKiBPZmZzZXQgdG8gdGVtcG9yYXJ5IG1lbW9yeSByZWdpb24gKi8KKyNkZWZpbmUgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQSAwIC8qIE9mZnNldCB0byB0aGUgaW5zdGFuY2UgbWVtb3J5IHJlZ2lvbiAqLworI2RlZmluZSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBIDEgLyogT2Zmc2V0IHRvIHRoZSBwZXJzaXN0ZW50IGRhdGEgbWVtb3J5IHJlZ2lvbiAqLworI2RlZmluZSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGIFwKKyAgICAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9mZnNldCB0byB0aGUgcGVyc2lzdGVudCBjb2VmZmljaWVudCBtZW1vcnkgcmVnaW9uICovCisjZGVmaW5lIExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QgMyAvKiBPZmZzZXQgdG8gdGVtcG9yYXJ5IG1lbW9yeSByZWdpb24gKi8KIAotI2RlZmluZSBMVk1fTlJfTUVNT1JZX1JFR0lPTlMgICAgICAgICAgICAgICAgICAgNCAgIC8qIE51bWJlciBvZiBtZW1vcnkgcmVnaW9ucyAqLwotCi0vKiBNZW1vcnkgcGFydGl0aW9uIHR5cGUgKi8KLSNkZWZpbmUgTFZNX01FTV9QQVJUSVRJT04wICAgICAgMCAgICAgICAgICAgICAgICAgICAvKiAxc3QgbWVtb3J5IHBhcnRpdGlvbiAqLwotI2RlZmluZSBMVk1fTUVNX1BBUlRJVElPTjEgICAgICAxICAgICAgICAgICAgICAgICAgIC8qIDJuZCBtZW1vcnkgcGFydGl0aW9uICovCi0jZGVmaW5lIExWTV9NRU1fUEFSVElUSU9OMiAgICAgIDIgICAgICAgICAgICAgICAgICAgLyogM3JkIG1lbW9yeSBwYXJ0aXRpb24gKi8KLSNkZWZpbmUgTFZNX01FTV9QQVJUSVRJT04zICAgICAgMyAgICAgICAgICAgICAgICAgICAvKiA0dGggbWVtb3J5IHBhcnRpdGlvbiAqLwotCi0vKiBVc2UgdHlwZSAqLwotI2RlZmluZSBMVk1fTUVNX1BFUlNJU1RFTlQgICAgICAwICAgICAgICAgICAgICAgICAgIC8qIFBlcnNpc3RlbnQgbWVtb3J5IHR5cGUgKi8KLSNkZWZpbmUgTFZNX01FTV9TQ1JBVENIICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiBTY3JhdGNoICBtZW1vcnkgdHlwZSAqLwotCi0vKiBBY2Nlc3MgdHlwZSAqLwotI2RlZmluZSBMVk1fTUVNX0lOVEVSTkFMICAgICAgICAwICAgICAgICAgICAgICAgICAgIC8qIEludGVybmFsIChmYXN0KSBhY2Nlc3MgbWVtb3J5ICovCi0jZGVmaW5lIExWTV9NRU1fRVhURVJOQUwgICAgICAgIDggICAgICAgICAgICAgICAgICAgLyogRXh0ZXJuYWwgKHNsb3cpIGFjY2VzcyBtZW1vcnkgKi8KLQotLyogUGxhdGZvcm0gc3BlY2lmaWMgKi8KLSNkZWZpbmUgTFZNX1BFUlNJU1RFTlQgICAgICAgICAgKExWTV9NRU1fUEFSVElUSU9OMCtMVk1fTUVNX1BFUlNJU1RFTlQrTFZNX01FTV9JTlRFUk5BTCkKLSNkZWZpbmUgTFZNX1BFUlNJU1RFTlRfREFUQSAgICAgKExWTV9NRU1fUEFSVElUSU9OMStMVk1fTUVNX1BFUlNJU1RFTlQrTFZNX01FTV9JTlRFUk5BTCkKLSNkZWZpbmUgTFZNX1BFUlNJU1RFTlRfQ09FRiAgICAgKExWTV9NRU1fUEFSVElUSU9OMitMVk1fTUVNX1BFUlNJU1RFTlQrTFZNX01FTV9JTlRFUk5BTCkKLSNkZWZpbmUgTFZNX1NDUkFUQ0ggICAgICAgICAgICAgKExWTV9NRU1fUEFSVElUSU9OMytMVk1fTUVNX1NDUkFUQ0grTFZNX01FTV9JTlRFUk5BTCkKKyNkZWZpbmUgTFZNX05SX01FTU9SWV9SRUdJT05TIDQgLyogTnVtYmVyIG9mIG1lbW9yeSByZWdpb25zICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC04MCwzMyArNjEsMjggQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXR5cGVkZWYgICAgIGNoYXIgICAgICAgICAgICAgICAgTFZNX0NIQVI7ICAgICAgICAgICAvKiBBU0NJSSBjaGFyYWN0ZXIgKi8KK3R5cGVkZWYgY2hhciBMVk1fQ0hBUjsgLyogQVNDSUkgY2hhcmFjdGVyICovCiAKLXR5cGVkZWYgICAgIGludDhfdCAgICAgICAgICAgICAgTFZNX0lOVDg7ICAgICAgICAgICAvKiBTaWduZWQgOC1iaXQgd29yZCAqLwotdHlwZWRlZiAgICAgdWludDhfdCAgICAgICAgICAgICBMVk1fVUlOVDg7ICAgICAgICAgIC8qIFVuc2lnbmVkIDgtYml0IHdvcmQgKi8KK3R5cGVkZWYgaW50OF90IExWTV9JTlQ4OyAgIC8qIFNpZ25lZCA4LWJpdCB3b3JkICovCit0eXBlZGVmIHVpbnQ4X3QgTFZNX1VJTlQ4OyAvKiBVbnNpZ25lZCA4LWJpdCB3b3JkICovCiAKLXR5cGVkZWYgICAgIGludDE2X3QgICAgICAgICAgICAgTFZNX0lOVDE2OyAgICAgICAgICAvKiBTaWduZWQgMTYtYml0IHdvcmQgKi8KLXR5cGVkZWYgICAgIHVpbnQxNl90ICAgICAgICAgICAgTFZNX1VJTlQxNjsgICAgICAgICAvKiBVbnNpZ25lZCAxNi1iaXQgd29yZCAqLwordHlwZWRlZiBpbnQxNl90IExWTV9JTlQxNjsgICAvKiBTaWduZWQgMTYtYml0IHdvcmQgKi8KK3R5cGVkZWYgdWludDE2X3QgTFZNX1VJTlQxNjsgLyogVW5zaWduZWQgMTYtYml0IHdvcmQgKi8KIAotdHlwZWRlZiAgICAgaW50MzJfdCAgICAgICAgICAgICBMVk1fSU5UMzI7ICAgICAgICAgIC8qIFNpZ25lZCAzMi1iaXQgd29yZCAqLwotdHlwZWRlZiAgICAgdWludDMyX3QgICAgICAgICAgICBMVk1fVUlOVDMyOyAgICAgICAgIC8qIFVuc2lnbmVkIDMyLWJpdCB3b3JkICovCi10eXBlZGVmICAgICBpbnQ2NF90ICAgICAgICAgICAgIExWTV9JTlQ2NDsgICAgICAgICAgLyogU2lnbmVkIDY0LWJpdCB3b3JkICovCit0eXBlZGVmIGludDMyX3QgTFZNX0lOVDMyOyAgIC8qIFNpZ25lZCAzMi1iaXQgd29yZCAqLwordHlwZWRlZiB1aW50MzJfdCBMVk1fVUlOVDMyOyAvKiBVbnNpZ25lZCAzMi1iaXQgd29yZCAqLwordHlwZWRlZiBpbnQ2NF90IExWTV9JTlQ2NDsgICAvKiBTaWduZWQgNjQtYml0IHdvcmQgKi8KIAotI2RlZmluZSBMVk1fTUFYRkxPQVQgICAgICAgICAgICAxLmYKKyNkZWZpbmUgTFZNX01BWEZMT0FUIDEuZgogCi10eXBlZGVmICAgICBmbG9hdCAgICAgICAgICAgICAgIExWTV9GTE9BVDsgICAgICAgICAgLyogc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCAqLwordHlwZWRlZiBmbG9hdCBMVk1fRkxPQVQ7IC8qIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgKi8KIAogLy8gU2VsZWN0IHdoZXRoZXIgd2UgZXhwb3NlIGludDE2X3Qgb3IgZmxvYXQgYnVmZmVycy4KIAotI2RlZmluZSAgICBFRkZFQ1RfQlVGRkVSX0ZPUk1BVCBBVURJT19GT1JNQVRfUENNX0ZMT0FUCi10eXBlZGVmICAgICBmbG9hdCAgICAgICAgICAgICAgIGVmZmVjdF9idWZmZXJfdDsKKyNkZWZpbmUgRUZGRUNUX0JVRkZFUl9GT1JNQVQgQVVESU9fRk9STUFUX1BDTV9GTE9BVAordHlwZWRlZiBmbG9hdCBlZmZlY3RfYnVmZmVyX3Q7CiAKLQotI2lmZGVmIFNVUFBPUlRfTUMKLSNkZWZpbmUgTFZNX01BWF9DSEFOTkVMUyA4IC8vIEZDQ184Ci0jZWxzZQotI2RlZmluZSBMVk1fTUFYX0NIQU5ORUxTIDIgLy8gRkNDXzIKLSNlbmRpZgorI2RlZmluZSBMVk1fTUFYX0NIQU5ORUxTIEZDQ18yNAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTE1LDI5ICs5MSwyMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIE9wZXJhdGluZyBtb2RlICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fTU9ERV9PRkYgICAgPSAwLAotICAgIExWTV9NT0RFX09OICAgICA9IDEsCi0gICAgTFZNX01PREVfRFVNTVkgID0gTFZNX01BWEVOVU0KLX0gTFZNX01vZGVfZW47Cit0eXBlZGVmIGVudW0geyBMVk1fTU9ERV9PRkYgPSAwLCBMVk1fTU9ERV9PTiA9IDEsIExWTV9NT0RFX0RVTU1ZID0gTFZNX01BWEVOVU0gfSBMVk1fTW9kZV9lbjsKIAogLyogRm9ybWF0ICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fU1RFUkVPICAgICAgICAgID0gMCwKLSAgICBMVk1fTU9OT0lOU1RFUkVPICAgID0gMSwKLSAgICBMVk1fTU9OTyAgICAgICAgICAgID0gMiwKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX01VTFRJQ0hBTk5FTCAgICA9IDMsCi0jZW5kaWYKLSAgICBMVk1fU09VUkNFX0RVTU1ZICAgID0gTFZNX01BWEVOVU0KK3R5cGVkZWYgZW51bSB7CisgICAgTFZNX1NURVJFTyA9IDAsCisgICAgTFZNX01PTk9JTlNURVJFTyA9IDEsCisgICAgTFZNX01PTk8gPSAyLAorICAgIExWTV9NVUxUSUNIQU5ORUwgPSAzLAorICAgIExWTV9TT1VSQ0VfRFVNTVkgPSBMVk1fTUFYRU5VTQogfSBMVk1fRm9ybWF0X2VuOwogCiAvKiBMVk0gc2FtcGxpbmcgcmF0ZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWTV9GU184MDAwICA9IDAsCit0eXBlZGVmIGVudW0geworICAgIExWTV9GU184MDAwID0gMCwKICAgICBMVk1fRlNfMTEwMjUgPSAxLAogICAgIExWTV9GU18xMjAwMCA9IDIsCiAgICAgTFZNX0ZTXzE2MDAwID0gMywKQEAgLTE1MCw0MiArMTE3LDMzIEBACiAgICAgTFZNX0ZTXzk2MDAwID0gMTAsCiAgICAgTFZNX0ZTXzE3NjQwMCA9IDExLAogICAgIExWTV9GU18xOTIwMDAgPSAxMiwKLSAgICBMVk1fRlNfSU5WQUxJRCA9IExWTV9NQVhFTlVNLTEsCisgICAgTFZNX0ZTX0lOVkFMSUQgPSBMVk1fTUFYRU5VTSAtIDEsCiAgICAgTFZNX0ZTX0RVTU1ZID0gTFZNX01BWEVOVU0KIH0gTFZNX0ZzX2VuOwogCi0vKiBNZW1vcnkgVHlwZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWTV9QRVJTSVNURU5UX1NMT1dfREFUQSAgICA9IExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEEsCi0gICAgTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBICAgID0gTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQSwKLSAgICBMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUYgICAgPSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGLAotICAgIExWTV9URU1QT1JBUllfRkFTVCAgICAgICAgICA9IExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QsCi0gICAgTFZNX01FTU9SWVRZUEVfRFVNTVkgICAgICAgID0gTFZNX01BWEVOVU0KLX0gTFZNX01lbW9yeVR5cGVzX2VuOwotCi0vKiBNZW1vcnkgcmVnaW9uIGRlZmluaXRpb24gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIFNpemU7ICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiBzaXplIGluIGJ5dGVzICovCi0gICAgTFZNX01lbW9yeVR5cGVzX2VuICAgICAgICAgIFR5cGU7ICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiB0eXBlICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICpwQmFzZUFkZHJlc3M7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHJlZ2lvbiBiYXNlIGFkZHJlc3MgKi8KLX0gTFZNX01lbW9yeVJlZ2lvbl9zdDsKLQotLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fTWVtb3J5UmVnaW9uX3N0ICAgICAgICAgUmVnaW9uW0xWTV9OUl9NRU1PUllfUkVHSU9OU107ICAvKiBPbmUgZGVmaW5pdGlvbiBmb3IgZWFjaCByZWdpb24gKi8KLX0gTFZNX01lbW9yeVRhYmxlX3N0Oworc3RhdGljIGlubGluZSBMVk1fRnNfZW4gbHZtRnNGb3JTYW1wbGVSYXRlKGludCBzYW1wbGVSYXRlKSB7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6bWFwPGludCwgTFZNX0ZzX2VuPiBrTFZNRnNNYXAgPSB7CisgICAgICAgICAgICB7ODAwMCwgTFZNX0ZTXzgwMDB9LCAgICB7MTEwMjUsIExWTV9GU18xMTAyNX0sIHsxMjAwMCwgTFZNX0ZTXzEyMDAwfSwKKyAgICAgICAgICAgIHsxNjAwMCwgTFZNX0ZTXzE2MDAwfSwgIHsyMjA1MCwgTFZNX0ZTXzIyMDUwfSwgezI0MDAwLCBMVk1fRlNfMjQwMDB9LAorICAgICAgICAgICAgezMyMDAwLCBMVk1fRlNfMzIwMDB9LCAgezQ0MTAwLCBMVk1fRlNfNDQxMDB9LCB7NDgwMDAsIExWTV9GU180ODAwMH0sCisgICAgICAgICAgICB7ODgyMDAsIExWTV9GU184ODIwMH0sICB7OTYwMDAsIExWTV9GU185NjAwMH0sIHsxNzY0MDAsIExWTV9GU18xNzY0MDB9LAorICAgICAgICAgICAgezE5MjAwMCwgTFZNX0ZTXzE5MjAwMH19OworICAgIGlmIChrTFZNRnNNYXAuZmluZChzYW1wbGVSYXRlKSAhPSBrTFZNRnNNYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIGtMVk1Gc01hcC5hdChzYW1wbGVSYXRlKTsKKyAgICB9CisgICAgcmV0dXJuIExWTV9GU19JTlZBTElEOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFN0YW5kYXJkIEZ1bmN0aW9uIFByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBMVk1fSU5UMzIgKCpMVk1fQ2FsbGJhY2spKHZvaWQgICAgICAgICAgKnBDYWxsYmFja0RhdGEsICAgICAvKiBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayBkYXRhIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBHZW5lcmFsUHVycG9zZSwgICAvKiBHZW5lcmFsIHB1cnBvc2UgcG9pbnRlciAoZS5nLiB0byBhIGRhdGEgc3RydWN0dXJlIG5lZWRlZCBpbiB0aGUgY2FsbGJhY2spICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBHZW5lcmFsUHVycG9zZSApOyAgIC8qIEdlbmVyYWwgcHVycG9zZSB2YXJpYWJsZSAoZS5nLiB0byBiZSB1c2VkIGFzIGNhbGxiYWNrIElEKSAqLwordHlwZWRlZiBMVk1fSU5UMzIgKCpMVk1fQ2FsbGJhY2spKAorICAgICAgICB2b2lkKiBwQ2FsbGJhY2tEYXRhLCAgIC8qIFBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIGRhdGEgc3RydWN0dXJlICovCisgICAgICAgIHZvaWQqIHBHZW5lcmFsUHVycG9zZSwgLyogR2VuZXJhbCBwdXJwb3NlIHBvaW50ZXIgKGUuZy4gdG8gYSBkYXRhIHN0cnVjdHVyZSBuZWVkZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2spICovCisgICAgICAgIExWTV9JTlQxNiBHZW5lcmFsUHVycG9zZSk7IC8qIEdlbmVyYWwgcHVycG9zZSB2YXJpYWJsZSAoZS5nLiB0byBiZSB1c2VkIGFzIGNhbGxiYWNrIElEKSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTkzLDQgKzE1MSw0IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZW5kaWYgIC8qIExWTV9UWVBFU19IICovCisjZW5kaWYgLyogTFZNX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL01peGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9NaXhlci5oCmluZGV4IGIyZTAxOTUuLmJhNjA1ZTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL01peGVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTWl4ZXIuaApAQCAtMjQsODAgKzI0LDYyIEBACiAgICBJTlNUQU5DRSBNRU1PUlkgVFlQRSBERUZJTklUSU9OCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fRkxPQVQgICBBbHBoYTsgICAgICAgICAgICAgICAgICAgLyogVGltZSBjb25zdGFudC4gU2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24uIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgKi8KLSAgICBMVk1fRkxPQVQgICBUYXJnZXQ7ICAgICAgICAgICAgICAgICAgLyogVGFyZ2V0IHZhbHVlLiAgU2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24uIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgKi8KLSAgICBMVk1fRkxPQVQgICBDdXJyZW50OyAgICAgICAgICAgICAgICAgLyogQ3VycmVudCB2YWx1ZS4gIFNldCBieSB0aGUgbWl4ZXIgZnVuY3Rpb24uICovCi0gICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tTZXQ7ICAgICAgICAgICAgIC8qIEJvb2xlYW4uICBTaG91bGQgYmUgc2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHRpbWUgdGhlIHRhcmdldCB2YWx1ZSBpcyB1cGRhdGVkICovCi0gICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tQYXJhbTsgICAgICAgICAgIC8qIFBhcmFtZXRlciB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgY2FsYmFjayBmdW5jdGlvbiAqLwotICAgIHZvaWQgICAgICAgICpwQ2FsbGJhY2tIYW5kbGU7ICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLSAgICB2b2lkICAgICAgICAqcEdlbmVyYWxQdXJwb3NlOyAgICAgICAgLyogUG9pbnRlciBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzYWdlICovCi0gICAgTFZNX0NhbGxiYWNrIHBDYWxsQmFjazsgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0ZMT0FUIEFscGhhOyAgICAgICAgIC8qIFRpbWUgY29uc3RhbnQuIFNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lICovCisgICAgTFZNX0ZMT0FUIFRhcmdldDsgICAgICAgIC8qIFRhcmdldCB2YWx1ZS4gIFNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lICovCisgICAgTFZNX0ZMT0FUIEN1cnJlbnQ7ICAgICAgIC8qIEN1cnJlbnQgdmFsdWUuICBTZXQgYnkgdGhlIG1peGVyIGZ1bmN0aW9uLiAqLworICAgIExWTV9JTlQxNiBDYWxsYmFja1NldDsgICAvKiBCb29sZWFuLiAgU2hvdWxkIGJlIHNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCB0aW1lIHRoZSB0YXJnZXQgdmFsdWUgaXMgdXBkYXRlZCAqLworICAgIExWTV9JTlQxNiBDYWxsYmFja1BhcmFtOyAvKiBQYXJhbWV0ZXIgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGNhbGJhY2sgZnVuY3Rpb24gKi8KKyAgICB2b2lkKiBwQ2FsbGJhY2tIYW5kbGU7ICAgLyogUG9pbnRlciB0byB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCogcEdlbmVyYWxQdXJwb3NlOyAgIC8qIFBvaW50ZXIgZm9yIGdlbmVyYWwgcHVycG9zZSB1c2FnZSAqLworICAgIExWTV9DYWxsYmFjayBwQ2FsbEJhY2s7ICAvKiBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLwogfSBNaXhfMVN0X0NsbF9GTE9BVF90OwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fRkxPQVQgICBBbHBoYTE7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0MTsKLSAgICBMVk1fRkxPQVQgICBDdXJyZW50MTsKLSAgICBMVk1fSU5UMTYgICBDYWxsYmFja1NldDE7Ci0gICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tQYXJhbTE7Ci0gICAgdm9pZCAgICAgICAgKnBDYWxsYmFja0hhbmRsZTE7Ci0gICAgdm9pZCAgICAgICAgKnBHZW5lcmFsUHVycG9zZTE7Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0ZMT0FUIEFscGhhMTsKKyAgICBMVk1fRkxPQVQgVGFyZ2V0MTsKKyAgICBMVk1fRkxPQVQgQ3VycmVudDE7CisgICAgTFZNX0lOVDE2IENhbGxiYWNrU2V0MTsKKyAgICBMVk1fSU5UMTYgQ2FsbGJhY2tQYXJhbTE7CisgICAgdm9pZCogcENhbGxiYWNrSGFuZGxlMTsKKyAgICB2b2lkKiBwR2VuZXJhbFB1cnBvc2UxOwogICAgIExWTV9DYWxsYmFjayBwQ2FsbEJhY2sxOwogCi0gICAgTFZNX0ZMT0FUICAgQWxwaGEyOyAgICAgICAgICAgICAgICAgICAvKiBXYXJuaW5nIHRoZSBhZGRyZXNzIG9mIHRoaXMgbG9jYXRpb24gaXMgcGFzc2VkIGFzIGEgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byBNaXhfMVN0X0NsbF90IGluIHNvbWUgZnVuY3Rpb25zICovCi0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0MjsKLSAgICBMVk1fRkxPQVQgICBDdXJyZW50MjsKLSAgICBMVk1fSU5UMTYgICBDYWxsYmFja1NldDI7Ci0gICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tQYXJhbTI7Ci0gICAgdm9pZCAgICAgICAgKnBDYWxsYmFja0hhbmRsZTI7Ci0gICAgdm9pZCAgICAgICAgKnBHZW5lcmFsUHVycG9zZTI7CisgICAgTFZNX0ZMT0FUIEFscGhhMjsgLyogV2FybmluZyB0aGUgYWRkcmVzcyBvZiB0aGlzIGxvY2F0aW9uIGlzIHBhc3NlZCBhcyBhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIE1peF8xU3RfQ2xsX3QgaW4gc29tZSBmdW5jdGlvbnMgKi8KKyAgICBMVk1fRkxPQVQgVGFyZ2V0MjsKKyAgICBMVk1fRkxPQVQgQ3VycmVudDI7CisgICAgTFZNX0lOVDE2IENhbGxiYWNrU2V0MjsKKyAgICBMVk1fSU5UMTYgQ2FsbGJhY2tQYXJhbTI7CisgICAgdm9pZCogcENhbGxiYWNrSGFuZGxlMjsKKyAgICB2b2lkKiBwR2VuZXJhbFB1cnBvc2UyOwogICAgIExWTV9DYWxsYmFjayBwQ2FsbEJhY2syOwogfSBNaXhfMlN0X0NsbF9GTE9BVF90OwogCiAvKioqIEdlbmVyYWwgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZNX0ZMT0FUIExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZNX1VJTlQzMiAgIHRjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgIEZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIE51bUNoYW5uZWxzKTsKK0xWTV9GTE9BVCBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWTV9VSU5UMzIgdGMsIExWTV9VSU5UMzIgRnMsIExWTV9VSU5UMTYgTnVtQ2hhbm5lbHMpOwogCi12b2lkIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Cit2b2lkIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoTWl4XzFTdF9DbGxfRkxPQVRfdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywgTFZNX0ZMT0FUKiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwogCi12b2lkIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoICAgIE1peF8yU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwordm9pZCBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKE1peF8yU3RfQ2xsX0ZMT0FUX3QqIHBJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCogc3JjMiwgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKTsKIAotdm9pZCBNaXhJblNvZnRfRDMyQzMxX1NBVCggICAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwordm9pZCBNaXhJblNvZnRfRDMyQzMxX1NBVChNaXhfMVN0X0NsbF9GTE9BVF90KiBwSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gUFJPVE9UWVBFUyAoTE9XIExFVkVMIFNVQkZVTkNUSU9OUykKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKLXZvaWQgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKCAgIE1peF8yU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKLXZvaWQgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVCggICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Cit2b2lkIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQShNaXhfMVN0X0NsbF9GTE9BVF90KiBwSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKTsKK3ZvaWQgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKE1peF8yU3RfQ2xsX0ZMT0FUX3QqIHBJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUKiBzcmMyLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pOwordm9pZCBDb3JlX01peEluU29mdF9EMzJDMzFfU0FUKE1peF8xU3RfQ2xsX0ZMT0FUX3QqIHBJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1NjYWxhckFyaXRobWV0aWMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1NjYWxhckFyaXRobWV0aWMuaAppbmRleCBhZTU0NDE5Li4zNmM0Y2QyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9TY2FsYXJBcml0aG1ldGljLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvU2NhbGFyQXJpdGhtZXRpYy5oCkBAIC0yMSw3ICsyMSw3IEBACiAvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KIC8qICBJbmNsdWRlIGZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCi0KKyNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCiAKIC8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwpAQCAtMzAsNyArMzAsMTMgQEAKIAogLyogQWJzb2x1dGUgdmFsdWUgaW5jbHVkaW5nIHRoZSBjb3JuZXIgY2FzZSBmb3IgdGhlIGV4dHJlbWUgbmVnYXRpdmUgdmFsdWUgKi8KIAotTFZNX0ZMT0FUICAgQWJzX0Zsb2F0KExWTV9GTE9BVCAgICAgaW5wdXQpOworc3RhdGljIGlubGluZSBMVk1fRkxPQVQgQWJzX0Zsb2F0KExWTV9GTE9BVCBpbnB1dCkgeworICAgIHJldHVybiBmYWJzKGlucHV0KTsKK30KKworc3RhdGljIGlubGluZSBMVk1fRkxPQVQgTFZNX0NsYW1wKExWTV9GTE9BVCB2YWwpIHsKKyAgICByZXR1cm4gZm1pbihmbWF4KHZhbCwgLTEuMGYpLCAxLjBmKTsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICBOYW1lICAgICAgICA6IGRCX3RvX0xpbjMyKCkKQEAgLTQ0LDcgKzUwLDYgQEAKICAqICAgICAgICAgICAgICAgICAgKDE1LT4wMSkgPSBkZWNpbWFsIHBhcnQKICAqICBSZXR1cm5zICAgICA6IExpbiB2YWx1ZSBmb3JtYXQgMS4xNi4xNQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fRkxPQVQgZEJfdG9fTGluRmxvYXQoTFZNX0lOVDE2ICAgIGRiX2ZpeCk7CitMVk1fRkxPQVQgZEJfdG9fTGluRmxvYXQoTFZNX0lOVDE2IGRiX2ZpeCk7CiAKLSNlbmRpZiAgLyogX19TQ0FMQVJBUklUSE1FVElDX0hfXyAqLwotCisjZW5kaWYgLyogX19TQ0FMQVJBUklUSE1FVElDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCmluZGV4IGIyN2JhYzUuLjEwZjM1MWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmgKQEAgLTI0LDEyNyArMjQsNDEgQEAKICAgICBWQVJJT1VTIEZVTkNUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgTG9hZENvbnN0X0Zsb2F0KCAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7Cit2b2lkIENvcHlfRmxvYXQoY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbik7Cit2b2lkIENvcHlfRmxvYXRfTWNfU3RlcmVvKGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgTnJDaGFubmVscyk7Cit2b2lkIENvcHlfRmxvYXRfU3RlcmVvX01jKGNvbnN0IExWTV9GTE9BVCogc3JjLCBjb25zdCBMVk1fRkxPQVQqIFN0ZXJlb091dCwgTFZNX0ZMT0FUKiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpOwogCi12b2lkIENvcHlfRmxvYXQoICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLSNpZmRlZiBTVVBQT1JUX01DCi12b2lkIENvcHlfRmxvYXRfTWNfU3RlcmVvKCAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpOwotdm9pZCBDb3B5X0Zsb2F0X1N0ZXJlb19NYyggICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKlN0ZXJlb091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpOwotI2VuZGlmCit2b2lkIE11bHQzc19GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyYywgY29uc3QgTFZNX0ZMT0FUIHZhbCwgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogbm90ZTogSW4gTXVsdDNzXzE2eDE2KCkgc2F0dXJhdGlvbiBvZiByZXN1bHQgaXMgbm90IHRha2VuIGNhcmUgd2hlbiAgICAgICAgICAgKgotICogICAgICAgb3ZlcmZsb3cgb2NjdXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgRm9yIGV4YW1wbGUgd2hlbiAqc3JjID0gMHg4MDAwLCB2YWwgPSAqMHg4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgVGhlIGZ1bmN0aW9uIGdpdmVzIHRoZSBvdXRwdXQgYXMgMHg4MDAwIGluc3RlYWQgb2YgMHg3ZmZmICAgICAgICAgICAgICAgKgotICogICAgICAgVGhpcyBpcyB0aGUgb25seSBjYXNlIHdoaWNoIHdpbGwgZ2l2ZSB3cm9uZyByZXN1bHQuICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVmZXIgdG8gVmVjdG9yX0FyaXRobWV0aWMuZG9jIGluIC9kb2MgZm9sZGVyICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTXVsdDNzX0Zsb2F0KCAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUIHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBub3RlOiBJbiBNdWx0M3NfMzJ4MTYoKSBzYXR1cmF0aW9uIG9mIHJlc3VsdCBpcyBub3QgdGFrZW4gY2FyZSB3aGVuICAgICAgICAgICAqCi0gKiAgICAgICBvdmVyZmxvdyBvY2N1cnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICBGb3IgZXhhbXBsZSB3aGVuICpzcmMgPSAweDgwMDAwMDAsIHZhbCA9ICoweDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICBUaGUgZnVuY3Rpb24gZ2l2ZXMgdGhlIG91dHB1dCBhcyAweDgwMDAwMDAgaW5zdGVhZCBvZiAweDdmZmZmZmZmICAgICAgICAqCi0gKiAgICAgICBUaGlzIGlzIHRoZSBvbmx5IGV4dHJlbWUgY29uZGl0aW9uIHdoaWNoIGlzIGdpdmluZyB1bmV4cGVjdGVkIHJlc3VsdCAgICAqCi0gKiAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWZlciB0byBWZWN0b3JfQXJpdGhtZXRpYy5kb2MgaW4gL2RvYyBmb2xkZXIgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBNdWx0M3NfMzJ4MTYoICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLXZvaWQgRGVsYXlNaXhfRmxvYXQoY29uc3QgTFZNX0ZMT0FUICpzcmMsICAgICAgICAgICAvKiBTb3VyY2UgMSwgdG8gYmUgZGVsYXllZCAqLwotICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRlbGF5LCAgICAgICAgIC8qIERlbGF5IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgc2l6ZSwgICAgICAgICAgIC8qIERlbGF5IHNpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsICAgICAgICAgICAvKiBTb3VyY2UvZGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpwT2Zmc2V0LCAgICAgICAvKiBEZWxheSBvZmZzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pICA7ICAgICAgICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCi12b2lkIERlbGF5V3JpdGVfMzIoICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsICAgICAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRlbGF5LCAgICAgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgc2l6ZSwgICAgICAgICAgICAgICAvKiBEZWxheSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICpwT2Zmc2V0LCAgICAgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Ci12b2lkIEFkZDJfU2F0X0Zsb2F0KCAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLXZvaWQgTWFjM3NfU2F0X0Zsb2F0KCAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUIHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotdm9pZCBEZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMiggICAgTFZNX0lOVDMyICAqZGVsYXksICAgICAgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgc2l6ZSwgICAgICAgICAgICAgICAgLyogRGVsYXkgc2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IGNvZWZmLCAgICAgICAgICAgICAgICAvKiBBbGwgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgRGVsYXlPZmZzZXQsICAgICAgICAgLyogU2ltcGxlIGRlbGF5IG9mZnNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAqcEFsbFBhc3NPZmZzZXQsICAgICAvKiBBbGwgcGFzcyBmaWx0ZXIgZGVsYXkgb2Zmc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsICAgICAgICAgICAgICAgIC8qIFNvdXJjZS9kZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwordm9pZCBEZWxheU1peF9GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyYywgIC8qIFNvdXJjZSAxLCB0byBiZSBkZWxheWVkICovCisgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZGVsYXksICAgICAgLyogRGVsYXkgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBzaXplLCAgICAgICAgLyogRGVsYXkgc2l6ZSAqLworICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgICAgICAgIC8qIFNvdXJjZS9kZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYqIHBPZmZzZXQsICAgIC8qIERlbGF5IG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiwgICAgICAgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLworICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgTnJDaGFubmVscyk7IC8qIE51bWJlciBvZiBjaGFubmVscyAqLwordm9pZCBBZGQyX1NhdF9GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyYywgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKTsKK3ZvaWQgTWFjM3NfU2F0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjLCBjb25zdCBMVk1fRkxPQVQgdmFsLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgIFNISUZUIEZVTkNUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFNoaWZ0X1NhdF9GbG9hdCAoY29uc3QgICBMVk1fSU5UMTYgICB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbik7Cit2b2lkIFNoaWZ0X1NhdF9GbG9hdChjb25zdCBMVk1fSU5UMTYgdmFsLCBjb25zdCBMVk1fRkxPQVQqIHNyYywgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgQVVESU8gRk9STUFUIENPTlZFUlNJT04gRlVOQ1RJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTW9ub1RvMklfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLXZvaWQgRnJvbTJpVG9Nb25vX0Zsb2F0KCAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLSNpZmRlZiBTVVBQT1JUX01DCi12b2lkIEZyb21NY1RvTW9ub19GbG9hdChjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAordm9pZCBNb25vVG8ySV9GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyYywgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKTsKK3ZvaWQgRnJvbTJpVG9Nb25vX0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pOwordm9pZCBGcm9tTWNUb01vbm9fRmxvYXQoY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgTnJGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJDaGFubmVscyk7Ci0jZW5kaWYKLXZvaWQgTVNUbzJpX1NhdF9GbG9hdCggICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLXZvaWQgRnJvbTJpVG9NU19GbG9hdCggICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3RNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLXZvaWQgSm9pblRvMmlfRmxvYXQoICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgKnNyY0wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICpzcmNSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBEQVRBIFRZUEUgQ09OVkVSU0lPTiBGVU5DVElPTlMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIEludDE2TFNoaWZ0VG9JbnQzMl8xNngzMihjb25zdCBMVk1fSU5UMTYgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNoaWZ0ICk7Ci0KLXZvaWQgSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNihjb25zdCAgTFZNX0lOVDMyICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBzaGlmdCApOwordm9pZCBNU1RvMmlfU2F0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjTSwgY29uc3QgTFZNX0ZMT0FUKiBzcmNTLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pOwordm9pZCBGcm9tMmlUb01TX0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdE0sIExWTV9GTE9BVCogZHN0UywgTFZNX0lOVDE2IG4pOwordm9pZCBKb2luVG8yaV9GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyY0wsIGNvbnN0IExWTV9GTE9BVCogc3JjUiwgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNlbmRpZiAgLyogX1ZFQ1RPUl9BUklUSE1FVElDX0hfICovCisjZW5kaWYgLyogX1ZFQ1RPUl9BUklUSE1FVElDX0hfICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jcHAKaW5kZXggZTE4YWE3OC4uNzhmMzI5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuY3BwCkBAIC0yMCw3ICsyMCw2IEBACiAvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KICNpbmNsdWRlICJBR0MuaCIKICNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCiAKQEAgLTMwLDE1MSArMjksMTMgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgVk9MX1RDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxICAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwotI2RlZmluZSBERUNBWV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCAgICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCi0jZGVmaW5lIFZPTF9UQ19GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wZiAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KLSNkZWZpbmUgREVDQVlfRkFDX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0LjBmICAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBWT0xfVENfU0hJRlQgMjEgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIERFQ0FZX1NISUZUIDEwICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgVk9MX1RDX0ZMT0FUIDIuMGYgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBERUNBWV9GQUNfRkxPQVQgNjQuMGYgLyogQXMgYSBwb3dlciBvZiAyICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBcHBseSBBR0MgYW5kIG1peCBzaWduYWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU3RTcmMgICAtLS0tLS0tLS0tLS0tLS0tLS18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgIF9fX19fXyAgICAgICBffF8gICAgICAgIF9fX19fX19fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgIHwgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb25vU3JjIC0tPnwgQUdDICB8LS0tLT58ICsgfC0tLS0tPnwgVm9sdW1lIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tPiAgICAqLwotLyogICAgICAgICAgICAgfCBHYWluIHwgICAgIHxfX198ICAgICAgfCBHYWluICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICovCi0vKiAgICAgICAgICAgICB8X19fX19ffCAgICAgICAgICAgICAgICB8X19fX19fX198ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgIC98XCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX19fX19fX19fICAgICBfX19fX19fXyAgICB8ICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgfCAgICAgICAgfCAgIHwgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IEFHQyBHYWluIHw8LS18IFBlYWsgICB8PC0tfCAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVXBkYXRlICAgfCAgIHwgRGV0ZWN0IHwgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX19fX198ICAgfF9fX19fX19ffCAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU3RlcmVvSW4gICAgICAgICAgICAgICBTdGVyZW8gc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNb25vSW4gICAgICAgICAgICAgICAgIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFN0ZXJlb091dCAgICAgICAgICAgICAgU3RlcmVvIGRlc3RpbmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90ICAqcEluc3RhbmNlLCAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBTdFNyYywgICAgICAgIC8qIFN0ZXJlbyBzb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTW9ub1NyYywgICAgICAvKiBNb25vIHNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsICAgICAgICAgIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcykgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCi17Ci0KLSAgICAvKgotICAgICAqIEdlbmVyYWwgdmFyaWFibGVzCi0gICAgICovCi0gICAgTFZNX1VJTlQxNiAgICAgIGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlIGluZGV4ICovCi0gICAgTFZNX0ZMT0FUICAgICAgIExlZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBzYW1wbGUgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgUmlnaHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSaWdodCBzYW1wbGUgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgTW9ubzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb25vIHNhbXBsZSAqLwotICAgIExWTV9GTE9BVCAgICAgICBBYnNQZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFic29sdXRlIHBlYWsgc2lnbmFsICovCi0gICAgTFZNX0ZMT0FUICAgICAgIEFHQ19NdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvcnQgQUdDIGdhaW4gKi8KLSAgICBMVk1fRkxPQVQgICAgICAgVm9sX011bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCB2b2x1bWUgKi8KLQotICAgIC8qCi0gICAgICogSW5zdGFuY2UgY29udHJvbCB2YXJpYWJsZXMKLSAgICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICBBR0NfR2FpbiAgICAgID0gcEluc3RhbmNlLT5BR0NfR2FpbjsgICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KLSAgICBMVk1fRkxPQVQgICAgICBBR0NfTWF4R2FpbiAgID0gcEluc3RhbmNlLT5BR0NfTWF4R2FpbjsgICAgICAvKiBHZXQgbWF4aW11bSBBR0MgZ2FpbiAqLwotICAgIExWTV9GTE9BVCAgICAgIEFHQ19BdHRhY2sgICAgPSBwSW5zdGFuY2UtPkFHQ19BdHRhY2s7ICAgICAgIC8qIEF0dGFjayBzY2FsZXIgKi8KLSAgICBMVk1fRkxPQVQgICAgICBBR0NfRGVjYXkgICAgID0gKHBJbnN0YW5jZS0+QUdDX0RlY2F5ICogKDEgPDwgKERFQ0FZX1NISUZUKSkpOy8qIERlY2F5IHNjYWxlciAqLwotICAgIExWTV9GTE9BVCAgICAgIEFHQ19UYXJnZXQgICAgPSBwSW5zdGFuY2UtPkFHQ19UYXJnZXQ7ICAgICAgIC8qIEdldCB0aGUgdGFyZ2V0IGxldmVsICovCi0gICAgTFZNX0ZMT0FUICAgICAgVm9sX0N1cnJlbnQgICA9IHBJbnN0YW5jZS0+Vm9sdW1lOyAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCi0gICAgTFZNX0ZMT0FUICAgICAgVm9sX1RhcmdldCAgICA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAgICAgICAgICAgLyogVGFyZ2V0IHZvbHVtZSBzZXR0aW5nICovCi0gICAgTFZNX0ZMT0FUICAgICAgVm9sX1RDICAgICAgICA9IHBJbnN0YW5jZS0+Vm9sdW1lVEM7ICAgICAgICAgLyogVGltZSBjb25zdGFudCAqLwotCi0gICAgLyoKLSAgICAgKiBQcm9jZXNzIG9uIGEgc2FtcGxlIGJ5IHNhbXBsZSBiYXNpcwotICAgICAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBOdW1TYW1wbGVzOyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBlYWNoIHNhbXBsZSAqLwotICAgIHsKLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdGhlIHNob3J0IHNjYWxlcnMKLSAgICAgICAgICovCi0gICAgICAgIEFHQ19NdWx0ICAgID0gKExWTV9GTE9BVCkoQUdDX0dhaW4pOyAgICAgICAgICAgICAgLyogR2V0IHRoZSBzaG9ydCBBR0MgZ2FpbiAqLwotICAgICAgICBWb2xfTXVsdCAgICA9IChMVk1fRkxPQVQpKFZvbF9DdXJyZW50KTsgICAgICAgICAgIC8qIEdldCB0aGUgc2hvcnQgdm9sdW1lIGdhaW4gKi8KLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdGhlIGlucHV0IHNhbXBsZXMKLSAgICAgICAgICovCi0gICAgICAgIExlZnQgID0gKnBTdFNyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBsZWZ0IHNhbXBsZSAqLwotICAgICAgICBSaWdodCA9ICpwU3RTcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgcmlnaHQgc2FtcGxlICovCi0gICAgICAgIE1vbm8gID0gKnBNb25vU3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBtb25vIHNhbXBsZSAqLwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEFwcGx5IHRoZSBBR0MgZ2FpbiB0byB0aGUgbW9ubyBpbnB1dCBhbmQgbWl4IHdpdGggdGhlIHN0ZXJlbyBzaWduYWwKLSAgICAgICAgICovCi0gICAgICAgIExlZnQgICs9IChNb25vICogQUdDX011bHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNaXggaW4gdGhlIG1vbm8gc2lnbmFsICovCi0gICAgICAgIFJpZ2h0ICs9IChNb25vICogQUdDX011bHQpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEFwcGx5IHRoZSB2b2x1bWUgYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQgc3RyZWFtCi0gICAgICAgICAqLwotICAgICAgICBMZWZ0ICA9IExlZnQgICogVm9sX011bHQ7Ci0gICAgICAgIFJpZ2h0ID0gUmlnaHQgKiBWb2xfTXVsdDsKLSAgICAgICAgKnBEc3QrKyA9IExlZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHRoZSByZXN1bHRzICovCi0gICAgICAgICpwRHN0KysgPSBSaWdodDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBVcGRhdGUgdGhlIEFHQyBnYWluCi0gICAgICAgICAqLwotICAgICAgICBBYnNQZWFrID0gQWJzX0Zsb2F0KExlZnQpID4gQWJzX0Zsb2F0KFJpZ2h0KSA/IEFic19GbG9hdChMZWZ0KSA6IEFic19GbG9hdChSaWdodCk7Ci0gICAgICAgIGlmIChBYnNQZWFrID4gQUdDX1RhcmdldCkKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIGxhcmdlIHNvIGRlY3JlYXNlIHRoZSBnYWluCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEFHQ19HYWluID0gQUdDX0dhaW4gKiBBR0NfQXR0YWNrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIHNtYWxsIHNvIGluY3JlYXNlIHRoZSBnYWluCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChBR0NfR2FpbiA+IEFHQ19NYXhHYWluKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFHQ19HYWluIC09IChBR0NfRGVjYXkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFHQ19HYWluICs9IChBR0NfRGVjYXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVXBkYXRlIHRoZSBnYWluCi0gICAgICAgICAqLwotICAgICAgICBWb2xfQ3VycmVudCArPSAgKFZvbF9UYXJnZXQgLSBWb2xfQ3VycmVudCkgKiAoKExWTV9GTE9BVClWb2xfVEMgLyBWT0xfVENfRkxPQVQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVXBkYXRlIHRoZSBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgcEluc3RhbmNlLT5Wb2x1bWUgPSBWb2xfQ3VycmVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCi0gICAgcEluc3RhbmNlLT5BR0NfR2FpbiA9IEFHQ19HYWluOwotCi0gICAgcmV0dXJuOwotfQotI2lmZGVmIFNVUFBPUlRfTUMKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICBBR0NfTUlYX1ZPTF9NYzFNb25fRDMyX1dSQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMDksOTMgKzcwLDgwIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTWNTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1vbm9TcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcERzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnJDaGFubmVscykKLXsKLQordm9pZCBBR0NfTUlYX1ZPTF9NYzFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QqIHBJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwTWNTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCogcE1vbm9TcmMsIExWTV9GTE9BVCogcERzdCwgTFZNX1VJTlQxNiBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBOckNoYW5uZWxzKSB7CiAgICAgLyoKICAgICAgKiBHZW5lcmFsIHZhcmlhYmxlcwogICAgICAqLwotICAgIExWTV9VSU5UMTYgICAgICBpLCBqajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZSBpbmRleCAqLwotICAgIExWTV9GTE9BVCAgICAgICBTYW1wbGVWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZSB2YWx1ZSAqLwotICAgIExWTV9GTE9BVCAgICAgICBNb25vOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vbm8gc2FtcGxlICovCi0gICAgTFZNX0ZMT0FUICAgICAgIEFic1BlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWJzb2x1dGUgcGVhayBzaWduYWwgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgQUdDX011bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBBR0MgZ2FpbiAqLwotICAgIExWTV9GTE9BVCAgICAgICBWb2xfTXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IHZvbHVtZSAqLworICAgIExWTV9VSU5UMTYgaSwgamo7ICAgIC8qIFNhbXBsZSBpbmRleCAqLworICAgIExWTV9GTE9BVCBTYW1wbGVWYWw7IC8qIFNhbXBsZSB2YWx1ZSAqLworICAgIExWTV9GTE9BVCBNb25vOyAgICAgIC8qIE1vbm8gc2FtcGxlICovCisgICAgTFZNX0ZMT0FUIEFic1BlYWs7ICAgLyogQWJzb2x1dGUgcGVhayBzaWduYWwgKi8KKyAgICBMVk1fRkxPQVQgQUdDX011bHQ7ICAvKiBTaG9ydCBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCBWb2xfTXVsdDsgIC8qIFNob3J0IHZvbHVtZSAqLwogCiAgICAgLyoKICAgICAgKiBJbnN0YW5jZSBjb250cm9sIHZhcmlhYmxlcwogICAgICAqLwotICAgIExWTV9GTE9BVCAgICAgIEFHQ19HYWluICAgICAgPSBwSW5zdGFuY2UtPkFHQ19HYWluOyAgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBBR0MgZ2FpbiAqLwotICAgIExWTV9GTE9BVCAgICAgIEFHQ19NYXhHYWluICAgPSBwSW5zdGFuY2UtPkFHQ19NYXhHYWluOyAgICAgIC8qIEdldCBtYXhpbXVtIEFHQyBnYWluICovCi0gICAgTFZNX0ZMT0FUICAgICAgQUdDX0F0dGFjayAgICA9IHBJbnN0YW5jZS0+QUdDX0F0dGFjazsgICAgICAgLyogQXR0YWNrIHNjYWxlciAqLworICAgIExWTV9GTE9BVCBBR0NfR2FpbiA9IHBJbnN0YW5jZS0+QUdDX0dhaW47ICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCBBR0NfTWF4R2FpbiA9IHBJbnN0YW5jZS0+QUdDX01heEdhaW47IC8qIEdldCBtYXhpbXVtIEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUIEFHQ19BdHRhY2sgPSBwSW5zdGFuY2UtPkFHQ19BdHRhY2s7ICAgLyogQXR0YWNrIHNjYWxlciAqLwogICAgIC8qIERlY2F5IHNjYWxlciAqLwotICAgIExWTV9GTE9BVCAgICAgIEFHQ19EZWNheSAgICAgPSAocEluc3RhbmNlLT5BR0NfRGVjYXkgKiAoMSA8PCAoREVDQVlfU0hJRlQpKSk7Ci0gICAgTFZNX0ZMT0FUICAgICAgQUdDX1RhcmdldCAgICA9IHBJbnN0YW5jZS0+QUdDX1RhcmdldDsgICAgICAgLyogR2V0IHRoZSB0YXJnZXQgbGV2ZWwgKi8KLSAgICBMVk1fRkxPQVQgICAgICBWb2xfQ3VycmVudCAgID0gcEluc3RhbmNlLT5Wb2x1bWU7ICAgICAgICAgICAvKiBBY3R1YWwgdm9sdW1lIHNldHRpbmcgKi8KLSAgICBMVk1fRkxPQVQgICAgICBWb2xfVGFyZ2V0ICAgID0gcEluc3RhbmNlLT5UYXJnZXQ7ICAgICAgICAgICAvKiBUYXJnZXQgdm9sdW1lIHNldHRpbmcgKi8KLSAgICBMVk1fRkxPQVQgICAgICBWb2xfVEMgICAgICAgID0gcEluc3RhbmNlLT5Wb2x1bWVUQzsgICAgICAgICAvKiBUaW1lIGNvbnN0YW50ICovCisgICAgTFZNX0ZMT0FUIEFHQ19EZWNheSA9IChwSW5zdGFuY2UtPkFHQ19EZWNheSAqICgxIDw8IChERUNBWV9TSElGVCkpKTsKKyAgICBMVk1fRkxPQVQgQUdDX1RhcmdldCA9IHBJbnN0YW5jZS0+QUdDX1RhcmdldDsgLyogR2V0IHRoZSB0YXJnZXQgbGV2ZWwgKi8KKyAgICBMVk1fRkxPQVQgVm9sX0N1cnJlbnQgPSBwSW5zdGFuY2UtPlZvbHVtZTsgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUIFZvbF9UYXJnZXQgPSBwSW5zdGFuY2UtPlRhcmdldDsgICAgIC8qIFRhcmdldCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9GTE9BVCBWb2xfVEMgPSBwSW5zdGFuY2UtPlZvbHVtZVRDOyAgICAgICAvKiBUaW1lIGNvbnN0YW50ICovCiAKICAgICAvKgogICAgICAqIFByb2Nlc3Mgb24gYSBzYW1wbGUgYnkgc2FtcGxlIGJhc2lzCiAgICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IE5yRnJhbWVzOyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBlYWNoIGZyYW1lICovCisgICAgZm9yIChpID0gMDsgaSA8IE5yRnJhbWVzOyBpKyspIC8qIEZvciBlYWNoIGZyYW1lICovCiAgICAgewotCiAgICAgICAgIC8qCiAgICAgICAgICAqIEdldCB0aGUgc2NhbGVycwogICAgICAgICAgKi8KLSAgICAgICAgQUdDX011bHQgICAgPSAoTFZNX0ZMT0FUKShBR0NfR2Fpbik7ICAgICAgICAgICAgICAvKiBHZXQgdGhlIEFHQyBnYWluICovCi0gICAgICAgIFZvbF9NdWx0ICAgID0gKExWTV9GTE9BVCkoVm9sX0N1cnJlbnQpOyAgICAgICAgICAgLyogR2V0IHRoZSB2b2x1bWUgZ2FpbiAqLworICAgICAgICBBR0NfTXVsdCA9IChMVk1fRkxPQVQpKEFHQ19HYWluKTsgICAgLyogR2V0IHRoZSBBR0MgZ2FpbiAqLworICAgICAgICBWb2xfTXVsdCA9IChMVk1fRkxPQVQpKFZvbF9DdXJyZW50KTsgLyogR2V0IHRoZSB2b2x1bWUgZ2FpbiAqLwogCiAgICAgICAgIEFic1BlYWsgPSAwLjBmOwogICAgICAgICAvKgogICAgICAgICAgKiBHZXQgdGhlIGlucHV0IHNhbXBsZXMKICAgICAgICAgICovCi0gICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNhbXBsZVZhbCAgPSAqcE1jU3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHNhbXBsZSB2YWx1ZSBvZiBqaiBDaGFubmVsKi8KLSAgICAgICAgICAgIE1vbm8gICAgICAgPSAqcE1vbm9TcmM7ICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1vbm8gc2FtcGxlICovCisgICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspIHsKKyAgICAgICAgICAgIFNhbXBsZVZhbCA9ICpwTWNTcmMrKzsgLyogR2V0IHRoZSBzYW1wbGUgdmFsdWUgb2YgamogQ2hhbm5lbCovCisgICAgICAgICAgICBNb25vID0gKnBNb25vU3JjOyAgICAgIC8qIEdldCB0aGUgbW9ubyBzYW1wbGUgKi8KIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIEFwcGx5IHRoZSBBR0MgZ2FpbiB0byB0aGUgbW9ubyBpbnB1dCBhbmQgbWl4IHdpdGggdGhlIGlucHV0IHNpZ25hbAogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTYW1wbGVWYWwgICs9IChNb25vICogQUdDX011bHQpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1peCBpbiB0aGUgbW9ubyBzaWduYWwgKi8KKyAgICAgICAgICAgIFNhbXBsZVZhbCArPSAoTW9ubyAqIEFHQ19NdWx0KTsgLyogTWl4IGluIHRoZSBtb25vIHNpZ25hbCAqLwogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQXBwbHkgdGhlIHZvbHVtZSBhbmQgd3JpdGUgdG8gdGhlIG91dHB1dCBzdHJlYW0KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU2FtcGxlVmFsICA9IFNhbXBsZVZhbCAgKiBWb2xfTXVsdDsKKyAgICAgICAgICAgIFNhbXBsZVZhbCA9IFNhbXBsZVZhbCAqIFZvbF9NdWx0OwogCi0gICAgICAgICAgICAqcERzdCsrID0gU2FtcGxlVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB0aGUgcmVzdWx0cyAqLworICAgICAgICAgICAgKnBEc3QrKyA9IExWTV9DbGFtcChTYW1wbGVWYWwpOyAvKiBTYXZlIHRoZSByZXN1bHRzICovCiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIEFHQyBnYWluCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIEFic1BlYWsgPSBBYnNfRmxvYXQoU2FtcGxlVmFsKSA+IEFic1BlYWsgPyBBYnNfRmxvYXQoU2FtcGxlVmFsKSA6IEFic1BlYWs7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKEFic1BlYWsgPiBBR0NfVGFyZ2V0KQotICAgICAgICB7CisgICAgICAgIGlmIChBYnNQZWFrID4gQUdDX1RhcmdldCkgewogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIGxhcmdlIHNvIGRlY3JlYXNlIHRoZSBnYWluCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIEFHQ19HYWluID0gQUdDX0dhaW4gKiBBR0NfQXR0YWNrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIHNtYWxsIHNvIGluY3JlYXNlIHRoZSBnYWluCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChBR0NfR2FpbiA+IEFHQ19NYXhHYWluKQotICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKEFHQ19HYWluID4gQUdDX01heEdhaW4pIHsKICAgICAgICAgICAgICAgICBBR0NfR2FpbiAtPSAoQUdDX0RlY2F5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQUdDX0dhaW4gKz0gKEFHQ19EZWNheSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTMwMywxNSArMTUxLDE0IEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFVwZGF0ZSB0aGUgZ2FpbgogICAgICAgICAgKi8KLSAgICAgICAgVm9sX0N1cnJlbnQgKz0gIChWb2xfVGFyZ2V0IC0gVm9sX0N1cnJlbnQpICogKChMVk1fRkxPQVQpVm9sX1RDIC8gVk9MX1RDX0ZMT0FUKTsKKyAgICAgICAgVm9sX0N1cnJlbnQgKz0gKFZvbF9UYXJnZXQgLSBWb2xfQ3VycmVudCkgKiAoKExWTV9GTE9BVClWb2xfVEMgLyBWT0xfVENfRkxPQVQpOwogICAgIH0KIAogICAgIC8qCiAgICAgICogVXBkYXRlIHRoZSBwYXJhbWV0ZXJzCiAgICAgICovCi0gICAgcEluc3RhbmNlLT5Wb2x1bWUgPSBWb2xfQ3VycmVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCisgICAgcEluc3RhbmNlLT5Wb2x1bWUgPSBWb2xfQ3VycmVudDsgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCiAgICAgcEluc3RhbmNlLT5BR0NfR2FpbiA9IEFHQ19HYWluOwogCiAgICAgcmV0dXJuOwogfQotI2VuZGlmIC8qU1VQUE9SVF9NQyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BYnNfMzIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWJzXzMyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAxMzgwOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BYnNfMzIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCi0vKiAgSW5jbHVkZSBmaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwotCi0jaW5jbHVkZSAgICAiU2NhbGFyQXJpdGhtZXRpYy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIE5hbWUgICAgICAgIDogQWJzXzMyKCkKLSAqICBJbnB1dCAgICAgICA6IFNpZ25lZCAzMi1iaXQgaW50ZWdlcgotICogIE91dHB1dCAgICAgIDoKLSAqICBSZXR1cm5zICAgICA6IEFic29sdXRlIHZhbHVlCi0gKiAgRGVzY3JpcHRpb24gOiBBYnNvbHV0ZSB2YWx1ZSB3aXRoIG1heGltdW0gbmVnYXRpdmUgdmFsdWUgY29ybmVyIGNhc2UKLSAqICBSZW1hcmtzICAgICA6Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTFZNX0lOVDMyICAgIEFic18zMihMVk1fSU5UMzIgICAgaW5wdXQpCi17Ci0gICAgaWYoaW5wdXQgPCAgMCkKLSAgICB7Ci0gICAgICAgIGlmIChpbnB1dCA9PSAoTFZNX0lOVDMyKSgweDgwMDAwMDAwVSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFRoZSBjb3JuZXIgY2FzZSwgc28gc2V0IHRvIHRoZSBtYXhpbXVtIHBvc2l0aXZlIHZhbHVlICovCi0gICAgICAgICAgICBpbnB1dD0oTFZNX0lOVDMyKSAweDdmZmZmZmZmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogTmVnYXRpdmUgaW5wdXQsIHNvIGludmVydCAqLwotICAgICAgICAgICAgaW5wdXQgPSAoTFZNX0lOVDMyKSgtaW5wdXQpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbnB1dDsKLX0KLUxWTV9GTE9BVCAgICBBYnNfRmxvYXQoTFZNX0ZMT0FUICAgIGlucHV0KQotewotICAgIGlmKGlucHV0IDwgIDApCi0gICAgewotICAgICAgICAvKiBOZWdhdGl2ZSBpbnB1dCwgc28gaW52ZXJ0ICovCi0gICAgICAgIGlucHV0ID0gKExWTV9GTE9BVCkoLWlucHV0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGlucHV0OwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMTZ4MTYuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMTZ4MTYuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTc4ZmU3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzE2eDE2LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBJTkNMVURFIEZJTEVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIEFERDJfU0FUXzE2WDE2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBBZGQyX1NhdF8xNngxNiggY29uc3QgTFZNX0lOVDE2ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCi17Ci0gICAgTFZNX0lOVDMyIFRlbXA7Ci0gICAgTFZNX0lOVDE2IGlpOwotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKLSAgICAgICAgVGVtcCA9ICgoTFZNX0lOVDMyKSAqc3JjKSArICgoTFZNX0lOVDMyKSAqZHN0KTsKLSAgICAgICAgc3JjKys7Ci0KLSAgICAgICAgaWYgKFRlbXAgPiAweDAwMDA3RkZGKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gMHg3RkZGOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMHgwMDAwODAwMCkKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IC0gMHg4MDAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IChMVk1fSU5UMTYpVGVtcDsKLSAgICAgICAgfQotICAgICAgICBkc3QrKzsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmNwcAppbmRleCBhNDhlNjY4Li4xOTgxZWRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuY3BwCkBAIC0xOCw2OSArMTgsMTUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBJTkNMVURFIEZJTEVTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBBREQyX1NBVF8zMlgzMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgQWRkMl9TYXRfMzJ4MzIoIGNvbnN0IExWTV9JTlQzMiAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCi17Ci0gICAgTFZNX0lOVDMyIGEsYixjOwotICAgIExWTV9JTlQxNiBpaTsKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIGE9KnNyYzsKLSAgICAgICAgc3JjKys7Ci0KLSAgICAgICAgYj0qZHN0OwotICAgICAgICBjPWErYjsKLSAgICAgICAgaWYgKCgoKGMgXiBhKSAmIChjIF4gYikpID4+IDMxKSE9MCkgICAgIC8qIG92ZXJmbG93IC8gdW5kZXJmbG93ICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGE8MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjPTB4ODAwMDAwMDBMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGM9MHg3RkZGRkZGRkw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAqZHN0ID0gYzsKLSAgICAgICAgZHN0Kys7Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotdm9pZCBBZGQyX1NhdF9GbG9hdCggY29uc3QgTFZNX0ZMT0FUICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuICkKLXsKK3ZvaWQgQWRkMl9TYXRfRmxvYXQoY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbikgewogICAgIExWTV9GTE9BVCBUZW1wOwogICAgIExWTV9JTlQxNiBpaTsKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkgKnNyYykgKyAoKExWTV9GTE9BVCkgKmRzdCk7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgIGlmIChUZW1wID4gMS4wMDAwMDBmKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gMS4wMDAwMDBmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wMDAwMDBmKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gLTEuMDAwMDAwZjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSBUZW1wOwotICAgICAgICB9Ci0gICAgICAgIGRzdCsrOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgIFRlbXAgPSAqc3JjKysgKyAqZHN0OworICAgICAgICAqZHN0KysgPSBMVk1fQ2xhbXAoVGVtcCk7CiAgICAgfQogICAgIHJldHVybjsKIH0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTVlMDdmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBBU1NVTVBUSU9OUzoKLSBDT0VGUy0KLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEwLAotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgLUIyLAotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE0IGZvcm1hdAotCi0gREVMQVlTLQotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLQotICAgIHsKLSAgICAgICAgTFZNX0ZMT0FUIHluTDsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8geW5MPSAoQTAgICogKHgobilMICAtIHgobi0yKUwgICkgKQotICAgICAgICAgICAgeW5MID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqICgoKnBEYXRhSW4pLXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSk7Ci0KLSAgICAgICAgICAgIC8vIHluTCs9ICgoLUIyICAqIHkobi0yKUwgICkgKQotICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107Ci0KLSAgICAgICAgICAgIC8vIHluTCs9ICgoLUIxICAqIHkobi0xKUwgICkgKQotICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0geW5MOyAvLyBVcGRhdGUgeShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTAotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dCsrPXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQKLQotICAgICAgICB9Ci0KLSAgICB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYjZjMTYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLwotLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCi0vKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCi0vKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAgICAgICAqcENvZWYpCi17Ci0gICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwczsKLQotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSBwQ29lZi0+QTA7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHBDb2VmLT5CMjsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gcENvZWYtPkIxOwotfQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEVuZCBPZiBGaWxlOiBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMDAwYjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpZm5kZWYgX0JQXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KLSNkZWZpbmUgX0JQXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KLQotLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwotLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KLXsKLSAgTFZNX0lOVDMyICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gIExWTV9JTlQzMiAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi19RmlsdGVyX1N0YXRlOwotCi10eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwotCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCi17Ci0KLSAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfUZpbHRlcl9TdGF0ZV9GTE9BVDsKLXR5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7Ci0jZW5kaWYgLypfQlBfMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NDRkMDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEFTU1VNUFRJT05TOgotIENPRUZTLQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTAsCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyAtQjIsCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMzAgZm9ybWF0Ci0KLSBERUxBWVMtCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTE2IGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCi17Ci0gICAgTFZNX0ZMT0FUIHluTCx0ZW1wbDsKLSAgICBMVk1fSU5UMTYgaWk7Ci0gICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVClwSW5zdGFuY2U7Ci0KLSAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8vIHluTD0gKEEwICogKHgobilMIC0geChuLTIpTCApKQotICAgICAgICB0ZW1wbCA9IChMVk1fRkxPQVQpICpwRGF0YUluIC0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotICAgICAgICB5bkwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogdGVtcGw7Ci0KLSAgICAgICAgLy8geW5MKz0gKCgtQjIgICogeShuLTIpTCAgKSApCi0gICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKLSAgICAgICAgeW5MICs9IHRlbXBsOwotCi0gICAgICAgIC8vIHluTCs9ICgoLUIxICAqIHkobi0xKUwgICkpCi0gICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKLSAgICAgICAgeW5MICs9IHRlbXBsOwotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCi0gICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLy8geChuLTIpTD14KG4tMSlMCi0gICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwgaW4gUTE2Ci0gICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwgaW4gUTAKLQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICpwRGF0YU91dCsrID0gKHluTCk7IC8vIFdyaXRlIExlZnQgb3V0cHV0Ci0gICAgICAgIH0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMTUwMzIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJhbmQgcGFzcyBmaWx0ZXIgKEJJUVVBRCkgICAgICAgICAgICAgICAqLwotLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCi0vKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCi0vKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBUaGUgY29lZmZpY2llbnRzIGFyZSBtb2RpZmllZCBpbiB0aGUgaW5pdCgpIGZ1bmN0aW9uIHN1Y2ggdGhhdCBsb3dlciAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaGFsZiB3b3JkIGlzIHJpZ2h0IHNoaWZ0ZWQgYnkgb25lIGFuZCBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgbG93ZXIgICAgICAgICAgICAqLwotLyogICAgICAgIHdvcmQgaXMgbWFkZSB0byBiZSB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICBSZWFzb246IEZvciBNSVBTIGVmZmNpZW5jeSx3ZSBhcmUgdXNpbmcgRFNQIDMyKjE2IG11bHRpcGxpY2F0aW9uICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgaW5zdHJ1Y3Rpb24uIEJ1dCB3ZSBoYXZlIDMyKjMyIG11bHRpcGxpY2F0aW9uLiBUaGlzIGNhbiBiZSByZWFsaXplZCBieSB0d28gMzIqMTYgICAgKi8KLS8qICAgICAgIG11bHRpcGxpY2F0aW9uLiBCdXQgMTZ0aCBiaXQgaW4gdGhlIDMyIGJpdCB3b3JkIGlzIG5vdCBhIHNpZ24gYml0LiBTbyB0aGlzIGlzIGRvbmUgICovCi0vKiAgICAgICBieSBwdXR0aW5nIDE2dGggYml0IHRvIHplcm8gYW5kIGxvc3Npbmcgb25lIGJpdCBwcmVjaXNpb24gYnkgZGl2aXNpb24gb2YgbG93ZXIgICAgICAqLwotLyogICAgICAgaGFsZiB3b3JkIGJ5IDIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICAgICAqcENvZWYpCi17Ci0gICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgICA9KExWTV9GTE9BVCAqKSBwVGFwczsKLQotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSAgcENvZWYtPkEwOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSAgcENvZWYtPkIyOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSAgcENvZWYtPkIxOwotfQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEVuZCBPZiBGaWxlOiBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNzU0ZTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpZm5kZWYgX0JQXzFJX0QxNkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KLSNkZWZpbmUgX0JQXzFJX0QxNkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KLQotLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwotLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KLXsKLSAgTFZNX0lOVDMyICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gIExWTV9JTlQzMiAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi19RmlsdGVyX1N0YXRlOwotCi10eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAotewotICAgIExWTV9GTE9BVCAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICAgIExWTV9GTE9BVCAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi19RmlsdGVyX1N0YXRlX0Zsb2F0OwotdHlwZWRlZiBGaWx0ZXJfU3RhdGVfRmxvYXQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKLSNlbmRpZiAvKl9CUF8xSV9EMTZGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiYTIwNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQVNTVU1QVElPTlM6Ci0gQ09FRlMtCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMCwKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIC1CMiwKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFEzMCBmb3JtYXQKLQotIERFTEFZUy0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgeW5MLHRlbXBsOwotICAgICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKLQotICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8geW5MPSAoQTAgICogKHgobilMICAtIHgobi0yKUwgICkgKQotICAgICAgICAgICAgdGVtcGwgPSAoKnBEYXRhSW4pIC0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotICAgICAgICAgICAgeW5MID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHRlbXBsOwotCi0gICAgICAgICAgICAvLyB5bkwrPSAoKC1CMiAgKiB5KG4tMilMICApICkKLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKLSAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKLQotICAgICAgICAgICAgLy8geW5MKz0gKCgtQjEgICogeShuLTEpTCAgKSApCi0gICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07Ci0gICAgICAgICAgICB5bkwgKz0gdGVtcGw7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0geW5MOyAvLyBVcGRhdGUgeShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTAotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dCsrID0geW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAotCi0gICAgICAgIH0KLQotICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmN2QwYjUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLwotLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCi0vKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCi0vKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQotewotICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKLSAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPShMVk1fRkxPQVQgKikgcFRhcHM7Ci0KLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gcENvZWYtPkEwOwotCi0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHBDb2VmLT5CMjsKLQotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSBwQ29lZi0+QjE7Ci19Ci0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRW5kIE9mIEZpbGU6IEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYxYzY2YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Qcml2YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2lmbmRlZiBfQlBfMUlfRDMyRjMyQ0xMX1RSQ19XUkFfMDJfUFJJVkFURV9IXwotI2RlZmluZSBfQlBfMUlfRDMyRjMyQ0xMX1RSQ19XUkFfMDJfUFJJVkFURV9IXwotCi0vKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCi0vKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwotewotICBMVk1fSU5UMzIgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgTFZNX0lOVDMyICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGU7Ci0KLXR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Ci10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCi17Ci0gICAgTFZNX0ZMT0FUICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGVfRmxvYXQ7Ci10eXBlZGVmIEZpbHRlcl9TdGF0ZV9GbG9hdCogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7Ci0KLSNlbmRpZiAvKl9CUF8xSV9EMzJGMzJDTExfVFJDX1dSQV8wMl9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlY2M0MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQVNTVU1QVElPTlM6Ci0gQ09FRlMtCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTUgZm9ybWF0Ci0KLSBERUxBWVMtCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotICAgIHsKLSAgICAgICAgTFZNX0ZMT0FUICB5bkw7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotCi0gICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgewotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8vIHluTD1BMiAgKiB4KG4tMilMCi0gICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07Ci0KLSAgICAgICAgICAgIC8vIHluTCs9QTEgKiB4KG4tMSlMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOwotCi0gICAgICAgICAgICAvLyB5bkwrPUEwICogeChuKUwKLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOwotCi0gICAgICAgICAgICAvLyB5bkwrPSAgKC1CMiAgKiB5KG4tMilMICkKLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107Ci0KLSAgICAgICAgICAgIC8vIHluTCs9ICgtQjEgICogeShuLTEpTCAgKQotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOyAvLyB5KG4tMilMPXkobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLy8geChuLTIpTD14KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKLQotICAgICAgICB9Ci0KLSAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGI1ZDA2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KLS8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLwotLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLwotLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKLXsKLSAgICBMVk1fRkxPQVQgdGVtcDsKLSAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0gICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzIDsKLSAgICB0ZW1wID0gcENvZWYtPkEyOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QTE7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5BMDsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkIyOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QjE7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSA9IHRlbXA7Ci19Ci0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRW5kIE9mIEZpbGU6IEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFkMzQ1ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2lmbmRlZiBfQlFfMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotI2RlZmluZSBfQlFfMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotCi0vKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCi0vKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwotewotICBMVk1fSU5UMzIgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgTFZNX0lOVDE2ICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGU7Ci0KLXR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Ci0KLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKLXsKLSAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1s1XTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotCi19RmlsdGVyX1N0YXRlX0ZMT0FUOwotdHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKLSNlbmRpZiAvKl9CUV8xSV9EMTZGMTZDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0M2JjNWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEFTU1VNUFRJT05TOgotIENPRUZTLQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTIsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTEKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIEEwLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIC1CMgotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE0IGZvcm1hdAotCi0gREVMQVlTLQotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFExNiBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotICAgIHsKLSAgICAgICAgTFZNX0ZMT0FUICB5bkw7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotCi0gICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgewotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8vIHluTD1BMiAgKiB4KG4tMilMCi0gICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07Ci0KLSAgICAgICAgICAgIC8vIHluTCs9QTEgICogeChuLTEpTAotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKLQotICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7Ci0KLSAgICAgICAgICAgIC8vIHluTCs9ICggKC1CMiAgKiB5KG4tMilMICkKLSAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOwotCi0gICAgICAgICAgICAvLyB5bkwrPSAtQjEgICogeShuLTEpTAotICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgIC8vIHkobi0yKUw9eShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLy8geChuLTIpTD14KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSB5bkw7ICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKUwKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpKHluTCk7IC8vIFdyaXRlIExlZnQgb3V0cHV0Ci0KLSAgICAgICAgfQotICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE2MWQ5YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2lmbmRlZiBfQlFfMUlfRDE2RjMyQ1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotI2RlZmluZSBfQlFfMUlfRDE2RjMyQ1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotCi0vKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCi0vKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwotewotICBMVk1fSU5UMzIgKiAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICBMVk1fSU5UMTYgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi19RmlsdGVyX1N0YXRlOwotCi10eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwotCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCi17Ci0gICAgTFZNX0ZMT0FUICogICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgICBMVk1fRkxPQVQgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi0KLX1GaWx0ZXJfU3RhdGVfRkxPQVQ7Ci10eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOwotI2VuZGlmIC8qX0JRXzFJX0QxNkYzMkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4MDY5MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgVGhlc2UgZnVuY3Rpb25zIGluaXRpYWxpemVzIGEgQklRVUFEIGZpbHRlciBkZWZpbmVkIGFzIGEgY2FzY2FkZSBvZiAgICovCi0vKiAgIGJpcXVhZHJhdGljIEZpbHRlciBTZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBJbnN0YW5jZSAgICAtIG91dHB1dCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgU3RhdGUgVmFyaWFibGUgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgVGhpcyBzdGF0ZSBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIGFueSBzdWJzZXF1ZW50ICAgKi8KLS8qICAgICAgICAgICAgICAgICAgIGNhbGwgdG8gIkJpcXVhZCIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBUYXBzICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgdGFwcyBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwQ29lZiAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHN0cnVjdHVyZSAgICAgICAgICAgKi8KLS8qICAgTiAgICAgICAgICAgICAtIE0gY29lZmZpY2llbnQgZmFjdG9yIG9mIFFNLk4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCi17Ci0gICAgTFZNX0ZMT0FUIHRlbXA7Ci0gICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKXBUYXBzOwotCi0gICAgdGVtcCA9IHBDb2VmLT5BMjsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkExOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QTA7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5CMjsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkIxOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gPSB0ZW1wOwotfQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEVuZCBPZiBGaWxlOiBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWNkOTE4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQVNTVU1QVElPTlM6Ci0gQ09FRlMtCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTQgZm9ybWF0Ci0KLSBERUxBWVMtCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0xKVIgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHgobi0yKVIgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotICAgIHsKLSAgICAgICAgTFZNX0ZMT0FUICB5bkwseW5SOwotICAgICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKLQotICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgIHsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvLyB5bkw9QTIgICogeChuLTIpTAotICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOwotCi0gICAgICAgICAgICAvLyB5bkwrPUExICAqIHgobi0xKUwKLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07Ci0KLSAgICAgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOwotCi0gICAgICAgICAgICAvLyB5bkwrPSAoIC1CMiAgKiB5KG4tMilMICApCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdOwotCi0gICAgICAgICAgICAvLyB5bkwrPSggLUIxICAqIHkobi0xKUwgKQotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8geW5SPUEyICAqIHgobi0yKVIKLSAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKLQotICAgICAgICAgICAgLy8geW5SKz1BMSAgKiB4KG4tMSlSCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotCi0gICAgICAgICAgICAvLyB5blIrPUEwICAqIHgobilSCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7Ci0KLSAgICAgICAgICAgIC8vIHluUis9ICggLUIyICAqIHkobi0yKVIgICkKLSAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN107Ci0KLSAgICAgICAgICAgIC8vIHluUis9KCAtQjEgICogeShuLTEpUiAgKQotICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLy8geShuLTIpUj15KG4tMSlSCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvLyB5KG4tMilMPXkobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgIC8vIHgobi0yKVI9eChuLTEpUgotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLy8geChuLTIpTD14KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpUgotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpUgotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0Ci0gICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5SOyAvLyBXcml0ZSBSaWdodCBvdXB1dAotCi0gICAgICAgIH0KLQotICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3NDc0OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEFTU1VNUFRJT05TOgotIENPRUZTLQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTIsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTEKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIEEwLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIC1CMgotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE1IGZvcm1hdAotCi0gREVMQVlTLQotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMSlSIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB4KG4tMilSIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSBpcyB5KG4tMSlSIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFEwIGZvcm1hdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgeW5MLHluUjsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8geW5MPUEyICAqIHgobi0yKUwKLSAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKLQotICAgICAgICAgICAgLy8geW5MKz1BMSAgKiB4KG4tMSlMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOwotCi0gICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKLQotICAgICAgICAgICAgLy8geW5MKz0gKCAtQjIgICogeShuLTIpTAotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XTsKLQotICAgICAgICAgICAgLy8geW5MKz0oIC1CMSAgKiB5KG4tMSlMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvLyB5blI9QTIgICogeChuLTIpUgotICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOwotCi0gICAgICAgICAgICAvLyB5blIrPUExICAqIHgobi0xKVIKLSAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07Ci0KLSAgICAgICAgICAgIC8vIHluUis9QTAgICogeChuKVIKLSAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKihwRGF0YUluKzEpKTsKLQotICAgICAgICAgICAgLy8geW5SKz0gKCAtQjIgICogeShuLTIpUiAgKQotICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XTsKLQotICAgICAgICAgICAgLy8geW5SKz0oIC1CMSAgKiB5KG4tMSlSICApCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07ICAvLyB5KG4tMilSPXkobi0xKVIKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgIC8vIHkobi0yKUw9eShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAgLy8geChuLTIpUj14KG4tMSlSCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvLyB4KG4tMilMPXgobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IHluUjsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlSCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSB5bkw7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlSCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQKLSAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5blI7IC8vIFdyaXRlIFJpZ2h0IG91cHV0Ci0KLSAgICAgICAgfQotCi0gICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg3Y2JjZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgVGhlc2UgZnVuY3Rpb25zIGluaXRpYWxpemVzIGEgQklRVUFEIGZpbHRlciBkZWZpbmVkIGFzIGEgY2FzY2FkZSBvZiAgICovCi0vKiAgIGJpcXVhZHJhdGljIEZpbHRlciBTZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBJbnN0YW5jZSAgICAtIG91dHB1dCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgU3RhdGUgVmFyaWFibGUgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgVGhpcyBzdGF0ZSBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIGFueSBzdWJzZXF1ZW50ICAgKi8KLS8qICAgICAgICAgICAgICAgICAgIGNhbGwgdG8gIkJpcXVhZCIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBUYXBzICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgdGFwcyBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwQ29lZiAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHN0cnVjdHVyZSAgICAgICAgICAgKi8KLS8qICAgTiAgICAgICAgICAgICAtIE0gY29lZmZpY2llbnQgZmFjdG9yIG9mIFFNLk4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCi17Ci0gICAgTFZNX0ZMT0FUIHRlbXA7Ci0gICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwcyAgICAgICAgICAgIDsKLQotICAgIHRlbXAgPSBwQ29lZi0+QTI7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5BMTsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkEwOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QjI7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5CMTsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdID0gdGVtcDsKLX0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBFbmQgT2YgRmlsZTogQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTlhMGU5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX0JRXzJJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KLSNkZWZpbmUgX0JRXzJJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KLQotLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwotLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KLXsKLSAgTFZNX0lOVDMyICogICBwRGVsYXlzOyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAqLwotICBMVk1fSU5UMTYgICAgIGNvZWZzWzVdOyAgICAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfUZpbHRlcl9TdGF0ZTsKLQotdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKLQotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAotewotICAgIExWTV9GTE9BVCAqICAgcERlbGF5czsgICAgICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgKi8KLSAgICBMVk1fRkxPQVQgICAgIGNvZWZzWzVdOyAgICAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotCi19RmlsdGVyX1N0YXRlX0ZMT0FUOwotdHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKLQotI2VuZGlmIC8qIF9CUV8ySV9EMTZGMTZDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMWM5N2YuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBBU1NVTVBUSU9OUzoKLSBDT0VGUy0KLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExMyBmb3JtYXQKLQotIERFTEFZUy0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMTYgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTE2IGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMTYgZm9ybWF0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgeW5MLHluUjsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgewotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIHluTD1BMiAqIHgobi0yKUwgKi8KLSAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKLQotICAgICAgICAgICAgLyogeW5MKz1BMSogeChuLTEpTCAqLwotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKLQotICAgICAgICAgICAgLyogeW5MKz1BMCogeChuKUwgICAqLwotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7Ci0KLSAgICAgICAgICAgIC8qIHluTCs9LUIyKnkobi0yKUwgKi8KLSAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOwotCi0gICAgICAgICAgICAvKiB5bkwrPS1CMSp5KG4tMSlMICovCi0gICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5SPUEyICogeChuLTIpUiAqLwotICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOwotCi0gICAgICAgICAgICAvKiB5blIrPUExKiB4KG4tMSlSICovCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotCi0gICAgICAgICAgICAvKiB5blIrPUEwKiB4KG4pUiAgICovCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7Ci0KLSAgICAgICAgICAgIC8qIHluUis9LUIyICogeShuLTIpUiAqLwotICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107Ci0KLSAgICAgICAgICAgIC8qIHluUis9LUIxICogeShuLTEpUiAqLwotICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8qIHkobi0yKVI9eShuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvKiB5KG4tMilMPXkobi0xKUwqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAgLyogeChuLTIpUj14KG4tMSlSKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8qIHgobi0yKUw9eChuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7ICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpUiAqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKUwgKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlMICovCi0gICAgICAgICAgICBwRGF0YUluKys7Ci0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4pOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpUiAqLwotICAgICAgICAgICAgcERhdGFJbisrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluTCk7IC8qIFdyaXRlIExlZnQgb3V0cHV0ICovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5SKTsgLyogV3JpdGUgUmlnaHQgb3VwdXQgKi8KLSAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgIH0KLSAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMzk2ZGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBBU1NVTVBUSU9OUzoKLSBDT0VGUy0KLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExNCBmb3JtYXQKLQotIERFTEFZUy0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMTYgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTE2IGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMTYgZm9ybWF0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgeW5MLHluUjsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgewotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIHluTD1BMiAgKiB4KG4tMilMICovCi0gICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07Ci0KLSAgICAgICAgICAgIC8qIHluTCs9QTEgICogeChuLTEpTCAqLwotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKLQotICAgICAgICAgICAgLyogeW5MKz1BMCAgKiB4KG4pTCAqLwotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7Ci0KLSAgICAgICAgICAgIC8qIHluTCs9ICggKC1CMiAgKiB5KG4tMilMICApKSovCi0gICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKLQotICAgICAgICAgICAgLyogeW5MKz0oICgtQjEgICogeShuLTEpTCAgKSkgICovCi0gICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5SPUEyICAqIHgobi0yKVIgKi8KLSAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKLQotICAgICAgICAgICAgLyogeW5SKz1BMSAgKiB4KG4tMSlSICovCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotCi0gICAgICAgICAgICAvKiB5blIrPUEwICAqIHgobilSICovCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7Ci0KLSAgICAgICAgICAgIC8qIHluUis9ICggKC1CMiAgKiB5KG4tMilSICApKSovCi0gICAgICAgICAgICB5blIgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKLQotICAgICAgICAgICAgLyogeW5SKz0oICgtQjEgICogeShuLTEpUiAgKSkgICovCi0gICAgICAgICAgICB5blIgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLyogeShuLTIpUj15KG4tMSlSKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgIC8qIHkobi0yKUw9eShuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvKiB4KG4tMilSPXgobi0xKVIqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLyogeChuLTIpTD14KG4tMSlMKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IHluUjsgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB5KG4tMSlSICovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSB5bkw7ICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpTCAqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgICAgICAgICAgICAgICAgLyogVXBkYXRlIHgobi0xKUwgKi8KLSAgICAgICAgICAgIHBEYXRhSW4rKzsKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlSICovCi0gICAgICAgICAgICBwRGF0YUluKys7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5MKTsgLyogV3JpdGUgTGVmdCBvdXRwdXQgKi8KLSAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5blIpOyAvKiBXcml0ZSBSaWdodCBvdXB1dCAqLwotICAgICAgICAgICAgcERhdGFPdXQrKzsKLSAgICAgICAgfQotCi0gICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2JmZjFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQVNTVU1QVElPTlM6Ci0gQ09FRlMtCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTUgZm9ybWF0Ci0KLSBERUxBWVMtCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0xKVIgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHgobi0yKVIgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdIGlzIHkobi0xKUwgaW4gUTE2IGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSBpcyB5KG4tMSlSIGluIFExNiBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTE2IGZvcm1hdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgIHluTCx5blI7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotCi0gICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgewotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIHluTD1BMiAgKiB4KG4tMilMICovCi0gICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07Ci0KLSAgICAgICAgICAgIC8qIHluTCs9QTEgICogeChuLTEpTCAqLwotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKLQotICAgICAgICAgICAgLyogeW5MKz1BMCAgKiB4KG4pTCAqLwotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7Ci0KLSAgICAgICAgICAgIC8qIHluTCs9ICggKC1CMiAgKiB5KG4tMilMICkgICovCi0gICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKLQotICAgICAgICAgICAgLyogeW5MKz0oICgtQjEgICogeShuLTEpTCAgKSkgICovCi0gICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5SPUEyICAqIHgobi0yKVIgKi8KLSAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKLQotICAgICAgICAgICAgLyogeW5SKz1BMSAgKiB4KG4tMSlSICovCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotCi0gICAgICAgICAgICAvKiB5blIrPUEwICAqIHgobilSICovCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7Ci0KLSAgICAgICAgICAgIC8qIHluUis9ICggKC1CMiAgKiB5KG4tMilSICkgKi8KLSAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOwotCi0gICAgICAgICAgICAvKiB5blIrPSggKC1CMSAgKiB5KG4tMSlSICApKSBpbiBRMTUgKi8KLSAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7IC8qIFVwZGF0ZSB5KG4tMSlSKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgLyogVXBkYXRlIHkobi0xKUwqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKUwqLwotICAgICAgICAgICAgcERhdGFJbisrOwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKVIqLwotICAgICAgICAgICAgcERhdGFJbisrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluTCk7IC8qIFdyaXRlIExlZnQgb3V0cHV0Ki8KLSAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5blIpOyAvKiBXcml0ZSBSaWdodCBvdXB1dCovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICB9Ci0KLSAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNDM4OGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfQlFfMklfRDE2RjMyQ1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotI2RlZmluZSBfQlFfMklfRDE2RjMyQ1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotCi0vKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCi0vKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwotewotICBMVk1fSU5UMzIgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZzWzVdOyAgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGU7Ci0KLXR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Ci0KLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKLXsKLSAgICBMVk1fRkxPQVQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Vmc1s1XTsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGVfRkxPQVQ7Ci10eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOwotCi0jZW5kaWYgLyogX0JRXzJJX0QxNkYzMkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ODU0MWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgVGhlc2UgZnVuY3Rpb25zIGluaXRpYWxpemVzIGEgQklRVUFEIGZpbHRlciBkZWZpbmVkIGFzIGEgY2FzY2FkZSBvZiAgICovCi0vKiAgIGJpcXVhZHJhdGljIEZpbHRlciBTZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBJbnN0YW5jZSAgICAtIG91dHB1dCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgU3RhdGUgVmFyaWFibGUgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgVGhpcyBzdGF0ZSBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIGFueSBzdWJzZXF1ZW50ICAgKi8KLS8qICAgICAgICAgICAgICAgICAgIGNhbGwgdG8gIkJpcXVhZCIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBUYXBzICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgdGFwcyBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwQ29lZiAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHN0cnVjdHVyZSAgICAgICAgICAgKi8KLS8qICAgTiAgICAgICAgICAgICAtIE0gY29lZmZpY2llbnQgZmFjdG9yIG9mIFFNLk4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCi17Ci0gICAgTFZNX0ZMT0FUIHRlbXA7Ci0gICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwczsKLSAgICB0ZW1wID0gcENvZWYtPkEyOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QTE7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5BMDsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkIyOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QjE7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSA9IHRlbXA7Ci19Ci0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRW5kIE9mIEZpbGU6IEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZDFiYTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBBU1NVTVBUSU9OUzoKLSBDT0VGUy0KLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFEzMCBmb3JtYXQKLQotIERFTEFZUy0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gaXMgeShuLTEpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgeW5MLHluUix0ZW1wbCx0ZW1wZDsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5MPSAoIEEyICAqIHgobi0yKUwgICkgKi8KLSAgICAgICAgICAgIHluTCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07Ci0KLSAgICAgICAgICAgIC8qIHluTCs9ICggQTEgICogeChuLTEpTCAgKSovCi0gICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07Ci0gICAgICAgICAgICB5bkwgKz0gdGVtcGw7Ci0KLSAgICAgICAgICAgIC8qIHluTCs9ICggQTAgICogeChuKUwgICkgKi8KLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7Ci0gICAgICAgICAgICB5bkwgKz0gdGVtcGw7Ci0KLSAgICAgICAgICAgICAvKiB5bkwrPSAoLUIyICAqIHkobi0yKUwgICkgKi8KLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XTsKLSAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKLQotICAgICAgICAgICAgLyogeW5MKz0gKC1CMSAgKiB5KG4tMSlMICApKi8KLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsKLSAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5SPSAoIEEyICAqIHgobi0yKVIgICkgKi8KLSAgICAgICAgICAgIHluUiA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107Ci0KLSAgICAgICAgICAgIC8qIHluUis9ICggQTEgICogeChuLTEpUiAgKSAqLwotICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotICAgICAgICAgICAgeW5SICs9IHRlbXBsOwotCi0gICAgICAgICAgICAvKiB5blIrPSAoIEEwICAqIHgobilSICApICovCi0gICAgICAgICAgICB0ZW1wZCA9KiAocERhdGFJbisxKTsKLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHRlbXBkOwotICAgICAgICAgICAgeW5SICs9IHRlbXBsOwotCi0gICAgICAgICAgICAvKiB5blIrPSAoLUIyICAqIHkobi0yKVIgICkgKi8KLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XTsKLSAgICAgICAgICAgIHluUiArPSB0ZW1wbDsKLQotICAgICAgICAgICAgLyogeW5SKz0gKC1CMSAgKiB5KG4tMSlSICApICAqLwotICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOwotICAgICAgICAgICAgeW5SICs9IHRlbXBsOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSAoTFZNX0ZMT0FUKXluUjsgLyogVXBkYXRlIHkobi0xKVIgKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IChMVk1fRkxPQVQpeW5MOyAvKiBVcGRhdGUgeShuLTEpTCAqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKUwgKi8KLSAgICAgICAgICAgIHBEYXRhSW4rKzsKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlSICovCi0gICAgICAgICAgICBwRGF0YUluKys7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCl5bkw7IC8qIFdyaXRlIExlZnQgb3V0cHV0ICovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCl5blI7IC8qIFdyaXRlIFJpZ2h0IG91cHV0ICovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotCi0gICAgICAgIH0KLQotICAgIH0KLQotI2lmZGVmIFNVUFBPUlRfTUMKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEFTU1VNUFRJT05TOgotIENPRUZTLQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTIsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTEKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIEEwLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIC1CMgotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gaXMgLUIxCi0KLSBERUxBWVMtCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIHRvCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgLSAxXSBpcyB4KG4tMSkgZm9yIGFsbCBOckNoYW5uZWxzCi0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVsc10gdG8KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMipOckNoYW5uZWxzIC0gMV0gaXMgeChuLTIpIGZvciBhbGwgTnJDaGFubmVscwotCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqTnJDaGFubmVsc10gdG8KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMypOckNoYW5uZWxzIC0gMV0gaXMgeShuLTEpIGZvciBhbGwgTnJDaGFubmVscwotCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzMqTnJDaGFubmVsc10gdG8KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNCpOckNoYW5uZWxzIC0gMV0gaXMgeShuLTIpIGZvciBhbGwgTnJDaGFubmVscwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCUV9NQ19EMzJGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpCi0KLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCB5biwgdGVtcDsKLSAgICAgICAgTFZNX0lOVDE2IGlpLCBqajsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotCi0gICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgICB7Ci0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIENIQU5ORUwtV0lTRQotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgZm9yIChqaiA9IDA7IGpqIDwgTnJDaGFubmVsczsgamorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiB5bj0gKEEyICAqIHgobi0yKSkgKi8KLSAgICAgICAgICAgICAgICB5biA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyArIGpqXTsKLQotICAgICAgICAgICAgICAgIC8qIHluKz0gKEExICAqIHgobi0xKSkgKi8KLSAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal07Ci0gICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKLQotICAgICAgICAgICAgICAgIC8qIHluKz0gKEEwICAqIHgobikpICovCi0gICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOwotICAgICAgICAgICAgICAgIHluICs9IHRlbXA7Ci0KLSAgICAgICAgICAgICAgICAgLyogeW4rPSAoLUIyICAqIHkobi0yKSkgKi8KLSAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzKjMgKyBqal07Ci0gICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKLQotICAgICAgICAgICAgICAgIC8qIHluKz0gKC1CMSAgKiB5KG4tMSkpICovCi0gICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyoyICsgampdOwotICAgICAgICAgICAgICAgIHluICs9IHRlbXA7Ci0KLSAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDMgKyBqal0gPQotICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal07IC8qIHkobi0yKT15KG4tMSkqLwotICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMSArIGpqXSA9Ci0gICAgICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal07IC8qIHgobi0yKT14KG4tMSkqLwotICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMiArIGpqXSA9IChMVk1fRkxPQVQpeW47IC8qIFVwZGF0ZSB5KG4tMSkqLwotICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpKi8KLSAgICAgICAgICAgICAgICBwRGF0YUluKys7Ci0gICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKXluOyAvKiBXcml0ZSBqaiBDaGFubmVsIG91dHB1dCAqLwotICAgICAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLSNlbmRpZiAvKlNVUFBPUlRfTUMqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTJhOWUwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KLS8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLwotLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLwotLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKLXsKLSAgICBMVk1fRkxPQVQgdGVtcDsKLSAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0gICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzOwotICAgIHRlbXAgPSBwQ29lZi0+QTI7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5BMTsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkEwOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QjI7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5CMTsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdID0gdGVtcDsKLX0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBFbmQgT2YgRmlsZTogQlFfMklfRDMyRjMyQzMyX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWI2NDc0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX0JRXzJJX0QzMkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KLSNkZWZpbmUgX0JRXzJJX0QzMkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KLQotLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwotLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KLXsKLSAgTFZNX0lOVDMyICogICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGU7Ci0KLXR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Ci0KLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKLXsKLSAgICBMVk1fRkxPQVQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi19RmlsdGVyX1N0YXRlX0ZMT0FUOwotdHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKLQotI2VuZGlmIC8qIF9CUV8ySV9EMzJGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvbXBMaW1fcHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29tcExpbV9wcml2YXRlLmgKaW5kZXggMDZhMjFjMy4uOWM3YTk2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29tcExpbV9wcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29tcExpbV9wcml2YXRlLmgKQEAgLTI4LDE3ICsyOCwxNiBAQAogICAgREVGSU5JVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIEZTXzQ4SyAgICAgIDQ4MDAwCisjZGVmaW5lIEZTXzQ4SyA0ODAwMAogCi0jZGVmaW5lIElOVEVHRVJfMTYgIDB4RkZGRiAvKiAgIDY1NTM1Ki8KLSNkZWZpbmUgSU5URUdFUl8xNSAgMHg3RkZGIC8qICAgMzI3NjcqLworI2RlZmluZSBJTlRFR0VSXzE2IDB4RkZGRiAvKiAgIDY1NTM1Ki8KKyNkZWZpbmUgSU5URUdFUl8xNSAweDdGRkYgLyogICAzMjc2NyovCiAKLSNkZWZpbmUgR0FJTl82REIgICAgMQotI2RlZmluZSBHQUlOXzEyREIgICAyCi0jZGVmaW5lIEdBSU5fMThEQiAgIDMKLSNkZWZpbmUgR0FJTl8yNERCICAgNAorI2RlZmluZSBHQUlOXzZEQiAxCisjZGVmaW5lIEdBSU5fMTJEQiAyCisjZGVmaW5lIEdBSU5fMThEQiAzCisjZGVmaW5lIEdBSU5fMjREQiA0CiAKICNlbmRpZiAvKiAjaWZuZGVmIF9DT01QX0xJTV9QUklWQVRFXyAqLwogCiAvKioqIEVuZCBvZiBmaWxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmNwcAppbmRleCAzYTUwNTU0Li4xZmU3NDcwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmNwcApAQCAtMTgsMTMwICsxOCw2NSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIElOQ0xVREUgRklMRVMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gQ09QWV8xNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgQ29weV8xNiggY29uc3QgTFZNX0lOVDE2ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAotICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQotewotICAgIExWTV9JTlQxNiBpaTsKLQotICAgIGlmIChzcmMgPiBkc3QpCi0gICAgewotICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9ICpzcmM7Ci0gICAgICAgICAgICBkc3QrKzsKLSAgICAgICAgICAgIHNyYysrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNyYyArPSBuIC0gMTsKLSAgICAgICAgZHN0ICs9IG4gLSAxOwotICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9ICpzcmM7Ci0gICAgICAgICAgICBkc3QtLTsKLSAgICAgICAgICAgIHNyYy0tOwotICAgICAgICB9Ci0gICAgfQotCit2b2lkIENvcHlfRmxvYXQoY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbikgeworICAgIG1lbW1vdmUoZHN0LCBzcmMsIG4gKiBzaXplb2YoTFZNX0ZMT0FUKSk7CiAgICAgcmV0dXJuOwogfQotdm9pZCBDb3B5X0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCi0gICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCi17Ci0gICAgTFZNX0lOVDE2IGlpOwotCi0gICAgaWYgKHNyYyA+IGRzdCkKLSAgICB7Ci0gICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gKnNyYzsKLSAgICAgICAgICAgIGRzdCsrOwotICAgICAgICAgICAgc3JjKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc3JjICs9IG4gLSAxOwotICAgICAgICBkc3QgKz0gbiAtIDE7Ci0gICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gKnNyYzsKLSAgICAgICAgICAgIGRzdC0tOwotICAgICAgICAgICAgc3JjLS07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0jaWZkZWYgU1VQUE9SVF9NQwogLy8gRXh0cmFjdCBvdXQgdGhlIHN0ZXJlbyBjaGFubmVsIHBhaXIgZnJvbSBtdWx0aWNoYW5uZWwgc291cmNlLgotdm9pZCBDb3B5X0Zsb2F0X01jX1N0ZXJlbyhjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCi0gICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywgLyogTnVtYmVyIG9mIGZyYW1lcyAqLwotICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgTnJDaGFubmVscykKLXsKK3ZvaWQgQ29weV9GbG9hdF9NY19TdGVyZW8oY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsIC8qIE51bWJlciBvZiBmcmFtZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpIHsKICAgICBMVk1fSU5UMTYgaWk7CiAKLSAgICBpZiAoTnJDaGFubmVscyA+PSAyKQotICAgIHsKLSAgICAgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7CisgICAgaWYgKE5yQ2hhbm5lbHMgPj0gMikgeworICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pIHsKICAgICAgICAgICAgIGRzdFswXSA9IHNyY1swXTsKICAgICAgICAgICAgIGRzdFsxXSA9IHNyY1sxXTsKICAgICAgICAgICAgIGRzdCArPSAyOwogICAgICAgICAgICAgc3JjICs9IE5yQ2hhbm5lbHM7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoTnJDaGFubmVscyA9PSAxKQotICAgIHsgICAvLyBub3QgZXhwZWN0ZWQgdG8gb2NjdXIsIHByb3ZpZGVkIGZvciBjb21wbGV0ZW5lc3MuCisgICAgfSBlbHNlIGlmIChOckNoYW5uZWxzID09IDEpIHsgIC8vIG5vdCBleHBlY3RlZCB0byBvY2N1ciwgcHJvdmlkZWQgZm9yIGNvbXBsZXRlbmVzcy4KICAgICAgICAgc3JjICs9IChOckZyYW1lcyAtIDEpOwogICAgICAgICBkc3QgKz0gMiAqIChOckZyYW1lcyAtIDEpOwotICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgIHsKKyAgICAgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgICAgICBkc3RbMF0gPSBzcmNbMF07CiAgICAgICAgICAgICBkc3RbMV0gPSBzcmNbMF07CiAgICAgICAgICAgICBkc3QgLT0gMjsKLSAgICAgICAgICAgIHNyYyAtLTsKKyAgICAgICAgICAgIHNyYy0tOwogICAgICAgICB9CiAgICAgfQogfQogCiAvLyBNZXJnZSBhIG11bHRpY2hhbm5lbCBzb3VyY2Ugd2l0aCBzdGVyZW8gY29udGFpbmVkIGluIFN0ZXJlb091dCwgdG8gZHN0Lgotdm9pZCBDb3B5X0Zsb2F0X1N0ZXJlb19NYyhjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpTdGVyZW9PdXQsCi0gICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsIC8qIE51bWJlciBvZiBmcmFtZXMqLwotICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgTnJDaGFubmVscykKLXsKK3ZvaWQgQ29weV9GbG9hdF9TdGVyZW9fTWMoY29uc3QgTFZNX0ZMT0FUKiBzcmMsIGNvbnN0IExWTV9GTE9BVCogU3RlcmVvT3V0LCBMVk1fRkxPQVQqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLCAvKiBOdW1iZXIgb2YgZnJhbWVzKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpIHsKICAgICBMVk1fSU5UMTYgaWksIGpqOwogCi0gICAgLy8gcGFjayBkc3Qgd2l0aCBzdGVyZW8gaW5mb3JtYXRpb24gb2YgU3RlcmVvT3V0Ci0gICAgLy8gdG9nZXRoZXIgd2l0aCB0aGUgdXBwZXIgY2hhbm5lbHMgb2Ygc3JjLgotICAgIFN0ZXJlb091dCArPSAyICogKE5yRnJhbWVzIC0gMSk7Ci0gICAgZHN0ICs9IE5yQ2hhbm5lbHMgKiAoTnJGcmFtZXMgLSAxKTsKLSAgICBzcmMgKz0gTnJDaGFubmVscyAqIChOckZyYW1lcyAtIDEpOwotICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIGRzdFsxXSA9IFN0ZXJlb091dFsxXTsKLSAgICAgICAgZHN0WzBdID0gU3RlcmVvT3V0WzBdOyAvLyBjb3B5IDEgYmVmb3JlIDAgaXMgcmVxdWlyZWQgZm9yIE5yQ2hhbm5lbHMgPT0gMy4KLSAgICAgICAgZm9yIChqaiA9IDI7IGpqIDwgTnJDaGFubmVsczsgamorKykKLSAgICAgICAgewotICAgICAgICAgICAgZHN0W2pqXSA9IHNyY1tqal07CisgICAgaWYgKE5yQ2hhbm5lbHMgPj0gRkNDXzIpIHsKKyAgICAgICAgLy8gcGFjayBkc3Qgd2l0aCBzdGVyZW8gaW5mb3JtYXRpb24gb2YgU3RlcmVvT3V0CisgICAgICAgIC8vIHRvZ2V0aGVyIHdpdGggdGhlIHVwcGVyIGNoYW5uZWxzIG9mIHNyYy4KKyAgICAgICAgU3RlcmVvT3V0ICs9IDIgKiAoTnJGcmFtZXMgLSAxKTsKKyAgICAgICAgZHN0ICs9IE5yQ2hhbm5lbHMgKiAoTnJGcmFtZXMgLSAxKTsKKyAgICAgICAgc3JjICs9IE5yQ2hhbm5lbHMgKiAoTnJGcmFtZXMgLSAxKTsKKworICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgIGRzdFsxXSA9IFN0ZXJlb091dFsxXTsKKyAgICAgICAgICAgIGRzdFswXSA9IFN0ZXJlb091dFswXTsgIC8vIGNvcHkgMSBiZWZvcmUgMCBpcyByZXF1aXJlZCBmb3IgTnJDaGFubmVscyA9PSAzLgorICAgICAgICAgICAgZm9yIChqaiA9IEZDQ18yOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspIHsKKyAgICAgICAgICAgICAgICBkc3RbampdID0gc3JjW2pqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdCAtPSBOckNoYW5uZWxzOworICAgICAgICAgICAgc3JjIC09IE5yQ2hhbm5lbHM7CisgICAgICAgICAgICBTdGVyZW9PdXQgLT0gMjsKICAgICAgICAgfQotICAgICAgICBkc3QgICAgLT0gTnJDaGFubmVsczsKLSAgICAgICAgc3JjICAgIC09IE5yQ2hhbm5lbHM7Ci0gICAgICAgIFN0ZXJlb091dCAtPSAyOworICAgIH0gZWxzZSB7CisgICAgICAgIENvcHlfRmxvYXQoKGNvbnN0IExWTV9GTE9BVCopU3RlcmVvT3V0LCAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKilkc3QsICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcyk7ICAgICAgICAvKiBOdW1iZXIgb2YgZnJhbWVzICovCiAgICAgfQogfQotI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQuY3BwCmluZGV4IDVlNzczMzUuLjJjMjA2MWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmNwcApAQCAtMjUsMTMgKzI1LDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBDT1JFX01JWEhBUkRfMlNUX0QzMkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQoICAgTWl4XzJTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCi17Ci0gICAgTFZNX0ZMT0FUICBUZW1wMSxUZW1wMixUZW1wMzsKK3ZvaWQgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKE1peF8yU3RfQ2xsX0ZMT0FUX3QqIHBJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUKiBzcmMyLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKKyAgICBMVk1fRkxPQVQgVGVtcDEsIFRlbXAyLCBUZW1wMzsKICAgICBMVk1fSU5UMTYgaWk7CiAgICAgTFZNX0ZMT0FUIEN1cnJlbnQxU2hvcnQ7CiAgICAgTFZNX0ZMT0FUIEN1cnJlbnQyU2hvcnQ7CkBAIC0zOSw3ICszNSw3IEBACiAgICAgQ3VycmVudDFTaG9ydCA9IChwSW5zdGFuY2UtPkN1cnJlbnQxKTsKICAgICBDdXJyZW50MlNob3J0ID0gKHBJbnN0YW5jZS0+Q3VycmVudDIpOwogCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0peworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgIFRlbXAxID0gKnNyYzErKzsKICAgICAgICAgVGVtcDMgPSBUZW1wMSAqIEN1cnJlbnQxU2hvcnQ7CiAgICAgICAgIFRlbXAyID0gKnNyYzIrKzsKQEAgLTQ3LDExICs0MywxMSBAQAogICAgICAgICBUZW1wMiA9IChUZW1wMSAvIDIuMGYpICsgKFRlbXAzIC8gMi4wZik7CiAgICAgICAgIGlmIChUZW1wMiA+IDAuNWYpCiAgICAgICAgICAgICBUZW1wMiA9IDEuMGY7Ci0gICAgICAgIGVsc2UgaWYgKFRlbXAyIDwgLTAuNWYgKQorICAgICAgICBlbHNlIGlmIChUZW1wMiA8IC0wLjVmKQogICAgICAgICAgICAgVGVtcDIgPSAtMS4wZjsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgVGVtcDIgPSAoVGVtcDIgKiAyKTsKLSAgICAgICAgICAgICpkc3QrKyA9IFRlbXAyOworICAgICAgICAqZHN0KysgPSBUZW1wMjsKICAgICB9CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVC5jcHAKaW5kZXggOGY1YzBhZS4uYjdmNGI1NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVC5jcHAKQEAgLTE4LDcyICsxOCw1NCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIElOQ0xVREUgRklMRVMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiAjaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgogI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBDT1JFX01JWFNPRlRfMVNUX0QzMkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoICAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCi17Ci0gICAgTFZNX0ZMT0FUICAgIFRlbXAxLFRlbXAyLFRlbXAzOwotICAgIExWTV9JTlQxNiAgICAgT3V0TG9vcDsKLSAgICBMVk1fSU5UMTYgICAgIEluTG9vcDsKLSAgICBMVk1fRkxPQVQgICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYTsKLSAgICBMVk1fRkxPQVQgICAgQ3VycmVudFRpbWVzQWxwaGE7Ci0gICAgTFZNX0lOVDE2ICAgICBpaSxqajsKK3ZvaWQgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVChNaXhfMVN0X0NsbF9GTE9BVF90KiBwSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikgeworICAgIExWTV9GTE9BVCBUZW1wMSwgVGVtcDIsIFRlbXAzOworICAgIExWTV9JTlQxNiBPdXRMb29wOworICAgIExWTV9JTlQxNiBJbkxvb3A7CisgICAgTFZNX0ZMT0FUIFRhcmdldFRpbWVzT25lTWluQWxwaGE7CisgICAgTFZNX0ZMT0FUIEN1cnJlbnRUaW1lc0FscGhhOworICAgIExWTV9JTlQxNiBpaSwgamo7CiAKICAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShuID4+IDIpOyAvKiBQcm9jZXNzIHBlciA0IHNhbXBsZXMgKi8KICAgICBPdXRMb29wID0gKExWTV9JTlQxNikobiAtIChJbkxvb3AgPDwgMikpOwogCi0gICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSA9ICgoMS4wZiAtcEluc3RhbmNlLT5BbHBoYSkgKiBwSW5zdGFuY2UtPlRhcmdldCk7Ci0gICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ID49IHBJbnN0YW5jZS0+Q3VycmVudCl7Ci0gICAgICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgKz0oTFZNX0ZMT0FUKSgyLjBmIC8gMjE0NzQ4MzY0Ny4wZik7IC8qIENlaWwqLworICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgPSAoKDEuMGYgLSBwSW5zdGFuY2UtPkFscGhhKSAqIHBJbnN0YW5jZS0+VGFyZ2V0KTsKKyAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPj0gcEluc3RhbmNlLT5DdXJyZW50KSB7CisgICAgICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgKz0gKExWTV9GTE9BVCkoMi4wZiAvIDIxNDc0ODM2NDcuMGYpOyAvKiBDZWlsKi8KICAgICB9CiAKLSAgICBpZiAoT3V0TG9vcCl7Ci0KKyAgICBpZiAoT3V0TG9vcCkgewogICAgICAgICBDdXJyZW50VGltZXNBbHBoYSA9IHBJbnN0YW5jZS0+Q3VycmVudCAqIHBJbnN0YW5jZS0+QWxwaGE7CiAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IFRhcmdldFRpbWVzT25lTWluQWxwaGEgKyBDdXJyZW50VGltZXNBbHBoYTsKIAotICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7Ci0gICAgICAgIFRlbXAxID0gKnNyYysrOwotICAgICAgICBUZW1wMiA9ICpkc3Q7Ci0KLSAgICAgICAgVGVtcDMgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOwotICAgICAgICBUZW1wMSA9IFRlbXAyICsgVGVtcDM7Ci0KLSAgICAgICAgaWYgKFRlbXAxID4gMS4wZikKLSAgICAgICAgICAgIFRlbXAxID0gMS4wZjsKLSAgICAgICAgZWxzZSBpZiAoVGVtcDEgPCAtMS4wZikKLSAgICAgICAgICAgIFRlbXAxID0gLTEuMGY7Ci0KLSAgICAgICAgKmRzdCsrID0gVGVtcDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKLQotICAgICAgICBDdXJyZW50VGltZXNBbHBoYSA9IHBJbnN0YW5jZS0+Q3VycmVudCAqIHBJbnN0YW5jZS0+QWxwaGE7Ci0gICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IFRhcmdldFRpbWVzT25lTWluQWxwaGEgKyBDdXJyZW50VGltZXNBbHBoYTsKLQotICAgICAgICBmb3IgKGpqID0gNDsgamohPTAgOyBqai0tKXsKKyAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pIHsKICAgICAgICAgICAgIFRlbXAxID0gKnNyYysrOwogICAgICAgICAgICAgVGVtcDIgPSAqZHN0OwogCiAgICAgICAgICAgICBUZW1wMyA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7Ci0gICAgICAgICAgICBUZW1wMSA9IFRlbXAyICsgVGVtcDM7CisgICAgICAgICAgICAqZHN0KysgPSBMVk1fQ2xhbXAoVGVtcDIgKyBUZW1wMyk7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgICAgIGlmIChUZW1wMSA+IDEuMGYpCi0gICAgICAgICAgICAgICAgVGVtcDEgPSAxLjBmOwotICAgICAgICAgICAgZWxzZSBpZiAoVGVtcDEgPCAtMS4wZikKLSAgICAgICAgICAgICAgICBUZW1wMSA9IC0xLjBmOwotICAgICAgICAgICAgKmRzdCsrID0gVGVtcDE7CisgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICBDdXJyZW50VGltZXNBbHBoYSA9IHBJbnN0YW5jZS0+Q3VycmVudCAqIHBJbnN0YW5jZS0+QWxwaGE7CisgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IFRhcmdldFRpbWVzT25lTWluQWxwaGEgKyBDdXJyZW50VGltZXNBbHBoYTsKKworICAgICAgICBmb3IgKGpqID0gNDsgamogIT0gMDsgamotLSkgeworICAgICAgICAgICAgVGVtcDEgPSAqc3JjKys7CisgICAgICAgICAgICBUZW1wMiA9ICpkc3Q7CisKKyAgICAgICAgICAgIFRlbXAzID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgICAgICpkc3QrKyA9IExWTV9DbGFtcChUZW1wMiArIFRlbXAzKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEuY3BwCmluZGV4IDZmZjc4NTMuLjYxYTQ3NTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmNwcApAQCAtMjUsMTIgKzI1LDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBDT1JFX01JWFNPRlRfMVNUX0QzMkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQotewotICAgIExWTV9GTE9BVCBUZW1wMSxUZW1wMjsKK3ZvaWQgQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKE1peF8xU3RfQ2xsX0ZMT0FUX3QqIHBJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKKyAgICBMVk1fRkxPQVQgVGVtcDEsIFRlbXAyOwogICAgIExWTV9JTlQxNiBPdXRMb29wOwogICAgIExWTV9JTlQxNiBJbkxvb3A7CiAgICAgTFZNX0ZMT0FUIFRhcmdldFRpbWVzT25lTWluQWxwaGE7CkBAIC00MSwxOSArMzgsMTcgQEAKICAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShuID4+IDIpOyAvKiBQcm9jZXNzIHBlciA0IHNhbXBsZXMgKi8KICAgICBPdXRMb29wID0gKExWTV9JTlQxNikobiAtIChJbkxvb3AgPDwgMikpOwogCi0gICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSA9ICgxLjBmIC0gcEluc3RhbmNlLT5BbHBoYSkgKiBwSW5zdGFuY2UtPlRhcmdldDsgLyogZmxvYXQgKiBmbG9hdCBpbiBmbG9hdCAqLwotICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA+PSBwSW5zdGFuY2UtPkN1cnJlbnQpCi0gICAgeworICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgPQorICAgICAgICAgICAgKDEuMGYgLSBwSW5zdGFuY2UtPkFscGhhKSAqIHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBmbG9hdCAqIGZsb2F0IGluIGZsb2F0ICovCisgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ID49IHBJbnN0YW5jZS0+Q3VycmVudCkgewogICAgICAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhICs9IChMVk1fRkxPQVQpKDIuMGYgLyAyMTQ3NDgzNjQ3LjBmKTsgLyogQ2VpbCovCiAgICAgfQogCi0gICAgaWYgKE91dExvb3AgIT0gMCkKLSAgICB7CisgICAgaWYgKE91dExvb3AgIT0gMCkgewogICAgICAgICBDdXJyZW50VGltZXNBbHBoYSA9IChwSW5zdGFuY2UtPkN1cnJlbnQgKiBwSW5zdGFuY2UtPkFscGhhKTsKICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOwogCi0gICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7CisgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgICAgICBUZW1wMSA9ICpzcmM7CiAgICAgICAgICAgICBzcmMrKzsKIApAQCAtNjMsMzcgKzU4LDM2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKKyAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgIEN1cnJlbnRUaW1lc0FscGhhID0gcEluc3RhbmNlLT5DdXJyZW50ICogcEluc3RhbmNlLT5BbHBoYTsKICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOwogCi0gICAgICAgICAgICBUZW1wMSA9ICpzcmM7Ci0gICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgVGVtcDEgPSAqc3JjOworICAgICAgICBzcmMrKzsKIAotICAgICAgICAgICAgVGVtcDIgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOwotICAgICAgICAgICAgKmRzdCA9IFRlbXAyOwotICAgICAgICAgICAgZHN0Kys7CisgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgKmRzdCA9IFRlbXAyOworICAgICAgICBkc3QrKzsKIAotICAgICAgICAgICAgVGVtcDEgPSAqc3JjOwotICAgICAgICAgICAgc3JjKys7CisgICAgICAgIFRlbXAxID0gKnNyYzsKKyAgICAgICAgc3JjKys7CiAKLSAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKLSAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKLSAgICAgICAgICAgIGRzdCsrOworICAgICAgICBUZW1wMiA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgICpkc3QgPSBUZW1wMjsKKyAgICAgICAgZHN0Kys7CiAKLSAgICAgICAgICAgIFRlbXAxID0gKnNyYzsKLSAgICAgICAgICAgIHNyYysrOworICAgICAgICBUZW1wMSA9ICpzcmM7CisgICAgICAgIHNyYysrOwogCi0gICAgICAgICAgICBUZW1wMiA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7Ci0gICAgICAgICAgICAqZHN0ID0gVGVtcDI7Ci0gICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgVGVtcDIgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOworICAgICAgICAqZHN0ID0gVGVtcDI7CisgICAgICAgIGRzdCsrOwogCi0gICAgICAgICAgICBUZW1wMSA9ICpzcmM7Ci0gICAgICAgICAgICBzcmMrKzsKLSAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKLSAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKLSAgICAgICAgICAgIGRzdCsrOworICAgICAgICBUZW1wMSA9ICpzcmM7CisgICAgICAgIHNyYysrOworICAgICAgICBUZW1wMiA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgICpkc3QgPSBUZW1wMjsKKyAgICAgICAgZHN0Kys7CiAgICAgfQogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jcHAKaW5kZXggYTdjZTRkMy4uNmU4NTlmNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmNwcApAQCAtMTQsNTQgKzE0LDEwIEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotCiAjaW5jbHVkZSAiQklRVUFELmgiCiAjaW5jbHVkZSAiRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLXZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCBMZWZ0REMsUmlnaHREQzsKLSAgICAgICAgTFZNX0ZMT0FUIERpZmY7Ci0gICAgICAgIExWTV9JTlQzMiBqOwotICAgICAgICBQRmlsdGVyX0ZMT0FUX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0ZMT0FUX1N0YXRlKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgTGVmdERDID0gcEJpcXVhZFN0YXRlLT5MZWZ0REM7Ci0gICAgICAgIFJpZ2h0REMgPSBwQmlxdWFkU3RhdGUtPlJpZ2h0REM7Ci0gICAgICAgIGZvcihqID0gTnJTYW1wbGVzLTE7IGogPj0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbmQgc2F0dXJhdGUgKi8KLSAgICAgICAgICAgIERpZmYgPSogKHBEYXRhSW4rKykgLSAoTGVmdERDKTsKLSAgICAgICAgICAgIGlmIChEaWZmID4gMS4wZikgewotICAgICAgICAgICAgICAgIERpZmYgPSAxLjBmOyB9Ci0gICAgICAgICAgICBlbHNlIGlmIChEaWZmIDwgLTEuMGYpIHsKLSAgICAgICAgICAgICAgICBEaWZmID0gLTEuMGY7IH0KLSAgICAgICAgICAgICoocERhdGFPdXQrKykgPSAoTFZNX0ZMT0FUKURpZmY7Ci0gICAgICAgICAgICBpZiAoRGlmZiA8IDApIHsKLSAgICAgICAgICAgICAgICBMZWZ0REMgLT0gRENfRkxPQVRfU1RFUDsgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgTGVmdERDICs9IERDX0ZMT0FUX1NURVA7IH0KLQotICAgICAgICAgICAgLyogU3VidHJhY3QgREMgYW4gc2F0dXJhdGUgKi8KLSAgICAgICAgICAgIERpZmYgPSogKHBEYXRhSW4rKykgLSAoUmlnaHREQyk7Ci0gICAgICAgICAgICBpZiAoRGlmZiA+IDEuMGYpIHsKLSAgICAgICAgICAgICAgICBEaWZmID0gMS4wZjsgfQotICAgICAgICAgICAgZWxzZSBpZiAoRGlmZiA8IC0xLjBmKSB7Ci0gICAgICAgICAgICAgICAgRGlmZiA9IC0xLjBmOyB9Ci0gICAgICAgICAgICAqKHBEYXRhT3V0KyspID0gKExWTV9GTE9BVClEaWZmOwotICAgICAgICAgICAgaWYgKERpZmYgPCAwKSB7Ci0gICAgICAgICAgICAgICAgUmlnaHREQyAtPSBEQ19GTE9BVF9TVEVQOyB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBSaWdodERDICs9IERDX0ZMT0FUX1NURVA7IH0KLQotICAgICAgICB9Ci0gICAgICAgIHBCaXF1YWRTdGF0ZS0+TGVmdERDID0gTGVmdERDOwotICAgICAgICBwQmlxdWFkU3RhdGUtPlJpZ2h0REMgPSBSaWdodERDOwotCi0gICAgfQotI2lmZGVmIFNVUFBPUlRfTUMKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCiAvKgogICogRlVOQ1RJT046ICAgICAgIERDX01jX0QxNl9UUkNfV1JBXzAxCiAgKgpAQCAtNzksMzcgKzM1LDI1IEBACiAgKiAgdm9pZAogICoKICAqLwotdm9pZCBEQ19NY19EMTZfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVscykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAqQ2hEQzsKLSAgICAgICAgTFZNX0ZMT0FUIERpZmY7Ci0gICAgICAgIExWTV9JTlQzMiBqOwotICAgICAgICBMVk1fSU5UMzIgaTsKLSAgICAgICAgUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYyBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYykgcEluc3RhbmNlOwordm9pZCBEQ19NY19EMTZfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fRkxPQVQqIHBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcERhdGFPdXQsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpIHsKKyAgICBMVk1fRkxPQVQqIENoREM7CisgICAgTFZNX0ZMT0FUIERpZmY7CisgICAgTFZNX0lOVDMyIGo7CisgICAgTFZNX0lOVDMyIGk7CisgICAgUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYyBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYylwSW5zdGFuY2U7CiAKLSAgICAgICAgQ2hEQyA9ICZwQmlxdWFkU3RhdGUtPkNoRENbMF07Ci0gICAgICAgIGZvciAoaiA9IE5yRnJhbWVzIC0gMTsgaiA+PSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFN1YnRyYWN0IERDIGFuZCBzYXR1cmF0ZSAqLwotICAgICAgICAgICAgZm9yIChpID0gTnJDaGFubmVscyAtIDE7IGkgPj0gMDsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERpZmYgPSAqKHBEYXRhSW4rKykgLSAoQ2hEQ1tpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKERpZmYgPiAxLjBmKSB7Ci0gICAgICAgICAgICAgICAgICAgIERpZmYgPSAxLjBmOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRGlmZiA8IC0xLjBmKSB7Ci0gICAgICAgICAgICAgICAgICAgIERpZmYgPSAtMS4wZjsgfQotICAgICAgICAgICAgICAgICoocERhdGFPdXQrKykgPSAoTFZNX0ZMT0FUKURpZmY7Ci0gICAgICAgICAgICAgICAgaWYgKERpZmYgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIENoRENbaV0gLT0gRENfRkxPQVRfU1RFUDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBDaERDW2ldICs9IERDX0ZMT0FUX1NURVA7IH0KKyAgICBDaERDID0gJnBCaXF1YWRTdGF0ZS0+Q2hEQ1swXTsKKyAgICBmb3IgKGogPSBOckZyYW1lcyAtIDE7IGogPj0gMDsgai0tKSB7CisgICAgICAgIC8qIFN1YnRyYWN0IERDIGFuZCBzYXR1cmF0ZSAqLworICAgICAgICBmb3IgKGkgPSBOckNoYW5uZWxzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIERpZmYgPSAqKHBEYXRhSW4rKykgLSAoQ2hEQ1tpXSk7CisgICAgICAgICAgICAqKHBEYXRhT3V0KyspID0gTFZNX0NsYW1wKERpZmYpOworICAgICAgICAgICAgaWYgKERpZmYgPCAwKSB7CisgICAgICAgICAgICAgICAgQ2hEQ1tpXSAtPSBEQ19GTE9BVF9TVEVQOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDaERDW2ldICs9IERDX0ZMT0FUX1NURVA7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgfQotCiAgICAgfQotI2VuZGlmCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuY3BwCmluZGV4IGJlZWUxMTIuLmMxNjcxOGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuY3BwCkBAIC0xNywyMCArMTcsMTAgQEAKIAogI2luY2x1ZGUgIkJJUVVBRC5oIgogI2luY2x1ZGUgIkRDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLXZvaWQgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAqcEluc3RhbmNlKQotewotICAgIFBGaWx0ZXJfRkxPQVRfU3RhdGUgcEJpcXVhZFN0YXRlICA9IChQRmlsdGVyX0ZMT0FUX1N0YXRlKSBwSW5zdGFuY2U7Ci0gICAgcEJpcXVhZFN0YXRlLT5MZWZ0REMgICAgICAgID0gMC4wZjsKLSAgICBwQmlxdWFkU3RhdGUtPlJpZ2h0REMgICAgICAgPSAwLjBmOwotfQotI2lmZGVmIFNVUFBPUlRfTUMKLXZvaWQgIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAqcEluc3RhbmNlKQotewotICAgIFBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMgcEJpcXVhZFN0YXRlICA9IChQRmlsdGVyX0ZMT0FUX1N0YXRlX01jKSBwSW5zdGFuY2U7Cit2b2lkIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBJbnN0YW5jZSkgeworICAgIFBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMpcEluc3RhbmNlOwogICAgIExWTV9JTlQzMiBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBMVk1fTUFYX0NIQU5ORUxTOyBpKyspCi0gICAgeworICAgIGZvciAoaSA9IDA7IGkgPCBMVk1fTUFYX0NIQU5ORUxTOyBpKyspIHsKICAgICAgICAgcEJpcXVhZFN0YXRlLT5DaERDW2ldID0gMC4wZjsKICAgICB9CiB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA2NTA4YjczLi44ZjQ1OWQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0xOCwyMSArMTgsMTcgQEAKICNpZm5kZWYgX0RDXzJJX0QxNl9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KICNkZWZpbmUgX0RDXzJJX0QxNl9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KIAotI2RlZmluZSBEQ19GTE9BVF9TVEVQICAgMC4wMDAwMDAyMzg0ZjsKKyNkZWZpbmUgRENfRkxPQVRfU1RFUCAwLjAwMDAwMDIzODRmCiAKIC8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KIC8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiovCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX0ZMT0FUX1N0YXRlXwotewotICAgIExWTV9GTE9BVCAgTGVmdERDOyAgICAgLyogTGVmdERDICAqLwotICAgIExWTV9GTE9BVCAgUmlnaHREQzsgICAgLyogUmlnaHREQyAgKi8KLX1GaWx0ZXJfRkxPQVRfU3RhdGU7Ci10eXBlZGVmIEZpbHRlcl9GTE9BVF9TdGF0ZSAqIFBGaWx0ZXJfRkxPQVRfU3RhdGUgOwotI2lmZGVmIFNVUFBPUlRfTUMKLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfRkxPQVRfU3RhdGVfTWNfCi17Ci0gICAgTFZNX0ZMT0FUICBDaERDW0xWTV9NQVhfQ0hBTk5FTFNdOyAgICAgLyogQ2hhbm5lbERDICAqLwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9GTE9BVF9TdGF0ZV8geworICAgIExWTV9GTE9BVCBMZWZ0REM7ICAvKiBMZWZ0REMgICovCisgICAgTFZNX0ZMT0FUIFJpZ2h0REM7IC8qIFJpZ2h0REMgICovCit9IEZpbHRlcl9GTE9BVF9TdGF0ZTsKK3R5cGVkZWYgRmlsdGVyX0ZMT0FUX1N0YXRlKiBQRmlsdGVyX0ZMT0FUX1N0YXRlOwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9GTE9BVF9TdGF0ZV9NY18geworICAgIExWTV9GTE9BVCBDaERDW0xWTV9NQVhfQ0hBTk5FTFNdOyAvKiBDaGFubmVsREMgICovCiB9IEZpbHRlcl9GTE9BVF9TdGF0ZV9NYzsKLXR5cGVkZWYgRmlsdGVyX0ZMT0FUX1N0YXRlX01jICogUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYyA7Ci0jZW5kaWYKK3R5cGVkZWYgRmlsdGVyX0ZMT0FUX1N0YXRlX01jKiBQRmlsdGVyX0ZMT0FUX1N0YXRlX01jOwogI2VuZGlmIC8qIF9EQ18ySV9EMTZfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MWZhZTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlBbGxQYXNzX1NhdF8zMngxNlRvMzIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBJTkNMVURFIEZJTEVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgotI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLSNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBEZWxheUFsbFBhc3NfMzJ4MzIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIERlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyKCAgTFZNX0lOVDMyICAqZGVsYXksICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IHNpemUsICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IHNpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgY29lZmYsICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbCBwYXNzIGZpbHRlciBjb2VmZmljaWVudCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgRGVsYXlPZmZzZXQsICAgICAgICAgICAgICAgLyogU2ltcGxlIGRlbGF5IG9mZnNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgKnBBbGxQYXNzT2Zmc2V0LCAgICAgICAgICAgLyogQWxsIHBhc3MgZmlsdGVyIGRlbGF5IG9mZnNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgIHNhbXBsZXMgKi8KLXsKLSAgICBMVk1fSU5UMTYgICBpOwotICAgIExWTV9VSU5UMTYgICBBbGxQYXNzT2Zmc2V0ID0gKnBBbGxQYXNzT2Zmc2V0OwotICAgIExWTV9JTlQzMiAgICB0ZW1wOwotICAgIExWTV9JTlQzMiAgICBhLGIsYzsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCi0gICAgewotCi0gICAgICAgIE1VTDMyeDE2SU5UTzMyKGRlbGF5W0FsbFBhc3NPZmZzZXRdLCBjb2VmZiwgdGVtcCwgMTUpCi0gICAgICAgIGEgPSB0ZW1wOwotICAgICAgICBiID0gZGVsYXlbRGVsYXlPZmZzZXRdOwotICAgICAgICBEZWxheU9mZnNldCsrOwotCi0gICAgICAgIGMgPSBhICsgYjsKLSAgICAgICAgaWYgKCgoKGMgXiBhKSAmIChjIF4gYikpID4+IDMxKSAhPSAwKSAgLyogb3ZlcmZsb3cgLyB1bmRlcmZsb3cgKi8KLSAgICAgICAgewotICAgICAgICAgICAgaWYoYSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYyA9IDB4ODAwMDAwMDBMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGMgPSAweDdGRkZGRkZGTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAqZHN0ID0gYzsKLSAgICAgICAgZHN0Kys7Ci0KLSAgICAgICAgTVVMMzJ4MTZJTlRPMzIoYywgLWNvZWZmLCB0ZW1wLCAxNSkKLSAgICAgICAgYSA9IHRlbXA7Ci0gICAgICAgIGIgPSBkZWxheVtBbGxQYXNzT2Zmc2V0XTsKLSAgICAgICAgYyA9IGEgKyBiOwotICAgICAgICBpZiAoKCgoYyBeIGEpICYgKGMgXiBiKSkgPj4gMzEpIT0wKSAgLyogb3ZlcmZsb3cgLyB1bmRlcmZsb3cgKi8KLSAgICAgICAgewotICAgICAgICAgICAgaWYoYSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYyA9IDB4ODAwMDAwMDBMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGMgPSAweDdGRkZGRkZGTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZWxheVtBbGxQYXNzT2Zmc2V0XSA9IGM7Ci0gICAgICAgIEFsbFBhc3NPZmZzZXQrKzsKLQotICAgICAgICAvKiBNYWtlIHRoZSBkZWxheSBidWZmZXIgYSBjaXJjdWxhciBidWZmZXIgKi8KLSAgICAgICAgaWYgKERlbGF5T2Zmc2V0ID49IHNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERlbGF5T2Zmc2V0ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChBbGxQYXNzT2Zmc2V0ID49IHNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFsbFBhc3NPZmZzZXQgPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogVXBkYXRlIHRoZSBvZmZzZXQgKi8KLSAgICAqcEFsbFBhc3NPZmZzZXQgPSBBbGxQYXNzT2Zmc2V0OwotCi0gICAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlNaXhfMTZ4MTYuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlNaXhfMTZ4MTYuY3BwCmluZGV4IDUyZDI2M2YuLmEzNDY2MzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jcHAKQEAgLTIxLDQ1ICsyMSw1NSBAQAogCiAjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gRGVsYXlNaXhfMTZ4MTYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIERlbGF5TWl4XzE2eDE2KGNvbnN0IExWTV9JTlQxNiAqc3JjLCAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkZWxheSwgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNpemUsICAgICAgICAgICAvKiBEZWxheSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LCAgICAgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqcE9mZnNldCwgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCit2b2lkIERlbGF5TWl4X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjLCAvKiBTb3VyY2UgMSwgdG8gYmUgZGVsYXllZCAqLworICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRlbGF5LCAgICAgLyogRGVsYXkgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBzaXplLCAgICAgICAvKiBEZWxheSBzaXplICovCisgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCAgICAgICAvKiBTb3VyY2UvZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2KiBwT2Zmc2V0LCAgIC8qIERlbGF5IG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiwgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpIC8qIE51bWJlciBvZiBjaGFubmVscyAqLwogewotICAgIExWTV9JTlQxNiAgIGk7Ci0gICAgTFZNX0lOVDE2ICAgT2Zmc2V0ICA9ICpwT2Zmc2V0OwotICAgIExWTV9JTlQxNiAgIHRlbXA7CisgICAgTFZNX0lOVDE2IGk7CisgICAgTFZNX0lOVDE2IE9mZnNldCA9ICpwT2Zmc2V0OworICAgIExWTV9GTE9BVCB0ZW1wOwogCi0gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKLSAgICB7Ci0gICAgICAgIC8qIExlZnQgY2hhbm5lbCAqLwotICAgICAgICB0ZW1wID0gKExWTV9JTlQxNikoKExWTV9VSU5UMzIpKChMVk1fSU5UMzIpKCpkc3QpICsgKExWTV9JTlQzMilkZWxheVtPZmZzZXRdKSA+PiAxKTsKLSAgICAgICAgKmRzdCA9IHRlbXA7Ci0gICAgICAgIGRzdCsrOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaWYgKE5yQ2hhbm5lbHMgPT0gRkNDXzEpIHsKKyAgICAgICAgICAgIHRlbXAgPSAoTFZNX0ZMT0FUKSgqZHN0ICsgKExWTV9GTE9BVClkZWxheVtPZmZzZXRdKSAvIDIuMGY7CisgICAgICAgICAgICAqZHN0ID0gdGVtcDsKKyAgICAgICAgICAgIGRzdCsrOwogCi0gICAgICAgIGRlbGF5W09mZnNldF0gPSAqc3JjOwotICAgICAgICBPZmZzZXQrKzsKLSAgICAgICAgc3JjKys7CisgICAgICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKKyAgICAgICAgICAgIE9mZnNldCsrOworICAgICAgICAgICAgc3JjKys7CiAKLSAgICAgICAgLyogUmlnaHQgY2hhbm5lbCAqLwotICAgICAgICB0ZW1wID0gKExWTV9JTlQxNikoKExWTV9VSU5UMzIpKChMVk1fSU5UMzIpKCpkc3QpIC0gKExWTV9JTlQzMilkZWxheVtPZmZzZXRdKSA+PiAxKTsKLSAgICAgICAgKmRzdCA9IHRlbXA7Ci0gICAgICAgIGRzdCsrOworICAgICAgICAgICAgLyogTWFrZSB0aGUgcmV2ZXJiIGRlbGF5IGJ1ZmZlciBhIGNpcmN1bGFyIGJ1ZmZlciAqLworICAgICAgICAgICAgaWYgKE9mZnNldCA+PSBzaXplKSB7CisgICAgICAgICAgICAgICAgT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIExlZnQgY2hhbm5lbCAqLworICAgICAgICAgICAgdGVtcCA9IChMVk1fRkxPQVQpKCpkc3QgKyAoTFZNX0ZMT0FUKWRlbGF5W09mZnNldF0pIC8gMi4wZjsKKyAgICAgICAgICAgICpkc3QgPSB0ZW1wOworICAgICAgICAgICAgZHN0Kys7CiAKLSAgICAgICAgZGVsYXlbT2Zmc2V0XSA9ICpzcmM7Ci0gICAgICAgIE9mZnNldCsrOwotICAgICAgICBzcmMrKzsKKyAgICAgICAgICAgIGRlbGF5W09mZnNldF0gPSAqc3JjOworICAgICAgICAgICAgT2Zmc2V0Kys7CisgICAgICAgICAgICBzcmMrKzsKIAotICAgICAgICAvKiBNYWtlIHRoZSByZXZlcmIgZGVsYXkgYnVmZmVyIGEgY2lyY3VsYXIgYnVmZmVyICovCi0gICAgICAgIGlmIChPZmZzZXQgPj0gc2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIC8qIFJpZ2h0IGNoYW5uZWwgKi8KKyAgICAgICAgICAgIHRlbXAgPSAoTFZNX0ZMT0FUKSgqZHN0IC0gKExWTV9GTE9BVClkZWxheVtPZmZzZXRdKSAvIDIuMGY7CisgICAgICAgICAgICAqZHN0ID0gdGVtcDsKKyAgICAgICAgICAgIGRzdCsrOworCisgICAgICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKKyAgICAgICAgICAgIE9mZnNldCsrOworICAgICAgICAgICAgc3JjKys7CisKKyAgICAgICAgICAgIC8qIE1ha2UgdGhlIHJldmVyYiBkZWxheSBidWZmZXIgYSBjaXJjdWxhciBidWZmZXIgKi8KKyAgICAgICAgICAgIGlmIChPZmZzZXQgPj0gc2l6ZSkgeworICAgICAgICAgICAgICAgIE9mZnNldCA9IDA7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTY4LDQ3ICs3OCwzIEBACiAKICAgICByZXR1cm47CiB9Ci12b2lkIERlbGF5TWl4X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAqc3JjLCAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkZWxheSwgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNpemUsICAgICAgICAgICAvKiBEZWxheSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LCAgICAgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqcE9mZnNldCwgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCi17Ci0gICAgTFZNX0lOVDE2ICAgaTsKLSAgICBMVk1fSU5UMTYgICBPZmZzZXQgID0gKnBPZmZzZXQ7Ci0gICAgTFZNX0ZMT0FUICAgdGVtcDsKLQotICAgIGZvciAoaT0wOyBpPG47IGkrKykKLSAgICB7Ci0gICAgICAgIC8qIExlZnQgY2hhbm5lbCAqLwotICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0ZMT0FUKSgoTFZNX0ZMT0FUKSgqZHN0ICsgKExWTV9GTE9BVClkZWxheVtPZmZzZXRdKSAvIDIuMGYpOwotICAgICAgICAqZHN0ICAgICAgICAgICAgPSB0ZW1wOwotICAgICAgICBkc3QrKzsKLQotICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKLSAgICAgICAgT2Zmc2V0Kys7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgIC8qIFJpZ2h0IGNoYW5uZWwgKi8KLSAgICAgICAgdGVtcCAgICAgICAgICAgID0gKExWTV9GTE9BVCkoKExWTV9GTE9BVCkoKmRzdCAtIChMVk1fRkxPQVQpZGVsYXlbT2Zmc2V0XSkgLyAyLjBmKTsKLSAgICAgICAgKmRzdCAgICAgICAgICAgID0gdGVtcDsKLSAgICAgICAgZHN0Kys7Ci0KLSAgICAgICAgZGVsYXlbT2Zmc2V0XSA9ICpzcmM7Ci0gICAgICAgIE9mZnNldCsrOwotICAgICAgICBzcmMrKzsKLQotICAgICAgICAvKiBNYWtlIHRoZSByZXZlcmIgZGVsYXkgYnVmZmVyIGEgY2lyY3VsYXIgYnVmZmVyICovCi0gICAgICAgIGlmIChPZmZzZXQgPj0gc2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgT2Zmc2V0ID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFVwZGF0ZSB0aGUgb2Zmc2V0ICovCi0gICAgKnBPZmZzZXQgPSBPZmZzZXQ7Ci0KLSAgICByZXR1cm47Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5V3JpdGVfMzIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlXcml0ZV8zMi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOWNkZGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlXcml0ZV8zMi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgSU5DTFVERSBGSUxFUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBEZWxheU1peF8xNngxNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgRGVsYXlXcml0ZV8zMihjb25zdCBMVk1fSU5UMzIgICpzcmMsICAgICAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkZWxheSwgICAgICAgICAgICAgLyogRGVsYXkgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBzaXplLCAgICAgICAgICAgICAgIC8qIERlbGF5IHNpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICpwT2Zmc2V0LCAgICAgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuKSAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCi17Ci0gICAgTFZNX0lOVDE2ICAgaTsKLSAgICBMVk1fSU5UMTYgICBPZmZzZXQgID0gKExWTV9JTlQxNikqcE9mZnNldDsKLQotICAgIGZvciAoaT0wOyBpPG47IGkrKykKLSAgICB7Ci0gICAgICAgIGRlbGF5W09mZnNldF0gPSAqc3JjOwotICAgICAgICBPZmZzZXQrKzsKLSAgICAgICAgc3JjKys7Ci0KLSAgICAgICAgLyogTWFrZSB0aGUgZGVsYXkgYnVmZmVyIGEgY2lyY3VsYXIgYnVmZmVyICovCi0gICAgICAgIGlmIChPZmZzZXQgPj0gc2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgT2Zmc2V0ID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFVwZGF0ZSB0aGUgb2Zmc2V0ICovCi0gICAgKnBPZmZzZXQgPSAoTFZNX1VJTlQxNilPZmZzZXQ7Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZjBkNjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEFTU1VNUFRJT05TOgotIENPRUZTLQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTEsCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMCwKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExNSBmb3JtYXQKLQotIERFTEFZUy0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBGT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotICAgIHsKLSAgICAgICAgTFZNX0ZMT0FUICB5bkw7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotCi0gICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgewotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8vIHluTD1BMSAgKiB4KG4tMSlMCi0gICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07Ci0KLSAgICAgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiAoKnBEYXRhSW4pOwotCi0gICAgICAgICAgICAvLyB5bkwrPSAgKC1CMSAgKiB5KG4tMSlMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQKLQotICAgICAgICB9Ci0KLSAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjEyMjVlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KLS8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLwotLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLwotLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCggICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKLXsKLSAgICBMVk1fRkxPQVQgdGVtcDsKLSAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSAgcEluc3RhbmNlOwotICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKXBUYXBzOwotICAgIHRlbXAgPSBwQ29lZi0+QTE7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5BMDsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkIxOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOwotfQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRW5kIE9mIEZpbGU6IEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZjNkZjkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfRk9fMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotI2RlZmluZSBfRk9fMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotCi0vKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCi0vKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwotewotICBMVk1fSU5UMzIqICAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgTFZNX0lOVDE2ICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGU7Ci0KLXR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Ci0KLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKLXsKLSAgICBMVk1fRkxPQVQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi19RmlsdGVyX1N0YXRlX0ZMT0FUOwotCi10eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOwotI2VuZGlmIC8qIF9GT18xSV9EMTZGMTZDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZWZhZDcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEFTU1VNUFRJT05TOgotIENPRUZTLQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTEsCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMCwKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFEzMSBmb3JtYXQKLQotIERFTEFZUy0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgeW5MLHRlbXBsOwotICAgICAgICBMVk1fSU5UMTYgIGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgewotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8vIHluTD1BMSAgKiB4KG4tMSlMCi0gICAgICAgICAgICB5bkwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOwotCi0gICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCi0gICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiAoKnBEYXRhSW4pOwotICAgICAgICAgICAgeW5MICs9IHRlbXBsOwotCi0gICAgICAgICAgICAvLyB5bkwrPSAgKC1CMSAgKiB5KG4tMSlMCi0gICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07Ci0gICAgICAgICAgICB5bkwgKz0gdGVtcGw7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAotICAgICAgICB9Ci0KLSAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjUyOTVjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLwotLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCi0vKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCi0vKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQotewotICAgIExWTV9GTE9BVCB0ZW1wOwotICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpICBwSW5zdGFuY2U7Ci0gICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopICAgIHBUYXBzOwotCi0gICAgdGVtcCA9IHBDb2VmLT5BMTsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkEwOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QjE7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7Ci19Ci0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBFbmQgT2YgRmlsZTogRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkMTM4NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9GT18xSV9EMzJGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfCi0jZGVmaW5lIF9GT18xSV9EMzJGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfCi0KLS8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KLS8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCi17Ci0gIExWTV9JTlQzMiAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICBMVk1fSU5UMzIgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfUZpbHRlcl9TdGF0ZTsKLQotdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKLQotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVF8KLXsKLSAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfUZpbHRlcl9TdGF0ZV9GTE9BVDsKLQotdHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKLSNlbmRpZiAvKiBfRk9fMUlfRDMyRjMyQ0xMX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNhODE5YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUFTU1VNUFRJT05TOgotQ09FRlMtCi1wQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEExLAotcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMCwKLXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE1IGZvcm1hdAotcEJpcXVhZFN0YXRlLT5TaGlmdCAgICBpcyBTaGlmdCB2YWx1ZQotREVMQVlTLQotcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTE1IGZvcm1hdAotcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHkobi0xKUwgaW4gUTMwIGZvcm1hdAotcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0xKVIgaW4gUTE1IGZvcm1hdAotcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0xKVIgaW4gUTMwIGZvcm1hdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgIHluTCx5blI7Ci0gICAgICAgIExWTV9GTE9BVCAgIFRlbXA7Ci0gICAgICAgIExWTV9GTE9BVCAgIE5lZ1NhdFZhbHVlOwotICAgICAgICBMVk1fSU5UMTYgICBpaTsKLQotICAgICAgICBQRmlsdGVyX0Zsb2F0X1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0Zsb2F0X1N0YXRlKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgTmVnU2F0VmFsdWUgPSAtMS4wZjsKLQotICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgICAgICAgICAvLyB5bkwgPUExICAqIHgobi0xKUwKLSAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKLSAgICAgICAgICAgIC8vIHluUiA9QTEgICogeChuLTEpUgotICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOwotCi0gICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogKCpwRGF0YUluKTsKLSAgICAgICAgICAgIC8vIHluUis9QTAgICogeChuKUwKLSAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiAoKihwRGF0YUluKzEpKTsKLQotICAgICAgICAgICAgLy8geW5MICs9ICAoLUIxICAqIHkobi0xKUwgICkKLSAgICAgICAgICAgIFRlbXAgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOwotICAgICAgICAgICAgeW5MICs9IFRlbXA7Ci0gICAgICAgICAgICAvLyB5blIgKz0gICgtQjEgICogeShuLTEpUiApICkKLSAgICAgICAgICAgIFRlbXAgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOwotICAgICAgICAgICAgeW5SICs9IFRlbXA7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKLQotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0geW5SOyAvLyBVcGRhdGUgeShuLTEpUgotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpUgotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICAgICAgICAgLypTYXR1cmF0ZSByZXN1bHRzKi8KLSAgICAgICAgICAgIGlmKHluTCA+IDEuMGYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeW5MID0gMS4wZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZih5bkwgPCBOZWdTYXRWYWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHluTCA9IE5lZ1NhdFZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoeW5SID4gMS4wZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB5blIgPSAxLjBmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHluUiA8IE5lZ1NhdFZhbHVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeW5SID0gTmVnU2F0VmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOwotICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluUjsKLSAgICAgICAgfQotCi0gICAgfQotI2lmZGVmIFNVUFBPUlRfTUMKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotQVNTVU1QVElPTlM6Ci1DT0VGUy0KLXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTEsCi1wQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEEwLAotcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyAtQjEsCi1ERUxBWVMtCi1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMipjaCArIDBdIGlzIHgobi0xKSBvZiB0aGUgJ2NoJyAtIGNoYW5uZWwKLXBCaXF1YWRTdGF0ZS0+cERlbGF5c1syKmNoICsgMV0gaXMgeShuLTEpIG9mIHRoZSAnY2gnIC0gY2hhbm5lbAotVGhlIGluZGV4ICdjaCcgcnVucyBmcm9tIDAgdG8gKE5yQ2hhbm5lbHMgLSAxKQotCi1QQVJBTUVURVJTOgotIHBJbnN0YW5jZSAgICAgICAgUG9pbnRlciBJbnN0YW5jZQotIHBEYXRhSW4gICAgICAgICAgSW5wdXQvU291cmNlCi0gcERhdGFPdXQgICAgICAgICBPdXRwdXQvRGVzdGluYXRpb24KLSBOckZyYW1lcyAgICAgICAgIE51bWJlciBvZiBmcmFtZXMKLSBOckNoYW5uZWxzICAgICAgIE51bWJlciBvZiBjaGFubmVscwotCi1SRVRVUk5TOgotIHZvaWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRk9fTWNfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzKQotICAgIHsKLSAgICAgICAgTFZNX0ZMT0FUICAgeW47Ci0gICAgICAgIExWTV9GTE9BVCAgIFRlbXA7Ci0gICAgICAgIExWTV9JTlQxNiAgIGlpOwotICAgICAgICBMVk1fSU5UMTYgICBjaDsKLSAgICAgICAgUEZpbHRlcl9GbG9hdF9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GbG9hdF9TdGF0ZSkgcEluc3RhbmNlOwotCi0gICAgICAgIExWTV9GTE9BVCAgICpwRGVsYXlzID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzOwotICAgICAgICBMVk1fRkxPQVQgICAqcENvZWZzICA9ICZwQmlxdWFkU3RhdGUtPmNvZWZzWzBdOwotICAgICAgICBMVk1fRkxPQVQgICBBMCA9IHBDb2Vmc1sxXTsKLSAgICAgICAgTFZNX0ZMT0FUICAgQTEgPSBwQ29lZnNbMF07Ci0gICAgICAgIExWTV9GTE9BVCAgIEIxID0gcENvZWZzWzJdOwotCi0gICAgICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgewotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBDSEFOTkVMUwotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgTnJDaGFubmVsczsgY2grKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyB5biA9QTEgICogeChuLTEpCi0gICAgICAgICAgICAgICAgeW4gPSAoTFZNX0ZMT0FUKUExICogcERlbGF5c1swXTsKLQotICAgICAgICAgICAgICAgIC8vIHluKz1BMCAgKiB4KG4pCi0gICAgICAgICAgICAgICAgeW4gKz0gKExWTV9GTE9BVClBMCAqICgqcERhdGFJbik7Ci0KLSAgICAgICAgICAgICAgICAvLyB5biArPSAgKC1CMSAgKiB5KG4tMSkpCi0gICAgICAgICAgICAgICAgVGVtcCA9IEIxICogcERlbGF5c1sxXTsKLSAgICAgICAgICAgICAgICB5biArPSBUZW1wOwotCi0gICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgcERlbGF5c1sxXSA9IHluOyAvLyBVcGRhdGUgeShuLTEpCi0gICAgICAgICAgICAgICAgcERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKQotCi0gICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICAgICAgICAgICAgIC8qU2F0dXJhdGUgcmVzdWx0cyovCi0gICAgICAgICAgICAgICAgaWYgKHluID4gMS4wZikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHluID0gMS4wZjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHluIDwgLTEuMGYpIHsKLSAgICAgICAgICAgICAgICAgICAgeW4gPSAtMS4wZjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW47Ci0gICAgICAgICAgICAgICAgcERlbGF5cyArPSAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcERlbGF5cyAtPSBOckNoYW5uZWxzICogMjsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MWI5NzYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KLS8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLwotLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLwotLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjFfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfTFNoeF9Db2Vmc190ICAgICAgICAqcENvZWYpCi17Ci0gICAgTFZNX0ZMT0FUIHRlbXA7Ci0gICAgUEZpbHRlcl9GbG9hdF9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GbG9hdF9TdGF0ZSkgcEluc3RhbmNlOwotICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwcyAgICAgICAgICAgIDsKLQotICAgIHRlbXAgPSBwQ29lZi0+QTE7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5BMDsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkIxOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOwotfQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEVuZCBPZiBGaWxlOiBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMjI1MDAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9GT18ySV9EMTZGMzJDU1NfTFNIWF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KLSNkZWZpbmUgX0ZPXzJJX0QxNkYzMkNTU19MU0hYX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotCi0vKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCi0vKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwotewotICAgIExWTV9GTE9BVCAgICAgKnBEZWxheXM7ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gICAgTFZNX0ZMT0FUICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfUZpbHRlcl9GbG9hdF9TdGF0ZTsKLQotdHlwZWRlZiBGaWx0ZXJfRmxvYXRfU3RhdGUgKiBQRmlsdGVyX0Zsb2F0X1N0YXRlIDsKLSNlbmRpZiAvKiBfRk9fMklfRDE2RjMyQ1NTX0xTSFhfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GaWx0ZXJzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GaWx0ZXJzLmgKaW5kZXggYjVkYjhmNC4uOGViM2U3NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRmlsdGVycy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZpbHRlcnMuaApAQCAtMzAsMjYgKzMwLDIzIEBACiAgKiBCaXF1YWQgd2l0aCBjb2VmZmljaWVudHMgQTAsIEExLCBBMiwgQjEgYW5kIEIyIGNvZWZmaWNpZW50cwogICovCiAvKiBTaW5nbGUgcHJlY2lzaW9uICgxNi1iaXQpIEJpcXVhZCBzZWN0aW9uIGNvZWZmaWNpZW50cyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fRkxPQVQgICBBMDsKLSAgICBMVk1fRkxPQVQgICBBMTsKLSAgICBMVk1fRkxPQVQgICBBMjsKLSAgICBMVk1fRkxPQVQgICBCMTsKLSAgICBMVk1fRkxPQVQgICBCMjsKLSAgICBMVk1fVUlOVDE2ICBTY2FsZTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fRkxPQVQgQTA7CisgICAgTFZNX0ZMT0FUIEExOworICAgIExWTV9GTE9BVCBBMjsKKyAgICBMVk1fRkxPQVQgQjE7CisgICAgTFZNX0ZMT0FUIEIyOworICAgIExWTV9VSU5UMTYgU2NhbGU7CiB9IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3Q7CiAvKgogICogQmlxdWFkIHdpdGggY29lZmZpY2llbnRzIEEwLCBBMSBhbmQgQjEgY29lZmZpY2llbnRzCiAgKi8KIC8qIFNpbmdsZSBwcmVjaXNpb24gKDE2LWJpdCkgQmlxdWFkIHNlY3Rpb24gY29lZmZpY2llbnRzICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9GTE9BVCAgIEEwOwotICAgIExWTV9GTE9BVCAgIEExOwotICAgIExWTV9GTE9BVCAgIEIxOwotICAgIExWTV9VSU5UMTYgIFNjYWxlOwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9GTE9BVCBBMDsKKyAgICBMVk1fRkxPQVQgQTE7CisgICAgTFZNX0ZMT0FUIEIxOworICAgIExWTV9VSU5UMTYgU2NhbGU7CiB9IEJpcXVhZEEwMUIxQ29lZnNTUF90OwogCi0jZW5kaWYgICAgICAvKiBGSUxURVJTX0ggKi8KLQorI2VuZGlmIC8qIEZJTFRFUlNfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9NU18xNngxNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmNwcAppbmRleCBjM2Y2NjQ4Li5lMmY4YzY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmNwcApAQCAtMjEsNDcgKzIxLDEwIEBACiAKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiAgRnJvbTJpVG9NU18xNngxNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgRnJvbTJpVG9NU18xNngxNiggY29uc3QgTFZNX0lOVDE2ICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICpkc3RNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICpkc3RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQotewotICAgIExWTV9JTlQzMiB0ZW1wMSxsZWZ0LHJpZ2h0Owordm9pZCBGcm9tMmlUb01TX0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdE0sIExWTV9GTE9BVCogZHN0UywgTFZNX0lOVDE2IG4pIHsKKyAgICBMVk1fRkxPQVQgdGVtcDEsIGxlZnQsIHJpZ2h0OwogICAgIExWTV9JTlQxNiBpaTsKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIGxlZnQgPSAoTFZNX0lOVDMyKSpzcmM7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgIHJpZ2h0ID0gKExWTV9JTlQzMikqc3JjOwotICAgICAgICBzcmMrKzsKLQotICAgICAgICAvKiBDb21wdXRlIE0gc2lnbmFsKi8KLSAgICAgICAgdGVtcDEgPSAgKGxlZnQrcmlnaHQpPj4xOwotICAgICAgICAqZHN0TSA9IChMVk1fSU5UMTYpdGVtcDE7Ci0gICAgICAgIGRzdE0rKzsKLQotICAgICAgICAvKiBDb21wdXRlIFMgc2lnbmFsKi8KLSAgICAgICAgdGVtcDEgPSAgKGxlZnQtcmlnaHQpPj4xOwotICAgICAgICAqZHN0UyA9IChMVk1fSU5UMTYpdGVtcDE7Ci0gICAgICAgIGRzdFMrKzsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci12b2lkIEZyb20yaVRvTVNfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0TSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0UywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuICkKLXsKLSAgICBMVk1fRkxPQVQgdGVtcDEsbGVmdCxyaWdodDsKLSAgICBMVk1fSU5UMTYgaWk7Ci0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgeworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgIGxlZnQgPSAoTFZNX0ZMT0FUKSpzcmM7CiAgICAgICAgIHNyYysrOwogCkBAIC02OSwxNiArMzIsMTUgQEAKICAgICAgICAgc3JjKys7CiAKICAgICAgICAgLyogQ29tcHV0ZSBNIHNpZ25hbCovCi0gICAgICAgIHRlbXAxID0gIChsZWZ0ICsgcmlnaHQpIC8gMi4wZjsKKyAgICAgICAgdGVtcDEgPSAobGVmdCArIHJpZ2h0KSAvIDIuMGY7CiAgICAgICAgICpkc3RNID0gKExWTV9GTE9BVCl0ZW1wMTsKICAgICAgICAgZHN0TSsrOwogCiAgICAgICAgIC8qIENvbXB1dGUgUyBzaWduYWwqLwotICAgICAgICB0ZW1wMSA9ICAobGVmdCAtIHJpZ2h0KSAvIDIuMGY7CisgICAgICAgIHRlbXAxID0gKGxlZnQgLSByaWdodCkgLyAyLjBmOwogICAgICAgICAqZHN0UyA9IChMVk1fRkxPQVQpdGVtcDE7CiAgICAgICAgIGRzdFMrKzsKICAgICB9CiAKICAgICByZXR1cm47CiB9Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18xNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMTYuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzU4ZWU3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18xNi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgSU5DTFVERSBGSUxFUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBGcm9tMmlUb01vbm9fMTYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIEZyb20yaVRvTW9ub18xNiggY29uc3QgTFZNX0lOVDE2ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCi17Ci0gICAgTFZNX0lOVDE2IGlpOwotICAgIExWTV9JTlQzMiBUZW1wOwotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKLSAgICAgICAgVGVtcCA9IChMVk1fSU5UMzIpKnNyYzsKLSAgICAgICAgc3JjKys7Ci0KLSAgICAgICAgVGVtcCArPSAoTFZNX0lOVDMyKSpzcmM7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgICpkc3QgID0gKExWTV9JTlQxNikoVGVtcCA+PjEpOwotICAgICAgICBkc3QrKzsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jcHAKaW5kZXggYTg2ODhiNC4uMDM5ZWUxNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuY3BwCkBAIC0yMSw0MCArMjEsMTEgQEAKIAogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIEZyb20yaVRvTW9ub18zMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgRnJvbTJpVG9Nb25vXzMyKCBjb25zdCBMVk1fSU5UMzIgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKLXsKLSAgICBMVk1fSU5UMTYgaWk7Ci0gICAgTFZNX0lOVDMyIFRlbXA7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIFRlbXAgPSAoKnNyYz4+MSk7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgIFRlbXAgKz0oKnNyYz4+MSk7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgICpkc3QgPSBUZW1wOwotICAgICAgICBkc3QrKzsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci12b2lkIEZyb20yaVRvTW9ub19GbG9hdCggY29uc3QgTFZNX0ZMT0FUICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCi17Cit2b2lkIEZyb20yaVRvTW9ub19GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyYywgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKSB7CiAgICAgTFZNX0lOVDE2IGlpOwogICAgIExWTV9GTE9BVCBUZW1wOwogCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgeworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgIFRlbXAgPSAoKnNyYyk7CiAgICAgICAgIHNyYysrOwogCkBAIC02Nyw3ICszOCw2IEBACiAKICAgICByZXR1cm47CiB9Ci0jaWZkZWYgU1VQUE9SVF9NQwogLyoKICAqIEZVTkNUSU9OOiAgICAgICBGcm9tTWNUb01vbm9fRmxvYXQKICAqCkBAIC04NSwxOSArNTUsMTQgQEAKICAqICB2b2lkCiAgKgogICovCi12b2lkIEZyb21NY1RvTW9ub19GbG9hdChjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpCi17Cit2b2lkIEZyb21NY1RvTW9ub19GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyYywgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckNoYW5uZWxzKSB7CiAgICAgTFZNX0lOVDE2IGlpLCBqajsKICAgICBMVk1fRkxPQVQgVGVtcDsKIAotICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKLSAgICB7CisgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgIFRlbXAgPSAwLjBmOwotICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0wOyBqai0tKQotICAgICAgICB7CisgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwOyBqai0tKSB7CiAgICAgICAgICAgICBUZW1wICs9ICgqc3JjKTsKICAgICAgICAgICAgIHNyYysrOwogICAgICAgICB9CkBAIC0xMDcsNiArNzIsMyBAQAogCiAgICAgcmV0dXJuOwogfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW5zdEFsbG9jLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0luc3RBbGxvYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMzliZjUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW5zdEFsbG9jLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiSW5zdEFsbG9jLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgTmFtZSAgICAgICAgOiBJbnN0QWxsb2NfSW5pdCgpCi0gKiAgSW5wdXQgICAgICAgOiBwbXMgIC0gUG9pbnRlciB0byB0aGUgSU5TVF9BTExPQyBpbnN0YW5jZQotICAgICAgICAgICAgICAgICAgU3RhcnRBZGRyIC0gQmFzZSBhZGRyZXNzIG9mIHRoZSBpbnN0YW5jZSBtZW1vcnkKLSAqICBSZXR1cm5zICAgICA6IEVycm9yIGNvZGUKLSAqICBEZXNjcmlwdGlvbiA6IEluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSBkaXN0cmlidXRpb24gYW5kIG1lbW9yeSBzaXplIGNhbGN1bGF0aW9uIGZ1bmN0aW9uCi0gKiAgUmVtYXJrcyAgICAgOgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgICAgSW5zdEFsbG9jX0luaXQoIElOU1RfQUxMT0MgICAgICAqcG1zLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICpTdGFydEFkZHIgKQotewotICAgIHBtcy0+VG90YWxTaXplID0gMzsKLSAgICBwbXMtPnBOZXh0TWVtYmVyID0gKCgodWludHB0cl90KVN0YXJ0QWRkciArIDMpICYgKHVpbnRwdHJfdCl+Myk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgTmFtZSAgICAgICAgOiBJbnN0QWxsb2NfQWRkTWVtYmVyKCkKLSAqICBJbnB1dCAgICAgICA6IHBtcyAgLSBQb2ludGVyIHRvIHRoZSBJTlNUX0FMTE9DIGluc3RhbmNlCi0gICAgICAgICAgICAgICAgICBTaXplIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG5ldyBhZGRlZCBtZW1iZXIKLSAqICBSZXR1cm5zICAgICA6IEEgcG9pbnRlciB0byB0aGUgbmV3IGFkZGVkIG1lbWJlcgotICogIERlc2NyaXB0aW9uIDogQWxsb2NhdGVzIHNwYWNlIGZvciBhIG5ldyBtZW1iZXIgaW4gdGhlIGluc3RhbmNlIG1lbW9yeSBhbmQgcmV0dXJucwotICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIHRvIHRoaXMgbmV3IG1lbWJlci4gIFRoZSBzdGFydCBhZGRyZXNzIG9mIGFsbCBtZW1iZXJzIHdpbGwKLSAgICAgICAgICAgICAgICAgIGJlIDMyIGJpdCBhbGxpZ25lZC4KLSAqICBSZW1hcmtzICAgICA6Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCogICBJbnN0QWxsb2NfQWRkTWVtYmVyKCBJTlNUX0FMTE9DICAgICAgICAgKnBtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgU2l6ZSApCi17Ci0gICAgdm9pZCAqTmV3TWVtYmVyQWRkcmVzczsgLyogVmFyaWFibGUgdG8gdGVtcG9yYXJpbHkgc3RvcmUgdGhlIHJldHVybiB2YWx1ZSAqLwotICAgIE5ld01lbWJlckFkZHJlc3MgPSAodm9pZCopcG1zLT5wTmV4dE1lbWJlcjsKLQotICAgIFNpemUgPSAoKFNpemUgKyAzKSAmIChMVk1fVUlOVDMyKX4zKTsgLyogQ2VpbCB0aGUgc2l6ZSB0byBhIG11bHRpcGxlIG9mIGZvdXIgKi8KLQotICAgIHBtcy0+VG90YWxTaXplICs9IFNpemU7Ci0gICAgcG1zLT5wTmV4dE1lbWJlciArPSBTaXplOwotCi0gICAgcmV0dXJuKE5ld01lbWJlckFkZHJlc3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIE5hbWUgICAgICAgIDogSW5zdEFsbG9jX0dldFRvdGFsKCkKLSAqICBJbnB1dCAgICAgICA6IHBtcyAgLSBQb2ludGVyIHRvIHRoZSBJTlNUX0FMTE9DIGluc3RhbmNlCi0gKiAgUmV0dXJucyAgICAgOiBUaGUgaW5zdGFuY2UgbWVtb3J5IHNpemUKLSAqICBEZXNjcmlwdGlvbiA6IFRoaXMgZnVuY3Rpb25zIHJldHVybnMgdGhlIGNhbGN1bGF0ZWQgaW5zdGFuY2UgbWVtb3J5IHNpemUKLSAqICBSZW1hcmtzICAgICA6Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTFZNX1VJTlQzMiBJbnN0QWxsb2NfR2V0VG90YWwoIElOU1RfQUxMT0MgKnBtcykKLXsKLSAgICBpZiAocG1zLT5Ub3RhbFNpemUgPiAzKQotICAgIHsKLSAgICAgICAgcmV0dXJuKHBtcy0+VG90YWxTaXplKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAvKiBObyBtZW1vcnkgYWRkZWQgKi8KLSAgICB9Ci19Ci0KLXZvaWQgICAgSW5zdEFsbG9jX0luaXRBbGwoIElOU1RfQUxMT0MgICAgICAgICAgICAgICAgICAgICAgKnBtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NZW1vcnlUYWJsZV9zdCAgICAgICAgICAgICAqcE1lbW9yeVRhYmxlKQotewotICAgIHVpbnRwdHJfdCBTdGFydEFkZHI7Ci0KLSAgICBTdGFydEFkZHIgPSAodWludHB0cl90KXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzOwotCi0gICAgcG1zWzBdLlRvdGFsU2l6ZSA9IDM7Ci0gICAgcG1zWzBdLnBOZXh0TWVtYmVyID0gKChTdGFydEFkZHIgKyAzKSAmICh1aW50cHRyX3QpfjMpOwotCi0gICAgU3RhcnRBZGRyID0gKHVpbnRwdHJfdClwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzczsKLQotICAgIHBtc1sxXS5Ub3RhbFNpemUgPSAzOwotICAgIHBtc1sxXS5wTmV4dE1lbWJlciA9ICgoU3RhcnRBZGRyICsgMykgJiAodWludHB0cl90KX4zKTsKLQotICAgIFN0YXJ0QWRkciA9ICh1aW50cHRyX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7Ci0KLSAgICBwbXNbMl0uVG90YWxTaXplID0gMzsKLSAgICBwbXNbMl0ucE5leHRNZW1iZXIgPSAoKFN0YXJ0QWRkciArIDMpICYgKHVpbnRwdHJfdCl+Myk7Ci0KLSAgICBTdGFydEFkZHIgPSAodWludHB0cl90KXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOwotCi0gICAgcG1zWzNdLlRvdGFsU2l6ZSA9IDM7Ci0gICAgcG1zWzNdLnBOZXh0TWVtYmVyID0gKChTdGFydEFkZHIgKyAzKSAmICh1aW50cHRyX3QpfjMpOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgTmFtZSAgICAgICAgOiBJbnN0QWxsb2NfSW5pdEFsbF9OVUxMKCkKLSAqICBJbnB1dCAgICAgICA6IHBtcyAgLSBQb2ludGVyIHRvIGFycmF5IG9mIGZvdXIgSU5TVF9BTExPQyBpbnN0YW5jZXMKLSAqICBSZXR1cm5zICAgICA6IE5vdGhpbmcKLSAqICBEZXNjcmlwdGlvbiA6IFRoaXMgZnVuY3Rpb24gcmVzZXJ2ZXMgU2l6ZSBvZiAzIGJ5dGVzIGZvciBhbGwgbWVtb3J5IHJlZ2lvbnMgYW5kCi0gKiAgICAgICAgICAgICAgICBpbnRpYWxpemVzIHBOZXh0TWVtYmVyIGZvciBhbGwgcmVnaW9ucyB0byAwCi0gKiAgUmVtYXJrcyAgICAgOgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgICAgSW5zdEFsbG9jX0luaXRBbGxfTlVMTCggSU5TVF9BTExPQyAgKnBtcykKLXsKLSAgICBwbXNbMF0uVG90YWxTaXplID0gMzsKLSAgICBwbXNbMF0ucE5leHRNZW1iZXIgPSAwOwotCi0gICAgcG1zWzFdLlRvdGFsU2l6ZSA9IDM7Ci0gICAgcG1zWzFdLnBOZXh0TWVtYmVyID0gMDsKLQotICAgIHBtc1syXS5Ub3RhbFNpemUgPSAzOwotICAgIHBtc1syXS5wTmV4dE1lbWJlciA9IDA7Ci0KLSAgICBwbXNbM10uVG90YWxTaXplID0gMzsKLSAgICBwbXNbM10ucE5leHRNZW1iZXIgPSAwOwotCi19Ci0KLXZvaWQqICAgSW5zdEFsbG9jX0FkZE1lbWJlckFsbCggSU5TVF9BTExPQyAgICAgICAgICAgICAgICAgICAgICpwbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgIFNpemVbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NZW1vcnlUYWJsZV9zdCAgICAgICAgICAgKnBNZW1vcnlUYWJsZSkKLXsKLSAgICB2b2lkICpOZXdNZW1iZXJBZGRyZXNzOyAvKiBWYXJpYWJsZSB0byB0ZW1wb3JhcmlseSBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlICovCi0KLSAgICAvKiBjb3Zlcml0eVtyZXR1cm5lZF9wb2ludGVyXSBJZ25vcmUgY292ZXJpdHkgd2FybmluZyB0aGF0IHB0ciBpcyBub3QgdXNlZCAqLwotICAgIE5ld01lbWJlckFkZHJlc3MgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwgU2l6ZVtMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdKTsKLQotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZwbXNbTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXSk7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEE7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgIE5ld01lbWJlckFkZHJlc3MgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwgU2l6ZVtMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdKTsKLQotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSk7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEE7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgIE5ld01lbWJlckFkZHJlc3MgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwgU2l6ZVtMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdKTsKLQotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSk7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUY7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgIE5ld01lbWJlckFkZHJlc3MgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1RFTVBPUkFSWV9GQVNUXSwgU2l6ZVtMVk1fVEVNUE9SQVJZX0ZBU1RdKTsKLQotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZSAgICAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJnBtc1tMVk1fVEVNUE9SQVJZX0ZBU1RdKTsKLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlR5cGUgICAgICAgICAgICAgICAgID0gTFZNX1RFTVBPUkFSWV9GQVNUOwotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzICAgICAgICAgPSBMVk1fTlVMTDsKLQotICAgIHJldHVybihOZXdNZW1iZXJBZGRyZXNzKTsKLX0KLQotdm9pZCogICBJbnN0QWxsb2NfQWRkTWVtYmVyQWxsUmV0KCAgICAgSU5TVF9BTExPQyAgICAgICAgICAgICAgICAgKnBtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgU2l6ZVtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICoqcHRyKQotewotICAgIHB0clswXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLCBTaXplW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0pOwotICAgIHB0clsxXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLCBTaXplW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0pOwotICAgIHB0clsyXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLCBTaXplW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0pOwotICAgIHB0clszXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fVEVNUE9SQVJZX0ZBU1RdLCBTaXplW0xWTV9URU1QT1JBUllfRkFTVF0pOwotCi0gICAgcmV0dXJuIChwdHJbMF0pOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ludDE2TFNoaWZ0VG9JbnQzMl8xNngzMi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMDllNGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBJTkNMVURFIEZJTEVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIElOVDE2TFNISUZUVE9JTlQzMl8xNlgzMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyKGNvbnN0IExWTV9JTlQxNiAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgIHNoaWZ0ICkKLXsKLSAgICBMVk1fSU5UMTYgaWk7Ci0KLSAgICBzcmMgKz0gbi0xOwotICAgIGRzdCArPSBuLTE7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgICpkc3QgPSAoICgoTFZNX0lOVDMyKSpzcmMpIDw8IHNoaWZ0KTsKLSAgICAgICAgc3JjLS07Ci0gICAgICAgIGRzdC0tOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnQzMlJTaGlmdFRvSW50MTZfU2F0XzMyeDE2LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yzk5ODBkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREUgRklMRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gSU5UMzJSU0hJRlRUT0lOVDE2X1NBVF8zMlgxNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNihjb25zdCBMVk1fSU5UMzIgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNoaWZ0ICkKLXsKLSAgICBMVk1fSU5UMzIgdGVtcDsKLSAgICBMVk1fSU5UMTYgaWk7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIHRlbXAgPSAqc3JjID4+IHNoaWZ0OwotICAgICAgICBzcmMrKzsKLQotICAgICAgICBpZiAodGVtcCA+IDB4MDAwMDdGRkYpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAweDdGRkY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGVtcCA8IC0weDAwMDA4MDAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gLSAweDgwMDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gKExWTV9JTlQxNil0ZW1wOwotICAgICAgICB9Ci0KLSAgICAgICAgZHN0Kys7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0pvaW5UbzJpXzMyeDMyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0pvaW5UbzJpXzMyeDMyLmNwcAppbmRleCAwNWRmNjU2Li42YzdjOGFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Kb2luVG8yaV8zMngzMi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuY3BwCkBAIC0yMSw0NyArMjEsMTQgQEAKIAogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIEpvaW5UbzJpXzMyeDMyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBKb2luVG8yaV8zMngzMiggY29uc3QgTFZNX0lOVDMyICAgICpzcmNMLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICpzcmNSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgbiApCi17Ci0gICAgTFZNX0lOVDE2IGlpOwotCi0gICAgc3JjTCArPSBuLTE7Ci0gICAgc3JjUiArPSBuLTE7Ci0gICAgZHN0ICArPSAoKDIqbiktMSk7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgICpkc3QgPSAqc3JjUjsKLSAgICAgICAgZHN0LS07Ci0gICAgICAgIHNyY1ItLTsKLQotICAgICAgICAqZHN0ID0gKnNyY0w7Ci0gICAgICAgIGRzdC0tOwotICAgICAgICBzcmNMLS07Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotdm9pZCBKb2luVG8yaV9GbG9hdCggY29uc3QgTFZNX0ZMT0FUICAgICpzcmNMLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpzcmNSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgbiApCi17Cit2b2lkIEpvaW5UbzJpX0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjTCwgY29uc3QgTFZNX0ZMT0FUKiBzcmNSLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKICAgICBMVk1fSU5UMTYgaWk7CiAKICAgICBzcmNMICs9IG4gLSAxOwogICAgIHNyY1IgKz0gbiAtIDE7Ci0gICAgZHN0ICArPSAoKDIgKiBuKSAtIDEpOworICAgIGRzdCArPSAoKDIgKiBuKSAtIDEpOwogCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgeworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgICpkc3QgPSAqc3JjUjsKICAgICAgICAgZHN0LS07CiAgICAgICAgIHNyY1ItLTsKQEAgLTc0LDQgKzQxLDMgQEAKICAgICByZXR1cm47CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmNwcAppbmRleCAxNGQ2MWJkLi5kNjcwYjNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmNwcApAQCAtMTgsNjcgKzE4LDE5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgSU5DTFVERSBGSUxFUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KICNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKICNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKQotewotICAgIExWTV9GTE9BVCAgVGVtcDsKLSAgICBMVk1fSU5UMTYgaWk7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMS0+UHJpdmF0ZVBhcmFtcyk7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UyID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMi0+UHJpdmF0ZVBhcmFtcyk7Ci0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgewotICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKXBJbnN0YW5jZTEtPkN1cnJlbnQpOwotICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAqZHN0KysgPSAxLjBmOwotICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCi0gICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgKmRzdCsrID0gKExWTV9GTE9BVClUZW1wOwotCi0gICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpcEluc3RhbmNlMi0+Q3VycmVudCk7Ci0gICAgICAgIGlmIChUZW1wID4gMS4wZikKLSAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7Ci0gICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKLSAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7Ci0gICAgfQotCi19Ci0jaWZkZWYgU1VQUE9SVF9NQwotdm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF9NQ19mbG9hdF9TQVQgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICoqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgIE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICBOckNoYW5uZWxzKQotewotICAgIExWTV9GTE9BVCAgVGVtcDsKK3ZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfTUNfZmxvYXRfU0FUKE1peF9Qcml2YXRlX0ZMT0FUX3N0KiogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpIHsKKyAgICBMVk1fRkxPQVQgVGVtcDsKICAgICBMVk1fSU5UMTYgaWksIGpqOwotICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZVtqal0pOwotICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClwSW5zdGFuY2UxLT5DdXJyZW50KTsKLSAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKLSAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOwotICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKKyAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgZm9yIChqaiA9IDA7IGpqIDwgTnJDaGFubmVsczsgamorKykgeworICAgICAgICAgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZTEgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKShwdHJJbnN0YW5jZVtqal0pOworICAgICAgICAgICAgVGVtcCA9ICAqc3JjKysgKiBwSW5zdGFuY2UxLT5DdXJyZW50OworICAgICAgICAgICAgKmRzdCsrID0gTFZNX0NsYW1wKFRlbXApOwogICAgICAgICB9CiAgICAgfQogfQotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jcHAKaW5kZXggODQxZmExZS4uNDE3YzFmMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jcHAKQEAgLTE4LDM4ICsxOCwyOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIElOQ0xVREUgRklMRVMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiAjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNvcmVfTUlYSEFSRF8yU1RfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgICpwdHJJbnN0YW5jZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKLXsKLSAgICBMVk1fRkxPQVQgIFRlbXA7Cit2b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfRkxPQVRfc3QqIHB0ckluc3RhbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCogcHRySW5zdGFuY2UyLCBjb25zdCBMVk1fRkxPQVQqIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUKiBzcmMyLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKKyAgICBMVk1fRkxPQVQgVGVtcDsKICAgICBMVk1fSU5UMTYgaWk7CiAgICAgTFZNX0ZMT0FUIEN1cnJlbnQxOwogICAgIExWTV9GTE9BVCBDdXJyZW50MjsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTEgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UxLT5Qcml2YXRlUGFyYW1zKTsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UyLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlMSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlMS0+UHJpdmF0ZVBhcmFtcyk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZTIgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKShwdHJJbnN0YW5jZTItPlByaXZhdGVQYXJhbXMpOwogCi0gICAgQ3VycmVudDEgPSAocEluc3RhbmNlMS0+Q3VycmVudCk7Ci0gICAgQ3VycmVudDIgPSAocEluc3RhbmNlMi0+Q3VycmVudCk7CisgICAgQ3VycmVudDEgPSBwSW5zdGFuY2UxLT5DdXJyZW50OworICAgIEN1cnJlbnQyID0gcEluc3RhbmNlMi0+Q3VycmVudDsKIAotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKXsKLSAgICAgICAgVGVtcCA9ICgoKExWTV9GTE9BVCkqKHNyYzErKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQxKSkgKwotICAgICAgICAgICAgICAgKCgoTFZNX0ZMT0FUKSooc3JjMisrKSAqIChMVk1fRkxPQVQpQ3VycmVudDIpKTsKLSAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQotICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKLSAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgVGVtcCA9ICAqc3JjMSsrICogQ3VycmVudDEgKyAqc3JjMisrICogQ3VycmVudDI7CisgICAgICAgICpkc3QrKyA9IExWTV9DbGFtcChUZW1wKTsKICAgICB9CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmNwcAppbmRleCAzMTgxMzhkLi5kOGMyNWM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuY3BwCkBAIC0xOCwxMDIgKzE4LDcyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgSU5DTFVERSBGSUxFUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KICNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNvcmVfTUlYU09GVF8xU1RfRDE2QzMxX1dSQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbikKLXsKLQotICAgIExWTV9JTlQxNiAgIE91dExvb3A7Ci0gICAgTFZNX0lOVDE2ICAgSW5Mb29wOwotICAgIExWTV9JTlQzMiAgIGlpLGpqOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKLSAgICBMVk1fRkxPQVQgICBEZWx0YSA9IHBJbnN0YW5jZS0+RGVsdGE7Ci0gICAgTFZNX0ZMT0FUICAgQ3VycmVudCA9IHBJbnN0YW5jZS0+Q3VycmVudDsKLSAgICBMVk1fRkxPQVQgICBUYXJnZXQgPSBwSW5zdGFuY2UtPlRhcmdldDsKLSAgICBMVk1fRkxPQVQgICBUZW1wOwordm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVChMVk1peGVyM19GTE9BVF9zdCogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKKyAgICBMVk1fSU5UMTYgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgSW5Mb29wOworICAgIExWTV9JTlQzMiBpaSwgamo7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fRkxPQVQgRGVsdGEgPSBwSW5zdGFuY2UtPkRlbHRhOworICAgIExWTV9GTE9BVCBDdXJyZW50ID0gcEluc3RhbmNlLT5DdXJyZW50OworICAgIExWTV9GTE9BVCBUYXJnZXQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fRkxPQVQgVGVtcDsKIAogICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLwogICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CiAKLSAgICBpZihDdXJyZW50IDwgVGFyZ2V0KXsKLSAgICAgICAgaWYgKE91dExvb3ApeworICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KSB7CisgICAgICAgIGlmIChPdXRMb29wKSB7CiAgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOwogICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CiAKLSAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pewotICAgICAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqZHN0KSArICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKLSAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICAgICAgVGVtcCA9ICpkc3QgKyAqc3JjKysgKiBDdXJyZW50OworICAgICAgICAgICAgICAgICpkc3QrKyA9IExWTV9DbGFtcChUZW1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOwogICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CiAKLSAgICAgICAgICAgIGZvciAoamogPSA0OyBqaiAhPSAwIDsgamotLSl7Ci0gICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSpkc3QpICsgKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOwotICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gKExWTV9GTE9BVClUZW1wOworICAgICAgICAgICAgZm9yIChqaiA9IDQ7IGpqICE9IDA7IGpqLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKmRzdCArICpzcmMrKyAqIEN1cnJlbnQ7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gTFZNX0NsYW1wKFRlbXApOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfQotICAgIGVsc2V7Ci0gICAgICAgIGlmIChPdXRMb29wKXsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoT3V0TG9vcCkgewogICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKLSAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQotICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgQ3VycmVudCA9IFRhcmdldDsKIAotICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pewotICAgICAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqZHN0KSArICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKLSAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICAgICAgVGVtcCA9ICpkc3QgKyAqc3JjKysgKiBDdXJyZW50OworICAgICAgICAgICAgICAgICpkc3QrKyA9IExWTV9DbGFtcChUZW1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KSBDdXJyZW50ID0gVGFyZ2V0OwogCi0gICAgICAgICAgICBmb3IgKGpqID0gNDsgamogIT0gMCA7IGpqLS0pewotICAgICAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqZHN0KSArICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKLSAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKKyAgICAgICAgICAgIGZvciAoamogPSA0OyBqaiAhPSAwOyBqai0tKSB7CisgICAgICAgICAgICAgICAgVGVtcCA9ICpkc3QgKyAqc3JjKysgKiBDdXJyZW50OworICAgICAgICAgICAgICAgICpkc3QrKyA9IExWTV9DbGFtcChUZW1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OwogfQotI2lmZGVmIFNVUFBPUlRfTUMKIC8qCiAgKiBGVU5DVElPTjogICAgICAgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQKICAqCkBAIC0xMzEsMjEgKzEwMSwxNiBAQAogICogIHZvaWQKICAqCiAgKi8KLXZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgTnJDaGFubmVscykKLXsKLQotICAgIExWTV9JTlQxNiAgIE91dExvb3A7Ci0gICAgTFZNX0lOVDE2ICAgSW5Mb29wOwotICAgIExWTV9JTlQzMiAgIGlpLCBqajsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+UHJpdmF0ZVBhcmFtcyk7Ci0gICAgTFZNX0ZMT0FUICAgRGVsdGEgPSBwSW5zdGFuY2UtPkRlbHRhOwotICAgIExWTV9GTE9BVCAgIEN1cnJlbnQgPSBwSW5zdGFuY2UtPkN1cnJlbnQ7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0ID0gcEluc3RhbmNlLT5UYXJnZXQ7Ci0gICAgTFZNX0ZMT0FUICAgVGVtcDsKK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfRkxPQVRfc3QqIHB0ckluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpIHsKKyAgICBMVk1fSU5UMTYgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgSW5Mb29wOworICAgIExWTV9JTlQzMiBpaSwgamo7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fRkxPQVQgRGVsdGEgPSBwSW5zdGFuY2UtPkRlbHRhOworICAgIExWTV9GTE9BVCBDdXJyZW50ID0gcEluc3RhbmNlLT5DdXJyZW50OworICAgIExWTV9GTE9BVCBUYXJnZXQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fRkxPQVQgVGVtcDsKIAogICAgIC8qCiAgICAgICogU2FtZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIG9uIGNvbnNlY3V0aXZlIGZyYW1lcy4KQEAgLTE2MCw5MCArMTI1LDUyIEBACiAgICAgICAgIGlmIChPdXRMb29wKSB7CiAgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOwogICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CiAKLSAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3AqTnJDaGFubmVsczsgaWkgIT0gMDsgaWktLSkgewotICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKLSAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcCAqIE5yQ2hhbm5lbHM7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKmRzdCArICpzcmMrKyAqIEN1cnJlbnQ7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gTFZNX0NsYW1wKFRlbXApOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKICAgICAgICAgICAgIEN1cnJlbnQgPSBUZW1wOwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KSBDdXJyZW50ID0gVGFyZ2V0OwogCi0gICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMCA7IGpqLS0pIHsKLSAgICAgICAgICAgICAgICBUZW1wID0gKCpkc3QpICsgKCooc3JjKyspICogQ3VycmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQotICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSBUZW1wOworICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9IDA7IGpqLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKmRzdCArICpzcmMrKyAqIEN1cnJlbnQ7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gTFZNX0NsYW1wKFRlbXApOwogCi0gICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOwotICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKLQorICAgICAgICAgICAgICAgIFRlbXAgPSAqZHN0ICsgKnNyYysrICogQ3VycmVudDsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBMVk1fQ2xhbXAoVGVtcCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZXsKKyAgICB9IGVsc2UgewogICAgICAgICBpZiAoT3V0TG9vcCkgewogICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKLSAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQotICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgQ3VycmVudCA9IFRhcmdldDsKIAotICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3AqTnJDaGFubmVsczsgaWkgIT0gMDsgaWktLSkgewotICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKLSAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcCAqIE5yQ2hhbm5lbHM7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKmRzdCArICpzcmMrKyAqIEN1cnJlbnQ7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gTFZNX0NsYW1wKFRlbXApOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKLSAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQotICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgQ3VycmVudCA9IFRhcmdldDsKIAotICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9IDAgOyBqai0tKSB7Ci0gICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOwotICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKKyAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwOyBqai0tKSB7CisgICAgICAgICAgICAgICAgVGVtcCA9ICpkc3QgKyAqc3JjKysgKiBDdXJyZW50OworICAgICAgICAgICAgICAgICpkc3QrKyA9IExWTV9DbGFtcChUZW1wKTsKIAotICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKLSAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7Ci0KKyAgICAgICAgICAgICAgICBUZW1wID0gKmRzdCArICpzcmMrKyAqIEN1cnJlbnQ7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gTFZNX0NsYW1wKFRlbXApOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IEN1cnJlbnQ7CiB9CiAKLSNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuY3BwCmluZGV4IDFmNGIwOGEuLjA5NjhjZjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuY3BwCkBAIC0xOCwxNzYgKzE4LDM4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgSU5DTFVERSBGSUxFUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KICNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKICNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisjaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgTFZNX0ZMT0FUIEFERDJfU0FUX0ZMT0FUKExWTV9GTE9BVCBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUIGMpCi17Ci0gICAgTFZNX0ZMT0FUIHRlbXA7Ci0gICAgdGVtcCA9IGEgKyBiIDsKLSAgICBpZiAodGVtcCA8IC0xLjBmKQotICAgICAgICBjID0gLTEuMGY7Ci0gICAgZWxzZSBpZiAodGVtcCA+IDEuMGYpCi0gICAgICAgIGMgPSAxLjBmOwotICAgIGVsc2UKLSAgICAgICAgYyA9IHRlbXA7Ci0gICAgcmV0dXJuIGM7CitzdGF0aWMgaW5saW5lIExWTV9GTE9BVCBBREQyX1NBVF9GTE9BVChMVk1fRkxPQVQgYSwgTFZNX0ZMT0FUIGIpIHsKKyAgICByZXR1cm4gTFZNX0NsYW1wKGEgKyBiKTsKIH0KLXZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQSggTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKQotewotICAgIExWTV9JTlQxNiAgIE91dExvb3A7Ci0gICAgTFZNX0lOVDE2ICAgSW5Mb29wOwotICAgIExWTV9JTlQzMiAgIGlpOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlTCA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZTEtPlByaXZhdGVQYXJhbXMpOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlUiA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZTItPlByaXZhdGVQYXJhbXMpOwotCi0gICAgTFZNX0ZMT0FUICAgRGVsdGFMID0gcEluc3RhbmNlTC0+RGVsdGE7Ci0gICAgTFZNX0ZMT0FUICAgQ3VycmVudEwgPSBwSW5zdGFuY2VMLT5DdXJyZW50OwotICAgIExWTV9GTE9BVCAgIFRhcmdldEwgPSBwSW5zdGFuY2VMLT5UYXJnZXQ7Ci0KLSAgICBMVk1fRkxPQVQgICBEZWx0YVIgPSBwSW5zdGFuY2VSLT5EZWx0YTsKLSAgICBMVk1fRkxPQVQgICBDdXJyZW50UiA9IHBJbnN0YW5jZVItPkN1cnJlbnQ7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0UiA9IHBJbnN0YW5jZVItPlRhcmdldDsKLQotICAgIExWTV9GTE9BVCAgIFRlbXAgPSAwOwotCi0gICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCi0gICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKLQotICAgIGlmIChPdXRMb29wKQotICAgIHsKLSAgICAgICAgaWYoQ3VycmVudEwgPCBUYXJnZXRMKQotICAgICAgICB7Ci0gICAgICAgICAgICBBREQyX1NBVF9GTE9BVChDdXJyZW50TCwgRGVsdGFMLCBUZW1wKTsKLSAgICAgICAgICAgIEN1cnJlbnRMID0gVGVtcDsKLSAgICAgICAgICAgIGlmIChDdXJyZW50TCA+IFRhcmdldEwpCi0gICAgICAgICAgICAgICAgQ3VycmVudEwgPSBUYXJnZXRMOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgQ3VycmVudEwgLT0gRGVsdGFMOwotICAgICAgICAgICAgaWYgKEN1cnJlbnRMIDwgVGFyZ2V0TCkKLSAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihDdXJyZW50UiA8IFRhcmdldFIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFERDJfU0FUX0ZMT0FUKEN1cnJlbnRSLCBEZWx0YVIsIFRlbXApOwotICAgICAgICAgICAgQ3VycmVudFIgPSBUZW1wOwotICAgICAgICAgICAgaWYgKEN1cnJlbnRSID4gVGFyZ2V0UikKLSAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBDdXJyZW50UiAtPSBEZWx0YVI7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudFIgPCBUYXJnZXRSKQotICAgICAgICAgICAgICAgIEN1cnJlbnRSID0gVGFyZ2V0UjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaWkgPSBPdXRMb29wICogMjsgaWkgIT0gMDsgaWkgLT0gMikKLSAgICAgICAgewotICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKLSAgICAgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRSKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGlpID0gSW5Mb29wICogMjsgaWkgIT0gMDsgaWktPTIpCi0gICAgewotICAgICAgICBpZihDdXJyZW50TCA8IFRhcmdldEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFERDJfU0FUX0ZMT0FUKEN1cnJlbnRMLCBEZWx0YUwsIFRlbXApOwotICAgICAgICAgICAgQ3VycmVudEwgPSBUZW1wOwotICAgICAgICAgICAgaWYgKEN1cnJlbnRMID4gVGFyZ2V0TCkKLSAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBDdXJyZW50TCAtPSBEZWx0YUw7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudEwgPCBUYXJnZXRMKQotICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKEN1cnJlbnRSIDwgVGFyZ2V0UikKLSAgICAgICAgewotICAgICAgICAgICAgQUREMl9TQVRfRkxPQVQoQ3VycmVudFIsIERlbHRhUiwgVGVtcCk7Ci0gICAgICAgICAgICBDdXJyZW50UiA9IFRlbXA7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudFIgPiBUYXJnZXRSKQotICAgICAgICAgICAgICAgIEN1cnJlbnRSID0gVGFyZ2V0UjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEN1cnJlbnRSIC09IERlbHRhUjsKLSAgICAgICAgICAgIGlmIChDdXJyZW50UiA8IFRhcmdldFIpCi0gICAgICAgICAgICAgICAgQ3VycmVudFIgPSBUYXJnZXRSOwotICAgICAgICB9Ci0KLSAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKLSAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKLSAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKLSAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKLSAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKLSAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKLSAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKLSAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKLSAgICB9Ci0gICAgcEluc3RhbmNlTC0+Q3VycmVudCA9IEN1cnJlbnRMOwotICAgIHBJbnN0YW5jZVItPkN1cnJlbnQgPSBDdXJyZW50UjsKLQotfQotI2lmZGVmIFNVUFBPUlRfTUMKLXZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfTUNfZmxvYXRfV1JBIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJDaGFubmVscykKLXsKLSAgICBMVk1fSU5UMzIgICBpaSwgY2g7Ci0gICAgTFZNX0ZMT0FUICAgVGVtcCA9MC4wZjsKLSAgICBMVk1fRkxPQVQgICB0ZW1wQ3VycmVudFtOckNoYW5uZWxzXTsKLSAgICBmb3IgKGNoID0gMDsgY2ggPCBOckNoYW5uZWxzOyBjaCsrKQotICAgIHsKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfTUNfZmxvYXRfV1JBKE1peF9Qcml2YXRlX0ZMT0FUX3N0KiogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpIHsKKyAgICBMVk1fSU5UMzIgaWksIGNoOworICAgIExWTV9GTE9BVCB0ZW1wQ3VycmVudFtOckNoYW5uZWxzXTsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBOckNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgIHRlbXBDdXJyZW50W2NoXSA9IHB0ckluc3RhbmNlW2NoXS0+Q3VycmVudDsKICAgICB9Ci0gICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSA+IDA7IGlpLS0pCi0gICAgewotICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBOckNoYW5uZWxzOyBjaCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqcEluc3RhbmNlID0gcHRySW5zdGFuY2VbY2hdOwotICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgRGVsdGEgPSBwSW5zdGFuY2UtPkRlbHRhOwotICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgQ3VycmVudCA9IHRlbXBDdXJyZW50W2NoXTsKLSAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgIFRhcmdldCA9IHBJbnN0YW5jZS0+VGFyZ2V0OwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQUREMl9TQVRfRkxPQVQoQ3VycmVudCwgRGVsdGEsIFRlbXApOwotICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUZW1wOwotICAgICAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQotICAgICAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeworICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgPiAwOyBpaS0tKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IE5yQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UgPSBwdHJJbnN0YW5jZVtjaF07CisgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgRGVsdGEgPSBwSW5zdGFuY2UtPkRlbHRhOworICAgICAgICAgICAgTFZNX0ZMT0FUIEN1cnJlbnQgPSB0ZW1wQ3VycmVudFtjaF07CisgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgVGFyZ2V0ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgeworICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBBREQyX1NBVF9GTE9BVChDdXJyZW50LCBEZWx0YSk7CisgICAgICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7Ci0gICAgICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCi0gICAgICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisgICAgICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqZHN0KysgPSAqc3JjKysgKiBDdXJyZW50OwogICAgICAgICAgICAgdGVtcEN1cnJlbnRbY2hdID0gQ3VycmVudDsKICAgICAgICAgfQogICAgIH0KLSAgICBmb3IgKGNoID0gMDsgY2ggPCBOckNoYW5uZWxzOyBjaCsrKQotICAgIHsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBOckNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgIHB0ckluc3RhbmNlW2NoXS0+Q3VycmVudCA9IHRlbXBDdXJyZW50W2NoXTsKICAgICB9CiB9Ci0jZW5kaWYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmNwcAppbmRleCA1ZDhhYWRjLi5mYzQ2NGU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmNwcApAQCAtMTgsNyArMTgsNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIElOQ0xVREUgRklMRVMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiAjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKICNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCiAjaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgpAQCAtMjYsODYgKzI1LDYyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTFZDb3JlX01JWFNPRlRfMVNUX0QxNkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbikKLXsKLSAgICBMVk1fSU5UMTYgICBPdXRMb29wOwotICAgIExWTV9JTlQxNiAgIEluTG9vcDsKLSAgICBMVk1fSU5UMzIgICBpaTsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZT0oTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOwotICAgIExWTV9GTE9BVCAgIERlbHRhPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+RGVsdGE7Ci0gICAgTFZNX0ZMT0FUICAgQ3VycmVudCA9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5DdXJyZW50OwotICAgIExWTV9GTE9BVCAgIFRhcmdldD0gKExWTV9GTE9BVClwSW5zdGFuY2UtPlRhcmdldDsKLSAgICBMVk1fRkxPQVQgICBUZW1wOwordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0KiBwdHJJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKSB7CisgICAgTFZNX0lOVDE2IE91dExvb3A7CisgICAgTFZNX0lOVDE2IEluTG9vcDsKKyAgICBMVk1fSU5UMzIgaWk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fRkxPQVQgRGVsdGEgPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0ZMT0FUIEN1cnJlbnQgPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgVGFyZ2V0ID0gKExWTV9GTE9BVClwSW5zdGFuY2UtPlRhcmdldDsKIAogICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLwogICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CiAKLSAgICBpZihDdXJyZW50PFRhcmdldCl7Ci0gICAgICAgIGlmIChPdXRMb29wKXsKKyAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgeworICAgICAgICBpZiAoT3V0TG9vcCkgeworICAgICAgICAgICAgQ3VycmVudCA9IExWTV9DbGFtcChDdXJyZW50ICsgRGVsdGEpOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CiAKLSAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7Ci0gICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAgICAgVGVtcCA9IDEuMGY7Ci0gICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCi0gICAgICAgICAgICAgICAgVGVtcCA9IC0xLjBmOwotCi0gICAgICAgICAgICBDdXJyZW50PVRlbXA7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OwotCi0gICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7Ci0gICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQpKTsKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgIEN1cnJlbnQgPSBMVk1fQ2xhbXAoQ3VycmVudCArIERlbHRhKTsKIAotICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KSBDdXJyZW50ID0gVGFyZ2V0OwogCi0gICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAgICAgVGVtcCA9IDEuMGY7Ci0gICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCi0gICAgICAgICAgICAgICAgVGVtcCA9IC0xLjBmOwotCi0gICAgICAgICAgICBDdXJyZW50PVRlbXA7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OwotCi0gICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpICk7Ci0gICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpICk7Ci0gICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpICk7Ci0gICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpICk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkgKiAoc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSAqIChzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkgKiAoc3JjKyspICogQ3VycmVudCkpOwogICAgICAgICB9Ci0gICAgfQotICAgIGVsc2V7Ci0gICAgICAgIGlmIChPdXRMb29wKXsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoT3V0TG9vcCkgewogICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKLSAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQotICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgQ3VycmVudCA9IFRhcmdldDsKIAotICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pewotICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkgKiAoc3JjKyspICogQ3VycmVudCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pIHsKICAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CiAKLSAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOwotICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7Ci0gICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKLSAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSAqIChzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkgKiAoc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIEN1cnJlbnQpKTsKICAgICAgICAgfQogICAgIH0KLSAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OwogfQogCi0jaWZkZWYgU1VQUE9SVF9NQwogLyoKICAqIEZVTkNUSU9OOiAgICAgICBMVkNfQ29yZV9NaXhTb2Z0X01jX0QxNkMzMV9XUkEKICAqCkBAIC0xMjMsMjAgKzk4LDE1IEBACiAgKiAgdm9pZAogICoKICAqLwotdm9pZCBMVkNfQ29yZV9NaXhTb2Z0X01jX0QxNkMzMV9XUkEoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIE5yQ2hhbm5lbHMpCi17Ci0gICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKLSAgICBMVk1fSU5UMTYgICBJbkxvb3A7Ci0gICAgTFZNX0lOVDMyICAgaWksIGpqOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+UHJpdmF0ZVBhcmFtcyk7Ci0gICAgTFZNX0ZMT0FUICAgRGVsdGE9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5EZWx0YTsKLSAgICBMVk1fRkxPQVQgICBDdXJyZW50ID0gKExWTV9GTE9BVClwSW5zdGFuY2UtPkN1cnJlbnQ7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0PSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+VGFyZ2V0OwotICAgIExWTV9GTE9BVCAgIFRlbXA7Cit2b2lkIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQShMVk1peGVyM19GTE9BVF9zdCogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpIHsKKyAgICBMVk1fSU5UMTYgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgSW5Mb29wOworICAgIExWTV9JTlQzMiBpaSwgamo7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fRkxPQVQgRGVsdGEgPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0ZMT0FUIEN1cnJlbnQgPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgVGFyZ2V0ID0gKExWTV9GTE9BVClwSW5zdGFuY2UtPlRhcmdldDsKIAogICAgIC8qCiAgICAgICogU2FtZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIG9uIGNvbnNlY3V0aXZlIGZyYW1lcy4KQEAgLTE0Nyw3MyArMTE3LDUwIEBACiAgICAgLyogT3V0TG9vcCBpcyBjYWxjdWxhdGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBOckZyYW1lcyB2YWx1ZSBjYW4gYmUgb2RkLiovCiAgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKE5yRnJhbWVzIC0gKEluTG9vcCA8PCAxKSk7CiAKLSAgICBpZiAoQ3VycmVudDxUYXJnZXQpIHsKKyAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgewogICAgICAgICBpZiAoT3V0TG9vcCkgewotCi0gICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOwotICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQotICAgICAgICAgICAgICAgIFRlbXAgPSAxLjBmOwotICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgICAgIFRlbXAgPSAtMS4wZjsKLQotICAgICAgICAgICAgQ3VycmVudD1UZW1wOwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKyAgICAgICAgICAgIEN1cnJlbnQgPSBMVk1fQ2xhbXAoQ3VycmVudCArIERlbHRhKTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KSBDdXJyZW50ID0gVGFyZ2V0OwogCiAgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSkgewotICAgICAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPTA7IGpqLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMDsgamotLSkgeworICAgICAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkgKiAoc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50KSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgQ3VycmVudCA9IExWTV9DbGFtcChDdXJyZW50ICsgRGVsdGEpOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CiAKLSAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7Ci0KLSAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKLSAgICAgICAgICAgICAgICBUZW1wID0gMS4wZjsKLSAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKLSAgICAgICAgICAgICAgICBUZW1wID0gLTEuMGY7Ci0KLSAgICAgICAgICAgIEN1cnJlbnQ9VGVtcDsKLSAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQotICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7Ci0KLSAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwIDsgamotLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKLSAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwOyBqai0tKSB7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkgKiAoc3JjKyspICogQ3VycmVudCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfQotICAgIGVsc2V7CisgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKE91dExvb3ApIHsKICAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CiAKICAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9MDsgamotLSkgewotICAgICAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudCkpOworICAgICAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwOyBqai0tKSB7CisgICAgICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSAqIChzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KSBDdXJyZW50ID0gVGFyZ2V0OwogCi0gICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMCA7IGpqLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7Ci0gICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMDsgamotLSkgeworICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSAqIChzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIEN1cnJlbnQpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OwogfQotI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jcHAKaW5kZXggMmJlYzNiZS4uMjcwYzdlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuY3BwCkBAIC0yNywzOSArMjcsMzUgQEAKICAgIERFRklOSVRJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBUUlVFICAgICAgICAgIDEKLSNkZWZpbmUgRkFMU0UgICAgICAgICAwCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGQUxTRSAwCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBNSVhJTlNPRlRfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKQotewotICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOwotICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7Cit2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QqIHB0ckluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbikgeworICAgIGNoYXIgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZSA9CisgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CiAKLSAgICBpZihuIDw9IDApICAgIHJldHVybjsKKyAgICBpZiAobiA8PSAwKSByZXR1cm47CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgU09GVCBNSVhJTkcKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCi0gICAgewotICAgICAgICBpZihwSW5zdGFuY2UtPkRlbHRhID09IDEuMGYpeworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+RGVsdGEgPT0gMS4wZikgewogICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CiAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgIH1lbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgIH0gZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLwogICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOwotICAgICAgICB9ZWxzZXsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCiAgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CiAgICAgICAgICAgICBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYywgZHN0LCBuKTsKQEAgLTcwLDExMSArNjYsMTIgQEAKICAgICAgICBIQVJEIE1JWElORwogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgICBpZiAoSGFyZE1peGluZyl7Ci0gICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCAhPSAwKXsgLyogTm90aGluZyB0byBkbyBpbiBjYXNlIFRhcmdldCA9IDAgKi8KLSAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQpID09IDEuMGYpewotICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHNyYywgZHN0LCBuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHNyYywgKHBJbnN0YW5jZS0+VGFyZ2V0KSwgZHN0LCBuKTsKLSAgICAgICAgICAgICAgICAvKiBJbiBjYXNlIHRoZSBMVkNvcmUgZnVuY3Rpb24gd291bGQgaGF2ZSBjaGFuZ2VkIHRoZSBDdXJyZW50IHZhbHVlICovCi0gICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgQ0FMTCBCQUNLCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpewotICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpewotICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCi0gICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKLSAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApewotICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotI2lmZGVmIFNVUFBPUlRfTUMKLS8qCi0gKiBGVU5DVElPTjogICAgICAgTFZDX01peEluU29mdF9NY19EMTZDMzFfU0FUCi0gKgotICogREVTQ1JJUFRJT046Ci0gKiAgTWl4ZXIgZnVuY3Rpb24gd2l0aCBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIG11bHRpY2hhbm5lbCBpbnB1dAotICoKLSAqIFBBUkFNRVRFUlM6Ci0gKiAgcHRySW5zdGFuY2UgICAgSW5zdGFuY2UgcG9pbnRlcgotICogIHNyYyAgICAgICAgICAgIFNvdXJjZQotICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCi0gKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcwotICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscwotICoKLSAqIFJFVFVSTlM6Ci0gKiAgdm9pZAotICoKLSAqLwotdm9pZCBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJDaGFubmVscykKLXsKLSAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKLSAgICBMVk1fRkxPQVQgICBUYXJnZXRHYWluOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOwotCi0gICAgaWYgKE5yRnJhbWVzIDw9IDApICAgIHJldHVybjsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICBTT0ZUIE1JWElORwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkKLSAgICB7Ci0gICAgICAgIGlmIChwSW5zdGFuY2UtPkRlbHRhID09IDEuMGYpIHsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OwotICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OwotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOwotICAgICAgICB9ZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpIHsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLwotICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OwotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCi0gICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7Ci0gICAgICAgICAgICBMVkNfQ29yZV9NaXhJblNvZnRfTWNfRDE2QzMxX1NBVCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgIEhBUkQgTUlYSU5HCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogICAgIGlmIChIYXJkTWl4aW5nKSB7CiAgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCAhPSAwKSB7IC8qIE5vdGhpbmcgdG8gZG8gaW4gY2FzZSBUYXJnZXQgPSAwICovCiAgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSA9PSAxLjBmKSB7Ci0gICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQoc3JjLCBkc3QsIE5yRnJhbWVzKk5yQ2hhbm5lbHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQoc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5UYXJnZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzICogTnJDaGFubmVscyk7CisgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQoc3JjLCBkc3QsIG4pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQoc3JjLCAocEluc3RhbmNlLT5UYXJnZXQpLCBkc3QsIG4pOwogICAgICAgICAgICAgICAgIC8qIEluIGNhc2UgdGhlIExWQ29yZSBmdW5jdGlvbiB3b3VsZCBoYXZlIGNoYW5nZWQgdGhlIEN1cnJlbnQgdmFsdWUgKi8KICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKICAgICAgICAgICAgIH0KQEAgLTE5MywxNSArOTAsOTcgQEAKICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtLCBUYXJnZXRHYWluKTsKICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOwogICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCkgewotICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0pOworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykoCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBNaXhlciBmdW5jdGlvbiB3aXRoIHN1cHBvcnQgZm9yIHByb2Nlc3NpbmcgbXVsdGljaGFubmVsIGlucHV0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBwdHJJbnN0YW5jZSAgICBJbnN0YW5jZSBwb2ludGVyCisgKiAgc3JjICAgICAgICAgICAgU291cmNlCisgKiAgZHN0ICAgICAgICAgICAgRGVzdGluYXRpb24KKyAqICBOckZyYW1lcyAgICAgICBOdW1iZXIgb2YgZnJhbWVzCisgKiAgTnJDaGFubmVscyAgICAgTnVtYmVyIG9mIGNoYW5uZWxzCisgKgorICogUkVUVVJOUzoKKyAqICB2b2lkCisgKgorICovCit2b2lkIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QqIHB0ckluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgTnJGcmFtZXMsIExWTV9JTlQxNiBOckNoYW5uZWxzKSB7CisgICAgY2hhciBIYXJkTWl4aW5nID0gVFJVRTsKKyAgICBMVk1fRkxPQVQgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlID0KKyAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKworICAgIGlmIChOckZyYW1lcyA8PSAwKSByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+RGVsdGEgPT0gMS4wZikgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH0gZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIExWQ19Db3JlX01peEluU29mdF9NY19EMTZDMzFfU0FUKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgc3JjLCBkc3QsIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ICE9IDApIHsgLyogTm90aGluZyB0byBkbyBpbiBjYXNlIFRhcmdldCA9IDAgKi8KKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQpID09IDEuMGYpIHsKKyAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChzcmMsIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHNyYywgKHBJbnN0YW5jZS0+VGFyZ2V0KSwgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIC8qIEluIGNhc2UgdGhlIExWQ29yZSBmdW5jdGlvbiB3b3VsZCBoYXZlIGNoYW5nZWQgdGhlIEN1cnJlbnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCkgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW0sIFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKSB7CisgICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQotI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuY3BwCmluZGV4IDMxNTNhZGEuLmIwYWExNzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jcHAKQEAgLTI5LDE0NCArMjksMTE4IEBACiAgICBERUZJTklUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgVFJVRSAgICAgICAgICAxCi0jZGVmaW5lIEZBTFNFICAgICAgICAgMAorI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAogCiAjZGVmaW5lIEFSUkFZX1NJWkUoYSkgKChzaXplb2YoYSkpIC8gKHNpemVvZigqKGEpKSkpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVAorICAgRlVOQ1RJT04gTFZDX01peFNvZnRfMVN0X01DX2Zsb2F0X1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgU1VQUE9SVF9NQwogLyogVGhpcyB0aHJlc2hvbGQgaXMgdXNlZCB0byBkZWNpZGUgb24gdGhlIHByb2Nlc3NpbmcgdG8gYmUgYXBwbGllZCBvbgogICogZnJvbnQgY2VudGVyIGFuZCBiYWNrIGNlbnRlciBjaGFubmVscwogICovCiAjZGVmaW5lIExWTV9WT0xfQkFMX1RIUiAoMC4wMDAwMTZmKQotdm9pZCBMVkNfTWl4U29mdF8xU3RfTUNfZmxvYXRfU0FUIChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICBOckNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgIENoTWFzaykKLXsKLSAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKLSAgICBMVk1fRkxPQVQgICBUYXJnZXRHYWluOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICBUYXJnZXRfbGZlID0ge0xWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVR9OwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICBUYXJnZXRfY3RyID0ge0xWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVR9OwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UyID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5Qcml2YXRlUGFyYW1zKTsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBNaXhQcml2SW5zdFs0XSA9IHtwSW5zdGFuY2UxLCBwSW5zdGFuY2UyLCAmVGFyZ2V0X2N0ciwgJlRhcmdldF9sZmV9OwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlW05yQ2hhbm5lbHNdOwordm9pZCBMVkNfTWl4U29mdF8xU3RfTUNfZmxvYXRfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgTnJGcmFtZXMsIExWTV9JTlQzMiBOckNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBDaE1hc2spIHsKKyAgICBjaGFyIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9GTE9BVCBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0IFRhcmdldF9sZmUgPSB7TFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVH07CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgVGFyZ2V0X2N0ciA9IHtMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FUfTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlMSA9CisgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZTIgPQorICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0KikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwTWl4UHJpdkluc3RbNF0gPSB7cEluc3RhbmNlMSwgcEluc3RhbmNlMiwgJlRhcmdldF9jdHIsICZUYXJnZXRfbGZlfTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlW05yQ2hhbm5lbHNdOwogCi0gICAgaWYgKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24oQ2hNYXNrKQotICAgICAgICAgICAgPT0gQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9JTkRFWCkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKQotICAgICAgICB7CisgICAgaWYgKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24oQ2hNYXNrKSA9PSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX0lOREVYKSB7CisgICAgICAgIGludCBsb29wTGltaXQgPSAoTnJDaGFubmVscyA9PSBGQ0NfMSkgPyBOckNoYW5uZWxzIDogRkNDXzI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9vcExpbWl0OyBpKyspIHsKICAgICAgICAgICAgIHBJbnN0YW5jZVtpXSA9IHBNaXhQcml2SW5zdFtpXTsKICAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMjsgaSA8IE5yQ2hhbm5lbHM7IGkrKykKLSAgICAgICAgeworICAgICAgICBmb3IgKGludCBpID0gbG9vcExpbWl0OyBpIDwgTnJDaGFubmVsczsgaSsrKSB7CiAgICAgICAgICAgICBwSW5zdGFuY2VbaV0gPSBwTWl4UHJpdkluc3RbMl07CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgICAvLyBUT0RPOiBDb21iaW5lIHdpdGggc3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL0JhbGFuY2UuY3BwCiAgICAgICAgIC8vIENvbnN0YW50cyBpbiBzeXN0ZW0vbWVkaWEvYXVkaW8vaW5jbHVkZS9zeXN0ZW0vYXVkaW8tYmFzZS5oCiAgICAgICAgIC8vICdtaXhJbnN0SWR4JyBpcyB1c2VkIHRvIG1hcCB0aGUgYXBwcm9wcmlhdGUgbWl4ZXIgaW5zdGFuY2UgZm9yIGVhY2ggY2hhbm5lbC4KICAgICAgICAgY29uc3QgaW50IG1peEluc3RJZHhbXSA9IHsKLSAgICAgICAgICAgIDAsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQgICAgICAgICAgICA9IDB4MXUsCi0gICAgICAgICAgICAxLCAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVCAgICAgICAgICAgPSAweDJ1LAotICAgICAgICAgICAgMiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSICAgICAgICAgID0gMHg0dSwKLSAgICAgICAgICAgIDMsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kgICAgICAgICA9IDB4OHUsCi0gICAgICAgICAgICAwLCAvLyBBVURJT19DSEFOTkVMX09VVF9CQUNLX0xFRlQgICAgICAgICAgICAgPSAweDEwdSwKLSAgICAgICAgICAgIDEsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfUklHSFQgICAgICAgICAgICA9IDB4MjB1LAotICAgICAgICAgICAgMCwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVF9PRl9DRU5URVIgID0gMHg0MHUsCi0gICAgICAgICAgICAxLCAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVF9PRl9DRU5URVIgPSAweDgwdSwKLSAgICAgICAgICAgIDIsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSICAgICAgICAgICA9IDB4MTAwdSwKLSAgICAgICAgICAgIDAsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfTEVGVCAgICAgICAgICAgICA9IDB4MjAwdSwKLSAgICAgICAgICAgIDEsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfUklHSFQgICAgICAgICAgICA9IDB4NDAwdSwKLSAgICAgICAgICAgIDIsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9DRU5URVIgICAgICAgICAgICA9IDB4ODAwdSwKLSAgICAgICAgICAgIDAsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9MRUZUICAgICAgICA9IDB4MTAwMHUsCi0gICAgICAgICAgICAyLCAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfQ0VOVEVSICAgICAgPSAweDIwMDB1LAotICAgICAgICAgICAgMSwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX1JJR0hUICAgICAgID0gMHg0MDAwdSwKLSAgICAgICAgICAgIDAsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0xFRlQgICAgICAgICA9IDB4ODAwMHUsCi0gICAgICAgICAgICAyLCAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19DRU5URVIgICAgICAgPSAweDEwMDAwdSwKLSAgICAgICAgICAgIDEsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX1JJR0hUICAgICAgICA9IDB4MjAwMDB1LAotICAgICAgICAgICAgMCwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX1NJREVfTEVGVCAgICAgICAgID0gMHg0MDAwMHUsCi0gICAgICAgICAgICAxLCAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfU0lERV9SSUdIVCAgICAgICAgPSAweDgwMDAwdQorICAgICAgICAgICAgICAgIDAsICAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUICAgICAgICAgICAgPSAweDF1LAorICAgICAgICAgICAgICAgIDEsICAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVCAgICAgICAgICAgPSAweDJ1LAorICAgICAgICAgICAgICAgIDIsICAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIgICAgICAgICAgPSAweDR1LAorICAgICAgICAgICAgICAgIDMsICAvLyBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZICAgICAgICAgPSAweDh1LAorICAgICAgICAgICAgICAgIDAsICAvLyBBVURJT19DSEFOTkVMX09VVF9CQUNLX0xFRlQgICAgICAgICAgICAgPSAweDEwdSwKKyAgICAgICAgICAgICAgICAxLCAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19SSUdIVCAgICAgICAgICAgID0gMHgyMHUsCisgICAgICAgICAgICAgICAgMCwgIC8vIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlRfT0ZfQ0VOVEVSICA9IDB4NDB1LAorICAgICAgICAgICAgICAgIDEsICAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVF9PRl9DRU5URVIgPSAweDgwdSwKKyAgICAgICAgICAgICAgICAyLCAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIgICAgICAgICAgID0gMHgxMDB1LAorICAgICAgICAgICAgICAgIDAsICAvLyBBVURJT19DSEFOTkVMX09VVF9TSURFX0xFRlQgICAgICAgICAgICAgPSAweDIwMHUsCisgICAgICAgICAgICAgICAgMSwgIC8vIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfUklHSFQgICAgICAgICAgICA9IDB4NDAwdSwKKyAgICAgICAgICAgICAgICAyLCAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0NFTlRFUiAgICAgICAgICAgID0gMHg4MDB1LAorICAgICAgICAgICAgICAgIDAsICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfTEVGVCAgICAgICAgPSAweDEwMDB1LAorICAgICAgICAgICAgICAgIDIsICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfQ0VOVEVSICAgICAgPSAweDIwMDB1LAorICAgICAgICAgICAgICAgIDEsICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfUklHSFQgICAgICAgPSAweDQwMDB1LAorICAgICAgICAgICAgICAgIDAsICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19MRUZUICAgICAgICAgPSAweDgwMDB1LAorICAgICAgICAgICAgICAgIDIsICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19DRU5URVIgICAgICAgPSAweDEwMDAwdSwKKyAgICAgICAgICAgICAgICAxLCAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfUklHSFQgICAgICAgID0gMHgyMDAwMHUsCisgICAgICAgICAgICAgICAgMCwgIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9TSURFX0xFRlQgICAgICAgICA9IDB4NDAwMDB1LAorICAgICAgICAgICAgICAgIDEsICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfU0lERV9SSUdIVCAgICAgICAgPSAweDgwMDAwdQogICAgICAgICB9OwotICAgICAgICBpZiAocEluc3RhbmNlMS0+VGFyZ2V0IDw9IExWTV9WT0xfQkFMX1RIUiB8fAotICAgICAgICAgICAgcEluc3RhbmNlMi0+VGFyZ2V0IDw9IExWTV9WT0xfQkFMX1RIUikKLSAgICAgICAgewotICAgICAgICAgICAgVGFyZ2V0X2N0ci5UYXJnZXQgID0gMC4wZjsKKyAgICAgICAgaWYgKHBJbnN0YW5jZTEtPlRhcmdldCA8PSBMVk1fVk9MX0JBTF9USFIgfHwgcEluc3RhbmNlMi0+VGFyZ2V0IDw9IExWTV9WT0xfQkFMX1RIUikgeworICAgICAgICAgICAgVGFyZ2V0X2N0ci5UYXJnZXQgPSAwLjBmOwogICAgICAgICAgICAgVGFyZ2V0X2N0ci5DdXJyZW50ID0gMC4wZjsKLSAgICAgICAgICAgIFRhcmdldF9jdHIuRGVsdGEgICA9IDAuMGY7CisgICAgICAgICAgICBUYXJnZXRfY3RyLkRlbHRhID0gMC4wZjsKICAgICAgICAgfQogICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgaWR4QXJyU2l6ZSA9IEFSUkFZX1NJWkUobWl4SW5zdElkeCk7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBjaGFubmVsID0gQ2hNYXNrOyBjaGFubmVsICE9MCA7ICsraSkKLSAgICAgICAgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgY2hhbm5lbCA9IENoTWFzazsgY2hhbm5lbCAhPSAwOyArK2kpIHsKICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBpZHggPSBfX2J1aWx0aW5fY3R6KGNoYW5uZWwpOwotICAgICAgICAgICAgaWYgKGlkeCA8IGlkeEFyclNpemUpCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoaWR4IDwgaWR4QXJyU2l6ZSkgewogICAgICAgICAgICAgICAgIHBJbnN0YW5jZVtpXSA9IHBNaXhQcml2SW5zdFttaXhJbnN0SWR4W2lkeF1dOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBwSW5zdGFuY2VbaV0gPSBwTWl4UHJpdkluc3RbMl07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjaGFubmVsICY9IH4oMSA8PCBpZHgpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKE5yRnJhbWVzIDw9IDApICAgIHJldHVybjsKKyAgICBpZiAoTnJGcmFtZXMgPD0gMCkgcmV0dXJuOwogCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIFNPRlQgTUlYSU5HCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogICAgIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCAhPSBwSW5zdGFuY2UxLT5UYXJnZXQpIHx8Ci0gICAgICAgIChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpCi0gICAgeworICAgICAgICAocEluc3RhbmNlMi0+Q3VycmVudCAhPSBwSW5zdGFuY2UyLT5UYXJnZXQpKSB7CiAgICAgICAgIC8vIFRPRE86IGNvbWJpbmUgc2ltaWxhciBjaGVja3MgYmVsb3cuCi0gICAgICAgIGlmIChwSW5zdGFuY2UxLT5EZWx0YSA9PSBMVk1fTUFYRkxPQVQKLSAgICAgICAgICAgICAgICB8fCBBYnNfRmxvYXQocEluc3RhbmNlMS0+Q3VycmVudCAtIHBJbnN0YW5jZTEtPlRhcmdldCkgPCBwSW5zdGFuY2UxLT5EZWx0YSkKLSAgICAgICAgeworICAgICAgICBpZiAocEluc3RhbmNlMS0+RGVsdGEgPT0gTFZNX01BWEZMT0FUIHx8CisgICAgICAgICAgICBBYnNfRmxvYXQocEluc3RhbmNlMS0+Q3VycmVudCAtIHBJbnN0YW5jZTEtPlRhcmdldCkgPCBwSW5zdGFuY2UxLT5EZWx0YSkgewogICAgICAgICAgICAgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gTWFrZSB0aGVtIGVxdWFsLiAqLwogICAgICAgICAgICAgcEluc3RhbmNlMS0+Q3VycmVudCA9IHBJbnN0YW5jZTEtPlRhcmdldDsKICAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UxLT5UYXJnZXQ7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLwogICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKEhhcmRNaXhpbmcgPT0gVFJVRSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBJbnN0YW5jZTItPkRlbHRhID09IExWTV9NQVhGTE9BVAotICAgICAgICAgICAgICAgICAgICB8fCBBYnNfRmxvYXQocEluc3RhbmNlMi0+Q3VycmVudCAtIHBJbnN0YW5jZTItPlRhcmdldCkgPCBwSW5zdGFuY2UyLT5EZWx0YSkKLSAgICAgICAgICAgIHsKKyAgICAgICAgaWYgKEhhcmRNaXhpbmcgPT0gVFJVRSkgeworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZTItPkRlbHRhID09IExWTV9NQVhGTE9BVCB8fAorICAgICAgICAgICAgICAgIEFic19GbG9hdChwSW5zdGFuY2UyLT5DdXJyZW50IC0gcEluc3RhbmNlMi0+VGFyZ2V0KSA8IHBJbnN0YW5jZTItPkRlbHRhKSB7CiAgICAgICAgICAgICAgICAgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gTWFrZSB0aGVtIGVxdWFsLiAqLwogICAgICAgICAgICAgICAgIHBJbnN0YW5jZTItPkN1cnJlbnQgPSBwSW5zdGFuY2UyLT5UYXJnZXQ7CiAgICAgICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTItPlRhcmdldDsKICAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCiAgICAgICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKEhhcmRNaXhpbmcgPT0gRkFMU0UpCi0gICAgICAgIHsKLSAgICAgICAgICAgICBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9NQ19mbG9hdF9XUkEgKCZwSW5zdGFuY2VbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICAgICAgaWYgKEhhcmRNaXhpbmcgPT0gRkFMU0UpIHsKKyAgICAgICAgICAgIExWQ19Db3JlX01peFNvZnRfMVN0X01DX2Zsb2F0X1dSQSgmcEluc3RhbmNlWzBdLCBzcmMsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNzQsMTkgKzE0OCwxMyBAQAogICAgICAgIEhBUkQgTUlYSU5HCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgIGlmIChIYXJkTWl4aW5nID09IFRSVUUpCi0gICAgewotICAgICAgICBpZiAoKHBJbnN0YW5jZTEtPlRhcmdldCA9PSBMVk1fTUFYRkxPQVQpICYmIChwSW5zdGFuY2UyLT5UYXJnZXQgPT0gTFZNX01BWEZMT0FUKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNyYyAhPSBkc3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgTnJGcmFtZXMqTnJDaGFubmVscyk7CisgICAgaWYgKEhhcmRNaXhpbmcgPT0gVFJVRSkgeworICAgICAgICBpZiAoKHBJbnN0YW5jZTEtPlRhcmdldCA9PSBMVk1fTUFYRkxPQVQpICYmIChwSW5zdGFuY2UyLT5UYXJnZXQgPT0gTFZNX01BWEZMT0FUKSkgeworICAgICAgICAgICAgaWYgKHNyYyAhPSBkc3QpIHsKKyAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHNyYywgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8xU3RfTUNfZmxvYXRfU0FUKCYocEluc3RhbmNlWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExWQ19Db3JlX01peEhhcmRfMVN0X01DX2Zsb2F0X1NBVCgmKHBJbnN0YW5jZVswXSksIHNyYywgZHN0LCBOckZyYW1lcywgTnJDaGFubmVscyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE5NCwxNzIgKzE2MiwzNCBAQAogICAgICAgIENBTEwgQkFDSwogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KQotICAgIHsKLSAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UxLT5DdXJyZW50IC0gcEluc3RhbmNlMS0+VGFyZ2V0KSA8IHBJbnN0YW5jZTEtPkRlbHRhKQotICAgICAgICB7CisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCkgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTEtPkN1cnJlbnQgLSBwSW5zdGFuY2UxLT5UYXJnZXQpIDwgcEluc3RhbmNlMS0+RGVsdGEpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KICAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UxLT5UYXJnZXQ7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sIFRhcmdldEdhaW4pOwogICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7Ci0gICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKFwKLSAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0pOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykoCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0KQotICAgIHsKLSAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UyLT5DdXJyZW50IC0gcEluc3RhbmNlMi0+VGFyZ2V0KSA8IHBJbnN0YW5jZTItPkRlbHRhKQotICAgICAgICB7CisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCkgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTItPkN1cnJlbnQgLSBwSW5zdGFuY2UyLT5UYXJnZXQpIDwgcEluc3RhbmNlMi0+RGVsdGEpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZTItPkN1cnJlbnQgPSBwSW5zdGFuY2UyLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCiAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMi0+VGFyZ2V0OwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLCBUYXJnZXRHYWluKTsKICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2spIChcCi0gICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wR2VuZXJhbFB1cnBvc2UsCi0gICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtKTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2spKAorICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9Ci0jZW5kaWYKLXZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pCi17Ci0gICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTEgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMiA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uUHJpdmF0ZVBhcmFtcyk7Ci0KLSAgICBpZihuIDw9IDApICAgIHJldHVybjsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICBTT0ZUIE1JWElORwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ICE9IHBJbnN0YW5jZTEtPlRhcmdldCkgfHwgKHBJbnN0YW5jZTItPkN1cnJlbnQgIT0gcEluc3RhbmNlMi0+VGFyZ2V0KSkKLSAgICB7Ci0gICAgICAgIGlmKHBJbnN0YW5jZTEtPkRlbHRhID09IDEuMGYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7Ci0gICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMS0+VGFyZ2V0OwotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UxLT5DdXJyZW50IC0gcEluc3RhbmNlMS0+VGFyZ2V0KSA8IHBJbnN0YW5jZTEtPkRlbHRhKQotICAgICAgICB7Ci0gICAgICAgICAgICBwSW5zdGFuY2UxLT5DdXJyZW50ID0gcEluc3RhbmNlMS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCi0gICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMS0+VGFyZ2V0OwotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KLSAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKEhhcmRNaXhpbmcgPT0gVFJVRSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocEluc3RhbmNlMi0+RGVsdGEgPT0gMS4wZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwSW5zdGFuY2UyLT5DdXJyZW50ID0gcEluc3RhbmNlMi0+VGFyZ2V0OwotICAgICAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UyLT5UYXJnZXQ7Ci0gICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIFRhcmdldEdhaW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTItPkN1cnJlbnQgLSBwSW5zdGFuY2UyLT5UYXJnZXQpIDwgcEluc3RhbmNlMi0+RGVsdGEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEluc3RhbmNlMi0+Q3VycmVudCA9IHBJbnN0YW5jZTItPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KLSAgICAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMi0+VGFyZ2V0OwotICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLCBUYXJnZXRHYWluKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLwotICAgICAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKEhhcmRNaXhpbmcgPT0gRkFMU0UpCi0gICAgICAgIHsKLSAgICAgICAgICAgICBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCAmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgZHN0LCBuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICBIQVJEIE1JWElORwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBpZiAoSGFyZE1peGluZykKLSAgICB7Ci0gICAgICAgIGlmICgocEluc3RhbmNlMS0+VGFyZ2V0ID09IDEuMGYpICYmIChwSW5zdGFuY2UyLT5UYXJnZXQgPT0gMS4wZikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHNyYyAhPSBkc3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsIGRzdCwgbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgQ0FMTCBCQUNLCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpCi0gICAgewotICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTEtPkN1cnJlbnQgLSBwSW5zdGFuY2UxLT5UYXJnZXQpIDwgcEluc3RhbmNlMS0+RGVsdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KLSAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UxLT5UYXJnZXQ7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sIFRhcmdldEdhaW4pOwotICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7Ci0gICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCkKLSAgICB7Ci0gICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlMi0+Q3VycmVudCAtIHBJbnN0YW5jZTItPlRhcmdldCkgPCBwSW5zdGFuY2UyLT5EZWx0YSkKLSAgICAgICAgewotICAgICAgICAgICAgcEluc3RhbmNlMi0+Q3VycmVudCA9IHBJbnN0YW5jZTItPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KLSAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UyLT5UYXJnZXQ7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sIFRhcmdldEdhaW4pOwotICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID0gRkFMU0U7Ci0gICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjaykgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wR2VuZXJhbFB1cnBvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jcHAKaW5kZXggNGQyMjlkYS4uNWE2N2JkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmNwcApAQCAtMTksNiArMTksNyBAQAogICAgSU5DTFVERSBGSUxFUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKICNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCkBAIC0yNywzOSArMjgsMzUgQEAKICAgIERFRklOSVRJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBUUlVFICAgICAgICAgIDEKLSNkZWZpbmUgRkFMU0UgICAgICAgICAwCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGQUxTRSAwCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVk1peGVyM19NSVhTT0ZUXzFTVF9EMTZDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pCi17Ci0gICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKK3ZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0KiBwdHJJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbikgeworICAgIGNoYXIgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZSA9CisgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CiAKLSAgICBpZihuIDw9IDApICAgIHJldHVybjsKKyAgICBpZiAobiA8PSAwKSByZXR1cm47CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgU09GVCBNSVhJTkcKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCi0gICAgewotICAgICAgICBpZihwSW5zdGFuY2UtPkRlbHRhID09IDEuMGYpeworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+RGVsdGEgPT0gMS4wZikgewogICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CiAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgIH1lbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgIH0gZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLwogICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOwotICAgICAgICB9ZWxzZXsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCiAgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CiAgICAgICAgICAgICBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgc3JjLCBkc3QsIG4pOwpAQCAtNzAsMzkgKzY3LDM3IEBACiAgICAgICAgSEFSRCBNSVhJTkcKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gICAgaWYgKEhhcmRNaXhpbmcpeworICAgIGlmIChIYXJkTWl4aW5nKSB7CiAgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA9PSAwKQotICAgICAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAuMCwgZHN0LCBuKTsKKyAgICAgICAgICAgIG1lbXNldChkc3QsIDAsIG4gKiBzaXplb2YoKmRzdCkpOwogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQpICE9IDEuMGYpCiAgICAgICAgICAgICAgICAgTXVsdDNzX0Zsb2F0KHNyYywgKHBJbnN0YW5jZS0+VGFyZ2V0KSwgZHN0LCBuKTsKLSAgICAgICAgICAgIGVsc2UgaWYoc3JjICE9IGRzdCkKKyAgICAgICAgICAgIGVsc2UgaWYgKHNyYyAhPSBkc3QpCiAgICAgICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgbik7CiAgICAgICAgIH0KLQogICAgIH0KIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICBDQUxMIEJBQ0sKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCl7Ci0gICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCkgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLwogICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW0sIFRhcmdldEdhaW4pOwogICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7Ci0gICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKXsKLSAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spICggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykoCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KLSNpZmRlZiBTVVBQT1JUX01DCiAvKgogICogRlVOQ1RJT046ICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQKICAqCkBAIC0xMjAsNDAgKzExNSwzMiBAQAogICogIHZvaWQKICAqCiAgKi8KLXZvaWQgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICBOckNoYW5uZWxzKQotewotICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOwotICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7Cit2b2lkIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0KiBwdHJJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpIHsKKyAgICBjaGFyIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9GTE9BVCBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UgPQorICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0KikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOwogCi0gICAgaWYgKE5yRnJhbWVzIDw9IDApICAgIHJldHVybjsKKyAgICBpZiAoTnJGcmFtZXMgPD0gMCkgcmV0dXJuOwogCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIFNPRlQgTUlYSU5HCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQotICAgIHsKKyAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KSB7CiAgICAgICAgIGlmIChwSW5zdGFuY2UtPkRlbHRhID09IDEuMGYpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OwogICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOwotICAgICAgICB9ZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpIHsKKyAgICAgICAgfSBlbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgewogICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCiAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgIH1lbHNleworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KICAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKLSAgICAgICAgICAgIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQSgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQSgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYywgZHN0LCBOckZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKICAgICAgICAgfQogICAgIH0KQEAgLTE2NCwxNCArMTUxLDEzIEBACiAKICAgICBpZiAoSGFyZE1peGluZykgewogICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPT0gMCkKLSAgICAgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLjAsIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICAgICAgICAgIG1lbXNldChkc3QsIDAsIE5yRnJhbWVzICogTnJDaGFubmVscyAqIHNpemVvZigqZHN0KSk7CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgIT0gMS4wZikKICAgICAgICAgICAgICAgICBNdWx0M3NfRmxvYXQoc3JjLCAocEluc3RhbmNlLT5UYXJnZXQpLCBkc3QsIE5yRnJhbWVzICogTnJDaGFubmVscyk7CiAgICAgICAgICAgICBlbHNlIGlmIChzcmMgIT0gZHN0KQogICAgICAgICAgICAgICAgIENvcHlfRmxvYXQoc3JjLCBkc3QsIE5yRnJhbWVzICogTnJDaGFubmVscyk7CiAgICAgICAgIH0KLQogICAgIH0KIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE4NiwxNSArMTcyLDEzIEBACiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSwgVGFyZ2V0R2Fpbik7CiAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKICAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApIHsKLSAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spIChcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtKTsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spKAorICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKLSNlbmRpZgotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmNwcAppbmRleCA1NGFiNzlkLi44ODJhOGNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuY3BwCkBAIC0yNSw0OSArMjUsMzkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgbikKLXsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTEgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UyID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLlByaXZhdGVQYXJhbXMpOwordm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QqIHB0ckluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCogc3JjMiwgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKSB7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZTEgPQorICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0KikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UyID0KKyAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5Qcml2YXRlUGFyYW1zKTsKIAotICAgIGlmKG4gPD0gMCkgICAgcmV0dXJuOworICAgIGlmIChuIDw9IDApIHJldHVybjsKIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICBTT0ZUIE1JWElORwogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ID09IHBJbnN0YW5jZTEtPlRhcmdldCkgJiYgKHBJbnN0YW5jZTEtPkN1cnJlbnQgPT0gMCkpewotICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBuKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKHBJbnN0YW5jZTItPkN1cnJlbnQgPT0gcEluc3RhbmNlMi0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMi0+Q3VycmVudCA9PSAwKSl7Ci0gICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIG4pOwotICAgIH0KLSAgICBlbHNlIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCAhPSBwSW5zdGFuY2UxLT5UYXJnZXQpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpCi0gICAgewotICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIG4pOwotICAgICAgICBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIG4pOwotICAgIH0KLSAgICBlbHNleworICAgIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCA9PSBwSW5zdGFuY2UxLT5UYXJnZXQpICYmIChwSW5zdGFuY2UxLT5DdXJyZW50ID09IDApKSB7CisgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwgc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBuKTsKKyAgICB9IGVsc2UgaWYgKChwSW5zdGFuY2UyLT5DdXJyZW50ID09IHBJbnN0YW5jZTItPlRhcmdldCkgJiYgKHBJbnN0YW5jZTItPkN1cnJlbnQgPT0gMCkpIHsKKyAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIG4pOworICAgIH0gZWxzZSBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgIT0gcEluc3RhbmNlMS0+VGFyZ2V0KSB8fAorICAgICAgICAgICAgICAgKHBJbnN0YW5jZTItPkN1cnJlbnQgIT0gcEluc3RhbmNlMi0+VGFyZ2V0KSkgeworICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0KikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgbik7CisgICAgICAgIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0KikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIHNyYzIsIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4pOworICAgIH0gZWxzZSB7CiAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgSEFSRCBNSVhJTkcKICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgc3JjMiwgZHN0LCBuKTsKKyAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCAmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIHNyYzIsIGRzdCwgbik7CiAgICAgfQogfQogCi0jaWZkZWYgU1VQUE9SVF9NQwogLyoKICAqIEZVTkNUSU9OOiAgICAgICBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVAogICoKQEAgLTg2LDQ4ICs3NiwzOCBAQAogICogIHZvaWQKICAqCiAgKi8KLXZvaWQgTFZDX01peFNvZnRfMk1jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckNoYW5uZWxzKQotewotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uUHJpdmF0ZVBhcmFtcyk7Cit2b2lkIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUKiBzcmMyLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJDaGFubmVscykgeworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UxID0KKyAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlMiA9CisgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uUHJpdmF0ZVBhcmFtcyk7CiAKLSAgICBpZiAoTnJGcmFtZXMgPD0gMCkgICAgcmV0dXJuOworICAgIGlmIChOckZyYW1lcyA8PSAwKSByZXR1cm47CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgU09GVCBNSVhJTkcKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCA9PSBwSW5zdGFuY2UxLT5UYXJnZXQpICYmIChwSW5zdGFuY2UxLT5DdXJyZW50ID09IDApKSB7Ci0gICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOwotICAgIH0KLSAgICBlbHNlIGlmICgocEluc3RhbmNlMi0+Q3VycmVudCA9PSBwSW5zdGFuY2UyLT5UYXJnZXQpICYmIChwSW5zdGFuY2UyLT5DdXJyZW50ID09IDApKSB7Ci0gICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOwotICAgIH0KLSAgICBlbHNlIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCAhPSBwSW5zdGFuY2UxLT5UYXJnZXQpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpCi0gICAgewotICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOwotICAgICAgICBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBOckZyYW1lcywgTnJDaGFubmVscyk7Ci0gICAgfQotICAgIGVsc2V7CisgICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLCBzcmMyLCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgIH0gZWxzZSBpZiAoKHBJbnN0YW5jZTItPkN1cnJlbnQgPT0gcEluc3RhbmNlMi0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMi0+Q3VycmVudCA9PSAwKSkgeworICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgc3JjMSwgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICB9IGVsc2UgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ICE9IHBJbnN0YW5jZTEtPlRhcmdldCkgfHwKKyAgICAgICAgICAgICAgIChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpIHsKKyAgICAgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0KikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYzEsIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywgTnJDaGFubmVscyk7CisgICAgICAgIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0KikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIHNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICB9IGVsc2UgewogICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgICAgIEhBUkQgTUlYSU5HCiAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAorICAgICAgICBMVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FUKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgc3JjMiwgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOwogICAgIH0KIH0KLSNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKaW5kZXggY2U0MmQyZS4uMWViMmRlYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKQEAgLTI1LDM0ICsyNSwzMSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIExWTWl4ZXIzX3N0IHN0cnVjdHVyZSBzdG9yZXMgSW5zdGFuY2UgcGFyYW1ldGVycyBmb3Igb25lIGF1ZGlvIHN0cmVhbSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fRkxPQVQgICAgICAgUHJpdmF0ZVBhcmFtc1szXTsgICAvKiBQcml2YXRlIEluc3RhbmNlIHBhcmFtcyBmb3IgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvIFN0cmVhbSBzaGlmdCBwYXJhbWV0ZXIgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgQ2FsbGJhY2tTZXQ7ICAgICAgICAvKiBCb29sZWFuLiAgU2hvdWxkIGJlIHNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHRpbWUgdGhlIHRhcmdldCB2YWx1ZSBpcyB1cGRhdGVkICovCi0gICAgTFZNX0lOVDE2ICAgICAgIENhbGxiYWNrUGFyYW07ICAgICAgLyogUGFyYW1ldGVyIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBjYWxiYWNrIGZ1bmN0aW9uICovCi0gICAgdm9pZCAgICAgICAgICAgICpwQ2FsbGJhY2tIYW5kbGU7ICAgLyogUG9pbnRlciB0byB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0gICAgdm9pZCAgICAgICAgICAgICpwR2VuZXJhbFB1cnBvc2U7ICAgLyogUG9pbnRlciBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzYWdlICovCi0gICAgTFZNX0NhbGxiYWNrICAgIHBDYWxsQmFjazsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fRkxPQVQgUHJpdmF0ZVBhcmFtc1szXTsgLyogUHJpdmF0ZSBJbnN0YW5jZSBwYXJhbXMgZm9yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW8gU3RyZWFtIHNoaWZ0IHBhcmFtZXRlciAqLworICAgIExWTV9JTlQxNiBDYWxsYmFja1NldDsgICAgICAvKiBCb29sZWFuLiAgU2hvdWxkIGJlIHNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCB0aW1lIHRoZSB0YXJnZXQgdmFsdWUgaXMgdXBkYXRlZCAqLworICAgIExWTV9JTlQxNiBDYWxsYmFja1BhcmFtOyAgICAvKiBQYXJhbWV0ZXIgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGNhbGJhY2sgZnVuY3Rpb24gKi8KKyAgICB2b2lkKiBwQ2FsbGJhY2tIYW5kbGU7ICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCogcEdlbmVyYWxQdXJwb3NlOyAgICAgIC8qIFBvaW50ZXIgZm9yIGdlbmVyYWwgcHVycG9zZSB1c2FnZSAqLworICAgIExWTV9DYWxsYmFjayBwQ2FsbEJhY2s7ICAgICAvKiBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLwogfSBMVk1peGVyM19GTE9BVF9zdDsKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgIE1peGVyU3RyZWFtWzFdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIG9uZSBBdWRpbyBTdHJlYW0gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1peGVyM19GTE9BVF9zdCBNaXhlclN0cmVhbVsxXTsgLyogSW5zdGFuY2UgUGFyYW1zIGZvciBvbmUgQXVkaW8gU3RyZWFtICovCiB9IExWTWl4ZXIzXzFTdF9GTE9BVF9zdDsKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgIE1peGVyU3RyZWFtWzJdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIHR3byBBdWRpbyBTdHJlYW1zICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNaXhlcjNfRkxPQVRfc3QgTWl4ZXJTdHJlYW1bMl07IC8qIEluc3RhbmNlIFBhcmFtcyBmb3IgdHdvIEF1ZGlvIFN0cmVhbXMgKi8KIH0gTFZNaXhlcjNfMlN0X0ZMT0FUX3N0OwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFBST1RPVFlQRVMgKEhJR0ggTEVWRUwgRlVOQ1RJT05TKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEZ1bmN0aW9uIG5hbWVzIHNob3VsZCBiZSB1bmlxdWUgd2l0aGluIGZpcnN0IDE2IGNoYXJhY3RlcnMgICovCi0jZGVmaW5lICAgIExWTWl4ZXIzX01peFNvZnRfMVN0X0QxNkMzMV9TQVQgICBMVk1peGVyM18xU3RfRDE2QzMxX1NBVF9NaXhTb2Z0Ci0jZGVmaW5lICAgIExWTWl4ZXIzX01peEluU29mdF9EMTZDMzFfU0FUICAgICBMVk1peGVyM19EMTZDMzFfU0FUX01peEluU29mdAotI2RlZmluZSAgICBMVk1peGVyM19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUICAgTFZNaXhlcjNfMlN0X0QxNkMzMV9TQVRfTWl4U29mdAotI2RlZmluZSAgICBMVk1peGVyM19NaXhTb2Z0XzNTdF9EMTZDMzFfU0FUICAgTFZNaXhlcjNfM1N0X0QxNkMzMV9TQVRfTWl4U29mdAorI2RlZmluZSBMVk1peGVyM19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUIExWTWl4ZXIzXzFTdF9EMTZDMzFfU0FUX01peFNvZnQKKyNkZWZpbmUgTFZNaXhlcjNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQgTFZNaXhlcjNfRDE2QzMxX1NBVF9NaXhJblNvZnQKKyNkZWZpbmUgTFZNaXhlcjNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCBMVk1peGVyM18yU3RfRDE2QzMxX1NBVF9NaXhTb2Z0CisjZGVmaW5lIExWTWl4ZXIzX01peFNvZnRfM1N0X0QxNkMzMV9TQVQgTFZNaXhlcjNfM1N0X0QxNkMzMV9TQVRfTWl4U29mdAogCiAvKioqIEdlbmVyYWwgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNjIsODUgKzU5LDQ5IEBACiAvKiB0aGVuIHRoZSBjYWxjdWxhdGlvbiB3aWxsIGdpdmUgYW4gaW5jb3JyZWN0IHZhbHVlIGZvciBhbHBoYSwgc2VlIHRoZSBtaXhlciAgICAgKi8KIC8qIGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWQ19NaXhlcl9TZXRUYXJnZXQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgIFRhcmdldEdhaW4pOwotTFZNX0ZMT0FUIExWQ19NaXhlcl9HZXRUYXJnZXQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtKTsKK3ZvaWQgTFZDX01peGVyX1NldFRhcmdldChMVk1peGVyM19GTE9BVF9zdCogcFN0cmVhbSwgTFZNX0ZMT0FUIFRhcmdldEdhaW4pOworTFZNX0ZMT0FUIExWQ19NaXhlcl9HZXRUYXJnZXQoTFZNaXhlcjNfRkxPQVRfc3QqIHBTdHJlYW0pOwogCi1MVk1fRkxPQVQgTFZDX01peGVyX0dldEN1cnJlbnQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtKTsKK0xWTV9GTE9BVCBMVkNfTWl4ZXJfR2V0Q3VycmVudChMVk1peGVyM19GTE9BVF9zdCogcFN0cmVhbSk7CiAKLXZvaWQgTFZDX01peGVyX0luaXQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBUYXJnZXRHYWluLAotICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBDdXJyZW50R2Fpbik7Cit2b2lkIExWQ19NaXhlcl9Jbml0KExWTWl4ZXIzX0ZMT0FUX3N0KiBwU3RyZWFtLCBMVk1fRkxPQVQgVGFyZ2V0R2FpbiwgTFZNX0ZMT0FUIEN1cnJlbnRHYWluKTsKIAotdm9pZCBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyk7Cit2b2lkIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoTFZNaXhlcjNfRkxPQVRfc3QqIHBTdHJlYW0sIExWTV9JTlQzMiBUY19taWxsaXNlYywgTFZNX0ZzX2VuIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOdW1DaGFubmVscyk7CiAKLXZvaWQgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpOwordm9pZCBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KExWTWl4ZXIzX0ZMT0FUX3N0KiBwU3RyZWFtLCBMVk1fSU5UMzIgVGNfbWlsbGlzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuIEZzLCBMVk1fSU5UMTYgTnVtQ2hhbm5lbHMpOwogCiAvKioqIDE2IGJpdCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgbik7Ci0jaWZkZWYgU1VQUE9SVF9NQwotdm9pZCBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJDaGFubmVscyk7Ci0jZW5kaWYKK3ZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0KiBwSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pOwordm9pZCBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IE5yRnJhbWVzLCBMVk1fSU5UMTYgTnJDaGFubmVscyk7CiAKLXZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKTsKLSNpZmRlZiBTVVBQT1JUX01DCi12b2lkIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJDaGFubmVscyk7Ci0jZW5kaWYKK3ZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbik7Cit2b2lkIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QqIHBJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IE5yRnJhbWVzLCBMVk1fSU5UMTYgTnJDaGFubmVscyk7CiAKLXZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbik7Ci0jaWZkZWYgU1VQUE9SVF9NQwotdm9pZCBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgLyogZHN0IGNhbm5vdCBiZSBlcXVhbCB0byBzcmMyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOwotI2VuZGlmCit2b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCogc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Cit2b2lkIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCogc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsIExWTV9JTlQxNiBOckNoYW5uZWxzKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRm9yIGFwcGx5aW5nIGRpZmZlcmVudCBnYWlucyB0byBMZWZ0IGFuZCByaWdodCBjaGVubmFscyAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBNaXhlclN0cmVhbVswXSBhcHBsaWVzIHRvIExlZnQgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIE1peGVyU3RyZWFtWzFdIGFwcGxpZXMgdG8gUmlnaHQgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogR2FpbiB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYXQgMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBTVVBQT1JUX01DCi12b2lkIExWQ19NaXhTb2Z0XzFTdF9NQ19mbG9hdF9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICBOckNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgQ2hNYXNrKTsKLSNlbmRpZgotdm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLwordm9pZCBMVkNfTWl4U29mdF8xU3RfTUNfZmxvYXRfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgLyogZHN0IGNhbiBiZSBlcXVhbCB0byBzcmMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsIExWTV9JTlQzMiBOckNoYW5uZWxzLCBMVk1fSU5UMzIgQ2hNYXNrKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNlbmRpZiAvLyNpZm5kZWYgX19MVkNfTUlYRVJfSF9fCi0KKyNlbmRpZiAgLy8jaWZuZGVmIF9fTFZDX01JWEVSX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldEN1cnJlbnQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldEN1cnJlbnQuY3BwCmluZGV4IGQwYjUwZTYuLjAzZGU4YjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRDdXJyZW50LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0Q3VycmVudC5jcHAKQEAgLTMwLDEwICszMCw5IEBACiAvKiAgQ3VycmVudEdhaW4gICAgICAtIEN1cnJlbnRHYWluIHZhbHVlIGluIFEgMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fRkxPQVQgTFZDX01peGVyX0dldEN1cnJlbnQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtKQotewotICAgIExWTV9GTE9BVCAgICAgICBDdXJyZW50R2FpbjsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CitMVk1fRkxPQVQgTFZDX01peGVyX0dldEN1cnJlbnQoTFZNaXhlcjNfRkxPQVRfc3QqIHBTdHJlYW0pIHsKKyAgICBMVk1fRkxPQVQgQ3VycmVudEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKICAgICBDdXJyZW50R2FpbiA9IHBJbnN0YW5jZS0+Q3VycmVudDsgIC8vIEN1cnJlbnRHYWluCiAgICAgcmV0dXJuIEN1cnJlbnRHYWluOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmNwcAppbmRleCAzYWU1YmE0Li4yMWViYWMxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jcHAKQEAgLTMwLDEwICszMCw5IEBACiAvKiAgVGFyZ2V0R2FpbiAgICAgIC0gVGFyZ2V0R2FpbiB2YWx1ZSBpbiBRIDE2LjE1IGZvcm1hdCAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fRkxPQVQgTFZDX01peGVyX0dldFRhcmdldCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0pCi17Ci0gICAgTFZNX0ZMT0FUICAgICAgIFRhcmdldEdhaW47Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworTFZNX0ZMT0FUIExWQ19NaXhlcl9HZXRUYXJnZXQoTFZNaXhlcjNfRkxPQVRfc3QqIHBTdHJlYW0pIHsKKyAgICBMVk1fRkxPQVQgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0KilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOwogCiAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAgLy8gVGFyZ2V0R2FpbgogICAgIHJldHVybiBUYXJnZXRHYWluOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuY3BwCmluZGV4IGM5ZmQzNDQuLmUzN2Y2MzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Jbml0LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfSW5pdC5jcHAKQEAgLTQ0LDE0ICs0NCwxMCBAQAogLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVkNfTWl4ZXJfSW5pdCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIFRhcmdldEdhaW4sCi0gICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIEN1cnJlbnRHYWluKQotewordm9pZCBMVkNfTWl4ZXJfSW5pdChMVk1peGVyM19GTE9BVF9zdCogcFN0cmVhbSwgTFZNX0ZMT0FUIFRhcmdldEdhaW4sIExWTV9GTE9BVCBDdXJyZW50R2FpbikgewogICAgIExWTV9GTE9BVCBNYXhHYWluID0gVGFyZ2V0R2FpbjsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKLSAgICBpZihDdXJyZW50R2FpbiA+IE1heEdhaW4pCi0gICAgICAgIE1heEdhaW4gPSBDdXJyZW50R2FpbjsKLSAgICBwSW5zdGFuY2UtPlRhcmdldCA9IFRhcmdldEdhaW47ICAgLy8gVXBkYXRlIGZyYWN0aW9uYWwgZ2FpbiBUYXJnZXQKLSAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50R2FpbjsgLy8gVXBkYXRlIGZyYWN0aW9uYWwgZ2FpbiBDdXJyZW50CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBpZiAoQ3VycmVudEdhaW4gPiBNYXhHYWluKSBNYXhHYWluID0gQ3VycmVudEdhaW47CisgICAgcEluc3RhbmNlLT5UYXJnZXQgPSBUYXJnZXRHYWluOyAgICAvLyBVcGRhdGUgZnJhY3Rpb25hbCBnYWluIFRhcmdldAorICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IEN1cnJlbnRHYWluOyAgLy8gVXBkYXRlIGZyYWN0aW9uYWwgZ2FpbiBDdXJyZW50CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaAppbmRleCAxMjNkMjJiLi45MjA2ZmFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmgKQEAgLTI2LDU0ICsyNiwzNiBAQAogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKIAogLyogSW5zdGFuY2UgcGFyYW1ldGVyIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBHZW5lcmFsICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXQ7ICAgICAgICAgICAvKm51bWJlciBzcGVjaWZ5aW5nIHZhbHVlIG9mIFRhcmdldCBHYWluICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50OyAgICAgICAgICAvKm51bWJlciBzcGVjaWZ5aW5nIHZhbHVlIG9mIEN1cnJlbnQgR2FpbiAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgRGVsdGE7ICAgICAgICAgICAgLypudW1iZXIgc3BlY2lmeWluZyB2YWx1ZSBvZiBEZWx0YSBHYWluICovCisgICAgTFZNX0ZMT0FUIFRhcmdldDsgIC8qbnVtYmVyIHNwZWNpZnlpbmcgdmFsdWUgb2YgVGFyZ2V0IEdhaW4gKi8KKyAgICBMVk1fRkxPQVQgQ3VycmVudDsgLypudW1iZXIgc3BlY2lmeWluZyB2YWx1ZSBvZiBDdXJyZW50IEdhaW4gKi8KKyAgICBMVk1fRkxPQVQgRGVsdGE7ICAgLypudW1iZXIgc3BlY2lmeWluZyB2YWx1ZSBvZiBEZWx0YSBHYWluICovCiB9IE1peF9Qcml2YXRlX0ZMT0FUX3N0OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgREVGSU5JVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBMVkNvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQgICAgTFZDb3JlX0luU29mdF9EMzJDMzFfU0FUCi0jZGVmaW5lIExWQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBICBMVkNvcmVfU29mdF8xU3RfRDMyQzMxX1dSQQotI2RlZmluZSBMVkNvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVCAgTFZDb3JlX0hhcmRfMlN0X0QzMkMzMV9TQVQKKyNkZWZpbmUgTFZDb3JlX01peEluU29mdF9EMzJDMzFfU0FUIExWQ29yZV9JblNvZnRfRDMyQzMxX1NBVAorI2RlZmluZSBMVkNvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQSBMVkNvcmVfU29mdF8xU3RfRDMyQzMxX1dSQQorI2RlZmluZSBMVkNvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVCBMVkNvcmVfSGFyZF8yU3RfRDMyQzMxX1NBVAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gUFJPVE9UWVBFUyAoTE9XIExFVkVMIFNVQkZVTkNUSU9OUykKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqIDE2IGJpdCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Ci0jaWZkZWYgU1VQUE9SVF9NQwotdm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBOckNoYW5uZWxzKTsKLSNlbmRpZgotdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCBMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwotI2lmZGVmIFNVUFBPUlRfTUMKLXZvaWQgTFZDX0NvcmVfTWl4U29mdF9NY19EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIE5yQ2hhbm5lbHMpOwotI2VuZGlmCi12b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwSW5zdGFuY2UxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgICpwSW5zdGFuY2UyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Cit2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0KiBwdHJJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbik7Cit2b2lkIExWQ19Db3JlX01peEluU29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0KiBwdHJJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgTnJGcmFtZXMsIExWTV9JTlQxNiBOckNoYW5uZWxzKTsKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQShMVk1peGVyM19GTE9BVF9zdCogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbik7Cit2b2lkIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQShMVk1peGVyM19GTE9BVF9zdCogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpOwordm9pZCBMVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0KiBwSW5zdGFuY2UxLCBMVk1peGVyM19GTE9BVF9zdCogcEluc3RhbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQqIHNyYzEsIGNvbnN0IExWTV9GTE9BVCogc3JjMiwgTFZNX0ZMT0FUKiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEZvciBhcHBseWluZyBkaWZmZXJlbnQgZ2FpbnMgdG8gTGVmdCBhbmQgcmlnaHQgY2hlbm5hbHMgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtODEsMTggKzYzLDggQEAKIC8qIHB0ckluc3RhbmNlMiBhcHBsaWVzIHRvIFJpZ2h0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogR2FpbiB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYXQgMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBTVVBQT1JUX01DCi12b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X01DX2Zsb2F0X1dSQShNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJDaGFubmVscyk7Ci0jZW5kaWYKLXZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQSggTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKTsKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfTUNfZmxvYXRfV1JBKE1peF9Qcml2YXRlX0ZMT0FUX3N0KiogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEZvciBhcHBseWluZyBkaWZmZXJlbnQgZ2FpbnMgdG8gTGVmdCBhbmQgcmlnaHQgY2hlbm5hbHMgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTAwLDIxICs3Miw3IEBACiAvKiBwdHJJbnN0YW5jZTIgYXBwbGllcyB0byBSaWdodCBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEdhaW4gdmFsdWVzIHNob3VsZCBub3QgYmUgbW9yZSB0aGF0IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgU1VQUE9SVF9NQwotdm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF9NQ19mbG9hdF9TQVQoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKipwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgIE5yQ2hhbm5lbHMpOwotI2VuZGlmCi12b2lkIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbik7Cit2b2lkIExWQ19Db3JlX01peEhhcmRfMVN0X01DX2Zsb2F0X1NBVChNaXhfUHJpdmF0ZV9GTE9BVF9zdCoqIHB0ckluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgTnJGcmFtZXMsIExWTV9JTlQxNiBOckNoYW5uZWxzKTsKIAotLyoqKiAzMiBiaXQgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2VuZGlmIC8vI2lmbmRlZiBfX0xWQ19NSVhFUl9QUklWQVRFX0hfXwotCisjZW5kaWYgIC8vI2lmbmRlZiBfX0xWQ19NSVhFUl9QUklWQVRFX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmNwcAppbmRleCA0N2IwY2VjLi5kODAxNWM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmNwcApAQCAtNDMsOSArNDMsNyBAQAogLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVkNfTWl4ZXJfU2V0VGFyZ2V0KExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgIFRhcmdldEdhaW4pCi17Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7Ci0gICAgcEluc3RhbmNlLT5UYXJnZXQgPSBUYXJnZXRHYWluOyAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBnYWluIFRhcmdldAordm9pZCBMVkNfTWl4ZXJfU2V0VGFyZ2V0KExWTWl4ZXIzX0ZMT0FUX3N0KiBwU3RyZWFtLCBMVk1fRkxPQVQgVGFyZ2V0R2FpbikgeworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgcEluc3RhbmNlLT5UYXJnZXQgPSBUYXJnZXRHYWluOyAgLy8gVXBkYXRlIGdhaW4gVGFyZ2V0CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuY3BwCmluZGV4IDFhOGRhN2EuLjcxNWI5MDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuY3BwCkBAIC00NCwzNiArNDQsMzMgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZDX01peGVyX1NldFRpbWVDb25zdGFudChMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscykKLXsKLSAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzEzXSA9IHswLjUwMDAwMGYsLyo4MDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM2MjgxMmYsLyoxMTAyNSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMzMzMzNmLC8qMTIwMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjUwMDAwZiwvKjE2MDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE4MTQwNmYsLyoyMjA1MCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNjY2NjZmLC8qMjQwMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTI1MDAwZiwvKjMyMDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA5MDcwM2YsLyo0NDEwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODMzMzNmLC8qNDgwMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQ1MzUyZiwvKjg4MjAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA0MTY2N2YsLyo5NjAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjI2NzZmLC8qMTc2NDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMDgzM2Z9Oy8qMTkyMDAwKi8KK3ZvaWQgTFZDX01peGVyX1NldFRpbWVDb25zdGFudChMVk1peGVyM19GTE9BVF9zdCogcFN0cmVhbSwgTFZNX0lOVDMyIFRjX21pbGxpc2VjLCBMVk1fRnNfZW4gRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE51bUNoYW5uZWxzKSB7CisgICAgTFZNX0ZMT0FUIERlbHRhVGFibGVbMTNdID0gezAuNTAwMDAwZiwgIC8qODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzYyODEyZiwgIC8qMTEwMjUqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMzMzM2YsICAvKjEyMDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLCAgLyoxNjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTgxNDA2ZiwgIC8qMjIwNTAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE2NjY2NmYsICAvKjI0MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLCAgLyozMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwgIC8qNDQxMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2YsICAvKjQ4MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDUzNTJmLCAgLyo4ODIwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQxNjY3ZiwgIC8qOTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMjY3NmYsICAvKjE3NjQwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIwODMzZn07IC8qMTkyMDAwKi8KIAotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CiAgICAgTFZNX0ZMT0FUIERlbHRhID0gRGVsdGFUYWJsZVtGc107CiAgICAgRGVsdGEgPSBEZWx0YSAvIChOdW1DaGFubmVscyk7CiAKLSAgICBpZihUY19taWxsaXNlYyA9PSAwKQorICAgIGlmIChUY19taWxsaXNlYyA9PSAwKQogICAgICAgICBEZWx0YSA9IDEuMDAwMDAwZjsKICAgICBlbHNlCiAgICAgICAgIERlbHRhID0gRGVsdGEgLyBUY19taWxsaXNlYzsKIAotICAgIGlmKERlbHRhID09IDApCi0gICAgICAgIERlbHRhID0gMC4wMDAwMDAwMDA1ZjsgIC8qIElmIFRpbWUgQ29uc3RhbnQgaXMgc28gbGFyZ2UgdGhhdCBEZWx0YSBpcyAwLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduIG1pbmltdW0gdmFsdWUgdG8gRGVsdGEgKi8KKyAgICBpZiAoRGVsdGEgPT0gMCkKKyAgICAgICAgRGVsdGEgPSAwLjAwMDAwMDAwMDVmOyAvKiBJZiBUaW1lIENvbnN0YW50IGlzIHNvIGxhcmdlIHRoYXQgRGVsdGEgaXMgMCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduIG1pbmltdW0gdmFsdWUgdG8gRGVsdGEgKi8KICAgICBwSW5zdGFuY2UtPkRlbHRhID0gRGVsdGE7ICAvLyBEZWx0YT0oMjE0NzQ4MzY0Nyo0KjEwMDApLyhOdW1DaGFubmVscypTYW1wbGVSYXRlKlRjX21pbGxpc2VjKQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmNwcAppbmRleCBmMzM1YTFlLi5jZjg0NjEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmNwcApAQCAtNDQsNTcgKzQ0LDUwIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzKQotewotICAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzEzXSA9IHswLjUwMDAwMGYsLyo4MDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjI4MTJmLC8qMTEwMjUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMzMzM2YsLyoxMjAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjUwMDAwZiwvKjE2MDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODE0MDZmLC8qMjIwNTAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE2NjY2NmYsLyoyNDAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTI1MDAwZiwvKjMyMDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wOTA3MDNmLC8qNDQxMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2YsLyo0ODAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQ1MzUyZiwvKjg4MjAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDE2NjZmLC8qOTYwMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMjY3NmYsLyoxNzY0MDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMDgzM2Z9Oy8qMTkyMDAwKi8KK3ZvaWQgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudChMVk1peGVyM19GTE9BVF9zdCogcFN0cmVhbSwgTFZNX0lOVDMyIFRjX21pbGxpc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiBGcywgTFZNX0lOVDE2IE51bUNoYW5uZWxzKSB7CisgICAgTFZNX0ZMT0FUIERlbHRhVGFibGVbMTNdID0gezAuNTAwMDAwZiwgIC8qODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzYyODEyZiwgIC8qMTEwMjUqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMzMzM2YsICAvKjEyMDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLCAgLyoxNjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTgxNDA2ZiwgIC8qMjIwNTAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE2NjY2NmYsICAvKjI0MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLCAgLyozMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwgIC8qNDQxMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2YsICAvKjQ4MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDUzNTJmLCAgLyo4ODIwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQxNjY2ZiwgIC8qOTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMjY3NmYsICAvKjE3NjQwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIwODMzZn07IC8qMTkyMDAwKi8KICAgICBMVk1fRkxPQVQgVGNfbWlsbGlzZWNfZmxvYXQ7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKICAgICBMVk1fRkxPQVQgRGVsdGEgPSBEZWx0YVRhYmxlW0ZzXTsKIAotICAgIExWTV9GTE9BVCAgIEN1cnJlbnQ7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0OworICAgIExWTV9GTE9BVCBDdXJyZW50OworICAgIExWTV9GTE9BVCBUYXJnZXQ7CiAKLSAgICBEZWx0YT1EZWx0YSAvIChOdW1DaGFubmVscyk7CisgICAgRGVsdGEgPSBEZWx0YSAvIChOdW1DaGFubmVscyk7CiAKICAgICAvKiAgR2V0IGdhaW4gdmFsdWVzICAqLwogICAgIEN1cnJlbnQgPSBwSW5zdGFuY2UtPkN1cnJlbnQ7CiAgICAgVGFyZ2V0ID0gcEluc3RhbmNlLT5UYXJnZXQ7CiAKLSAgICBpZiAoQ3VycmVudCAhPSBUYXJnZXQpCi0gICAgeworICAgIGlmIChDdXJyZW50ICE9IFRhcmdldCkgewogICAgICAgICBUY19taWxsaXNlY19mbG9hdCA9IChMVk1fRkxPQVQpKFRjX21pbGxpc2VjKSAvIChDdXJyZW50IC0gVGFyZ2V0KTsKLSAgICAgICAgaWYgKFRjX21pbGxpc2VjX2Zsb2F0IDwgMCkKLSAgICAgICAgICAgIFRjX21pbGxpc2VjX2Zsb2F0ID0gLVRjX21pbGxpc2VjX2Zsb2F0OworICAgICAgICBpZiAoVGNfbWlsbGlzZWNfZmxvYXQgPCAwKSBUY19taWxsaXNlY19mbG9hdCA9IC1UY19taWxsaXNlY19mbG9hdDsKIAotICAgICAgICBpZihUY19taWxsaXNlYyA9PSAwKQorICAgICAgICBpZiAoVGNfbWlsbGlzZWMgPT0gMCkKICAgICAgICAgICAgIERlbHRhID0gMS4wMDAwMDBmOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBEZWx0YSA9IERlbHRhIC8gVGNfbWlsbGlzZWNfZmxvYXQ7CiAKLSAgICAgICAgaWYoRGVsdGEgPT0gMCkKKyAgICAgICAgaWYgKERlbHRhID09IDApCiAgICAgICAgICAgICBEZWx0YSA9IDAuMDAwMDAwMDAwNWY7IC8qIElmIFRpbWUgQ29uc3RhbnQgaXMgc28gbGFyZ2UgdGhhdCBEZWx0YSBpcyAwLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbiBtaW5pbXVtIHZhbHVlIHRvIERlbHRhICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERlbHRhID0gMC4wMDAwMDAwMDA1ZjsgIC8qIE1pbmltdW0gdmFsdWUgZm9yIHByb3BlciBjYWxsLWJhY2tzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldHRpbmcgaXQgdG8gemVybyBoYXMgc29tZSBwcm9ibGVtcywgdG8gYmUgY29ycmVjdGVkKSAqLworICAgIH0gZWxzZSB7CisgICAgICAgIERlbHRhID0gMC4wMDAwMDAwMDA1ZjsgLyogTWluaW11bSB2YWx1ZSBmb3IgcHJvcGVyIGNhbGwtYmFja3MgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXR0aW5nIGl0IHRvIHplcm8gaGFzIHNvbWUgcHJvYmxlbXMsIHRvIGJlIGNvcnJlY3RlZCkgKi8KICAgICB9CiAKLSAgICBwSW5zdGFuY2UtPkRlbHRhID0gRGVsdGE7ICAgICAvLyBEZWx0YT0oMjE0NzQ4MzY0Nyo0KjEwMDApLyhOdW1DaGFubmVscypTYW1wbGVSYXRlKlRjX21pbGxpc2VjKQorICAgIHBJbnN0YW5jZS0+RGVsdGEgPSBEZWx0YTsgIC8vIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuY3BwCmluZGV4IDI0OTdkMjkuLjU5MDk1ZGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuY3BwCkBAIC02NywzMSArNjcsMTkgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUxWTV9GTE9BVCBMVk1fRk9fSFBGKCAgIExWTV9GTE9BVCAgICAgICB3LAotICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgKnBDb2VmZnMpCi17Ci0gICAgTFZNX0ZMT0FUIFksQ29lZmZpY2llbnRzWzEzXSA9IHstMC45OTk5OTZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk4MDFmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDk3ODI0ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzIyOTM3ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE4MDg4MGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4NzY1OGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMzIxMDJmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDgxNjNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMjUyZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDg5ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMH07Ci0gICAgWT1MVk1fUG9seW5vbWlhbCgoTFZNX1VJTlQxNik5LCBDb2VmZmljaWVudHMsIHcpOworTFZNX0ZMT0FUIExWTV9GT19IUEYoTFZNX0ZMT0FUIHcsIEZPX0ZMT0FUX0NvZWZzX3QqIHBDb2VmZnMpIHsKKyAgICBMVk1fRkxPQVQgWSwgQ29lZmZpY2llbnRzWzEzXSA9IHstMC45OTk5OTZmLCAwLjk5OTgwMWYsICAtMC40OTc4MjRmLCAwLjMyMjkzN2YsICAtMC4xODA4ODBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDg3NjU4ZiwgIC0wLjAzMjEwMmYsIDAuMDA4MTYzZiwgIC0wLjAwMTI1MmYsIDAuMDAwMDg5ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgICAwfTsKKyAgICBZID0gTFZNX1BvbHlub21pYWwoKExWTV9VSU5UMTYpOSwgQ29lZmZpY2llbnRzLCB3KTsKIAotICAgIHBDb2VmZnMtPkIxID0gLVk7ICAgICAgICAgLyogU3RvcmUgLUIxIGluIGZpbHRlciBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBCMSEqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEwPSgxLUIxKS8yPSBCMS8yIC0gMC41Ki8KLSAgICBZID0gWSAvIDIuMGY7ICAgICAgICAgICAgICAgICAvKiBBMD1ZPUIxLzIqLwotICAgIFkgPSBZIC0gMC41ZjsgICAgICAgICAvKiBBMD1ZPShCMS8yIC0gMC41KSovCisgICAgcENvZWZmcy0+QjEgPSAtWTsgLyogU3RvcmUgLUIxIGluIGZpbHRlciBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBCMSEqLworICAgICAgICAgICAgICAgICAgICAgIC8qIEEwPSgxLUIxKS8yPSBCMS8yIC0gMC41Ki8KKyAgICBZID0gWSAvIDIuMGY7ICAgICAvKiBBMD1ZPUIxLzIqLworICAgIFkgPSBZIC0gMC41ZjsgICAgIC8qIEEwPVk9KEIxLzIgLSAwLjUpKi8KIAotICAgIHBDb2VmZnMtPkEwID0gWSAqIEZJTFRFUl9MT1NTX0ZMT0FUOyAgICAgICAgICAgICAgICAgIC8qIEFwcGx5IGxvc3MgdG8gYXZvaWQgb3ZlcmZsb3cqLwotICAgIHBDb2VmZnMtPkExID0gLXBDb2VmZnMtPkEwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0b3JlIEExPS1BMCovCisgICAgcENvZWZmcy0+QTAgPSBZICogRklMVEVSX0xPU1NfRkxPQVQ7IC8qIEFwcGx5IGxvc3MgdG8gYXZvaWQgb3ZlcmZsb3cqLworICAgIHBDb2VmZnMtPkExID0gLXBDb2VmZnMtPkEwOyAgICAgICAgICAvKiBTdG9yZSBBMT0tQTAqLwogCiAgICAgcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19MUEYuY3BwCmluZGV4IDdiYzYwNDYuLjkxOTY0ZmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19MUEYuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19MUEYuY3BwCkBAIC02NywyNSArNjcsMTUgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUxWTV9GTE9BVCBMVk1fRk9fTFBGKCAgIExWTV9GTE9BVCAgICAgICB3LAotICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgKnBDb2VmZnMpCi17Ci0gICAgTFZNX0ZMT0FUIFksQ29lZmZpY2llbnRzWzEzXSA9IHstMC45OTk5OTZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk4MDFmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDk3ODI0ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzIyOTM3ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE4MDg4MGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4NzY1OGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMzIxMDJmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDgxNjNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMjUyZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDg5ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB9OwotICAgIFk9TFZNX1BvbHlub21pYWwoKExWTV9VSU5UMTYpOSwgQ29lZmZpY2llbnRzLCB3KTsKLSAgICBwQ29lZmZzLT5CMSA9IC1ZOyAgICAgLy8gU3RvcmUgLUIxIGluIGZpbHRlciBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBCMSEKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEwPSgxK0IxKS8yPSBCMS8yICsgMC41Ci0gICAgWSA9IFkgLyAyLjBmOyAgICAgICAgICAgICAvLyBBMD1ZPUIxLzIKLSAgICBZID0gWSArIDAuNWY7ICAgICAvLyBBMD1ZPShCMS8yICsgMC41KQorTFZNX0ZMT0FUIExWTV9GT19MUEYoTFZNX0ZMT0FUIHcsIEZPX0ZMT0FUX0NvZWZzX3QqIHBDb2VmZnMpIHsKKyAgICBMVk1fRkxPQVQgWSwKKyAgICAgICAgICAgIENvZWZmaWNpZW50c1sxM10gPSB7LTAuOTk5OTk2ZiwgMC45OTk4MDFmLCAtMC40OTc4MjRmLCAwLjMyMjkzN2YsIC0wLjE4MDg4MGYsIDAuMDg3NjU4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDMyMTAyZiwgMC4wMDgxNjNmLCAtMC4wMDEyNTJmLCAwLjAwMDA4OWYsIDB9OworICAgIFkgPSBMVk1fUG9seW5vbWlhbCgoTFZNX1VJTlQxNik5LCBDb2VmZmljaWVudHMsIHcpOworICAgIHBDb2VmZnMtPkIxID0gLVk7ICAvLyBTdG9yZSAtQjEgaW4gZmlsdGVyIHN0cnVjdHVyZSBpbnN0ZWFkIG9mIEIxIQorICAgICAgICAgICAgICAgICAgICAgICAvLyBBMD0oMStCMSkvMj0gQjEvMiArIDAuNQorICAgIFkgPSBZIC8gMi4wZjsgICAgICAvLyBBMD1ZPUIxLzIKKyAgICBZID0gWSArIDAuNWY7ICAgICAgLy8gQTA9WT0oQjEvMiArIDAuNSkKIAogICAgIHBDb2VmZnMtPkEwID0gWSAqIEZJTFRFUl9MT1NTX0ZMT0FUOwogICAgIHBDb2VmZnMtPkExID0gcENvZWZmcy0+QTA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0dldE9tZWdhLmNwcAppbmRleCAyYTdjY2EyLi41ZjI1Njc3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jcHAKQEAgLTI1LDQxICsyNSwzMiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgTFZWRExfMlBpQnlfODAwMCAgICAgICAgMTcyNzEwODgyNiAgLyogSW4gUTQxIGZvcm1hdCAqLwotI2RlZmluZSBMVlZETF8yUGlCeV8xMTAyNSAgICAgICAxMjUzMjMwODk0ICAvKiBJbiBRNDEgZm9ybWF0ICovCi0jZGVmaW5lIExWVkRMXzJQaUJ5XzEyMDAwICAgICAgIDExNTE0MDU4ODQgIC8qIEluIFE0MSBmb3JtYXQgKi8KKyNkZWZpbmUgTFZWRExfMlBpQnlfODAwMCAxNzI3MTA4ODI2ICAvKiBJbiBRNDEgZm9ybWF0ICovCisjZGVmaW5lIExWVkRMXzJQaUJ5XzExMDI1IDEyNTMyMzA4OTQgLyogSW4gUTQxIGZvcm1hdCAqLworI2RlZmluZSBMVlZETF8yUGlCeV8xMjAwMCAxMTUxNDA1ODg0IC8qIEluIFE0MSBmb3JtYXQgKi8KIAotI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMSAgICAxMiAgICAgICAgICAvKiBRZm9ybWF0IHNoaWZ0IGZvciA4a0h6LCAxMS4wMjVrSHogYW5kIDEya0h6IGkuZS4gMTI9NDEtMjkgKi8KLSNkZWZpbmUgTFZWRExfMlBpQnlGc19TSElGVDIgICAgMTMgICAgICAgICAgLyogUWZvcm1hdCBzaGlmdCBmb3IgMTZrSHosIDIyLjA1MGtIeiBhbmQgMjRrSHogaS5lLiAxMz00Mi0yOSAqLwotI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMyAgICAxNCAgICAgICAgICAvKiBRZm9ybWF0IHNoaWZ0IGZvciAzMmtIeiwgNDQuMWtIeiBhbmQgNDhrSHogaS5lLiAxND00My0yOSAqLwotI2RlZmluZSBMVlZETF8yUGlCeV84MDAwX2YgICAgICAgIDAuMDAwNzg1Mzk4ZgotI2RlZmluZSBMVlZETF8yUGlCeV8xMTAyNV9mICAgICAgIDAuMDAwNTY5OTAzZgotI2RlZmluZSBMVlZETF8yUGlCeV8xMjAwMF9mICAgICAgIDAuMDAwNTIzNTk5ZgotI2RlZmluZSBMVlZETF8yUGlCeV8xNjAwMF9mICAgICAgIDAuMDAwMzkyNzAwZgotI2RlZmluZSBMVlZETF8yUGlCeV8yMjA1MF9mICAgICAgIDAuMDAwMjg0OTUyZgotI2RlZmluZSBMVlZETF8yUGlCeV8yNDAwMF9mICAgICAgIDAuMDAwMjYxODAwZgotI2RlZmluZSBMVlZETF8yUGlCeV8zMjAwMF9mICAgICAgIDAuMDAwMTk2MzUwZgotI2RlZmluZSBMVlZETF8yUGlCeV80NDEwMF9mICAgICAgIDAuMDAwMTQyNDc2ZgotI2RlZmluZSBMVlZETF8yUGlCeV80ODAwMF9mICAgICAgIDAuMDAwMTMwOTAwZgorI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMSAxMiAvKiBRZm9ybWF0IHNoaWZ0IGZvciA4a0h6LCAxMS4wMjVrSHogYW5kIDEya0h6IGkuZS4gMTI9NDEtMjkgKi8KKyNkZWZpbmUgTFZWRExfMlBpQnlGc19TSElGVDIgMTMgLyogUWZvcm1hdCBzaGlmdCBmb3IgMTZrSHosIDIyLjA1MGtIeiBhbmQgMjRrSHogaS5lLiAxMz00Mi0yOSAqLworI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMyAxNCAvKiBRZm9ybWF0IHNoaWZ0IGZvciAzMmtIeiwgNDQuMWtIeiBhbmQgNDhrSHogaS5lLiAxND00My0yOSAqLworI2RlZmluZSBMVlZETF8yUGlCeV84MDAwX2YgMC4wMDA3ODUzOThmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzExMDI1X2YgMC4wMDA1Njk5MDNmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzEyMDAwX2YgMC4wMDA1MjM1OTlmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzE2MDAwX2YgMC4wMDAzOTI3MDBmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzIyMDUwX2YgMC4wMDAyODQ5NTJmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzI0MDAwX2YgMC4wMDAyNjE4MDBmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzMyMDAwX2YgMC4wMDAxOTYzNTBmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzQ0MTAwX2YgMC4wMDAxNDI0NzZmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzQ4MDAwX2YgMC4wMDAxMzA5MDBmCiAKLSNkZWZpbmUgTFZWRExfMlBpQnlfODgyMDBfZiAgICAgICAwLjAwMDA3MTIzOGYKLSNkZWZpbmUgTFZWRExfMlBpQnlfOTYwMDBfZiAgICAgICAwLjAwMDA2NTQ1MGYKLSNkZWZpbmUgTFZWRExfMlBpQnlfMTc2NDAwX2YgICAgICAwLjAwMDAzNTYxOWYKLSNkZWZpbmUgTFZWRExfMlBpQnlfMTkyMDAwX2YgICAgICAwLjAwMDAzMjcyNWYKLWNvbnN0IExWTV9GTE9BVCAgICAgTFZWRExfMlBpT25Gc1RhYmxlW10gPSAge0xWVkRMXzJQaUJ5XzgwMDBfZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzExMDI1X2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8xMjAwMF9mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMTYwMDBfZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzIyMDUwX2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8yNDAwMF9mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMzIwMDBfZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzQ0MTAwX2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV80ODAwMF9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVlZETF8yUGlCeV84ODIwMF9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVlZETF8yUGlCeV85NjAwMF9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVlZETF8yUGlCeV8xNzY0MDBfZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZWRExfMlBpQnlfMTkyMDAwX2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworI2RlZmluZSBMVlZETF8yUGlCeV84ODIwMF9mIDAuMDAwMDcxMjM4ZgorI2RlZmluZSBMVlZETF8yUGlCeV85NjAwMF9mIDAuMDAwMDY1NDUwZgorI2RlZmluZSBMVlZETF8yUGlCeV8xNzY0MDBfZiAwLjAwMDAzNTYxOWYKKyNkZWZpbmUgTFZWRExfMlBpQnlfMTkyMDAwX2YgMC4wMDAwMzI3MjVmCitjb25zdCBMVk1fRkxPQVQgTFZWRExfMlBpT25Gc1RhYmxlW10gPSB7CisgICAgICAgIExWVkRMXzJQaUJ5XzgwMDBfZiwgIExWVkRMXzJQaUJ5XzExMDI1X2YsIExWVkRMXzJQaUJ5XzEyMDAwX2YsIExWVkRMXzJQaUJ5XzE2MDAwX2YsCisgICAgICAgIExWVkRMXzJQaUJ5XzIyMDUwX2YsIExWVkRMXzJQaUJ5XzI0MDAwX2YsIExWVkRMXzJQaUJ5XzMyMDAwX2YsIExWVkRMXzJQaUJ5XzQ0MTAwX2YsCisgICAgICAgIExWVkRMXzJQaUJ5XzQ4MDAwX2YsIExWVkRMXzJQaUJ5Xzg4MjAwX2YsIExWVkRMXzJQaUJ5Xzk2MDAwX2YsIExWVkRMXzJQaUJ5XzE3NjQwMF9mLAorICAgICAgICBMVlZETF8yUGlCeV8xOTIwMDBfZn07CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgTFZNX0dldE9tZWdhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC03NywxMCArNjgsOCBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdz0yKnBpKkZjL0ZzIGluIFEyLjI5IGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotTFZNX0ZMT0FUIExWTV9HZXRPbWVnYShMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgRmMsCi0gICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICBGcykKLXsKLSAgICBMVk1fRkxPQVQgICB3OworTFZNX0ZMT0FUIExWTV9HZXRPbWVnYShMVk1fVUlOVDMyIEZjLCBMVk1fRnNfZW4gRnMpIHsKKyAgICBMVk1fRkxPQVQgdzsKICAgICB3ID0gKExWTV9GTE9BVClGYyAqIExWVkRMXzJQaU9uRnNUYWJsZVtGc107CiAgICAgcmV0dXJuIHc7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfRmlsdGVyQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfRmlsdGVyQ29lZmZzLmgKaW5kZXggMjQ0ZjA5ZC4uMzFkY2FhNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX0ZpbHRlckNvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9GaWx0ZXJDb2VmZnMuaApAQCAtMzMsMTA5ICszMywxMDkgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIEFscGhhX1RhYmxlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgIDUwICAgICAgLyogVGhlIG51bWJlciBvZiB0YWJsZSBlbnRpcmVzICovCi0jZGVmaW5lIEFMUEhBXzAgICAgICAgICAgICAgICAgICAgICAgICAyMTQ3NDgwNzY5ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk5OSAqLwotI2RlZmluZSBBTFBIQV8xICAgICAgICAgICAgICAgICAgICAgICAgMjE0NzQ3OTU3NyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5OTggKi8KLSNkZWZpbmUgQUxQSEFfMiAgICAgICAgICAgICAgICAgICAgICAgIDIxNDc0Nzc4OTIgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTk3ICovCi0jZGVmaW5lIEFMUEhBXzMgICAgICAgICAgICAgICAgICAgICAgICAyMTQ3NDc1NTEwICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk5NiAqLwotI2RlZmluZSBBTFBIQV80ICAgICAgICAgICAgICAgICAgICAgICAgMjE0NzQ3MjE0MSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5OTUgKi8KLSNkZWZpbmUgQUxQSEFfNSAgICAgICAgICAgICAgICAgICAgICAgIDIxNDc0NjczNzcgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTkyICovCi0jZGVmaW5lIEFMUEhBXzYgICAgICAgICAgICAgICAgICAgICAgICAyMTQ3NDYwNjQyICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk4OSAqLwotI2RlZmluZSBBTFBIQV83ICAgICAgICAgICAgICAgICAgICAgICAgMjE0NzQ1MTExOCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5ODUgKi8KLSNkZWZpbmUgQUxQSEFfOCAgICAgICAgICAgICAgICAgICAgICAgIDIxNDc0Mzc2NTEgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTc5ICovCi0jZGVmaW5lIEFMUEhBXzkgICAgICAgICAgICAgICAgICAgICAgICAyMTQ3NDE4NjA4ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk3MCAqLwotI2RlZmluZSBBTFBIQV8xMCAgICAgICAgICAgICAgICAgICAgICAgMjE0NzM5MTY4MyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5NTcgKi8KLSNkZWZpbmUgQUxQSEFfMTEgICAgICAgICAgICAgICAgICAgICAgIDIxNDczNTM2MTEgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTM5ICovCi0jZGVmaW5lIEFMUEhBXzEyICAgICAgICAgICAgICAgICAgICAgICAyMTQ3Mjk5Nzc5ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTkxNCAqLwotI2RlZmluZSBBTFBIQV8xMyAgICAgICAgICAgICAgICAgICAgICAgMjE0NzIyMzY2MiAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk4NzkgKi8KLSNkZWZpbmUgQUxQSEFfMTQgICAgICAgICAgICAgICAgICAgICAgIDIxNDcxMTYwMzcgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5ODI5ICovCi0jZGVmaW5lIEFMUEhBXzE1ICAgICAgICAgICAgICAgICAgICAgICAyMTQ2OTYzODY1ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTc1OCAqLwotI2RlZmluZSBBTFBIQV8xNiAgICAgICAgICAgICAgICAgICAgICAgMjE0Njc0ODcxMiAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk2NTggKi8KLSNkZWZpbmUgQUxQSEFfMTcgICAgICAgICAgICAgICAgICAgICAgIDIxNDY0NDQ1MjIgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5NTE2ICovCi0jZGVmaW5lIEFMUEhBXzE4ICAgICAgICAgICAgICAgICAgICAgICAyMTQ2MDE0NDcyICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTMxNiAqLwotI2RlZmluZSBBTFBIQV8xOSAgICAgICAgICAgICAgICAgICAgICAgMjE0NTQwNjUyNyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTkwMzMgKi8KLSNkZWZpbmUgQUxQSEFfMjAgICAgICAgICAgICAgICAgICAgICAgIDIxNDQ1NDcxODggICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk4NjMzICovCi0jZGVmaW5lIEFMUEhBXzIxICAgICAgICAgICAgICAgICAgICAgICAyMTQzMzMyNjY5ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5ODA2NyAqLwotI2RlZmluZSBBTFBIQV8yMiAgICAgICAgICAgICAgICAgICAgICAgMjE0MTYxNjUxNCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTcyNjggKi8KLSNkZWZpbmUgQUxQSEFfMjMgICAgICAgICAgICAgICAgICAgICAgIDIxMzkxOTIyMTUgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk2MTM5ICovCi0jZGVmaW5lIEFMUEhBXzI0ICAgICAgICAgICAgICAgICAgICAgICAyMTM1NzY4OTM5ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5NDU0NSAqLwotI2RlZmluZSBBTFBIQV8yNSAgICAgICAgICAgICAgICAgICAgICAgMjEzMDkzNzc3NCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTIyOTUgKi8KLSNkZWZpbmUgQUxQSEFfMjYgICAgICAgICAgICAgICAgICAgICAgIDIxMjQxMjUxNTMgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTg5MTIzICovCi0jZGVmaW5lIEFMUEhBXzI3ICAgICAgICAgICAgICAgICAgICAgICAyMTE0NTI5MjYzICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk4NDY1NCAqLwotI2RlZmluZSBBTFBIQV8yOCAgICAgICAgICAgICAgICAgICAgICAgMjEwMTAzNDYxMiAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45NzgzNzAgKi8KLSNkZWZpbmUgQUxQSEFfMjkgICAgICAgICAgICAgICAgICAgICAgIDIwODIxMDAwMzAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTY5NTUzICovCi0jZGVmaW5lIEFMUEhBXzMwICAgICAgICAgICAgICAgICAgICAgICAyMDU1NjE3Mzk4ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk1NzIyMSAqLwotI2RlZmluZSBBTFBIQV8zMSAgICAgICAgICAgICAgICAgICAgICAgMjAxODc0NDgyNCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45NDAwNTEgKi8KLSNkZWZpbmUgQUxQSEFfMzIgICAgICAgICAgICAgICAgICAgICAgIDE5Njc3MzMwMTUgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTE2Mjk3ICovCi0jZGVmaW5lIEFMUEhBXzMzICAgICAgICAgICAgICAgICAgICAgICAxODk3Nzk0NTg3ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjg4MzcyOSAqLwotI2RlZmluZSBBTFBIQV8zNCAgICAgICAgICAgICAgICAgICAgICAgMTgwMzEyMzIzNCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC44Mzk2NDUgKi8KLSNkZWZpbmUgQUxQSEFfMzUgICAgICAgICAgICAgICAgICAgICAgIDE2NzcyNjIyMjAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuNzgxMDM2ICovCi0jZGVmaW5lIEFMUEhBXzM2ICAgICAgICAgICAgICAgICAgICAgICAxNTE0MTQyNjc1ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjcwNTA3OCAqLwotI2RlZmluZSBBTFBIQV8zNyAgICAgICAgICAgICAgICAgICAgICAgMTMxMDE5Nzg3NSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC42MTAxMDggKi8KLSNkZWZpbmUgQUxQSEFfMzggICAgICAgICAgICAgICAgICAgICAgIDEwNjc4MTM0ODAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuNDk3MjM5ICovCi0jZGVmaW5lIEFMUEhBXzM5ICAgICAgICAgICAgICAgICAgICAgICAgNzk5NjAxMzcxICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjM3MjM0MyAqLwotI2RlZmluZSBBTFBIQV80MCAgICAgICAgICAgICAgICAgICAgICAgIDUzMTE4MzA0OSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4yNDczNTEgKi8KLSNkZWZpbmUgQUxQSEFfNDEgICAgICAgICAgICAgICAgICAgICAgICAyOTc5MDQwMDcgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMTM4NzIyICovCi0jZGVmaW5lIEFMUEhBXzQyICAgICAgICAgICAgICAgICAgICAgICAgMTMxNDk5NzY4ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjA2MTIzNCAqLwotI2RlZmluZSBBTFBIQV80MyAgICAgICAgICAgICAgICAgICAgICAgICA0MTM3NTI4MiAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMTkyNjcgKi8KLSNkZWZpbmUgQUxQSEFfNDQgICAgICAgICAgICAgICAgICAgICAgICAgIDgwNjU4OTkgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAzNzU2ICovCi0jZGVmaW5lIEFMUEhBXzQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgNzk5MDc2ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDM3MiAqLwotI2RlZmluZSBBTFBIQV80NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDM5OCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMTQgKi8KLSNkZWZpbmUgQUxQSEFfNDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOTkgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMDAwICovCi0jZGVmaW5lIEFMUEhBXzQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDAwMCAqLwotI2RlZmluZSBBTFBIQV80OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMDAgKi8KLSNkZWZpbmUgQUxQSEFfNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMDAwICovCisjZGVmaW5lIEFscGhhX1RhYmxlU2l6ZSA1MCAgLyogVGhlIG51bWJlciBvZiB0YWJsZSBlbnRpcmVzICovCisjZGVmaW5lIEFMUEhBXzAgMjE0NzQ4MDc2OSAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk5OSAqLworI2RlZmluZSBBTFBIQV8xIDIxNDc0Nzk1NzcgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5OTggKi8KKyNkZWZpbmUgQUxQSEFfMiAyMTQ3NDc3ODkyICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTk3ICovCisjZGVmaW5lIEFMUEhBXzMgMjE0NzQ3NTUxMCAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk5NiAqLworI2RlZmluZSBBTFBIQV80IDIxNDc0NzIxNDEgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5OTUgKi8KKyNkZWZpbmUgQUxQSEFfNSAyMTQ3NDY3Mzc3ICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTkyICovCisjZGVmaW5lIEFMUEhBXzYgMjE0NzQ2MDY0MiAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk4OSAqLworI2RlZmluZSBBTFBIQV83IDIxNDc0NTExMTggIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5ODUgKi8KKyNkZWZpbmUgQUxQSEFfOCAyMTQ3NDM3NjUxICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTc5ICovCisjZGVmaW5lIEFMUEhBXzkgMjE0NzQxODYwOCAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk3MCAqLworI2RlZmluZSBBTFBIQV8xMCAyMTQ3MzkxNjgzIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5NTcgKi8KKyNkZWZpbmUgQUxQSEFfMTEgMjE0NzM1MzYxMSAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTM5ICovCisjZGVmaW5lIEFMUEhBXzEyIDIxNDcyOTk3NzkgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTkxNCAqLworI2RlZmluZSBBTFBIQV8xMyAyMTQ3MjIzNjYyIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk4NzkgKi8KKyNkZWZpbmUgQUxQSEFfMTQgMjE0NzExNjAzNyAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5ODI5ICovCisjZGVmaW5lIEFMUEhBXzE1IDIxNDY5NjM4NjUgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTc1OCAqLworI2RlZmluZSBBTFBIQV8xNiAyMTQ2NzQ4NzEyIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk2NTggKi8KKyNkZWZpbmUgQUxQSEFfMTcgMjE0NjQ0NDUyMiAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5NTE2ICovCisjZGVmaW5lIEFMUEhBXzE4IDIxNDYwMTQ0NzIgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTMxNiAqLworI2RlZmluZSBBTFBIQV8xOSAyMTQ1NDA2NTI3IC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTkwMzMgKi8KKyNkZWZpbmUgQUxQSEFfMjAgMjE0NDU0NzE4OCAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk4NjMzICovCisjZGVmaW5lIEFMUEhBXzIxIDIxNDMzMzI2NjkgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5ODA2NyAqLworI2RlZmluZSBBTFBIQV8yMiAyMTQxNjE2NTE0IC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTcyNjggKi8KKyNkZWZpbmUgQUxQSEFfMjMgMjEzOTE5MjIxNSAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk2MTM5ICovCisjZGVmaW5lIEFMUEhBXzI0IDIxMzU3Njg5MzkgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5NDU0NSAqLworI2RlZmluZSBBTFBIQV8yNSAyMTMwOTM3Nzc0IC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTIyOTUgKi8KKyNkZWZpbmUgQUxQSEFfMjYgMjEyNDEyNTE1MyAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTg5MTIzICovCisjZGVmaW5lIEFMUEhBXzI3IDIxMTQ1MjkyNjMgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk4NDY1NCAqLworI2RlZmluZSBBTFBIQV8yOCAyMTAxMDM0NjEyIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45NzgzNzAgKi8KKyNkZWZpbmUgQUxQSEFfMjkgMjA4MjEwMDAzMCAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTY5NTUzICovCisjZGVmaW5lIEFMUEhBXzMwIDIwNTU2MTczOTggLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk1NzIyMSAqLworI2RlZmluZSBBTFBIQV8zMSAyMDE4NzQ0ODI0IC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45NDAwNTEgKi8KKyNkZWZpbmUgQUxQSEFfMzIgMTk2NzczMzAxNSAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTE2Mjk3ICovCisjZGVmaW5lIEFMUEhBXzMzIDE4OTc3OTQ1ODcgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjg4MzcyOSAqLworI2RlZmluZSBBTFBIQV8zNCAxODAzMTIzMjM0IC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC44Mzk2NDUgKi8KKyNkZWZpbmUgQUxQSEFfMzUgMTY3NzI2MjIyMCAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuNzgxMDM2ICovCisjZGVmaW5lIEFMUEhBXzM2IDE1MTQxNDI2NzUgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjcwNTA3OCAqLworI2RlZmluZSBBTFBIQV8zNyAxMzEwMTk3ODc1IC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC42MTAxMDggKi8KKyNkZWZpbmUgQUxQSEFfMzggMTA2NzgxMzQ4MCAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuNDk3MjM5ICovCisjZGVmaW5lIEFMUEhBXzM5IDc5OTYwMTM3MSAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjM3MjM0MyAqLworI2RlZmluZSBBTFBIQV80MCA1MzExODMwNDkgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4yNDczNTEgKi8KKyNkZWZpbmUgQUxQSEFfNDEgMjk3OTA0MDA3ICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMTM4NzIyICovCisjZGVmaW5lIEFMUEhBXzQyIDEzMTQ5OTc2OCAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjA2MTIzNCAqLworI2RlZmluZSBBTFBIQV80MyA0MTM3NTI4MiAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMTkyNjcgKi8KKyNkZWZpbmUgQUxQSEFfNDQgODA2NTg5OSAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAzNzU2ICovCisjZGVmaW5lIEFMUEhBXzQ1IDc5OTA3NiAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDM3MiAqLworI2RlZmluZSBBTFBIQV80NiAzMDM5OCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMTQgKi8KKyNkZWZpbmUgQUxQSEFfNDcgMjk5ICAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMDAwICovCisjZGVmaW5lIEFMUEhBXzQ4IDAgICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDAwMCAqLworI2RlZmluZSBBTFBIQV80OSAwICAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMDAgKi8KKyNkZWZpbmUgQUxQSEFfNTAgMCAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMDAwICovCiAKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMCAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTk5ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8xICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5OThmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzIgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk5N2YKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMyAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTk2ZgotI2RlZmluZSBBTFBIQV9GbG9hdF80ICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5OTVmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzUgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk5MmYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfNiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTg5ZgotI2RlZmluZSBBTFBIQV9GbG9hdF83ICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5ODVmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzggICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk3OWYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfOSAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTcwZgotI2RlZmluZSBBTFBIQV9GbG9hdF8xMCAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5NTdmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzExICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTkzOWYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTE0ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8xMyAgICAgICAgICAgICAgICAgICAgICAgMC45OTk4NzlmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzE0ICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTgyOWYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMTUgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5NzU4ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8xNiAgICAgICAgICAgICAgICAgICAgICAgMC45OTk2NThmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzE3ICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTUxNmYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMTggICAgICAgICAgICAgICAgICAgICAgIDAuOTk5MzE2ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8xOSAgICAgICAgICAgICAgICAgICAgICAgMC45OTkwMzNmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzIwICAgICAgICAgICAgICAgICAgICAgICAwLjk5ODYzM2YKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMjEgICAgICAgICAgICAgICAgICAgICAgIDAuOTk4MDY3ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8yMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTcyNjhmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzIzICAgICAgICAgICAgICAgICAgICAgICAwLjk5NjEzOWYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMjQgICAgICAgICAgICAgICAgICAgICAgIDAuOTk0NTQ1ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8yNSAgICAgICAgICAgICAgICAgICAgICAgMC45OTIyOTVmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzI2ICAgICAgICAgICAgICAgICAgICAgICAwLjk4OTEyM2YKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMjcgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NjU0ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8yOCAgICAgICAgICAgICAgICAgICAgICAgMC45NzgzNzBmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzI5ICAgICAgICAgICAgICAgICAgICAgICAwLjk2OTU1M2YKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMzAgICAgICAgICAgICAgICAgICAgICAgIDAuOTU3MjIxZgotI2RlZmluZSBBTFBIQV9GbG9hdF8zMSAgICAgICAgICAgICAgICAgICAgICAgMC45NDAwNTFmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzMyICAgICAgICAgICAgICAgICAgICAgICAwLjkxNjI5N2YKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMzMgICAgICAgICAgICAgICAgICAgICAgIDAuODgzNzI5ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8zNCAgICAgICAgICAgICAgICAgICAgICAgMC44Mzk2NDVmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzM1ICAgICAgICAgICAgICAgICAgICAgICAwLjc4MTAzNmYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMzYgICAgICAgICAgICAgICAgICAgICAgIDAuNzA1MDc4ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8zNyAgICAgICAgICAgICAgICAgICAgICAgMC42MTAxMDhmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzM4ICAgICAgICAgICAgICAgICAgICAgICAwLjQ5NzIzOWYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMzkgICAgICAgICAgICAgICAgICAgICAgIDAuMzcyMzQzZgotI2RlZmluZSBBTFBIQV9GbG9hdF80MCAgICAgICAgICAgICAgICAgICAgICAgMC4yNDczNTFmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzQxICAgICAgICAgICAgICAgICAgICAgICAwLjEzODcyMmYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfNDIgICAgICAgICAgICAgICAgICAgICAgIDAuMDYxMjM0ZgotI2RlZmluZSBBTFBIQV9GbG9hdF80MyAgICAgICAgICAgICAgICAgICAgICAgMC4wMTkyNjdmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzQ0ICAgICAgICAgICAgICAgICAgICAgICAwLjAwMzc1NmYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfNDUgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMzcyZgotI2RlZmluZSBBTFBIQV9GbG9hdF80NiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMTRmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzQ3ICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfNDggICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBBTFBIQV9GbG9hdF80OSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzUwICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMCAwLjk5OTk5OWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMSAwLjk5OTk5OGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMiAwLjk5OTk5N2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMyAwLjk5OTk5NmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNCAwLjk5OTk5NWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNSAwLjk5OTk5MmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNiAwLjk5OTk4OWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNyAwLjk5OTk4NWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfOCAwLjk5OTk3OWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfOSAwLjk5OTk3MGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTAgMC45OTk5NTdmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzExIDAuOTk5OTM5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xMiAwLjk5OTkxNGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTMgMC45OTk4NzlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzE0IDAuOTk5ODI5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xNSAwLjk5OTc1OGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTYgMC45OTk2NThmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzE3IDAuOTk5NTE2ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xOCAwLjk5OTMxNmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTkgMC45OTkwMzNmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzIwIDAuOTk4NjMzZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yMSAwLjk5ODA2N2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjIgMC45OTcyNjhmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzIzIDAuOTk2MTM5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yNCAwLjk5NDU0NWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjUgMC45OTIyOTVmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzI2IDAuOTg5MTIzZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yNyAwLjk4NDY1NGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjggMC45NzgzNzBmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzI5IDAuOTY5NTUzZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zMCAwLjk1NzIyMWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzEgMC45NDAwNTFmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzMyIDAuOTE2Mjk3ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zMyAwLjg4MzcyOWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzQgMC44Mzk2NDVmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzM1IDAuNzgxMDM2ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zNiAwLjcwNTA3OGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzcgMC42MTAxMDhmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzM4IDAuNDk3MjM5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zOSAwLjM3MjM0M2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDAgMC4yNDczNTFmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQxIDAuMTM4NzIyZgorI2RlZmluZSBBTFBIQV9GbG9hdF80MiAwLjA2MTIzNGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDMgMC4wMTkyNjdmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQ0IDAuMDAzNzU2ZgorI2RlZmluZSBBTFBIQV9GbG9hdF80NSAwLjAwMDM3MmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDYgMC4wMDAwMTRmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQ3IDAuMDAwMDAwZgorI2RlZmluZSBBTFBIQV9GbG9hdF80OCAwLjAwMDAwMGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDkgMC4wMDAwMDBmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzUwIDAuMDAwMDAwZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9UaW1lQ29uc3RhbnQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jcHAKaW5kZXggNzNkYTJjZi4uM2VjMTAzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jcHAKQEAgLTU2LDgzICs1NiwzNyBAQAogLyogIEFscGhhICAgLSB0aGUgZmlsdGVyIGNvZWZmaWNpZW50IFEzMSBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX0ZMT0FUIExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZNX1VJTlQzMiAgIHRjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICBGcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgTnVtQ2hhbm5lbHMpCi17Ci0KLSAgICBMVk1fVUlOVDMyICBQcm9kdWN0OwotICAgIExWTV9GTE9BVCAgUHJvZHVjdEZsb2F0OwotICAgIExWTV9JTlQxNiAgIEludGVycG9sYXRlU2hvcnQ7Ci0gICAgTFZNX0ZMT0FUICAgSW50ZXJwb2xhdGU7Ci0gICAgTFZNX1VJTlQxNiAgU2hpZnQ7Ci0gICAgTFZNX0ZMT0FUICAgRGlmZjsKLSAgICBMVk1fRkxPQVQgIFRhYmxlW10gPSB7QUxQSEFfRmxvYXRfMCwgICAgICAgICAgICAgLyogTG9nIHNwYWNlZCBsb29rLXVwIHRhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI1LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM3LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ2LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80NywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF81MH07CitMVk1fRkxPQVQgTFZNX01peGVyX1RpbWVDb25zdGFudChMVk1fVUlOVDMyIHRjLCBMVk1fVUlOVDMyIEZzLCBMVk1fVUlOVDE2IE51bUNoYW5uZWxzKSB7CisgICAgTFZNX1VJTlQzMiBQcm9kdWN0OworICAgIExWTV9GTE9BVCBQcm9kdWN0RmxvYXQ7CisgICAgTFZNX0lOVDE2IEludGVycG9sYXRlU2hvcnQ7CisgICAgTFZNX0ZMT0FUIEludGVycG9sYXRlOworICAgIExWTV9VSU5UMTYgU2hpZnQ7CisgICAgTFZNX0ZMT0FUIERpZmY7CisgICAgTFZNX0ZMT0FUIFRhYmxlW10gPSB7CisgICAgICAgICAgICBBTFBIQV9GbG9hdF8wLCAvKiBMb2cgc3BhY2VkIGxvb2stdXAgdGFibGUgKi8KKyAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEsICBBTFBIQV9GbG9hdF8yLCAgQUxQSEFfRmxvYXRfMywgIEFMUEhBX0Zsb2F0XzQsICBBTFBIQV9GbG9hdF81LAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfNiwgIEFMUEhBX0Zsb2F0XzcsICBBTFBIQV9GbG9hdF84LCAgQUxQSEFfRmxvYXRfOSwgIEFMUEhBX0Zsb2F0XzEwLAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTEsIEFMUEhBX0Zsb2F0XzEyLCBBTFBIQV9GbG9hdF8xMywgQUxQSEFfRmxvYXRfMTQsIEFMUEhBX0Zsb2F0XzE1LAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTYsIEFMUEhBX0Zsb2F0XzE3LCBBTFBIQV9GbG9hdF8xOCwgQUxQSEFfRmxvYXRfMTksIEFMUEhBX0Zsb2F0XzIwLAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjEsIEFMUEhBX0Zsb2F0XzIyLCBBTFBIQV9GbG9hdF8yMywgQUxQSEFfRmxvYXRfMjQsIEFMUEhBX0Zsb2F0XzI1LAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjYsIEFMUEhBX0Zsb2F0XzI3LCBBTFBIQV9GbG9hdF8yOCwgQUxQSEFfRmxvYXRfMjksIEFMUEhBX0Zsb2F0XzMwLAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzEsIEFMUEhBX0Zsb2F0XzMyLCBBTFBIQV9GbG9hdF8zMywgQUxQSEFfRmxvYXRfMzQsIEFMUEhBX0Zsb2F0XzM1LAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzYsIEFMUEhBX0Zsb2F0XzM3LCBBTFBIQV9GbG9hdF8zOCwgQUxQSEFfRmxvYXRfMzksIEFMUEhBX0Zsb2F0XzQwLAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDEsIEFMUEhBX0Zsb2F0XzQyLCBBTFBIQV9GbG9hdF80MywgQUxQSEFfRmxvYXRfNDQsIEFMUEhBX0Zsb2F0XzQ1LAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDYsIEFMUEhBX0Zsb2F0XzQ3LCBBTFBIQV9GbG9hdF80OCwgQUxQSEFfRmxvYXRfNDksIEFMUEhBX0Zsb2F0XzUwfTsKIAogICAgIC8qIENhbGN1bGF0ZSB0aGUgcHJvZHVjdCBvZiB0aGUgdGltZSBjb25zdGFudCBhbmQgdGhlIHNhbXBsZSByYXRlICovCi0gICAgUHJvZHVjdCA9ICgodGMgPj4gMTYpICogKExWTV9VSU5UMzIpRnMpIDw8IDEzOyAgLyogU3RlcmVvIHZhbHVlICovCisgICAgUHJvZHVjdCA9ICgodGMgPj4gMTYpICogKExWTV9VSU5UMzIpRnMpIDw8IDEzOyAvKiBTdGVyZW8gdmFsdWUgKi8KICAgICBQcm9kdWN0ID0gUHJvZHVjdCArICgoKHRjICYgMHgwMDAwRkZGRikgKiAoTFZNX1VJTlQzMilGcykgPj4gMyk7CiAKLSAgICBpZiAoTnVtQ2hhbm5lbHMgPT0gMSkKLSAgICB7Ci0gICAgICAgIFByb2R1Y3QgPSBQcm9kdWN0ID4+IDE7ICAgLyogTW9ubyB2YWx1ZSAqLworICAgIGlmIChOdW1DaGFubmVscyA9PSAxKSB7CisgICAgICAgIFByb2R1Y3QgPSBQcm9kdWN0ID4+IDE7IC8qIE1vbm8gdmFsdWUgKi8KICAgICB9CiAKICAgICAvKiBOb3JtYWxpemUgdG8gZ2V0IHRoZSB0YWJsZSBpbmRleCBhbmQgaW50ZXJwb2xhdGlvbiBmYWN0b3IgKi8KLSAgICBmb3IgKFNoaWZ0ID0gMDsgU2hpZnQgPCAoKEFscGhhX1RhYmxlU2l6ZSAtIDEpIC8gMik7IFNoaWZ0KyspCi0gICAgewotICAgICAgICBpZiAoKFByb2R1Y3QgJiAweDgwMDAwMDAwKSAhPSAwKQotICAgICAgICB7CisgICAgZm9yIChTaGlmdCA9IDA7IFNoaWZ0IDwgKChBbHBoYV9UYWJsZVNpemUgLSAxKSAvIDIpOyBTaGlmdCsrKSB7CisgICAgICAgIGlmICgoUHJvZHVjdCAmIDB4ODAwMDAwMDApICE9IDApIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE0MCw4ICs5NCw3IEBACiAgICAgfQogICAgIFNoaWZ0ID0gKExWTV9VSU5UMTYpKChTaGlmdCA8PCAxKSk7CiAKLSAgICBpZiAoKFByb2R1Y3QgJiAweDQwMDAwMDAwKT09MCkKLSAgICB7CisgICAgaWYgKChQcm9kdWN0ICYgMHg0MDAwMDAwMCkgPT0gMCkgewogICAgICAgICBTaGlmdCsrOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1BvbHlub21pYWwuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1BvbHlub21pYWwuY3BwCmluZGV4IDJjM2U5ZWMuLjgzODI1MjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb2x5bm9taWFsLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG9seW5vbWlhbC5jcHAKQEAgLTQwLDMzICs0MCwyNSBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgVGhlIHJlc3VsdCBvZiB0aGUgcG9seW5vbWlhbCBleHBhbnNpb24gaW4gUTEuMzEgZm9ybWF0ICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotTFZNX0ZMT0FUIExWTV9Qb2x5bm9taWFsKExWTV9VSU5UMTYgICAgTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgKnBDb2VmZmljaWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgIFgpCi17CitMVk1fRkxPQVQgTFZNX1BvbHlub21pYWwoTFZNX1VJTlQxNiBOLCBMVk1fRkxPQVQqIHBDb2VmZmljaWVudHMsIExWTV9GTE9BVCBYKSB7CiAgICAgTFZNX0lOVDMyIGk7Ci0gICAgTFZNX0ZMT0FUIFksQSxYVGVtcCxUZW1wLHNpZ247CisgICAgTFZNX0ZMT0FUIFksIEEsIFhUZW1wLCBUZW1wLCBzaWduOwogCiAgICAgWSA9ICpwQ29lZmZpY2llbnRzOyAvKiBZPUEwKi8KICAgICBwQ29lZmZpY2llbnRzKys7CiAKLSAgICBpZihYID09IC0xLjBmKQotICAgIHsKKyAgICBpZiAoWCA9PSAtMS4wZikgewogICAgICAgICBUZW1wID0gLTE7CiAgICAgICAgIHNpZ24gPSBUZW1wOwotICAgICAgICBmb3IoaSA9IDE7IGkgPD0gTjsgaSsrKQotICAgICAgICB7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gTjsgaSsrKSB7CiAgICAgICAgICAgICBZICs9ICgoKnBDb2VmZmljaWVudHMpICogc2lnbik7CiAgICAgICAgICAgICBwQ29lZmZpY2llbnRzKys7CiAgICAgICAgICAgICBzaWduICo9IFRlbXA7CiAgICAgICAgIH0KIAotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICAgIFhUZW1wID0gWDsKLSAgICAgICAgZm9yKGkgPSBOLTE7IGkgPj0gMDsgaS0tKQotICAgICAgICB7CisgICAgICAgIGZvciAoaSA9IE4gLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgQSA9ICpwQ29lZmZpY2llbnRzOwogICAgICAgICAgICAgcENvZWZmaWNpZW50cysrOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG93ZXIxMC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG93ZXIxMC5jcHAKaW5kZXggYWU4ZTlkMS4uODU1OTZhYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1Bvd2VyMTAuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb3dlcjEwLmNwcApAQCAtNTMsMjMgKzUzLDEwIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBUaGUgcmVzdWx0IG9mIHRoZSAxMHggZXhwYW5zaW9uIGluIFE4LjI0IGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1MVk1fRkxPQVQgTFZNX1Bvd2VyMTAoTFZNX0ZMT0FUICAgICBYKQotewotICAgIExWTV9GTE9BVCBZLENvZWZmaWNpZW50c1sxM109ezAuOTk5OTA2ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjMwMjQ3NWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi42NTI3NjVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDM1NDk0ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjE2NTY2N2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41Mzc2NzZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjEzMTkyZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA2OTYwM2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMTY1NTNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA0MzczZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMTgxN2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAzNjdmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB9OwotICAgIFk9TFZNX1BvbHlub21pYWwoKExWTV9VSU5UMTYpMTEsCi0gICAgICAgICAgICAgICAgICAgICBDb2VmZmljaWVudHMsCi0gICAgICAgICAgICAgICAgICAgICBYKTsKK0xWTV9GTE9BVCBMVk1fUG93ZXIxMChMVk1fRkxPQVQgWCkgeworICAgIExWTV9GTE9BVCBZLCBDb2VmZmljaWVudHNbMTNdID0gezAuOTk5OTA2ZiwgMi4zMDI0NzVmLCAyLjY1Mjc2NWYsIDIuMDM1NDk0ZiwgMS4xNjU2NjdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTM3Njc2ZiwgMC4yMTMxOTJmLCAwLjA2OTYwM2YsIDAuMDE2NTUzZiwgMC4wMDQzNzNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxODE3ZiwgMC4wMDAzNjdmLCAwfTsKKyAgICBZID0gTFZNX1BvbHlub21pYWwoKExWTV9VSU5UMTYpMTEsIENvZWZmaWNpZW50cywgWCk7CiAgICAgcmV0dXJuIFk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyLmNwcAppbmRleCA1OTk1ZjU0Li5iZTdjOGU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9UaW1lci5jcHAKQEAgLTI2LDE5ICsyNiwxNiBAQAogLyogIFRJTUVSIEZVTkNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBMVk1fVGltZXIgICAgICAoICAgTFZNX1RpbWVyX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgIEJsb2NrU2l6ZSApewordm9pZCBMVk1fVGltZXIoTFZNX1RpbWVyX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX0lOVDE2IEJsb2NrU2l6ZSkgeworICAgIExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QqIHBJbnN0YW5jZVByOworICAgIHBJbnN0YW5jZVByID0gKExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QqKXBJbnN0YW5jZTsKIAotICAgIExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QgKnBJbnN0YW5jZVByOwotICAgIHBJbnN0YW5jZVByID0gKExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QgKilwSW5zdGFuY2U7Ci0KLSAgICBpZiAocEluc3RhbmNlUHItPlRpbWVyQXJtZWQpeworICAgIGlmIChwSW5zdGFuY2VQci0+VGltZXJBcm1lZCkgewogICAgICAgICBwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcyAtPSBCbG9ja1NpemU7Ci0gICAgICAgIGlmIChwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcyA8PSAwKXsKKyAgICAgICAgaWYgKHBJbnN0YW5jZVByLT5SZW1haW5pbmdUaW1lSW5TYW1wbGVzIDw9IDApIHsKICAgICAgICAgICAgIHBJbnN0YW5jZVByLT5UaW1lckFybWVkID0gMDsKLSAgICAgICAgICAgICgqcEluc3RhbmNlUHItPnBDYWxsQmFjaykgKCBwSW5zdGFuY2VQci0+cENhbGxiYWNrSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlUHItPnBDYWxsQmFja1BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2VQci0+Q2FsbEJhY2tQYXJhbSApOworICAgICAgICAgICAgKCpwSW5zdGFuY2VQci0+cENhbGxCYWNrKShwSW5zdGFuY2VQci0+cENhbGxiYWNrSW5zdGFuY2UsIHBJbnN0YW5jZVByLT5wQ2FsbEJhY2tQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZVByLT5DYWxsQmFja1BhcmFtKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9UaW1lcl9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9UaW1lcl9Jbml0LmNwcAppbmRleCAzMDE1MDU3Li5iZmQ2YmNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXJfSW5pdC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyX0luaXQuY3BwCkBAIC0zMywyMCArMzMsMjAgQEAKIC8qICBJTklUIEZVTkNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgTFZNX1RpbWVyX0luaXQgKCAgIExWTV9UaW1lcl9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVk1fVGltZXJfUGFyYW1zX3QgICAgICAgICAqcFBhcmFtcyAgICAgKXsKK3ZvaWQgTFZNX1RpbWVyX0luaXQoTFZNX1RpbWVyX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX1RpbWVyX1BhcmFtc190KiBwUGFyYW1zKSB7CisgICAgTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCogcEluc3RhbmNlUHI7CisgICAgcEluc3RhbmNlUHIgPSAoTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCopcEluc3RhbmNlOwogCi0gICAgTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCAqcEluc3RhbmNlUHI7Ci0gICAgcEluc3RhbmNlUHIgPSAoTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCAqKXBJbnN0YW5jZTsKLQotICAgIHBJbnN0YW5jZVByLT5DYWxsQmFja1BhcmFtICAgICA9IHBQYXJhbXMtPkNhbGxCYWNrUGFyYW07Ci0gICAgcEluc3RhbmNlUHItPnBDYWxsQmFja1BhcmFtcyAgID0gKExWTV9JTlQzMiAqKXBQYXJhbXMtPnBDYWxsQmFja1BhcmFtczsKKyAgICBwSW5zdGFuY2VQci0+Q2FsbEJhY2tQYXJhbSA9IHBQYXJhbXMtPkNhbGxCYWNrUGFyYW07CisgICAgcEluc3RhbmNlUHItPnBDYWxsQmFja1BhcmFtcyA9IChMVk1fSU5UMzIqKXBQYXJhbXMtPnBDYWxsQmFja1BhcmFtczsKICAgICBwSW5zdGFuY2VQci0+cENhbGxiYWNrSW5zdGFuY2UgPSBwUGFyYW1zLT5wQ2FsbGJhY2tJbnN0YW5jZTsKLSAgICBwSW5zdGFuY2VQci0+cENhbGxCYWNrICAgICAgICAgPSBwUGFyYW1zLT5wQ2FsbEJhY2s7Ci0gICAgcEluc3RhbmNlUHItPlRpbWVyQXJtZWQgICAgICAgID0gMTsKKyAgICBwSW5zdGFuY2VQci0+cENhbGxCYWNrID0gcFBhcmFtcy0+cENhbGxCYWNrOworICAgIHBJbnN0YW5jZVByLT5UaW1lckFybWVkID0gMTsKIAotICAgIE1VTDMyeDE2SU5UTzMyKHBQYXJhbXMtPlNhbXBsaW5nUmF0ZSxPbmVPdmVyVGhvdXNhbmRJblEyNCxwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcywxNik7ICAvKiAoUTAgKiBRMjQpID4+MTYgaW50byBROCovCi0gICAgTVVMMzJ4MTZJTlRPMzIocEluc3RhbmNlUHItPlJlbWFpbmluZ1RpbWVJblNhbXBsZXMscFBhcmFtcy0+VGltZUluTXMscEluc3RhbmNlUHItPlJlbWFpbmluZ1RpbWVJblNhbXBsZXMsOCk7ICAvKiAoUTggKiBRMCkgPj44IGludG8gUTAqLworICAgIE1VTDMyeDE2SU5UTzMyKHBQYXJhbXMtPlNhbXBsaW5nUmF0ZSwgT25lT3ZlclRob3VzYW5kSW5RMjQsIHBJbnN0YW5jZVByLT5SZW1haW5pbmdUaW1lSW5TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgIDE2KTsgLyogKFEwICogUTI0KSA+PjE2IGludG8gUTgqLworICAgIE1VTDMyeDE2SU5UTzMyKHBJbnN0YW5jZVByLT5SZW1haW5pbmdUaW1lSW5TYW1wbGVzLCBwUGFyYW1zLT5UaW1lSW5NcywKKyAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcywgOCk7IC8qIChROCAqIFEwKSA+PjggaW50byBRMCovCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9UaW1lcl9Qcml2YXRlLmgKaW5kZXggYTM3MmI4Mi4uM2U4YWJhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXJfUHJpdmF0ZS5oCkBAIC0yNCwxNCArMjQsMTMgQEAKIC8qICBUWVBFIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0lOVDMyICBSZW1haW5pbmdUaW1lSW5TYW1wbGVzOwotICAgIExWTV9JTlQzMiAgQ2FsbEJhY2tQYXJhbTsKLSAgICBMVk1fSU5UMzIgICpwQ2FsbEJhY2tQYXJhbXM7Ci0gICAgdm9pZCAgKnBDYWxsYmFja0luc3RhbmNlOwotICAgIHZvaWQgICgqcENhbGxCYWNrKSh2b2lkKix2b2lkKixMVk1fSU5UMzIpOwotICAgIExWTV9JTlQxNiBUaW1lckFybWVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvb2xlYW4sIHRydWUgYmV0d2VlbiBpbml0IGFuZCBjYWxsYmFjayAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9JTlQzMiBSZW1haW5pbmdUaW1lSW5TYW1wbGVzOworICAgIExWTV9JTlQzMiBDYWxsQmFja1BhcmFtOworICAgIExWTV9JTlQzMiogcENhbGxCYWNrUGFyYW1zOworICAgIHZvaWQqIHBDYWxsYmFja0luc3RhbmNlOworICAgIHZvaWQgKCpwQ2FsbEJhY2spKHZvaWQqLCB2b2lkKiwgTFZNX0lOVDMyKTsKKyAgICBMVk1fSU5UMTYgVGltZXJBcm1lZDsgLyogQm9vbGVhbiwgdHJ1ZSBiZXR3ZWVuIGluaXQgYW5kIGNhbGxiYWNrICovCiAKIH0gTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdDsKIApAQCAtMzksNCArMzgsNCBAQAogLyogIEVORCBPRiBIRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2VuZGlmICAvKiBMVk1fVElNRVJfUFJJVkFURV9IICovCisjZW5kaWYgLyogTFZNX1RJTUVSX1BSSVZBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xvYWRDb25zdF8xNi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OGNhMGUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBJTkNMVURFIEZJTEVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIExvYWRDb25zdF8xNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgTG9hZENvbnN0XzE2KGNvbnN0IExWTV9JTlQxNiB2YWwsCi0gICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICkKLXsKLSAgICBMVk1fSU5UMTYgaWk7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgICpkc3QgPSB2YWw7Ci0gICAgICAgIGRzdCsrOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc4OTc1Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREUgRklMRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gTG9hZENvbnN0XzMyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTG9hZENvbnN0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAgIHZhbCwKLSAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICkKLXsKLSAgICBMVk1fSU5UMTYgaWk7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgICpkc3QgPSB2YWw7Ci0gICAgICAgIGRzdCsrOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuY3BwCmluZGV4IDFlYTc2NWEuLmU1YzZmMTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuY3BwCkBAIC0xOCw3NCArMTgsMTQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBJTkNMVURFIEZJTEVTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiAgTVNUTzJJX1NBVF8xNlgxNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgTVNUbzJpX1NhdF8xNngxNihjb25zdCBMVk1fSU5UMTYgICpzcmNNLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgKnNyY1MsCi0gICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCi17Ci0gICAgTFZNX0lOVDMyIHRlbXAsbVZhbCxzVmFsOwordm9pZCBNU1RvMmlfU2F0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjTSwgY29uc3QgTFZNX0ZMT0FUKiBzcmNTLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKKyAgICBMVk1fRkxPQVQgdGVtcCwgbVZhbCwgc1ZhbDsKICAgICBMVk1fSU5UMTYgaWk7CiAKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIG1WYWw9KExWTV9JTlQzMikqc3JjTTsKLSAgICAgICAgc3JjTSsrOwotCi0gICAgICAgIHNWYWw9KExWTV9JTlQzMikqc3JjUzsKLSAgICAgICAgc3JjUysrOwotCi0gICAgICAgIHRlbXAgPSBtVmFsICsgc1ZhbDsKLQotICAgICAgICBpZiAodGVtcCA+IDB4MDAwMDdGRkYpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAweDdGRkY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGVtcCA8IC0weDAwMDA4MDAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gLSAweDgwMDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gKExWTV9JTlQxNil0ZW1wOwotICAgICAgICB9Ci0gICAgICAgIGRzdCsrOwotCi0gICAgICAgIHRlbXAgPSBtVmFsIC0gc1ZhbDsKLQotICAgICAgICBpZiAodGVtcCA+IDB4MDAwMDdGRkYpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAweDdGRkY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGVtcCA8IC0weDAwMDA4MDAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gLSAweDgwMDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gKExWTV9JTlQxNil0ZW1wOwotICAgICAgICB9Ci0gICAgICAgIGRzdCsrOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLXZvaWQgTVNUbzJpX1NhdF9GbG9hdChjb25zdCBMVk1fRkxPQVQgICpzcmNNLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgKnNyY1MsCi0gICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCi17Ci0gICAgTFZNX0ZMT0FUIHRlbXAsbVZhbCxzVmFsOwotICAgIExWTV9JTlQxNiBpaTsKLQotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICBtVmFsID0gKExWTV9GTE9BVCkqc3JjTTsKICAgICAgICAgc3JjTSsrOwogCkBAIC05MywzOCArMzMsMTEgQEAKICAgICAgICAgc3JjUysrOwogCiAgICAgICAgIHRlbXAgPSBtVmFsICsgc1ZhbDsKLQotICAgICAgICBpZiAodGVtcCA+IDEuMGYpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAxLjBmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRlbXAgPCAtMS4wZikKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IC0xLjBmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IChMVk1fRkxPQVQpdGVtcDsKLSAgICAgICAgfQotICAgICAgICBkc3QrKzsKKyAgICAgICAgKmRzdCsrID0gTFZNX0NsYW1wKHRlbXApOwogCiAgICAgICAgIHRlbXAgPSBtVmFsIC0gc1ZhbDsKLQotICAgICAgICBpZiAodGVtcCA+IDEuMGYpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAxLjBmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRlbXAgPCAtMS4wZikKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IC0gMS4wZjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAoTFZNX0ZMT0FUKXRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgZHN0Kys7CisgICAgICAgICpkc3QrKyA9IExWTV9DbGFtcCh0ZW1wKTsKICAgICB9CiAKICAgICByZXR1cm47CiB9Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8xNngxNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMTZ4MTYuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTg0MjUxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8xNngxNi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICVjcmVhdGVkX2J5OiAgICBzcmEgJSAoQ00vUykKLSAgICAgJW5hbWU6ICAgICAgICAgIE1hYzNzX1NhdF8xNngxNi5jICUgKENNL1MpCi0gICAgICV2ZXJzaW9uOiAgICAgICAxICUgKENNL1MpCi0gICAgICVkYXRlX2NyZWF0ZWQ6ICBGcmkgTm92IDEzIDEyOjA3OjEzIDIwMDkgJSAoQ00vUykKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBJTkNMVURFIEZJTEVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBNYWMzU18xNlgxNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgTWFjM3NfU2F0XzE2eDE2KCBjb25zdCBMVk1fSU5UMTYgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCi0gICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQotewotICAgIExWTV9JTlQxNiBpaTsKLSAgICBMVk1fSU5UMTYgc3JjdmFsOwotICAgIExWTV9JTlQzMiBUZW1wLGRJblZhbDsKLQotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKLSAgICAgICAgc3JjdmFsPSpzcmM7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgIFRlbXAgPSAoc3JjdmFsICp2YWwpPj4xNTsKLQotICAgICAgICBkSW5WYWwgID0gKExWTV9JTlQzMikqZHN0OwotCi0gICAgICAgIFRlbXAgPSBUZW1wICsgZEluVmFsOwotCi0gICAgICAgIGlmIChUZW1wID4gMHgwMDAwN0ZGRikKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IDB4N0ZGRjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTB4MDAwMDgwMDApCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAtIDB4ODAwMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KVRlbXA7Ci0gICAgICAgIH0KLQotICAgICAgICBkc3QrKzsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmNwcAppbmRleCA1ZDU1NjRmLi4yNGJkZjNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jcHAKQEAgLTE4LDg1ICsxOCwxOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIElOQ0xVREUgRklMRVMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKICNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBNQUMzU18xNlgxNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgTWFjM3NfU2F0XzMyeDE2KCAgY29uc3QgTFZNX0lOVDMyICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAotICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKLXsKK3ZvaWQgTWFjM3NfU2F0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjLCBjb25zdCBMVk1fRkxPQVQgdmFsLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgTFZNX0lOVDMyIHNyY3ZhbCx0ZW1wLCBkSW5WYWwsIGRPdXRWYWw7CiAKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIHNyY3ZhbD0qc3JjOwotICAgICAgICBzcmMrKzsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICBMVk1fRkxPQVQgVGVtcCA9ICpzcmMrKyAqIHZhbDsKKyAgICAgICAgVGVtcCArPSAqZHN0OwogCi0gICAgICAgIE1VTDMyeDE2SU5UTzMyKHNyY3ZhbCx2YWwsdGVtcCwxNSkKLQotICAgICAgICAgICAgZEluVmFsICA9ICpkc3Q7Ci0gICAgICAgIGRPdXRWYWwgPSB0ZW1wICsgZEluVmFsOwotCi0gICAgICAgIGlmICgoKChkT3V0VmFsIF4gdGVtcCkgJiAoZE91dFZhbCBeIGRJblZhbCkpID4+IDMxKSE9MCkgICAgIC8qIG92ZXJmbG93IC8gdW5kZXJmbG93ICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHRlbXA8MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkT3V0VmFsPTB4ODAwMDAwMDBMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRPdXRWYWw9MHg3RkZGRkZGRkw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAqZHN0ID0gZE91dFZhbDsKLSAgICAgICAgZHN0Kys7CisgICAgICAgICpkc3QrKyA9IExWTV9DbGFtcChUZW1wKTsKICAgICB9CiAKICAgICByZXR1cm47CiB9Ci12b2lkIE1hYzNzX1NhdF9GbG9hdChjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCB2YWwsCi0gICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQotewotICAgIExWTV9JTlQxNiBpaTsKLSAgICBMVk1fRkxPQVQgc3JjdmFsOwotICAgIExWTV9GTE9BVCBUZW1wLGRJblZhbDsKLQotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKLSAgICAgICAgc3JjdmFsID0gKnNyYzsKLSAgICAgICAgc3JjKys7Ci0KLSAgICAgICAgVGVtcCA9IHNyY3ZhbCAqIHZhbDsKLQotICAgICAgICBkSW5WYWwgID0gKExWTV9GTE9BVCkqZHN0OwotICAgICAgICBUZW1wID0gVGVtcCArIGRJblZhbDsKLQotICAgICAgICBpZiAoVGVtcCA+IDEuMDAwMDAwZikKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IDEuMDAwMDAwZjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMDAwMDAwZikKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IC0xLjAwMDAwMGY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gVGVtcDsKLSAgICAgICAgfQotICAgICAgICBkc3QrKzsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuY3BwCmluZGV4IDdjN2IzNmYuLjk2NjM5OTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peEluU29mdF9EMzJDMzFfU0FULmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhJblNvZnRfRDMyQzMxX1NBVC5jcHAKQEAgLTI2LDMzICsyNiwyOSBAQAogICAgREVGSU5JVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIFRSVUUgICAgICAgICAgMQotI2RlZmluZSBGQUxTRSAgICAgICAgIDAKKyNkZWZpbmUgVFJVRSAxCisjZGVmaW5lIEZBTFNFIDAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIE1JWElOU09GVF9EMzJDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgIG4pCi17Cit2b2lkIE1peEluU29mdF9EMzJDMzFfU0FUKE1peF8xU3RfQ2xsX0ZMT0FUX3QqIHBJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikgewogICAgIGNoYXIgSGFyZE1peGluZyA9IFRSVUU7CiAKLSAgICBpZihuIDw9IDApICAgIHJldHVybjsKKyAgICBpZiAobiA8PSAwKSByZXR1cm47CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgU09GVCBNSVhJTkcKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCi0gICAgewotICAgICAgICBpZihwSW5zdGFuY2UtPkFscGhhID09IDApeworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+QWxwaGEgPT0gMCkgewogICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7Ci0gICAgICAgIH1lbHNlIGlmICgocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0IDwgUE9JTlRfWkVST19PTkVfREJfRkxPQVQpICYmCi0gICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKXsKKyAgICAgICAgfSBlbHNlIGlmICgocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPCBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkgJiYKKyAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKSB7CiAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KLSAgICAgICAgfWVsc2V7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLwogICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOwogICAgICAgICAgICAgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVChwSW5zdGFuY2UsIHNyYywgZHN0LCBuKTsKQEAgLTYzLDExICs1OSwxMSBAQAogICAgICAgIEhBUkQgTUlYSU5HCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgIGlmIChIYXJkTWl4aW5nKXsKLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ICE9IDApeyAvKiBOb3RoaW5nIHRvIGRvIGluIGNhc2UgVGFyZ2V0ID0gMCAqLworICAgIGlmIChIYXJkTWl4aW5nKSB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCAhPSAwKSB7IC8qIE5vdGhpbmcgdG8gZG8gaW4gY2FzZSBUYXJnZXQgPSAwICovCiAgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSA9PSAxLjBmKQogICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHNyYywgZHN0LCBuKTsKLSAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBDb3JlX01peEluU29mdF9EMzJDMzFfU0FUKHBJbnN0YW5jZSwgc3JjLCBkc3QsIG4pOwogICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBJbiBjYXNlIHRoZSBjb3JlIGZ1bmN0aW9uIHdvdWxkIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBjaGFuZ2VkIHRoZSBDdXJyZW50IHZhbHVlICovCkBAIC04MSwxNiArNzcsMTUgQEAKICAgICAvKiBDYWxsIGJhY2sgYmVmb3JlIHRoZSBoYXJkIG1peGluZywgYmVjYXVzZSBpbiB0aGlzIGNhc2UsIGhhcmQgbWl4aW5nIG1ha2VzCiAgICAgICAgdXNlIG9mIHRoZSBjb3JlIHNvZnQgbWl4IGZ1bmN0aW9uIHdoaWNoIGNhbiBjaGFuZ2UgdGhlIEN1cnJlbnQgdmFsdWUhICAgICAgKi8KIAotICAgIGlmIChwSW5zdGFuY2UtPkNhbGxiYWNrU2V0KXsKKyAgICBpZiAocEluc3RhbmNlLT5DYWxsYmFja1NldCkgewogICAgICAgICBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0IDwgUE9JTlRfWkVST19PTkVfREJfRkxPQVQpICYmCi0gICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKXsKKyAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLwogICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1NldCA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cENhbGxCYWNrICE9IDApewotICAgICAgICAgICAgICAgICgqcEluc3RhbmNlLT5wQ2FsbEJhY2spICggcEluc3RhbmNlLT5wQ2FsbGJhY2tIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cENhbGxCYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAoKnBJbnN0YW5jZS0+cENhbGxCYWNrKShwSW5zdGFuY2UtPnBDYWxsYmFja0hhbmRsZSwgcEluc3RhbmNlLT5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1BhcmFtKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMVN0X0QzMkMzMV9XUkEuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jcHAKaW5kZXggZDMzMjVlYy4uNThhOTEwMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICAgIElOQ0xVREUgRklMRVMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKIApAQCAtMjYsMzMgKzI3LDI5IEBACiAgICBERUZJTklUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgVFJVRSAgICAgICAgICAxCi0jZGVmaW5lIEZBTFNFICAgICAgICAgMAorI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTUlYU09GVF8xU1RfRDMyQzMxX1dSQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKLXsKK3ZvaWQgTWl4U29mdF8xU3RfRDMyQzMxX1dSQShNaXhfMVN0X0NsbF9GTE9BVF90KiBwSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikgewogICAgIGNoYXIgSGFyZE1peGluZyA9IFRSVUU7CiAKLSAgICBpZihuIDw9IDApICAgIHJldHVybjsKKyAgICBpZiAobiA8PSAwKSByZXR1cm47CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgU09GVCBNSVhJTkcKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCi0gICAgewotICAgICAgICBpZihwSW5zdGFuY2UtPkFscGhhID09IDApeworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+QWxwaGEgPT0gMCkgewogICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7Ci0gICAgICAgIH1lbHNlIGlmICgocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPCBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkgJiYKLSAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0ID4gLVBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSl7CisgICAgICAgIH0gZWxzZSBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0IDwgUE9JTlRfWkVST19PTkVfREJfRkxPQVQpICYmCisgICAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0ID4gLVBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSkgewogICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCi0gICAgICAgIH1lbHNleworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KICAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKICAgICAgICAgICAgIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQShwSW5zdGFuY2UsIHNyYywgZHN0LCBuKTsKQEAgLTYzLDE0ICs2MCwxMiBAQAogICAgICAgIEhBUkQgTUlYSU5HCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgIGlmIChIYXJkTWl4aW5nKXsKKyAgICBpZiAoSGFyZE1peGluZykgewogICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPT0gMCkKLSAgICAgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBkc3QsIG4pOwotICAgICAgICBlbHNlIGlmICgocEluc3RhbmNlLT5UYXJnZXQpID09IDEuMGYpewotICAgICAgICAgICAgaWYgKHNyYyAhPSBkc3QpCi0gICAgICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUKilzcmMsIChMVk1fRkxPQVQqKWRzdCwgKExWTV9JTlQxNikobikpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1lbXNldChkc3QsIDAsIG4gKiBzaXplb2YoKmRzdCkpOworICAgICAgICBlbHNlIGlmICgocEluc3RhbmNlLT5UYXJnZXQpID09IDEuMGYpIHsKKyAgICAgICAgICAgIGlmIChzcmMgIT0gZHN0KSBDb3B5X0Zsb2F0KChMVk1fRkxPQVQqKXNyYywgKExWTV9GTE9BVCopZHN0LCAoTFZNX0lOVDE2KShuKSk7CisgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgTXVsdDNzX0Zsb2F0KHNyYywgcEluc3RhbmNlLT5DdXJyZW50LCBkc3QsIG4pOwogICAgIH0KIApAQCAtNzgsMTYgKzczLDE1IEBACiAgICAgICAgQ0FMTCBCQUNLCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgIGlmIChwSW5zdGFuY2UtPkNhbGxiYWNrU2V0KXsKKyAgICBpZiAocEluc3RhbmNlLT5DYWxsYmFja1NldCkgewogICAgICAgICBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0IDwgUE9JTlRfWkVST19PTkVfREJfRkxPQVQpICYmCi0gICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKXsKKyAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLwogICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1NldCA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cENhbGxCYWNrICE9IDApewotICAgICAgICAgICAgICAgICgqcEluc3RhbmNlLT5wQ2FsbEJhY2spICggcEluc3RhbmNlLT5wQ2FsbGJhY2tIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cENhbGxCYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAoKnBJbnN0YW5jZS0+cENhbGxCYWNrKShwSW5zdGFuY2UtPnBDYWxsYmFja0hhbmRsZSwgcEluc3RhbmNlLT5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1BhcmFtKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMlN0X0QzMkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jcHAKaW5kZXggYjAwMjczOC4uYWJhODUzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jcHAKQEAgLTI1LDQyICsyNSwzNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIE1JWFNPRlRfMlNUX0QzMkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCAgICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQotewotCi0gICAgaWYobiA8PSAwKSAgICByZXR1cm47Cit2b2lkIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoTWl4XzJTdF9DbGxfRkxPQVRfdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUKiBzcmMyLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKKyAgICBpZiAobiA8PSAwKSByZXR1cm47CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgU09GVCBNSVhJTkcKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50MSAhPSBwSW5zdGFuY2UtPlRhcmdldDEpIHx8IChwSW5zdGFuY2UtPkN1cnJlbnQyICE9IHBJbnN0YW5jZS0+VGFyZ2V0MikpCi0gICAgeworICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50MSAhPSBwSW5zdGFuY2UtPlRhcmdldDEpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQyICE9IHBJbnN0YW5jZS0+VGFyZ2V0MikpIHsKICAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgoTWl4XzFTdF9DbGxfRkxPQVRfdCopcEluc3RhbmNlLCBzcmMxLCBkc3QsIG4pOwotICAgICAgICBNaXhJblNvZnRfRDMyQzMxX1NBVCgoTWl4XzFTdF9DbGxfRkxPQVRfdCAqKSZwSW5zdGFuY2UtPkFscGhhMiwgLyogQ2FzdCB0byB2b2lkOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBuKTsKKyAgICAgICAgTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoKE1peF8xU3RfQ2xsX0ZMT0FUX3QqKSZwSW5zdGFuY2UtPkFscGhhMiwgLyogQ2FzdCB0byB2b2lkOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgbik7CiAgICAgfQogCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIEhBUkQgTUlYSU5HCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgIGVsc2UKLSAgICB7CisgICAgZWxzZSB7CiAgICAgICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQxID09IDApCiAgICAgICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKAotICAgICAgICAgICAgICAgICAgICAoTWl4XzFTdF9DbGxfRkxPQVRfdCAqKSAmcEluc3RhbmNlLT5BbHBoYTIsIC8qIENhc3QgdG8gdm9pZDogbm8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBuKTsKKyAgICAgICAgICAgICAgICAgICAgKE1peF8xU3RfQ2xsX0ZMT0FUX3QqKSZwSW5zdGFuY2UtPkFscGhhMiwgLyogQ2FzdCB0byB2b2lkOiBubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIG4pOwogICAgICAgICBlbHNlIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQyID09IDApCi0gICAgICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKChNaXhfMVN0X0NsbF9GTE9BVF90KikgcEluc3RhbmNlLCBzcmMxLCBkc3QsIG4pOworICAgICAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgoTWl4XzFTdF9DbGxfRkxPQVRfdCopcEluc3RhbmNlLCBzcmMxLCBkc3QsIG4pOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQocEluc3RhbmNlLCBzcmMxLCBzcmMyLCBkc3QsIG4pOwogICAgIH0KIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhlcl9wcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhlcl9wcml2YXRlLmgKaW5kZXggMWQ2NTNiYi4uZTFlNjJjNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4ZXJfcHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peGVyX3ByaXZhdGUuaApAQCAtMjYsMTMgKzI2LDEzIEBACiAKICNkZWZpbmUgUE9JTlRfWkVST19PTkVfREIgMjQ3MzgwNSAvKiAwLjAxIGRCIG9uIGEgZnVsbCBzY2FsZSBzaWduYWwgPSAoMTBeKDAuMDEvMjApIC0xKSAqIDJeMzEgKi8KIAotI2RlZmluZSBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCAwLjAwMTE1MiAvKiAwLjAxIGRCIG9uIGEgZnVsbCBzY2FsZSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbCA9ICgxMF4oMC4wMS8yMCkgLTEpICogMl4zMSAqLworI2RlZmluZSBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCAgICAgICAgIFwKKyAgICAwLjAwMTE1MiAvKiAwLjAxIGRCIG9uIGEgZnVsbCBzY2FsZSBcCisgICAgICAgICAgICAgICAgc2lnbmFsID0gKDEwXigwLjAxLzIwKSAtMSkgKiAyXjMxICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgREVGSU5JVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2VuZGlmIC8vI2lmbmRlZiBfX01JWEVSX1BSSVZBVEVfSF9fCi0KKyNlbmRpZiAgLy8jaWZuZGVmIF9fTUlYRVJfUFJJVkFURV9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzE2LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzE2LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNzk4ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Nb25vVG8ySV8xNi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgSU5DTFVERSBGSUxFUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBNb25vVG8ySV8xNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgTW9ub1RvMklfMTYoIGNvbnN0IExWTV9JTlQxNiAqc3JjLAotICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCi17Ci0gICAgTFZNX0lOVDE2IGlpOwotICAgIHNyYyArPSAobi0xKTsKLSAgICBkc3QgKz0gKChuKjIpLTEpOwotCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgewotICAgICAgICAqZHN0ID0gKnNyYzsKLSAgICAgICAgZHN0LS07Ci0KLSAgICAgICAgKmRzdCA9ICpzcmM7Ci0gICAgICAgIGRzdC0tOwotICAgICAgICBzcmMtLTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMzIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMzIuY3BwCmluZGV4IDYwM2QxZmMuLmVmM2U2MzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzMyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jcHAKQEAgLTIxLDQwICsyMSwxMiBAQAogCiAjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gTW9ub1RvMklfMzIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIE1vbm9UbzJJXzMyKCBjb25zdCBMVk1fSU5UMzIgICpzcmMsCi0gICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKLSAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCi17Ci0gICAgTFZNX0lOVDE2IGlpOwotICAgIHNyYyArPSAobi0xKTsKLSAgICBkc3QgKz0gKChuKjIpLTEpOwotCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgewotICAgICAgICAqZHN0ID0gKnNyYzsKLSAgICAgICAgZHN0LS07Ci0KLSAgICAgICAgKmRzdCA9ICpzcmM7Ci0gICAgICAgIGRzdC0tOwotICAgICAgICBzcmMtLTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci12b2lkIE1vbm9UbzJJX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKLXsKK3ZvaWQgTW9ub1RvMklfRmxvYXQoY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbikgewogICAgIExWTV9JTlQxNiBpaTsKICAgICBzcmMgKz0gKG4gLSAxKTsKICAgICBkc3QgKz0gKChuICogMikgLSAxKTsKIAotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAqZHN0ID0gKnNyYzsKICAgICAgICAgZHN0LS07CiAKQEAgLTY1LDQgKzM3LDMgQEAKIAogICAgIHJldHVybjsKIH0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL011bHQzc18zMngxNi5jcHAKaW5kZXggMzcwYzM5YS4uYmFiZmVmMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NdWx0M3NfMzJ4MTYuY3BwCkBAIC0yMiw0MSArMjIsMTEgQEAKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRlVOQ1RJT04gTVVMVDNTXzE2WDE2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBNdWx0M3NfMzJ4MTYoIGNvbnN0IExWTV9JTlQzMiAqc3JjLAotICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKLSAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAqZHN0LAotICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCi17Ci0gICAgTFZNX0lOVDE2IGlpOwotICAgIExWTV9JTlQzMiBzcmN2YWwsdGVtcDsKLQotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKLSAgICAgICAgc3JjdmFsPSpzcmM7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgIE1VTDMyeDE2SU5UTzMyKHNyY3ZhbCx2YWwsdGVtcCwxNSkKLQotICAgICAgICAqZHN0ID0gdGVtcDsKLSAgICAgICAgZHN0Kys7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotdm9pZCBNdWx0M3NfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAqc3JjLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCB2YWwsCi0gICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCi0gICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCi17Cit2b2lkIE11bHQzc19GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyYywgY29uc3QgTFZNX0ZMT0FUIHZhbCwgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKSB7CiAgICAgTFZNX0lOVDE2IGlpOwogICAgIExWTV9GTE9BVCB0ZW1wOwogCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgeworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgIHRlbXAgPSAoKnNyYykgKiB2YWw7CiAgICAgICAgIHNyYysrOwogICAgICAgICAqZHN0ID0gdGVtcDsKQEAgLTY0LDQgKzM0LDMgQEAKICAgICB9CiAgICAgcmV0dXJuOwogfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jcHAKaW5kZXggMzZkMTE0OS4uZjNhMWE2NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTm9uTGluQ29tcF9EMTYuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmNwcApAQCAtNjEsMjIgKzYxLDE2IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIE5vbkxpbkNvbXBfRDE2KExWTV9JTlQxNiAgICAgICAgR2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICBCbG9ja0xlbmd0aCkKLXsKLQotICAgIExWTV9JTlQxNiAgICAgICAgICAgIFNhbXBsZTsgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IHNhbXBsZXMgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgICBTYW1wbGVObzsgICAgICAgICAgICAgICAgLyogU2FtcGxlIGluZGV4ICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgVGVtcDsKK3ZvaWQgTm9uTGluQ29tcF9GbG9hdChMVk1fRkxPQVQgR2FpbiwgTFZNX0ZMT0FUKiBwRGF0YUluLCBMVk1fRkxPQVQqIHBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBCbG9ja0xlbmd0aCkgeworICAgIExWTV9GTE9BVCBTYW1wbGU7ICAgLyogSW5wdXQgc2FtcGxlcyAqLworICAgIExWTV9JTlQzMiBTYW1wbGVObzsgLyogU2FtcGxlIGluZGV4ICovCisgICAgTFZNX0ZMT0FUIFRlbXA7CiAKICAgICAvKgogICAgICAqIFByb2Nlc3MgYSBibG9jayBvZiBzYW1wbGVzCiAgICAgICovCi0gICAgZm9yKFNhbXBsZU5vID0gMDsgU2FtcGxlTm88QmxvY2tMZW5ndGg7IFNhbXBsZU5vKyspCi0gICAgewotCisgICAgZm9yIChTYW1wbGVObyA9IDA7IFNhbXBsZU5vIDwgQmxvY2tMZW5ndGg7IFNhbXBsZU5vKyspIHsKICAgICAgICAgLyoKICAgICAgICAgICogUmVhZCB0aGUgaW5wdXQKICAgICAgICAgICovCkBAIC04OCw2NCArODIsMTIgQEAKICAgICAgICAgICogaGFybW9uaWMgZGlzdG9ydGlvbi4gVGhlIGFtb3VudCBvZiBjb21wcmVzc2lvbiBpcyBjb250cm9sIGJ5IHRoZQogICAgICAgICAgKiBnYWluIGZhY3RvcgogICAgICAgICAgKi8KLSAgICAgICAgaWYgKChMVk1fSU5UMzIpU2FtcGxlICE9IC0zMjc2OCkKLSAgICAgICAgewotICAgICAgICAgICAgVGVtcCA9IChMVk1fSU5UMTYpKChTYW1wbGUgKiBTYW1wbGUpID4+IDE1KTsKLSAgICAgICAgICAgIGlmKFNhbXBsZSA+MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTYW1wbGUgPSAoTFZNX0lOVDE2KShTYW1wbGUgKyAoKEdhaW4gKiAoU2FtcGxlIC0gVGVtcCkpID4+IDE1KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2FtcGxlID0gKExWTV9JTlQxNikoU2FtcGxlICsgKChHYWluICogKFNhbXBsZSArIFRlbXApKSA+PiAxNSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2F2ZSB0aGUgb3V0cHV0Ci0gICAgICAgICAqLwotICAgICAgICAqcERhdGFPdXQgPSBTYW1wbGU7Ci0gICAgICAgIHBEYXRhT3V0Kys7Ci0KLSAgICB9Ci0KLX0KLXZvaWQgTm9uTGluQ29tcF9GbG9hdChMVk1fRkxPQVQgICAgICAgIEdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgIEJsb2NrTGVuZ3RoKQotewotCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgU2FtcGxlOyAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgc2FtcGxlcyAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgIFNhbXBsZU5vOyAgICAgICAgICAgICAgICAvKiBTYW1wbGUgaW5kZXggKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICBUZW1wOwotCi0gICAgLyoKLSAgICAgKiBQcm9jZXNzIGEgYmxvY2sgb2Ygc2FtcGxlcwotICAgICAqLwotICAgIGZvcihTYW1wbGVObyA9IDA7IFNhbXBsZU5vIDwgQmxvY2tMZW5ndGg7IFNhbXBsZU5vKyspCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBSZWFkIHRoZSBpbnB1dAotICAgICAgICAgKi8KLSAgICAgICAgU2FtcGxlID0gKnBEYXRhSW47Ci0gICAgICAgIHBEYXRhSW4rKzsKLQotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSB0aGUgY29tcGFuZGVyLCB0aGlzIGNvbXByZXNzZXMgdGhlIHNpZ25hbCBhdCB0aGUgZXhwZW5zZSBvZgotICAgICAgICAgKiBoYXJtb25pYyBkaXN0b3J0aW9uLiBUaGUgYW1vdW50IG9mIGNvbXByZXNzaW9uIGlzIGNvbnRyb2wgYnkgdGhlCi0gICAgICAgICAqIGdhaW4gZmFjdG9yCi0gICAgICAgICAqLwotICAgICAgICBpZiAoU2FtcGxlICE9IC0xLjBmKQotICAgICAgICB7CisgICAgICAgIGlmIChTYW1wbGUgIT0gLTEuMGYpIHsKICAgICAgICAgICAgIFRlbXAgPSAoKFNhbXBsZSAqIFNhbXBsZSkpOwotICAgICAgICAgICAgaWYoU2FtcGxlID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTYW1wbGUgPSAoU2FtcGxlICsgKChHYWluICogKFNhbXBsZSAtIFRlbXApKSApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTYW1wbGUgPSAoU2FtcGxlICsgKChHYWluICogKFNhbXBsZSArIFRlbXApKSApKTsKKyAgICAgICAgICAgIGlmIChTYW1wbGUgPiAwKSB7CisgICAgICAgICAgICAgICAgU2FtcGxlID0gKFNhbXBsZSArICgoR2FpbiAqIChTYW1wbGUgLSBUZW1wKSkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU2FtcGxlID0gKFNhbXBsZSArICgoR2FpbiAqIChTYW1wbGUgKyBUZW1wKSkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNjJmOTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBBU1NVTVBUSU9OUzoKLSBDT0VGUy0KLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEwLAotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgLUIyLAotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE0IGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgR2FpbiwgaW4gUTExIGZvcm1hdAotCi0gREVMQVlTLQotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMSlSIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB4KG4tMilSIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSBpcyB5KG4tMSlSIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFEwIGZvcm1hdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCB5bkwseW5SLHluTE8seW5STyx0ZW1wbDsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0Zsb2F0IHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0Zsb2F0KSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5MPSAoQTAgICogKHgobilMIC0geChuLTIpTCAgKSApKi8KLSAgICAgICAgICAgIHRlbXBsID0gKCpwRGF0YUluKSAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKLSAgICAgICAgICAgIHluTCA9IHRlbXBsICogcEJpcXVhZFN0YXRlLT5jb2Vmc1swXTsKLQotICAgICAgICAgICAgLyogeW5MKz0gKCgtQjIgICogeShuLTIpTCAgKSkgKi8KLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXTsKLSAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKLQotICAgICAgICAgICAgLyogeW5MKz0gKCgtQjEgKiB5KG4tMSlMICApICkgKi8KLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1syXTsKLSAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKLQotICAgICAgICAgICAgLyogeW5MTz0gKChHYWluICogeW5MICkpICovCi0gICAgICAgICAgICB5bkxPID0geW5MICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKLQotICAgICAgICAgICAgLyogeW5MTz0oIHluTE8gKyB4KG4pTCAgKSovCi0gICAgICAgICAgICB5bkxPICs9ICgqcERhdGFJbik7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIHluUj0gKEEwICAqICh4KG4pUiAgLSB4KG4tMilSICApICkgKi8KLSAgICAgICAgICAgIHRlbXBsID0gKCoocERhdGFJbiArIDEpKSAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKLSAgICAgICAgICAgIHluUiA9IHRlbXBsICogcEJpcXVhZFN0YXRlLT5jb2Vmc1swXTsKLQotICAgICAgICAgICAgLyogeW5SKz0gKCgtQjIgICogeShuLTIpUiAgKSApICAqLwotICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdOwotICAgICAgICAgICAgeW5SICs9IHRlbXBsOwotCi0gICAgICAgICAgICAvKiB5blIrPSAoKC1CMSAgKiB5KG4tMSlSICApICkgICAqLwotICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOwotICAgICAgICAgICAgeW5SICs9IHRlbXBsOwotCi0gICAgICAgICAgICAvKiB5blJPPSAoKEdhaW4gICogeW5SICkpICovCi0gICAgICAgICAgICB5blJPID0geW5SICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKLQotICAgICAgICAgICAgLyogeW5STz0oIHluUk8gKyB4KG4pUiAgKSovCi0gICAgICAgICAgICB5blJPICs9ICgqKHBEYXRhSW4rMSkpOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7IC8qIFVwZGF0ZSB5KG4tMSlSICovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSB5bkw7IC8qIFVwZGF0ZSB5KG4tMSlMICovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpTCAqLwotICAgICAgICAgICAgcERhdGFJbisrOwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKVIgKi8KLSAgICAgICAgICAgIHBEYXRhSW4rKzsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAqcERhdGFPdXQgPSB5bkxPOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICAgICAgKnBEYXRhT3V0ID0geW5STzsgLyogV3JpdGUgUmlnaHQgb3VwdXQqLwotICAgICAgICAgICAgcERhdGFPdXQrKzsKLQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSNpZmRlZiBTVVBQT1JUX01DCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFTEFZUy0KLXBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSB0bwotcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgLSAxXSBpcyB4KG4tMSkgZm9yIGFsbCBOckNoYW5uZWxzCi0KLXBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzXSB0bwotcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqTnJDaGFubmVscyAtIDFdIGlzIHgobi0yKSBmb3IgYWxsIE5yQ2hhbm5lbHMKLQotcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqTnJDaGFubmVsc10gdG8KLXBCaXF1YWRTdGF0ZS0+cERlbGF5c1szKk5yQ2hhbm5lbHMgLSAxXSBpcyB5KG4tMSkgZm9yIGFsbCBOckNoYW5uZWxzCi0KLXBCaXF1YWRTdGF0ZS0+cERlbGF5c1szKk5yQ2hhbm5lbHNdIHRvCi1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNCpOckNoYW5uZWxzIC0gMV0gaXMgeShuLTIpIGZvciBhbGwgTnJDaGFubmVscwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIFBLX01jX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxIChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgeW4sIHluTywgdGVtcDsKLSAgICAgICAgTFZNX0lOVDE2IGlpLCBqajsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZV9GbG9hdCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GbG9hdCkgcEluc3RhbmNlOwotCi0gICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgICB7Ci0KLSAgICAgICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIGpqIENIQU5ORUwKLSAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgLyogeW49IChBMCAgKiAoeChuKSAtIHgobi0yKSkpKi8KLSAgICAgICAgICAgICAgICB0ZW1wID0gKCpwRGF0YUluKSAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICsgampdOwotICAgICAgICAgICAgICAgIHluID0gdGVtcCAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF07Ci0KLSAgICAgICAgICAgICAgICAvKiB5bis9ICgoLUIyICAqIHkobi0yKSkpICovCi0gICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzKjMgKyBqal0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdOwotICAgICAgICAgICAgICAgIHluICs9IHRlbXA7Ci0KLSAgICAgICAgICAgICAgICAvKiB5bis9ICgoLUIxICogeShuLTEpKSkgKi8KLSAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMqMiArIGpqXSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl07Ci0gICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKLQotICAgICAgICAgICAgICAgIC8qIHluTz0gKChHYWluICogeW4pKSAqLwotICAgICAgICAgICAgICAgIHluTyA9IHluICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKLQotICAgICAgICAgICAgICAgIC8qIHluTz0oeW5PICsgeChuKSkqLwotICAgICAgICAgICAgICAgIHluTyArPSAoKnBEYXRhSW4pOwotCi0gICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAzICsgampdID0KLSAgICAgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAyICsgampdOyAvKiB5KG4tMik9eShuLTEpKi8KLSAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDEgKyBqal0gPQotICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdOyAvKiB4KG4tMik9eChuLTEpKi8KLSAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal0gPSB5bjsgLyogVXBkYXRlIHkobi0xKSAqLwotICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpKi8KLSAgICAgICAgICAgICAgICBwRGF0YUluKys7Ci0KLSAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICpwRGF0YU91dCA9IHluTzsgLyogV3JpdGUgb3V0cHV0Ki8KLSAgICAgICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkZTFkZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQVNTVU1QVElPTlM6Ci0gQ09FRlMtCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMCwKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIC1CMiwKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFEzMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIEdhaW4sIGluIFExMSBmb3JtYXQKLQotIERFTEFZUy0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gaXMgeShuLTEpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmOWM3Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9QS18ySV9EMzJGMzJDTExHU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCi0jZGVmaW5lIF9QS18ySV9EMzJGMzJDTExHU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCi0KLS8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KLS8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCi17Ci0gIExWTV9JTlQzMiAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICBMVk1fSU5UMzIgICAgICAgICBjb2Vmc1s1XTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfUZpbHRlcl9TdGF0ZTsKLQotdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKLQotI2VuZGlmIC8qIF9QS18ySV9EMzJGMzJDTExHU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmMwNWRhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIlBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLXZvaWQgIFBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKLXsKLSAgICBQRmlsdGVyX1N0YXRlX0Zsb2F0IHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0Zsb2F0KSBwSW5zdGFuY2U7Ci0gICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwczsKLQotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSBwQ29lZi0+QTA7Ci0KLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gcENvZWYtPkIyOwotCi0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHBDb2VmLT5CMTsKLQotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gPSBwQ29lZi0+RzsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5MjRjNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9QS18ySV9EMzJGMzJDU1NHU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCi0jZGVmaW5lIF9QS18ySV9EMzJGMzJDU1NHU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCi0KLS8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KLS8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GbG9hdF8KLXsKLSAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1s1XTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfUZpbHRlcl9TdGF0ZV9GbG9hdDsKLQotdHlwZWRlZiBGaWx0ZXJfU3RhdGVfRmxvYXQgKiBQRmlsdGVyX1N0YXRlX0Zsb2F0IDsKLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCi17Ci0gIExWTV9JTlQzMiAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICBMVk1fSU5UMzIgICAgICAgICBjb2Vmc1s1XTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfUZpbHRlcl9TdGF0ZTsKLQotdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKLQotI2VuZGlmIC8qIF9QS18ySV9EMzJGMzJDU1NHU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jcHAKaW5kZXggOTdhMDRjMS4uZjU0YmE5MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YzMnh2MzIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmNwcApAQCAtMjQsNTUgKzI0LDM5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gU2hpZnRfU2F0X3YzMnh2MzIKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBTaGlmdF9TYXRfRmxvYXQgKGNvbnN0ICAgTFZNX0lOVDE2ICAgdmFsLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0ZMT0FUICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIG4pCi17Ci0gICAgTFZNX0ZMT0FUICAgdGVtcDsKLSAgICBMVk1fSU5UMzIgICBpaSxpajsKLSAgICBMVk1fSU5UMTYgICBSU2hpZnQ7Cit2b2lkIFNoaWZ0X1NhdF9GbG9hdChjb25zdCBMVk1fSU5UMTYgdmFsLCBjb25zdCBMVk1fRkxPQVQqIHNyYywgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKSB7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgTFZNX0lOVDMyIGlpLCBpajsKKyAgICBMVk1fSU5UMTYgUlNoaWZ0OwogCi0gICAgaWYodmFsID4gMCkKLSAgICB7Ci0gICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7CisgICAgaWYgKHZhbCA+IDApIHsKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pIHsKICAgICAgICAgICAgIHRlbXAgPSAoTFZNX0ZMT0FUKSpzcmM7CiAgICAgICAgICAgICBzcmMrKzsKLSAgICAgICAgICAgIGZvcihpaiA9IDA7IGlqIDwgdmFsOyBpaisrKQotICAgICAgICAgICAgeworICAgICAgICAgICAgZm9yIChpaiA9IDA7IGlqIDwgdmFsOyBpaisrKSB7CiAgICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAgKiAyOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZih0ZW1wID4gMS4wKQotICAgICAgICAgICAgICAgIHRlbXAgPSAxLjA7Ci0gICAgICAgICAgICBpZih0ZW1wIDwgLTEuMCkKLSAgICAgICAgICAgICAgICB0ZW1wID0gLTEuMDsKKyAgICAgICAgICAgIGlmICh0ZW1wID4gMS4wKSB0ZW1wID0gMS4wOworICAgICAgICAgICAgaWYgKHRlbXAgPCAtMS4wKSB0ZW1wID0gLTEuMDsKIAogICAgICAgICAgICAgKmRzdCA9IChMVk1fRkxPQVQpdGVtcDsKICAgICAgICAgICAgIGRzdCsrOwogICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYodmFsIDwgMCkKLSAgICB7Ci0gICAgICAgIFJTaGlmdD0oTFZNX0lOVDE2KSgtdmFsKTsKKyAgICB9IGVsc2UgaWYgKHZhbCA8IDApIHsKKyAgICAgICAgUlNoaWZ0ID0gKExWTV9JTlQxNikoLXZhbCk7CiAKLSAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgICAgIHsKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pIHsKICAgICAgICAgICAgIHRlbXAgPSAoTFZNX0ZMT0FUKSpzcmM7CiAgICAgICAgICAgICBzcmMrKzsKLSAgICAgICAgICAgIGZvcihpaiA9IDA7IGlqIDwgUlNoaWZ0OyBpaisrKQotICAgICAgICAgICAgeworICAgICAgICAgICAgZm9yIChpaiA9IDA7IGlqIDwgUlNoaWZ0OyBpaisrKSB7CiAgICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAgLyAyOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgKmRzdCA9IChMVk1fRkxPQVQpdGVtcDsKICAgICAgICAgICAgIGRzdCsrOwogICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKHNyYyAhPSBkc3QpCi0gICAgICAgIHsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoc3JjICE9IGRzdCkgewogICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgbik7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jcHAKaW5kZXggNGRhMjAxMy4uMjE0MzQ2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvZEJfdG9fTGluMzIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL2RCX3RvX0xpbjMyLmNwcApAQCAtNTcsMTcgKzU3LDE2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgRk9VUl9PVkVSX1NJWCAgICAyMTg0NiAgICAgICAgICAgICAgICAgIC8qICg0IC8gNikgKiAyXjE1ICovCi0jZGVmaW5lIFNJWF9EQiAgICAgICAgICAgOTYgICAgICAgICAgICAgICAgICAgICAvKiA2ICogMTYgb3IgNmRCIGluIFExMS40IGZvcm1hdCAqLwotI2RlZmluZSBGSVJTVF9DT0VGX05FRyAgIDE0ODg0MzA1Ci0jZGVmaW5lIEZJUlNUX0NPRUZfUE9TICAgNzQ0MjE1MiAgICAgICAgICAgICAgICAvKiBGSVJTVF9DT0VGX05FRyAvIDIgKi8KLSNkZWZpbmUgU0VDT05EX0NPRUYgICAgICAzODgzNgotI2RlZmluZSBNQVhfVkFMVUUgICAgICAgIDE1MzYgICAgICAgICAgICAgICAgICAgLyogOTYgKiAxNiAqLworI2RlZmluZSBGT1VSX09WRVJfU0lYIDIxODQ2IC8qICg0IC8gNikgKiAyXjE1ICovCisjZGVmaW5lIFNJWF9EQiA5NiAgICAgICAgICAgLyogNiAqIDE2IG9yIDZkQiBpbiBRMTEuNCBmb3JtYXQgKi8KKyNkZWZpbmUgRklSU1RfQ09FRl9ORUcgMTQ4ODQzMDUKKyNkZWZpbmUgRklSU1RfQ09FRl9QT1MgNzQ0MjE1MiAvKiBGSVJTVF9DT0VGX05FRyAvIDIgKi8KKyNkZWZpbmUgU0VDT05EX0NPRUYgMzg4MzYKKyNkZWZpbmUgTUFYX1ZBTFVFIDE1MzYgLyogOTYgKiAxNiAqLwogCi1MVk1fRkxPQVQgICBkQl90b19MaW5GbG9hdChMVk1fSU5UMTYgICAgZGJfZml4KQotewotICAgIExWTV9GTE9BVCAgICBkQl9GbG9hdDsKLSAgICBMVk1fRkxPQVQgICAgTGluRmxvYXQ7CitMVk1fRkxPQVQgZEJfdG9fTGluRmxvYXQoTFZNX0lOVDE2IGRiX2ZpeCkgeworICAgIExWTV9GTE9BVCBkQl9GbG9hdDsKKyAgICBMVk1fRkxPQVQgTGluRmxvYXQ7CiAKICAgICBkQl9GbG9hdCA9IChMVk1fRkxPQVQpKChMVk1fRkxPQVQpZGJfZml4IC8gMTYuMGYpOwogICAgIExpbkZsb2F0ID0gcG93KDEwLCBkQl9GbG9hdCAvIDIwLjApOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvbXVsdDNzXzE2eDE2LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL211bHQzc18xNngxNi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOTI1NjAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvbXVsdDNzXzE2eDE2LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBJTkNMVURFIEZJTEVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIE1VTFQzU18xNlgxNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgTXVsdDNzXzE2eDE2KCBjb25zdCBMVk1fSU5UMTYgKnNyYywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCi0gICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQotewotICAgIExWTV9JTlQxNiBpaTsKLSAgICBMVk1fSU5UMzIgdGVtcDsKLQotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKLSAgICAgICAgdGVtcCA9IChMVk1fSU5UMzIpKCpzcmMpICogKExWTV9JTlQzMil2YWw7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KSh0ZW1wID4+IDE1KTsKLSAgICAgICAgZHN0Kys7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oCmluZGV4IGM1ZGRmNzcuLmYxYWZjZDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaApAQCAtODYsMTYgKzg2LDkgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIE1lbW9yeSB0YWJsZSAqLwotI2RlZmluZSBMVkVRTkJfTUVNUkVHSU9OX0lOU1RBTkNFICAgICAgICAgIDAgICAvKiBPZmZzZXQgdG8gdGhlIGluc3RhbmNlIG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEEgICAxICAgLyogT2Zmc2V0IHRvIHBlcnNpc3RlbnQgZGF0YSBtZW1vcnkgcmVnaW9uICovCi0jZGVmaW5lIExWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGICAgMiAgIC8qIE9mZnNldCB0byBwZXJzaXN0ZW50IGNvZWZmaWNpZW50IHJlZ2lvbiAqLwotI2RlZmluZSBMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0ggICAgICAgICAgIDMgICAvKiBPZmZzZXQgdG8gZGF0YSBzY3JhdGNoIG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZFUU5CX05SX01FTU9SWV9SRUdJT05TICAgICAgICAgICA0ICAgLyogTnVtYmVyIG9mIG1lbW9yeSByZWdpb25zICovCi0KIC8qIENhbGxiYWNrIGV2ZW50cyAqLwotI2RlZmluZSBMVkVRTkJfRVZFTlRfTk9ORSAgICAgICAgICAgICAgICAgICAweDAwMDAgICAgLyogTm90IGEgdmFsaWQgZXZlbnQgKi8KLSNkZWZpbmUgTFZFUU5CX0VWRU5UX0FMR09GRiAgICAgICAgICAgICAgICAgMHgwMDAxICAgIC8qIEVRTkIgaGFzIGNvbXBsZXRlZCBzd2l0Y2ggb2ZmICovCisjZGVmaW5lIExWRVFOQl9FVkVOVF9OT05FIDB4MDAwMCAgIC8qIE5vdCBhIHZhbGlkIGV2ZW50ICovCisjZGVmaW5lIExWRVFOQl9FVkVOVF9BTEdPRkYgMHgwMDAxIC8qIEVRTkIgaGFzIGNvbXBsZXRlZCBzd2l0Y2ggb2ZmICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMDQsNDIgKzk3LDI1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogSW5zdGFuY2UgaGFuZGxlICovCi10eXBlZGVmIHZvaWQgKkxWRVFOQl9IYW5kbGVfdDsKK3R5cGVkZWYgdm9pZCogTFZFUU5CX0hhbmRsZV90OwogCiAvKiBPcGVyYXRpbmcgbW9kZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWRVFOQl9CWVBBU1MgICA9IDAsCi0gICAgTFZFUU5CX09OICAgICAgID0gMSwKLSAgICBMVkVRTkJfTU9ERV9NQVggPSBMVk1fTUFYSU5UXzMyCi19IExWRVFOQl9Nb2RlX2VuOwordHlwZWRlZiBlbnVtIHsgTFZFUU5CX0JZUEFTUyA9IDAsIExWRVFOQl9PTiA9IDEsIExWRVFOQl9NT0RFX01BWCA9IExWTV9NQVhJTlRfMzIgfSBMVkVRTkJfTW9kZV9lbjsKIAogLyogRmlsdGVyIG1vZGUgY29udHJvbCAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZFUU5CX0ZJTFRFUl9PRkYgICA9IDAsCi0gICAgTFZFUU5CX0ZJTFRFUl9PTiAgICA9IDEsCit0eXBlZGVmIGVudW0geworICAgIExWRVFOQl9GSUxURVJfT0ZGID0gMCwKKyAgICBMVkVRTkJfRklMVEVSX09OID0gMSwKICAgICBMVkVRTkJfRklMVEVSX0RVTU1ZID0gTFZNX01BWElOVF8zMgogfSBMVkVRTkJfRmlsdGVyTW9kZV9lbjsKIAotLyogTWVtb3J5IFR5cGVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVkVRTkJfUEVSU0lTVEVOVCAgICAgID0gMCwKLSAgICBMVkVRTkJfUEVSU0lTVEVOVF9EQVRBID0gMSwKLSAgICBMVkVRTkJfUEVSU0lTVEVOVF9DT0VGID0gMiwKLSAgICBMVkVRTkJfU0NSQVRDSCAgICAgICAgID0gMywKLSAgICBMVkVRTkJfTUVNT1JZX01BWCAgICAgID0gTFZNX01BWElOVF8zMgotfSBMVkVRTkJfTWVtb3J5VHlwZXNfZW47Ci0KIC8qIEZ1bmN0aW9uIHJldHVybiBzdGF0dXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWRVFOQl9TVUNDRVNTICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdWNjZXNzZnVsIHJldHVybiBmcm9tIGEgcm91dGluZSAqLwotICAgIExWRVFOQl9BTElHTk1FTlRFUlJPUiA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgYWxpZ25tZW50IGVycm9yICovCi0gICAgTFZFUU5CX05VTExBRERSRVNTICAgID0gMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5VTEwgYWxsb2NhdGlvbiBhZGRyZXNzICovCi0gICAgTFZFUU5CX1RPT01BTllTQU1QTEVTID0gMywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBleGNlZWRlZCAqLwotICAgIExWRVFOQl9TVEFUVVNfTUFYICAgICA9IExWTV9NQVhJTlRfMzIKK3R5cGVkZWYgZW51bSB7CisgICAgTFZFUU5CX1NVQ0NFU1MgPSAwLCAgICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBhIHJvdXRpbmUgKi8KKyAgICBMVkVRTkJfQUxJR05NRU5URVJST1IgPSAxLCAvKiBNZW1vcnkgYWxpZ25tZW50IGVycm9yICovCisgICAgTFZFUU5CX05VTExBRERSRVNTID0gMiwgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KKyAgICBMVkVRTkJfVE9PTUFOWVNBTVBMRVMgPSAzLCAvKiBNYXhpbXVtIGJsb2NrIHNpemUgZXhjZWVkZWQgKi8KKyAgICBMVkVRTkJfU1RBVFVTX01BWCA9IExWTV9NQVhJTlRfMzIKIH0gTFZFUU5CX1JldHVyblN0YXR1c19lbjsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNjYsMzkgKzE0MiwzNSBAQAogLyoKICAqIFN1cHBvcnRlZCBzb3VyY2UgZGF0YSBmb3JtYXRzCiAgKi8KLSNkZWZpbmUgTFZFUU5CX0NBUF9TVEVSRU8gICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIExWRVFOQl9DQVBfTU9OT0lOU1RFUkVPICAgICAgICAgICAgMgorI2RlZmluZSBMVkVRTkJfQ0FQX1NURVJFTyAxCisjZGVmaW5lIExWRVFOQl9DQVBfTU9OT0lOU1RFUkVPIDIKIAotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZFUU5CX1NURVJFTyAgICAgICA9IDAsCit0eXBlZGVmIGVudW0geworICAgIExWRVFOQl9TVEVSRU8gPSAwLAogICAgIExWRVFOQl9NT05PSU5TVEVSRU8gPSAxLAotI2lmZGVmIFNVUFBPUlRfTUMKICAgICBMVkVRTkJfTVVMVElDSEFOTkVMID0gMiwKLSNlbmRpZgotICAgIExWRVFOQl9TT1VSQ0VfTUFYICAgPSBMVk1fTUFYSU5UXzMyCisgICAgTFZFUU5CX1NPVVJDRV9NQVggPSBMVk1fTUFYSU5UXzMyCiB9IExWRVFOQl9Tb3VyY2VGb3JtYXRfZW47CiAKIC8qCiAgKiBTdXBwb3J0ZWQgc2FtcGxlIHJhdGVzIGluIHNhbXBsZXMgcGVyIHNlY29uZAogICovCi0jZGVmaW5lIExWRVFOQl9DQVBfRlNfODAwMCAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzExMDI1ICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTFZFUU5CX0NBUF9GU18xMjAwMCAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIExWRVFOQl9DQVBfRlNfMTYwMDAgICAgICAgICAgICAgICAgOAotI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzIyMDUwICAgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIExWRVFOQl9DQVBfRlNfMjQwMDAgICAgICAgICAgICAgICAgMzIKLSNkZWZpbmUgTFZFUU5CX0NBUF9GU18zMjAwMCAgICAgICAgICAgICAgICA2NAotI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzQ0MTAwICAgICAgICAgICAgICAgIDEyOAotI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzQ4MDAwICAgICAgICAgICAgICAgIDI1NgotI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzg4MjAwICAgICAgICAgICAgICAgIDUxMgotI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzk2MDAwICAgICAgICAgICAgICAgIDEwMjQKLSNkZWZpbmUgTFZFUU5CX0NBUF9GU18xNzY0MDAgICAgICAgICAgICAgICAyMDQ4Ci0jZGVmaW5lIExWRVFOQl9DQVBfRlNfMTkyMDAwICAgICAgICAgICAgICAgNDA5NgorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzgwMDAgMQorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzExMDI1IDIKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU18xMjAwMCA0CisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMTYwMDAgOAorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzIyMDUwIDE2CisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMjQwMDAgMzIKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU18zMjAwMCA2NAorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIDEyOAorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIDI1NgorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzg4MjAwIDUxMgorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzk2MDAwIDEwMjQKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU18xNzY0MDAgMjA0OAorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzE5MjAwMCA0MDk2CiAKLXR5cGVkZWYgZW51bQotewotICAgIExWRVFOQl9GU184MDAwICA9IDAsCit0eXBlZGVmIGVudW0geworICAgIExWRVFOQl9GU184MDAwID0gMCwKICAgICBMVkVRTkJfRlNfMTEwMjUgPSAxLAogICAgIExWRVFOQl9GU18xMjAwMCA9IDIsCiAgICAgTFZFUU5CX0ZTXzE2MDAwID0gMywKQEAgLTIxMSw3ICsxODMsNyBAQAogICAgIExWRVFOQl9GU185NjAwMCA9IDEwLAogICAgIExWRVFOQl9GU18xNzY0MDAgPSAxMSwKICAgICBMVkVRTkJfRlNfMTkyMDAwID0gMTIsCi0gICAgTFZFUU5CX0ZTX01BWCAgID0gTFZNX01BWElOVF8zMgorICAgIExWRVFOQl9GU19NQVggPSBMVk1fTUFYSU5UXzMyCiB9IExWRVFOQl9Gc19lbjsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMjAsNTggKzE5MiwzOCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gc2l6ZSBpbiBieXRlcyAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBBbGlnbm1lbnQ7ICAgICAgICAgICAgICAvKiBSZWdpb24gYWxpZ25tZW50IGluIGJ5dGVzICovCi0gICAgTFZFUU5CX01lbW9yeVR5cGVzX2VuICAgICAgIFR5cGU7ICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiB0eXBlICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICpwQmFzZUFkZHJlc3M7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHJlZ2lvbiBiYXNlIGFkZHJlc3MgKi8KLX0gTFZFUU5CX01lbW9yeVJlZ2lvbl90OwotCi0vKiBNZW1vcnkgdGFibGUgY29udGFpbmluZyB0aGUgcmVnaW9uIGRlZmluaXRpb25zICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWRVFOQl9NZW1vcnlSZWdpb25fdCAgICAgICBSZWdpb25bTFZFUU5CX05SX01FTU9SWV9SRUdJT05TXTsgIC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLwotfSBMVkVRTkJfTWVtVGFiX3Q7Ci0KIC8qIEVxdWFsaXNlciBiYW5kIGRlZmluaXRpb24gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIEdhaW47ICAgICAgICAgICAgICAgICAgIC8qIEJhbmQgZ2FpbiBpbiBkQiAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBGcmVxdWVuY3k7ICAgICAgICAgICAgICAvKiBCYW5kIGNlbnRyZSBmcmVxdWVuY3kgaW4gSHogKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgUUZhY3RvcjsgICAgICAgICAgICAgICAgLyogQmFuZCBxdWFsaXR5IGZhY3RvciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9JTlQxNiBHYWluOyAgICAgICAvKiBCYW5kIGdhaW4gaW4gZEIgKi8KKyAgICBMVk1fVUlOVDE2IEZyZXF1ZW5jeTsgLyogQmFuZCBjZW50cmUgZnJlcXVlbmN5IGluIEh6ICovCisgICAgTFZNX1VJTlQxNiBRRmFjdG9yOyAgIC8qIEJhbmQgcXVhbGl0eSBmYWN0b3IgKi8KIH0gTFZFUU5CX0JhbmREZWZfdDsKIAogLyogUGFyYW1ldGVyIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KLSAgICBMVkVRTkJfTW9kZV9lbiAgICAgICAgICAgICAgT3BlcmF0aW5nTW9kZTsKLSAgICBMVkVRTkJfRnNfZW4gICAgICAgICAgICAgICAgU2FtcGxlUmF0ZTsKLSAgICBMVkVRTkJfU291cmNlRm9ybWF0X2VuICAgICAgU291cmNlRm9ybWF0OworICAgIExWRVFOQl9Nb2RlX2VuIE9wZXJhdGluZ01vZGU7CisgICAgTFZFUU5CX0ZzX2VuIFNhbXBsZVJhdGU7CisgICAgTFZFUU5CX1NvdXJjZUZvcm1hdF9lbiBTb3VyY2VGb3JtYXQ7CiAKICAgICAvKiBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBOQmFuZHM7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmFuZHMgKi8KLSAgICBMVkVRTkJfQmFuZERlZl90ICAgICAgICAgICAgKnBCYW5kRGVmaW5pdGlvbjsgICAgICAgLyogUG9pbnRlciB0byBlcXVhbGlzZXIgZGVmaW5pdGlvbnMgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHM7Ci0jZW5kaWYKKyAgICBMVk1fVUlOVDE2IE5CYW5kczsgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyAqLworICAgIExWRVFOQl9CYW5kRGVmX3QqIHBCYW5kRGVmaW5pdGlvbjsgLyogUG9pbnRlciB0byBlcXVhbGlzZXIgZGVmaW5pdGlvbnMgKi8KKyAgICBMVk1fSU5UMTYgTnJDaGFubmVsczsKIH0gTFZFUU5CX1BhcmFtc190OwogCiAvKiBDYXBhYmlsaXR5IHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgU2FtcGxlUmF0ZTsKKyAgICBMVk1fVUlOVDE2IFNhbXBsZVJhdGU7CiAKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgU291cmNlRm9ybWF0OwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemU7Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE1heEJhbmRzOworICAgIExWTV9VSU5UMTYgU291cmNlRm9ybWF0OworICAgIExWTV9VSU5UMTYgTWF4QmxvY2tTaXplOworICAgIExWTV9VSU5UMTYgTWF4QmFuZHM7CiAKICAgICAvKiBDYWxsYmFjayBwYXJhbWV0ZXJzICovCi0gICAgTFZNX0NhbGxiYWNrICAgICAgICAgICAgICAgIENhbGxCYWNrOyAgICAgICAgICAgICAgIC8qIEJ1bmRsZSBjYWxsYmFjayAqLwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqcEJ1bmRsZUluc3RhbmNlOyAgICAgICAvKiBCdW5kbGUgaW5zdGFuY2UgaGFuZGxlICovCisgICAgTFZNX0NhbGxiYWNrIENhbGxCYWNrOyAvKiBCdW5kbGUgY2FsbGJhY2sgKi8KKyAgICB2b2lkKiBwQnVuZGxlSW5zdGFuY2U7IC8qIEJ1bmRsZSBpbnN0YW5jZSBoYW5kbGUgKi8KIAogfSBMVkVRTkJfQ2FwYWJpbGl0aWVzX3Q7CiAKQEAgLTI4Myw3OCArMjM1LDQzIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KLS8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLwotLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLwotLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KLS8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkVRTkJfU1VDQ0VTUyAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgIFdoZW4gYW55IG9mIHBNZW1vcnlUYWJsZSBhbmQgcENhcGFiaWxpdGllcyBpcyBOVUxMIGFkZHJlc3MgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZFUU5CX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9NZW1vcnkoTFZFUU5CX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9NZW1UYWJfdCAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgICAgKnBDYXBhYmlsaXRpZXMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENyZWF0ZSBhbmQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBOLUJhbmQgZXF1YWxsaXNlciBtb2R1bGUgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBhbGdvcml0aG0gaW5zdGFuY2UgYnkgY2FsbGluZyB3aXRoICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSBzZXQgdG8gTlVMTC4gSW4gdGhpcyBjYXNlIHRoZSBhbGdvcml0aG0gcmV0dXJucyB0aGUgbmV3IGluc3RhbmNlICAgICAgICAgICovCi0vKiAgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZm9yY2UgYSBmdWxsIHJlLWluaXRpYWxpc2F0aW9uIG9mIHRoZSBhbGdvcml0aG0gICAgICAgICovCi0vKiAgYnkgY2FsbGluZyB3aXRoIGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZS4gSW4gdGhpcyBjYXNlIHRoZSBtZW1vcnkgdGFibGUgICAgICAgICAgKi8KLS8qICBzaG91bGQgYmUgY29ycmVjdCBmb3IgdGhlIGluc3RhbmNlLCB0aGlzIGNhbiBiZSBlbnN1cmVkIGJ5IGNhbGxpbmcgdGhlIGZ1bmN0aW9uICAgICAqLwotLyogIExWRVFOQl9NZW1vcnkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ3JlYXRlIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIE4tQmFuZCBlcXVhbGlzZXIgbW9kdWxlLiAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIFBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgKi8KKy8qICBwU2NyYXRjaCAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGJ1bmRsZSBzY3JhdGNoIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBMVkVRTkJfU1VDQ0VTUyAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgICAgV2hlbiBwQ2FwYWJpbGl0aWVzIG9yIHBNZW1vcnlUYWJsZWlzIG9yIHBoSW5zdGFuY2UgYXJlIE5VTEwgKi8KLS8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICAgIE9uZSBvciBtb3JlIG9mIHRoZSBtZW1vcnkgcmVnaW9ucyBoYXMgYSBOVUxMIGJhc2UgYWRkcmVzcyAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciBmb3IgYSBtZW1vcnkgcmVnaW9uIHdpdGggYSBub24temVybyBzaXplLiAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgIFdoZW4gcENhcGFiaWxpdGllcyBvciBwaEluc3RhbmNlIGFyZSBOVUxMICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgV2hlbiBhbGxvY2F0ZWQgbWVtb3J5IGhhcyBhIE5VTEwgYmFzZSBhZGRyZXNzICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoZSBpbnN0YW5jZSBoYW5kbGUgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWVtb3J5ICAgICAgKi8KLS8qICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDIuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Jbml0KExWRVFOQl9IYW5kbGVfdCogcGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190KiBwQ2FwYWJpbGl0aWVzLCB2b2lkKiBwU2NyYXRjaCk7CiAKLUxWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0luaXQoTFZFUU5CX0hhbmRsZV90ICAgICAgICAgICpwaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfTWVtVGFiX3QgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgICpwQ2FwYWJpbGl0aWVzKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX0RlSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGcmVlIHRoZSBtZW1vcmllcyBjcmVhdGVkIGR1cmluZyBMVkVRTkJfSW5pdCBpbmNsdWRpbmcgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgUG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIExWRVFOQl9EZUluaXQoTFZFUU5CX0hhbmRsZV90KiBwaEluc3RhbmNlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM3Nyw4ICsyOTQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfR2V0UGFyYW1ldGVycyhMVkVRTkJfSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX1BhcmFtc190ICAgICAqcFBhcmFtcyk7CitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9HZXRQYXJhbWV0ZXJzKExWRVFOQl9IYW5kbGVfdCBoSW5zdGFuY2UsIExWRVFOQl9QYXJhbXNfdCogcFBhcmFtcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00MDEsOCArMzE3LDggQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0dldENhcGFiaWxpdGllcyhMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgICpwQ2FwYWJpbGl0aWVzKTsKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0dldENhcGFiaWxpdGllcyhMVkVRTkJfSGFuZGxlX3QgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCogcENhcGFiaWxpdGllcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00MjYsOCArMzQyLDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0NvbnRyb2woTFZFUU5CX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX1BhcmFtc190ICAgICAgICpwUGFyYW1zKTsKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0NvbnRyb2woTFZFUU5CX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZFUU5CX1BhcmFtc190KiBwUGFyYW1zKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQ1MSwxMCArMzY2LDcgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1Byb2Nlc3MoTFZFUU5CX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcyk7CitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Qcm9jZXNzKExWRVFOQl9IYW5kbGVfdCBoSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwT3V0RGF0YSwgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKTsKIAotI2VuZGlmICAgICAgLyogX19MVkVRTkJfXyAqLwotCisjZW5kaWYgLyogX19MVkVRTkJfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ2FsY0NvZWYuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ2FsY0NvZWYuY3BwCmluZGV4IGMzYzBmYWQuLmY4YTVmMmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NhbGNDb2VmLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jcHAKQEAgLTExMSw0MyArMTExLDM3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMoTFZNX1VJTlQxNiAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JhbmREZWZfdCAgKnBGaWx0ZXJEZWZpbml0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QgICpwQ29lZmZpY2llbnRzKQotewotCi0gICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVkVRTkJfR2FpblRhYmxlW107Ci0gICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVkVRTkJfVHdvUGlPbkZzVGFibGVbXTsKLSAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWRVFOQl9EVGFibGVbXTsKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1NpbmdsZVByZWNDb2VmcyhMVk1fVUlOVDE2IEZzLCBMVkVRTkJfQmFuZERlZl90KiBwRmlsdGVyRGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19GTE9BVF9Db2Vmc190KiBwQ29lZmZpY2llbnRzKSB7CisgICAgZXh0ZXJuIExWTV9GTE9BVCBMVkVRTkJfR2FpblRhYmxlW107CisgICAgZXh0ZXJuIExWTV9GTE9BVCBMVkVRTkJfVHdvUGlPbkZzVGFibGVbXTsKKyAgICBleHRlcm4gTFZNX0ZMT0FUIExWRVFOQl9EVGFibGVbXTsKIAogICAgIC8qCiAgICAgICogR2V0IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbgogICAgICAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgR2FpbiAgICAgICAgPSBwRmlsdGVyRGVmaW5pdGlvbi0+R2FpbjsKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgIEZyZXF1ZW5jeSAgID0gcEZpbHRlckRlZmluaXRpb24tPkZyZXF1ZW5jeTsKKyAgICBMVk1fSU5UMTYgR2FpbiA9IHBGaWx0ZXJEZWZpbml0aW9uLT5HYWluOworICAgIExWTV9VSU5UMTYgRnJlcXVlbmN5ID0gcEZpbHRlckRlZmluaXRpb24tPkZyZXF1ZW5jeTsKICAgICAvKiBBcyBtZW50aW9uZWQgaW4gZWZmZWN0YnVuZGxlLmggKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgIFFGYWN0b3IgICAgID0gKExWTV9GTE9BVClwRmlsdGVyRGVmaW5pdGlvbi0+UUZhY3RvciAvIDEwMC4wZjsKKyAgICBMVk1fRkxPQVQgUUZhY3RvciA9IChMVk1fRkxPQVQpcEZpbHRlckRlZmluaXRpb24tPlFGYWN0b3IgLyAxMDAuMGY7CiAKICAgICAvKgogICAgICAqIEludGVybWVkaWF0ZSB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyeSB2YWx1ZXMKICAgICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgIFQwOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgRDsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEEwOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQjE7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBCMjsKKyAgICBMVk1fRkxPQVQgVDA7CisgICAgTFZNX0ZMT0FUIEQ7CisgICAgTFZNX0ZMT0FUIEEwOworICAgIExWTV9GTE9BVCBCMTsKKyAgICBMVk1fRkxPQVQgQjI7CiAKICAgICAvKgogICAgICAqIENhbGN1bGF0aW5nIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzCiAgICAgICovCi0gICAgVDAgPSBGcmVxdWVuY3kgKiBMVkVRTkJfVHdvUGlPbkZzVGFibGVbRnNdOyAgICAgICAgLyogVDAgPSAyICogUGkgKiBGYyAvIEZzICovCi0gICAgaWYgKEdhaW4gPj0gMCkKLSAgICB7Ci0gICAgICAgIEQgPSBMVkVRTkJfRFRhYmxlWzE1XTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogRCA9IDEgICAgICAgICAgICBpZiBHYWluZEIgPj0gMCAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBEID0gTFZFUU5CX0RUYWJsZVtHYWluICsgMTVdOyAgICAgICAgICAgICAgICAgICAgLyogRCA9IDEgLyAoMSArIEcpICBpZiBHYWluZEIgPCAgMCAqLworICAgIFQwID0gRnJlcXVlbmN5ICogTFZFUU5CX1R3b1BpT25Gc1RhYmxlW0ZzXTsgLyogVDAgPSAyICogUGkgKiBGYyAvIEZzICovCisgICAgaWYgKEdhaW4gPj0gMCkgeworICAgICAgICBEID0gTFZFUU5CX0RUYWJsZVsxNV07IC8qIEQgPSAxICAgICAgICAgICAgaWYgR2FpbmRCID49IDAgKi8KKyAgICB9IGVsc2UgeworICAgICAgICBEID0gTFZFUU5CX0RUYWJsZVtHYWluICsgMTVdOyAvKiBEID0gMSAvICgxICsgRykgIGlmIEdhaW5kQiA8ICAwICovCiAgICAgfQogCiAgICAgLyoKQEAgLTE2NCw3ICsxNTgsNyBAQAogICAgIHBDb2VmZmljaWVudHMtPkEwID0gMiAqIEEwOwogICAgIHBDb2VmZmljaWVudHMtPkIxID0gMiAqIEIxOwogICAgIHBDb2VmZmljaWVudHMtPkIyID0gMiAqIEIyOwotICAgIHBDb2VmZmljaWVudHMtPkcgID0gTFZFUU5CX0dhaW5UYWJsZVtHYWluICsgMTVdOworICAgIHBDb2VmZmljaWVudHMtPkcgPSBMVkVRTkJfR2FpblRhYmxlW0dhaW4gKyAxNV07CiAKLSAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZFUU5CX1NVQ0NFU1MpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaAppbmRleCA2MzI5MTgxLi5jNDRhOWJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaApAQCAtMjMsNzggKzIzLDc4IEBACiAvKiBHYWluIHRhYmxlIGZvciAoMTBeKEdhaW4vMjApIC0gMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIExWRVFOQl9HYWluX05lZzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODIyMTcyZikKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC44MDA0NzRmKQotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc3NjEyOGYpCi0jZGVmaW5lIExWRVFOQl9HYWluX05lZzEyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ4ODExZikKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43MTgxNjJmKQotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjY4Mzc3MmYpCi0jZGVmaW5lIExWRVFOQl9HYWluX05lZzlfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjQ1MTg3ZikKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnOF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42MDE4OTNmKQotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc3X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU1MzMxNmYpCi0jZGVmaW5lIExWRVFOQl9HYWluX05lZzZfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNDk4ODEzZikKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC40Mzc2NTlmKQotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjM2OTA0M2YpCi0jZGVmaW5lIExWRVFOQl9HYWluX05lZzNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjkyMDU0ZikKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMDU2NzJmKQotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjEwODc0OWYpCi0jZGVmaW5lIExWRVFOQl9HYWluXzBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIExWRVFOQl9HYWluXzFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjIwMThmCi0jZGVmaW5lIExWRVFOQl9HYWluXzJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTg5MjVmCi0jZGVmaW5lIExWRVFOQl9HYWluXzNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MTI1MzhmCi0jZGVmaW5lIExWRVFOQl9HYWluXzRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41ODQ4OTNmCi0jZGVmaW5lIExWRVFOQl9HYWluXzVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43NzgyNzlmCi0jZGVmaW5lIExWRVFOQl9HYWluXzZfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTUyNjJmCi0jZGVmaW5lIExWRVFOQl9HYWluXzdfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMzg3MjFmCi0jZGVmaW5lIExWRVFOQl9HYWluXzhfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41MTE4ODZmCi0jZGVmaW5lIExWRVFOQl9HYWluXzlfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS44MTgzODNmCi0jZGVmaW5lIExWRVFOQl9HYWluXzEwX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xNjIyNzhmCi0jZGVmaW5lIExWRVFOQl9HYWluXzExX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi41NDgxMzRmCi0jZGVmaW5lIExWRVFOQl9HYWluXzEyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi45ODEwNzJmCi0jZGVmaW5lIExWRVFOQl9HYWluXzEzX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy40NjY4MzZmCi0jZGVmaW5lIExWRVFOQl9HYWluXzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC4wMTE4NzJmCi0jZGVmaW5lIExWRVFOQl9HYWluXzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC42MjM0MTNmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzE1X2RCICgtMC44MjIxNzJmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxNF9kQiAoLTAuODAwNDc0ZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTNfZEIgKC0wLjc3NjEyOGYpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEyX2RCICgtMC43NDg4MTFmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxMV9kQiAoLTAuNzE4MTYyZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTBfZEIgKC0wLjY4Mzc3MmYpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzlfZEIgKC0wLjY0NTE4N2YpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzhfZEIgKC0wLjYwMTg5M2YpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzdfZEIgKC0wLjU1MzMxNmYpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzZfZEIgKC0wLjQ5ODgxM2YpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzVfZEIgKC0wLjQzNzY1OWYpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzRfZEIgKC0wLjM2OTA0M2YpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzNfZEIgKC0wLjI5MjA1NGYpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzJfZEIgKC0wLjIwNTY3MmYpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzFfZEIgKC0wLjEwODc0OWYpCisjZGVmaW5lIExWRVFOQl9HYWluXzBfZEIgMC4wMDAwMDBmCisjZGVmaW5lIExWRVFOQl9HYWluXzFfZEIgMC4xMjIwMThmCisjZGVmaW5lIExWRVFOQl9HYWluXzJfZEIgMC4yNTg5MjVmCisjZGVmaW5lIExWRVFOQl9HYWluXzNfZEIgMC40MTI1MzhmCisjZGVmaW5lIExWRVFOQl9HYWluXzRfZEIgMC41ODQ4OTNmCisjZGVmaW5lIExWRVFOQl9HYWluXzVfZEIgMC43NzgyNzlmCisjZGVmaW5lIExWRVFOQl9HYWluXzZfZEIgMC45OTUyNjJmCisjZGVmaW5lIExWRVFOQl9HYWluXzdfZEIgMS4yMzg3MjFmCisjZGVmaW5lIExWRVFOQl9HYWluXzhfZEIgMS41MTE4ODZmCisjZGVmaW5lIExWRVFOQl9HYWluXzlfZEIgMS44MTgzODNmCisjZGVmaW5lIExWRVFOQl9HYWluXzEwX2RCIDIuMTYyMjc4ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8xMV9kQiAyLjU0ODEzNGYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fMTJfZEIgMi45ODEwNzJmCisjZGVmaW5lIExWRVFOQl9HYWluXzEzX2RCIDMuNDY2ODM2ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8xNF9kQiA0LjAxMTg3MmYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fMTVfZEIgNC42MjM0MTNmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRnJlcXVlbmN5IHRhYmxlIGZvciAyKlBpL0ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBMVkVRTkJfMlBpT25fODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDA3ODVmCi0jZGVmaW5lIExWRVFOQl8yUGlPbl8xMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDU3MGYKLSNkZWZpbmUgTFZFUU5CXzJQaU9uXzEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwNTI0ZgotI2RlZmluZSBMVkVRTkJfMlBpT25fMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAzOTNmCi0jZGVmaW5lIExWRVFOQl8yUGlPbl8yMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDI4NWYKLSNkZWZpbmUgTFZFUU5CXzJQaU9uXzI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMjYyZgotI2RlZmluZSBMVkVRTkJfMlBpT25fMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAxOTZmCi0jZGVmaW5lIExWRVFOQl8yUGlPbl80NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDE0MmYKLSNkZWZpbmUgTFZFUU5CXzJQaU9uXzQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMTMxZgorI2RlZmluZSBMVkVRTkJfMlBpT25fODAwMCAwLjAwMDc4NWYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzExMDI1IDAuMDAwNTcwZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMTIwMDAgMC4wMDA1MjRmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8xNjAwMCAwLjAwMDM5M2YKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzIyMDUwIDAuMDAwMjg1ZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMjQwMDAgMC4wMDAyNjJmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8zMjAwMCAwLjAwMDE5NmYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzQ0MTAwIDAuMDAwMTQyZgorI2RlZmluZSBMVkVRTkJfMlBpT25fNDgwMDAgMC4wMDAxMzFmCiAKLSNkZWZpbmUgTFZFUU5CXzJQaU9uXzg4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDcxZgotI2RlZmluZSBMVkVRTkJfMlBpT25fOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwNjVmCi0jZGVmaW5lIExWRVFOQl8yUGlPbl8xNzY0MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAzNmYKLSNkZWZpbmUgTFZFUU5CXzJQaU9uXzE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDMzZgorI2RlZmluZSBMVkVRTkJfMlBpT25fODgyMDAgMC4wMDAwNzFmCisjZGVmaW5lIExWRVFOQl8yUGlPbl85NjAwMCAwLjAwMDA2NWYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzE3NjQwMCAwLjAwMDAzNmYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzE5MjAwMCAwLjAwMDAzM2YKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA1MEQgdGFibGUgZm9yIDUwIC8gKCAxICsgR2FpbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIExWRVFOQl8xMDBEX05lZzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjYyMzQxM2YKLSNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuMDExODcyZgotI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC40NjY4MzZmCi0jZGVmaW5lIExWRVFOQl8xMDBEX05lZzEyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjk4MTA3MmYKLSNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNTQ4MTM0ZgotI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4xNjIyNzhmCi0jZGVmaW5lIExWRVFOQl8xMDBEX05lZzlfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjgxODM4M2YKLSNkZWZpbmUgTFZFUU5CXzEwMERfTmVnOF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNTExODg2ZgotI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc3X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4yMzg3MjFmCi0jZGVmaW5lIExWRVFOQl8xMDBEX05lZzZfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjk5NTI2MmYKLSNkZWZpbmUgTFZFUU5CXzEwMERfTmVnNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzc4Mjc5ZgotI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41ODQ4OTNmCi0jZGVmaW5lIExWRVFOQl8xMDBEX05lZzNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQxMjUzOGYKLSNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjU4OTI1ZgotI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMjIwMThmCi0jZGVmaW5lIExWRVFOQl8xMDBEXzBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAwMDAwMGYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTVfZEIgNS42MjM0MTNmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzE0X2RCIDUuMDExODcyZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxM19kQiA0LjQ2NjgzNmYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTJfZEIgMy45ODEwNzJmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzExX2RCIDMuNTQ4MTM0ZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxMF9kQiAzLjE2MjI3OGYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnOV9kQiAyLjgxODM4M2YKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnOF9kQiAyLjUxMTg4NmYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnN19kQiAyLjIzODcyMWYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnNl9kQiAxLjk5NTI2MmYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnNV9kQiAxLjc3ODI3OWYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnNF9kQiAxLjU4NDg5M2YKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnM19kQiAxLjQxMjUzOGYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMl9kQiAxLjI1ODkyNWYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMV9kQiAxLjEyMjAxOGYKKyNkZWZpbmUgTFZFUU5CXzEwMERfMF9kQiAxLjAwMDAwMGYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db250cm9sLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuY3BwCmluZGV4IDZiYjRhN2UuLjdlNWNhZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSAiTFZFUU5CLmgiCiAjaW5jbHVkZSAiTFZFUU5CX1ByaXZhdGUuaCIKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCkBAIC0zMiw4ICszMyw4IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lICAgICBMT1dfRlJFUSAgICAgICAgICAgIDI5OCAgICAgICAgICAgICAvKiAzMjc2OC8xMTAgZm9yIGxvdyB0ZXN0IGZyZXF1ZW5jeSAqLwotI2RlZmluZSAgICAgSElHSF9GUkVRICAgICAgICAgICAzODYgICAgICAgICAgICAgLyogMzI3NjgvODUgZm9yIGhpZ2ggdGVzdCBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgTE9XX0ZSRVEgMjk4ICAvKiAzMjc2OC8xMTAgZm9yIGxvdyB0ZXN0IGZyZXF1ZW5jeSAqLworI2RlZmluZSBISUdIX0ZSRVEgMzg2IC8qIDMyNzY4Lzg1IGZvciBoaWdoIHRlc3QgZnJlcXVlbmN5ICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01NiwyMyArNTcsMTkgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0dldFBhcmFtZXRlcnMoTFZFUU5CX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgKnBQYXJhbXMpCi17CitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9HZXRQYXJhbWV0ZXJzKExWRVFOQl9IYW5kbGVfdCBoSW5zdGFuY2UsIExWRVFOQl9QYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWRVFOQl9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKIAotICAgIExWRVFOQl9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPShMVkVRTkJfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0KLSAgIC8qCisgICAgLyoKICAgICAgKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucwogICAgICAqLwotICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwUGFyYW1zID09IExWTV9OVUxMKSkKLSAgICB7CisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwUGFyYW1zID09IExWTV9OVUxMKSkgewogICAgICAgICByZXR1cm4gTFZFUU5CX05VTExBRERSRVNTOwogICAgIH0KIAogICAgICpwUGFyYW1zID0gcEluc3RhbmNlLT5QYXJhbXM7CiAKLSAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZFUU5CX1NVQ0NFU1MpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTYsMjAgKzkzLDE3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfR2V0Q2FwYWJpbGl0aWVzKExWRVFOQl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAgKnBDYXBhYmlsaXRpZXMpCi17CitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9HZXRDYXBhYmlsaXRpZXMoTFZFUU5CX0hhbmRsZV90IGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QqIHBDYXBhYmlsaXRpZXMpIHsKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWRVFOQl9JbnN0YW5jZV90KiloSW5zdGFuY2U7CiAKLSAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotCi0gICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBDYXBhYmlsaXRpZXMgPT0gTFZNX05VTEwpKQotICAgIHsKKyAgICBpZiAoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBDYXBhYmlsaXRpZXMgPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7CiAgICAgfQogCiAgICAgKnBDYXBhYmlsaXRpZXMgPSBwSW5zdGFuY2UtPkNhcGFiaWxpdGllczsKIAotICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVkVRTkJfU1VDQ0VTUyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMzQsMzMgKzEyOCwzMCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgICAgTFZFUU5CX1NldEZpbHRlcnMoTFZFUU5CX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKLXsKLSAgICBleHRlcm4gY29uc3QgTFZNX1VJTlQzMiAgIExWRVFOQl9TYW1wbGVSYXRlVGFiW107ICAgICAgICAgICAvKiBTYW1wbGUgcmF0ZSB0YWJsZSAqLwordm9pZCBMVkVRTkJfU2V0RmlsdGVycyhMVkVRTkJfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVkVRTkJfUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBleHRlcm4gY29uc3QgTFZNX1VJTlQzMiBMVkVRTkJfU2FtcGxlUmF0ZVRhYltdOyAvKiBTYW1wbGUgcmF0ZSB0YWJsZSAqLwogCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGJhbmQgaW5kZXggKi8KLSAgICBMVk1fVUlOVDMyICAgICAgICAgIGZzID0gKExWTV9VSU5UMzIpTFZFUU5CX1NhbXBsZVJhdGVUYWJbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07ICAvKiBTYW1wbGUgcmF0ZSAqLwotICAgIExWTV9VSU5UMzIgICAgICAgICAgZmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICBRRmFjdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIFEgZmFjdG9yICovCisgICAgTFZNX1VJTlQxNiBpOyAvKiBGaWx0ZXIgYmFuZCBpbmRleCAqLworICAgIExWTV9VSU5UMzIgZnMgPQorICAgICAgICAgICAgKExWTV9VSU5UMzIpTFZFUU5CX1NhbXBsZVJhdGVUYWJbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07IC8qIFNhbXBsZSByYXRlICovCisgICAgTFZNX1VJTlQzMiBmYzsgICAgIC8qIEZpbHRlciBjZW50cmUgZnJlcXVlbmN5ICovCisgICAgTFZNX0lOVDE2IFFGYWN0b3I7IC8qIEZpbHRlciBRIGZhY3RvciAqLwogCiAgICAgcEluc3RhbmNlLT5OQmFuZHMgPSBwUGFyYW1zLT5OQmFuZHM7CiAKLSAgICBmb3IgKGk9MDsgaTxwUGFyYW1zLT5OQmFuZHM7IGkrKykKLSAgICB7CisgICAgZm9yIChpID0gMDsgaSA8IHBQYXJhbXMtPk5CYW5kczsgaSsrKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIEdldCB0aGUgZmlsdGVyIHNldHRpbmdzCiAgICAgICAgICAqLwotICAgICAgICBmYyA9IChMVk1fVUlOVDMyKXBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5GcmVxdWVuY3k7ICAgICAvKiBHZXQgdGhlIGJhbmQgY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgICAgICBRRmFjdG9yID0gKExWTV9JTlQxNilwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV0uUUZhY3RvcjsgICAvKiBHZXQgdGhlIGJhbmQgUSBmYWN0b3IgKi8KKyAgICAgICAgZmMgPSAoTFZNX1VJTlQzMilwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5OyAvKiBHZXQgdGhlIGJhbmQgY2VudHJlIGZyZXF1ZW5jeSAqLworICAgICAgICBRRmFjdG9yID0gKExWTV9JTlQxNilwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV0uUUZhY3RvcjsgLyogR2V0IHRoZSBiYW5kIFEgZmFjdG9yICovCiAKICAgICAgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXSA9IExWRVFOQl9TaW5nbGVQcmVjaXNpb25fRmxvYXQ7IC8qIERlZmF1bHQgdG8gc2luZ2xlIHByZWNpc2lvbiAqLwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIENoZWNrIGZvciBvdXQgb2YgcmFuZ2UgZnJlcXVlbmNpZXMKICAgICAgICAgICovCi0gICAgICAgIGlmIChmYyA+IChmcyA+PiAxKSkKLSAgICAgICAgeworICAgICAgICBpZiAoZmMgPiAoZnMgPj4gMSkpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0gPSBMVkVRTkJfT3V0T2ZSYW5nZTsKICAgICAgICAgfQogCkBAIC0xNjgsNyArMTU5LDYgQEAKICAgICAgICAgICogQ29weSB0aGUgZmlsdGVyIGRlZmluaXRpb24gdG8gcGVyc2lzdGFudCBtZW1vcnkKICAgICAgICAgICovCiAgICAgICAgIHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXSA9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXTsKLQogICAgIH0KIH0KIApAQCAtMTg2LDQ2ICsxNzYsNDQgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkICAgIExWRVFOQl9TZXRDb2VmZmljaWVudHMoTFZFUU5CX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UpCi17Cit2b2lkIExWRVFOQl9TZXRDb2VmZmljaWVudHMoTFZFUU5CX0luc3RhbmNlX3QqIHBJbnN0YW5jZSkgeworICAgIExWTV9VSU5UMTYgaTsgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBiYW5kIGluZGV4ICovCisgICAgTFZFUU5CX0JpcXVhZFR5cGVfZW4gQmlxdWFkVHlwZTsgLyogRmlsdGVyIGJpcXVhZCB0eXBlICovCiAKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGJhbmQgaW5kZXggKi8KLSAgICBMVkVRTkJfQmlxdWFkVHlwZV9lbiAgICBCaXF1YWRUeXBlOyAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGJpcXVhZCB0eXBlICovCi0KKyAgICBwSW5zdGFuY2UtPmdhaW4ucmVzaXplKHBJbnN0YW5jZS0+UGFyYW1zLk5CYW5kcyk7CiAgICAgLyoKICAgICAgKiBTZXQgdGhlIGNvZWZmaWNpZW50cyBmb3IgZWFjaCBiYW5kIGJ5IHRoZSBpbml0IGZ1bmN0aW9uCiAgICAgICovCi0gICAgZm9yIChpPTA7IGk8cEluc3RhbmNlLT5QYXJhbXMuTkJhbmRzOyBpKyspCi0gICAgewotCisgICAgZm9yIChpID0gMDsgaSA8IHBJbnN0YW5jZS0+UGFyYW1zLk5CYW5kczsgaSsrKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIENoZWNrIGJhbmQgdHlwZSBmb3IgY29ycmVjdCBpbml0aWFsaXNhdGlvbiBtZXRob2QgYW5kIHJlY2FsY3VsYXRlIHRoZSBjb2VmZmljaWVudHMKICAgICAgICAgICovCiAgICAgICAgIEJpcXVhZFR5cGUgPSBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldOwotICAgICAgICBzd2l0Y2ggIChCaXF1YWRUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlICAgIExWRVFOQl9TaW5nbGVQcmVjaXNpb25fRmxvYXQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKKyAgICAgICAgc3dpdGNoIChCaXF1YWRUeXBlKSB7CisgICAgICAgICAgICBjYXNlIExWRVFOQl9TaW5nbGVQcmVjaXNpb25fRmxvYXQ6IHsKKyAgICAgICAgICAgICAgICBQS19GTE9BVF9Db2Vmc190IENvZWZmaWNpZW50czsKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIENhbGN1bGF0ZSB0aGUgc2luZ2xlIHByZWNpc2lvbiBjb2VmZmljaWVudHMKICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldLCAmQ29lZmZpY2llbnRzKTsKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZV9GbG9hdFtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBFUU5CX1RhcHNfRmxvYXRbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPmdhaW5baV0gPSBDb2VmZmljaWVudHMuRzsKKyAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PExWTV9GTE9BVCwgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OmtCaXF1YWROdW1Db2Vmcz4gY29lZnMgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb2VmZmljaWVudHMuQTAsIDAuMCwgLShDb2VmZmljaWVudHMuQTApLCAtKENvZWZmaWNpZW50cy5CMSksCisgICAgICAgICAgICAgICAgICAgICAgICAtKENvZWZmaWNpZW50cy5CMil9OworICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+ZXFCaXF1YWRbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb2VmZmljaWVudHM8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8TFZNX0ZMT0FULCBhbmRyb2lkOjphdWRpb191dGlsczo6a0JpcXVhZE51bUNvZWZzPj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZzKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9Ci0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIzOSwyMCArMjI3LDkgQEAKIC8qICBwSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgICAgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeShMVkVRTkJfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSkKLXsKLSAgICBMVk1fRkxPQVQgICAgICAgKnBUYXBBZGRyZXNzOwotICAgIExWTV9JTlQxNiAgICAgICBOdW1UYXBzOwotCi0gICAgcFRhcEFkZHJlc3MgPSAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5wRVFOQl9UYXBzX0Zsb2F0OwotICAgIE51bVRhcHMgICAgID0gKExWTV9JTlQxNikoKHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJhbmRzICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSkgLyBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0KLSAgICBpZiAoTnVtVGFwcyAhPSAwKQotICAgIHsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGhpc3RvcnksIHZhbHVlIDAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBUYXBBZGRyZXNzLCAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE51bVRhcHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCit2b2lkIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkoTFZFUU5CX0luc3RhbmNlX3QqIHBJbnN0YW5jZSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcEluc3RhbmNlLT5lcUJpcXVhZC5zaXplKCk7IGkrKykgeworICAgICAgICBwSW5zdGFuY2UtPmVxQmlxdWFkW2ldLmNsZWFyKCk7CiAgICAgfQogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNzcsNTYgKzI1NCw0NyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfQ29udHJvbChMVkVRTkJfSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX1BhcmFtc190ICAgICAgICAqcFBhcmFtcykKLXsKLQotICAgIExWRVFOQl9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgIGJDaGFuZ2UgICAgPSBMVk1fRkFMU0U7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgaSA9IDA7Ci0gICAgTFZFUU5CX01vZGVfZW4gICAgICAgT3BlcmF0aW5nTW9kZVNhdmUgOworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfQ29udHJvbChMVkVRTkJfSGFuZGxlX3QgaEluc3RhbmNlLCBMVkVRTkJfUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWRVFOQl9JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgTFZNX0lOVDE2IGJDaGFuZ2UgPSBMVk1fRkFMU0U7CisgICAgTFZNX0lOVDE2IGkgPSAwOworICAgIExWRVFOQl9Nb2RlX2VuIE9wZXJhdGluZ01vZGVTYXZlOwogCiAgICAgLyoKICAgICAgKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucwogICAgICAqLwotICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwUGFyYW1zID09IExWTV9OVUxMKSkKLSAgICB7CisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwUGFyYW1zID09IExWTV9OVUxMKSkgewogICAgICAgICByZXR1cm4gTFZFUU5CX05VTExBRERSRVNTOwogICAgIH0KIAotICAgIGlmKChwUGFyYW1zLT5OQmFuZHMgIT0wKSAmJiAocFBhcmFtcy0+cEJhbmREZWZpbml0aW9uPT1MVk1fTlVMTCkpCi0gICAgeworICAgIGlmICgocFBhcmFtcy0+TkJhbmRzICE9IDApICYmIChwUGFyYW1zLT5wQmFuZERlZmluaXRpb24gPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7CiAgICAgfQogCiAgICAgT3BlcmF0aW5nTW9kZVNhdmUgPSBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlOwogCiAgICAgLyogU2V0IHRoZSBhbHBoYSBmYWN0b3Igb2YgdGhlIG1peGVyICovCi0gICAgaWYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSkKLSAgICB7Ci0gICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sTFZFUU5CX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsMik7Ci0gICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sTFZFUU5CX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisgICAgaWYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSkgeworICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CWVBBU1NfTUlYRVJfVEMsIChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQllQQVNTX01JWEVSX1RDLCAoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMik7CiAgICAgfQogCi0gICAgaWYoIChwSW5zdGFuY2UtPlBhcmFtcy5OQmFuZHMgICAgICAgICAgICAhPSAgcFBhcmFtcy0+TkJhbmRzICAgICAgICAgICkgfHwKLSAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgICAgICE9ICBwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICAgKSB8fAotICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMucEJhbmREZWZpbml0aW9uICAgIT0gIHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbiApIHx8Ci0gICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICAgICAgICAhPSAgcFBhcmFtcy0+U2FtcGxlUmF0ZSAgICAgICkgfHwKLSAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCAgICAgICE9ICBwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgICAgKSkKLSAgICB7Ci0KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk5CYW5kcyAhPSBwUGFyYW1zLT5OQmFuZHMpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICE9IHBQYXJhbXMtPk9wZXJhdGluZ01vZGUpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5wQmFuZERlZmluaXRpb24gIT0gcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ICE9IHBQYXJhbXMtPlNvdXJjZUZvcm1hdCkpIHsKICAgICAgICAgYkNoYW5nZSA9IExWTV9UUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IoaSA9IDA7IGkgPCBwUGFyYW1zLT5OQmFuZHM7IGkrKykKLSAgICAgICAgewotCi0gICAgICAgICAgICBpZigocEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldLkZyZXF1ZW5jeSAgIT0gcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeSApfHwKLSAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldLkdhaW4gICAgICAgIT0gcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLkdhaW4gICAgICApfHwKLSAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldLlFGYWN0b3IgICAgIT0gcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLlFGYWN0b3IgICApKQotICAgICAgICAgICAgewotCisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQYXJhbXMtPk5CYW5kczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5GcmVxdWVuY3kgIT0KKyAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeSkgfHwKKyAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldLkdhaW4gIT0gcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLkdhaW4pIHx8CisgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5RRmFjdG9yICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5RRmFjdG9yKSkgewogICAgICAgICAgICAgICAgIGJDaGFuZ2UgPSBMVk1fVFJVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMzM1LDE5ICszMDMsMjQgQEAKICAgICAvLyBEdXJpbmcgb3BlcmF0aW5nIG1vZGUgdHJhbnNpdGlvbiwgdGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSB0aGUgbW9kZQogICAgIC8vIGlzIHN0aWxsIExWRVFOQl9PTiwgYnV0IHRoZSBlZmZlY3QgaXMgY29uc2lkZXJlZCBkaXNhYmxlZCBpbiB0aGUgdXBwZXIgbGF5ZXJzLgogICAgIC8vIG1vZGVDaGFuZ2UgaGFuZGxlcyB0aGlzIHNwZWNpYWwgcmFjZSBjb25kaXRpb24uCi0gICAgY29uc3QgaW50IC8qIGJvb2wgKi8gbW9kZUNoYW5nZSA9IHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gT3BlcmF0aW5nTW9kZVNhdmUKLSAgICAgICAgICAgIHx8IChPcGVyYXRpbmdNb2RlU2F2ZSA9PSBMVkVRTkJfT04KLSAgICAgICAgICAgICAgICAgICAgJiYgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbgotICAgICAgICAgICAgICAgICAgICAmJiBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSA9PSAwKTsKKyAgICBjb25zdCBpbnQgLyogYm9vbCAqLyBtb2RlQ2hhbmdlID0KKyAgICAgICAgICAgIHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gT3BlcmF0aW5nTW9kZVNhdmUgfHwKKyAgICAgICAgICAgIChPcGVyYXRpbmdNb2RlU2F2ZSA9PSBMVkVRTkJfT04gJiYgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiAmJgorICAgICAgICAgICAgIExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pID09IDApOworCisgICAgLyoKKyAgICAgKiBDcmVhdGUgYmlxdWFkIGluc3RhbmNlCisgICAgICovCisgICAgcEluc3RhbmNlLT5lcUJpcXVhZC5yZXNpemUocFBhcmFtcy0+TkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpCaXF1YWRGaWx0ZXI8TFZNX0ZMT0FUPihwUGFyYW1zLT5OckNoYW5uZWxzKSk7CisgICAgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeShwSW5zdGFuY2UpOwogCiAgICAgaWYgKGJDaGFuZ2UgfHwgbW9kZUNoYW5nZSkgewotCiAgICAgICAgIC8qCiAgICAgICAgICAqIElmIHRoZSBzYW1wbGUgcmF0ZSBoYXMgY2hhbmdlZCBjbGVhciB0aGUgaGlzdG9yeQogICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeShwSW5zdGFuY2UpOyAgICAgICAgICAgLyogQ2xlYXIgdGhlIGhpc3RvcnkgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeShwSW5zdGFuY2UpOyAvKiBDbGVhciB0aGUgaGlzdG9yeSAqLwogICAgICAgICB9CiAKICAgICAgICAgLyoKQEAgLTM1OCw0NSArMzMxLDQ1IEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFJlc2V0IHRoZSBmaWx0ZXJzIGV4Y2VwdCBpZiB0aGUgYWxnbyBpcyBzd2l0Y2hlZCBvZmYKICAgICAgICAgICovCi0gICAgICAgIGlmKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZFUU5CX0JZUEFTUyl7CisgICAgICAgIGlmIChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWRVFOQl9CWVBBU1MpIHsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBSZXNldCB0aGUgZmlsdGVycyBhcyBhbGwgcGFyYW1ldGVycyBjb3VsZCBoYXZlIGNoYW5nZWQKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTFZFUU5CX1NldEZpbHRlcnMocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyAqLworICAgICAgICAgICAgTFZFUU5CX1NldEZpbHRlcnMocEluc3RhbmNlLCAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsgIC8qIE5ldyBwYXJhbWV0ZXJzICovCiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIGZpbHRlcnMKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTFZFUU5CX1NldENvZWZmaWNpZW50cyhwSW5zdGFuY2UpOyAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIExWRVFOQl9TZXRDb2VmZmljaWVudHMocEluc3RhbmNlKTsgLyogSW5zdGFuY2UgcG9pbnRlciAqLwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1vZGVDaGFuZ2UpIHsKLSAgICAgICAgICAgIGlmKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgPT0gTFZFUU5CX09OKQotICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgPT0gTFZFUU5CX09OKSB7CiAgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwgMS4wZik7CiAgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMC4wZik7Ci0gICAgICAgICAgICAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAxOwotICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMTsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLyogU3RheSBvbiB0aGUgT04gb3BlcmF0aW5nIG1vZGUgdW50aWwgdGhlIHRyYW5zaXRpb24gaXMgZG9uZSAqLwogICAgICAgICAgICAgICAgIC8vIFRoaXMgbWF5IGludHJvZHVjZSBhIHN0YXRlIHJhY2UgY29uZGl0aW9uIGlmIHRoZSBlZmZlY3QgaXMgZW5hYmxlZCBhZ2FpbgogICAgICAgICAgICAgICAgIC8vIHdoaWxlIGluIHRyYW5zaXRpb24uICBUaGlzIGlzIGZpeGVkIGluIHRoZSBtb2RlQ2hhbmdlIGxvZ2ljLgogICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkVRTkJfT047CiAgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwgMC4wZik7CiAgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMS4wZik7Ci0gICAgICAgICAgICAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAxOwotICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMTsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID0gMTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sTFZFUU5CX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsMik7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLExWRVFOQl9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JZUEFTU19NSVhFUl9UQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CWVBBU1NfTUlYRVJfVEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CiAgICAgICAgICAgICBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID0gTFZNX1RSVUU7CiAgICAgICAgIH0KLQogICAgIH0KLSAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZFUU5CX1NVQ0NFU1MpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQwOCwyMyArMzgxLDIyIEBACiAvKiAgdHJhbnNpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fSU5UMzIgTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2sgKHZvaWQqIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcEdlbmVyYWxQdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgQ2FsbGJhY2tQYXJhbSkKLXsKLSAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgPShMVkVRTkJfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZNX0NhbGxiYWNrICAgICAgICAgICAgQ2FsbEJhY2sgID0gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuQ2FsbEJhY2s7CitMVk1fSU5UMzIgTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2sodm9pZCogaEluc3RhbmNlLCB2b2lkKiBwR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IENhbGxiYWNrUGFyYW0pIHsKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWRVFOQl9JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgTFZNX0NhbGxiYWNrIENhbGxCYWNrID0gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuQ2FsbEJhY2s7CiAKLSAgICAodm9pZCkgcEdlbmVyYWxQdXJwb3NlOworICAgICh2b2lkKXBHZW5lcmFsUHVycG9zZTsKIAotICAgICAvKgotICAgICAgKiBTZW5kIGFuIEFMR09GRiBldmVudCBpZiB0aGUgT04tPk9GRiBzd2l0Y2ggdHJhbnNpdGlvbiBpcyBmaW5pc2hlZAotICAgICAgKi8KLSAgICBpZigoTFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkgPT0gMCkgJiYKLSAgICAgICAoQ2FsbGJhY2tQYXJhbSA9PSAwKSl7CisgICAgLyoKKyAgICAgKiBTZW5kIGFuIEFMR09GRiBldmVudCBpZiB0aGUgT04tPk9GRiBzd2l0Y2ggdHJhbnNpdGlvbiBpcyBmaW5pc2hlZAorICAgICAqLworICAgIGlmICgoTFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkgPT0gMCkgJiYKKyAgICAgICAgKENhbGxiYWNrUGFyYW0gPT0gMCkpIHsKICAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWRVFOQl9CWVBBU1M7Ci0gICAgICAgIGlmIChDYWxsQmFjayAhPSBMVk1fTlVMTCl7Ci0gICAgICAgICAgICBDYWxsQmFjayhwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UsIExWTV9OVUxMLCBBTEdPUklUSE1fRVFOQl9JRHxMVkVRTkJfRVZFTlRfQUxHT0ZGKTsKKyAgICAgICAgaWYgKENhbGxCYWNrICE9IExWTV9OVUxMKSB7CisgICAgICAgICAgICBDYWxsQmFjayhwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UsIExWTV9OVUxMLAorICAgICAgICAgICAgICAgICAgICAgQUxHT1JJVEhNX0VRTkJfSUQgfCBMVkVRTkJfRVZFTlRfQUxHT0ZGKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Jbml0LmNwcAppbmRleCAyNzFhOTE0Li4zNDczMjYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Jbml0LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Jbml0LmNwcApAQCAtMjEsMzAyICsyMSwxMjcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlICJMVkVRTkIuaCIKICNpbmNsdWRlICJMVkVRTkJfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkluc3RBbGxvYy5oIgogI2luY2x1ZGUgPHN0cmluZy5oPiAvKiBGb3IgbWVtc2V0ICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KLS8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLwotLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLwotLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KLS8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkVRTkJfU1VDQ0VTUyAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgIFdoZW4gYW55IG9mIHBNZW1vcnlUYWJsZSBhbmQgcENhcGFiaWxpdGllcyBpcyBOVUxMIGFkZHJlc3MgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZFUU5CX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9NZW1vcnkoTFZFUU5CX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9NZW1UYWJfdCAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgICAgKnBDYXBhYmlsaXRpZXMpCi17Ci0KLSAgICBJTlNUX0FMTE9DICAgICAgICAgIEFsbG9jTWVtOwotICAgIExWRVFOQl9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKLQotICAgIGlmKChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpfHwgKHBDYXBhYmlsaXRpZXMgPT0gTFZNX05VTEwpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEZpbGwgaW4gdGhlIG1lbW9yeSB0YWJsZQotICAgICAqLwotICAgIGlmIChoSW5zdGFuY2UgPT0gTFZNX05VTEwpCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBJbnN0YW5jZSBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZFUU5CX0luc3RhbmNlX3QpKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fSU5TVEFOQ0VdLkFsaWdubWVudCAgICA9IExWRVFOQl9JTlNUQU5DRV9BTElHTjsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRV0uVHlwZSAgICAgICAgID0gTFZFUU5CX1BFUlNJU1RFTlQ7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fSU5TVEFOQ0VdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFBlcnNpc3RhbnQgZGF0YSBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpKTsKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpOwotICAgICAgICAvKiBFcXVhbGlzZXIgQmlxdWFkIFRhcHMgKi8KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSkpOwotICAgICAgICAvKiBGaWx0ZXIgZGVmaW5pdGlvbnMgKi8KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpKSk7Ci0gICAgICAgIC8qIEJpcXVhZCB0eXBlcyAqLwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoTFZFUU5CX0JpcXVhZFR5cGVfZW4pKSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLkFsaWdubWVudCAgICA9IExWRVFOQl9EQVRBX0FMSUdOOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uVHlwZSAgICAgICAgID0gTFZFUU5CX1BFUlNJU1RFTlRfREFUQTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFBlcnNpc3RhbnQgY29lZmZpY2llbnQgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpKTsKLSAgICAgICAgLyogRXF1YWxpc2VyIEJpcXVhZCBJbnN0YW5jZSAqLwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5BbGlnbm1lbnQgICAgPSBMVkVRTkJfQ09FRl9BTElHTjsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlR5cGUgICAgICAgICA9IExWRVFOQl9QRVJTSVNURU5UX0NPRUY7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTY3JhdGNoIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9TQ1JBVENIQlVGRkVSUyAqIHNpemVvZihMVk1fRkxPQVQpICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5TaXplICAgICAgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW0pOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLkFsaWdubWVudCAgICAgICAgID0gTFZFUU5CX1NDUkFUQ0hfQUxJR047Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0uVHlwZSAgICAgICAgICAgICAgPSBMVkVRTkJfU0NSQVRDSDsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgICAgICA9IExWTV9OVUxMOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBSZWFkIGJhY2sgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KLSAgICAgICAgKnBNZW1vcnlUYWJsZSA9IHBJbnN0YW5jZS0+TWVtb3J5VGFibGU7Ci0gICAgfQotCi0gICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgTi1CYW5kIGVxdWFsaXNlciBtb2R1bGUgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gYWxnb3JpdGhtIGluc3RhbmNlIGJ5IGNhbGxpbmcgd2l0aCAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2Ugc2V0IHRvIE5VTEwuIEluIHRoaXMgY2FzZSB0aGUgYWxnb3JpdGhtIHJldHVybnMgdGhlIG5ldyBpbnN0YW5jZSAgICAgICAgICAqLwotLyogIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGEgZnVsbCByZS1pbml0aWFsaXNhdGlvbiBvZiB0aGUgYWxnb3JpdGhtICAgICAgICAqLwotLyogIGJ5IGNhbGxpbmcgd2l0aCBoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUuIEluIHRoaXMgY2FzZSB0aGUgbWVtb3J5IHRhYmxlICAgICAgICAgICovCi0vKiAgc2hvdWxkIGJlIGNvcnJlY3QgZm9yIHRoZSBpbnN0YW5jZSwgdGhpcyBjYW4gYmUgZW5zdXJlZCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiAgICAgKi8KLS8qICBEQkVfTWVtb3J5IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENyZWF0ZSBhbmQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBOLUJhbmQgZXF1YWxpc2VyIG1vZHVsZS4gICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIFBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgKi8KKy8qICBwU2NyYXRjaCAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGJ1bmRsZSBzY3JhdGNoIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBMVkVRTkJfU1VDQ0VTUyAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgICAgV2hlbiBwQ2FwYWJpbGl0aWVzIG9yIHBNZW1vcnlUYWJsZWlzIG9yIHBoSW5zdGFuY2UgYXJlIE5VTEwgKi8KLS8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICAgIE9uZSBvciBtb3JlIG9mIHRoZSBtZW1vcnkgcmVnaW9ucyBoYXMgYSBOVUxMIGJhc2UgYWRkcmVzcyAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciBmb3IgYSBtZW1vcnkgcmVnaW9uIHdpdGggYSBub24temVybyBzaXplLiAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICBPbmUgb3IgbW9yZSBtZW1vcnkgaGFzIGEgTlVMTCBwb2ludGVyIC0gbWFsbG9jIGZhaWx1cmUgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiAgVGhlIGluc3RhbmNlIGhhbmRsZSBpcyB0aGUgcG9pbnRlciB0byB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBtZW1vcnkgICAgICAqLwotLyogICAgICByZWdpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMi4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZFUU5CX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfSW5pdChMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgKnBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9NZW1UYWJfdCAgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgKnBDYXBhYmlsaXRpZXMpCi17CitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Jbml0KExWRVFOQl9IYW5kbGVfdCogcGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190KiBwQ2FwYWJpbGl0aWVzLCB2b2lkKiBwU2NyYXRjaCkgeworICAgIExWRVFOQl9JbnN0YW5jZV90KiBwSW5zdGFuY2U7CiAKLSAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2U7Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICBNZW1TaXplOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgQWxsb2NNZW07Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICBpOworICAgICpwaEluc3RhbmNlID0gbmV3IExWRVFOQl9JbnN0YW5jZV90e307CisgICAgcEluc3RhbmNlID0gKExWRVFOQl9JbnN0YW5jZV90KikqcGhJbnN0YW5jZTsKIAotICAgIC8qCi0gICAgICogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMKLSAgICAgKi8KLSAgICBpZigocGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBNZW1vcnlUYWJsZSA9PSBMVk1fTlVMTCkgfHwgKHBDYXBhYmlsaXRpZXMgPT0gTFZNX05VTEwpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENoZWNrIHRoZSBtZW1vcnkgdGFibGUgZm9yIE5VTEwgcG9pbnRlcnMKLSAgICAgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgTFZFUU5CX05SX01FTU9SWV9SRUdJT05TOyBpKyspCi0gICAgewotICAgICAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25baV0uU2l6ZSE9MCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLnBCYXNlQWRkcmVzcz09TFZNX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKExWRVFOQl9OVUxMQUREUkVTUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNldCB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkCi0gICAgICovCi0KLSAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MpOwotCi0gICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgKnBoSW5zdGFuY2UgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgc2l6ZW9mKExWRVFOQl9JbnN0YW5jZV90KSk7Ci0gICAgfQotICAgIHBJbnN0YW5jZSA9KExWRVFOQl9JbnN0YW5jZV90ICAqKSpwaEluc3RhbmNlOwotCi0gICAgLyoKLSAgICAgKiBTYXZlIHRoZSBtZW1vcnkgdGFibGUgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZQotICAgICAqLwogICAgIHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzID0gKnBDYXBhYmlsaXRpZXM7Ci0KLSAgICAvKgotICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlIGFuZAotICAgICAqIHNldCB0aGUgc3RydWN0dXJlIHBvaW50ZXJzCi0gICAgICovCi0gICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZSAgICAgICA9ICpwTWVtb3J5VGFibGU7Ci0KLSAgICAvKgotICAgICAqIEFsbG9jYXRlIGNvZWZmaWNpZW50IG1lbW9yeQotICAgICAqLwotICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzKTsKKyAgICBwSW5zdGFuY2UtPnBTY3JhdGNoID0gcFNjcmF0Y2g7CiAKICAgICAvKiBFcXVhbGlzZXIgQmlxdWFkIEluc3RhbmNlICovCi0gICAgcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZV9GbG9hdCA9IChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAqKQotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgcENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSk7Ci0KLSAgICAvKgotICAgICAqIEFsbG9jYXRlIGRhdGEgbWVtb3J5Ci0gICAgICovCi0gICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MpOwotCi0gICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpOwotICAgIHBJbnN0YW5jZS0+cEVRTkJfVGFwc19GbG9hdCA9IChCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtU2l6ZSk7Ci0gICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmFuZERlZl90KSk7Ci0gICAgcEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zICA9IChMVkVRTkJfQmFuZERlZl90ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1TaXplKTsKKyAgICBMVk1fVUlOVDMyIE1lbVNpemUgPSBwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZigqKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9ucykpOworICAgIHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9ucyA9IChMVkVRTkJfQmFuZERlZl90KiljYWxsb2MoMSwgTWVtU2l6ZSk7CisgICAgaWYgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9ucyA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm4gTFZFUU5CX05VTExBRERSRVNTOworICAgIH0KICAgICAvLyBjbGVhciBhbGwgdGhlIGJhbmRzLCBzZXR0aW5nIHRoZWlyIGdhaW4gdG8gMCwgb3RoZXJ3aXNlIHdoZW4gYXBwbHlpbmcgbmV3IHBhcmFtcywKICAgICAvLyBpdCB3aWxsIGNvbXBhcmUgYWdhaW5zdCB1bmluaXRpYWxpemVkIHZhbHVlcwogICAgIG1lbXNldChwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnMsIDAsIE1lbVNpemUpOwotICAgIE1lbVNpemUgPSAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoTFZFUU5CX0JpcXVhZFR5cGVfZW4pKTsKLSAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlID0gKExWRVFOQl9CaXF1YWRUeXBlX2VuICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtU2l6ZSk7CiAKLSAgICAvKgotICAgICAqIEludGVybmFsbHkgbWFwLCBzdHJ1Y3R1cmUgYW5kIGFsbGlnbiBzY3JhdGNoIG1lbW9yeQotICAgICAqLwotICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzcyk7CisgICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZigqKHBJbnN0YW5jZS0+cEJpcXVhZFR5cGUpKSk7CisgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZSA9IChMVkVRTkJfQmlxdWFkVHlwZV9lbiopY2FsbG9jKDEsIE1lbVNpemUpOworICAgIGlmIChwSW5zdGFuY2UtPnBCaXF1YWRUeXBlID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7CisgICAgfQogCi0gICAgcEluc3RhbmNlLT5wRmFzdFRlbXBvcmFyeSA9IChMVk1fRkxPQVQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOworICAgIHBJbnN0YW5jZS0+cEZhc3RUZW1wb3JhcnkgPSAoTFZNX0ZMT0FUKilwU2NyYXRjaDsKIAogICAgIC8qCiAgICAgICogVXBkYXRlIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzCiAgICAgICovCi0gICAgcEluc3RhbmNlLT5QYXJhbXMuTkJhbmRzICAgICAgICAgID0gMDsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICAgPSBMVkVRTkJfQllQQVNTOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLk5CYW5kcyA9IDA7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWRVFOQl9CWVBBU1M7CiAgICAgcEluc3RhbmNlLT5QYXJhbXMucEJhbmREZWZpbml0aW9uID0gTFZNX05VTEw7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAgICAgID0gTFZFUU5CX0ZTXzgwMDA7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ICAgID0gTFZFUU5CX1NURVJFTzsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlID0gTFZFUU5CX0ZTXzgwMDA7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZFUU5CX1NURVJFTzsKIAogICAgIC8qCiAgICAgICogSW5pdGlhbGlzZSB0aGUgZmlsdGVycwogICAgICAqLwotICAgIExWRVFOQl9TZXRGaWx0ZXJzKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGZpbHRlciB0eXBlcyAqLworICAgIExWRVFOQl9TZXRGaWx0ZXJzKHBJbnN0YW5jZSwgLyogU2V0IHRoZSBmaWx0ZXIgdHlwZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QYXJhbXMpOwogCi0gICAgTFZFUU5CX1NldENvZWZmaWNpZW50cyhwSW5zdGFuY2UpOyAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotCi0gICAgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeShwSW5zdGFuY2UpOyAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBmaWx0ZXIgaGlzdG9yeSAqLwotCiAgICAgLyoKICAgICAgKiBJbml0aWFsaXNlIHRoZSBieXBhc3MgdmFyaWFibGVzCiAgICAgICovCi0gICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAwOwotICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKLSAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSAgICA9ICh2b2lkKilwSW5zdGFuY2U7Ci0gICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVkVRTkJfQnlwYXNzTWl4ZXJDYWxsQmFjazsKKyAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMDsKKyAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gPSAwOworICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlID0gKHZvaWQqKXBJbnN0YW5jZTsKKyAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayA9IExWRVFOQl9CeXBhc3NNaXhlckNhbGxCYWNrOwogCi0gICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMCwwKTsKLSAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLDAsTFZNX0ZTXzgwMDAsMik7CisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sIDAsIDApOworICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sIDAsIExWTV9GU184MDAwLCAyKTsKIAotICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKLSAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7Ci0gICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSBMVk1fTlVMTDsKLSAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9OVUxMOworICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgPSAxOworICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSA9IDA7CisgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKKyAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayA9IExWTV9OVUxMOwogICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLCAwLCAxLjBmKTsKICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLCAwLCBMVk1fRlNfODAwMCwgMik7CiAKLSAgICBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uICAgICAgPSBMVk1fRkFMU0U7CisgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9GQUxTRTsKIAotICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVkVRTkJfU1VDQ0VTUyk7CiB9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9EZUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnJlZSB0aGUgbWVtb3JpZXMgY3JlYXRlZCBkdXJpbmcgTFZFUU5CX0luaXQgaW5jbHVkaW5nIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIFBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCit2b2lkIExWRVFOQl9EZUluaXQoTFZFUU5CX0hhbmRsZV90KiBwaEluc3RhbmNlKSB7CisgICAgTFZFUU5CX0luc3RhbmNlX3QqIHBJbnN0YW5jZTsKKyAgICBpZiAocGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCopKnBoSW5zdGFuY2U7CisKKyAgICBpZiAocEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zKTsKKyAgICAgICAgcEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zID0gTFZNX05VTEw7CisgICAgfQorICAgIGlmIChwSW5zdGFuY2UtPnBCaXF1YWRUeXBlICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocEluc3RhbmNlLT5wQmlxdWFkVHlwZSk7CisgICAgICAgIHBJbnN0YW5jZS0+cEJpcXVhZFR5cGUgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgZGVsZXRlIHBJbnN0YW5jZTsKKyAgICAqcGhJbnN0YW5jZSA9IExWTV9OVUxMOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCmluZGV4IDQwZmFjZmIuLjIyMjVmZWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmgKQEAgLTI0LDcgKzI0LDggQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpbmNsdWRlICJMVkVRTkIuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FsbGluZyBvciBBcHBsaWNhdGlvbiBsYXllciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL0JpcXVhZEZpbHRlci5oPgorI2luY2x1ZGUgIkxWRVFOQi5oIiAvKiBDYWxsaW5nIG9yIEFwcGxpY2F0aW9uIGxheWVyIGRlZmluaXRpb25zICovCiAjaW5jbHVkZSAiQklRVUFELmgiCiAjaW5jbHVkZSAiTFZDX01peGVyLmgiCiAKQEAgLTM1LDIxICszNiw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogR2VuZXJhbCAqLwotI2RlZmluZSBMVkVRTkJfSU5WQUxJRCAgICAgICAgICAgICAgMHhGRkZGICAgICAgICAgICAgICAvKiBJbnZhbGlkIGluaXQgcGFyYW1ldGVyICovCi0KLS8qIE1lbW9yeSAqLwotI2RlZmluZSBMVkVRTkJfSU5TVEFOQ0VfQUxJR04gICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBpbnN0YW5jZSBzdHJ1Y3R1cmVzICovCi0jZGVmaW5lIExWRVFOQl9EQVRBX0FMSUdOICAgICAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIHN0cnVjdHVyZXMgKi8KLSNkZWZpbmUgTFZFUU5CX0NPRUZfQUxJR04gICAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyB3b3JkcyAqLwotI2lmZGVmIFNVUFBPUlRfTUMKLS8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KLSNkZWZpbmUgTFZFUU5CX1NDUkFUQ0hCVUZGRVJTICAgICAgIChMVk1fTUFYX0NIQU5ORUxTICogMikKLSNlbHNlCi0jZGVmaW5lIExWRVFOQl9TQ1JBVENIQlVGRkVSUyAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KLSNlbmRpZgotI2RlZmluZSBMVkVRTkJfU0NSQVRDSF9BTElHTiAgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBsb25nIGRhdGEgKi8KLQotI2RlZmluZSBMVkVRTkJfQllQQVNTX01JWEVSX1RDICAgICAgMTAwICAgICAgICAgICAgICAgICAvKiBCeXBhc3MgTWl4ZXIgVEMgKi8KKyNkZWZpbmUgTFZFUU5CX0lOVkFMSUQgMHhGRkZGICAgICAgLyogSW52YWxpZCBpbml0IHBhcmFtZXRlciAqLworI2RlZmluZSBMVkVRTkJfQllQQVNTX01JWEVSX1RDIDEwMCAvKiBCeXBhc3MgTWl4ZXIgVEMgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU4LDEzICs0NiwxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEZpbHRlciBiaXF1YWQgdHlwZXMgKi8KLXR5cGVkZWYgZW51bQotewordHlwZWRlZiBlbnVtIHsKICAgICBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uX0Zsb2F0ID0gLTEsCiAgICAgTFZFUU5CX1NpbmdsZVByZWNpc2lvbiA9IDAsCiAgICAgTFZFUU5CX0RvdWJsZVByZWNpc2lvbiA9IDEsCi0gICAgTFZFUU5CX091dE9mUmFuZ2UgICAgICA9IDIsCi0gICAgTFZFUU5CX0JJUVVBRFRZUEVfTUFYICA9IExWTV9NQVhJTlRfMzIKKyAgICBMVkVRTkJfT3V0T2ZSYW5nZSA9IDIsCisgICAgTFZFUU5CX0JJUVVBRFRZUEVfTUFYID0gTFZNX01BWElOVF8zMgogfSBMVkVRTkJfQmlxdWFkVHlwZV9lbjsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC03NCwyOCArNjEsMjggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBJbnN0YW5jZSBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogUHVibGljIHBhcmFtZXRlcnMgKi8KLSAgICBMVkVRTkJfTWVtVGFiX3QgICAgICAgICAgICAgICAgIE1lbW9yeVRhYmxlOyAgICAgICAgLyogSW5zdGFuY2UgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KLSAgICBMVkVRTkJfUGFyYW1zX3QgICAgICAgICAgICAgICAgIFBhcmFtczsgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLwotICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAgICAgICAgQ2FwYWJpbGl0aWVzOyAgICAgICAvKiBJbnN0YW5jZSBjYXBhYmlsaXRpZXMgKi8KKyAgICB2b2lkKiBwU2NyYXRjaDsgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIGJ1bmRsZSBzY3JhdGNoIGJ1ZmZlciAqLworICAgIExWRVFOQl9QYXJhbXNfdCBQYXJhbXM7ICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgQ2FwYWJpbGl0aWVzOyAvKiBJbnN0YW5jZSBjYXBhYmlsaXRpZXMgKi8KIAogICAgIC8qIEFsaWduZWQgbWVtb3J5IHBvaW50ZXJzICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICpwRmFzdFRlbXBvcmFyeTsgICAgICAgIC8qIEZhc3QgdGVtcG9yYXJ5IGRhdGEgYmFzZSBhZGRyZXNzICovCisgICAgTFZNX0ZMT0FUKiBwRmFzdFRlbXBvcmFyeTsgLyogRmFzdCB0ZW1wb3JhcnkgZGF0YSBiYXNlIGFkZHJlc3MgKi8KIAotICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBFUU5CX1RhcHNfRmxvYXQ7ICAgICAgICAvKiBFcXVhbGlzZXIgVGFwcyAqLwotICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0OyAvKiBTdGF0ZSBmb3IgZWFjaCBmaWx0ZXIgYmFuZCAqLworICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpCaXF1YWRGaWx0ZXI8TFZNX0ZMT0FUPj4KKyAgICAgICAgICAgIGVxQmlxdWFkOyAgICAgICAgICAgIC8qIEJpcXVhZCBmaWx0ZXIgaW5zdGFuY2VzICovCisgICAgc3RkOjp2ZWN0b3I8TFZNX0ZMT0FUPiBnYWluOyAvKiBHYWluIHZhbHVlcyBmb3IgYWxsIGJhbmRzKi8KIAogICAgIC8qIEZpbHRlciBkZWZpbml0aW9ucyBhbmQgY2FsbCBiYWNrICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgICAgICBOQmFuZHM7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyAqLwotICAgIExWRVFOQl9CYW5kRGVmX3QgICAgICAgICAgICAgICAgKnBCYW5kRGVmaW5pdGlvbnM7ICAvKiBGaWx0ZXIgYmFuZCBkZWZpbml0aW9ucyAqLwotICAgIExWRVFOQl9CaXF1YWRUeXBlX2VuICAgICAgICAgICAgKnBCaXF1YWRUeXBlOyAgICAgICAvKiBGaWx0ZXIgYmlxdWFkIHR5cGVzICovCisgICAgTFZNX1VJTlQxNiBOQmFuZHM7ICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJhbmRzICovCisgICAgTFZFUU5CX0JhbmREZWZfdCogcEJhbmREZWZpbml0aW9uczsgLyogRmlsdGVyIGJhbmQgZGVmaW5pdGlvbnMgKi8KKyAgICBMVkVRTkJfQmlxdWFkVHlwZV9lbiogcEJpcXVhZFR5cGU7ICAvKiBGaWx0ZXIgYmlxdWFkIHR5cGVzICovCiAKICAgICAvKiBCeXBhc3MgdmFyaWFibGUgKi8KLSAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QgICAgIEJ5cGFzc01peGVyOworICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCBCeXBhc3NNaXhlcjsKIAotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIGJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uOyAvKiBPcGVyYXRpbmcgbW9kZSB0cmFuc2l0aW9uIGZsYWcgKi8KKyAgICBMVk1fSU5UMTYgYkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb247IC8qIE9wZXJhdGluZyBtb2RlIHRyYW5zaXRpb24gZmxhZyAqLwogCiB9IExWRVFOQl9JbnN0YW5jZV90OwogCkBAIC0xMDUsMTcgKzkyLDE1IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkICAgIExWRVFOQl9TZXRGaWx0ZXJzKExWRVFOQl9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX1BhcmFtc190ICAgICAqcFBhcmFtcyk7Cit2b2lkIExWRVFOQl9TZXRGaWx0ZXJzKExWRVFOQl9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWRVFOQl9QYXJhbXNfdCogcFBhcmFtcyk7CiAKLXZvaWQgICAgTFZFUU5CX1NldENvZWZmaWNpZW50cyhMVkVRTkJfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlKTsKK3ZvaWQgTFZFUU5CX1NldENvZWZmaWNpZW50cyhMVkVRTkJfSW5zdGFuY2VfdCogcEluc3RhbmNlKTsKIAotdm9pZCAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KExWRVFOQl9JbnN0YW5jZV90ICpwSW5zdGFuY2UpOwotTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKExWTV9VSU5UMTYgICAgICAgIEZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CYW5kRGVmX3QgICpwRmlsdGVyRGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19GTE9BVF9Db2Vmc190ICAgICpwQ29lZmZpY2llbnRzKTsKK3ZvaWQgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeShMVkVRTkJfSW5zdGFuY2VfdCogcEluc3RhbmNlKTsKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1NpbmdsZVByZWNDb2VmcyhMVk1fVUlOVDE2IEZzLCBMVkVRTkJfQmFuZERlZl90KiBwRmlsdGVyRGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19GTE9BVF9Db2Vmc190KiBwQ29lZmZpY2llbnRzKTsKIAotTFZNX0lOVDMyIExWRVFOQl9CeXBhc3NNaXhlckNhbGxCYWNrICh2b2lkKiBoSW5zdGFuY2UsIHZvaWQgKnBHZW5lcmFsUHVycG9zZSwgTFZNX0lOVDE2IENhbGxiYWNrUGFyYW0pOworTFZNX0lOVDMyIExWRVFOQl9CeXBhc3NNaXhlckNhbGxCYWNrKHZvaWQqIGhJbnN0YW5jZSwgdm9pZCogcEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBDYWxsYmFja1BhcmFtKTsKIAogI2VuZGlmIC8qIF9fTFZFUU5CX1BSSVZBVEVfSF9fICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jcHAKaW5kZXggNjVlZmY1My4uYjE3N2RkNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jcHAKQEAgLTM0LDcgKzM0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgU0hJRlQgICAgICAgMTMKKyNkZWZpbmUgU0hJRlQgMTMKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU4LDg5ICs1OCw2MCBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfUHJvY2VzcyhMVkVRTkJfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9VSU5UMTYgICAgICBOckZyYW1lcykKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlZCB0byB1c2Ugc2FtcGxlcyA9IGZyYW1lcyAqIGNoYW5uZWxzLgotICAgIExWRVFOQl9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgLy8gTW9ubyBwYXNzZWQgaW4gYXMgc3RlcmVvCi0gICAgY29uc3QgTFZNX0lOVDMyIE5yQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzID09IDEKLSAgICAgICAgPyAyIDogcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKLSNlbHNlCi0gICAgY29uc3QgTFZNX0lOVDMyIE5yQ2hhbm5lbHMgPSAyOyAvLyBGQ0NfMgotI2VuZGlmCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Qcm9jZXNzKAorICAgICAgICBMVkVRTkJfSGFuZGxlX3QgaEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHBJbkRhdGEsIExWTV9GTE9BVCogcE91dERhdGEsCisgICAgICAgIGNvbnN0IExWTV9VSU5UMTYgTnJGcmFtZXMpIHsgIC8vIHVwZGF0ZWQgdG8gdXNlIHNhbXBsZXMgPSBmcmFtZXMgKiBjaGFubmVscy4KKyAgICBMVkVRTkJfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWRVFOQl9JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgY29uc3QgTFZNX0lOVDMyIE5yQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOwogICAgIGNvbnN0IExWTV9JTlQzMiBOclNhbXBsZXMgPSBOckNoYW5uZWxzICogTnJGcmFtZXM7CiAKLSAgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KLSAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKLSAgICB7CisgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KKyAgICBpZiAoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBJbkRhdGEgPT0gTFZNX05VTEwpIHx8IChwT3V0RGF0YSA9PSBMVk1fTlVMTCkpIHsKICAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKICAgICB9CiAKICAgICAvKiBDaGVjayBpZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhIGJ1ZmZlcnMgYXJlIDMyLWJpdCBhbGlnbmVkICovCi0gICAgaWYgKCgoKHVpbnRwdHJfdClwSW5EYXRhICUgNCkgIT0gMCkgfHwgKCgodWludHB0cl90KXBPdXREYXRhICUgNCkgIT0gMCkpCi0gICAgeworICAgIGlmICgoKCh1aW50cHRyX3QpcEluRGF0YSAlIDQpICE9IDApIHx8ICgoKHVpbnRwdHJfdClwT3V0RGF0YSAlIDQpICE9IDApKSB7CiAgICAgICAgIHJldHVybiBMVkVRTkJfQUxJR05NRU5URVJST1I7CiAgICAgfQogCi0gICAgTFZNX0ZMT0FUICogY29uc3QgcFNjcmF0Y2ggPSAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5wRmFzdFRlbXBvcmFyeTsKKyAgICBMVk1fRkxPQVQqIGNvbnN0IHBTY3JhdGNoID0gKExWTV9GTE9BVCopcEluc3RhbmNlLT5wRmFzdFRlbXBvcmFyeTsKIAogICAgIC8qCi0gICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIGZyYW1lcyBpcyBub3QgdG9vIGxhcmdlCi0gICAgKi8KLSAgICBpZiAoTnJGcmFtZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCi0gICAgeworICAgICAqIENoZWNrIHRoZSBudW1iZXIgb2YgZnJhbWVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICAgKi8KKyAgICBpZiAoTnJGcmFtZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpIHsKICAgICAgICAgcmV0dXJuIExWRVFOQl9UT09NQU5ZU0FNUExFUzsKICAgICB9CiAKLSAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkVRTkJfT04pCi0gICAgeworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikgewogICAgICAgICAvKgogICAgICAgICAgKiBDb3B5IGlucHV0IGRhdGEgaW4gdG8gc2NyYXRjaCBidWZmZXIKICAgICAgICAgICovCi0gICAgICAgIENvcHlfRmxvYXQocEluRGF0YSwgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7CiAKICAgICAgICAgLyoKICAgICAgICAgICogRm9yIGVhY2ggc2VjdGlvbiBleGVjdGUgdGhlIGZpbHRlciB1bmxlc3MgdGhlIGdhaW4gaXMgMGRCCiAgICAgICAgICAqLwotICAgICAgICBpZiAocEluc3RhbmNlLT5OQmFuZHMgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChMVk1fVUlOVDE2IGkgPSAwOyBpIDwgcEluc3RhbmNlLT5OQmFuZHM7IGkrKykKLSAgICAgICAgICAgIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+TkJhbmRzICE9IDApIHsKKyAgICAgICAgICAgIGZvciAoTFZNX1VJTlQxNiBpID0gMDsgaSA8IHBJbnN0YW5jZS0+TkJhbmRzOyBpKyspIHsKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIENoZWNrIGlmIGJhbmQgaXMgbm9uLXplcm8gZEIgZ2FpbgogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnNbaV0uR2FpbiAhPSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBiaXF1YWQgaW5zdGFuY2UKLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICpwQmlxdWFkID0gJnBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXRbaV07Ci0KKyAgICAgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldLkdhaW4gIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgKiBTZWxlY3Qgc2luZ2xlIG9yIGRvdWJsZSBwcmVjaXNpb24gYXMgcmVxdWlyZWQKICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uX0Zsb2F0OgotICAgICAgICAgICAgICAgICAgICAgICAgewotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19NY19EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShwQmlxdWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEocEJpcXVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzKTsKLSNlbmRpZgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcFRlbXAgPSBwU2NyYXRjaCArIE5yU2FtcGxlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPmVxQmlxdWFkW2ldLnByb2Nlc3MocFRlbXAsIHBTY3JhdGNoLCBOckZyYW1lcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byBnYWluID0gcEluc3RhbmNlLT5nYWluW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBOclNhbXBsZXM7ICsraikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaFtqXSArPSBwVGVtcFtqXSAqIGdhaW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTE1MCw0NCArMTIxLDI3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZihwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID09IExWTV9UUlVFKXsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7Ci0jZWxzZQotICAgICAgICAgICAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsKLSNlbmRpZgorICAgICAgICBpZiAocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSkgeworICAgICAgICAgICAgTFZDX01peFNvZnRfMk1jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIsIHBTY3JhdGNoLCBwSW5EYXRhLCBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CiAgICAgICAgICAgICAvLyBkdXBsaWNhdGUgd2l0aCBlbHNlIGNsYXVzZShzKQotICAgICAgICAgICAgQ29weV9GbG9hdChwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7ICAgICAgICAgICAgLyogQWxsIGNoYW5uZWwgc2FtcGxlcyAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2V7CisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTY3JhdGNoLCAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOyAvKiBBbGwgY2hhbm5lbCBzYW1wbGVzICovCisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTY3JhdGNoLCAgICAgICAgICAgICAgLyogU291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOyAvKiBBbGwgY2hhbm5lbCBzYW1wbGVzICovCiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgICAvKgogICAgICAgICAgKiBNb2RlIGlzIE9GRiBzbyBjb3B5IHRoZSBkYXRhIGlmIG5lY2Vzc2FyeQogICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvcHlfRmxvYXQocEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOyAgICAgICAgICAgIC8qIEFsbCBjaGFubmVsIHNhbXBsZXMgKi8KKyAgICAgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpIHsKKyAgICAgICAgICAgIENvcHlfRmxvYXQocEluRGF0YSwgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7IC8qIEFsbCBjaGFubmVsIHNhbXBsZXMgKi8KICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gTFZFUU5CX1NVQ0NFU1M7Ci0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuY3BwCmluZGV4IDA2MjgxMTQuLmQ3OWQ3YzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmNwcApAQCAtMzUsMjAgKzM1LDkgQEAKICAqIFNhbXBsZSByYXRlIHRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIGFjdHVhbAogICogZnJlcXVlbmN5CiAgKi8KLWNvbnN0IExWTV9VSU5UMzIgICAgTFZFUU5CX1NhbXBsZVJhdGVUYWJbXSA9IHs4MDAwLCAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwNTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc2NDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjAwMAotfTsKK2NvbnN0IExWTV9VSU5UMzIgTFZFUU5CX1NhbXBsZVJhdGVUYWJbXSA9IHs4MDAwLCAvKiA4a1MvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsICAzMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwgNDgwMDAsIDg4MjAwLCA5NjAwMCwgMTc2NDAwLCAxOTIwMDB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU5LDc0ICs0OCwzNCBAQAogLyoKICAqIFRhYmxlIGZvciAyICogUGkgLyBGcwogICovCi1jb25zdCBMVk1fRkxPQVQgICAgIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtdID0ge0xWRVFOQl8yUGlPbl84MDAwLCAgICAgIC8qIDhrUy9zICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8xMTAyNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzEyMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMTYwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8yMjA1MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzI0MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMzIwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl80NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ4MDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWRVFOQl8yUGlPbl84ODIwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVkVRTkJfMlBpT25fOTYwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZFUU5CXzJQaU9uXzE3NjQwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVkVRTkJfMlBpT25fMTkyMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Citjb25zdCBMVk1fRkxPQVQgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW10gPSB7CisgICAgICAgIExWRVFOQl8yUGlPbl84MDAwLCAvKiA4a1MvcyAqLworICAgICAgICBMVkVRTkJfMlBpT25fMTEwMjUsIExWRVFOQl8yUGlPbl8xMjAwMCwgTFZFUU5CXzJQaU9uXzE2MDAwLCAgTFZFUU5CXzJQaU9uXzIyMDUwLAorICAgICAgICBMVkVRTkJfMlBpT25fMjQwMDAsIExWRVFOQl8yUGlPbl8zMjAwMCwgTFZFUU5CXzJQaU9uXzQ0MTAwLCAgTFZFUU5CXzJQaU9uXzQ4MDAwLAorICAgICAgICBMVkVRTkJfMlBpT25fODgyMDAsIExWRVFOQl8yUGlPbl85NjAwMCwgTFZFUU5CXzJQaU9uXzE3NjQwMCwgTFZFUU5CXzJQaU9uXzE5MjAwMH07CiAKIC8qCiAgKiBHYWluIHRhYmxlCiAgKi8KLWNvbnN0IExWTV9GTE9BVCAgICAgTFZFUU5CX0dhaW5UYWJsZVtdID0ge0xWRVFOQl9HYWluX05lZzE1X2RCLCAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTRfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxM19kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzEyX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTFfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxMF9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzlfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc4X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnN19kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzZfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc1X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnNF9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzNfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcyX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMV9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzBfZEIsICAgICAgICAgICAgLyogMGRCIGdhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzFfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8yX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fM19kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzRfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl81X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fNl9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzdfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl84X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fOV9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzEwX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTFfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xMl9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzEzX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTRfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xNV9kQn07ICAgICAgICAgIC8qICsxNWRCIGdhaW4gKi8KK2NvbnN0IExWTV9GTE9BVCBMVkVRTkJfR2FpblRhYmxlW10gPSB7CisgICAgICAgIExWRVFOQl9HYWluX05lZzE1X2RCLCAvKiAtMTVkQiBnYWluICovCisgICAgICAgIExWRVFOQl9HYWluX05lZzE0X2RCLCBMVkVRTkJfR2Fpbl9OZWcxM19kQiwgTFZFUU5CX0dhaW5fTmVnMTJfZEIsIExWRVFOQl9HYWluX05lZzExX2RCLAorICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxMF9kQiwgTFZFUU5CX0dhaW5fTmVnOV9kQiwgIExWRVFOQl9HYWluX05lZzhfZEIsICBMVkVRTkJfR2Fpbl9OZWc3X2RCLAorICAgICAgICBMVkVRTkJfR2Fpbl9OZWc2X2RCLCAgTFZFUU5CX0dhaW5fTmVnNV9kQiwgIExWRVFOQl9HYWluX05lZzRfZEIsICBMVkVRTkJfR2Fpbl9OZWczX2RCLAorICAgICAgICBMVkVRTkJfR2Fpbl9OZWcyX2RCLCAgTFZFUU5CX0dhaW5fTmVnMV9kQiwgIExWRVFOQl9HYWluXzBfZEIsIC8qIDBkQiBnYWluICovCisgICAgICAgIExWRVFOQl9HYWluXzFfZEIsICAgICBMVkVRTkJfR2Fpbl8yX2RCLCAgICAgTFZFUU5CX0dhaW5fM19kQiwgICAgIExWRVFOQl9HYWluXzRfZEIsCisgICAgICAgIExWRVFOQl9HYWluXzVfZEIsICAgICBMVkVRTkJfR2Fpbl82X2RCLCAgICAgTFZFUU5CX0dhaW5fN19kQiwgICAgIExWRVFOQl9HYWluXzhfZEIsCisgICAgICAgIExWRVFOQl9HYWluXzlfZEIsICAgICBMVkVRTkJfR2Fpbl8xMF9kQiwgICAgTFZFUU5CX0dhaW5fMTFfZEIsICAgIExWRVFOQl9HYWluXzEyX2RCLAorICAgICAgICBMVkVRTkJfR2Fpbl8xM19kQiwgICAgTFZFUU5CX0dhaW5fMTRfZEIsICAgIExWRVFOQl9HYWluXzE1X2RCfTsgLyogKzE1ZEIgZ2FpbiAqLwogLyoKICAqIEQgdGFibGUgZm9yIDEwMCAvIChHYWluICsgMSkKICAqLwotY29uc3QgTFZNX0ZMT0FUICAgIExWRVFOQl9EVGFibGVbXSA9IHtMVkVRTkJfMTAwRF9OZWcxNV9kQiwgICAgICAgICAgICAvKiAtMTVkQiBnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzE0X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxM19kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTJfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzExX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxMF9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnOV9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnOF9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnN19kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnNl9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnNV9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnNF9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnM19kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMl9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMV9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfMF9kQn07ICAgICAgICAgICAgICAgLyogMGRCIGdhaW4gKi8KK2NvbnN0IExWTV9GTE9BVCBMVkVRTkJfRFRhYmxlW10gPSB7CisgICAgICAgIExWRVFOQl8xMDBEX05lZzE1X2RCLCAvKiAtMTVkQiBnYWluICovCisgICAgICAgIExWRVFOQl8xMDBEX05lZzE0X2RCLCBMVkVRTkJfMTAwRF9OZWcxM19kQiwgTFZFUU5CXzEwMERfTmVnMTJfZEIsIExWRVFOQl8xMDBEX05lZzExX2RCLAorICAgICAgICBMVkVRTkJfMTAwRF9OZWcxMF9kQiwgTFZFUU5CXzEwMERfTmVnOV9kQiwgIExWRVFOQl8xMDBEX05lZzhfZEIsICBMVkVRTkJfMTAwRF9OZWc3X2RCLAorICAgICAgICBMVkVRTkJfMTAwRF9OZWc2X2RCLCAgTFZFUU5CXzEwMERfTmVnNV9kQiwgIExWRVFOQl8xMDBEX05lZzRfZEIsICBMVkVRTkJfMTAwRF9OZWczX2RCLAorICAgICAgICBMVkVRTkJfMTAwRF9OZWcyX2RCLCAgTFZFUU5CXzEwMERfTmVnMV9kQiwgIExWRVFOQl8xMDBEXzBfZEJ9OyAvKiAwZEIgZ2FpbiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGaWx0ZXIgcG9seW5vbWlhbCBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTQyLDEzICs5MSwxMyBAQAogICogYSByYW5nZSBvZiAwIHRvIFBpLiBUaGUgb3V0cHV0IGlzIGluIHRoZSByYW5nZSAzMjc2NyB0byAtMzI3NjggcmVwcmVzZW50aW5nIHRoZSByYW5nZQogICogKzEuMCB0byAtMS4wCiAgKi8KLWNvbnN0IExWTV9JTlQxNiAgICAgTFZFUU5CX0Nvc0NvZWZbXSA9IHszLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hpZnRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5NiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTM2LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGExICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE5NzI1LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTI2NzEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjM3MzAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGE0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTk0OTB9OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGE1ICovCitjb25zdCBMVk1fSU5UMTYgTFZFUU5CX0Nvc0NvZWZbXSA9IHszLCAgICAgIC8qIFNoaWZ0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5NiwgICAvKiBhMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTM2LCAgICAvKiBhMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE5NzI1LCAvKiBhMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTI2NzEsICAvKiBhMyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjM3MzAsICAvKiBhNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTk0OTB9OyAvKiBhNSAqLwogCiAvKgogICogQ29lZmZpY2llbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgY29zaW5lIGVycm9yIHdpdGggdGhlIGVxdWF0aW9uOgpAQCAtMTY0LDkgKzExMyw4IEBACiAgKgogICogQ29zKHgpID0gMS4wIC0gQ29zRXJyKHgpCiAgKi8KLWNvbnN0IExWTV9JTlQxNiAgICAgTFZFUU5CX0RQQ29zQ29lZltdID0gezEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hpZnRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGExICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjU4NiwgICAgICAgICAgICAgICAgICAgICAgIC8qIGEyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDR9OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEzICovCi0KK2NvbnN0IExWTV9JTlQxNiBMVkVRTkJfRFBDb3NDb2VmW10gPSB7MSwgICAgIC8qIFNoaWZ0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgLyogYTAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYsICAgIC8qIGExICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2NTg2LCAvKiBhMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDR9OyAgLyogYTMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmgKaW5kZXggYTcxZWViOS4uYWI1MTE5NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmgKQEAgLTI3LDcgKzI3LDcgQEAKICAqIFNhbXBsZSByYXRlIHRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIGFjdHVhbAogICogZnJlcXVlbmN5CiAgKi8KLWV4dGVybiBjb25zdCBMVk1fVUlOVDMyICAgIExWRVFOQl9TYW1wbGVSYXRlVGFiW107CitleHRlcm4gY29uc3QgTFZNX1VJTlQzMiBMVkVRTkJfU2FtcGxlUmF0ZVRhYltdOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM4LDE3ICszOCwxNyBAQAogLyoKICAqIFRhYmxlIGZvciAyICogUGkgLyBGcwogICovCi1leHRlcm4gY29uc3QgTFZNX0ZMT0FUICAgICBMVkVRTkJfVHdvUGlPbkZzVGFibGVbXTsKK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW107CiAKIC8qCiAgKiBHYWluIHRhYmxlCiAgKi8KLWV4dGVybiBjb25zdCBMVk1fRkxPQVQgICAgIExWRVFOQl9HYWluVGFibGVbXTsKK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZFUU5CX0dhaW5UYWJsZVtdOwogCiAvKgogICogRCB0YWJsZSBmb3IgMTAwIC8gKEdhaW4gKyAxKQogICovCi1leHRlcm4gY29uc3QgTFZNX0ZMT0FUICAgICBMVkVRTkJfRFRhYmxlW107CitleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWRVFOQl9EVGFibGVbXTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02NSw3ICs2NSw3IEBACiAgKiBhIHJhbmdlIG9mIDAgdG8gUGkuIFRoZSBvdXRwdXQgaXMgaW4gdGhlIHJhbmdlIDMyNzY3IHRvIC0zMjc2OCByZXByZXNlbnRpbmcgdGhlIHJhbmdlCiAgKiArMS4wIHRvIC0xLjAKICAqLwotZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiAgICAgTFZFUU5CX0Nvc0NvZWZbXTsKK2V4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZFUU5CX0Nvc0NvZWZbXTsKIAogLyoKICAqIENvZWZmaWNpZW50cyBmb3IgY2FsY3VsYXRpbmcgdGhlIGNvc2luZSBlcnJvciB3aXRoIHRoZSBlcXVhdGlvbjoKQEAgLTgxLDYgKzgxLDYgQEAKICAqCiAgKiBDb3MoeCkgPSAxLjAgLSBDb3NFcnIoeCkKICAqLwotZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiAgICAgTFZFUU5CX0RQQ29zQ29lZltdOworZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVkVRTkJfRFBDb3NDb2VmW107CiAKICNlbmRpZiAvKiBfX0xWRVFOQl9UQUJMRVNfSF9fICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL2xpYi9MVlJFVi5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9saWIvTFZSRVYuaAppbmRleCA4YzkxZWE5Li44MmU5NGRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL2xpYi9MVlJFVi5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvbGliL0xWUkVWLmgKQEAgLTQxLDExICs0MSwxMSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEdlbmVyYWwgKi8KLSNkZWZpbmUgTFZSRVZfQkxPQ0tTSVpFX01VTFRJUExFICAgICAgICAgICAgICAgIDEgICAgICAgLyogUHJvY2Vzc2luZyBibG9jayBzaXplIG11bHRpcGxlICovCi0jZGVmaW5lIExWUkVWX01BWF9UNjAgICAgICAgICAgICAgICAgICAgICAgICA3MDAwICAgICAgIC8qIE1heGltdW0gZGVjYXkgdGltZSBpcyA3MDAwbXMgKi8KKyNkZWZpbmUgTFZSRVZfQkxPQ0tTSVpFX01VTFRJUExFIDEgLyogUHJvY2Vzc2luZyBibG9jayBzaXplIG11bHRpcGxlICovCisjZGVmaW5lIExWUkVWX01BWF9UNjAgNzAwMCAgICAgICAgIC8qIE1heGltdW0gZGVjYXkgdGltZSBpcyA3MDAwbXMgKi8KIAogLyogTWVtb3J5IHRhYmxlKi8KLSNkZWZpbmUgTFZSRVZfTlJfTUVNT1JZX1JFR0lPTlMgICAgICAgICAgICAgICAgIDQgICAgICAgLyogTnVtYmVyIG9mIG1lbW9yeSByZWdpb25zICovCisjZGVmaW5lIExWUkVWX05SX01FTU9SWV9SRUdJT05TIDQgLyogTnVtYmVyIG9mIG1lbW9yeSByZWdpb25zICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01MywyNCArNTMsMjIgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLXR5cGVkZWYgdm9pZCAqTFZSRVZfSGFuZGxlX3Q7Cit0eXBlZGVmIHZvaWQqIExWUkVWX0hhbmRsZV90OwogCiAvKiBTdGF0dXMgcmV0dXJuIHZhbHVlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZSRVZfU1VDQ0VTUyAgICAgICAgICAgID0gMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gYSByb3V0aW5lICovCi0gICAgTFZSRVZfTlVMTEFERFJFU1MgICAgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgIC8qIE5VTEwgYWxsb2NhdGlvbiBhZGRyZXNzICovCi0gICAgTFZSRVZfT1VUT0ZSQU5HRSAgICAgICAgID0gMiwgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dCBvZiByYW5nZSBjb250cm9sIHBhcmFtZXRlciAqLwotICAgIExWUkVWX0lOVkFMSUROVU1TQU1QTEVTICA9IDMsICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnZhbGlkIG51bWJlciBvZiBzYW1wbGVzICovCit0eXBlZGVmIGVudW0geworICAgIExWUkVWX1NVQ0NFU1MgPSAwLCAgICAgICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBhIHJvdXRpbmUgKi8KKyAgICBMVlJFVl9OVUxMQUREUkVTUyA9IDEsICAgICAgIC8qIE5VTEwgYWxsb2NhdGlvbiBhZGRyZXNzICovCisgICAgTFZSRVZfT1VUT0ZSQU5HRSA9IDIsICAgICAgICAvKiBPdXQgb2YgcmFuZ2UgY29udHJvbCBwYXJhbWV0ZXIgKi8KKyAgICBMVlJFVl9JTlZBTElETlVNU0FNUExFUyA9IDMsIC8qIEludmFsaWQgbnVtYmVyIG9mIHNhbXBsZXMgKi8KICAgICBMVlJFVl9SRVRVUk5TVEFUVVNfRFVNTVkgPSBMVk1fTUFYRU5VTQogfSBMVlJFVl9SZXR1cm5TdGF0dXNfZW47CiAKIC8qIFJldmVyYiBkZWxheSBsaW5lcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZSRVZfREVMQVlMSU5FU18xICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9uZSBkZWxheSBsaW5lICovCi0gICAgTFZSRVZfREVMQVlMSU5FU18yICAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR3byBkZWxheSBsaW5lcyAqLwotICAgIExWUkVWX0RFTEFZTElORVNfNCAgICAgPSA0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3VyIGRlbGF5IGxpbmVzICovCit0eXBlZGVmIGVudW0geworICAgIExWUkVWX0RFTEFZTElORVNfMSA9IDEsIC8qIE9uZSBkZWxheSBsaW5lICovCisgICAgTFZSRVZfREVMQVlMSU5FU18yID0gMiwgLyogVHdvIGRlbGF5IGxpbmVzICovCisgICAgTFZSRVZfREVMQVlMSU5FU180ID0gNCwgLyogRm91ciBkZWxheSBsaW5lcyAqLwogICAgIExWUkVWX0RFTEFZTElORVNfRFVNTVkgPSBMVk1fTUFYRU5VTQogfSBMVlJFVl9OdW1EZWxheUxpbmVzX2VuOwogCkBAIC04MCw0MSArNzgsMzMgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX01lbW9yeVJlZ2lvbl9zdCAgICAgICAgUmVnaW9uW0xWUkVWX05SX01FTU9SWV9SRUdJT05TXTsgIC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLwotfSBMVlJFVl9NZW1vcnlUYWJsZV9zdDsKLQogLyogQ29udHJvbCBQYXJhbWV0ZXIgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLwotICAgIExWTV9Nb2RlX2VuICAgICAgICAgICAgICAgICBPcGVyYXRpbmdNb2RlOyAgICAgICAgICAvKiBPcGVyYXRpbmcgbW9kZSAqLwotICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICBTYW1wbGVSYXRlOyAgICAgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAqLwotICAgIExWTV9Gb3JtYXRfZW4gICAgICAgICAgICAgICBTb3VyY2VGb3JtYXQ7ICAgICAgICAgICAvKiBTb3VyY2UgZGF0YSBmb3JtYXQgKi8KKyAgICBMVk1fTW9kZV9lbiBPcGVyYXRpbmdNb2RlOyAgLyogT3BlcmF0aW5nIG1vZGUgKi8KKyAgICBMVk1fRnNfZW4gU2FtcGxlUmF0ZTsgICAgICAgLyogU2FtcGxlIHJhdGUgKi8KKyAgICBMVk1fRm9ybWF0X2VuIFNvdXJjZUZvcm1hdDsgLyogU291cmNlIGRhdGEgZm9ybWF0ICovCiAKICAgICAvKiBQYXJhbWV0ZXJzIGZvciBSRVYgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTGV2ZWw7ICAgICAgICAgICAgICAgICAgLyogTGV2ZWwsIDAgdG8gMTAwIHJlcHJlc2VudGluZyBwZXJjZW50YWdlIG9mIHJldmVyYiAqLwotICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBMUEY7ICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIsIGluIEh6ICovCi0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEhQRjsgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIsIGluIEh6ICovCisgICAgTFZNX1VJTlQxNiBMZXZlbDsgLyogTGV2ZWwsIDAgdG8gMTAwIHJlcHJlc2VudGluZyBwZXJjZW50YWdlIG9mIHJldmVyYiAqLworICAgIExWTV9VSU5UMzIgTFBGOyAgIC8qIExvdyBwYXNzIGZpbHRlciwgaW4gSHogKi8KKyAgICBMVk1fVUlOVDMyIEhQRjsgICAvKiBIaWdoIHBhc3MgZmlsdGVyLCBpbiBIeiAqLwogCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFQ2MDsgICAgICAgICAgICAgICAgICAgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQsIGluIG1zICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIERlbnNpdHk7ICAgICAgICAgICAgICAgIC8qIEVjaG8gZGVuc2l0eSwgMCB0byAxMDAgZm9yIG1pbmltdW0gdG8gbWF4aW11bSBkZW5zaXR5ICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIERhbXBpbmc7ICAgICAgICAgICAgICAgIC8qIERhbXBpbmcgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgUm9vbVNpemU7ICAgICAgICAgICAgICAgLyogU2ltdWxhdGVkIHJvb20gc2l6ZSwgMSB0byAxMDAgZm9yIG1pbmltdW0gdG8gbWF4aW11bSBzaXplICovCisgICAgTFZNX1VJTlQxNiBUNjA7ICAgICAgLyogRGVjYXkgdGltZSBjb25zdGFudCwgaW4gbXMgKi8KKyAgICBMVk1fVUlOVDE2IERlbnNpdHk7ICAvKiBFY2hvIGRlbnNpdHksIDAgdG8gMTAwIGZvciBtaW5pbXVtIHRvIG1heGltdW0gZGVuc2l0eSAqLworICAgIExWTV9VSU5UMTYgRGFtcGluZzsgIC8qIERhbXBpbmcgKi8KKyAgICBMVk1fVUlOVDE2IFJvb21TaXplOyAvKiBTaW11bGF0ZWQgcm9vbSBzaXplLCAxIHRvIDEwMCBmb3IgbWluaW11bSB0byBtYXhpbXVtIHNpemUgKi8KIAogfSBMVlJFVl9Db250cm9sUGFyYW1zX3N0OwogCiAvKiBJbnN0YW5jZSBQYXJhbWV0ZXIgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIEdlbmVyYWwgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTWF4QmxvY2tTaXplOyAgICAgICAgICAgLyogTWF4aW11bSBwcm9jZXNzaW5nIGJsb2NrIHNpemUgKi8KKyAgICBMVk1fVUlOVDE2IE1heEJsb2NrU2l6ZTsgLyogTWF4aW11bSBwcm9jZXNzaW5nIGJsb2NrIHNpemUgKi8KIAogICAgIC8qIFJldmVyYiAqLwotICAgIExWTV9Gb3JtYXRfZW4gICAgICAgICAgICAgICBTb3VyY2VGb3JtYXQ7ICAgICAgICAgICAvKiBTb3VyY2UgZGF0YSBmb3JtYXRzIHRvIHN1cHBvcnQgKi8KLSAgICBMVlJFVl9OdW1EZWxheUxpbmVzX2VuICAgICAgTnVtRGVsYXlzOyAgICAgICAgICAgICAgLyogVGhlIG51bWJlciBvZiBkZWxheSBsaW5lcywgMSwgMiBvciA0ICovCisgICAgTFZNX0Zvcm1hdF9lbiBTb3VyY2VGb3JtYXQ7ICAgICAgIC8qIFNvdXJjZSBkYXRhIGZvcm1hdHMgdG8gc3VwcG9ydCAqLworICAgIExWUkVWX051bURlbGF5TGluZXNfZW4gTnVtRGVsYXlzOyAvKiBUaGUgbnVtYmVyIG9mIGRlbGF5IGxpbmVzLCAxLCAyIG9yIDQgKi8KIAogfSBMVlJFVl9JbnN0YW5jZVBhcmFtc19zdDsKIApAQCAtMTI2LDQ2ICsxMTYsNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWUkVWX0dldE1lbW9yeVRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBvYnRhaW4gdGhlIExWUkVWIG1vZHVsZSBtZW1vcnkgcmVxdWlyZW1lbnRzIHRvIHN1cHBvcnQgICAgICovCi0vKiAgbWVtb3J5IGFsbG9jYXRpb24uIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gcmV0dXJuIHRoZSBtZW1vcnkgYmFzZSBhZGRyZXNzIHByb3ZpZGVkICAgKi8KLS8qICBkdXJpbmcgbWVtb3J5IGFsbG9jYXRpb24gdG8gc3VwcG9ydCBmcmVlaW5nIG9mIG1lbW9yeSB3aGVuIHRoZSBMVlJFViBtb2R1bGUgaXMgbm8gICAqLwotLyogIGxvbmdlciByZXF1aXJlZC4gSXQgaXMgY2FsbGVkIGluIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgYWxsb2NhdGVkICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlIGFkZHJlc3Nlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBoSW5zdGFuY2UgPSBOVUxMIHRoZSBtZW1vcnkgYmFzZSBhZGRyZXNzIHBvaW50ZXJzICovCi0vKiAgd2lsbCBiZSBOVUxMIG9uIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZnJlZWluZyBtZW1vcnksIGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSB0aGUgICAgICovCi0vKiAgbWVtb3J5IHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nICAgICAgICAgICAgKi8KLS8qICBpbml0aWFsaXNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcEluc3RhbmNlUGFyYW1zICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZSRVZfU1VDQ0VTUyAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIHBNZW1vcnlUYWJsZSBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUkVWX05VTExBRERSRVNTICAgICAgIFdoZW4gcmVxdWVzdGluZyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCBwSW5zdGFuY2VQYXJhbXMgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVlJFVl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfR2V0TWVtb3J5VGFibGUoTFZSRVZfSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NZW1vcnlUYWJsZV9zdCAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9JbnN0YW5jZVBhcmFtc19zdCAgKnBJbnN0YW5jZVBhcmFtcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNzksNyArMTI5LDYgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIHBJbnN0YW5jZVBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTkwLDkgKzEzOSwyNSBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0dldEluc3RhbmNlSGFuZGxlKExWUkVWX0hhbmRsZV90ICAgICAgICAgICAgKnBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTWVtb3J5VGFibGVfc3QgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlUGFyYW1zX3N0ICAgKnBJbnN0YW5jZVBhcmFtcyk7CitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUoTFZSRVZfSGFuZGxlX3QqIHBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3QqIHBJbnN0YW5jZVBhcmFtcyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZSRVZfRnJlZUluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGZyZWUgdGhlIGludGVybmFsIGFsbG9jYXRpb25zIG9mIHRoZSBtb2R1bGUuICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfU1VDQ0VTUyAgICAgICAgICBmcmVlIGluc3RhbmNlIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgIEluc3RhbmNlIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9GcmVlSW5zdGFuY2UoTFZSRVZfSGFuZGxlX3QgaEluc3RhbmNlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIxNCw4ICsxNzksOCBAQAogLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZSRVZfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKExWUkVWX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICpwQ29udHJvbFBhcmFtcyk7CitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMoTFZSRVZfSGFuZGxlX3QgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QqIHBDb250cm9sUGFyYW1zKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIzNiw4ICsyMDEsOCBAQAogLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZSRVZfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzKExWUkVWX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICpwTmV3UGFyYW1zKTsKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhMVlJFVl9IYW5kbGVfdCBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCogcE5ld1BhcmFtcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yNTcsNyArMjIyLDcgQEAKIC8qICAxLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVlJFVl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9DbGVhckF1ZGlvQnVmZmVycyhMVlJFVl9IYW5kbGVfdCAgaEluc3RhbmNlKTsKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9DbGVhckF1ZGlvQnVmZmVycyhMVlJFVl9IYW5kbGVfdCBoSW5zdGFuY2UpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjgwLDExICsyNDUsOSBAQAogLyogIDEuIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgbXVzdCBiZSAzMi1iaXQgYWxpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX1Byb2Nlc3MoTFZSRVZfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fVUlOVDE2ICAgICAgICAgIE51bVNhbXBsZXMpOworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX1Byb2Nlc3MoTFZSRVZfSGFuZGxlX3QgaEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBPdXREYXRhLCBjb25zdCBMVk1fVUlOVDE2IE51bVNhbXBsZXMpOwogCi0jZW5kaWYgICAgICAvKiBfX0xWUkVWX0hfXyAqLworI2VuZGlmIC8qIF9fTFZSRVZfSF9fICovCiAKIC8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuY3BwCmluZGV4IDFmMGQzOWIuLmI3ODgzZjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuY3BwCkBAIC0yMCw2ICsyMCw4IEBACiAvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlICJMVlJFVl9Qcml2YXRlLmgiCiAjaW5jbHVkZSAiRmlsdGVyLmgiCiAKQEAgLTQxLDE2MCArNDMsMTMwIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfQXBwbHlOZXdTZXR0aW5ncyAoTFZSRVZfSW5zdGFuY2Vfc3QgICAgICpwUHJpdmF0ZSkKLXsKLQotICAgIExWTV9Nb2RlX2VuICBPcGVyYXRpbmdNb2RlOwotICAgIExWTV9JTlQzMiAgICBOdW1iZXJPZkRlbGF5TGluZXM7CitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfQXBwbHlOZXdTZXR0aW5ncyhMVlJFVl9JbnN0YW5jZV9zdCogcFByaXZhdGUpIHsKKyAgICBMVk1fTW9kZV9lbiBPcGVyYXRpbmdNb2RlOworICAgIExWTV9JTlQzMiBOdW1iZXJPZkRlbGF5TGluZXM7CiAKICAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVyICovCi0gICAgaWYocFByaXZhdGUgPT0gTFZNX05VTEwpCi0gICAgeworICAgIGlmIChwUHJpdmF0ZSA9PSBMVk1fTlVMTCkgewogICAgICAgICByZXR1cm4gTFZSRVZfTlVMTEFERFJFU1M7CiAgICAgfQogCiAgICAgT3BlcmF0aW5nTW9kZSA9IHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZTsKIAotICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQotICAgIHsKKyAgICBpZiAocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpIHsKICAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gNDsKLSAgICB9Ci0gICAgZWxzZSBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKLSAgICB7CisgICAgfSBlbHNlIGlmIChwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikgewogICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSAyOwotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDE7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzCiAgICAgICovCi0gICAgaWYoKHBQcml2YXRlLT5OZXdQYXJhbXMuSFBGICAgICAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5IUEYpICAgICAgICB8fAotICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKLSAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgICAgICBPbWVnYTsKLSAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgQ29lZmZzOworICAgIGlmICgocFByaXZhdGUtPk5ld1BhcmFtcy5IUEYgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuSFBGKSB8fAorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fVFJVRSkpIHsKKyAgICAgICAgTFZNX0ZMT0FUIE9tZWdhOworICAgICAgICBGT19GTE9BVF9Db2Vmc190IENvZWZmczsKIAogICAgICAgICBPbWVnYSA9IExWTV9HZXRPbWVnYShwUHJpdmF0ZS0+TmV3UGFyYW1zLkhQRiwgcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKTsKICAgICAgICAgTFZNX0ZPX0hQRihPbWVnYSwgJkNvZWZmcyk7Ci0gICAgICAgIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoICZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5IUENvZWZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBGYXN0RGF0YS0+SFBUYXBzLCAmQ29lZmZzKTsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsCi0gICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKSZwUHJpdmF0ZS0+cEZhc3REYXRhLT5IUFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QpIC8gc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICBjb25zdCBzdGQ6OmFycmF5PExWTV9GTE9BVCwgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OmtCaXF1YWROdW1Db2Vmcz4gY29lZnMgPSB7CisgICAgICAgICAgICAgICAgQ29lZmZzLkEwLCBDb2VmZnMuQTEsIDAuMCwgLShDb2VmZnMuQjEpLCAwLjB9OworICAgICAgICBwUHJpdmF0ZS0+cFJldkhQRkJpcXVhZC5yZXNldCgKKyAgICAgICAgICAgICAgICBuZXcgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxMVk1fRkxPQVQ+KEZDQ18xLCBjb2VmcykpOwogICAgIH0KIAogICAgIC8qCiAgICAgICogVXBkYXRlIHRoZSBsb3cgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzCiAgICAgICovCi0gICAgaWYoKHBQcml2YXRlLT5OZXdQYXJhbXMuTFBGICAgICAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MUEYpICAgICAgICB8fAotICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKLSAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgICAgICBPbWVnYTsKLSAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgQ29lZmZzOworICAgIGlmICgocFByaXZhdGUtPk5ld1BhcmFtcy5MUEYgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuTFBGKSB8fAorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fVFJVRSkpIHsKKyAgICAgICAgTFZNX0ZMT0FUIE9tZWdhOworICAgICAgICBGT19GTE9BVF9Db2Vmc190IENvZWZmczsKIAogICAgICAgICBDb2VmZnMuQTAgPSAxOwogICAgICAgICBDb2VmZnMuQTEgPSAwOwogICAgICAgICBDb2VmZnMuQjEgPSAwOwotICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLkxQRiA8PSAoTFZNX0ZzVGFibGVbcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlXSA+PiAxKSkKLSAgICAgICAgeworICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5MUEYgPD0gKExWTV9Gc1RhYmxlW3BQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZV0gPj4gMSkpIHsKICAgICAgICAgICAgIE9tZWdhID0gTFZNX0dldE9tZWdhKHBQcml2YXRlLT5OZXdQYXJhbXMuTFBGLCBwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpOwogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogRG8gbm90IGFwcGx5IGZpbHRlciBpZiB3ID0yKnBpKmZjL2ZzID49IDIuOQogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZihPbWVnYSA8PSAoTFZNX0ZMT0FUKUxWUkVWXzJfOV9JTlEyOSkKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChPbWVnYSA8PSAoTFZNX0ZMT0FUKUxWUkVWXzJfOV9JTlEyOSkgewogICAgICAgICAgICAgICAgIExWTV9GT19MUEYoT21lZ2EsICZDb2VmZnMpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoICZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5MUENvZWZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBGYXN0RGF0YS0+TFBUYXBzLCAmQ29lZmZzKTsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsCi0gICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKSZwUHJpdmF0ZS0+cEZhc3REYXRhLT5MUFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QpIC8gc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICBjb25zdCBzdGQ6OmFycmF5PExWTV9GTE9BVCwgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OmtCaXF1YWROdW1Db2Vmcz4gY29lZnMgPSB7CisgICAgICAgICAgICAgICAgQ29lZmZzLkEwLCBDb2VmZnMuQTEsIDAuMCwgLShDb2VmZnMuQjEpLCAwLjB9OworICAgICAgICBwUHJpdmF0ZS0+cFJldkxQRkJpcXVhZC5yZXNldCgKKyAgICAgICAgICAgICAgICBuZXcgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxMVk1fRkxPQVQ+KEZDQ18xLCBjb2VmcykpOwogICAgIH0KIAogICAgIC8qCiAgICAgICogQ2FsY3VsYXRlIHRoZSByb29tIHNpemUgcGFyYW1ldGVyCiAgICAgICovCi0gICAgaWYoIHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpCi0gICAgeworICAgIGlmIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSB7CiAgICAgICAgIC8qIFJvb20gc2l6ZSByYW5nZSBpcyAxMG1zIHRvIDIwMG1zCiAgICAgICAgICAqIDAlICAgLS0gMTBtcwogICAgICAgICAgKiA1MCUgIC0tIDY1bXMKICAgICAgICAgICogMTAwJSAtLSAxMjBtcwogICAgICAgICAgKi8KLSAgICAgICAgcFByaXZhdGUtPlJvb21TaXplSW5tcyA9IDEwICsgKCgocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSoxMSkgKyA1KSAvIDEwKTsKKyAgICAgICAgcFByaXZhdGUtPlJvb21TaXplSW5tcyA9IDEwICsgKCgocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAqIDExKSArIDUpIC8gMTApOwogICAgIH0KIAogICAgIC8qCiAgICAgICogVXBkYXRlIHRoZSBUIGRlbGF5IG51bWJlciBvZiBzYW1wbGVzIGFuZCB0aGUgYWxsIHBhc3MgZGVsYXkgbnVtYmVyIG9mIHNhbXBsZXMKICAgICAgKi8KLSAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgICB8fAorICAgIGlmICgocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgfHwKICAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAotICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKLSAgICB7Ci0KLSAgICAgICAgTFZNX1VJTlQzMiAgVGVtcDsKLSAgICAgICAgTFZNX0lOVDMyICAgQVBEZWxheVNpemU7Ci0gICAgICAgIExWTV9JTlQzMiAgIEZzID0gTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7Ci0gICAgICAgIExWTV9VSU5UMzIgIERlbGF5TGVuZ3RoU2FtcGxlcyA9IChMVk1fVUlOVDMyKShGcyAqIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMpOwotICAgICAgICBMVk1fSU5UMTYgICBpOwotICAgICAgICBMVk1fRkxPQVQgICBTY2FsZVRhYmxlW10gID0ge0xWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80LCBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzR9OwotICAgICAgICBMVk1fSU5UMTYgICBNYXhUX0RlbGF5W10gID0ge0xWUkVWX01BWF9UMF9ERUxBWSwgTFZSRVZfTUFYX1QxX0RFTEFZLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTUFYX1QyX0RFTEFZLCBMVlJFVl9NQVhfVDNfREVMQVl9OwotICAgICAgICBMVk1fSU5UMTYgICBNYXhBUF9EZWxheVtdID0ge0xWUkVWX01BWF9BUDBfREVMQVksIExWUkVWX01BWF9BUDFfREVMQVksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NQVhfQVAyX0RFTEFZLCBMVlJFVl9NQVhfQVAzX0RFTEFZfTsKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9UUlVFKSkgeworICAgICAgICBMVk1fVUlOVDMyIFRlbXA7CisgICAgICAgIExWTV9JTlQzMiBBUERlbGF5U2l6ZTsKKyAgICAgICAgTFZNX0lOVDMyIEZzID0gTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7CisgICAgICAgIExWTV9VSU5UMzIgRGVsYXlMZW5ndGhTYW1wbGVzID0gKExWTV9VSU5UMzIpKEZzICogcFByaXZhdGUtPlJvb21TaXplSW5tcyk7CisgICAgICAgIExWTV9JTlQxNiBpOworICAgICAgICBMVk1fRkxPQVQgU2NhbGVUYWJsZVtdID0ge0xWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80fTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBGb3IgZWFjaCBkZWxheSBsaW5lCiAgICAgICAgICAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTFZNX0ZMT0FUIFRlbXAxOyAgLyogdG8gYXZvaWQgUUFDIHdhcm5pbmcgb24gdHlwZSBjb252ZXJzaW9uICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOdW1iZXJPZkRlbGF5TGluZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICAgICAgICAgIExWTV9GTE9BVCBUZW1wMTsgLyogdG8gYXZvaWQgUUFDIHdhcm5pbmcgb24gdHlwZSBjb252ZXJzaW9uICovCiAKLSAgICAgICAgICAgICAgICBUZW1wMT0oTFZNX0ZMT0FUKURlbGF5TGVuZ3RoU2FtcGxlczsKKyAgICAgICAgICAgICAgICBUZW1wMSA9IChMVk1fRkxPQVQpRGVsYXlMZW5ndGhTYW1wbGVzOwogICAgICAgICAgICAgICAgIFRlbXAgPSAoTFZNX1VJTlQzMikoVGVtcDEgKiBTY2FsZVRhYmxlW2ldKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgVGVtcCA9IERlbGF5TGVuZ3RoU2FtcGxlczsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIFRlbXAgPSBEZWxheUxlbmd0aFNhbXBsZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBUERlbGF5U2l6ZSA9IFRlbXAgIC8gMTUwMDsKKyAgICAgICAgICAgIEFQRGVsYXlTaXplID0gVGVtcCAvIDE1MDA7CiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBTZXQgdGhlIGZpeGVkIGRlbGF5CiAgICAgICAgICAgICAgKi8KIAotICAgICAgICAgICAgVGVtcCAgPSAoTWF4VF9EZWxheVtpXSAtIE1heEFQX0RlbGF5W2ldKSAqIEZzIC8gMTkyMDAwOworICAgICAgICAgICAgVGVtcCA9IChMVlJFVl9NQVhfVF9ERUxBWVtpXSAtIExWUkVWX01BWF9BUF9ERUxBWVtpXSkgKiBGcyAvIDE5MjAwMDsKICAgICAgICAgICAgIHBQcml2YXRlLT5EZWxheV9BUFtpXSA9IHBQcml2YXRlLT5UW2ldIC0gVGVtcDsKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFNldCB0aGUgdGFwIHNlbGVjdGlvbgogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocFByaXZhdGUtPkFCX1NlbGVjdGlvbikKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgLyogU21vb3RoIGZyb20gdGFwIEEgdG8gdGFwIEIgKi8KLSAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cE9mZnNldEJbaV0gICAgICAgICAgICAgPSAmcFByaXZhdGUtPnBEZWxheV9UW2ldW3BQcml2YXRlLT5UW2ldIC0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcCAtIEFQRGVsYXlTaXplXTsKLSAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+Ql9EZWxheVNpemVbaV0gICAgICAgICAgPSBBUERlbGF5U2l6ZTsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cE9mZnNldEJbaV0gPSAmcFByaXZhdGUtPnBEZWxheV9UW2ldW3BQcml2YXRlLT5UW2ldIC0gVGVtcCAtIEFQRGVsYXlTaXplXTsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+Ql9EZWxheVNpemVbaV0gPSBBUERlbGF5U2l6ZTsKICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDEgPSAwOwogICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MiA9IDEuMGY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8qIFNtb290aCBmcm9tIHRhcCBCIHRvIHRhcCBBICovCi0gICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRBW2ldICAgICAgICAgICAgID0gJnBQcml2YXRlLT5wRGVsYXlfVFtpXVtwUHJpdmF0ZS0+VFtpXSAtIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXAgLSBBUERlbGF5U2l6ZV07Ci0gICAgICAgICAgICAgICAgcFByaXZhdGUtPkFfRGVsYXlTaXplW2ldICAgICAgICAgID0gQVBEZWxheVNpemU7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRBW2ldID0gJnBQcml2YXRlLT5wRGVsYXlfVFtpXVtwUHJpdmF0ZS0+VFtpXSAtIFRlbXAgLSBBUERlbGF5U2l6ZV07CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPkFfRGVsYXlTaXplW2ldID0gQVBEZWxheVNpemU7CiAgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQyID0gMDsKICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDEgPSAxLjBmOwogICAgICAgICAgICAgfQpAQCAtMjAyLDIyICsxNzQsMTcgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBTZXQgdGhlIG1heGltdW0gYmxvY2sgc2l6ZSB0byB0aGUgc21hbGxlc3QgZGVsYXkgc2l6ZQogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuICAgPSBUZW1wOwotICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5NYXhCbGtMZW4gPiBwUHJpdmF0ZS0+QV9EZWxheVNpemVbaV0pCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+TWF4QmxrTGVuID4gcFByaXZhdGUtPkFfRGVsYXlTaXplW2ldKSB7CiAgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiA9IHBQcml2YXRlLT5BX0RlbGF5U2l6ZVtpXTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+TWF4QmxrTGVuID4gcFByaXZhdGUtPkJfRGVsYXlTaXplW2ldKQotICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5NYXhCbGtMZW4gPiBwUHJpdmF0ZS0+Ql9EZWxheVNpemVbaV0pIHsKICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gcFByaXZhdGUtPkJfRGVsYXlTaXplW2ldOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uKQotICAgICAgICB7CisgICAgICAgIGlmIChwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uKSB7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHBQcml2YXRlLT5BQl9TZWxlY3Rpb24gPSAxOwogICAgICAgICB9CiAKQEAgLTIyNiw4ICsxOTMsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgLyogSnVzdCBhcyBhIHByZWNhdXNpb24sIGJ1dCBubyBwcm9ibGVtIGlmIHdlIHJlbW92ZSB0aGlzIGxpbmUgICAgICAqLwogICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gcFByaXZhdGUtPk1heEJsa0xlbiAtIDI7Ci0gICAgICAgIGlmKHBQcml2YXRlLT5NYXhCbGtMZW4gPiBwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTWF4QmxvY2tTaXplKQotICAgICAgICB7CisgICAgICAgIGlmIChwUHJpdmF0ZS0+TWF4QmxrTGVuID4gcFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk1heEJsb2NrU2l6ZSkgewogICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiA9IChMVk1fSU5UMzIpcFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk1heEJsb2NrU2l6ZTsKICAgICAgICAgfQogICAgIH0KQEAgLTIzNSw3MiArMjAxLDYxIEBACiAgICAgLyoKICAgICAgKiBVcGRhdGUgdGhlIGxvdyBwYXNzIGZpbHRlciBjb2VmZmljaWVudAogICAgICAqLwotICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5EYW1waW5nICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkRhbXBpbmcpICAgIHx8CisgICAgaWYgKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRhbXBpbmcgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuRGFtcGluZykgfHwKICAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAotICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKLSAgICB7Ci0KLSAgICAgICAgTFZNX0lOVDMyICAgICAgIFRlbXA7Ci0gICAgICAgIExWTV9GTE9BVCAgICAgICBPbWVnYTsKLSAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgQ29lZmZzOwotICAgICAgICBMVk1fSU5UMTYgICAgICAgaTsKLSAgICAgICAgTFZNX0lOVDE2ICAgICAgIERhbXBpbmcgICAgICA9IChMVk1fSU5UMTYpKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRhbXBpbmcgKiAxMDApICsgMTAwMCk7Ci0gICAgICAgIExWTV9GTE9BVCAgICAgICBTY2FsZVRhYmxlW10gPSB7TFZSRVZfVF8zX1Bvd2VyXzBfb25fNCwgTFZSRVZfVF8zX1Bvd2VyXzFfb25fNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9UXzNfUG93ZXJfMl9vbl80LCBMVlJFVl9UXzNfUG93ZXJfM19vbl80fTsKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9UUlVFKSkgeworICAgICAgICBMVk1fSU5UMzIgVGVtcDsKKyAgICAgICAgTFZNX0ZMT0FUIE9tZWdhOworICAgICAgICBGT19GTE9BVF9Db2Vmc190IENvZWZmczsKKyAgICAgICAgTFZNX0lOVDE2IGk7CisgICAgICAgIExWTV9JTlQxNiBEYW1waW5nID0gKExWTV9JTlQxNikoKHBQcml2YXRlLT5OZXdQYXJhbXMuRGFtcGluZyAqIDEwMCkgKyAxMDAwKTsKKyAgICAgICAgTFZNX0ZMT0FUIFNjYWxlVGFibGVbXSA9IHtMVlJFVl9UXzNfUG93ZXJfMF9vbl80LCBMVlJFVl9UXzNfUG93ZXJfMV9vbl80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX1RfM19Qb3dlcl8yX29uXzQsIExWUkVWX1RfM19Qb3dlcl8zX29uXzR9OwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIEZvciBlYWNoIGZpbHRlcgogICAgICAgICAgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IE51bWJlck9mRGVsYXlMaW5lczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSAhPSAwKQotICAgICAgICAgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpICE9IDApIHsKICAgICAgICAgICAgICAgICBUZW1wID0gKExWTV9JTlQzMikoU2NhbGVUYWJsZVtpXSAqIERhbXBpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBUZW1wID0gRGFtcGluZzsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKFRlbXAgPD0gKExWTV9JTlQzMikoTFZNX0ZzVGFibGVbcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlXSA+PiAxKSkKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChUZW1wIDw9IChMVk1fSU5UMzIpKExWTV9Gc1RhYmxlW3BQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZV0gPj4gMSkpIHsKICAgICAgICAgICAgICAgICBPbWVnYSA9IExWTV9HZXRPbWVnYShUZW1wLCBwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpOwogICAgICAgICAgICAgICAgIExWTV9GT19MUEYoT21lZ2EsICZDb2VmZnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBDb2VmZnMuQTAgPSAxOwogICAgICAgICAgICAgICAgIENvZWZmcy5BMSA9IDA7CiAgICAgICAgICAgICAgICAgQ29lZmZzLkIxID0gMDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoJnBQcml2YXRlLT5wRmFzdENvZWYtPlJldkxQQ29lZnNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbaV0sICZDb2VmZnMpOworICAgICAgICAgICAgY29uc3Qgc3RkOjphcnJheTxMVk1fRkxPQVQsIGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjprQmlxdWFkTnVtQ29lZnM+IGNvZWZzID0geworICAgICAgICAgICAgICAgICAgICBDb2VmZnMuQTAsIENvZWZmcy5BMSwgMC4wLCAtKENvZWZmcy5CMSksIDAuMH07CisgICAgICAgICAgICBwUHJpdmF0ZS0+cmV2TFBGQmlxdWFkW2ldLnJlc2V0KAorICAgICAgICAgICAgICAgICAgICBuZXcgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxMVk1fRkxPQVQ+KEZDQ18xLCBjb2VmcykpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgQWxsLXBhc3MgZmlsdGVyIG1peGVyIHRpbWUgY29uc3RhbnRzCiAgICAgICovCi0gICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpICAgfHwKKyAgICBpZiAoKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpIHx8CiAgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKLSAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuRGVuc2l0eSAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5EZW5zaXR5KSkKLSAgICB7Ci0gICAgICAgIExWTV9JTlQxNiAgIGk7Ci0gICAgICAgIExWTV9GTE9BVCAgIEFscGhhOwotICAgICAgICBMVk1fRkxPQVQgICBBbHBoYVRhcDsKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuRGVuc2l0eSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5EZW5zaXR5KSkgeworICAgICAgICBMVk1fSU5UMTYgaTsKKyAgICAgICAgTFZNX0ZMT0FUIEFscGhhOworICAgICAgICBMVk1fRkxPQVQgQWxwaGFUYXA7CiAKICAgICAgICAgQWxwaGEgPSBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0FMTFBBU1NfVEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksIDEpOwogCiAgICAgICAgIEFscGhhVGFwID0gTFZNX01peGVyX1RpbWVDb25zdGFudChMVlJFVl9BTExQQVNTX1RBUF9UQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwgMSk7CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5BbHBoYTEgICAgICAgPSBBbHBoYVRhcDsKLSAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQWxwaGEyICAgICAgID0gQWxwaGFUYXA7Ci0gICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5BbHBoYSAgICA9IEFscGhhOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkFscGhhMSA9IEFscGhhVGFwOworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5BbHBoYTIgPSBBbHBoYVRhcDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLkFscGhhID0gQWxwaGE7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5BbHBoYSA9IEFscGhhOwogICAgICAgICB9CiAgICAgfQpAQCAtMzA4LDE1MCArMjYzLDEyMSBAQAogICAgIC8qCiAgICAgICogVXBkYXRlIHRoZSBmZWVkIGJhY2sgZ2FpbgogICAgICAqLwotICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSAgIHx8CisgICAgaWYgKChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSB8fAogICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8Ci0gICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCAgICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuVDYwKSAgICAgICAgfHwKLSAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCi0gICAgeworICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuVDYwKSB8fAorICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpKSB7CisgICAgICAgIExWTV9GTE9BVCBHWzRdOyAvKiBGZWVkYmFjayBnYWluIChRNy4yNCkgKi8KIAotICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBHWzRdOyAgICAgICAgICAgICAgICAgICAgICAgLyogRmVlZGJhY2sgZ2FpbiAoUTcuMjQpICovCi0KLSAgICAgICAgaWYocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgPT0gMCkKLSAgICAgICAgeworICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgPT0gMCkgewogICAgICAgICAgICAgR1szXSA9IDA7CiAgICAgICAgICAgICBHWzJdID0gMDsKICAgICAgICAgICAgIEdbMV0gPSAwOwogICAgICAgICAgICAgR1swXSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBMVk1fRkxPQVQgICBUZW1wMTsKLSAgICAgICAgICAgIExWTV9GTE9BVCAgIFRlbXAyOwotICAgICAgICAgICAgTFZNX0lOVDE2ICAgaTsKLSAgICAgICAgICAgIExWTV9GTE9BVCAgIFNjYWxlVGFibGVbXSA9IHtMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNH07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMVk1fRkxPQVQgVGVtcDE7CisgICAgICAgICAgICBMVk1fRkxPQVQgVGVtcDI7CisgICAgICAgICAgICBMVk1fSU5UMTYgaTsKKyAgICAgICAgICAgIExWTV9GTE9BVCBTY2FsZVRhYmxlW10gPSB7TFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80LCBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80fTsKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIEZvciBlYWNoIGRlbGF5IGxpbmUKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE51bWJlck9mRGVsYXlMaW5lczsgaSsrKQotICAgICAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE51bWJlck9mRGVsYXlMaW5lczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgVGVtcDEgPSAoMyAqIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMgKiBTY2FsZVRhYmxlW2ldKSAvIHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwOwotICAgICAgICAgICAgICAgIGlmKFRlbXAxID49ICg0KSkKLSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAxID49ICg0KSkgewogICAgICAgICAgICAgICAgICAgICBHW2ldID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZigoVGVtcDEgPj0gKDIpKSkKLSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoVGVtcDEgPj0gKDIpKSkgewogICAgICAgICAgICAgICAgICAgICBUZW1wMiA9IExWTV9Qb3dlcjEwKC0oVGVtcDEgLyAyLjBmKSk7CiAgICAgICAgICAgICAgICAgICAgIFRlbXAxID0gTFZNX1Bvd2VyMTAoLShUZW1wMSAvIDIuMGYpKTsKICAgICAgICAgICAgICAgICAgICAgVGVtcDEgPSBUZW1wMSAqIFRlbXAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIFRlbXAxID0gTFZNX1Bvd2VyMTAoLShUZW1wMSkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoTnVtYmVyT2ZEZWxheUxpbmVzID09IDEpCi0gICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChOdW1iZXJPZkRlbGF5TGluZXMgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICBHW2ldID0gVGVtcDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgIFRlbXBHOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCBUZW1wRzsKICAgICAgICAgICAgICAgICAgICAgVGVtcEcgPSBUZW1wMSAqIE9ORV9PVkVSX1NRUlRfVFdPOwotICAgICAgICAgICAgICAgICAgICBHW2ldPVRlbXBHOworICAgICAgICAgICAgICAgICAgICBHW2ldID0gVGVtcEc7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLyogU2V0IHVwIHRoZSBmZWVkYmFjayBtaXhlcnMgZm9yIGZvdXIgZGVsYXkgbGluZXMgKi8KLSAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMF0uVGFyZ2V0PUdbMF07Ci0gICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzFdLlRhcmdldD1HWzFdOwotICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclsyXS5UYXJnZXQ9R1syXTsKLSAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbM10uVGFyZ2V0PUdbM107CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzBdLlRhcmdldCA9IEdbMF07CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzFdLlRhcmdldCA9IEdbMV07CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzJdLlRhcmdldCA9IEdbMl07CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzNdLlRhcmdldCA9IEdbM107CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBDYWxjdWxhdGUgdGhlIGdhaW4gY29ycmVjdGlvbgogICAgICAqLwotICAgIGlmKChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSB8fAotICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkxldmVsKSAgICB8fAotICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCAgICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlQ2MCkgKQotICAgIHsKLSAgICAgICAgTFZNX0lOVDMyIEluZGV4PTA7CisgICAgaWYgKChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSB8fAorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MZXZlbCkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlQ2MCkpIHsKKyAgICAgICAgTFZNX0lOVDMyIEluZGV4ID0gMDsKICAgICAgICAgTFZNX0ZMT0FUIEluZGV4X0ZMT0FUOwotICAgICAgICBMVk1fSU5UMzIgaT0wOwotICAgICAgICBMVk1fRkxPQVQgR2Fpbj0wOwotICAgICAgICBMVk1fSU5UMzIgUm9vbVNpemU9MDsKKyAgICAgICAgTFZNX0lOVDMyIGkgPSAwOworICAgICAgICBMVk1fRkxPQVQgR2FpbiA9IDA7CisgICAgICAgIExWTV9JTlQzMiBSb29tU2l6ZSA9IDA7CiAgICAgICAgIExWTV9GTE9BVCBUNjA7CiAgICAgICAgIExWTV9GTE9BVCBDb2Vmc1s1XTsKIAotICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplID09IDApCi0gICAgICAgIHsKKyAgICAgICAgaWYgKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgPT0gMCkgewogICAgICAgICAgICAgUm9vbVNpemUgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgUm9vbVNpemUgPSAoTFZNX0lOVDMyKXBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemU7CiAgICAgICAgIH0KIAotICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCA8IDEwMCkKLSAgICAgICAgeworICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgPCAxMDApIHsKICAgICAgICAgICAgIFQ2MCA9IDEwMCAqIExWUkVWX1Q2MF9TQ0FMRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIFQ2MCA9IHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwICogTFZSRVZfVDYwX1NDQUxFOwogICAgICAgICB9CiAKICAgICAgICAgLyogRmluZCB0aGUgbmVhcmVzdCByb29tIHNpemUgaW4gdGFibGUgKi8KLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgMjQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoUm9vbVNpemUgPD0gTFZSRVZfR2FpblBvbHlUYWJsZVtpXVswXSkKLSAgICAgICAgICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI0OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChSb29tU2l6ZSA8PSBMVlJFVl9HYWluUG9seVRhYmxlW2ldWzBdKSB7CiAgICAgICAgICAgICAgICAgSW5kZXggPSBpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYoUm9vbVNpemUgPT0gTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1bMF0pCi0gICAgICAgIHsKKyAgICAgICAgaWYgKFJvb21TaXplID09IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdWzBdKSB7CiAgICAgICAgICAgICAvKiBUYWtlIHRhYmxlIHZhbHVlcyBpZiB0aGUgcm9vbSBzaXplIGlzIGluIHRhYmxlICovCi0gICAgICAgICAgICBmb3IoaSA9IDE7IGkgPCA1OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29lZnNbaS0xXSA9IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdW2ldOworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgICAgIENvZWZzW2kgLSAxXSA9IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdW2ldOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQ29lZnNbNF0gPSAwOwotICAgICAgICAgICAgR2FpbiA9IExWTV9Qb2x5bm9taWFsKDMsIENvZWZzLCBUNjApOyAgICAgICAvKiBRLjI0IHJlc3VsdCAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICAgICAgR2FpbiA9IExWTV9Qb2x5bm9taWFsKDMsIENvZWZzLCBUNjApOyAvKiBRLjI0IHJlc3VsdCAqLworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogSW50ZXJwb2xhdGUgdGhlIGdhaW4gYmV0d2VlbiBuZWFyZXN0IHJvb20gc2l6ZXMgKi8KIAotICAgICAgICAgICAgTFZNX0ZMT0FUIEdhaW4xLEdhaW4yOwotICAgICAgICAgICAgTFZNX0lOVDMyIFRvdF9EaXN0LERpc3Q7CisgICAgICAgICAgICBMVk1fRkxPQVQgR2FpbjEsIEdhaW4yOworICAgICAgICAgICAgTFZNX0lOVDMyIFRvdF9EaXN0LCBEaXN0OwogCi0gICAgICAgICAgICBUb3RfRGlzdCA9IChMVk1fVUlOVDMyKUxWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdWzBdIC0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQzMilMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4LTFdWzBdOworICAgICAgICAgICAgVG90X0Rpc3QgPSAoTFZNX1VJTlQzMilMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4XVswXSAtCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKUxWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXggLSAxXVswXTsKICAgICAgICAgICAgIERpc3QgPSBSb29tU2l6ZSAtIChMVk1fVUlOVDMyKUxWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXggLSAxXVswXTsKIAogICAgICAgICAgICAgLyogR2V0IGdhaW4gZm9yIGZpcnN0ICovCi0gICAgICAgICAgICBmb3IoaSA9IDE7IGkgPCA1OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29lZnNbaS0xXSA9IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXgtMV1baV07CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICAgICAgQ29lZnNbaSAtIDFdID0gTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleCAtIDFdW2ldOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQ29lZnNbNF0gPSAwOwogCi0gICAgICAgICAgICBHYWluMSA9IExWTV9Qb2x5bm9taWFsKDMsIENvZWZzLCBUNjApOyAgICAgIC8qIFEuMjQgcmVzdWx0ICovCisgICAgICAgICAgICBHYWluMSA9IExWTV9Qb2x5bm9taWFsKDMsIENvZWZzLCBUNjApOyAvKiBRLjI0IHJlc3VsdCAqLwogCiAgICAgICAgICAgICAvKiBHZXQgZ2FpbiBmb3Igc2Vjb25kICovCi0gICAgICAgICAgICBmb3IoaSA9IDE7IGkgPCA1OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29lZnNbaS0xXSA9IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdW2ldOworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgICAgIENvZWZzW2kgLSAxXSA9IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdW2ldOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQ29lZnNbNF0gPSAwOwogCi0gICAgICAgICAgICBHYWluMiA9IExWTV9Qb2x5bm9taWFsKDMsIENvZWZzLCBUNjApOyAgICAgIC8qIFEuMjQgcmVzdWx0ICovCisgICAgICAgICAgICBHYWluMiA9IExWTV9Qb2x5bm9taWFsKDMsIENvZWZzLCBUNjApOyAvKiBRLjI0IHJlc3VsdCAqLwogCiAgICAgICAgICAgICAvKiBMaW5lYXIgSW50ZXJwb2xhdGUgdGhlIGdhaW4gKi8KICAgICAgICAgICAgIEdhaW4gPSBHYWluMSArICgoKEdhaW4yIC0gR2FpbjEpICogRGlzdCkgLyAoVG90X0Rpc3QpKTsKQEAgLTQ2MSwzMiArMzg3LDI3IEBACiAgICAgICAgICAqIEdldCB0aGUgaW52ZXJzZSBvZiBnYWluOiBRLjE1CiAgICAgICAgICAqIEdhaW4gaXMgbW9zdGx5IGFib3ZlIG9uZSBleGNlcHQgZmV3IGNhc2VzLCB0YWtlIG9ubHkgZ2FpbnMgYWJvdmUgMQogICAgICAgICAgKi8KLSAgICAgICAgaWYoR2FpbiA8IDEpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKEdhaW4gPCAxKSB7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+R2FpbiA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+R2FpbiA9IDEgLyBHYWluOwogICAgICAgICB9CiAKICAgICAgICAgSW5kZXhfRkxPQVQgPSAxMDAuMGYgLyAoTFZNX0ZMT0FUKSgxMDAgKyBwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsKTsKICAgICAgICAgcFByaXZhdGUtPkdhaW4gPSBwUHJpdmF0ZS0+R2FpbiAqIEluZGV4X0ZMT0FUOwotICAgICAgICBwUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCA9IChwUHJpdmF0ZS0+R2FpbipJbmRleF9GTE9BVCkgLyAyOworICAgICAgICBwUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCA9IChwUHJpdmF0ZS0+R2FpbiAqIEluZGV4X0ZMT0FUKSAvIDI7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgdGhlIGFsbCBwYXNzIGNvbWIgZmlsdGVyIGNvZWZmaWNpZW50CiAgICAgICovCi0gICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuRGVuc2l0eSkgfHwKLSAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICA9PSBMVk1fVFJVRSkpCi0gICAgewotICAgICAgICBMVk1fSU5UMTYgICBpOwotICAgICAgICBMVk1fRkxPQVQgICBiID0gKExWTV9GTE9BVClwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgKiBMVlJFVl9CXzhfb25fMTAwMDsKKyAgICBpZiAoKHBQcml2YXRlLT5OZXdQYXJhbXMuRGVuc2l0eSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5EZW5zaXR5KSB8fAorICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpKSB7CisgICAgICAgIExWTV9JTlQxNiBpOworICAgICAgICBMVk1fRkxPQVQgYiA9IChMVk1fRkxPQVQpcFByaXZhdGUtPk5ld1BhcmFtcy5EZW5zaXR5ICogTFZSRVZfQl84X29uXzEwMDA7CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0uVGFyZ2V0ICAgID0gYjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0uVGFyZ2V0ID0gYjsKICAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLlRhcmdldCA9IGI7CiAgICAgICAgIH0KICAgICB9CkBAIC00OTQsMTEgKzQxNSwxMCBAQAogICAgIC8qCiAgICAgICogVXBkYXRlIHRoZSBieXBhc3MgbWl4ZXIgdGltZSBjb25zdGFudAogICAgICAqLwotICAgIGlmKChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSAgIHx8Ci0gICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICAgID09IExWTV9UUlVFKSkKLSAgICB7Ci0gICAgICAgIExWTV9VSU5UMTYgICBOdW1DaGFubmVscyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBBc3N1bWUgTU9OTyBmb3JtYXQgKi8KLSAgICAgICAgTFZNX0ZMT0FUICAgIEFscGhhOworICAgIGlmICgocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fVFJVRSkpIHsKKyAgICAgICAgTFZNX1VJTlQxNiBOdW1DaGFubmVscyA9IDE7IC8qIEFzc3VtZSBNT05PIGZvcm1hdCAqLworICAgICAgICBMVk1fRkxPQVQgQWxwaGE7CiAKICAgICAgICAgQWxwaGEgPSBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0ZFRURCQUNLTUlYRVJfVEMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwKQEAgLTUwOCw2NyArNDI4LDU1IEBACiAgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzJdLkFscGhhID0gQWxwaGE7CiAgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzNdLkFscGhhID0gQWxwaGE7CiAKLSAgICAgICAgTnVtQ2hhbm5lbHMgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsd2F5cyBzdGVyZW8gb3V0cHV0ICovCi0gICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTEgPSBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0JZUEFTU01JWEVSX1RDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwgTnVtQ2hhbm5lbHMpOworICAgICAgICBOdW1DaGFubmVscyA9IDI7IC8qIEFsd2F5cyBzdGVyZW8gb3V0cHV0ICovCisgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTEgPSBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KAorICAgICAgICAgICAgICAgIExWUkVWX0JZUEFTU01JWEVSX1RDLCBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwKKyAgICAgICAgICAgICAgICBOdW1DaGFubmVscyk7CiAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTIgPSBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQWxwaGExOwotICAgICAgICBwUHJpdmF0ZS0+R2Fpbk1peGVyLkFscGhhICAgID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLkFscGhhMTsKKyAgICAgICAgcFByaXZhdGUtPkdhaW5NaXhlci5BbHBoYSA9IHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTE7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgdGhlIGJ5cGFzcyBtaXhlciB0YXJnZXRzCiAgICAgICovCi0gICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkxldmVsKSAmJgotICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKSkKLSAgICB7Ci0gICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gKExWTV9GTE9BVCkocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCApIC8gMTAwLjBmOworICAgIGlmICgocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MZXZlbCkgJiYKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikpIHsKKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgPSAoTFZNX0ZMT0FUKShwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsKSAvIDEwMC4wZjsKICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDEgPSAweDAwMDAwMDAwOwotICAgICAgICBpZiAoKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgPT0gMCkgJiYgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9GQUxTRSkpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsID09IDApICYmIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fRkFMU0UpKSB7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQyID0gTFZNX1RSVUU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgIT0gMCkKLSAgICAgICAgeworICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAhPSAwKSB7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+YkRpc2FibGVSZXZlcmIgPSBMVk1fRkFMU0U7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuT3BlcmF0aW5nTW9kZSkKLSAgICB7Ci0gICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikKLSAgICAgICAgewotICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgPSAoTFZNX0ZMT0FUKShwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsICkgLyAxMDAuMGY7CisgICAgaWYgKHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5PcGVyYXRpbmdNb2RlKSB7CisgICAgICAgIGlmIChwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gKExWTV9GTE9BVCkocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCkgLyAxMDAuMGY7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MSA9IDB4MDAwMDAwMDA7CiAKICAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fRkFMU0U7Ci0gICAgICAgICAgICBPcGVyYXRpbmdNb2RlICAgICAgICAgICAgICAgICAgICAgID0gTFZNX01PREVfT047Ci0gICAgICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCA9PSAwKQotICAgICAgICAgICAgeworICAgICAgICAgICAgT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09OOworICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgPT0gMCkgewogICAgICAgICAgICAgICAgIHBQcml2YXRlLT5iRGlzYWJsZVJldmVyYiA9IExWTV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+YkRpc2FibGVSZXZlcmIgPSBMVk1fRkFMU0U7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX0ZBTFNFKQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSBpZiAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX0ZBTFNFKSB7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MiA9IDB4MDAwMDAwMDA7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MSA9IDB4MDAwMDAwMDA7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQyID0gTFZNX1RSVUU7Ci0gICAgICAgICAgICBwUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCAgICA9IDAuMDMxMjVmOworICAgICAgICAgICAgcFByaXZhdGUtPkdhaW5NaXhlci5UYXJnZXQgPSAwLjAzMTI1ZjsKICAgICAgICAgICAgIE9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PTjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIE9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PRkY7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKiAgSWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgdG8gQXBwbHlOZXcgc2V0dGluZ3MgZm9yY2UgdGhlIGN1cnJlbnQgdG8gdGhlIHRhcmdldCBcCiAgICAgICAgIHRvIGJlZ2luIGltbWVkaWF0ZSBwbGF5YmFjayBvZiB0aGUgZWZmZWN0ICovCi0gICAgaWYocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpCi0gICAgeworICAgIGlmIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fVFJVRSkgewogICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ3VycmVudDEgPSBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MTsKICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkN1cnJlbnQyID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDI7CiAgICAgfQpAQCAtNTgyLDggKzQ5MCw3IEBACiAgICAgLyoKICAgICAgKiBVcGRhdGUgZmxhZwogICAgICAqLwotICAgIGlmKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9UUlVFKQotICAgIHsKKyAgICBpZiAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpIHsKICAgICAgICAgcFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPSBMVk1fRkFMU0U7CiAgICAgfQogCkBAIC02MDYsMTIgKzUxMyw5IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fSU5UMzIgQnlwYXNzTWl4ZXJfQ2FsbGJhY2sgKHZvaWQgKnBDYWxsYmFja0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IEdlbmVyYWxQdXJwb3NlICkKLXsKLQotICAgIExWUkVWX0luc3RhbmNlX3N0ICAgICAqcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QgKilwQ2FsbGJhY2tEYXRhOworTFZNX0lOVDMyIEJ5cGFzc01peGVyX0NhbGxiYWNrKHZvaWQqIHBDYWxsYmFja0RhdGEsIHZvaWQqIHBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgR2VuZXJhbFB1cnBvc2UpIHsKKyAgICBMVlJFVl9JbnN0YW5jZV9zdCogcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QqKXBDYWxsYmFja0RhdGE7CiAKICAgICAvKgogICAgICAqIEF2b2lkIGJ1aWxkIHdhcm5pbmdzCkBAIC02MjMsMTEgKzUyNywxMCBAQAogICAgICAqIFR1cm4gb2ZmCiAgICAgICovCiAgICAgcExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09GRjsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+YkRpc2FibGVSZXZlcmIgICAgICAgICAgICAgID0gTFZNX1RSVUU7CisgICAgcExWUkVWX1ByaXZhdGUtPmJEaXNhYmxlUmV2ZXJiID0gTFZNX1RSVUU7CiAgICAgTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMoKExWUkVWX0hhbmRsZV90KXBDYWxsYmFja0RhdGEpOwogCiAgICAgcmV0dXJuIDA7CiB9CiAKIC8qIEVuZCBvZiBmaWxlICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0NsZWFyQXVkaW9CdWZmZXJzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0NsZWFyQXVkaW9CdWZmZXJzLmNwcAppbmRleCA1ODY1MzlmLi5iZTM1MDVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMuY3BwCkBAIC00MSwxNyArNDEsMTQgQEAKIC8qICAxLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9DbGVhckF1ZGlvQnVmZmVycyhMVlJFVl9IYW5kbGVfdCAgaEluc3RhbmNlKQotewotCi0gICBMVlJFVl9JbnN0YW5jZV9zdCAgICAgKnBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0ICopaEluc3RhbmNlOworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0NsZWFyQXVkaW9CdWZmZXJzKExWUkVWX0hhbmRsZV90IGhJbnN0YW5jZSkgeworICAgIExWUkVWX0luc3RhbmNlX3N0KiBwTFZSRVZfUHJpdmF0ZSA9IChMVlJFVl9JbnN0YW5jZV9zdCopaEluc3RhbmNlOwogCiAgICAgLyoKICAgICAgKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucwogICAgICAqLwogICAgIC8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzICovCi0gICAgaWYoaEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKKyAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKSB7CiAgICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKICAgICB9CiAKQEAgLTU5LDM4ICs1NiwxMiBAQAogICAgICAqIENsZWFyIGFsbCBmaWx0ZXIgdGFwIGRhdGEsIGRlbGF5LWxpbmVzIGFuZCBvdGhlciBzaWduYWwgcmVsYXRlZCBkYXRhCiAgICAgICovCiAKLSAgICBMb2FkQ29uc3RfRmxvYXQoMCwKLSAgICAgICAgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5IUFRhcHMsCi0gICAgICAgIDIpOwotICAgIExvYWRDb25zdF9GbG9hdCgwLAotICAgICAgICAoTFZNX0ZMT0FUICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPkxQVGFwcywKLSAgICAgICAgMik7Ci0gICAgaWYoKExWTV9VSU5UMTYpcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCi0gICAgewotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbM10sIDIpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMl0sIDIpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMV0sIDIpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOwotCi0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbM10sIExWUkVWX01BWF9UM19ERUxBWSk7Ci0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMl0sIExWUkVWX01BWF9UMl9ERUxBWSk7Ci0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0sIExWUkVWX01BWF9UMV9ERUxBWSk7Ci0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIExWUkVWX01BWF9UMF9ERUxBWSk7Ci0gICAgfQotCi0gICAgaWYoKExWTV9VSU5UMTYpcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA+PSBMVlJFVl9ERUxBWUxJTkVTXzIpCi0gICAgewotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMV0sIDIpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOwotCi0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0sIExWUkVWX01BWF9UMV9ERUxBWSk7Ci0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIExWUkVWX01BWF9UMF9ERUxBWSk7Ci0gICAgfQotCi0gICAgaWYoKExWTV9VSU5UMTYpcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA+PSBMVlJFVl9ERUxBWUxJTkVTXzEpCi0gICAgewotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCBMVlJFVl9NQVhfVDBfREVMQVkpOworICAgIHBMVlJFVl9Qcml2YXRlLT5wUmV2SFBGQmlxdWFkLT5jbGVhcigpOworICAgIHBMVlJFVl9Qcml2YXRlLT5wUmV2TFBGQmlxdWFkLT5jbGVhcigpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5czsgaSsrKSB7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5yZXZMUEZCaXF1YWRbaV0tPmNsZWFyKCk7CisgICAgICAgIG1lbXNldChwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbaV0sIDAsIExWUkVWX01BWF9UX0RFTEFZW2ldICoKKyAgICAgICAgICAgICAgICBzaXplb2YocExWUkVWX1ByaXZhdGUtPnBEZWxheV9UW2ldWzBdKSk7CiAgICAgfQogICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMuY3BwCmluZGV4IGUwYjAxNDIuLmY4NThiNzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycy5jcHAKQEAgLTQyLDE3ICs0MiwxNCBAQAogLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZSRVZfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKExWUkVWX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICpwQ29udHJvbFBhcmFtcykKLXsKLQotICAgIExWUkVWX0luc3RhbmNlX3N0ICAqcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QgKiloSW5zdGFuY2U7CitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMoTFZSRVZfSGFuZGxlX3QgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QqIHBDb250cm9sUGFyYW1zKSB7CisgICAgTFZSRVZfSW5zdGFuY2Vfc3QqIHBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0KiloSW5zdGFuY2U7CiAKICAgICAvKgogICAgICAqIENoZWNrIGZvciBlcnJvciBjb25kaXRpb25zCiAgICAgICovCi0gICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBDb250cm9sUGFyYW1zID09IExWTV9OVUxMKSkKLSAgICB7CisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwQ29udHJvbFBhcmFtcyA9PSBMVk1fTlVMTCkpIHsKICAgICAgICAgcmV0dXJuIExWUkVWX05VTExBRERSRVNTOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUuY3BwCmluZGV4IDY4Zjg4M2EuLjNhNjM2OTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRJbnN0YW5jZUhhbmRsZS5jcHAKQEAgLTIxLDcgKzIxLDYgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSAiTFZSRVZfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkluc3RBbGxvYy5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzQsNyArMzMsNiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBwaEluc3RhbmNlICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgcEluc3RhbmNlUGFyYW1zICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00NSwyMDEgKzQzLDcyIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUoTFZSRVZfSGFuZGxlX3QgICAgICAgICAgICAqcGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NZW1vcnlUYWJsZV9zdCAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3QgICAqcEluc3RhbmNlUGFyYW1zKQotewotCi0gICAgSU5TVF9BTExPQyAgICAgICAgICAgICAgU2xvd0RhdGE7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICAgICAgRmFzdERhdGE7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICAgICAgRmFzdENvZWY7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICAgICAgVGVtcG9yYXJ5OwotICAgIExWUkVWX0luc3RhbmNlX3N0ICAgICAgICpwTFZSRVZfUHJpdmF0ZTsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBpOwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZTsKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9HZXRJbnN0YW5jZUhhbmRsZShMVlJFVl9IYW5kbGVfdCogcGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9JbnN0YW5jZVBhcmFtc19zdCogcEluc3RhbmNlUGFyYW1zKSB7CisgICAgTFZSRVZfSW5zdGFuY2Vfc3QqIHBMVlJFVl9Qcml2YXRlOworICAgIExWTV9JTlQxNiBpOworICAgIExWTV9VSU5UMTYgTWF4QmxvY2tTaXplOwogCiAgICAgLyoKICAgICAgKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucwogICAgICAqLwogICAgIC8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzICovCi0gICAgaWYoKHBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpIHx8IChwSW5zdGFuY2VQYXJhbXMgPT0gTFZNX05VTEwpKQotICAgIHsKKyAgICBpZiAoKHBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5zdGFuY2VQYXJhbXMgPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKICAgICB9Ci0gICAgLyogQ2hlY2sgdGhlIG1lbW9yeSB0YWJsZSBmb3IgTlVMTCBwb2ludGVycyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBMVlJFVl9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLlNpemUhPTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3M9PUxWTV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybihMVlJFVl9OVUxMQUREUkVTUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKgogICAgICAqIENoZWNrIGFsbCBpbnN0YW5jZSBwYXJhbWV0ZXJzIGFyZSBpbiByYW5nZQogICAgICAqLwogICAgIC8qIENoZWNrIGZvciBhIG5vbi16ZXJvIGJsb2NrIHNpemUgKi8KLSAgICBpZiAocEluc3RhbmNlUGFyYW1zLT5NYXhCbG9ja1NpemUgPT0gMCkKLSAgICB7CisgICAgaWYgKHBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplID09IDApIHsKICAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7CiAgICAgfQogCiAgICAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgbnVtYmVyIG9mIGRlbGF5IGxpbmVzICovCi0gICAgaWYgKChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyAhPSBMVlJFVl9ERUxBWUxJTkVTXzEpJiYKLSAgICAgICAgKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzICE9IExWUkVWX0RFTEFZTElORVNfMikmJgotICAgICAgICAocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgIT0gTFZSRVZfREVMQVlMSU5FU180KSkKLSAgICB7CisgICAgaWYgKChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyAhPSBMVlJFVl9ERUxBWUxJTkVTXzEpICYmCisgICAgICAgIChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyAhPSBMVlJFVl9ERUxBWUxJTkVTXzIpICYmCisgICAgICAgIChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyAhPSBMVlJFVl9ERUxBWUxJTkVTXzQpKSB7CiAgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOwogICAgIH0KIAogICAgIC8qCi0gICAgICogSW5pdGlhbGlzZSB0aGUgSW5zdEFsbG9jIGluc3RhbmNlcwotICAgICAqLwotICAgIEluc3RBbGxvY19Jbml0KCZTbG93RGF0YSwgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzKTsKLSAgICBJbnN0QWxsb2NfSW5pdCgmRmFzdERhdGEsICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzcyk7Ci0gICAgSW5zdEFsbG9jX0luaXQoJkZhc3RDb2VmLCAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MpOwotICAgIEluc3RBbGxvY19Jbml0KCZUZW1wb3JhcnksIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzKTsKLQotICAgIC8qCi0gICAgICogWmVybyBhbGwgbWVtb3J5IHJlZ2lvbnMKLSAgICAgKi8KLSAgICBMb2FkQ29uc3RfRmxvYXQoMCwKLSAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplKSAvIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSkpOwotICAgIExvYWRDb25zdF9GbG9hdCgwLAotICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpIC8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKSk7Ci0gICAgTG9hZENvbnN0X0Zsb2F0KDAsCi0gICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSkgLyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsKLSAgICBMb2FkQ29uc3RfRmxvYXQoMCwKLSAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5TaXplKSAvIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSkpOwotICAgIC8qCiAgICAgICogU2V0IHRoZSBpbnN0YW5jZSBoYW5kbGUgaWYgbm90IGFscmVhZHkgaW5pdGlhbGlzZWQKICAgICAgKi8KLSAgICBpZiAoKnBoSW5zdGFuY2UgPT0gTFZNX05VTEwpCi0gICAgewotICAgICAgICAqcGhJbnN0YW5jZSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJlNsb3dEYXRhLCBzaXplb2YoTFZSRVZfSW5zdGFuY2Vfc3QpKTsKKyAgICBpZiAoKnBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgKnBoSW5zdGFuY2UgPSBuZXcgTFZSRVZfSW5zdGFuY2Vfc3R7fTsKICAgICB9Ci0gICAgcExWUkVWX1ByaXZhdGUgICAgICAgICAgICAgID0oTFZSRVZfSW5zdGFuY2Vfc3QgKikqcGhJbnN0YW5jZTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+TWVtb3J5VGFibGUgPSAqcE1lbW9yeVRhYmxlOworICAgIHBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0KikqcGhJbnN0YW5jZTsKIAotICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09TFZSRVZfREVMQVlMSU5FU180KQotICAgIHsKLSAgICAgICAgTWF4QmxvY2tTaXplID0gTFZSRVZfTUFYX0FQM19ERUxBWTsKLSAgICB9Ci0gICAgZWxzZSBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PUxWUkVWX0RFTEFZTElORVNfMikKLSAgICB7Ci0gICAgICAgIE1heEJsb2NrU2l6ZSA9IExWUkVWX01BWF9BUDFfREVMQVk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE1heEJsb2NrU2l6ZSA9IExWUkVWX01BWF9BUDBfREVMQVk7CisgICAgaWYgKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkgeworICAgICAgICBNYXhCbG9ja1NpemUgPSBMVlJFVl9NQVhfQVBfREVMQVlbM107CisgICAgfSBlbHNlIGlmIChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpIHsKKyAgICAgICAgTWF4QmxvY2tTaXplID0gTFZSRVZfTUFYX0FQX0RFTEFZWzFdOworICAgIH0gZWxzZSB7CisgICAgICAgIE1heEJsb2NrU2l6ZSA9IExWUkVWX01BWF9BUF9ERUxBWVswXTsKICAgICB9CiAKLSAgICBpZihNYXhCbG9ja1NpemU+cEluc3RhbmNlUGFyYW1zLT5NYXhCbG9ja1NpemUpCi0gICAgewotICAgICAgICBNYXhCbG9ja1NpemU9cEluc3RhbmNlUGFyYW1zLT5NYXhCbG9ja1NpemU7CisgICAgaWYgKE1heEJsb2NrU2l6ZSA+IHBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplKSB7CisgICAgICAgIE1heEJsb2NrU2l6ZSA9IHBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplOwogICAgIH0KIAogICAgIC8qCiAgICAgICogU2V0IHRoZSBkYXRhLCBjb2VmZmljaWVudCBhbmQgdGVtcG9yYXJ5IG1lbW9yeSBwb2ludGVycwogICAgICAqLwotICAgIC8qIEZhc3QgZGF0YSBtZW1vcnkgYmFzZSBhZGRyZXNzICovCi0gICAgcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YSA9IChMVlJFVl9GYXN0RGF0YV9zdCAqKQotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgc2l6ZW9mKExWUkVWX0Zhc3REYXRhX3N0KSk7Ci0gICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQotICAgIHsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdICAgICA9Ci0gICAgICAgICAgICAoTFZNX0ZMT0FUICopSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UM19ERUxBWSAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMl0gICAgID0KLSAgICAgICAgICAgIChMVk1fRkxPQVQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QyX0RFTEFZICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSAgICAgPQotICAgICAgICAgICAgKExWTV9GTE9BVCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDFfREVMQVkgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICAgICA9Ci0gICAgICAgICAgICAoTFZNX0ZMT0FUICopSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOwotCi0gICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyogU2NyYXRjaCBmb3IgZWFjaCBkZWxheSBsaW5lIG91dHB1dCAqLwotICAgICAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lW2ldID0gKExWTV9GTE9BVCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdLCBMVlJFVl9NQVhfVDNfREVMQVkpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzJdLCBMVlJFVl9NQVhfVDJfREVMQVkpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdLCBMVlJFVl9NQVhfVDFfREVMQVkpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCBMVlJFVl9NQVhfVDBfREVMQVkpOwotICAgIH0KLQotICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKLSAgICB7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSAgPSAoTFZNX0ZMT0FUICopCi0gICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMV9ERUxBWSAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0gID0gKExWTV9GTE9BVCAqKQotICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKLQotICAgICAgICBmb3IoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFNjcmF0Y2ggZm9yIGVhY2ggZGVsYXkgbGluZSBvdXRwdXQgKi8KLSAgICAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtpXSA9IChMVk1fRkxPQVQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDFfREVMQVkpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7Ci0gICAgfQotCi0gICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18xKQotICAgIHsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICA9IChMVk1fRkxPQVQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOwotCi0gICAgICAgIGZvcihpID0gMDsgaSA8IDE7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyogU2NyYXRjaCBmb3IgZWFjaCBkZWxheSBsaW5lIG91dHB1dCAqLwotICAgICAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lW2ldID0gKExWTV9GTE9BVCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5czsgaSsrKSB7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFtpXSA9IChMVk1fRkxPQVQqKWNhbGxvYyhMVlJFVl9NQVhfVF9ERUxBWVtpXSwgc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICAvKiBTY3JhdGNoIGZvciBlYWNoIGRlbGF5IGxpbmUgb3V0cHV0ICovCisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtpXSA9IChMVk1fRkxPQVQqKWNhbGxvYyhNYXhCbG9ja1NpemUsIHNpemVvZihMVk1fRkxPQVQpKTsKICAgICB9CiAgICAgLyogQWxsLXBhc3MgZGVsYXkgYnVmZmVyIGFkZHJlc3NlcyBhbmQgc2l6ZXMgKi8KLSAgICBwTFZSRVZfUHJpdmF0ZS0+VFswXSAgICAgICAgID0gTFZSRVZfTUFYX1QwX0RFTEFZOwotICAgIHBMVlJFVl9Qcml2YXRlLT5UWzFdICAgICAgICAgPSBMVlJFVl9NQVhfVDFfREVMQVk7Ci0gICAgcExWUkVWX1ByaXZhdGUtPlRbMl0gICAgICAgICA9IExWUkVWX01BWF9UMl9ERUxBWTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+VFszXSAgICAgICAgID0gTFZSRVZfTUFYX1QzX0RFTEFZOwotICAgIHBMVlJFVl9Qcml2YXRlLT5BQl9TZWxlY3Rpb24gPSAxOyAgICAgICAvKiBTZWxlY3Qgc21vb3RoaW5nIEEgdG8gQiAqLworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTFZSRVZfREVMQVlMSU5FU180OyBpKyspIHsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPlRbaV0gPSBMVlJFVl9NQVhfVF9ERUxBWVtpXTsKKyAgICB9CisgICAgcExWUkVWX1ByaXZhdGUtPkFCX1NlbGVjdGlvbiA9IDE7IC8qIFNlbGVjdCBzbW9vdGhpbmcgQSB0byBCICovCiAKLSAgICAvKiBGYXN0IGNvZWZmaWNpZW50IG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KLSAgICBwTFZSRVZfUHJpdmF0ZS0+cEZhc3RDb2VmICAgICAgID0KLSAgICAgICAgKExWUkVWX0Zhc3RDb2VmX3N0ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdENvZWYsIHNpemVvZihMVlJFVl9GYXN0Q29lZl9zdCkpOwogICAgIC8qIEdlbmVyYWwgcHVycG9zZSBzY3JhdGNoICovCi0gICAgcExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoICAgICAgICA9Ci0gICAgICAgICAgICAoTFZNX0ZMT0FUICopSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOworICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaCA9IChMVk1fRkxPQVQqKWNhbGxvYyhNYXhCbG9ja1NpemUsIHNpemVvZihMVk1fRkxPQVQpKTsKICAgICAvKiBNb25vLT5zdGVyZW8gaW5wdXQgc2F2ZSBmb3IgZW5kIG1peCAqLwotICAgIHBMVlJFVl9Qcml2YXRlLT5wSW5wdXRTYXZlICAgICAgPQotICAgICAgICAgICAgKExWTV9GTE9BVCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgMiAqIHNpemVvZihMVk1fRkxPQVQpICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZSk7Ci0gICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wSW5wdXRTYXZlLCAoTFZNX0lOVDE2KShNYXhCbG9ja1NpemUgKiAyKSk7CisgICAgcExWUkVWX1ByaXZhdGUtPnBJbnB1dFNhdmUgPSAoTFZNX0ZMT0FUKiljYWxsb2MoRkNDXzIgKiBNYXhCbG9ja1NpemUsIHNpemVvZihMVk1fRkxPQVQpKTsKIAogICAgIC8qCiAgICAgICogU2F2ZSB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycyBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlCkBAIC0yNDksMTA1ICsxMTgsMTUzIEBACiAgICAgLyoKICAgICAgKiBTZXQgdGhlIHBhcmFtZXRlcnMgdG8gaW52YWxpZAogICAgICAqLwotICAgIHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUgICAgPSBMVk1fRlNfSU5WQUxJRDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlID0gTFZNX0ZTX0lOVkFMSUQ7CiAgICAgcExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX0RVTU1ZOwotICAgIHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLlNvdXJjZUZvcm1hdCAgPSBMVk1fU09VUkNFX0RVTU1ZOworICAgIHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWTV9TT1VSQ0VfRFVNTVk7CiAKLSAgICBwTFZSRVZfUHJpdmF0ZS0+YkNvbnRyb2xQZW5kaW5nICAgICAgICAgICAgID0gTFZNX0ZBTFNFOwotICAgIHBMVlJFVl9Qcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICAgICAgICAgPSBMVk1fVFJVRTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+YkRpc2FibGVSZXZlcmIgICAgICAgICAgICAgID0gTFZNX0ZBTFNFOworICAgIHBMVlJFVl9Qcml2YXRlLT5iQ29udHJvbFBlbmRpbmcgPSBMVk1fRkFMU0U7CisgICAgcExWUkVWX1ByaXZhdGUtPmJGaXJzdENvbnRyb2wgPSBMVk1fVFJVRTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+YkRpc2FibGVSZXZlcmIgPSBMVk1fRkFMU0U7CiAKICAgICAvKgogICAgICAqIFNldCBtaXhlciBwYXJhbWV0ZXJzCiAgICAgICovCi0gICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLkNhbGxiYWNrUGFyYW0yICAgICAgPSAwOwotICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5wQ2FsbGJhY2tIYW5kbGUyICAgID0gcExWUkVWX1ByaXZhdGU7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLnBHZW5lcmFsUHVycG9zZTIgICAgPSBMVk1fTlVMTDsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIucENhbGxCYWNrMiAgICAgICAgICA9IEJ5cGFzc01peGVyX0NhbGxiYWNrOwotICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgICAgICAgID0gTFZNX0ZBTFNFOwotICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DdXJyZW50MiAgICAgICAgICAgID0gMDsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MiAgICAgICAgICAgICA9IDA7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLkNhbGxiYWNrUGFyYW0xICAgICAgPSAwOwotICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5wQ2FsbGJhY2tIYW5kbGUxICAgID0gTFZNX05VTEw7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLnBHZW5lcmFsUHVycG9zZTEgICAgPSBMVk1fTlVMTDsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIucENhbGxCYWNrMSAgICAgICAgICA9IExWTV9OVUxMOwotICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDEgICAgICAgID0gTFZNX0ZBTFNFOwotICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DdXJyZW50MSAgICAgICAgICAgID0gMHgwMDAwMDAwMDsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MSAgICAgICAgICAgICA9IDB4MDAwMDAwMDA7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLkNhbGxiYWNrUGFyYW0yID0gMDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIucENhbGxiYWNrSGFuZGxlMiA9IHBMVlJFVl9Qcml2YXRlOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5wR2VuZXJhbFB1cnBvc2UyID0gTFZNX05VTEw7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLnBDYWxsQmFjazIgPSBCeXBhc3NNaXhlcl9DYWxsYmFjazsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQyID0gTFZNX0ZBTFNFOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DdXJyZW50MiA9IDA7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgPSAwOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1BhcmFtMSA9IDA7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLnBDYWxsYmFja0hhbmRsZTEgPSBMVk1fTlVMTDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIucEdlbmVyYWxQdXJwb3NlMSA9IExWTV9OVUxMOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5wQ2FsbEJhY2sxID0gTFZNX05VTEw7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLkNhbGxiYWNrU2V0MSA9IExWTV9GQUxTRTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ3VycmVudDEgPSAweDAwMDAwMDAwOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQxID0gMHgwMDAwMDAwMDsKIAotICAgIHBMVlJFVl9Qcml2YXRlLT5Sb29tU2l6ZUlubXMgICAgICAgICAgICAgICAgICAgID0gMTAwOyAgLy8gMTAwIG1zZWMKKyAgICBwTFZSRVZfUHJpdmF0ZS0+Um9vbVNpemVJbm1zID0gMTAwOyAgLy8gMTAwIG1zZWMKIAogICAgIC8qCiAgICAgICogIFNldCB0aGUgb3V0cHV0IGdhaW4gbWl4ZXIgcGFyYW1ldGVycwogICAgICAqLwotICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIuQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLnBDYWxsYmFja0hhbmRsZSAgICA9IExWTV9OVUxMOwotICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIucEdlbmVyYWxQdXJwb3NlICAgID0gTFZNX05VTEw7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fTlVMTDsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLkNhbGxiYWNrU2V0ICAgICAgICA9IExWTV9GQUxTRTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLkN1cnJlbnQgICAgICAgICAgICA9IDAuMDMxMjVmOy8vMHgwM2ZmZmZmZjsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCAgICAgICAgICAgICA9IDAuMDMxMjVmOy8vMHgwM2ZmZmZmZjsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLkNhbGxiYWNrUGFyYW0gPSAwOworICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CisgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5wR2VuZXJhbFB1cnBvc2UgPSBMVk1fTlVMTDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLnBDYWxsQmFjayA9IExWTV9OVUxMOworICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIuQ2FsbGJhY2tTZXQgPSBMVk1fRkFMU0U7CisgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5DdXJyZW50ID0gMC4wMzEyNWY7ICAvLyAweDAzZmZmZmZmOworICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIuVGFyZ2V0ID0gMC4wMzEyNWY7ICAgLy8gMHgwM2ZmZmZmZjsKIAogICAgIC8qCiAgICAgICogU2V0IHRoZSBBbGwtUGFzcyBGaWx0ZXIgbWl4ZXJzCiAgICAgICovCi0gICAgZm9yIChpPTA7IGk8NDsgaSsrKQotICAgIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wT2Zmc2V0QVtpXSA9IHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFtpXTsKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBPZmZzZXRCW2ldID0gcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UW2ldOwogICAgICAgICAvKiBEZWxheSB0YXAgc2VsZWN0aW9uIG1peGVyICovCi0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ2FsbGJhY2tQYXJhbTIgICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ2FsbGJhY2tQYXJhbTIgPSAwOwogICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLnBDYWxsYmFja0hhbmRsZTIgPSBMVk1fTlVMTDsKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5wR2VuZXJhbFB1cnBvc2UyID0gTFZNX05VTEw7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0ucENhbGxCYWNrMiAgICAgICA9IExWTV9OVUxMOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrU2V0MiAgICAgPSBMVk1fRkFMU0U7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ3VycmVudDIgICAgICAgICA9IDA7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MiAgICAgICAgICA9IDA7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ2FsbGJhY2tQYXJhbTEgICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0ucENhbGxCYWNrMiA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrU2V0MiA9IExWTV9GQUxTRTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5DdXJyZW50MiA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MiA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ2FsbGJhY2tQYXJhbTEgPSAwOwogICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLnBDYWxsYmFja0hhbmRsZTEgPSBMVk1fTlVMTDsKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5wR2VuZXJhbFB1cnBvc2UxID0gTFZNX05VTEw7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0ucENhbGxCYWNrMSAgICAgICA9IExWTV9OVUxMOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrU2V0MSAgICAgPSBMVk1fRkFMU0U7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ3VycmVudDEgICAgICAgICA9IDA7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MSAgICAgICAgICA9IDE7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0ucENhbGxCYWNrMSA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrU2V0MSA9IExWTV9GQUxTRTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5DdXJyZW50MSA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MSA9IDE7CiAgICAgICAgIC8qIEZlZWRmb3J3YXJkIG1peGVyICovCi0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLkNhbGxiYWNrUGFyYW0gICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLkNhbGxiYWNrUGFyYW0gPSAwOwogICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0ucEdlbmVyYWxQdXJwb3NlID0gTFZNX05VTEw7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLnBDYWxsQmFjayAgICAgICA9IExWTV9OVUxMOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5DYWxsYmFja1NldCAgICAgPSBMVk1fRkFMU0U7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLkN1cnJlbnQgICAgICAgICA9IDA7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLlRhcmdldCAgICAgICAgICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLnBDYWxsQmFjayA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5DYWxsYmFja1NldCA9IExWTV9GQUxTRTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQ3VycmVudCA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLlRhcmdldCA9IDA7CiAgICAgICAgIC8qIEZlZWRiYWNrIG1peGVyICovCi0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLkNhbGxiYWNrUGFyYW0gICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLkNhbGxiYWNrUGFyYW0gPSAwOwogICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0ucEdlbmVyYWxQdXJwb3NlID0gTFZNX05VTEw7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLnBDYWxsQmFjayAgICAgICA9IExWTV9OVUxMOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5DYWxsYmFja1NldCAgICAgPSBMVk1fRkFMU0U7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLkN1cnJlbnQgICAgICAgICA9IDA7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLlRhcmdldCAgICAgICAgICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLnBDYWxsQmFjayA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5DYWxsYmFja1NldCA9IExWTV9GQUxTRTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0uQ3VycmVudCA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLlRhcmdldCA9IDA7CiAgICAgICAgIC8qIEZlZWRiYWNrIGdhaW4gbWl4ZXIgKi8KLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbaV0uQ2FsbGJhY2tQYXJhbSAgICA9IDA7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLnBDYWxsYmFja0hhbmRsZSAgPSBMVk1fTlVMTDsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbaV0ucEdlbmVyYWxQdXJwb3NlICA9IExWTV9OVUxMOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5wQ2FsbEJhY2sgICAgICAgID0gTFZNX05VTEw7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLkNhbGxiYWNrU2V0ICAgICAgPSBMVk1fRkFMU0U7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLkN1cnJlbnQgICAgICAgICAgPSAwOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5UYXJnZXQgICAgICAgICAgID0gMDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbaV0uQ2FsbGJhY2tQYXJhbSA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5wR2VuZXJhbFB1cnBvc2UgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbaV0ucENhbGxCYWNrID0gTFZNX05VTEw7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLkNhbGxiYWNrU2V0ID0gTFZNX0ZBTFNFOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5DdXJyZW50ID0gMDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbaV0uVGFyZ2V0ID0gMDsKICAgICB9CiAgICAgLyogRGVsYXkgdGFwIGluZGV4ICovCi0gICAgcExWUkVWX1ByaXZhdGUtPkFfRGVsYXlTaXplWzBdID0gTFZSRVZfTUFYX0FQMF9ERUxBWTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+Ql9EZWxheVNpemVbMF0gPSBMVlJFVl9NQVhfQVAwX0RFTEFZOwotICAgIHBMVlJFVl9Qcml2YXRlLT5BX0RlbGF5U2l6ZVsxXSA9IExWUkVWX01BWF9BUDFfREVMQVk7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkJfRGVsYXlTaXplWzFdID0gTFZSRVZfTUFYX0FQMV9ERUxBWTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QV9EZWxheVNpemVbMl0gPSBMVlJFVl9NQVhfQVAyX0RFTEFZOwotICAgIHBMVlJFVl9Qcml2YXRlLT5CX0RlbGF5U2l6ZVsyXSA9IExWUkVWX01BWF9BUDJfREVMQVk7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkFfRGVsYXlTaXplWzNdID0gTFZSRVZfTUFYX0FQM19ERUxBWTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+Ql9EZWxheVNpemVbM10gPSBMVlJFVl9NQVhfQVAzX0RFTEFZOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTFZSRVZfREVMQVlMSU5FU180OyBpKyspIHsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPkFfRGVsYXlTaXplW2ldID0gTFZSRVZfTUFYX0FQX0RFTEFZW2ldOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+Ql9EZWxheVNpemVbaV0gPSBMVlJFVl9NQVhfQVBfREVMQVlbaV07CisgICAgfQorCisgICAgcExWUkVWX1ByaXZhdGUtPnBSZXZIUEZCaXF1YWQucmVzZXQoCisgICAgICAgICAgICBuZXcgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxMVk1fRkxPQVQ+KExWTV9NQVhfQ0hBTk5FTFMpKTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+cFJldkxQRkJpcXVhZC5yZXNldCgKKyAgICAgICAgICAgIG5ldyBhbmRyb2lkOjphdWRpb191dGlsczo6QmlxdWFkRmlsdGVyPExWTV9GTE9BVD4oTFZNX01BWF9DSEFOTkVMUykpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTFZSRVZfREVMQVlMSU5FU180OyBpKyspIHsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnJldkxQRkJpcXVhZFtpXS5yZXNldCgKKyAgICAgICAgICAgICAgICBuZXcgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxMVk1fRkxPQVQ+KExWTV9NQVhfQ0hBTk5FTFMpKTsKKyAgICB9CiAKICAgICBMVlJFVl9DbGVhckF1ZGlvQnVmZmVycygqcGhJbnN0YW5jZSk7CiAKICAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlJFVl9GcmVlSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZnJlZSB0aGUgaW50ZXJuYWwgYWxsb2NhdGlvbnMgb2YgdGhlIG1vZHVsZS4gICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9TVUNDRVNTICAgICAgICAgIGZyZWUgaW5zdGFuY2Ugc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX05VTExBRERSRVNTICAgICAgSW5zdGFuY2UgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0ZyZWVJbnN0YW5jZShMVlJFVl9IYW5kbGVfdCBoSW5zdGFuY2UpIHsKKyAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICBMVlJFVl9JbnN0YW5jZV9zdCogcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QqKWhJbnN0YW5jZTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5czsgaSsrKSB7CisgICAgICAgIGlmIChwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbaV0pIHsKKyAgICAgICAgICAgIGZyZWUocExWUkVWX1ByaXZhdGUtPnBEZWxheV9UW2ldKTsKKyAgICAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFtpXSA9IExWTV9OVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbaV0pIHsKKyAgICAgICAgICAgIGZyZWUocExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lW2ldKTsKKyAgICAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtpXSA9IExWTV9OVUxMOworICAgICAgICB9CisgICAgfQorICAgIGlmIChwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2gpIHsKKyAgICAgICAgZnJlZShwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2gpOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2ggPSBMVk1fTlVMTDsKKyAgICB9CisgICAgaWYgKHBMVlJFVl9Qcml2YXRlLT5wSW5wdXRTYXZlKSB7CisgICAgICAgIGZyZWUocExWUkVWX1ByaXZhdGUtPnBJbnB1dFNhdmUpOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cElucHV0U2F2ZSA9IExWTV9OVUxMOworICAgIH0KKworICAgIGRlbGV0ZSBwTFZSRVZfUHJpdmF0ZTsKKyAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKK30KIC8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OTkzM2MuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0TWVtb3J5VGFibGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAiTFZSRVZfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkluc3RBbGxvYy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWUkVWX0dldE1lbW9yeVRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCi0vKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCBhbGxvY2F0ZWQgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgYWRkcmVzc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICAgKi8KLS8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICAgKi8KLS8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcEluc3RhbmNlUGFyYW1zICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZSRVZfU3VjY2VzcyAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIHBNZW1vcnlUYWJsZSBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUkVWX05VTExBRERSRVNTICAgICAgIFdoZW4gcmVxdWVzdGluZyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCBwSW5zdGFuY2VQYXJhbXMgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVlJFVl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfR2V0TWVtb3J5VGFibGUoTFZSRVZfSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NZW1vcnlUYWJsZV9zdCAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9JbnN0YW5jZVBhcmFtc19zdCAgKnBJbnN0YW5jZVBhcmFtcykKLXsKLQotICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIFNsb3dEYXRhOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIEZhc3REYXRhOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIEZhc3RDb2VmOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIFRlbXBvcmFyeTsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBpOwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZTsKLQotICAgIC8qCi0gICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKLSAgICAgKi8KLSAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVyICovCi0gICAgaWYgKHBNZW1vcnlUYWJsZSA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlJFVl9OVUxMQUREUkVTUyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDaGVjayBhbGwgaW5zdGFuY2UgcGFyYW1ldGVycyBhcmUgaW4gcmFuZ2UKLSAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlUGFyYW1zICE9IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogQ2FsbCBmb3IgbWVtb3J5IGFsbG9jYXRpb24sIHNvIGNoZWNrIHRoZSBwYXJhbWV0ZXJzCi0gICAgICAgICAqLwotICAgICAgICAvKiBDaGVjayBmb3IgYSBub24temVybyBibG9jayBzaXplICovCi0gICAgICAgIGlmIChwSW5zdGFuY2VQYXJhbXMtPk1heEJsb2NrU2l6ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIG51bWJlciBvZiBkZWxheSBsaW5lcyAqLwotICAgICAgICBpZiAoKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzICE9IExWUkVWX0RFTEFZTElORVNfMSkgJiYKLSAgICAgICAgICAgIChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyAhPSBMVlJFVl9ERUxBWUxJTkVTXzIpICYmCi0gICAgICAgICAgICAocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgIT0gTFZSRVZfREVMQVlMSU5FU180KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEluaXRpYWxpc2UgdGhlIEluc3RBbGxvYyBpbnN0YW5jZXMKLSAgICAgKi8KLSAgICBJbnN0QWxsb2NfSW5pdCgmU2xvd0RhdGEsICAodm9pZCAqKUxWTV9OVUxMKTsKLSAgICBJbnN0QWxsb2NfSW5pdCgmRmFzdERhdGEsICAodm9pZCAqKUxWTV9OVUxMKTsKLSAgICBJbnN0QWxsb2NfSW5pdCgmRmFzdENvZWYsICAodm9pZCAqKUxWTV9OVUxMKTsKLSAgICBJbnN0QWxsb2NfSW5pdCgmVGVtcG9yYXJ5LCAodm9pZCAqKUxWTV9OVUxMKTsKLQotICAgIC8qCi0gICAgICogRmlsbCBpbiB0aGUgbWVtb3J5IHRhYmxlCi0gICAgICovCi0gICAgaWYgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENoZWNrIGZvciBudWxsIHBvaW50ZXJzCi0gICAgICAgICAqLwotICAgICAgICBpZiAocEluc3RhbmNlUGFyYW1zID09IExWTV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4oTFZSRVZfTlVMTEFERFJFU1MpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2VsZWN0IHRoZSBtYXhpbXVtIGludGVybmFsIGJsb2NrIHNpemUKLSAgICAgICAgICovCi0gICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09TFZSRVZfREVMQVlMSU5FU180KQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXhCbG9ja1NpemUgPSBMVlJFVl9NQVhfQVAzX0RFTEFZOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT1MVlJFVl9ERUxBWUxJTkVTXzIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1heEJsb2NrU2l6ZSA9IExWUkVWX01BWF9BUDFfREVMQVk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXhCbG9ja1NpemUgPSBMVlJFVl9NQVhfQVAwX0RFTEFZOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoTWF4QmxvY2tTaXplPnBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXhCbG9ja1NpemU9cEluc3RhbmNlUGFyYW1zLT5NYXhCbG9ja1NpemU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBTbG93IGRhdGEgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZTbG93RGF0YSwgc2l6ZW9mKExWUkVWX0luc3RhbmNlX3N0KSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZTbG93RGF0YSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFBlcnNpc3RlbnQgZmFzdCBkYXRhIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIHNpemVvZihMVlJFVl9GYXN0RGF0YV9zdCkpOwotICAgICAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDNfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0gICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QyX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOwotICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMV9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDFfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0gICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18xKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkZhc3REYXRhKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEE7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogUGVyc2lzdGVudCBmYXN0IGNvZWZmaWNpZW50IG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdENvZWYsIHNpemVvZihMVlJFVl9GYXN0Q29lZl9zdCkpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmRmFzdENvZWYpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlR5cGUgICAgICAgICA9IExWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRjsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBUZW1wb3JhcnkgZmFzdCBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIC8qIEdlbmVyYWwgcHVycG9zZSBzY3JhdGNoIG1lbW9yeSAqLwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fRkxPQVQpICogTWF4QmxvY2tTaXplKTsKLSAgICAgICAgLyogTW9uby0+c3RlcmVvIGlucHV0IHNhdmVkIGZvciBlbmQgbWl4ICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgMiAqIHNpemVvZihMVk1fRkxPQVQpICogTWF4QmxvY2tTaXplKTsKLSAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoaT0wOyBpPDQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KLSAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fRkxPQVQpICogTWF4QmxvY2tTaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKGk9MDsgaTwyOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogQSBTY3JhdGNoIGJ1ZmZlciBmb3IgZWFjaCBkZWxheSBsaW5lICovCi0gICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihpPTA7IGk8MTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIEEgU2NyYXRjaCBidWZmZXIgZm9yIGVhY2ggZGVsYXkgbGluZSAqLwotICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9GTE9BVCkgKiBNYXhCbG9ja1NpemUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJlRlbXBvcmFyeSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uVHlwZSAgICAgICAgID0gTFZNX1RFTVBPUkFSWV9GQVNUOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIExWUkVWX0luc3RhbmNlX3N0ICAgKnBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0ICopaEluc3RhbmNlOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFJlYWQgYmFjayBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZQotICAgICAgICAgKi8KLSAgICAgICAgKnBNZW1vcnlUYWJsZSA9IHBMVlJFVl9Qcml2YXRlLT5NZW1vcnlUYWJsZTsKLSAgICB9Ci0KLSAgICByZXR1cm4oTFZSRVZfU1VDQ0VTUyk7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmgKaW5kZXggMmMyN2M2ZS4uOWEyZjljYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaApAQCAtMjMsNiArMjMsOCBAQAogLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvQmlxdWFkRmlsdGVyLmg+CiAjaW5jbHVkZSAiTFZSRVYuaCIKICNpbmNsdWRlICJMVlJFVl9UYWJsZXMuaCIKICNpbmNsdWRlICJCSVFVQUQuaCIKQEAgLTM3LDYzICszOSw2MyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEdlbmVyYWwgKi8KLSNkZWZpbmUgT05FX09WRVJfU1FSVF9UV08gICAgICAgICAgICAwLjcwNzEwN2YgICAgICAgICAgIC8qIDEvc3FydCgyKSAqIDJeMTUgKi8KLSNkZWZpbmUgTFZSRVZfQl84X29uXzEwMDAgICAgICAgICAgICAgICAwLjAwOGYgICAgICAgICAgIC8qIDAuOCAqIDJeMzEgKi8KLSNkZWZpbmUgTFZSRVZfSEVBRFJPT00gICAgICAgICAgICAgICAgICAgMC4yNWYgICAgICAgICAgIC8qIC0xMmRCICogMl4xNSAqLwotI2RlZmluZSBMVlJFVl8yXzlfSU5RMjkgICAgICAgICAgICAgICAgICAgMi45ZiAgICAgICAgICAgLyogMi45IGluIFEyOSBmb3JtYXQgKi8KLSNkZWZpbmUgTFZSRVZfTUlOM0RCICAgICAgICAgICAgICAgIDAuNzA3OTQ1N2YgICAgICAgICAgIC8qIC0zZEIgaW4gUTE1IGZvcm1hdCAqLworI2RlZmluZSBPTkVfT1ZFUl9TUVJUX1RXTyAwLjcwNzEwN2YgLyogMS9zcXJ0KDIpICogMl4xNSAqLworI2RlZmluZSBMVlJFVl9CXzhfb25fMTAwMCAwLjAwOGYgICAgLyogMC44ICogMl4zMSAqLworI2RlZmluZSBMVlJFVl9IRUFEUk9PTSAwLjI1ZiAgICAgICAgLyogLTEyZEIgKiAyXjE1ICovCisjZGVmaW5lIExWUkVWXzJfOV9JTlEyOSAyLjlmICAgICAgICAvKiAyLjkgaW4gUTI5IGZvcm1hdCAqLworI2RlZmluZSBMVlJFVl9NSU4zREIgMC43MDc5NDU3ZiAgICAgLyogLTNkQiBpbiBRMTUgZm9ybWF0ICovCiAKIC8qIEludGVuYWwgY29uc3RhbnRzICovCi0jZGVmaW5lIExWUkVWX0xQX1BvbHlfT3JkZXIgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgTFZSRVZfTFBfUG9seV9TaGlmdCAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBMVlJFVl9MUF9Qb2x5X09yZGVyIDQKKyNkZWZpbmUgTFZSRVZfTFBfUG9seV9TaGlmdCA1CiAKLSNkZWZpbmUgTFZSRVZfVDYwX1NDQUxFICAgICAgICAgICAgICAgIDAuMDAwMTQyZiAgICAgICAgICAgLyooMS83MDAwKSAqLworI2RlZmluZSBMVlJFVl9UNjBfU0NBTEUgMC4wMDAxNDJmIC8qKDEvNzAwMCkgKi8KIAotI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfMF9vbl80ICAgICAgICAgICAgICAxLjBmCi0jZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8xX29uXzQgICAgICAgICAxLjMxNjA3NGYKLSNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzJfb25fNCAgICAgICAgIDEuNzMyMDUxZgotI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfM19vbl80ICAgICAgICAgMi4yNzk1MDdmCi0jZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCAgICAgICAgIDEuMGYgICAgICAgIC8qIDNeKC0wLzQpICogMl4xNSAqLwotI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQgICAgMC43NTk4MzZmICAgICAgICAvKiAzXigtMS80KSAqIDJeMTUgKi8KLSNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80ICAgIDAuNTc3MzUwZiAgICAgICAgLyogM14oLTIvNCkgKiAyXjE1ICovCi0jZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCAgICAwLjQzODY5MWYgICAgICAgIC8qIDNeKC0zLzQpICogMl4xNSAqLworI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfMF9vbl80IDEuMGYKKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzFfb25fNCAxLjMxNjA3NGYKKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzJfb25fNCAxLjczMjA1MWYKKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzNfb25fNCAyLjI3OTUwN2YKKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80IDEuMGYgICAgICAvKiAzXigtMC80KSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80IDAuNzU5ODM2ZiAvKiAzXigtMS80KSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80IDAuNTc3MzUwZiAvKiAzXigtMi80KSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80IDAuNDM4NjkxZiAvKiAzXigtMy80KSAqIDJeMTUgKi8KIAotICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80KSA+PiAxNSkgLyAxMDAwICovCi0jZGVmaW5lIExWUkVWX01BWF9UM19ERUxBWSAgICAgICAgICAgICAgIDEwMTA4Ci0gICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX1QyX0RFTEFZICAgICAgICAgICAgICAgMTMzMDQKLSAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTAwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfVDFfREVMQVkgICAgICAgICAgICAgICAxNzUwOAotICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80KSA+PiAxNSkgLyAxMDAwICovCi0jZGVmaW5lIExWUkVWX01BWF9UMF9ERUxBWSAgICAgICAgICAgICAgIDIzMDQwCi0gICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX0FQM19ERUxBWSAgICAgICAgICAgICAgIDY3NDAKLSAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCkgPj4gMTUpIC8gMTUwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfQVAyX0RFTEFZICAgICAgICAgICAgICAgODg3MgotICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80KSA+PiAxNSkgLyAxNTAwICovCi0jZGVmaW5lIExWUkVWX01BWF9BUDFfREVMQVkgICAgICAgICAgICAgIDExNjcyCi0gICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX0FQMF9ERUxBWSAgICAgICAgICAgICAgMTUzNjAKKy8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80KSA+PiAxNSkgLyAxMDAwICovCisjZGVmaW5lIExWUkVWX01BWF9UM19ERUxBWSAxMDEwOAorLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1QyX0RFTEFZIDEzMzA0CisvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDFfREVMQVkgMTc1MDgKKy8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80KSA+PiAxNSkgLyAxMDAwICovCisjZGVmaW5lIExWUkVWX01BWF9UMF9ERUxBWSAyMzA0MAorLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0FQM19ERUxBWSA2NzQwCisvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAyX0RFTEFZIDg4NzIKKy8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZGVmaW5lIExWUkVWX01BWF9BUDFfREVMQVkgMTE2NzIKKy8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZGVmaW5lIExWUkVWX01BWF9BUDBfREVMQVkgMTUzNjAKIAotI2RlZmluZSBMVlJFVl9CWVBBU1NNSVhFUl9UQyAgICAgICAgICAgICAxMDAwICAgICAgICAgICAvKiBCeXBhc3MgbWl4ZXIgdGltZSBjb25zdGFudCovCi0jZGVmaW5lIExWUkVWX0FMTFBBU1NfVEMgICAgICAgICAgICAgICAgIDEwMDAgICAgICAgICAgIC8qIEFsbC1wYXNzIGZpbHRlciB0aW1lIGNvbnN0YW50ICovCi0jZGVmaW5lIExWUkVWX0FMTFBBU1NfVEFQX1RDICAgICAgICAgICAgIDEwMDAwICAgICAgICAgICAvKiBBbGwtcGFzcyBmaWx0ZXIgZGVseSB0YXAgY2hhbmdlICovCi0jZGVmaW5lIExWUkVWX0ZFRURCQUNLTUlYRVJfVEMgICAgICAgICAgICAxMDAgICAgICAgICAgIC8qIEZlZWRiYWNrIG1peGVyIHRpbWUgY29uc3RhbnQqLwotI2RlZmluZSBMVlJFVl9PVVRQVVRHQUlOX1NISUZUICAgICAgICAgICAgICA1ICAgICAgICAgICAvKiBCaXRzIHNoaWZ0IGZvciBvdXRwdXQgZ2FpbiBjb3JyZWN0aW9uICovCisjZGVmaW5lIExWUkVWX0JZUEFTU01JWEVSX1RDIDEwMDAgIC8qIEJ5cGFzcyBtaXhlciB0aW1lIGNvbnN0YW50Ki8KKyNkZWZpbmUgTFZSRVZfQUxMUEFTU19UQyAxMDAwICAgICAgLyogQWxsLXBhc3MgZmlsdGVyIHRpbWUgY29uc3RhbnQgKi8KKyNkZWZpbmUgTFZSRVZfQUxMUEFTU19UQVBfVEMgMTAwMDAgLyogQWxsLXBhc3MgZmlsdGVyIGRlbHkgdGFwIGNoYW5nZSAqLworI2RlZmluZSBMVlJFVl9GRUVEQkFDS01JWEVSX1RDIDEwMCAvKiBGZWVkYmFjayBtaXhlciB0aW1lIGNvbnN0YW50Ki8KKyNkZWZpbmUgTFZSRVZfT1VUUFVUR0FJTl9TSElGVCA1ICAgLyogQml0cyBzaGlmdCBmb3Igb3V0cHV0IGdhaW4gY29ycmVjdGlvbiAqLwogCiAvKiBQYXJhbWV0ZXIgbGltaXRzICovCi0jZGVmaW5lIExWUkVWX05VTV9GUyAgICAgICAgICAgICAgICAgICAgICAgMTMgICAgICAgICAgIC8qIE51bWJlciBvZiBzdXBwb3J0ZWQgc2FtcGxlIHJhdGVzICovCisjZGVmaW5lIExWUkVWX05VTV9GUyAxMyAvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIHNhbXBsZSByYXRlcyAqLwogCi0jZGVmaW5lIExWUkVWX01BWEJMS1NJWkVfTElNSVQgICAgICAgICAgICAgNjQgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBsb3cgbGltaXQgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX0xFVkVMICAgICAgICAgICAgICAgICAgIDEwMCAgICAgICAgICAgLyogTWF4aW11bSBsZXZlbCwgMTAwJSAqLwotI2RlZmluZSBMVlJFVl9NSU5fTFBGX0NPUk5FUiAgICAgICAgICAgICAgIDUwICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgbGltaXRzICovCi0jZGVmaW5lIExWUkVWX01BWF9MUEZfQ09STkVSICAgICAgICAgICAgMjM5OTkKLSNkZWZpbmUgTFZSRVZfTUlOX0hQRl9DT1JORVIgICAgICAgICAgICAgICAyMCAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHJlciBsaW1pdHMgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX0hQRl9DT1JORVIgICAgICAgICAgICAgMTAwMAotI2RlZmluZSBMVlJFVl9NQVhfVDYwICAgICAgICAgICAgICAgICAgICA3MDAwICAgICAgICAgICAvKiBNYXhpbXVtIFQ2MCB0aW1lIGluIG1zICovCi0jZGVmaW5lIExWUkVWX01BWF9ERU5TSVRZICAgICAgICAgICAgICAgICAxMDAgICAgICAgICAgIC8qIE1heGltdW0gZGVuc2l0eSwgMTAwJSAqLwotI2RlZmluZSBMVlJFVl9NQVhfREFNUElORyAgICAgICAgICAgICAgICAgMTAwICAgICAgICAgICAvKiBNYXhpbXVtIGRhbXBpbmcsIDEwMCUgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX1JPT01TSVpFICAgICAgICAgICAgICAgIDEwMCAgICAgICAgICAgLyogTWF4aW11bSByb29tIHNpemUsIDEwMCUgKi8KKyNkZWZpbmUgTFZSRVZfTUFYQkxLU0laRV9MSU1JVCA2NCAvKiBNYXhpbXVtIGJsb2NrIHNpemUgbG93IGxpbWl0ICovCisjZGVmaW5lIExWUkVWX01BWF9MRVZFTCAxMDAgICAgICAgLyogTWF4aW11bSBsZXZlbCwgMTAwJSAqLworI2RlZmluZSBMVlJFVl9NSU5fTFBGX0NPUk5FUiA1MCAgIC8qIExvdyBwYXNzIGZpbHRlciBsaW1pdHMgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0xQRl9DT1JORVIgMjM5OTkKKyNkZWZpbmUgTFZSRVZfTUlOX0hQRl9DT1JORVIgMjAgLyogSGlnaCBwYXNzIGZpbHJlciBsaW1pdHMgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0hQRl9DT1JORVIgMTAwMAorI2RlZmluZSBMVlJFVl9NQVhfVDYwIDcwMDAgICAgIC8qIE1heGltdW0gVDYwIHRpbWUgaW4gbXMgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0RFTlNJVFkgMTAwICAvKiBNYXhpbXVtIGRlbnNpdHksIDEwMCUgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0RBTVBJTkcgMTAwICAvKiBNYXhpbXVtIGRhbXBpbmcsIDEwMCUgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1JPT01TSVpFIDEwMCAvKiBNYXhpbXVtIHJvb20gc2l6ZSwgMTAwJSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTAxLDczICsxMDMsNTcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIEZhc3QgZGF0YSBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgSFBUYXBzOyAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgdGFwcyAqLwotICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190IExQVGFwczsgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgdGFwcyAqLwotICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190IFJldkxQVGFwc1s0XTsgICAgICAgICAgICAgICAvKiBSZXZlcmIgbG93IHBhc3MgZmlsdGVycyB0YXBzICovCi0KLX0gTFZSRVZfRmFzdERhdGFfc3Q7Ci0KLS8qIEZhc3QgY29lZmZpY2llbnQgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewotCi0gICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgSFBDb2VmczsgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCi0gICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgTFBDb2VmczsgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLSAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBSZXZMUENvZWZzWzRdOyAgICAgICAgLyogUmV2ZXJiIGxvdyBwYXNzIGZpbHRlcnMgY29lZmZpY2llbnRzICovCi0KLX0gTFZSRVZfRmFzdENvZWZfc3Q7Ci10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIEdlbmVyYWwgKi8KLSAgICBMVlJFVl9JbnN0YW5jZVBhcmFtc19zdCBJbnN0YW5jZVBhcmFtczsgICAgICAgICAgIC8qIEluaXRpYWxpc2F0aW9uIHRpbWUgaW5zdGFuY2UgcGFyYW1ldGVycyAqLwotICAgIExWUkVWX01lbW9yeVRhYmxlX3N0ICAgIE1lbW9yeVRhYmxlOyAgICAgICAgICAgICAgLyogTWVtb3J5IHRhYmxlICovCi0gICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgQ3VycmVudFBhcmFtczsgICAgICAgICAgICAvKiBQYXJhbWV0ZXJzIGJlaW5nIHVzZWQgKi8KLSAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICBOZXdQYXJhbXM7ICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzIGZyb20gdGhlIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmcgYXBwbGljYXRpb24gKi8KLSAgICBMVk1fQ0hBUiAgICAgICAgICAgICAgICBiQ29udHJvbFBlbmRpbmc7ICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgbmV3IHBhcmFtZXRlcnMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGF2YWlsYWJsZSAqLwotICAgIExWTV9DSEFSICAgICAgICAgICAgICAgIGJGaXJzdENvbnRyb2w7ICAgICAgICAgICAgLyogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb250cm9sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUgKi8KLSAgICBMVk1fQ0hBUiAgICAgICAgICAgICAgICBiRGlzYWJsZVJldmVyYjsgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWl4IGxldmVsIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwJSBhbmQgdGhlIHJldmVyYiBjYW4gYmUgZGlzYWJsZWQgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBSb29tU2l6ZUlubXM7ICAgICAgICAgICAgIC8qIFJvb20gc2l6ZSBpbiBtc2VjICovCi0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgTWF4QmxrTGVuOyAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgZm9yIGludGVybmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nICovCisgICAgTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3QgSW5zdGFuY2VQYXJhbXM7IC8qIEluaXRpYWxpc2F0aW9uIHRpbWUgaW5zdGFuY2UgcGFyYW1ldGVycyAqLworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgQ3VycmVudFBhcmFtczsgICAvKiBQYXJhbWV0ZXJzIGJlaW5nIHVzZWQgKi8KKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IE5ld1BhcmFtczsgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgZnJvbSB0aGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nIGFwcGxpY2F0aW9uICovCisgICAgTFZNX0NIQVIgYkNvbnRyb2xQZW5kaW5nOyAgICAgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgbmV3IHBhcmFtZXRlcnMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXZhaWxhYmxlICovCisgICAgTFZNX0NIQVIgYkZpcnN0Q29udHJvbDsgICAgICAgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29udHJvbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUgKi8KKyAgICBMVk1fQ0hBUiBiRGlzYWJsZVJldmVyYjsgICAgICAgICAgICAgICAgLyogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBtaXggbGV2ZWwgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCUgYW5kIHRoZSByZXZlcmIgY2FuIGJlIGRpc2FibGVkICovCisgICAgTFZNX0lOVDMyIFJvb21TaXplSW5tczsgICAgICAgICAgICAgICAgIC8qIFJvb20gc2l6ZSBpbiBtc2VjICovCisgICAgTFZNX0lOVDMyIE1heEJsa0xlbjsgICAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBmb3IgaW50ZXJuYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyAqLwogCiAgICAgLyogQWxpZ25lZCBtZW1vcnkgcG9pbnRlcnMgKi8KLSAgICBMVlJFVl9GYXN0RGF0YV9zdCAgICAgICAqcEZhc3REYXRhOyAgICAgICAgICAgICAgIC8qIEZhc3QgZGF0YSBtZW1vcnkgYmFzZSBhZGRyZXNzICovCi0gICAgTFZSRVZfRmFzdENvZWZfc3QgICAgICAgKnBGYXN0Q29lZjsgICAgICAgICAgICAgICAvKiBGYXN0IGNvZWZmaWNpZW50IG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2hEZWxheUxpbmVbNF07ICAgIC8qIERlbGF5IGxpbmUgc2NyYXRjaCBtZW1vcnkgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7ICAgICAgICAgICAgICAgIC8qIE11bHRpIHVzc2dlIHNjcmF0Y2ggKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcElucHV0U2F2ZTsgICAgICAgICAgICAgIC8qIFJldmVyYiBibG9jayBpbnB1dCBzYXZlIGZvciBkcnkvd2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhpbmcqLworICAgIHN0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjphdWRpb191dGlsczo6QmlxdWFkRmlsdGVyPExWTV9GTE9BVD4+CisgICAgICAgICAgICBwUmV2SFBGQmlxdWFkOyAvKiBCaXF1YWQgZmlsdGVyIGluc3RhbmNlIGZvciBIUEYgKi8KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxMVk1fRkxPQVQ+PgorICAgICAgICAgICAgcFJldkxQRkJpcXVhZDsgLyogQmlxdWFkIGZpbHRlciBpbnN0YW5jZSBmb3IgTFBGICovCisgICAgc3RkOjphcnJheTxzdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxMVk1fRkxPQVQ+PiwgTFZSRVZfREVMQVlMSU5FU180PgorICAgICAgICAgICAgcmV2TFBGQmlxdWFkOyAvKiBCaXF1YWQgZmlsdGVyIGluc3RhbmNlIGZvciBSZXZlcmIgTFBGICovCisgICAgTFZNX0ZMT0FUKiBwU2NyYXRjaERlbGF5TGluZVtMVlJFVl9ERUxBWUxJTkVTXzRdOyAvKiBEZWxheSBsaW5lIHNjcmF0Y2ggbWVtb3J5ICovCisgICAgTFZNX0ZMT0FUKiBwU2NyYXRjaDsgICAgICAgICAgICAgLyogTXVsdGkgdXNzZ2Ugc2NyYXRjaCAqLworICAgIExWTV9GTE9BVCogcElucHV0U2F2ZTsgICAgICAgICAgIC8qIFJldmVyYiBibG9jayBpbnB1dCBzYXZlIGZvciBkcnkvd2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4aW5nKi8KIAogICAgIC8qIEZlZWRiYWNrIG1hdHJpeCAqLwotICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgIEZlZWRiYWNrTWl4ZXJbNF07ICAgICAgICAgLyogTWl4ZXIgZm9yIFBvcCBhbmQgQ2xpY2sgU3VwcmVzc2lvbiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZWQgYnkgZmVlZGJhY2sgR2FpbiAqLworICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgRmVlZGJhY2tNaXhlcltMVlJFVl9ERUxBWUxJTkVTXzRdOyAvKiBNaXhlciBmb3IgUG9wIGFuZCBDbGljayBTdXBwcmVzc2lvbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZWQgYnkgZmVlZGJhY2sgR2FpbiAqLwogCiAgICAgLyogQWxsLVBhc3MgRmlsdGVyICovCi0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgVFs0XTsgICAgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGRlbGF5IHNpemUgb2YgYnVmZmVyICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEZWxheV9UWzRdOyAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIGRlbGF5IGJ1ZmZlcnMgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBEZWxheV9BUFs0XTsgICAgICAgICAgICAgIC8qIE9mZnNldCB0byBBUCBkZWxheSBidWZmZXIgc3RhcnQgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBBQl9TZWxlY3Rpb247ICAgICAgICAgICAgIC8qIFNtb290aCBmcm9tIHRhcCBBIHRvIEIgd2hlbiAxIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBCIHRvIEEgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBBX0RlbGF5U2l6ZVs0XTsgICAgICAgICAgIC8qIEEgZGVsYXkgbGVuZ3RoIGluIHNhbXBsZXMgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBCX0RlbGF5U2l6ZVs0XTsgICAgICAgICAgIC8qIEIgZGVsYXkgbGVuZ3RoIGluIHNhbXBsZXMgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcE9mZnNldEFbNF07ICAgICAgICAgICAgIC8qIE9mZnNldCBmb3IgdGhlIEEgZGVsYXkgdGFwICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBPZmZzZXRCWzRdOyAgICAgICAgICAgICAvKiBPZmZzZXQgZm9yIHRoZSBCIGRlbGF5IHRhcCAqLwotICAgIE1peF8yU3RfQ2xsX0ZMT0FUX3QgICAgIE1peGVyX0FQVGFwc1s0XTsgICAgICAgICAgLyogU21vb3RoZWQgQVAgZGVsYXkgbWl4ZXIgKi8KLSAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICBNaXhlcl9TR0ZlZWRiYWNrWzRdOyAgICAgIC8qIFNtb290aGVkIFNBZmVlZGJhY2sgZ2FpbiAqLwotICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgIE1peGVyX1NHRmVlZGZvcndhcmRbNF07ICAgLyogU21vb3RoZWQgQVAgZmVlZGZvcndhcmQgZ2FpbiAqLworICAgIExWTV9JTlQzMiBUW0xWUkVWX0RFTEFZTElORVNfNF07ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGRlbGF5IHNpemUgb2YgYnVmZmVyICovCisgICAgTFZNX0ZMT0FUKiBwRGVsYXlfVFtMVlJFVl9ERUxBWUxJTkVTXzRdOyAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gZGVsYXkgYnVmZmVycyAqLworICAgIExWTV9JTlQzMiBEZWxheV9BUFtMVlJFVl9ERUxBWUxJTkVTXzRdOyAgICAgICAgICAgICAgICAgICAvKiBPZmZzZXQgdG8gQVAgZGVsYXkgYnVmZmVyIHN0YXJ0ICovCisgICAgTFZNX0lOVDE2IEFCX1NlbGVjdGlvbjsgICAgICAgICAgICAgICAgICAgICAvKiBTbW9vdGggZnJvbSB0YXAgQSB0byBCIHdoZW4gMSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgQiB0byBBICovCisgICAgTFZNX0lOVDMyIEFfRGVsYXlTaXplW0xWUkVWX0RFTEFZTElORVNfNF07ICAgICAgICAgICAgICAgIC8qIEEgZGVsYXkgbGVuZ3RoIGluIHNhbXBsZXMgKi8KKyAgICBMVk1fSU5UMzIgQl9EZWxheVNpemVbTFZSRVZfREVMQVlMSU5FU180XTsgICAgICAgICAgICAgICAgLyogQiBkZWxheSBsZW5ndGggaW4gc2FtcGxlcyAqLworICAgIExWTV9GTE9BVCogcE9mZnNldEFbTFZSRVZfREVMQVlMSU5FU180XTsgICAgICAgICAgICAgICAgICAvKiBPZmZzZXQgZm9yIHRoZSBBIGRlbGF5IHRhcCAqLworICAgIExWTV9GTE9BVCogcE9mZnNldEJbTFZSRVZfREVMQVlMSU5FU180XTsgICAgICAgICAgICAgICAgICAvKiBPZmZzZXQgZm9yIHRoZSBCIGRlbGF5IHRhcCAqLworICAgIE1peF8yU3RfQ2xsX0ZMT0FUX3QgTWl4ZXJfQVBUYXBzW0xWUkVWX0RFTEFZTElORVNfNF07ICAgICAvKiBTbW9vdGhlZCBBUCBkZWxheSBtaXhlciAqLworICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgTWl4ZXJfU0dGZWVkYmFja1tMVlJFVl9ERUxBWUxJTkVTXzRdOyAvKiBTbW9vdGhlZCBTQWZlZWRiYWNrIGdhaW4gKi8KKyAgICBNaXhfMVN0X0NsbF9GTE9BVF90IE1peGVyX1NHRmVlZGZvcndhcmRbTFZSRVZfREVMQVlMSU5FU180XTsgLyogU21vb3RoZWQgQVAgZmVlZGZvcndhcmQgZ2FpbiAqLwogCiAgICAgLyogT3V0cHV0IGdhaW4gKi8KLSAgICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICBCeXBhc3NNaXhlcjsgICAgICAgICAgICAgIC8qIERyeS93ZXQgbWl4ZXIgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBHYWluOyAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gYXBwbGllZCB0byBvdXRwdXQgdG8gbWFpbnRhaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZXJhZ2Ugc2lnbmFsIHBvd2VyICovCi0gICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgR2Fpbk1peGVyOyAgICAgICAgICAgICAgICAvKiBHYWluIHNtb290aGluZyAqLworICAgIE1peF8yU3RfQ2xsX0ZMT0FUX3QgQnlwYXNzTWl4ZXI7IC8qIERyeS93ZXQgbWl4ZXIgKi8KKyAgICBMVk1fRkxPQVQgR2FpbjsgICAgICAgICAgICAgICAgICAvKiBHYWluIGFwcGxpZWQgdG8gb3V0cHV0IHRvIG1haW50YWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZSBzaWduYWwgcG93ZXIgKi8KKyAgICBNaXhfMVN0X0NsbF9GTE9BVF90IEdhaW5NaXhlcjsgICAvKiBHYWluIHNtb290aGluZyAqLwogCiB9IExWUkVWX0luc3RhbmNlX3N0OwogCkBAIC0xNzcsMTUgKzE2MywxMiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgTFZSRVZfQXBwbHlOZXdTZXR0aW5ncyhMVlJFVl9JbnN0YW5jZV9zdCAgICAgKnBQcml2YXRlKTsKLXZvaWQgICAgICAgICAgICAgICAgICAgIFJldmVyYkJsb2NrKExWTV9GTE9BVCAgICAgICAgICAgKnBJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9JbnN0YW5jZV9zdCAgICpwUHJpdmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgTnVtU2FtcGxlcyk7Ci1MVk1fSU5UMzIgICAgICAgICAgICAgICBCeXBhc3NNaXhlcl9DYWxsYmFjayh2b2lkICAgICAgICpwQ2FsbGJhY2tEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAqcEdlbmVyYWxQdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBHZW5lcmFsUHVycG9zZSApOworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0FwcGx5TmV3U2V0dGluZ3MoTFZSRVZfSW5zdGFuY2Vfc3QqIHBQcml2YXRlKTsKK3ZvaWQgUmV2ZXJiQmxvY2soTFZNX0ZMT0FUKiBwSW5wdXQsIExWTV9GTE9BVCogcE91dHB1dCwgTFZSRVZfSW5zdGFuY2Vfc3QqIHBQcml2YXRlLAorICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IE51bVNhbXBsZXMpOworTFZNX0lOVDMyIEJ5cGFzc01peGVyX0NhbGxiYWNrKHZvaWQqIHBDYWxsYmFja0RhdGEsIHZvaWQqIHBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgR2VuZXJhbFB1cnBvc2UpOwogCi0jZW5kaWYgIC8qKiBfX0xWUkVWX1BSSVZBVEVfSF9fICoqLworI2VuZGlmIC8qKiBfX0xWUkVWX1BSSVZBVEVfSF9fICoqLwogCiAvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmNwcAppbmRleCAzNWY5YWQ4Li5mOWMzMjY2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmNwcApAQCAtNDUsNDMgKzQ1LDM3IEBACiAvKiAgMS4gVGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBtdXN0IGJlIDMyLWJpdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfUHJvY2VzcyhMVlJFVl9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9VSU5UMTYgICAgTnVtU2FtcGxlcykKLXsKLSAgIExWUkVWX0luc3RhbmNlX3N0ICAgICAqcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QgKiloSW5zdGFuY2U7Ci0gICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBJbnB1dCAgPSAoTFZNX0ZMT0FUICopcEluRGF0YTsKLSAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dHB1dCA9IHBPdXREYXRhOwotICAgTFZNX0lOVDMyICAgICAgICAgICAgIFNhbXBsZXNUb1Byb2Nlc3MsIFJlbWFpbmluZ1NhbXBsZXM7Ci0gICBMVk1fSU5UMzIgICAgICAgICAgICAgZm9ybWF0ID0gMTsKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9Qcm9jZXNzKExWUkVWX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwT3V0RGF0YSwgY29uc3QgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKSB7CisgICAgTFZSRVZfSW5zdGFuY2Vfc3QqIHBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0KiloSW5zdGFuY2U7CisgICAgTFZNX0ZMT0FUKiBwSW5wdXQgPSAoTFZNX0ZMT0FUKilwSW5EYXRhOworICAgIExWTV9GTE9BVCogcE91dHB1dCA9IHBPdXREYXRhOworICAgIExWTV9JTlQzMiBTYW1wbGVzVG9Qcm9jZXNzLCBSZW1haW5pbmdTYW1wbGVzOworICAgIExWTV9JTlQzMiBmb3JtYXQgPSAxOwogCiAgICAgLyoKICAgICAgKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucwogICAgICAqLwogCiAgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KLSAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKLSAgICB7CisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5EYXRhID09IExWTV9OVUxMKSB8fCAocE91dERhdGEgPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKICAgICB9CiAKICAgICAvKgogICAgICAqIEFwcGx5IHRoZSBuZXcgY29udHJvbHMgc2V0dGluZ3MgaWYgcmVxdWlyZWQKICAgICAgKi8KLSAgICBpZihwTFZSRVZfUHJpdmF0ZS0+YkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKQotICAgIHsKLSAgICAgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgZXJyb3JDb2RlOworICAgIGlmIChwTFZSRVZfUHJpdmF0ZS0+YkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKSB7CisgICAgICAgIExWUkVWX1JldHVyblN0YXR1c19lbiBlcnJvckNvZGU7CiAKICAgICAgICAgLyoKICAgICAgICAgICogQ2xlYXIgdGhlIHBlbmRpbmcgZmxhZyBhbmQgdXBkYXRlIHRoZSBjb250cm9sIHNldHRpbmdzCiAgICAgICAgICAqLwogICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+YkNvbnRyb2xQZW5kaW5nID0gTFZNX0ZBTFNFOwogCi0gICAgICAgIGVycm9yQ29kZSA9IExWUkVWX0FwcGx5TmV3U2V0dGluZ3MgKHBMVlJFVl9Qcml2YXRlKTsKKyAgICAgICAgZXJyb3JDb2RlID0gTFZSRVZfQXBwbHlOZXdTZXR0aW5ncyhwTFZSRVZfUHJpdmF0ZSk7CiAKLSAgICAgICAgaWYoZXJyb3JDb2RlICE9IExWUkVWX1NVQ0NFU1MpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKGVycm9yQ29kZSAhPSBMVlJFVl9TVUNDRVNTKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyb3JDb2RlOwogICAgICAgICB9CiAgICAgfQpAQCAtODksMjcgKzgzLDIzIEBACiAgICAgLyoKICAgICAgKiBUcmFwIHRoZSBjYXNlIHdoZXJlIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyB6ZXJvLgogICAgICAqLwotICAgIGlmIChOdW1TYW1wbGVzID09IDApCi0gICAgeworICAgIGlmIChOdW1TYW1wbGVzID09IDApIHsKICAgICAgICAgcmV0dXJuIExWUkVWX1NVQ0NFU1M7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBJZiBPRkYgY29weSBhbmQgcmVmb3JtYXQgdGhlIGRhdGEgYXMgbmVjZXNzYXJ5CiAgICAgICovCi0gICAgaWYgKHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT0ZGKQotICAgIHsKLSAgICAgICAgaWYocElucHV0ICE9IHBPdXRwdXQpCi0gICAgICAgIHsKKyAgICBpZiAocExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PRkYpIHsKKyAgICAgICAgaWYgKHBJbnB1dCAhPSBwT3V0cHV0KSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQ29weSB0aGUgZGF0YSB0byB0aGUgb3V0cHV0IGJ1ZmZlciwgY29udmVydCB0byBzdGVyZW8gaXMgcmVxdWlyZWQKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYocExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKXsKKyAgICAgICAgICAgIGlmIChwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01PTk8pIHsKICAgICAgICAgICAgICAgICBNb25vVG8ySV9GbG9hdChwSW5wdXQsIHBPdXRwdXQsIE51bVNhbXBsZXMpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIDw8IDEpKTsgLy8gMzIgYml0IGRhdGEsIHN0ZXJlbworICAgICAgICAgICAgICAgIENvcHlfRmxvYXQocElucHV0LCBwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcyA8PCAxKSk7ICAvLyAzMiBiaXQgZGF0YSwgc3RlcmVvCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTE4LDMxICsxMDgsMjYgQEAKIAogICAgIFJlbWFpbmluZ1NhbXBsZXMgPSAoTFZNX0lOVDMyKU51bVNhbXBsZXM7CiAKLSAgICBpZiAocExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ICE9IExWTV9NT05PKQotICAgIHsKKyAgICBpZiAocExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ICE9IExWTV9NT05PKSB7CiAgICAgICAgIGZvcm1hdCA9IDI7CiAgICAgfQogCi0gICAgd2hpbGUgKFJlbWFpbmluZ1NhbXBsZXMhPTApCi0gICAgeworICAgIHdoaWxlIChSZW1haW5pbmdTYW1wbGVzICE9IDApIHsKICAgICAgICAgLyoKICAgICAgICAgICogUHJvY2VzcyB0aGUgZGF0YQogICAgICAgICAgKi8KIAotICAgICAgICBpZihSZW1haW5pbmdTYW1wbGVzID4gIHBMVlJFVl9Qcml2YXRlLT5NYXhCbGtMZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNhbXBsZXNUb1Byb2Nlc3MgPSAgcExWUkVWX1ByaXZhdGUtPk1heEJsa0xlbjsKKyAgICAgICAgaWYgKFJlbWFpbmluZ1NhbXBsZXMgPiBwTFZSRVZfUHJpdmF0ZS0+TWF4QmxrTGVuKSB7CisgICAgICAgICAgICBTYW1wbGVzVG9Qcm9jZXNzID0gcExWUkVWX1ByaXZhdGUtPk1heEJsa0xlbjsKICAgICAgICAgICAgIFJlbWFpbmluZ1NhbXBsZXMgPSAoTFZNX0lOVDE2KShSZW1haW5pbmdTYW1wbGVzIC0gU2FtcGxlc1RvUHJvY2Vzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBTYW1wbGVzVG9Qcm9jZXNzID0gUmVtYWluaW5nU2FtcGxlczsKICAgICAgICAgICAgIFJlbWFpbmluZ1NhbXBsZXMgPSAwOwogICAgICAgICB9CiAKICAgICAgICAgUmV2ZXJiQmxvY2socElucHV0LCBwT3V0cHV0LCBwTFZSRVZfUHJpdmF0ZSwgKExWTV9VSU5UMTYpU2FtcGxlc1RvUHJvY2Vzcyk7Ci0gICAgICAgIHBJbnB1dCAgPSAoTFZNX0ZMT0FUICopKHBJbnB1dCArIChTYW1wbGVzVG9Qcm9jZXNzICogZm9ybWF0KSk7Ci0gICAgICAgIHBPdXRwdXQgPSAoTFZNX0ZMT0FUICopKHBPdXRwdXQgKyAoU2FtcGxlc1RvUHJvY2VzcyAqIDIpKTsgICAgICAvLyBBbHdheXMgc3RlcmVvIG91dHB1dAorICAgICAgICBwSW5wdXQgPSAoTFZNX0ZMT0FUKikocElucHV0ICsgKFNhbXBsZXNUb1Byb2Nlc3MgKiBmb3JtYXQpKTsKKyAgICAgICAgcE91dHB1dCA9IChMVk1fRkxPQVQqKShwT3V0cHV0ICsgKFNhbXBsZXNUb1Byb2Nlc3MgKiAyKSk7ICAvLyBBbHdheXMgc3RlcmVvIG91dHB1dAogICAgIH0KIAogICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOwpAQCAtMTcwLDE2ICsxNTUsMTUgQEAKIC8qICAxLiBUaGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG11c3QgYmUgMzItYml0IGFsaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUmV2ZXJiQmxvY2soTFZNX0ZMT0FUICpwSW5wdXQsIExWTV9GTE9BVCAqcE91dHB1dCwKLSAgICAgICAgICAgICAgICAgTFZSRVZfSW5zdGFuY2Vfc3QgKnBQcml2YXRlLCBMVk1fVUlOVDE2IE51bVNhbXBsZXMpCi17Ci0gICAgTFZNX0lOVDE2ICAgaiwgc2l6ZTsKLSAgICBMVk1fRkxPQVQgICAqcERlbGF5TGluZTsKLSAgICBMVk1fRkxPQVQgICAqcERlbGF5TGluZUlucHV0ID0gcFByaXZhdGUtPnBTY3JhdGNoOwotICAgIExWTV9GTE9BVCAgICpwU2NyYXRjaCA9IHBQcml2YXRlLT5wU2NyYXRjaDsKLSAgICBMVk1fRkxPQVQgICAqcEluOwotICAgIExWTV9GTE9BVCAgICpwVGVtcCA9IHBQcml2YXRlLT5wSW5wdXRTYXZlOwotICAgIExWTV9JTlQzMiAgIE51bWJlck9mRGVsYXlMaW5lczsKK3ZvaWQgUmV2ZXJiQmxvY2soTFZNX0ZMT0FUKiBwSW5wdXQsIExWTV9GTE9BVCogcE91dHB1dCwgTFZSRVZfSW5zdGFuY2Vfc3QqIHBQcml2YXRlLAorICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IE51bVNhbXBsZXMpIHsKKyAgICBMVk1fSU5UMTYgaiwgc2l6ZTsKKyAgICBMVk1fRkxPQVQqIHBEZWxheUxpbmU7CisgICAgTFZNX0ZMT0FUKiBwRGVsYXlMaW5lSW5wdXQgPSBwUHJpdmF0ZS0+cFNjcmF0Y2g7CisgICAgTFZNX0ZMT0FUKiBwU2NyYXRjaCA9IHBQcml2YXRlLT5wU2NyYXRjaDsKKyAgICBMVk1fRkxPQVQqIHBJbjsKKyAgICBMVk1fRkxPQVQqIHBUZW1wID0gcFByaXZhdGUtPnBJbnB1dFNhdmU7CisgICAgTFZNX0lOVDMyIE51bWJlck9mRGVsYXlMaW5lczsKIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgKiBBbGwgY2FsY3VsYXRpb25zIHdpbGwgZ28gaW50byB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgcFRlbXAsIHRoaXMgd2lsbCAgICAqCkBAIC0xOTYsODUgKzE4MCw2MSBAQAogICAgICAqIGFuZCB0aGUgZmluYWwgb3V0cHV0IGlzIGNvbnZlcnRlZCB0byBTVEVSRU8gYWZ0ZXIgdGhlIG1peGVyICAgICAgICAgICAgICAgICoKICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gICAgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCi0gICAgeworICAgIGlmIChwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkgewogICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSA0OwotICAgIH0KLSAgICBlbHNlIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKQotICAgIHsKKyAgICB9IGVsc2UgaWYgKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKSB7CiAgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7CisgICAgfSBlbHNlIHsKICAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gMTsKICAgICB9CiAKLSAgICBpZihwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01PTk8pCi0gICAgeworICAgIGlmIChwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01PTk8pIHsKICAgICAgICAgcEluID0gcElucHV0OwotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqICBTdGVyZW8gdG8gbW9ubyBjb252ZXJzaW9uCiAgICAgICAgICAqLwogCi0gICAgICAgIEZyb20yaVRvTW9ub19GbG9hdChwSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIEZyb20yaVRvTW9ub19GbG9hdChwSW5wdXQsIHBUZW1wLCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogICAgICAgICBwSW4gPSBwVGVtcDsKICAgICB9CiAKLSAgICBNdWx0M3NfRmxvYXQocEluLAotICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKUxWUkVWX0hFQURST09NLAotICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICBNdWx0M3NfRmxvYXQocEluLCAoTFZNX0ZMT0FUKUxWUkVWX0hFQURST09NLCBwVGVtcCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKIAogICAgIC8qCiAgICAgICogIEhpZ2ggcGFzcyBmaWx0ZXIKICAgICAgKi8KLSAgICBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSgmcFByaXZhdGUtPnBGYXN0Q29lZi0+SFBDb2VmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgIHBQcml2YXRlLT5wUmV2SFBGQmlxdWFkLT5wcm9jZXNzKHBUZW1wLCBwVGVtcCwgTnVtU2FtcGxlcyk7CisKICAgICAvKgogICAgICAqICBMb3cgcGFzcyBmaWx0ZXIKICAgICAgKi8KLSAgICBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSgmcFByaXZhdGUtPnBGYXN0Q29lZi0+TFBDb2VmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgIHBQcml2YXRlLT5wUmV2TFBGQmlxdWFkLT5wcm9jZXNzKHBUZW1wLCBwVGVtcCwgTnVtU2FtcGxlcyk7CiAKICAgICAvKgogICAgICAqICBQcm9jZXNzIGFsbCBkZWxheSBsaW5lcwogICAgICAqLwogCi0gICAgZm9yKGogPSAwOyBqIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBqKyspCi0gICAgeworICAgIGZvciAoaiA9IDA7IGogPCBOdW1iZXJPZkRlbGF5TGluZXM7IGorKykgewogICAgICAgICBwRGVsYXlMaW5lID0gcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lW2pdOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIEFsbC1wYXNzIGZpbHRlciB3aXRoIHBvcCBhbmQgY2xpY2sgc3VwcHJlc3Npb24KICAgICAgICAgICovCiAgICAgICAgIC8qIEdldCB0aGUgc21vb3RoZWQsIGRlbGF5ZWQgb3V0cHV0LiBQdXQgaXQgaW4gdGhlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgTWl4U29mdF8yU3RfRDMyQzMxX1NBVCgmcFByaXZhdGUtPk1peGVyX0FQVGFwc1tqXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cE9mZnNldEFbal0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRCW2pdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgTWl4U29mdF8yU3RfRDMyQzMxX1NBVCgmcFByaXZhdGUtPk1peGVyX0FQVGFwc1tqXSwgcFByaXZhdGUtPnBPZmZzZXRBW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QltqXSwgcERlbGF5TGluZSwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKICAgICAgICAgLyogUmUtYWxpZ24gdGhlIGFsbCBwYXNzIGZpbHRlciBkZWxheSBidWZmZXIgYW5kIGNvcHlpbmcgdGhlIGZpeGVkIGRlbGF5IGRhdGEgXAogICAgICAgICAgICB0byB0aGUgQVAgZGVsYXkgaW4gdGhlIHByb2Nlc3MgKi8KLSAgICAgICAgQ29weV9GbG9hdCgmcFByaXZhdGUtPnBEZWxheV9UW2pdW051bVNhbXBsZXNdLAotICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wRGVsYXlfVFtqXSwKLSAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXMpKTsgICAgICAgICAvKiAzMi1iaXQgZGF0YSAqLworICAgICAgICBDb3B5X0Zsb2F0KCZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bTnVtU2FtcGxlc10sIHBQcml2YXRlLT5wRGVsYXlfVFtqXSwKKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXMpKTsgLyogMzItYml0IGRhdGEgKi8KICAgICAgICAgLyogQXBwbHkgdGhlIHNtb290aGVkIGZlZWRiYWNrIGFuZCBzYXZlIHRvIGZpeGVkIGRlbGF5IGlucHV0IChjdXJyZW50bHkgZW1wdHkpICovCi0gICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoJnBQcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2pdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCisgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoJnBQcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2pdLCBwRGVsYXlMaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogICAgICAgICAvKiBTdW0gaW50byB0aGUgQVAgZGVsYXkgbGluZSAqLwogICAgICAgICBNYWMzc19TYXRfRmxvYXQoJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXNdLAotICAgICAgICAgICAgICAgICAgICAgICAgLTEuMGYsICAgIC8qIEludmVydCBzaW5jZSB0aGUgZmVlZGJhY2sgY29lZmZpY2llbnQgaXMgbmVnYXRpdmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC0xLjBmLCAvKiBJbnZlcnQgc2luY2UgdGhlIGZlZWRiYWNrIGNvZWZmaWNpZW50IGlzIG5lZ2F0aXZlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5EZWxheV9BUFtqXSAtIE51bVNhbXBsZXNdLAogICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKICAgICAgICAgLyogQXBwbHkgc21vb3RoZWQgZmVlZGZvcndhcmQgc2FuZCBzYXZlIHRvIGZpeGVkIGRlbGF5IGlucHV0IChjdXJyZW50bHkgZW1wdHkpICovCkBAIC0yODMsOSArMjQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKICAgICAgICAgLyogU3VtIGludG8gdGhlIEFQIG91dHB1dCAqLwotICAgICAgICBNYWMzc19TYXRfRmxvYXQoJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXNdLAotICAgICAgICAgICAgICAgICAgICAgICAgMS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCisgICAgICAgIE1hYzNzX1NhdF9GbG9hdCgmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sIDEuMGYsIHBEZWxheUxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogCiAgICAgICAgIC8qCkBAIC0yOTYsMzQgKzI1NCwyNiBAQAogICAgICAgICAvKgogICAgICAgICAgKiAgTG93IHBhc3MgZmlsdGVyCiAgICAgICAgICAqLwotICAgICAgICBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSgmcFByaXZhdGUtPnBGYXN0Q29lZi0+UmV2TFBDb2Vmc1tqXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgcFByaXZhdGUtPnJldkxQRkJpcXVhZFtqXS0+cHJvY2VzcyhwRGVsYXlMaW5lLCBwRGVsYXlMaW5lLCBOdW1TYW1wbGVzKTsKICAgICB9CiAKICAgICAvKgogICAgICAqICBBcHBseSByb3RhdGlvbiBtYXRyaXggYW5kIGRlbGF5IHNhbXBsZXMKICAgICAgKi8KLSAgICBmb3IoaiA9IDA7IGogPCBOdW1iZXJPZkRlbGF5TGluZXM7IGorKykKLSAgICB7Ci0KLSAgICAgICAgQ29weV9GbG9hdChwVGVtcCwKLSAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcykpOworICAgIGZvciAoaiA9IDA7IGogPCBOdW1iZXJPZkRlbGF5TGluZXM7IGorKykgeworICAgICAgICBDb3B5X0Zsb2F0KHBUZW1wLCBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpKE51bVNhbXBsZXMpKTsKICAgICAgICAgLyoKICAgICAgICAgICogIFJvdGF0aW9uIG1hdHJpeCBtaXgKICAgICAgICAgICovCi0gICAgICAgIHN3aXRjaChqKQotICAgICAgICB7CisgICAgICAgIHN3aXRjaCAoaikgewogICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDEgYW5kIDIgY29udHJpYnV0aW9uCiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0xLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzJdLCAtMS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMS4wZiwgcERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMl0sIC0xLjBmLCBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgMjoKQEAgLTMzMSw2MSArMjgxLDUyIEBACiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBhbmQgMyBjb250cmlidXRpb24KICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgLTEuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbM10sIC0xLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIC0xLjBmLCBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVszXSwgLTEuMGYsIHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKIAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQotICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpIHsKICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgYW5kIDMgY29udHJpYnV0aW9uCiAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCAtMS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgLTEuMGYsIHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAgICAgICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVszXSwgcERlbGF5TGluZUlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgYW5kIDEgY29udHJpYnV0aW9uCiAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgLTEuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgLTEuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotCisgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIC0xLjBmLCBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMS4wZiwgcERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCi0gICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkgewogICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMSBhbmQgMiBjb250cmlidXRpb24KICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0xLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMS4wZiwgcERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKICAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzJdLCBwRGVsYXlMaW5lSW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKLSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikgewogICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBhbmQgMSBjb250cmlidXRpb24KICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgcERlbGF5TGluZUlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgLTEuMGYsIHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBjb250cmlidXRpb24KICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00MDIsNTQgKzM0MywzNyBAQAogICAgICAgICAvKgogICAgICAgICAgKiAgRGVsYXkgc2FtcGxlcwogICAgICAgICAgKi8KLSAgICAgICAgQ29weV9GbG9hdChwRGVsYXlMaW5lSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXNdLAotICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgIC8qIDMyLWJpdCBkYXRhICovCisgICAgICAgIENvcHlfRmxvYXQocERlbGF5TGluZUlucHV0LCAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcykpOyAvKiAzMi1iaXQgZGF0YSAqLwogICAgIH0KIAogICAgIC8qCiAgICAgICogIENyZWF0ZSBzdGVyZW8gb3V0cHV0CiAgICAgICovCi0gICAgc3dpdGNoKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMpCi0gICAgeworICAgIHN3aXRjaCAocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cykgewogICAgICAgICBjYXNlIExWUkVWX0RFTEFZTElORVNfNDoKLSAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzNdLCBwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzJdLCBwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogCi0gICAgICAgICAgICBKb2luVG8yaV9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgIEpvaW5UbzJpX0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCBwVGVtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIExWUkVWX0RFTEFZTElORVNfMjoKIAotICAgICAgICAgICAgIENvcHlfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1TYW1wbGVzKSk7CisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgcFNjcmF0Y2gsIChMVk1fSU5UMTYpKE51bVNhbXBsZXMpKTsKIAotICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIC0xLjBmLCBwU2NyYXRjaCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKIAotICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKIAotICAgICAgICAgICAgIEpvaW5UbzJpX0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgSm9pblRvMmlfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCBwU2NyYXRjaCwgcFRlbXAsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBMVlJFVl9ERUxBWUxJTkVTXzE6Ci0gICAgICAgICAgICBNb25vVG8ySV9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICBNb25vVG8ySV9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIHBUZW1wLCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKQEAgLTQ2MCwyNSArMzg0LDE0IEBACiAgICAgICovCiAKICAgICBzaXplID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyA8PCAxKTsKLSAgICBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCZwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoJnBQcml2YXRlLT5CeXBhc3NNaXhlciwgcFRlbXAsIHBUZW1wLCBwT3V0cHV0LCBzaXplKTsKIAogICAgIC8qIEFwcGx5IEdhaW4qLwogCi0gICAgU2hpZnRfU2F0X0Zsb2F0KExWUkVWX09VVFBVVEdBSU5fU0hJRlQsCi0gICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgIFNoaWZ0X1NhdF9GbG9hdChMVlJFVl9PVVRQVVRHQUlOX1NISUZULCBwT3V0cHV0LCBwT3V0cHV0LCBzaXplKTsKIAotICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoJnBQcml2YXRlLT5HYWluTWl4ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoJnBQcml2YXRlLT5HYWluTWl4ZXIsIHBPdXRwdXQsIHBPdXRwdXQsIHNpemUpOwogCiAgICAgcmV0dXJuOwogfQogLyogRW5kIG9mIGZpbGUgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuY3BwCmluZGV4IDJhNzU1NTkuLmU1YTBiYzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jcHAKQEAgLTQyLDg0ICs0Miw2NyBAQAogLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZSRVZfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzKExWUkVWX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICpwTmV3UGFyYW1zKQotewotCi0gICAgTFZSRVZfSW5zdGFuY2Vfc3QgICAgICpwTFZSRVZfUHJpdmF0ZSA9IChMVlJFVl9JbnN0YW5jZV9zdCAqKWhJbnN0YW5jZTsKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhMVlJFVl9IYW5kbGVfdCBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCogcE5ld1BhcmFtcykgeworICAgIExWUkVWX0luc3RhbmNlX3N0KiBwTFZSRVZfUHJpdmF0ZSA9IChMVlJFVl9JbnN0YW5jZV9zdCopaEluc3RhbmNlOwogCiAgICAgLyoKICAgICAgKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucwogICAgICAqLwotICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwTmV3UGFyYW1zID09IExWTV9OVUxMKSkKLSAgICB7CisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwTmV3UGFyYW1zID09IExWTV9OVUxMKSkgewogICAgICAgICByZXR1cm4gTFZSRVZfTlVMTEFERFJFU1M7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBDaGVjayBhbGwgbmV3IGNvbnRyb2wgcGFyYW1ldGVycyBhcmUgaW4gcmFuZ2UKICAgICAgKi8KLSAgICBpZiggICAgKChwTmV3UGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09GRikgJiYgKHBOZXdQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT04pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgKAotICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCi0gICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzIyMDUwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjQwMDApICAgICAgICYmCi0gICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYKLSAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJgotICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApCi0gICAgICAgICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184ODIwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKQotICAgICAgICAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTc2NDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKQotICAgICAgICApCi0jaWZkZWYgU1VQUE9SVF9NQwotICAgICAgICB8fCAoKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAgICAgICAmJgotICAgICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJgotICAgICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykgICAgICAgICAmJgotICAgICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTVVMVElDSEFOTkVMKSkpCi0jZWxzZQotICAgICAgICB8fCAoKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJiAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pKSApCi0jZW5kaWYKLSAgICB7CisgICAgaWYgKCgocE5ld1BhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PRkYpICYmCisgICAgICAgICAocE5ld1BhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PTikpIHx8CisgICAgICAgICgocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJgorICAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmCisgICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjIwNTApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yNDAwMCkgJiYKKyAgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJgorICAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ4MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODgyMDApICYmCisgICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfOTYwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNzY0MDApICYmCisgICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKSkgfHwKKyAgICAgICAgKChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX1NURVJFTykgJiYKKyAgICAgICAgIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykgJiYKKyAgICAgICAgIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01VTFRJQ0hBTk5FTCkpKSB7CiAgICAgICAgIHJldHVybiAoTFZSRVZfT1VUT0ZSQU5HRSk7CiAgICAgfQogCi0gICAgaWYgKHBOZXdQYXJhbXMtPkxldmVsID4gTFZSRVZfTUFYX0xFVkVMKQotICAgIHsKKyAgICBpZiAocE5ld1BhcmFtcy0+TGV2ZWwgPiBMVlJFVl9NQVhfTEVWRUwpIHsKICAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7CiAgICAgfQogCi0gICAgaWYgKChwTmV3UGFyYW1zLT5MUEYgPCBMVlJFVl9NSU5fTFBGX0NPUk5FUikgfHwgKHBOZXdQYXJhbXMtPkxQRiA+IExWUkVWX01BWF9MUEZfQ09STkVSKSkKLSAgICB7CisgICAgaWYgKChwTmV3UGFyYW1zLT5MUEYgPCBMVlJFVl9NSU5fTFBGX0NPUk5FUikgfHwgKHBOZXdQYXJhbXMtPkxQRiA+IExWUkVWX01BWF9MUEZfQ09STkVSKSkgewogICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKICAgICB9CiAKLSAgICBpZiAoKHBOZXdQYXJhbXMtPkhQRiA8IExWUkVWX01JTl9IUEZfQ09STkVSKSB8fCAocE5ld1BhcmFtcy0+SFBGID4gTFZSRVZfTUFYX0hQRl9DT1JORVIpKQotICAgIHsKKyAgICBpZiAoKHBOZXdQYXJhbXMtPkhQRiA8IExWUkVWX01JTl9IUEZfQ09STkVSKSB8fCAocE5ld1BhcmFtcy0+SFBGID4gTFZSRVZfTUFYX0hQRl9DT1JORVIpKSB7CiAgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOwogICAgIH0KIAotICAgIGlmIChwTmV3UGFyYW1zLT5UNjAgPiBMVlJFVl9NQVhfVDYwKQotICAgIHsKKyAgICBpZiAocE5ld1BhcmFtcy0+VDYwID4gTFZSRVZfTUFYX1Q2MCkgewogICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKICAgICB9CiAKLSAgICBpZiAocE5ld1BhcmFtcy0+RGVuc2l0eSA+IExWUkVWX01BWF9ERU5TSVRZKQotICAgIHsKKyAgICBpZiAocE5ld1BhcmFtcy0+RGVuc2l0eSA+IExWUkVWX01BWF9ERU5TSVRZKSB7CiAgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOwogICAgIH0KIAotICAgIGlmIChwTmV3UGFyYW1zLT5EYW1waW5nID4gTFZSRVZfTUFYX0RBTVBJTkcpCi0gICAgeworICAgIGlmIChwTmV3UGFyYW1zLT5EYW1waW5nID4gTFZSRVZfTUFYX0RBTVBJTkcpIHsKICAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7CiAgICAgfQogCi0gICAgaWYgKHBOZXdQYXJhbXMtPlJvb21TaXplID4gTFZSRVZfTUFYX1JPT01TSVpFKQotICAgIHsKKyAgICBpZiAocE5ld1BhcmFtcy0+Um9vbVNpemUgPiBMVlJFVl9NQVhfUk9PTVNJWkUpIHsKICAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBDb3B5IHRoZSBuZXcgcGFyYW1ldGVycyBhbmQgc2V0IHRoZSBmbGFnIHRvIGluZGljYXRlIHRoZXkgYXJlIGF2YWlsYWJsZQogICAgICAqLwotICAgIHBMVlJFVl9Qcml2YXRlLT5OZXdQYXJhbXMgICAgICAgPSAqcE5ld1BhcmFtczsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+TmV3UGFyYW1zID0gKnBOZXdQYXJhbXM7CiAgICAgcExWUkVWX1ByaXZhdGUtPmJDb250cm9sUGVuZGluZyA9IExWTV9UUlVFOwogCiAgICAgcmV0dXJuIExWUkVWX1NVQ0NFU1M7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmNwcAppbmRleCA1Y2Q2MjNlLi5iYjZjZjEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jcHAKQEAgLTI5LDI2ICsyOSwxNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorY29uc3QgTFZNX0lOVDE2IExWUkVWX01BWF9UX0RFTEFZW10gPSB7TFZSRVZfTUFYX1QwX0RFTEFZLCBMVlJFVl9NQVhfVDFfREVMQVksIExWUkVWX01BWF9UMl9ERUxBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX01BWF9UM19ERUxBWX07Citjb25zdCBMVk1fSU5UMTYgTFZSRVZfTUFYX0FQX0RFTEFZW10gPSB7TFZSRVZfTUFYX0FQMF9ERUxBWSwgTFZSRVZfTUFYX0FQMV9ERUxBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NQVhfQVAyX0RFTEFZLCBMVlJFVl9NQVhfQVAzX0RFTEFZfTsKKwogLyogVGFibGUgd2l0aCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMuICBUaGUgdGFibGUgY2FuIGJlIGluZGV4ZWQgdXNpbmcgTFZNX0ZzX2VuICAgICAgICovCi1jb25zdCBMVk1fVUlOVDMyIExWTV9Gc1RhYmxlW10gPSB7Ci0gICAgODAwMCAsCi0gICAgMTEwMjUsCi0gICAgMTIwMDAsCi0gICAgMTYwMDAsCi0gICAgMjIwNTAsCi0gICAgMjQwMDAsCi0gICAgMzIwMDAsCi0gICAgNDQxMDAsCi0gICAgNDgwMDAsCi0gICAgODgyMDAsCi0gICAgOTYwMDAsCi0gICAgMTc2NDAwLAotICAgIDE5MjAwMAotfTsKK2NvbnN0IExWTV9VSU5UMzIgTFZNX0ZzVGFibGVbXSA9IHs4MDAwLCAgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsICAyNDAwMCwgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsIDQ4MDAwLCA4ODIwMCwgOTYwMDAsIDE3NjQwMCwgMTkyMDAwfTsKIC8qIFRhYmxlIHdpdGggc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzLiAgVGhlIHRhYmxlIGNhbiBiZSBpbmRleGVkIHVzaW5nIExWTV9Gc19lbiAgICAgICAqLwotTFZNX1VJTlQzMiBMVk1fR2V0RnNGcm9tVGFibGUoTFZNX0ZzX2VuIEZzSW5kZXgpewotICAgIGlmIChGc0luZGV4ID4gTFZNX0ZTXzE5MjAwMCkKLSAgICAgICAgcmV0dXJuIDA7CitMVk1fVUlOVDMyIExWTV9HZXRGc0Zyb21UYWJsZShMVk1fRnNfZW4gRnNJbmRleCkgeworICAgIGlmIChGc0luZGV4ID4gTFZNX0ZTXzE5MjAwMCkgcmV0dXJuIDA7CiAKICAgICByZXR1cm4gKExWTV9Gc1RhYmxlW0ZzSW5kZXhdKTsKIH0KQEAgLTczLDMwICs2NCwxNzQgQEAKICAgKi8KIAogLyogTm9ybWFsaXppbmcgb3V0cHV0IGluY2x1ZGluZyBSZXZlcmIgTGV2ZWwgcGFydCAob25seSBzaGlmdCB1cCkqLwotY29uc3QgTFZNX0ZMT0FUIExWUkVWX0dhaW5Qb2x5VGFibGVbMjRdWzVdPXt7MSwxLjA0NTkwOWYsNy42ODEwOThmLC03LjIxMTUwMGYsMy4wMjU2MDVmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyLDEuMDg4MTk0ZiwxMC4yOTE3NDlmLC0xMS41MTM3ODdmLDUuMjY1ODE3Zix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MywwLjk4ODkxOWYsOC4yOTk5NTZmLC04LjkyMDg2MmYsMy45Nzk4MDZmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs0LDEuMDM1OTI3ZiwxMC4xODI1NjdmLC0xMC4zNDYxMzRmLDQuNTQ2NTMzZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NSwxLjEzMDMxM2YsMTIuNTM4NzI3ZiwtMTMuNjI3MDIzZiw2LjE2NTIwOGYsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezYsMS4wNjA3NDNmLDguMDkxNzEzZiwtOC41ODgwNzlmLDMuODM0MjMwZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NywxLjA0MDM4MWYsMTAuNDA2NTY2ZiwtMTEuMTc2NjUwZiw1LjA3NTEzMmYsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezgsMS4wMjY5NDRmLDguMzg3MzAyZiwtOC42ODk3OTZmLDMuODk1ODYzZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7OSwxLjAxMzMxMmYsOS43MjcyMzZmLC0xMC41MzQxNjVmLDQuNzQyMjcyZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTAsMC45OTYwOTVmLDguNDkyMjQ5ZiwtNy45NDc2NzdmLDMuNDc4OTE3Zix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTMsMS4wNzkzNDZmLDguODk0NDI1ZiwtOS42NDE3NjhmLDQuNDM0NDQyZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTUsMC45OTQzMjdmLDcuNDQxMzM1ZiwtOC4wMDM5NzlmLDMuNTgxMTc3Zix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTcsMC45OTEwNjdmLDcuMjA4MzczZiwtNy4yNTc4NTlmLDMuMTY3Nzc0Zix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MjAsMS4wMzM0NDVmLDcuNDc2MzcxZiwtNy41NDY5NjBmLDMuMzY5NzAzZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MjUsMC45ODI4MzBmLDUuOTEzODY3ZiwtNS42Mzg0NDhmLDIuNDIwOTMyZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MzAsMC45Mjg3ODJmLDUuMDM1MzQzZiwtNC40OTIxMDRmLDEuODQ0OTA0Zix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NDAsMC45NTM3MTRmLDUuMDYwMjMyZiwtNC40NzIyMDRmLDEuODI5NjQyZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NTAsMC44OTkyNThmLDQuMjczMzU3ZiwtMy41Mzc0OTJmLDEuMzg3NTc2Zix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NjAsMC45NDM1ODRmLDQuMDkzMjI4ZiwtMy40Njk2NThmLDEuNDEwOTExZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NzAsMC45MjYwMjFmLDMuOTczMTI1ZiwtMy4zMzE5ODVmLDEuMzQ0NjkwZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NzUsMC44OTQ4NTNmLDIuODcxNzQ3ZiwtMS40Mzg3NThmLDAuMzExODU2Zix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ODAsMC45MzUxMjJmLDIuOTkxODU3ZiwtMi4wMzg4ODJmLDAuNjg2Mzk1Zix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7OTAsMC45NTM4NzJmLDIuODgwMzE1ZiwtMi4xMjIzNjVmLDAuNzg0MDMyZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTAwLDAuOTUxMDA1ZiwyLjg5NDI5NGYsLTIuMDA5MDg2ZiwwLjY5ODMxNmYsfSwKK2NvbnN0IExWTV9GTE9BVCBMVlJFVl9HYWluUG9seVRhYmxlWzI0XVs1XSA9IHsKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgMS4wNDU5MDlmLAorICAgICAgICAgICAgICAgIDcuNjgxMDk4ZiwKKyAgICAgICAgICAgICAgICAtNy4yMTE1MDBmLAorICAgICAgICAgICAgICAgIDMuMDI1NjA1ZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDIsCisgICAgICAgICAgICAgICAgMS4wODgxOTRmLAorICAgICAgICAgICAgICAgIDEwLjI5MTc0OWYsCisgICAgICAgICAgICAgICAgLTExLjUxMzc4N2YsCisgICAgICAgICAgICAgICAgNS4yNjU4MTdmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgMywKKyAgICAgICAgICAgICAgICAwLjk4ODkxOWYsCisgICAgICAgICAgICAgICAgOC4yOTk5NTZmLAorICAgICAgICAgICAgICAgIC04LjkyMDg2MmYsCisgICAgICAgICAgICAgICAgMy45Nzk4MDZmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgNCwKKyAgICAgICAgICAgICAgICAxLjAzNTkyN2YsCisgICAgICAgICAgICAgICAgMTAuMTgyNTY3ZiwKKyAgICAgICAgICAgICAgICAtMTAuMzQ2MTM0ZiwKKyAgICAgICAgICAgICAgICA0LjU0NjUzM2YsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICA1LAorICAgICAgICAgICAgICAgIDEuMTMwMzEzZiwKKyAgICAgICAgICAgICAgICAxMi41Mzg3MjdmLAorICAgICAgICAgICAgICAgIC0xMy42MjcwMjNmLAorICAgICAgICAgICAgICAgIDYuMTY1MjA4ZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDYsCisgICAgICAgICAgICAgICAgMS4wNjA3NDNmLAorICAgICAgICAgICAgICAgIDguMDkxNzEzZiwKKyAgICAgICAgICAgICAgICAtOC41ODgwNzlmLAorICAgICAgICAgICAgICAgIDMuODM0MjMwZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDcsCisgICAgICAgICAgICAgICAgMS4wNDAzODFmLAorICAgICAgICAgICAgICAgIDEwLjQwNjU2NmYsCisgICAgICAgICAgICAgICAgLTExLjE3NjY1MGYsCisgICAgICAgICAgICAgICAgNS4wNzUxMzJmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAxLjAyNjk0NGYsCisgICAgICAgICAgICAgICAgOC4zODczMDJmLAorICAgICAgICAgICAgICAgIC04LjY4OTc5NmYsCisgICAgICAgICAgICAgICAgMy44OTU4NjNmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgOSwKKyAgICAgICAgICAgICAgICAxLjAxMzMxMmYsCisgICAgICAgICAgICAgICAgOS43MjcyMzZmLAorICAgICAgICAgICAgICAgIC0xMC41MzQxNjVmLAorICAgICAgICAgICAgICAgIDQuNzQyMjcyZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDEwLAorICAgICAgICAgICAgICAgIDAuOTk2MDk1ZiwKKyAgICAgICAgICAgICAgICA4LjQ5MjI0OWYsCisgICAgICAgICAgICAgICAgLTcuOTQ3Njc3ZiwKKyAgICAgICAgICAgICAgICAzLjQ3ODkxN2YsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAxMywKKyAgICAgICAgICAgICAgICAxLjA3OTM0NmYsCisgICAgICAgICAgICAgICAgOC44OTQ0MjVmLAorICAgICAgICAgICAgICAgIC05LjY0MTc2OGYsCisgICAgICAgICAgICAgICAgNC40MzQ0NDJmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgMTUsCisgICAgICAgICAgICAgICAgMC45OTQzMjdmLAorICAgICAgICAgICAgICAgIDcuNDQxMzM1ZiwKKyAgICAgICAgICAgICAgICAtOC4wMDM5NzlmLAorICAgICAgICAgICAgICAgIDMuNTgxMTc3ZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDE3LAorICAgICAgICAgICAgICAgIDAuOTkxMDY3ZiwKKyAgICAgICAgICAgICAgICA3LjIwODM3M2YsCisgICAgICAgICAgICAgICAgLTcuMjU3ODU5ZiwKKyAgICAgICAgICAgICAgICAzLjE2Nzc3NGYsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAyMCwKKyAgICAgICAgICAgICAgICAxLjAzMzQ0NWYsCisgICAgICAgICAgICAgICAgNy40NzYzNzFmLAorICAgICAgICAgICAgICAgIC03LjU0Njk2MGYsCisgICAgICAgICAgICAgICAgMy4zNjk3MDNmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgMjUsCisgICAgICAgICAgICAgICAgMC45ODI4MzBmLAorICAgICAgICAgICAgICAgIDUuOTEzODY3ZiwKKyAgICAgICAgICAgICAgICAtNS42Mzg0NDhmLAorICAgICAgICAgICAgICAgIDIuNDIwOTMyZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDMwLAorICAgICAgICAgICAgICAgIDAuOTI4NzgyZiwKKyAgICAgICAgICAgICAgICA1LjAzNTM0M2YsCisgICAgICAgICAgICAgICAgLTQuNDkyMTA0ZiwKKyAgICAgICAgICAgICAgICAxLjg0NDkwNGYsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICA0MCwKKyAgICAgICAgICAgICAgICAwLjk1MzcxNGYsCisgICAgICAgICAgICAgICAgNS4wNjAyMzJmLAorICAgICAgICAgICAgICAgIC00LjQ3MjIwNGYsCisgICAgICAgICAgICAgICAgMS44Mjk2NDJmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgNTAsCisgICAgICAgICAgICAgICAgMC44OTkyNThmLAorICAgICAgICAgICAgICAgIDQuMjczMzU3ZiwKKyAgICAgICAgICAgICAgICAtMy41Mzc0OTJmLAorICAgICAgICAgICAgICAgIDEuMzg3NTc2ZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDYwLAorICAgICAgICAgICAgICAgIDAuOTQzNTg0ZiwKKyAgICAgICAgICAgICAgICA0LjA5MzIyOGYsCisgICAgICAgICAgICAgICAgLTMuNDY5NjU4ZiwKKyAgICAgICAgICAgICAgICAxLjQxMDkxMWYsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICA3MCwKKyAgICAgICAgICAgICAgICAwLjkyNjAyMWYsCisgICAgICAgICAgICAgICAgMy45NzMxMjVmLAorICAgICAgICAgICAgICAgIC0zLjMzMTk4NWYsCisgICAgICAgICAgICAgICAgMS4zNDQ2OTBmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgNzUsCisgICAgICAgICAgICAgICAgMC44OTQ4NTNmLAorICAgICAgICAgICAgICAgIDIuODcxNzQ3ZiwKKyAgICAgICAgICAgICAgICAtMS40Mzg3NThmLAorICAgICAgICAgICAgICAgIDAuMzExODU2ZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDgwLAorICAgICAgICAgICAgICAgIDAuOTM1MTIyZiwKKyAgICAgICAgICAgICAgICAyLjk5MTg1N2YsCisgICAgICAgICAgICAgICAgLTIuMDM4ODgyZiwKKyAgICAgICAgICAgICAgICAwLjY4NjM5NWYsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICA5MCwKKyAgICAgICAgICAgICAgICAwLjk1Mzg3MmYsCisgICAgICAgICAgICAgICAgMi44ODAzMTVmLAorICAgICAgICAgICAgICAgIC0yLjEyMjM2NWYsCisgICAgICAgICAgICAgICAgMC43ODQwMzJmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgMTAwLAorICAgICAgICAgICAgICAgIDAuOTUxMDA1ZiwKKyAgICAgICAgICAgICAgICAyLjg5NDI5NGYsCisgICAgICAgICAgICAgICAgLTIuMDA5MDg2ZiwKKyAgICAgICAgICAgICAgICAwLjY5ODMxNmYsCisgICAgICAgIH0sCiB9OwogLyogRW5kIG9mIGZpbGUgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuaAppbmRleCBlMTAwZDhhLi43MjNkMWZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuaApAQCAtMzEsMTEgKzMxLDEzIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1leHRlcm4gY29uc3QgICAgTFZNX1VJTlQzMiAgTFZNX0ZzVGFibGVbXTsKLWV4dGVybiAgICAgICAgICBMVk1fVUlOVDMyICBMVk1fR2V0RnNGcm9tVGFibGUoTFZNX0ZzX2VuIEZzSW5kZXgpOworZXh0ZXJuIGNvbnN0IExWTV9VSU5UMzIgTFZNX0ZzVGFibGVbXTsKK2V4dGVybiBMVk1fVUlOVDMyIExWTV9HZXRGc0Zyb21UYWJsZShMVk1fRnNfZW4gRnNJbmRleCk7CiAKLWV4dGVybiBjb25zdCAgICBMVk1fRkxPQVQgICBMVlJFVl9HYWluUG9seVRhYmxlWzI0XVs1XTsKK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZSRVZfR2FpblBvbHlUYWJsZVsyNF1bNV07CitleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWUkVWX01BWF9UX0RFTEFZW107CitleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWUkVWX01BWF9BUF9ERUxBWVtdOwogCi0jZW5kaWYgIC8qKiBfTFZSRVZfVEFCTEVTX0hfICoqLworI2VuZGlmIC8qKiBfTFZSRVZfVEFCTEVTX0hfICoqLwogCiAvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliL0xWUFNBLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIvTFZQU0EuaAppbmRleCBjOWZhN2FkLi44NWUzYWI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIvTFZQU0EuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIvTFZQU0EuaApAQCAtMjIsMjU1ICsyMiwxOTEgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDT05TVEFOVFMgREVGSU5JVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogTWVtb3J5IHRhYmxlKi8KLSNkZWZpbmUgICAgIExWUFNBX05SX01FTU9SWV9SRUdJT05TICAgICAgICAgICAgICAgICAgNCAgICAgIC8qIE51bWJlciBvZiBtZW1vcnkgcmVnaW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVFlQRVMgREVGSU5JVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBNZW1vcnkgVHlwZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWUFNBX1BFUlNJU1RFTlQgICAgICA9IExWTV9QRVJTSVNURU5ULAotICAgIExWUFNBX1BFUlNJU1RFTlRfREFUQSA9IExWTV9QRVJTSVNURU5UX0RBVEEsCi0gICAgTFZQU0FfUEVSU0lTVEVOVF9DT0VGID0gTFZNX1BFUlNJU1RFTlRfQ09FRiwKLSAgICBMVlBTQV9TQ1JBVENIICAgICAgICAgPSBMVk1fU0NSQVRDSCwKLSAgICBMVlBTQV9NRU1PUllfRFVNTVkgPSBMVk1fTUFYSU5UXzMyICAgICAgICAgICAgICAgICAgICAgIC8qIEZvcmNlIDMyIGJpdHMgZW51bSwgZG9uJ3QgdXNlIGl0ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi19IExWUFNBX01lbW9yeVR5cGVzX2VuOwotCiAvKiBMZXZlbCBkZXRlY3Rpb24gc3BlZWQgY29udHJvbCBwYXJhbWV0ZXJzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVlBTQV9TUEVFRF9MT1csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBzcGVlZCBsZXZlbCAgIGRldGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZQU0FfU1BFRURfTUVESVVNLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNZWRpdW0gc3BlZWQgbGV2ZWwgICBkZXRlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWUFNBX1NQRUVEX0hJR0gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBzcGVlZCBsZXZlbCAgIGRldGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVlBTQV9TUEVFRF9EVU1NWSA9IExWTV9NQVhJTlRfMzIgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvcmNlIDMyIGJpdHMgZW51bSwgZG9uJ3QgdXNlIGl0ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit0eXBlZGVmIGVudW0geworICAgIExWUFNBX1NQRUVEX0xPVywgICAgLyogTG93IHNwZWVkIGxldmVsICAgZGV0ZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVlBTQV9TUEVFRF9NRURJVU0sIC8qIE1lZGl1bSBzcGVlZCBsZXZlbCAgIGRldGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfU1BFRURfSElHSCwgICAvKiBIaWdoIHNwZWVkIGxldmVsICAgZGV0ZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWUFNBX1NQRUVEX0RVTU1ZID0gTFZNX01BWElOVF8zMiAvKiBGb3JjZSAzMiBiaXRzIGVudW0sIGRvbid0IHVzZSBpdCEgKi8KIH0gTFZQU0FfTGV2ZWxEZXRlY3RTcGVlZF9lbjsKIAogLyogRmlsdGVyIGNvbnRyb2wgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBDZW50ZXJGcmVxdWVuY3k7ICAgICAgICAgICAgIC8qIENlbnRlciBmcmVxdWVuY3kgb2YgdGhlIGJhbmQtcGFzcyBmaWx0ZXIgKGluIEh6KSAgICAgICAgICAgICAgICAgICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgUUZhY3RvcjsgICAgICAgICAgICAgICAgICAgICAvKiBRdWFsaXR5IGZhY3RvciBvZiB0aGUgZmlsdGVyICAgICAgICAgICAgIChpbiAxLzEwMCkgICAgICAgICAgICAgICAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgIFBvc3RHYWluOyAgICAgICAgICAgICAgICAgICAgLyogUG9zdGdhaW4gdG8gYXBwbHkgYWZ0ZXIgdGhlIGZpbHRlcmluZyAgICAoaW4gZEIgUTE2LjApICAgICAgICAgICAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fVUlOVDE2IENlbnRlckZyZXF1ZW5jeTsgLyogQ2VudGVyIGZyZXF1ZW5jeSBvZiB0aGUgYmFuZC1wYXNzIGZpbHRlciAoaW4gSHopICovCisgICAgTFZNX1VJTlQxNiBRRmFjdG9yOyAvKiBRdWFsaXR5IGZhY3RvciBvZiB0aGUgZmlsdGVyICAgICAgICAgICAgIChpbiAxLzEwMCkgICAgICAgICAgICAgICAqLworICAgIExWTV9JTlQxNiBQb3N0R2FpbjsgLyogUG9zdGdhaW4gdG8gYXBwbHkgYWZ0ZXIgdGhlIGZpbHRlcmluZyAgICAoaW4gZEIgUTE2LjApICAgICAgICAgICAgKi8KIAogfSBMVlBTQV9GaWx0ZXJQYXJhbV90OwogCiAvKiBMVlBTQSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIFNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOyAgLyogU3BlY3RyYWwgZGF0YSBidWZmZXIgZHVyYXRpb24gaW4gdGltZSAobXMgaW4gUTE2LjApICAgICAgICAgICAgICAgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBNYXhJbnB1dEJsb2NrU2l6ZTsgICAgICAgICAgIC8qIE1heGltdW0gZXhwZWN0ZWQgaW5wdXQgYmxvY2sgc2l6ZSAoaW4gc2FtcGxlcykgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgbkJhbmRzOyAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmFuZHMgb2YgdGhlIFNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAgICAgKnBGaWx0ZXJzUGFyYW1zOyAgICAgICAgICAgICAgLyogUG9pbnRzIHRvIG5CYW5kcyBmaWx0ZXIgcGFyYW0gc3RydWN0dXJlcyBmb3IgZmlsdGVycyBzZXR0aW5ncyAgICAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fVUlOVDE2CisgICAgICAgICAgICBTcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbjsgLyogU3BlY3RyYWwgZGF0YSBidWZmZXIgZHVyYXRpb24gaW4gdGltZSAobXMgaW4gUTE2LjApICovCisgICAgTFZNX1VJTlQxNiBNYXhJbnB1dEJsb2NrU2l6ZTsgICAgICAgLyogTWF4aW11bSBleHBlY3RlZCBpbnB1dCBibG9jayBzaXplIChpbiBzYW1wbGVzKSAgICAgICAqLworICAgIExWTV9VSU5UMTYgbkJhbmRzOyAvKiBOdW1iZXIgb2YgYmFuZHMgb2YgdGhlIFNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWUFNBX0ZpbHRlclBhcmFtX3QqCisgICAgICAgICAgICBwRmlsdGVyc1BhcmFtczsgLyogUG9pbnRzIHRvIG5CYW5kcyBmaWx0ZXIgcGFyYW0gc3RydWN0dXJlcyBmb3IgZmlsdGVycyBzZXR0aW5ncyAgICAgKi8KIAogfSBMVlBTQV9Jbml0UGFyYW1zX3QsICpwTFZQU0FfSW5pdFBhcmFtc190OwogCiAvKiBMVlBTQSBjb250cm9sIHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgICAgRnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBzYW1wbGluZyByYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWUFNBX0xldmVsRGV0ZWN0U3BlZWRfZW4gIExldmVsRGV0ZWN0aW9uU3BlZWQ7ICAgICAgICAgLyogTGV2ZWwgZGV0ZWN0aW9uIHNwZWVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fRnNfZW4gRnM7IC8qIElucHV0IHNhbXBsaW5nIHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfTGV2ZWxEZXRlY3RTcGVlZF9lbiBMZXZlbERldGVjdGlvblNwZWVkOyAvKiBMZXZlbCBkZXRlY3Rpb24gc3BlZWQgKi8KIAogfSBMVlBTQV9Db250cm9sUGFyYW1zX3QsICpwTFZQU0FfQ29udHJvbFBhcmFtc190OwogCi0vKiBNZW1vcnkgcmVnaW9uIGRlZmluaXRpb24gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gc2l6ZSBpbiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWUFNBX01lbW9yeVR5cGVzX2VuICAgICAgIFR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqcEJhc2VBZGRyZXNzOyAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHJlZ2lvbiBiYXNlIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi19IExWUFNBX01lbW9yeVJlZ2lvbl90OwotCi0vKiBNZW1vcnkgdGFibGUgY29udGFpbmluZyB0aGUgcmVnaW9uIGRlZmluaXRpb25zICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWUFNBX01lbW9yeVJlZ2lvbl90ICAgICAgIFJlZ2lvbltMVlBTQV9OUl9NRU1PUllfUkVHSU9OU107LyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLX0gTFZQU0FfTWVtVGFiX3Q7Ci0KIC8qIEF1ZGlvIHRpbWUgdHlwZSAqLwogdHlwZWRlZiBMVk1fSU5UMzIgTFZQU0FfVGltZTsKIAogLyogTW9kdWxlIGluc3RhbmNlIEhhbmRsZSAqLwotdHlwZWRlZiB2b2lkICpwTFZQU0FfSGFuZGxlX3Q7Cit0eXBlZGVmIHZvaWQqIHBMVlBTQV9IYW5kbGVfdDsKIAogLyogTFZQU0EgcmV0dXJuIGNvZGVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVlBTQV9PSywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBmdW5jdGlvbiByYW4gd2l0aG91dCBhbnkgcHJvYmxlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBIHBhcmFtZXRlciBpcyBpbmNvcnJlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWUFNBX0VSUk9SX1dST05HVElNRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQW4gaW5jb3JyZWN0IEF1ZGlvVGltZSBpcyB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVlBTQV9FUlJPUl9OVUxMQUREUkVTUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEgcG9pbnRlciBoYXMgYSBOVUxMIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZQU0FfUkVUVVJOX0RVTU1ZID0gTFZNX01BWElOVF8zMiAgICAgICAgICAgICAgICAgICAgICAvKiBGb3JjZSAzMiBiaXRzIGVudW0sIGRvbid0IHVzZSBpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBMVlBTQV9PSywgLyogVGhlIGZ1bmN0aW9uIHJhbiB3aXRob3V0IGFueSBwcm9ibGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0sIC8qIEEgcGFyYW1ldGVyIGlzIGluY29ycmVjdCAqLworICAgIExWUFNBX0VSUk9SX1dST05HVElNRSwgICAvKiBBbiBpbmNvcnJlY3QgQXVkaW9UaW1lIGlzIHVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWUFNBX0VSUk9SX05VTExBRERSRVNTLCAvKiBBIHBvaW50ZXIgaGFzIGEgTlVMTCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWUFNBX1JFVFVSTl9EVU1NWSA9IExWTV9NQVhJTlRfMzIgLyogRm9yY2UgMzIgYml0cyBlbnVtLCBkb24ndCB1c2UgaXQhICovCiB9IExWUFNBX1JFVFVSTjsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT05TIFBST1RPVFlQRQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBJbnN0YW5jZSBoYW5kbGUgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgdGhlIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZnJlZSAoaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlKSB0aGUgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBJbml0UGFyYW1zICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaW5pdCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9NZW1vcnkgICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9NZW1UYWJfdCAgICAgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfSW5pdFBhcmFtc190ICAgICAgICAgKnBJbml0UGFyYW1zICAgICk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDcmVhdGUgYW5kIEluaXRpYWxpemUgdGhlIExWUFNBIG1vZHVsZSBpbmNsdWRpbmcgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluaXRQYXJhbXMgICAgICAgICAgSW5pdCBwYXJhbWV0ZXJzIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb250cm9sUGFyYW1zICAgICAgIENvbnRyb2wgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFNjcmF0Y2ggICAgICAgICAgICBQb2ludGVyIHRvIGJ1bmRsZSBzY3JhdGNoIG1lbW9yeSBhcmVhICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9Jbml0KHBMVlBTQV9IYW5kbGVfdCogcGhJbnN0YW5jZSwgTFZQU0FfSW5pdFBhcmFtc190KiBwSW5pdFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCogcENvbnRyb2xQYXJhbXMsIHZvaWQqIHBTY3JhdGNoKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9EZUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGcmVlIHRoZSBtZW1vcmllcyBjcmVhdGVkIGluIExWUFNBX0luaXQgY2FsbCBpbmNsdWRpbmcgaW5zdGFuY2UgaGFuZGxlICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIExWUFNBX0RlSW5pdChwTFZQU0FfSGFuZGxlX3QqIHBoSW5zdGFuY2UpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9Db250cm9sICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbml0aWFsaXplcyB0aGUgTFZQU0EgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogKi8KKy8qICBDb250cm9scyB0aGUgTFZQU0EgbW9kdWxlLiAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgKi8KKy8qICBwTmV3UGFyYW1zICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIG5ldyBjb250cm9sIHBhcmFtZXRlcnMgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBoSW5zdGFuY2UgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwSW5pdFBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGluaXQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcENvbnRyb2xQYXJhbXMgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBjb250cm9sIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0luaXQgICAgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgICpwaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfSW5pdFBhcmFtc190ICAgICAgICAgICpwSW5pdFBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICAqcENvbnRyb2xQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9NZW1UYWJfdCAgICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSAgKTsKK0xWUFNBX1JFVFVSTiBMVlBTQV9Db250cm9sKHBMVlBTQV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWUFNBX0NvbnRyb2xQYXJhbXNfdCogcE5ld1BhcmFtcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfQ29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1Byb2Nlc3MgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvbnRyb2xzIHRoZSBMVlBTQSBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAqLworLyogIFRoZSBwcm9jZXNzIGNhbGN1bGF0ZXMgdGhlIGxldmVscyBvZiB0aGUgZnJlcXVlbmN5IGJhbmRzLiAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBOZXdQYXJhbXMgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgbmV3IGNvbnRyb2wgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgKi8KKy8qICBwTFZQU0FfSW5wdXRTYW1wbGVzIFBvaW50ZXIgdG8gdGhlIGlucHV0IHNhbXBsZXMgYnVmZmVyICovCisvKiAgSW5wdXRCbG9ja1NpemUgICAgICBOdW1iZXIgb2YgbW9ubyBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKy8qICBBdWRpb1RpbWUgICAgICAgICAgIFBsYXliYWNrIHRpbWUgb2YgdGhlIGZpcnN0IGlucHV0IHNhbXBsZSAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAqLworLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgKi8KKy8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlBTQV9SRVRVUk4gTFZQU0FfQ29udHJvbCAgICAgICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBOZXdQYXJhbXMgICAgICk7CitMVlBTQV9SRVRVUk4gTFZQU0FfUHJvY2VzcyhwTFZQU0FfSGFuZGxlX3QgaEluc3RhbmNlLCBMVk1fRkxPQVQqIHBMVlBTQV9JbnB1dFNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IElucHV0QmxvY2tTaXplLCBMVlBTQV9UaW1lIEF1ZGlvVGltZSk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0dldFNwZWN0cnVtICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgKi8KKy8qICBHZXRTcGVjdHJ1bUF1ZGlvVGltZSBUaW1lIHRvIHJldHJpZXZlIHRoZSB2YWx1ZXMgYXQgKi8KKy8qICBwQ3VycmVudFZhbHVlcyAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGJ1ZmZlciA6IEN1cnJlbnQgbGV2ZWwgdmFsdWVzIG91dHB1dCAqLworLyogIHBQZWFrVmFsdWVzICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgYnVmZmVyIDogUGVhayBsZXZlbCB2YWx1ZXMgb3V0cHV0ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9HZXRTcGVjdHJ1bShwTFZQU0FfSGFuZGxlX3QgaEluc3RhbmNlLCBMVlBTQV9UaW1lIEdldFNwZWN0cnVtQXVkaW9UaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCogcEN1cnJlbnRWYWx1ZXMsIExWTV9VSU5UOCogcFBlYWtWYWx1ZXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9HZXRDb250cm9sUGFyYW1zICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGUgcHJvY2VzcyBjYWxjdWxhdGVzIHRoZSBsZXZlbHMgb2YgdGhlIGZyZXF1ZW5jeSBiYW5kcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogKi8KKy8qICBHZXQgdGhlIGN1cnJlbnQgY29udHJvbCBwYXJhbWV0ZXJzIG9mIHRoZSBMVlBTQSBtb2R1bGUuICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcExWUFNBX0lucHV0U2FtcGxlcyBQb2ludGVyIHRvIHRoZSBpbnB1dCBzYW1wbGVzIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIElucHV0QmxvY2tTaXplICAgICAgTnVtYmVyIG9mIG1vbm8gc2FtcGxlcyB0byBwcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBBdWRpb1RpbWUgICAgICAgICAgIFBsYXliYWNrIHRpbWUgb2YgdGhlIGZpcnN0IGlucHV0IHNhbXBsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgY29udHJvbCBwYXJhbWV0ZXJzIHN0cnVjdHVyZSAqLworLyogUkVUVVJOUzogKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX1Byb2Nlc3MgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcExWUFNBX0lucHV0U2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgIElucHV0QmxvY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfVGltZSAgICAgICAgICAgQXVkaW9UaW1lICAgICAgICAgICAgICk7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0dldFNwZWN0cnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEdldFNwZWN0cnVtQXVkaW9UaW1lIFRpbWUgdG8gcmV0cmlldmUgdGhlIHZhbHVlcyBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwQ3VycmVudFZhbHVlcyAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGJ1ZmZlciA6IEN1cnJlbnQgbGV2ZWwgdmFsdWVzIG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFBlYWtWYWx1ZXMgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBidWZmZXIgOiBQZWFrIGxldmVsIHZhbHVlcyBvdXRwdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9HZXRTcGVjdHJ1bSAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX1RpbWUgICAgICAgICAgIEdldFNwZWN0cnVtQXVkaW9UaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAqcEN1cnJlbnRWYWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICpwUGVha1ZhbHVlcyAgICAgICAgICAgKTsKK0xWUFNBX1JFVFVSTiBMVlBTQV9HZXRDb250cm9sUGFyYW1zKHBMVlBTQV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWUFNBX0NvbnRyb2xQYXJhbXNfdCogcFBhcmFtcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfR2V0Q29udHJvbFBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0dldEluaXRQYXJhbXMgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEdldCB0aGUgY3VycmVudCBjb250cm9sIHBhcmFtZXRlcnMgb2YgdGhlIExWUFNBIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAqLworLyogIEdldCB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBvZiB0aGUgTFZQU0EgbW9kdWxlLiAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBQYXJhbXMgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBjb250cm9sIHBhcmFtZXRlcnMgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgaW5pdCBwYXJhbWV0ZXJzIHN0cnVjdHVyZSAqLworLyogUkVUVVJOUzogKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0dldENvbnRyb2xQYXJhbXMgICggICAgcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAqcFBhcmFtcyAgICAgICk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfR2V0SW5pdFBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEdldCB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBvZiB0aGUgTFZQU0EgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwUGFyYW1zICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgaW5pdCBwYXJhbWV0ZXJzIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9HZXRJbml0UGFyYW1zICAgICAoICAgIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgICAgICAgKnBQYXJhbXMgICAgICApOworTFZQU0FfUkVUVVJOIExWUFNBX0dldEluaXRQYXJhbXMocExWUFNBX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZQU0FfSW5pdFBhcmFtc190KiBwUGFyYW1zKTsKIAogI2VuZGlmIC8qIF9MVlBTQV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jcHAKaW5kZXggZGVhZmFhNy4uOGU2MzUwMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmNwcApAQCAtMTUsMzAgKzE1LDI2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSAgICAiTFZQU0EuaCIKLSNpbmNsdWRlICAgICJMVlBTQV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAgICAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgIkxWUFNBLmgiCisjaW5jbHVkZSAiTFZQU0FfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKIAotI2RlZmluZSAgICAgTE9XX0ZSRVEgICAgICAgICAgICAyOTggICAgICAgICAgICAgLyogMzI3NjgvMTEwIGZvciBsb3cgdGVzdCBmcmVxdWVuY3kgKi8KLSNkZWZpbmUgICAgIEhJR0hfRlJFUSAgICAgICAgICAgMzg2ICAgICAgICAgICAgIC8qIDMyNzY4Lzg1IGZvciBoaWdoIHRlc3QgZnJlcXVlbmN5ICovCisjZGVmaW5lIExPV19GUkVRIDI5OCAgLyogMzI3NjgvMTEwIGZvciBsb3cgdGVzdCBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgSElHSF9GUkVRIDM4NiAvKiAzMjc2OC84NSBmb3IgaGlnaCB0ZXN0IGZyZXF1ZW5jeSAqLwogCi1MVlBTQV9SRVRVUk4gTFZQU0FfU2V0QlBGaWx0ZXJzVHlwZSAoICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICpwSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwUGFyYW1zICApOworTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRmlsdGVyc1R5cGUoTFZQU0FfSW5zdGFuY2VQcl90KiBwSW5zdCwgTFZQU0FfQ29udHJvbFBhcmFtc190KiBwUGFyYW1zKTsKIAotTFZQU0FfUkVUVVJOIExWUFNBX1NldFFQRkNvZWZmaWNpZW50cyggTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcyAgKTsKK0xWUFNBX1JFVFVSTiBMVlBTQV9TZXRRUEZDb2VmZmljaWVudHMoTFZQU0FfSW5zdGFuY2VQcl90KiBwSW5zdCwgTFZQU0FfQ29udHJvbFBhcmFtc190KiBwUGFyYW1zKTsKIAotTFZQU0FfUkVUVVJOIExWUFNBX0JQU2luZ2xlUHJlY0NvZWZzKCAgTFZNX1VJTlQxNiAgICAgICAgICAgICBGcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAqcEZpbHRlclBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICpwQ29lZmZpY2llbnRzKTsKK0xWUFNBX1JFVFVSTiBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcyhMVk1fVUlOVDE2IEZzLCBMVlBTQV9GaWx0ZXJQYXJhbV90KiBwRmlsdGVyUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QqIHBDb2VmZmljaWVudHMpOwogCi1MVlBTQV9SRVRVUk4gTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoICBMVk1fVUlOVDE2ICAgICAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAqcEZpbHRlclBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgKnBDb2VmZmljaWVudHMpOwotTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRkNvZWZmaWNpZW50cyggTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcyAgKTsKK0xWUFNBX1JFVFVSTiBMVlBTQV9CUERvdWJsZVByZWNDb2VmcyhMVk1fVUlOVDE2IEZzLCBMVlBTQV9GaWx0ZXJQYXJhbV90KiBwRmlsdGVyUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QqIHBDb2VmZmljaWVudHMpOworTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRkNvZWZmaWNpZW50cyhMVlBTQV9JbnN0YW5jZVByX3QqIHBJbnN0LCBMVlBTQV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpOwogCi1MVlBTQV9SRVRVUk4gTFZQU0FfQ2xlYXJGaWx0ZXJIaXN0b3J5KCBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICpwSW5zdCk7CitMVlBTQV9SRVRVUk4gTFZQU0FfQ2xlYXJGaWx0ZXJIaXN0b3J5KExWUFNBX0luc3RhbmNlUHJfdCogcEluc3QpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU2LDI5ICs1MiwyMyBAQAogLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0NvbnRyb2wgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwTmV3UGFyYW1zICAgICApCi17CitMVlBTQV9SRVRVUk4gTFZQU0FfQ29udHJvbChwTFZQU0FfSGFuZGxlX3QgaEluc3RhbmNlLCBMVlBTQV9Db250cm9sUGFyYW1zX3QqIHBOZXdQYXJhbXMpIHsKKyAgICBMVlBTQV9JbnN0YW5jZVByX3QqIHBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOwogCi0gICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcExWUFNBX0luc3QgICAgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7Ci0KLSAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE5ld1BhcmFtcyA9PSBMVk1fTlVMTCkpCi0gICAgewotICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE5ld1BhcmFtcyA9PSBMVk1fTlVMTCkpIHsKKyAgICAgICAgcmV0dXJuIChMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7CiAgICAgfQotICAgIGlmKHBOZXdQYXJhbXMtPkZzID49IExWUFNBX05SX1NVUFBPUlRFRF9SQVRFKQotICAgIHsKLSAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7CisgICAgaWYgKHBOZXdQYXJhbXMtPkZzID49IExWUFNBX05SX1NVUFBPUlRFRF9SQVRFKSB7CisgICAgICAgIHJldHVybiAoTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKICAgICB9Ci0gICAgaWYocE5ld1BhcmFtcy0+TGV2ZWxEZXRlY3Rpb25TcGVlZCA+PSBMVlBTQV9OUl9TVVBQT1JURURfU1BFRUQpCi0gICAgewotICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKKyAgICBpZiAocE5ld1BhcmFtcy0+TGV2ZWxEZXRlY3Rpb25TcGVlZCA+PSBMVlBTQV9OUl9TVVBQT1JURURfU1BFRUQpIHsKKyAgICAgICAgcmV0dXJuIChMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOwogICAgIH0KIAogICAgIHBMVlBTQV9JbnN0LT5OZXdQYXJhbXMgPSAqcE5ld1BhcmFtczsKICAgICBwTFZQU0FfSW5zdC0+YkNvbnRyb2xQZW5kaW5nID0gTFZNX1RSVUU7CiAKLSAgICByZXR1cm4oTFZQU0FfT0spOworICAgIHJldHVybiAoTFZQU0FfT0spOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTYsMjAgKzg2LDE3IEBACiAvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlBTQV9SRVRVUk4gTFZQU0FfR2V0Q29udHJvbFBhcmFtcyAgICAgICAgICggICAgcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgKnBQYXJhbXMgKQotewotICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgKnBMVlBTQV9JbnN0ICAgID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOworTFZQU0FfUkVUVVJOIExWUFNBX0dldENvbnRyb2xQYXJhbXMocExWUFNBX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZQU0FfQ29udHJvbFBhcmFtc190KiBwUGFyYW1zKSB7CisgICAgTFZQU0FfSW5zdGFuY2VQcl90KiBwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKIAotICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwUGFyYW1zID09IExWTV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7CisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwUGFyYW1zID09IExWTV9OVUxMKSkgeworICAgICAgICByZXR1cm4gKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKICAgICB9CiAKLSAgICBwUGFyYW1zLT5GcyAgICAgICAgICAgICAgICAgICAgID0gcExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuRnM7Ci0gICAgcFBhcmFtcy0+TGV2ZWxEZXRlY3Rpb25TcGVlZCAgICA9IHBMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkxldmVsRGV0ZWN0aW9uU3BlZWQ7CisgICAgcFBhcmFtcy0+RnMgPSBwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5GczsKKyAgICBwUGFyYW1zLT5MZXZlbERldGVjdGlvblNwZWVkID0gcExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZDsKIAotICAgIHJldHVybihMVlBTQV9PSyk7CisgICAgcmV0dXJuIChMVlBTQV9PSyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMjcsMjIgKzExNCwxOSBAQAogLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0dldEluaXRQYXJhbXMgICAgICAgICAoICAgIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICAgICpwUGFyYW1zICkKLXsKLSAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwTFZQU0FfSW5zdCAgICA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKK0xWUFNBX1JFVFVSTiBMVlBTQV9HZXRJbml0UGFyYW1zKHBMVlBTQV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWUFNBX0luaXRQYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWUFNBX0luc3RhbmNlUHJfdCogcExWUFNBX0luc3QgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7CiAKLSAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocFBhcmFtcyA9PSBMVk1fTlVMTCkpCi0gICAgewotICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocFBhcmFtcyA9PSBMVk1fTlVMTCkpIHsKKyAgICAgICAgcmV0dXJuIChMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7CiAgICAgfQogCi0gICAgcFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gICA9IHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbjsKLSAgICBwUGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSAgICAgICAgICAgID0gcExWUFNBX0luc3QtPk1heElucHV0QmxvY2tTaXplOwotICAgIHBQYXJhbXMtPm5CYW5kcyAgICAgICAgICAgICAgICAgICAgICAgPSBwTFZQU0FfSW5zdC0+bkJhbmRzOwotICAgIHBQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zICAgICAgICAgICAgICAgPSBwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXM7CisgICAgcFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gPSBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb247CisgICAgcFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgPSBwTFZQU0FfSW5zdC0+TWF4SW5wdXRCbG9ja1NpemU7CisgICAgcFBhcmFtcy0+bkJhbmRzID0gcExWUFNBX0luc3QtPm5CYW5kczsKKyAgICBwUGFyYW1zLT5wRmlsdGVyc1BhcmFtcyA9IHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtczsKIAotICAgIHJldHVybihMVlBTQV9PSyk7CisgICAgcmV0dXJuIChMVlBTQV9PSyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNjMsNDYgKzE0Nyw0NyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0FwcGx5TmV3U2V0dGluZ3MgKExWUFNBX0luc3RhbmNlUHJfdCAgICAgKnBJbnN0KQoteworTFZQU0FfUkVUVVJOIExWUFNBX0FwcGx5TmV3U2V0dGluZ3MoTFZQU0FfSW5zdGFuY2VQcl90KiBwSW5zdCkgewogICAgIExWTV9VSU5UMTYgaWk7CiAgICAgTFZNX1VJTlQxNiBGcmVxOwotICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgIFBhcmFtczsKLSAgICBleHRlcm4gTFZNX0lOVDE2ICAgICAgICBMVlBTQV9uU2FtcGxlc0J1ZmZlclVwZGF0ZVtdOwotICAgIGV4dGVybiBMVk1fVUlOVDMyICAgICAgIExWUFNBX1NhbXBsZVJhdGVUYWJbXTsKLSAgICBleHRlcm4gTFZNX1VJTlQxNiAgICAgICBMVlBTQV9Eb3duU2FtcGxpbmdGYWN0b3JbXTsKKyAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgUGFyYW1zOworICAgIGV4dGVybiBMVk1fSU5UMTYgTFZQU0FfblNhbXBsZXNCdWZmZXJVcGRhdGVbXTsKKyAgICBleHRlcm4gTFZNX1VJTlQzMiBMVlBTQV9TYW1wbGVSYXRlVGFiW107CisgICAgZXh0ZXJuIExWTV9VSU5UMTYgTFZQU0FfRG93blNhbXBsaW5nRmFjdG9yW107CiAKLSAgICBpZihwSW5zdCA9PSAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKKyAgICBpZiAocEluc3QgPT0gMCkgeworICAgICAgICByZXR1cm4gKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKICAgICB9CiAKICAgICBQYXJhbXMgPSBwSW5zdC0+TmV3UGFyYW1zOwogCiAgICAgLyogTW9kaWZpZXMgZmlsdGVycyB0eXBlcyBhbmQgY29lZmZpY2llbnRzLCBjbGVhciB0aGUgdGFwcyBhbmQKICAgICAgICByZS1pbml0aWFsaXplcyBwYXJhbWV0ZXJzIGlmIHNhbXBsZSBmcmVxdWVuY3kgaGFzIGNoYW5nZWQgICAgKi8KLSAgICBpZihQYXJhbXMuRnMgIT0gcEluc3QtPkN1cnJlbnRQYXJhbXMuRnMpCi0gICAgeworICAgIGlmIChQYXJhbXMuRnMgIT0gcEluc3QtPkN1cnJlbnRQYXJhbXMuRnMpIHsKICAgICAgICAgcEluc3QtPkN1cnJlbnRQYXJhbXMuRnMgPSBQYXJhbXMuRnM7CiAKICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgY2VudGVyIGZyZXFldW5jaWVzIGFzIGEgZnVuY3Rpb24gb2YgdGhlIHNhbXBsZSByYXRlICovCi0gICAgICAgIEZyZXEgPSAoTFZNX1VJTlQxNikgKChMVlBTQV9TYW1wbGVSYXRlVGFiW3BJbnN0LT5DdXJyZW50UGFyYW1zLkZzXT4+MSkgLyAocEluc3QtPm5CYW5kcyArIDEpKTsKLSAgICAgICAgZm9yKGlpID0gcEluc3QtPm5CYW5kczsgaWkgPiAwOyBpaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWktMV0uQ2VudGVyRnJlcXVlbmN5ID0gKExWTV9VSU5UMTYpIChGcmVxICogaWkpOworICAgICAgICBGcmVxID0gKExWTV9VSU5UMTYpKChMVlBTQV9TYW1wbGVSYXRlVGFiW3BJbnN0LT5DdXJyZW50UGFyYW1zLkZzXSA+PiAxKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0LT5uQmFuZHMgKyAxKSk7CisgICAgICAgIGZvciAoaWkgPSBwSW5zdC0+bkJhbmRzOyBpaSA+IDA7IGlpLS0pIHsKKyAgICAgICAgICAgIHBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaSAtIDFdLkNlbnRlckZyZXF1ZW5jeSA9IChMVk1fVUlOVDE2KShGcmVxICogaWkpOwogICAgICAgICB9CiAKICAgICAgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiByZWxldmFudCBmaWx0ZXJzLiBJZiB0aGUgY2VudGVyIGZyZXF1ZW5jeSBvZiB0aGUgZmlsdGVyIGlzCiAgICAgICAgICAgIGJpZ2dlciB0aGFuIHRoZSBueXF1aXN0IGZyZXF1ZW5jeSwgdGhlbiB0aGUgZmlsdGVyIGlzIG5vdCByZWxldmFudCBhbmQgZG9lc24ndAogICAgICAgICAgICBuZWVkIHRvIGJlIHVzZWQgKi8KLSAgICAgICAgZm9yKGlpID0gcEluc3QtPm5CYW5kczsgaWkgPiAwOyBpaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWktMV0uQ2VudGVyRnJlcXVlbmN5IDwgKExWUFNBX1NhbXBsZVJhdGVUYWJbcEluc3QtPkN1cnJlbnRQYXJhbXMuRnNdPj4xKSkKLSAgICAgICAgICAgIHsKKyAgICAgICAgZm9yIChpaSA9IHBJbnN0LT5uQmFuZHM7IGlpID4gMDsgaWktLSkgeworICAgICAgICAgICAgaWYgKHBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaSAtIDFdLkNlbnRlckZyZXF1ZW5jeSA8CisgICAgICAgICAgICAgICAgKExWUFNBX1NhbXBsZVJhdGVUYWJbcEluc3QtPkN1cnJlbnRQYXJhbXMuRnNdID4+IDEpKSB7CiAgICAgICAgICAgICAgICAgcEluc3QtPm5SZWxldmFudEZpbHRlcnMgPSBpaTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAvKgorICAgICAgICAgKiBDcmVhdGUgYmlxdWFkIGluc3RhbmNlCisgICAgICAgICAqLworICAgICAgICBwSW5zdC0+c3BlY0JpcXVhZC5yZXNpemUocEluc3QtPm5SZWxldmFudEZpbHRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjphdWRpb191dGlsczo6QmlxdWFkRmlsdGVyPExWTV9GTE9BVD4oRkNDXzEpKTsKICAgICAgICAgTFZQU0FfU2V0QlBGaWx0ZXJzVHlwZShwSW5zdCwgJlBhcmFtcyk7CiAgICAgICAgIExWUFNBX1NldEJQRkNvZWZmaWNpZW50cyhwSW5zdCwgJlBhcmFtcyk7CiAgICAgICAgIExWUFNBX1NldFFQRkNvZWZmaWNpZW50cyhwSW5zdCwgJlBhcmFtcyk7CkBAIC0yMTEsMTkgKzE5NiwxNCBAQAogICAgICAgICBwSW5zdC0+QnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50ID0gMDsKICAgICAgICAgcEluc3QtPkRvd25TYW1wbGluZ0ZhY3RvciA9IExWUFNBX0Rvd25TYW1wbGluZ0ZhY3RvcltQYXJhbXMuRnNdOwogICAgICAgICBwSW5zdC0+RG93blNhbXBsaW5nQ291bnQgPSAwOwotICAgICAgICBmb3IoaWkgPSAwOyBpaSA8IChwSW5zdC0+bkJhbmRzICogcEluc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCk7IGlpKyspCi0gICAgICAgIHsKKyAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgKHBJbnN0LT5uQmFuZHMgKiBwSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoKTsgaWkrKykgewogICAgICAgICAgICAgcEluc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydFtpaV0gPSAwOwogICAgICAgICB9Ci0gICAgICAgIGZvcihpaSA9IDA7IGlpIDwgcEluc3QtPm5CYW5kczsgaWkrKykKLSAgICAgICAgeworICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBwSW5zdC0+bkJhbmRzOyBpaSsrKSB7CiAgICAgICAgICAgICBwSW5zdC0+cFByZXZpb3VzUGVha3NbaWldID0gMDsKICAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZihQYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZCAhPSBwSW5zdC0+Q3VycmVudFBhcmFtcy5MZXZlbERldGVjdGlvblNwZWVkKQotICAgICAgICB7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKFBhcmFtcy5MZXZlbERldGVjdGlvblNwZWVkICE9IHBJbnN0LT5DdXJyZW50UGFyYW1zLkxldmVsRGV0ZWN0aW9uU3BlZWQpIHsKICAgICAgICAgICAgIExWUFNBX1NldFFQRkNvZWZmaWNpZW50cyhwSW5zdCwgJlBhcmFtcyk7CiAgICAgICAgIH0KICAgICB9CkBAIC0yNTMsNDcgKzIzMyw0MyBAQAogLyogICAgICAgICAgU2luZ2xlIHByZWNpc2lvbiAgICBvdGhlcndpc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRmlsdGVyc1R5cGUgKCAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwUGFyYW1zICApCi17Ci0gICAgZXh0ZXJuIExWTV9VSU5UMzIgICBMVlBTQV9TYW1wbGVSYXRlVGFiW107ICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgcmF0ZSB0YWJsZSAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgaWk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGJhbmQgaW5kZXggKi8KLSAgICBMVk1fVUlOVDMyICAgICAgICAgIGZzID0gKExWTV9VSU5UMzIpTFZQU0FfU2FtcGxlUmF0ZVRhYlsoTFZNX1VJTlQxNilwUGFyYW1zLT5Gc107ICAgICAgLyogU2FtcGxlIHJhdGUgKi8KLSAgICBMVk1fVUlOVDMyICAgICAgICAgIGZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICBRRmFjdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgUSBmYWN0b3IgKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9TZXRCUEZpbHRlcnNUeXBlKExWUFNBX0luc3RhbmNlUHJfdCogcEluc3QsIExWUFNBX0NvbnRyb2xQYXJhbXNfdCogcFBhcmFtcykgeworICAgIGV4dGVybiBMVk1fVUlOVDMyIExWUFNBX1NhbXBsZVJhdGVUYWJbXTsgLyogU2FtcGxlIHJhdGUgdGFibGUgKi8KKyAgICBMVk1fVUlOVDE2IGlpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBiYW5kIGluZGV4ICovCisgICAgTFZNX1VJTlQzMiBmcyA9IChMVk1fVUlOVDMyKUxWUFNBX1NhbXBsZVJhdGVUYWJbKExWTV9VSU5UMTYpcFBhcmFtcy0+RnNdOyAvKiBTYW1wbGUgcmF0ZSAqLworICAgIExWTV9VSU5UMzIgZmM7ICAgICAvKiBGaWx0ZXIgY2VudHJlIGZyZXF1ZW5jeSAqLworICAgIExWTV9JTlQxNiBRRmFjdG9yOyAvKiBGaWx0ZXIgUSBmYWN0b3IgKi8KIAotICAgIGZvciAoaWkgPSAwOyBpaSA8IHBJbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKQotICAgIHsKKyAgICBmb3IgKGlpID0gMDsgaWkgPCBwSW5zdC0+blJlbGV2YW50RmlsdGVyczsgaWkrKykgewogICAgICAgICAvKgogICAgICAgICAgKiBHZXQgdGhlIGZpbHRlciBzZXR0aW5ncwogICAgICAgICAgKi8KLSAgICAgICAgZmMgPSAoTFZNX1VJTlQzMilwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLkNlbnRlckZyZXF1ZW5jeTsgICAgIC8qIEdldCB0aGUgYmFuZCBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAgICAgIFFGYWN0b3IgPShMVk1fSU5UMTYpIHBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0uUUZhY3RvcjsgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgYmFuZCBRIGZhY3RvciAqLworICAgICAgICBmYyA9IChMVk1fVUlOVDMyKXBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0KKyAgICAgICAgICAgICAgICAgICAgIC5DZW50ZXJGcmVxdWVuY3k7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIGJhbmQgY2VudHJlIGZyZXF1ZW5jeSAqLworICAgICAgICBRRmFjdG9yID0gKExWTV9JTlQxNilwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLlFGYWN0b3I7IC8qIEdldCB0aGUgYmFuZCBRIGZhY3RvciAqLwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIEZvciBlYWNoIGZpbHRlciBzZXQgdGhlIHR5cGUgb2YgYmlxdWFkIHJlcXVpcmVkCiAgICAgICAgICAqLwotICAgICAgICBwSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbltpaV0gPSBMVlBTQV9TaW1wbGVQcmVjaXNpb25GaWx0ZXI7ICAgICAvKiBEZWZhdWx0IHRvIHNpbmdsZSBwcmVjaXNpb24gKi8KLSAgICAgICAgaWYgKChMT1dfRlJFUSAqIGZzKSA+PSAoZmMgPDwgMTUpKQotICAgICAgICB7CisgICAgICAgIHBJbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uW2lpXSA9CisgICAgICAgICAgICAgICAgTFZQU0FfU2ltcGxlUHJlY2lzaW9uRmlsdGVyOyAvKiBEZWZhdWx0IHRvIHNpbmdsZSBwcmVjaXNpb24gKi8KKyAgICAgICAgaWYgKChMT1dfRlJFUSAqIGZzKSA+PSAoZmMgPDwgMTUpKSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogZmMgPD0gZnMvMTEwCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIHBJbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uW2lpXSA9IExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoKExPV19GUkVRICogZnMpIDwgKGZjIDw8IDE1KSkgJiYgKChmYyA8PCAxNSkgPCAoSElHSF9GUkVRICogZnMpKSAmJiAoUUZhY3RvciA+IDMwMCkpCi0gICAgICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoKChMT1dfRlJFUSAqIGZzKSA8IChmYyA8PCAxNSkpICYmICgoZmMgPDwgMTUpIDwgKEhJR0hfRlJFUSAqIGZzKSkgJiYKKyAgICAgICAgICAgICAgICAoUUZhY3RvciA+IDMwMCkpIHsKICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICogKGZzLzExMCA8IGZjIDwgZnMvODUpICYgKFE+MykKLSAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAqIChmcy8xMTAgPCBmYyA8IGZzLzg1KSAmIChRPjMpCisgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgcEluc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldID0gTFZQU0FfRG91YmxlUHJlY2lzaW9uRmlsdGVyOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuKExWUFNBX09LKTsKKyAgICByZXR1cm4gKExWUFNBX09LKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTMxNCw2MCArMjkwLDU5IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlBTQV9SRVRVUk4gTFZQU0FfU2V0QlBGQ29lZmZpY2llbnRzKCAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMpCi17Ci0KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgIGlpOworTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRkNvZWZmaWNpZW50cyhMVlBTQV9JbnN0YW5jZVByX3QqIHBJbnN0LCBMVlBTQV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVk1fVUlOVDE2IGlpOwogCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIGNvZWZmaWNpZW50cyBmb3IgZWFjaCBiYW5kIGJ5IHRoZSBpbml0IGZ1bmN0aW9uCiAgICAgICovCi0gICAgZm9yIChpaSA9IDA7IGlpIDwgcEluc3QtPm5SZWxldmFudEZpbHRlcnM7IGlpKyspCi0gICAgewotICAgICAgICBzd2l0Y2ggIChwSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbltpaV0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgICAgTFZQU0FfRG91YmxlUHJlY2lzaW9uRmlsdGVyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICBDb2VmZmljaWVudHM7CisgICAgZm9yIChpaSA9IDA7IGlpIDwgcEluc3QtPm5SZWxldmFudEZpbHRlcnM7IGlpKyspIHsKKyAgICAgICAgc3dpdGNoIChwSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbltpaV0pIHsKKyAgICAgICAgICAgIGNhc2UgTFZQU0FfRG91YmxlUHJlY2lzaW9uRmlsdGVyOiB7CisgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCBDb2VmZmljaWVudHM7CiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGRvdWJsZSBwcmVjaXNpb24gY29lZmZpY2llbnRzCiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcFBhcmFtcy0+RnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0sCisgICAgICAgICAgICAgICAgTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcFBhcmFtcy0+RnMsICZwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOwogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMKICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wQlBfVGFwc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6YXJyYXk8TFZNX0ZMT0FULCBhbmRyb2lkOjphdWRpb191dGlsczo6a0JpcXVhZE51bUNvZWZzPiBjb2VmcyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvZWZmaWNpZW50cy5BMCwgMC4wLCAtKENvZWZmaWNpZW50cy5BMCksIC0oQ29lZmZpY2llbnRzLkIxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC0oQ29lZmZpY2llbnRzLkIyKX07CisgICAgICAgICAgICAgICAgcEluc3QtPnNwZWNCaXF1YWRbaWldCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29lZmZpY2llbnRzPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PExWTV9GTE9BVCwgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OmtCaXF1YWROdW1Db2Vmcz4+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Vmcyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNhc2UgICAgTFZQU0FfU2ltcGxlUHJlY2lzaW9uRmlsdGVyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICBDb2VmZmljaWVudHM7CisgICAgICAgICAgICBjYXNlIExWUFNBX1NpbXBsZVByZWNpc2lvbkZpbHRlcjogeworICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgQ29lZmZpY2llbnRzOwogCiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIHNpbmdsZSBwcmVjaXNpb24gY29lZmZpY2llbnRzCiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcFBhcmFtcy0+RnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0sCisgICAgICAgICAgICAgICAgTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcFBhcmFtcy0+RnMsICZwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOwogCiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGNvZWZmaWNpZW50cwogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCZwSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEJQX1RhcHNbaWldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmFycmF5PExWTV9GTE9BVCwgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OmtCaXF1YWROdW1Db2Vmcz4gY29lZnMgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb2VmZmljaWVudHMuQTAsIDAuMCwgLShDb2VmZmljaWVudHMuQTApLCAtKENvZWZmaWNpZW50cy5CMSksCisgICAgICAgICAgICAgICAgICAgICAgICAtKENvZWZmaWNpZW50cy5CMil9OworICAgICAgICAgICAgICAgIHBJbnN0LT5zcGVjQmlxdWFkW2lpXQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvZWZmaWNpZW50czwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTxMVk1fRkxPQVQsIGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjprQmlxdWFkTnVtQ29lZnM+PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZnMpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuKExWUFNBX09LKTsKKyAgICByZXR1cm4gKExWUFNBX09LKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM4OCwyNiArMzYzLDIwIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlBTQV9SRVRVUk4gTFZQU0FfU2V0UVBGQ29lZmZpY2llbnRzKCAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcyAgKQotewotICAgIExWTV9VSU5UMTYgICAgIGlpOwotICAgIExWTV9Gc19lbiAgICAgIEZzID0gcFBhcmFtcy0+RnM7Ci0gICAgUVBEX0ZMT0FUX0NvZWZzICAqcENvZWZmaWNpZW50czsKLSAgICBleHRlcm4gICAgICAgICBRUERfRkxPQVRfQ29lZnMgICAgIExWUFNBX1FQRF9GbG9hdF9Db2Vmc1tdOworTFZQU0FfUkVUVVJOIExWUFNBX1NldFFQRkNvZWZmaWNpZW50cyhMVlBTQV9JbnN0YW5jZVByX3QqIHBJbnN0LCBMVlBTQV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVk1fVUlOVDE2IGlpOworICAgIExWTV9Gc19lbiBGcyA9IHBQYXJhbXMtPkZzOworICAgIFFQRF9GTE9BVF9Db2VmcyogcENvZWZmaWNpZW50czsKKyAgICBleHRlcm4gUVBEX0ZMT0FUX0NvZWZzIExWUFNBX1FQRF9GbG9hdF9Db2Vmc1tdOwogCi0gICAgcENvZWZmaWNpZW50cyA9ICZMVlBTQV9RUERfRmxvYXRfQ29lZnNbKHBQYXJhbXMtPkxldmVsRGV0ZWN0aW9uU3BlZWQgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9OUl9TVVBQT1JURURfUkFURSkgKyBGc107CisgICAgcENvZWZmaWNpZW50cyA9CisgICAgICAgICAgICAmTFZQU0FfUVBEX0Zsb2F0X0NvZWZzWyhwUGFyYW1zLT5MZXZlbERldGVjdGlvblNwZWVkICogTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUpICsgRnNdOwogCi0gICAgZm9yIChpaSA9IDA7IGlpIDwgcEluc3QtPm5SZWxldmFudEZpbHRlcnM7IGlpKyspCi0gICAgewotICAgICAgICBMVlBTQV9RUERfSW5pdF9GbG9hdCAoJnBJbnN0LT5wUVBEX1N0YXRlc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBRUERfVGFwc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29lZmZpY2llbnRzICk7CisgICAgZm9yIChpaSA9IDA7IGlpIDwgcEluc3QtPm5SZWxldmFudEZpbHRlcnM7IGlpKyspIHsKKyAgICAgICAgTFZQU0FfUVBEX0luaXRfRmxvYXQoJnBJbnN0LT5wUVBEX1N0YXRlc1tpaV0sICZwSW5zdC0+cFFQRF9UYXBzW2lpXSwgcENvZWZmaWNpZW50cyk7CiAgICAgfQogCi0gICAgcmV0dXJuKExWUFNBX09LKTsKLQorICAgIHJldHVybiAoTFZQU0FfT0spOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQ0Myw0OSArNDEyLDQ2IEBACiAvKiAgICAgb2YgdGhlIG4gYmFuZHMgZXF1YWxpemVyIChMVkVRTkIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlBTQV9SRVRVUk4gTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIEZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgICAqcEZpbHRlclBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgKnBDb2VmZmljaWVudHMpCi17Ci0KLSAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW107Ci0gICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9Db3NDb2VmW107CitMVlBTQV9SRVRVUk4gTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoTFZNX1VJTlQxNiBGcywgTFZQU0FfRmlsdGVyUGFyYW1fdCogcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190KiBwQ29lZmZpY2llbnRzKSB7CisgICAgZXh0ZXJuIExWTV9GTE9BVCBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtdOworICAgIGV4dGVybiBMVk1fRkxPQVQgTFZQU0FfRmxvYXRfQ29zQ29lZltdOwogCiAgICAgLyoKICAgICAgKiBJbnRlcm1lZGlhdGUgdmFyaWFibGVzIGFuZCB0ZW1wb3JhcnkgdmFsdWVzCiAgICAgICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICBUMDsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEQ7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBBMDsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEIxOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQjI7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBEdDA7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBCMl9EZW47Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBCMl9OdW07Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBDT1NfVDA7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBjb2VmOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgZmFjdG9yOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgdDA7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICBpOworICAgIExWTV9GTE9BVCBUMDsKKyAgICBMVk1fRkxPQVQgRDsKKyAgICBMVk1fRkxPQVQgQTA7CisgICAgTFZNX0ZMT0FUIEIxOworICAgIExWTV9GTE9BVCBCMjsKKyAgICBMVk1fRkxPQVQgRHQwOworICAgIExWTV9GTE9BVCBCMl9EZW47CisgICAgTFZNX0ZMT0FUIEIyX051bTsKKyAgICBMVk1fRkxPQVQgQ09TX1QwOworICAgIExWTV9GTE9BVCBjb2VmOworICAgIExWTV9GTE9BVCBmYWN0b3I7CisgICAgTFZNX0ZMT0FUIHQwOworICAgIExWTV9JTlQxNiBpOwogCiAgICAgLyoKICAgICAgKiBHZXQgdGhlIGZpbHRlciBkZWZpbml0aW9uCiAgICAgICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgIEZyZXF1ZW5jeSAgID0gKExWTV9GTE9BVCkocEZpbHRlclBhcmFtcy0+Q2VudGVyRnJlcXVlbmN5KTsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgUUZhY3RvciAgICAgPSAoKExWTV9GTE9BVCkocEZpbHRlclBhcmFtcy0+UUZhY3RvcikpIC8gMTAwOworICAgIExWTV9GTE9BVCBGcmVxdWVuY3kgPSAoTFZNX0ZMT0FUKShwRmlsdGVyUGFyYW1zLT5DZW50ZXJGcmVxdWVuY3kpOworICAgIExWTV9GTE9BVCBRRmFjdG9yID0gKChMVk1fRkxPQVQpKHBGaWx0ZXJQYXJhbXMtPlFGYWN0b3IpKSAvIDEwMDsKIAogICAgIC8qCiAgICAgICogQ2FsY3VsYXRpbmcgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMKICAgICAgKi8KLSAgICBUMCA9IEZyZXF1ZW5jeSAqIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW0ZzXTsgICAvKiBUMCA9IDIgKiBQaSAqIEZjIC8gRnMgKi8KLSAgICBEID0gMzIwMDsgICAgICAgICAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMDAwMDAwICgxKjEwMCoyXjUpICovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZvcmNlIEQgPSAxIDogdGhlIGZ1bmN0aW9uIHdhcyBvcmlnaW5hbGx5IHVzZWQgZm9yIGEgcGVha2luZyBmaWx0ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgIFRoZSBEIHBhcmFtZXRlciBkbyBub3QgZXhpc3QgZm9yIGEgQmFuZFBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworICAgIFQwID0gRnJlcXVlbmN5ICogTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbRnNdOyAvKiBUMCA9IDIgKiBQaSAqIEZjIC8gRnMgKi8KKyAgICBEID0gMzIwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDAwMDAgKDEqMTAwKjJeNSkgKi8KKyAgICAvKiBGb3JjZSBEID0gMSA6IHRoZSBmdW5jdGlvbiB3YXMgb3JpZ2luYWxseSB1c2VkIGZvciBhIHBlYWtpbmcgZmlsdGVyLgorICAgICAgIFRoZSBEIHBhcmFtZXRlciBkbyBub3QgZXhpc3QgZm9yIGEgQmFuZFBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwogCiAgICAgLyoKICAgICAgKiBDYWxjdWxhdGUgdGhlIEIyIGNvZWZmaWNpZW50CiAgICAgICovCi0gICAgRHQwID0gIFQwIC8gMjA0OCA7CisgICAgRHQwID0gVDAgLyAyMDQ4OwogICAgIEIyX0RlbiA9IFFGYWN0b3IgKyBEdDA7CiAgICAgQjJfTnVtID0gRHQwIC0gUUZhY3RvcjsKICAgICBCMiA9IEIyX051bSAvICgyICogQjJfRGVuKTsKQEAgLTQ5NSwyMCArNDYxLDE5IEBACiAgICAgICoKICAgICAgKiAgQ29zICs9IGNvZWYobikgKiB0MF5uICAgICAgICAgICAgICAgICAgIEZvciBuID0gMCB0byA2CiAgICAgICovCi0gICAgVDAgPSAoVDAgLyAyMDQ4KSAqIDAuNjM2NTg1NThmOyAgICAgICAgICAgICAgLyogU2NhbGUgdG8gMS4wIGluIDE2LWJpdCBmb3IgcmFuZ2UgMCB0byBmcy8yICovCi0gICAgdDAgPSBUMCA7Ci0gICAgZmFjdG9yID0gMS4wZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0byAxLjAgZm9yIHRoZSBhMCBjb2VmZmljaWVudCAqLwotICAgIENPU19UMCA9IDAuMGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgdG8gemVybyAqLwotICAgIGZvciAoaSA9IDE7IGkgPCA3OyBpKyspCi0gICAgewotICAgICAgICBjb2VmICAgID0gTFZQU0FfRmxvYXRfQ29zQ29lZltpXTsgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBudGggY29lZmZpY2llbnQgKi8KLSAgICAgICAgQ09TX1QwICs9IChmYWN0b3IgKiBjb2VmKTsgICAgICAgICAvKiBUaGUgbnRoIHBhcnRpYWwgc3VtICovCi0gICAgICAgIGZhY3RvciAgPSAoZmFjdG9yICogdDApIDsgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0MF5uICovCisgICAgVDAgPSAoVDAgLyAyMDQ4KSAqIDAuNjM2NTg1NThmOyAvKiBTY2FsZSB0byAxLjAgaW4gMTYtYml0IGZvciByYW5nZSAwIHRvIGZzLzIgKi8KKyAgICB0MCA9IFQwOworICAgIGZhY3RvciA9IDEuMGY7IC8qIEluaXRpYWxpc2UgdG8gMS4wIGZvciB0aGUgYTAgY29lZmZpY2llbnQgKi8KKyAgICBDT1NfVDAgPSAwLjBmOyAvKiBJbml0aWFsaXNlIHRoZSBlcnJvciB0byB6ZXJvICovCisgICAgZm9yIChpID0gMTsgaSA8IDc7IGkrKykgeworICAgICAgICBjb2VmID0gTFZQU0FfRmxvYXRfQ29zQ29lZltpXTsgLyogR2V0IHRoZSBudGggY29lZmZpY2llbnQgKi8KKyAgICAgICAgQ09TX1QwICs9IChmYWN0b3IgKiBjb2VmKTsgICAgIC8qIFRoZSBudGggcGFydGlhbCBzdW0gKi8KKyAgICAgICAgZmFjdG9yID0gKGZhY3RvciAqIHQwKTsgICAgICAgIC8qIENhbGN1bGF0ZSB0MF5uICovCiAgICAgfQotICAgIENPU19UMCA9IENPU19UMCAqIDg7ICAgIC8qTFZQU0FfQ29zQ29lZl9mbG9hdFswXSovICAgICAgLyogQ29ycmVjdCB0aGUgc2NhbGluZyAqLworICAgIENPU19UMCA9IENPU19UMCAqIDg7IC8qTFZQU0FfQ29zQ29lZl9mbG9hdFswXSovIC8qIENvcnJlY3QgdGhlIHNjYWxpbmcgKi8KIAotICAgIEIxID0gKChMVk1fRkxPQVQpMC41IC0gQjIpICogKENPU19UMCk7ICAgIC8qIEIxID0gKDAuNSAtIGIyKSAqIGNvcyh0MCkgKi8KLSAgICBBMCA9ICgoTFZNX0ZMT0FUKTAuNSArIEIyKSAvIDI7ICAgICAgICAgICAgICAgICAgICAgICAgLyogQTAgPSAoMC41ICsgYjIpIC8gMiAqLworICAgIEIxID0gKChMVk1fRkxPQVQpMC41IC0gQjIpICogKENPU19UMCk7IC8qIEIxID0gKDAuNSAtIGIyKSAqIGNvcyh0MCkgKi8KKyAgICBBMCA9ICgoTFZNX0ZMT0FUKTAuNSArIEIyKSAvIDI7ICAgICAgICAvKiBBMCA9ICgwLjUgKyBiMikgLyAyICovCiAKICAgICAvKgogICAgICAqIFdyaXRlIGNvZWZmIGludG8gdGhlIGRhdGEgc3RydWN0dXJlCkBAIC01MTcsNyArNDgyLDcgQEAKICAgICBwQ29lZmZpY2llbnRzLT5CMSA9IEIxICogMjsKICAgICBwQ29lZmZpY2llbnRzLT5CMiA9IEIyICogMjsKIAotICAgIHJldHVybihMVlBTQV9PSyk7CisgICAgcmV0dXJuIChMVlBTQV9PSyk7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTYxLDQ5ICs1MjYsNDYgQEAKIC8qICAgICBvZiB0aGUgbiBiYW5kcyBlcXVhbGl6ZXIgKExWRVFOQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9CUERvdWJsZVByZWNDb2VmcyggICBMVk1fVUlOVDE2ICAgICAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICpwRmlsdGVyUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAqcENvZWZmaWNpZW50cykKLXsKLQotICAgIGV4dGVybiBMVk1fRkxPQVQgICAgTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbXTsKLSAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWUFNBX0Zsb2F0X0RQQ29zQ29lZltdOworTFZQU0FfUkVUVVJOIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKExWTV9VSU5UMTYgRnMsIExWUFNBX0ZpbHRlclBhcmFtX3QqIHBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCogcENvZWZmaWNpZW50cykgeworICAgIGV4dGVybiBMVk1fRkxPQVQgTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbXTsKKyAgICBleHRlcm4gTFZNX0ZMT0FUIExWUFNBX0Zsb2F0X0RQQ29zQ29lZltdOwogCiAgICAgLyoKICAgICAgKiBJbnRlcm1lZGlhdGUgdmFyaWFibGVzIGFuZCB0ZW1wb3JhcnkgdmFsdWVzCiAgICAgICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICBUMDsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEQ7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBBMDsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEIxOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQjI7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBEdDA7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBCMl9EZW47Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBCMl9OdW07Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBDb3NFcnI7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBjb2VmOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgZmFjdG9yOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgdDA7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICBpOworICAgIExWTV9GTE9BVCBUMDsKKyAgICBMVk1fRkxPQVQgRDsKKyAgICBMVk1fRkxPQVQgQTA7CisgICAgTFZNX0ZMT0FUIEIxOworICAgIExWTV9GTE9BVCBCMjsKKyAgICBMVk1fRkxPQVQgRHQwOworICAgIExWTV9GTE9BVCBCMl9EZW47CisgICAgTFZNX0ZMT0FUIEIyX051bTsKKyAgICBMVk1fRkxPQVQgQ29zRXJyOworICAgIExWTV9GTE9BVCBjb2VmOworICAgIExWTV9GTE9BVCBmYWN0b3I7CisgICAgTFZNX0ZMT0FUIHQwOworICAgIExWTV9JTlQxNiBpOwogCiAgICAgLyoKICAgICAgKiBHZXQgdGhlIGZpbHRlciBkZWZpbml0aW9uCiAgICAgICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgIEZyZXF1ZW5jeSAgID0gKExWTV9GTE9BVCkocEZpbHRlclBhcmFtcy0+Q2VudGVyRnJlcXVlbmN5KTsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgUUZhY3RvciAgICAgPSAoKExWTV9GTE9BVCkocEZpbHRlclBhcmFtcy0+UUZhY3RvcikpIC8gMTAwOworICAgIExWTV9GTE9BVCBGcmVxdWVuY3kgPSAoTFZNX0ZMT0FUKShwRmlsdGVyUGFyYW1zLT5DZW50ZXJGcmVxdWVuY3kpOworICAgIExWTV9GTE9BVCBRRmFjdG9yID0gKChMVk1fRkxPQVQpKHBGaWx0ZXJQYXJhbXMtPlFGYWN0b3IpKSAvIDEwMDsKIAogICAgIC8qCiAgICAgICogQ2FsY3VsYXRpbmcgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMKICAgICAgKi8KLSAgICBUMCA9IEZyZXF1ZW5jeSAqIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW0ZzXTsgICAvKiBUMCA9IDIgKiBQaSAqIEZjIC8gRnMgKi8KLSAgICBEID0gMzIwMDsgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDAwMDAgKDEqMTAwKjJeNSkgKi8KLSAgICAgICAgICAgICAgICAgLyogRm9yY2UgRCA9IDEgOiB0aGUgZnVuY3Rpb24gd2FzIG9yaWdpbmFsbHkgdXNlZCBmb3IgYSBwZWFraW5nIGZpbHRlci4KLSAgICAgICAgICAgICAgICAgICAgVGhlIEQgcGFyYW1ldGVyIGRvIG5vdCBleGlzdCBmb3IgYSBCYW5kUGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCisgICAgVDAgPSBGcmVxdWVuY3kgKiBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtGc107IC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLworICAgIEQgPSAzMjAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAwMDAwMCAoMSoxMDAqMl41KSAqLworICAgIC8qIEZvcmNlIEQgPSAxIDogdGhlIGZ1bmN0aW9uIHdhcyBvcmlnaW5hbGx5IHVzZWQgZm9yIGEgcGVha2luZyBmaWx0ZXIuCisgICAgICAgVGhlIEQgcGFyYW1ldGVyIGRvIG5vdCBleGlzdCBmb3IgYSBCYW5kUGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCiAKICAgICAvKgogICAgICAqIENhbGN1bGF0ZSB0aGUgQjIgY29lZmZpY2llbnQKICAgICAgKi8KLSAgICBEdDAgPSAgVDAgLyAyMDQ4IDsKKyAgICBEdDAgPSBUMCAvIDIwNDg7CiAgICAgQjJfRGVuID0gUUZhY3RvciArIER0MDsKICAgICBCMl9OdW0gPSBEdDAgLSBRRmFjdG9yOwogICAgIEIyID0gQjJfTnVtIC8gKDIgKiBCMl9EZW4pOwpAQCAtNjEzLDI1ICs1NzUsMjQgQEAKICAgICAgKgogICAgICAqICBDb3NFcnIgKz0gY29lZihuKSAqIHQwXm4gICAgICAgICAgICAgICAgRm9yIG4gPSAwIHRvIDQKICAgICAgKi8KLSAgICBUMCA9IFQwICogMC45OTQ3NTBmOyAgICAgICAgICAgICAgICAgICAgLyogU2NhbGUgdG8gMS4wIGluIDE2LWJpdCBmb3IgcmFuZ2UgMCB0byBmcy81MCAqLworICAgIFQwID0gVDAgKiAwLjk5NDc1MGY7IC8qIFNjYWxlIHRvIDEuMCBpbiAxNi1iaXQgZm9yIHJhbmdlIDAgdG8gZnMvNTAgKi8KICAgICB0MCA9IFQwOwotICAgIGZhY3RvciA9IDEuMGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdG8gMS4wIGZvciB0aGUgYTAgY29lZmZpY2llbnQgKi8KLSAgICBDb3NFcnIgPSAwLjBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGVycm9yIHRvIHplcm8gKi8KLSAgICBmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKQotICAgIHsKLSAgICAgICAgY29lZiA9IExWUFNBX0Zsb2F0X0RQQ29zQ29lZltpXTsgICAgICAgICAgICAgIC8qIEdldCB0aGUgbnRoIGNvZWZmaWNpZW50ICovCisgICAgZmFjdG9yID0gMS4wZjsgLyogSW5pdGlhbGlzZSB0byAxLjAgZm9yIHRoZSBhMCBjb2VmZmljaWVudCAqLworICAgIENvc0VyciA9IDAuMGY7IC8qIEluaXRpYWxpc2UgdGhlIGVycm9yIHRvIHplcm8gKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKSB7CisgICAgICAgIGNvZWYgPSBMVlBTQV9GbG9hdF9EUENvc0NvZWZbaV07IC8qIEdldCB0aGUgbnRoIGNvZWZmaWNpZW50ICovCiAgICAgICAgIENvc0VyciArPSBmYWN0b3IgKiBjb2VmOyAgICAgICAgIC8qIFRoZSBudGggcGFydGlhbCBzdW0gKi8KLSAgICAgICAgZmFjdG9yID0gZmFjdG9yICogdDA7ICAgICAgICAgICAvKiBDYWxjdWxhdGUgdDBebiAqLworICAgICAgICBmYWN0b3IgPSBmYWN0b3IgKiB0MDsgICAgICAgICAgICAvKiBDYWxjdWxhdGUgdDBebiAqLwogICAgIH0KLSAgICBDb3NFcnIgPSBDb3NFcnIgKiAyOyAgICAgICAgICAvKiBDb3JyZWN0IHRoZSBzY2FsaW5nICovCisgICAgQ29zRXJyID0gQ29zRXJyICogMjsgLyogQ29ycmVjdCB0aGUgc2NhbGluZyAqLwogCiAgICAgLyoKICAgICAgKiBDYWxjdWxhdGUgdGhlIEIxIGFuZCBBMCBjb2VmZmljaWVudHMKICAgICAgKi8KLSAgICBCMSA9ICgoTFZNX0ZMT0FUKTAuNSAtIEIyKTsgICAgICAgICAgICAgICAgICAgICAvKiBCMSA9ICgwLjUgLSBiMikgKi8KLSAgICBBMCA9IEIxICogQ29zRXJyIDsgICAgLyogVGVtcG9yYXJ5IHN0b3JhZ2UgZm9yICgwLjUgLSBiMikgKiBjb3NlcnIodDApICovCi0gICAgQjEgLT0gQTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCMSA9ICgwLjUgLSBiMikgKiAoMSAtIGNvc2Vycih0MCkpICAqLwotICAgIEEwID0gKChMVk1fRkxPQVQpMC41ICArIEIyKSAvIDI7ICAgICAgICAgICAgICAgIC8qIEEwID0gKDAuNSArIGIyKSAvIDIgKi8KKyAgICBCMSA9ICgoTFZNX0ZMT0FUKTAuNSAtIEIyKTsgICAgIC8qIEIxID0gKDAuNSAtIGIyKSAqLworICAgIEEwID0gQjEgKiBDb3NFcnI7ICAgICAgICAgICAgICAgLyogVGVtcG9yYXJ5IHN0b3JhZ2UgZm9yICgwLjUgLSBiMikgKiBjb3NlcnIodDApICovCisgICAgQjEgLT0gQTA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBCMSA9ICgwLjUgLSBiMikgKiAoMSAtIGNvc2Vycih0MCkpICAqLworICAgIEEwID0gKChMVk1fRkxPQVQpMC41ICsgQjIpIC8gMjsgLyogQTAgPSAoMC41ICsgYjIpIC8gMiAqLwogCiAgICAgLyoKICAgICAgKiBXcml0ZSBjb2VmZiBpbnRvIHRoZSBkYXRhIHN0cnVjdHVyZQpAQCAtNjQwLDcgKzYwMSw3IEBACiAgICAgcENvZWZmaWNpZW50cy0+QjEgPSBCMTsKICAgICBwQ29lZmZpY2llbnRzLT5CMiA9IEIyOwogCi0gICAgcmV0dXJuKExWUFNBX09LKTsKKyAgICByZXR1cm4gKExWUFNBX09LKTsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjU4LDI0ICs2MTksMTAgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9DbGVhckZpbHRlckhpc3RvcnkoTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QpCi17Ci0gICAgTFZNX0lOVDggICAgICAgKnBUYXBBZGRyZXNzOwotICAgIExWTV9VSU5UMzIgICAgICAgaTsKLQotICAgIC8qIEJhbmQgUGFzcyBmaWx0ZXJzIHRhcHMgKi8KLSAgICBwVGFwQWRkcmVzcyA9IChMVk1fSU5UOCAqKXBJbnN0LT5wQlBfVGFwczsKLSAgICBmb3IoaSA9IDA7IGkgPCBwSW5zdC0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190KTsgaSsrKQotICAgIHsKLSAgICAgICAgcFRhcEFkZHJlc3NbaV0gPSAwOwotICAgIH0KLSAgICAvKiBRdWFzaS1wZWFrIGZpbHRlcnMgdGFwcyAqLwotICAgIHBUYXBBZGRyZXNzID0gKExWTV9JTlQ4ICopcEluc3QtPnBRUERfVGFwczsKLSAgICBmb3IoaSA9IDA7IGkgPCBwSW5zdC0+bkJhbmRzICogc2l6ZW9mKFFQRF9UYXBzX3QpOyBpKyspCi0gICAgewotICAgICAgICBwVGFwQWRkcmVzc1tpXSA9IDA7CitMVlBTQV9SRVRVUk4gTFZQU0FfQ2xlYXJGaWx0ZXJIaXN0b3J5KExWUFNBX0luc3RhbmNlUHJfdCogcEluc3QpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBJbnN0LT5zcGVjQmlxdWFkLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHBJbnN0LT5zcGVjQmlxdWFkW2ldLmNsZWFyKCk7CiAgICAgfQogCi0gICAgcmV0dXJuKExWUFNBX09LKTsKKyAgICByZXR1cm4gKExWUFNBX09LKTsKIH0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0luaXQuY3BwCmluZGV4IDlmY2Q4MmYuLmEwZjI4YjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Jbml0LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jcHAKQEAgLTE1LDIzICsxNSwyMyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgICAgIkxWUFNBLmgiCi0jaW5jbHVkZSAgICAiTFZQU0FfUHJpdmF0ZS5oIgotI2luY2x1ZGUgICAgIkluc3RBbGxvYy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIkxWUFNBLmgiCisjaW5jbHVkZSAiTFZQU0FfUHJpdmF0ZS5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbml0aWFsaXplIHRoZSBMVlBTQSBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ3JlYXRlIGFuZCBJbml0aWFsaXplIHRoZSBMVlBTQSBtb2R1bGUgaW5jbHVkaW5nIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBoSW5zdGFuY2UgICAgICAgICAgUG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgSW5pdFBhcmFtcyAgICAgICAgICBJbml0IHBhcmFtZXRlcnMgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIENvbnRyb2xQYXJhbXMgICAgICAgQ29udHJvbCBwYXJhbWV0ZXJzIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgIE1lbW9yeSB0YWJsZSB0aGF0IGNvbnRhaW5zIG1lbW9yeSBhcmVhcyBkZWZpbml0aW9uICAgICAgICAgICovCisvKiAgcFNjcmF0Y2ggICAgICAgICAgICBQb2ludGVyIHRvIGJ1bmRsZSBzY3JhdGNoIG1lbW9yeSBhcmVhICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzksNzUgKzM5LDE5IEBACiAvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlBTQV9SRVRVUk4gTFZQU0FfSW5pdCAgICAgICAgICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICAgKnBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICAgICAgKnBJbml0UGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgICpwQ29udHJvbFBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX01lbVRhYl90ICAgICAgICAgICAgICAqcE1lbW9yeVRhYmxlICkKLXsKLSAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICAgKnBMVlBTQV9JbnN0OwotICAgIExWUFNBX1JFVFVSTiAgICAgICAgICAgICAgICBlcnJvckNvZGUgICAgICAgPSBMVlBTQV9PSzsKLSAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgaWk7Ci0gICAgZXh0ZXJuIExWTV9GTE9BVCAgICAgICAgICAgIExWUFNBX0Zsb2F0X0dhaW5UYWJsZVtdOwotICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBCdWZmZXJMZW5ndGggPSAwOwotCi0gICAgLyogSW50c19BbGxvYyBpbnN0YW5jZXMsIG5lZWRlZCBmb3IgbWVtb3J5IGFsaWdubWVudCBtYW5hZ2VtZW50ICovCi0gICAgSU5TVF9BTExPQyAgICAgICAgICBJbnN0YW5jZTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgIFNjcmF0Y2g7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICBEYXRhOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgQ29lZjsKLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZigocGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBJbml0UGFyYW1zID09IExWTV9OVUxMKSB8fCAocENvbnRyb2xQYXJhbXMgPT0gTFZNX05VTEwpIHx8IChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpKQotICAgIHsKLSAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKLSAgICB9Ci0gICAgaWYoIChwSW5pdFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gPiBMVlBTQV9NQVhCVUZGRVJEVVJBVElPTikgICB8fAotICAgICAgICAocEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uID09IDApICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgKHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSA+IExWUFNBX01BWElOUFVUQkxPQ0tTSVpFKSAgICAgIHx8Ci0gICAgICAgIChwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAocEluaXRQYXJhbXMtPm5CYW5kcyA8IExWUFNBX05CQU5EU01JTikgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgKHBJbml0UGFyYW1zLT5uQmFuZHMgPiBMVlBTQV9OQkFORFNNQVgpICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXMgPT0gMCkpCi0gICAgewotICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKLSAgICB9Ci0gICAgZm9yKGlpID0gMDsgaWkgPCBwSW5pdFBhcmFtcy0+bkJhbmRzOyBpaSsrKQotICAgIHsKLSAgICAgICAgaWYoKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uQ2VudGVyRnJlcXVlbmN5ID4gTFZQU0FfTUFYQ0VOVEVSRlJFUSkgfHwKLSAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUG9zdEdhaW4gICAgICAgID4gTFZQU0FfTUFYUE9TVEdBSU4pICAgfHwKLSAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUG9zdEdhaW4gICAgICAgIDwgTFZQU0FfTUlOUE9TVEdBSU4pICAgfHwKLSAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUUZhY3RvciA8IExWUFNBX01JTlFGQUNUT1IpICAgICAgICAgICAgfHwKLSAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUUZhY3RvciA+IExWUFNBX01BWFFGQUNUT1IpKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7Ci0gICAgICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKkluc3RfQWxsb2MgaW5zdGFuY2VzIGluaXRpYWxpemF0aW9uICovCi0gICAgSW5zdEFsbG9jX0luaXQoICZJbnN0YW5jZSAgICwgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MpOwotICAgIEluc3RBbGxvY19Jbml0KCAmU2NyYXRjaCAgICAsIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MpOwotICAgIEluc3RBbGxvY19Jbml0KCAmRGF0YSAgICAgICAsIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyk7Ci0gICAgSW5zdEFsbG9jX0luaXQoICZDb2VmICAgICAgICwgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzKTsKK0xWUFNBX1JFVFVSTiBMVlBTQV9Jbml0KHBMVlBTQV9IYW5kbGVfdCogcGhJbnN0YW5jZSwgTFZQU0FfSW5pdFBhcmFtc190KiBwSW5pdFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCogcENvbnRyb2xQYXJhbXMsIHZvaWQqIHBTY3JhdGNoKSB7CisgICAgTFZQU0FfSW5zdGFuY2VQcl90KiBwTFZQU0FfSW5zdDsKKyAgICBMVlBTQV9SRVRVUk4gZXJyb3JDb2RlID0gTFZQU0FfT0s7CisgICAgTFZNX1VJTlQzMiBpaTsKKyAgICBleHRlcm4gTFZNX0ZMT0FUIExWUFNBX0Zsb2F0X0dhaW5UYWJsZVtdOworICAgIExWTV9VSU5UMzIgQnVmZmVyTGVuZ3RoID0gMDsKIAogICAgIC8qIFNldCB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkICovCi0gICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgKnBoSW5zdGFuY2UgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHNpemVvZihMVlBTQV9JbnN0YW5jZVByX3QpICk7Ci0gICAgfQotICAgIHBMVlBTQV9JbnN0ID0oTFZQU0FfSW5zdGFuY2VQcl90KikqcGhJbnN0YW5jZTsKKyAgICAqcGhJbnN0YW5jZSA9IG5ldyBMVlBTQV9JbnN0YW5jZVByX3R7fTsKKyAgICBwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKSpwaEluc3RhbmNlOwogCi0gICAgLyogQ2hlY2sgdGhlIG1lbW9yeSB0YWJsZSBmb3IgTlVMTCBwb2ludGVycyAqLwotICAgIGZvciAoaWkgPSAwOyBpaSA8IExWUFNBX05SX01FTU9SWV9SRUdJT05TOyBpaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2lpXS5TaXplIT0wKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25baWldLnBCYXNlQWRkcmVzcz09TFZNX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5NZW1vcnlUYWJsZS5SZWdpb25baWldID0gcE1lbW9yeVRhYmxlLT5SZWdpb25baWldOwotICAgICAgICB9Ci0gICAgfQorICAgIHBMVlBTQV9JbnN0LT5wU2NyYXRjaCA9IHBTY3JhdGNoOwogCiAgICAgLyogSW5pdGlhbGl6ZSBtb2R1bGUncyBpbnRlcm5hbCBwYXJhbWV0ZXJzICovCiAgICAgcExWUFNBX0luc3QtPmJDb250cm9sUGVuZGluZyA9IExWTV9GQUxTRTsKQEAgLTExNyw4MSArNjEsMTMyIEBACiAgICAgcExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuRnMgPSBMVk1fRlNfRFVNTVk7CiAgICAgcExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZCA9IExWUFNBX1NQRUVEX0RVTU1ZOwogCi0gICAgeyAgIC8qIGZvciBhdm9pZGluZyBRQUMgd2FybmluZ3MgKi8KLSAgICAgICAgTFZNX0lOVDMyIFNEQkQ9KExWTV9JTlQzMilwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb247Ci0gICAgICAgIExWTV9JTlQzMiBJUlRJPShMVk1fSU5UMzIpTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZUludjsKKyAgICB7IC8qIGZvciBhdm9pZGluZyBRQUMgd2FybmluZ3MgKi8KKyAgICAgICAgTFZNX0lOVDMyIFNEQkQgPSAoTFZNX0lOVDMyKXBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbjsKKyAgICAgICAgTFZNX0lOVDMyIElSVEkgPSAoTFZNX0lOVDMyKUxWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVJbnY7CiAgICAgICAgIExWTV9JTlQzMiBCTDsKIAotICAgICAgICBNVUwzMngzMklOVE8zMihTREJELElSVEksQkwsTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0KQorICAgICAgICBNVUwzMngzMklOVE8zMihTREJELCBJUlRJLCBCTCwgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0KQogCi0gICAgICAgIEJ1ZmZlckxlbmd0aD0oTFZNX1VJTlQzMilCTDsKKyAgICAgICAgICAgICAgICBCdWZmZXJMZW5ndGggPSAoTFZNX1VJTlQzMilCTDsKICAgICB9CiAKLSAgICBpZigoQnVmZmVyTGVuZ3RoICogTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZSkgIT0gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uKQotICAgIHsKKyAgICBpZiAoKEJ1ZmZlckxlbmd0aCAqIExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWUpICE9IHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbikgewogICAgICAgICBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoID0gQnVmZmVyTGVuZ3RoICsgMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgICBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoID0gQnVmZmVyTGVuZ3RoOwogICAgIH0KIAogICAgIC8qIEFzc2lnbiB0aGUgcG9pbnRlcnMgKi8KLSAgICBwTFZQU0FfSW5zdC0+cFBvc3RHYWlucyAgICAgICAgICAgICA9Ci0gICAgICAgIChMVk1fRkxPQVQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fRkxPQVQpKTsKLSAgICBwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXMgICAgICAgICAgICAgPSAoTFZQU0FfRmlsdGVyUGFyYW1fdCAqKQotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVlBTQV9GaWx0ZXJQYXJhbV90KSk7Ci0gICAgcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydCAgID0gKExWTV9VSU5UOCAqKQotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCAqIHNpemVvZihMVk1fVUlOVDgpKTsKLSAgICBwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3MgICAgICAgICAgICAgPSAoTFZNX1VJTlQ4ICopCi0gICAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fVUlOVDgpKTsKLSAgICBwTFZQU0FfSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbiAgICAgICAgPSAoTFZQU0FfQlBGaWx0ZXJQcmVjaXNpb25fZW4gKikKLSAgICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVlBTQV9CUEZpbHRlclByZWNpc2lvbl9lbikpOwotICAgIHBMVlBTQV9JbnN0LT5wQlBfSW5zdGFuY2VzICAgICAgICAgID0gKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICopCi0gICAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkpOwotICAgIHBMVlBTQV9JbnN0LT5wUVBEX1N0YXRlcyAgICAgICAgICAgID0gKFFQRF9GTE9BVF9TdGF0ZV90ICopCi0gICAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihRUERfRkxPQVRfU3RhdGVfdCkpOwotCi0gICAgcExWUFNBX0luc3QtPnBCUF9UYXBzICAgICAgICAgICAgICAgPSAoQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgKikKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190KSk7Ci0gICAgcExWUFNBX0luc3QtPnBRUERfVGFwcyAgICAgICAgICAgICAgPSAoUVBEX0ZMT0FUX1RhcHNfdCAqKQotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihRUERfRkxPQVRfVGFwc190KSk7CisgICAgcExWUFNBX0luc3QtPnBQb3N0R2FpbnMgPQorICAgICAgICAgICAgKExWTV9GTE9BVCopY2FsbG9jKHBJbml0UGFyYW1zLT5uQmFuZHMsIHNpemVvZigqKHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zKSkpOworICAgIGlmIChwTFZQU0FfSW5zdC0+cFBvc3RHYWlucyA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm4gTFZQU0FfRVJST1JfTlVMTEFERFJFU1M7CisgICAgfQorICAgIHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtcyA9IChMVlBTQV9GaWx0ZXJQYXJhbV90KiljYWxsb2MoCisgICAgICAgICAgICBwSW5pdFBhcmFtcy0+bkJhbmRzLCBzaXplb2YoKihwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXMpKSk7CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtcyA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm4gTFZQU0FfRVJST1JfTlVMTEFERFJFU1M7CisgICAgfQorICAgIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQgPSAoTFZNX1VJTlQ4KiljYWxsb2MoCisgICAgICAgICAgICBwSW5pdFBhcmFtcy0+bkJhbmRzLCBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCoocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydCkpKTsKKyAgICBpZiAocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydCA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm4gTFZQU0FfRVJST1JfTlVMTEFERFJFU1M7CisgICAgfQorICAgIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrcyA9CisgICAgICAgICAgICAoTFZNX1VJTlQ4KiljYWxsb2MocEluaXRQYXJhbXMtPm5CYW5kcywgc2l6ZW9mKCoocExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzKSkpOworICAgIGlmIChwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3MgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuIExWUFNBX0VSUk9SX05VTExBRERSRVNTOworICAgIH0KKyAgICBwTFZQU0FfSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbiA9IChMVlBTQV9CUEZpbHRlclByZWNpc2lvbl9lbiopY2FsbG9jKAorICAgICAgICAgICAgcEluaXRQYXJhbXMtPm5CYW5kcywgc2l6ZW9mKCoocExWUFNBX0luc3QtPnBCUEZpbHRlcnNQcmVjaXNpb24pKSk7CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybiBMVlBTQV9FUlJPUl9OVUxMQUREUkVTUzsKKyAgICB9CisgICAgcExWUFNBX0luc3QtPnBRUERfU3RhdGVzID0KKyAgICAgICAgICAgIChRUERfRkxPQVRfU3RhdGVfdCopY2FsbG9jKHBJbml0UGFyYW1zLT5uQmFuZHMsIHNpemVvZigqKHBMVlBTQV9JbnN0LT5wUVBEX1N0YXRlcykpKTsKKyAgICBpZiAocExWUFNBX0luc3QtPnBRUERfU3RhdGVzID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybiBMVlBTQV9FUlJPUl9OVUxMQUREUkVTUzsKKyAgICB9CisgICAgcExWUFNBX0luc3QtPnBRUERfVGFwcyA9CisgICAgICAgICAgICAoUVBEX0ZMT0FUX1RhcHNfdCopY2FsbG9jKHBJbml0UGFyYW1zLT5uQmFuZHMsIHNpemVvZigqKHBMVlBTQV9JbnN0LT5wUVBEX1RhcHMpKSk7CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wUVBEX1RhcHMgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuIExWUFNBX0VSUk9SX05VTExBRERSRVNTOworICAgIH0KIAogICAgIC8qIENvcHkgZmlsdGVycyBwYXJhbWV0ZXJzIGluIHRoZSBwcml2YXRlIGluc3RhbmNlICovCi0gICAgZm9yKGlpID0gMDsgaWkgPCBwTFZQU0FfSW5zdC0+bkJhbmRzOyBpaSsrKQotICAgIHsKKyAgICBmb3IgKGlpID0gMDsgaWkgPCBwTFZQU0FfSW5zdC0+bkJhbmRzOyBpaSsrKSB7CiAgICAgICAgIHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0gPSBwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldOwogICAgIH0KIAogICAgIC8qIFNldCBQb3N0IGZpbHRlcnMgZ2FpbnMqLwotICAgIGZvcihpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5CYW5kczsgaWkrKykKLSAgICB7Ci0gICAgICAgIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zW2lpXSA9IExWUFNBX0Zsb2F0X0dhaW5UYWJsZVsxNSArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2Fpbl07CisgICAgZm9yIChpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5CYW5kczsgaWkrKykgeworICAgICAgICBwTFZQU0FfSW5zdC0+cFBvc3RHYWluc1tpaV0gPQorICAgICAgICAgICAgICAgIExWUFNBX0Zsb2F0X0dhaW5UYWJsZVsxNSArIHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUG9zdEdhaW5dOwogICAgIH0KICAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQ7CiAKICAgICAvKiBJbml0aWFsaXplIGNvbnRyb2wgZGVwZW5kYW50IGludGVybmFsIHBhcmFtZXRlcnMgKi8KLSAgICBlcnJvckNvZGUgPSBMVlBTQV9Db250cm9sICgqcGhJbnN0YW5jZSwgcENvbnRyb2xQYXJhbXMpOworICAgIGVycm9yQ29kZSA9IExWUFNBX0NvbnRyb2woKnBoSW5zdGFuY2UsIHBDb250cm9sUGFyYW1zKTsKIAotICAgIGlmKGVycm9yQ29kZSE9MCkKLSAgICB7CisgICAgaWYgKGVycm9yQ29kZSAhPSAwKSB7CiAgICAgICAgIHJldHVybiBlcnJvckNvZGU7CiAgICAgfQogCi0gICAgZXJyb3JDb2RlID0gTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyAocExWUFNBX0luc3QpOworICAgIGVycm9yQ29kZSA9IExWUFNBX0FwcGx5TmV3U2V0dGluZ3MocExWUFNBX0luc3QpOwogCi0gICAgaWYoZXJyb3JDb2RlIT0wKQotICAgIHsKKyAgICBpZiAoZXJyb3JDb2RlICE9IDApIHsKICAgICAgICAgcmV0dXJuIGVycm9yQ29kZTsKICAgICB9CiAKLSAgICByZXR1cm4oZXJyb3JDb2RlKTsKKyAgICByZXR1cm4gKGVycm9yQ29kZSk7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfRGVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnJlZSB0aGUgbWVtb3JpZXMgY3JlYXRlZCBpbiBMVlBTQV9Jbml0IGNhbGwgaW5jbHVkaW5nIGluc3RhbmNlIGhhbmRsZSAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVlBTQV9EZUluaXQocExWUFNBX0hhbmRsZV90KiBwaEluc3RhbmNlKSB7CisgICAgTFZQU0FfSW5zdGFuY2VQcl90KiBwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKSpwaEluc3RhbmNlOworICAgIGlmIChwTFZQU0FfSW5zdCA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChwTFZQU0FfSW5zdC0+cFBvc3RHYWlucyAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zKTsKKyAgICAgICAgcExWUFNBX0luc3QtPnBQb3N0R2FpbnMgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtcyAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtcyk7CisgICAgICAgIHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtcyA9IExWTV9OVUxMOworICAgIH0KKyAgICBpZiAocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydCAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQpOworICAgICAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ID0gTFZNX05VTEw7CisgICAgfQorICAgIGlmIChwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3MgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3MpOworICAgICAgICBwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3MgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocExWUFNBX0luc3QtPnBCUEZpbHRlcnNQcmVjaXNpb24pOworICAgICAgICBwTFZQU0FfSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbiA9IExWTV9OVUxMOworICAgIH0KKyAgICBpZiAocExWUFNBX0luc3QtPnBRUERfU3RhdGVzICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocExWUFNBX0luc3QtPnBRUERfU3RhdGVzKTsKKyAgICAgICAgcExWUFNBX0luc3QtPnBRUERfU3RhdGVzID0gTFZNX05VTEw7CisgICAgfQorICAgIGlmIChwTFZQU0FfSW5zdC0+cFFQRF9UYXBzICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocExWUFNBX0luc3QtPnBRUERfVGFwcyk7CisgICAgICAgIHBMVlBTQV9JbnN0LT5wUVBEX1RhcHMgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgZGVsZXRlIHBMVlBTQV9JbnN0OworICAgICpwaEluc3RhbmNlID0gTFZNX05VTEw7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9NZW1vcnkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWZjYmU2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9NZW1vcnkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICAgICJMVlBTQS5oIgotI2luY2x1ZGUgICAgIkxWUFNBX1ByaXZhdGUuaCIKLSNpbmNsdWRlICAgICJJbnN0QWxsb2MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAqLwotLyogIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBJbnN0YW5jZSBoYW5kbGUgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJhc2UgYWRkcmVzc2VzIGZvciB0aGUgaW5zdGFuY2UgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgdGhlIG1lbW9yeSAgICAgICovCi0vKiAgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZnJlZSAoaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlKSB0aGUgbWVtb3J5ICAgICAgICovCi0vKiAgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAqLwotLyogIEluaXRQYXJhbXMgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGluaXQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlBTQV9SRVRVUk4gTFZQU0FfTWVtb3J5ICAgICAgICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfTWVtVGFiX3QgICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgICAgICAgICpwSW5pdFBhcmFtcyAgICApCi17Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICBpaTsKLSAgICBMVk1fVUlOVDMyICAgICAgICAgIEJ1ZmZlckxlbmd0aDsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgIEluc3RhbmNlOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgU2NyYXRjaDsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgIERhdGE7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICBDb2VmOwotICAgIExWUFNBX0luc3RhbmNlUHJfdCAqcExWUFNBX0luc3QgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7Ci0KLSAgICBJbnN0QWxsb2NfSW5pdCggJkluc3RhbmNlICAgLCBMVk1fTlVMTCk7Ci0gICAgSW5zdEFsbG9jX0luaXQoICZTY3JhdGNoICAgICwgTFZNX05VTEwpOwotICAgIEluc3RBbGxvY19Jbml0KCAmRGF0YSAgICAgICAsIExWTV9OVUxMKTsKLSAgICBJbnN0QWxsb2NfSW5pdCggJkNvZWYgICAgICAgLCBMVk1fTlVMTCk7Ci0KLSAgICBpZigocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKSB8fCAocEluaXRQYXJhbXMgPT0gTFZNX05VTEwpKQotICAgIHsKLSAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEZpbGwgaW4gdGhlIG1lbW9yeSB0YWJsZQotICAgICAqLwotICAgIGlmIChoSW5zdGFuY2UgPT0gTFZNX05VTEwpCi0gICAgewotCi0gICAgICAgIC8qIENoZWNrIGluaXQgcGFyYW1ldGVyICovCi0gICAgICAgIGlmKCAocEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uID4gTFZQU0FfTUFYQlVGRkVSRFVSQVRJT04pICAgfHwKLSAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSA+IExWUFNBX01BWElOUFVUQkxPQ0tTSVpFKSAgICAgIHx8Ci0gICAgICAgICAgICAocEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplID09IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+bkJhbmRzIDwgTFZQU0FfTkJBTkRTTUlOKSAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5uQmFuZHMgPiBMVlBTQV9OQkFORFNNQVgpICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKLSAgICAgICAgfQotICAgICAgICBmb3IoaWkgPSAwOyBpaSA8IHBJbml0UGFyYW1zLT5uQmFuZHM7IGlpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLkNlbnRlckZyZXF1ZW5jeSA+IExWUFNBX01BWENFTlRFUkZSRVEpIHx8Ci0gICAgICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2FpbiAgICAgICAgPiBMVlBTQV9NQVhQT1NUR0FJTikgICB8fAotICAgICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUG9zdEdhaW4gICAgICAgIDwgTFZQU0FfTUlOUE9TVEdBSU4pICAgfHwKLSAgICAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlFGYWN0b3IgPCBMVlBTQV9NSU5RRkFDVE9SKSAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yID4gTFZQU0FfTUFYUUZBQ1RPUikpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOwotICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogSW5zdGFuY2UgbWVtb3J5Ci0gICAgICAgICAqLwotCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgc2l6ZW9mKExWUFNBX0luc3RhbmNlUHJfdCkgKTsKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWTV9GTE9BVCkgKTsKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWUFNBX0ZpbHRlclBhcmFtX3QpICk7Ci0KLSAgICAgICAgewotICAgICAgICAgICAgLyogZm9yIGF2b2lkaW5nIFFBQyB3YXJuaW5ncyBhcyBNVUwzMngzMklOVE8zMiB3b3JrcyBvbiBMVk1fSU5UMzIgb25seSovCi0gICAgICAgICAgICBMVk1fSU5UMzIgU0RCRD0oTFZNX0lOVDMyKXBJbml0UGFyYW1zLT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbjsKLSAgICAgICAgICAgIExWTV9JTlQzMiBJUlRJPShMVk1fSU5UMzIpTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZUludjsKLSAgICAgICAgICAgIExWTV9JTlQzMiBCTDsKLQotICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIoU0RCRCxJUlRJLEJMLExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVTaGlmdCkKLSAgICAgICAgICAgIEJ1ZmZlckxlbmd0aD0oTFZNX1VJTlQzMilCTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKChCdWZmZXJMZW5ndGggKiBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lKSAhPSBwSW5pdFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJ1ZmZlckxlbmd0aCsrOwotICAgICAgICB9Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIEJ1ZmZlckxlbmd0aCAqIHNpemVvZihMVk1fVUlOVDgpICk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fVUlOVDgpICk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVlBTQV9CUEZpbHRlclByZWNpc2lvbl9lbikgKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX0lOU1RBTkNFXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkluc3RhbmNlKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX0lOU1RBTkNFXS5UeXBlICAgICAgICAgPSBMVlBTQV9QRVJTSVNURU5UOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fSU5TVEFOQ0VdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNjcmF0Y2ggbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmU2NyYXRjaCwgMiAqIHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSAqIHNpemVvZihMVk1fRkxPQVQpICk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9TQ1JBVENIXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJlNjcmF0Y2gpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0uVHlwZSAgICAgICAgID0gTFZQU0FfU0NSQVRDSDsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFBlcnNpc3RlbnQgY29lZmZpY2llbnRzIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpICk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKFFQRF9GTE9BVF9TdGF0ZV90KSApOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkNvZWYpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVlBTQV9QRVJTSVNURU5UX0NPRUY7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFBlcnNpc3RlbnQgZGF0YSBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190KSApOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfRkxPQVRfVGFwc190KSApOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkRhdGEpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVlBTQV9QRVJTSVNURU5UX0RBVEE7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFJlYWQgYmFjayBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLwotICAgICAgICAqcE1lbW9yeVRhYmxlID0gcExWUFNBX0luc3QtPk1lbW9yeVRhYmxlOwotICAgIH0KLQotICAgIHJldHVybihMVlBTQV9PSyk7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oCmluZGV4IDYxOTg3YjUuLjYwNWEyMmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaApAQCAtMTgsNiArMTgsNyBAQAogI2lmbmRlZiBfTFZQU0FfUFJJVkFURV9IXwogI2RlZmluZSBfTFZQU0FfUFJJVkFURV9IXwogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvQmlxdWFkRmlsdGVyLmg+CiAjaW5jbHVkZSAiTFZQU0EuaCIKICNpbmNsdWRlICJCSVFVQUQuaCIKICNpbmNsdWRlICJMVlBTQV9RUEQuaCIKQEAgLTI3LDk1ICsyOCw5OSBAQAogICAgQ09OU1RBTlQgREVGSU5JVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBNZW1vcnkgKi8KLSNkZWZpbmUgTFZQU0FfSU5TVEFOQ0VfQUxJR04gICAgICAgICAgICAgNCAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIHN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfU0NSQVRDSF9BTElHTiAgICAgICAgICAgICAgNCAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfQ09FRl9BTElHTiAgICAgICAgICAgICAgICAgNCAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgd29yZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfREFUQV9BTElHTiAgICAgICAgICAgICAgICAgNCAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUgMTMgLyogRnJvbSA4MDAwSHogdG8gMTkyMDAwSHoqLworI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfU1BFRUQgXAorICAgIDMgLyogTE9XLCBNRURJVU0sIEhJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCi0jZGVmaW5lIExWUFNBX01FTVJFR0lPTl9JTlNUQU5DRSAgICAgICAgIDAgICAgICAvKiBPZmZzZXQgdG8gaW5zdGFuY2UgbWVtb3J5IHJlZ2lvbiBpbiBtZW1vcnkgdGFibGUgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIExWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUYgIDEgICAgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCBjb2VmZmljaWVudHMgIG1lbW9yeSByZWdpb24gaW4gbWVtb3J5IHRhYmxlICovCi0jZGVmaW5lIExWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEEgIDIgICAgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCB0YXBzICBtZW1vcnkgcmVnaW9uIGluIG1lbW9yeSB0YWJsZSAgICAgICAgICovCi0jZGVmaW5lIExWUFNBX01FTVJFR0lPTl9TQ1JBVENIICAgICAgICAgIDMgICAgICAvKiBPZmZzZXQgdG8gc2NyYXRjaCAgbWVtb3J5IHJlZ2lvbiBpbiBtZW1vcnkgdGFibGUgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFICAgICAgICAgIDEzICAgICAgLyogRnJvbSA4MDAwSHogdG8gMTkyMDAwSHoqLwotI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfU1BFRUQgICAgICAgICAzICAgICAgLyogTE9XLCBNRURJVU0sIEhJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NQVhCVUZGRVJEVVJBVElPTiBcCisgICAgNDAwMCAvKiBNYXhpbXVtIGxlbmd0aCBpbiBtcyBvZiB0aGUgbGV2ZWxzIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExWUFNBX01BWElOUFVUQkxPQ0tTSVpFIFwKKyAgICA1MDAwICAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gbGVuZ3RoIGluIG1vbm8gc2FtcGxlcyBvZiB0aGUgYmxvY2sgdG8gcHJvY2VzcyAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTkJBTkRTTUlOIDEgIC8qIE1pbmltdW0gbnVtYmVyIG9mIGZyZXF1ZW5jeSBiYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTkJBTkRTTUFYIDMwIC8qIE1heGltdW0gbnVtYmVyIG9mIGZyZXF1ZW5jeSBiYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTUFYQ0VOVEVSRlJFUSBcCisgICAgMjAwMDAgLyogTWF4aW11bSBwb3NzaWJsZSBjZW50ZXIgZnJlcXVlbmN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NSU5QT1NUR0FJTiBcCisgICAgKC0xNSkgICAgICAgICAgICAgICAgICAgICAvKiBNaW5pbXVtIHBvc3NpYmxlIHBvc3QgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExWUFNBX01BWFBPU1RHQUlOIDE1ICAvKiBNYXhpbXVtIHBvc3NpYmxlIHBvc3QgZ2FpbiAgKi8KKyNkZWZpbmUgTFZQU0FfTUlOUUZBQ1RPUiAyNSAgIC8qIE1pbmltdW0gcG9zc2libGUgUSBmYWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTUFYUUZBQ1RPUiAxMjAwIC8qIE1heGltdW0gcG9zc2libGUgUSBmYWN0b3IgKi8KIAotI2RlZmluZSBMVlBTQV9NQVhCVUZGRVJEVVJBVElPTiAgICAgICAgICA0MDAwICAgLyogTWF4aW11bSBsZW5ndGggaW4gbXMgb2YgdGhlIGxldmVscyBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMVlBTQV9NQVhJTlBVVEJMT0NLU0laRSAgICAgICAgICA1MDAwICAgLyogTWF4aW11bSBsZW5ndGggaW4gbW9ubyBzYW1wbGVzIG9mIHRoZSBibG9jayB0byBwcm9jZXNzICAgICAgICAgICAqLwotI2RlZmluZSBMVlBTQV9OQkFORFNNSU4gICAgICAgICAgICAgICAgICAxICAgICAgLyogTWluaW11bSBudW1iZXIgb2YgZnJlcXVlbmN5IGJhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMVlBTQV9OQkFORFNNQVggICAgICAgICAgICAgICAgICAzMCAgICAgLyogTWF4aW11bSBudW1iZXIgb2YgZnJlcXVlbmN5IGJhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMVlBTQV9NQVhDRU5URVJGUkVRICAgICAgICAgICAgICAyMDAwMCAgLyogTWF4aW11bSBwb3NzaWJsZSBjZW50ZXIgZnJlcXVlbmN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMVlBTQV9NSU5QT1NUR0FJTiAgICAgICAgICAgICAgKC0xNSkgICAgLyogTWluaW11bSBwb3NzaWJsZSBwb3N0IGdhaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMVlBTQV9NQVhQT1NUR0FJTiAgICAgICAgICAgICAgICAxNSAgICAgLyogTWF4aW11bSBwb3NzaWJsZSBwb3N0IGdhaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMVlBTQV9NSU5RRkFDVE9SICAgICAgICAgICAgICAgICAyNSAgICAgLyogTWluaW11bSBwb3NzaWJsZSBRIGZhY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMVlBTQV9NQVhRRkFDVE9SICAgICAgICAgICAgICAgICAxMjAwICAgLyogTWF4aW11bSBwb3NzaWJsZSBRIGZhY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NQVhMRVZFTERFQ0FZRkFDVE9SIFwKKyAgICAweDQxMTEgLyogRGVjYXkgZmFjdG9yIGZvciB0aGUgbWF4aW11bSB2YWx1ZXMgY2FsY3VsYXRpb24gICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NQVhMRVZFTERFQ0FZU0hJRlQgXAorICAgIDE0IC8qIERlY2F5IHNoaWZ0IGZvciB0aGUgbWF4aW11bSB2YWx1ZXMgY2FsY3VsYXRpb24gICAgICAgICAgICAgICAgICAgKi8KIAotI2RlZmluZSBMVlBTQV9NQVhMRVZFTERFQ0FZRkFDVE9SICAgICAgICAweDQxMTEgLyogRGVjYXkgZmFjdG9yIGZvciB0aGUgbWF4aW11bSB2YWx1ZXMgY2FsY3VsYXRpb24gICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMVlBTQV9NQVhMRVZFTERFQ0FZU0hJRlQgICAgICAgICAxNCAgICAgLyogRGVjYXkgc2hpZnQgZm9yIHRoZSBtYXhpbXVtIHZhbHVlcyBjYWxjdWxhdGlvbiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NQVhVTlNJR05FRENIQVIgMHhGRgogCi0jZGVmaW5lIExWUFNBX01BWFVOU0lHTkVEQ0hBUiAgICAgICAgICAgIDB4RkYKLQotI2RlZmluZSBMVlBTQV9Gc0ludmVydFNoaWZ0ICAgICAgICAgICAgICAzMQotI2RlZmluZSBMVlBTQV9HQUlOU0hJRlQgICAgICAgICAgICAgICAgICAxMQotI2RlZmluZSBMVlBTQV9GUkVRU0hJRlQgICAgICAgICAgICAgICAgICAyNQorI2RlZmluZSBMVlBTQV9Gc0ludmVydFNoaWZ0IDMxCisjZGVmaW5lIExWUFNBX0dBSU5TSElGVCAxMQorI2RlZmluZSBMVlBTQV9GUkVRU0hJRlQgMjUKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIFRZUEVTIERFRklOSVRJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lICAgICAgIDB4MDAxNCAgICAvKiAyMCBtcyAoNTBIeikgaW4gUTE2LjAgICAgICAqLwotI2RlZmluZSBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lSW52ICAgIDB4MDY2NiAgICAvKiAxLzIwbXMgbGVmdCBzaGlmdGVkIGJ5IDE1ICAqLwotI2RlZmluZSBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lU2hpZnQgIDE1CisjZGVmaW5lIExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWUgMHgwMDE0ICAgIC8qIDIwIG1zICg1MEh6KSBpbiBRMTYuMCAgICAgICovCisjZGVmaW5lIExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVJbnYgMHgwNjY2IC8qIDEvMjBtcyBsZWZ0IHNoaWZ0ZWQgYnkgMTUgICovCisjZGVmaW5lIExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVTaGlmdCAxNQogCiAvKiBQcmVjaXNpb24gb2YgdGhlIGZpbHRlciAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZQU0FfU2ltcGxlUHJlY2lzaW9uRmlsdGVyLCAgICAvKiBTaW1wbGUgcHJlY2lzaW9uICovCi0gICAgTFZQU0FfRG91YmxlUHJlY2lzaW9uRmlsdGVyICAgICAvKiBEb3VibGUgcHJlY2lzaW9uICovCit0eXBlZGVmIGVudW0geworICAgIExWUFNBX1NpbXBsZVByZWNpc2lvbkZpbHRlciwgLyogU2ltcGxlIHByZWNpc2lvbiAqLworICAgIExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlciAgLyogRG91YmxlIHByZWNpc2lvbiAqLwogfSBMVlBTQV9CUEZpbHRlclByZWNpc2lvbl9lbjsKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fQ0hBUiAgICAgICAgICAgICAgICAgICAgYkNvbnRyb2xQZW5kaW5nOyAgICAgICAgICAgICAgICAgICAgLyogRmxhZyBpbmNhdGluZyBhIGNoYW5nZSBvZiB0aGUgY29udHJvbCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgbkJhbmRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJhbmRzIG9mIHRoZSBzcGVjdHJ1bSBhbmFseXplciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTWF4SW5wdXRCbG9ja1NpemU7ICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBpbnB1dCBkYXRhIGJ1ZmZlciBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fQ0hBUiBiQ29udHJvbFBlbmRpbmc7ICAgICAvKiBGbGFnIGluY2F0aW5nIGEgY2hhbmdlIG9mIHRoZSBjb250cm9sIHBhcmFtZXRlcnMgICAgICovCisgICAgTFZNX1VJTlQxNiBuQmFuZHM7ICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJhbmRzIG9mIHRoZSBzcGVjdHJ1bSBhbmFseXplciAgICAgICAgICAgICovCisgICAgTFZNX1VJTlQxNiBNYXhJbnB1dEJsb2NrU2l6ZTsgLyogTWF4aW11bSBpbnB1dCBkYXRhIGJ1ZmZlciBzaXplICovCiAKLSAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAgQ3VycmVudFBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIHBhcmFtZXRlcnMgb2YgdGhlIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAgTmV3UGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmV3IGNvbnRyb2wgcGFyYW1ldGVycyBnaXZlbiBieSB0aGUgdXNlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVlBTQV9NZW1UYWJfdCAgICAgICAgICAgICAgTWVtb3J5VGFibGU7CisgICAgTFZQU0FfQ29udHJvbFBhcmFtc190IEN1cnJlbnRQYXJhbXM7IC8qIEN1cnJlbnQgY29udHJvbCBwYXJhbWV0ZXJzIG9mIHRoZSBtb2R1bGUgKi8KKyAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgTmV3UGFyYW1zOyAgICAgLyogTmV3IGNvbnRyb2wgcGFyYW1ldGVycyBnaXZlbiBieSB0aGUgdXNlciAgICAgKi8KKyAgICB2b2lkKiBwU2NyYXRjaDsKKyAgICAvKiBQb2ludGVyIHRvIGJ1bmRsZSBzY3JhdGNoIGJ1ZmZlciAqLwogCi0gICAgTFZQU0FfQlBGaWx0ZXJQcmVjaXNpb25fZW4gKnBCUEZpbHRlcnNQcmVjaXNpb247ICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBmaWx0ZXIgcHJlY2lzaW9uIGZvciBlYWNoIGJhbmQgICAgICAgICAgICAgICovCi0gICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAgKnBCUF9JbnN0YW5jZXM7Ci0gICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGJhbmQgcGFzcyBmaWx0ZXIgdGFwcyBmb3IgZWFjaCBiYW5kICovCi0gICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAgKnBCUF9UYXBzOworICAgIExWUFNBX0JQRmlsdGVyUHJlY2lzaW9uX2VuKiBwQlBGaWx0ZXJzUHJlY2lzaW9uOyAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlsdGVyIHByZWNpc2lvbiBmb3IgZWFjaCBiYW5kICovCisgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxMVk1fRkxPQVQ+PgorICAgICAgICAgICAgc3BlY0JpcXVhZDsgLyogQmlxdWFkIGZpbHRlciBpbnN0YW5jZXMgKi8KICAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgUVBEIGZpbHRlciBpbnN0YW5jZSBmb3IgZWFjaCBiYW5kICovCi0gICAgUVBEX0ZMT0FUX1N0YXRlX3QgICAgICAgICAgICAgICAgKnBRUERfU3RhdGVzOworICAgIFFQRF9GTE9BVF9TdGF0ZV90KiBwUVBEX1N0YXRlczsKICAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgUVBEIGZpbHRlciB0YXBzIGZvciBlYWNoIGJhbmQgKi8KLSAgICBRUERfRkxPQVRfVGFwc190ICAgICAgICAgICAgICAgICAqcFFQRF9UYXBzOworICAgIFFQRF9GTE9BVF9UYXBzX3QqIHBRUERfVGFwczsKIAogICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBwb3N0LWZpbHRlciBnYWlucyBmb3IgZWFjaCBiYW5kICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBQb3N0R2FpbnM7Ci0gICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICAgICAgKnBGaWx0ZXJzUGFyYW1zOyAgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgb2YgdGhlIGZpbHRlcnMgcGFyYW1ldGVycyBmcm9tIHRoZSBpbnB1dCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZNX0ZMT0FUKiBwUG9zdEdhaW5zOworICAgIExWUFNBX0ZpbHRlclBhcmFtX3QqCisgICAgICAgICAgICBwRmlsdGVyc1BhcmFtczsgLyogQ29weSBvZiB0aGUgZmlsdGVycyBwYXJhbWV0ZXJzIGZyb20gdGhlIGlucHV0IHBhcmFtZXRlcnMgKi8KIAotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBuU2FtcGxlc0J1ZmZlclVwZGF0ZTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBtYWtlIDIwbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQ7ICAgICAgICAgICAvKiBDb3VudGVyIHVzZWQgdG8ga25vdyB3aGVuIHRvIHB1dCBhIG5ldyB2YWx1ZSBpbiB0aGUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBuUmVsZXZhbnRGaWx0ZXJzOyAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgcmVsZXZlbnQgZmlsdGVycyBkZXBlbmRpbmcgb24gc2FtcGxpbmcgZnJlcXVlbmN5IGFuZCBiYW5kcyBjZW50ZXIgZnJlcXVlbmN5ICAgICAgICAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBMb2NhbFNhbXBsZXNDb3VudDsgICAgICAgICAgICAgICAgICAvKiBDb3VudGVyIHVzZWQgdG8gdXBkYXRlIHRoZSBTcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWTV9VSU5UMTYgblNhbXBsZXNCdWZmZXJVcGRhdGU7ICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIG1ha2UgMjBtcyAgICAqLworICAgIExWTV9JTlQzMiBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQ7IC8qIENvdW50ZXIgdXNlZCB0byBrbm93IHdoZW4gdG8gcHV0IGEgbmV3IHZhbHVlIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fVUlOVDE2IG5SZWxldmFudEZpbHRlcnM7ICAvKiBOdW1iZXIgb2YgcmVsZXZhbnQgZmlsdGVycyBkZXBlbmRpbmcgb24gc2FtcGxpbmcgZnJlcXVlbmN5IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmRzIGNlbnRlciBmcmVxdWVuY3kgICAgICAgICovCisgICAgTFZNX1VJTlQxNiBMb2NhbFNhbXBsZXNDb3VudDsgLyogQ291bnRlciB1c2VkIHRvIHVwZGF0ZSB0aGUgU3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lICovCiAKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRG93blNhbXBsaW5nRmFjdG9yOyAgICAgICAgICAgICAgICAgLyogRG93biBzYW1wbGluZyBmYWN0b3IgZGVwZW5kaW5nIG9uIHRoZSBzYW1wbGluZyBmcmVxdWVuY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRG93blNhbXBsaW5nQ291bnQ7ICAgICAgICAgICAgICAgICAgLyogQ291bnRlciB1c2VkIGZvciB0aGUgZG93bnNhbXBsaW5nIGhhbmRsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fVUlOVDE2IERvd25TYW1wbGluZ0ZhY3RvcjsgLyogRG93biBzYW1wbGluZyBmYWN0b3IgZGVwZW5kaW5nIG9uIHRoZSBzYW1wbGluZyBmcmVxdWVuY3kgKi8KKyAgICBMVk1fVUlOVDE2IERvd25TYW1wbGluZ0NvdW50OyAgLyogQ291bnRlciB1c2VkIGZvciB0aGUgZG93bnNhbXBsaW5nIGhhbmRsaW5nICAqLwogCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOyAgICAgICAgIC8qIExlbmd0aCBvZiB0aGUgYnVmZmVyIGluIHRpbWUgKG1zKSBkZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgICAgKnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydDsgICAgICAgICAgIC8qIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgICAgKnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXI7ICAgIC8qIEN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHdyaXR0aW5nIHBvaW50ZXIgb2YgdGhlIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZQU0FfVGltZSAgICAgICAgICAgICAgICAgIFNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZTsgICAgICAgIC8qIEF1ZGlvVGltZSBhdCB3aGljaCB0aGUgbGFzdCB2YWx1ZSBzYXZlIG9jY3VyZWQgaW4gdGhlIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIFNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aDsgICAgICAgICAgIC8qIE51bWJlciBvZiBzcGVjdHJ1bSBkYXRhIHZhbHVlIHRoYXQgdGhlIGJ1ZmZlciBjYW4gY29udGFpbiAocGVyIGJhbmQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gU3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24vMjBtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZNX1VJTlQxNiBTcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbjsgICAgICAvKiBMZW5ndGggb2YgdGhlIGJ1ZmZlciBpbiB0aW1lIChtcykgZGVmaW5lZCBieSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fVUlOVDgqIHBTcGVjdHJhbERhdGFCdWZmZXJTdGFydDsgICAgICAgIC8qIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciAgICAgICAgKi8KKyAgICBMVk1fVUlOVDgqIHBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXI7IC8qIEN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHdyaXRpbmcgcG9pbnRlciBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfVGltZSBTcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWU7IC8qIEF1ZGlvVGltZSBhdCB3aGljaCB0aGUgbGFzdCB2YWx1ZSBzYXZlIG9jY3VycmVkIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWTV9VSU5UMzIKKyAgICAgICAgICAgIFNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aDsgLyogTnVtYmVyIG9mIHNwZWN0cnVtIGRhdGEgdmFsdWUgdGhhdCB0aGUgYnVmZmVyIGNhbiBjb250YWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwZXIgYmFuZCkgPSBTcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbi8yMG1zICovCiAKLSAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAgICAqcFByZXZpb3VzUGVha3M7ICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIHRvIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIHByZXZpb3VzIHBlYWsgdmFsdWUgb2YgdGhlIGxldmVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb24uIFRob3NlIHZhbHVlcyBhcmUgZGVjcmVtZW50ZWQgYWZ0ZXIgZWFjaCBjYWxsIHRvIHRoZSBHZXRTcGVjdHJ1bSBmdW5jdGlvbiAgICAgICAgICAqLworICAgIExWTV9VSU5UOCogcFByZXZpb3VzUGVha3M7IC8qIFBvaW50cyB0byBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBwcmV2aW91cyBwZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIHRoZSBsZXZlbCBkZXRlY3Rpb24uIFRob3NlIHZhbHVlcyBhcmUgZGVjcmVtZW50ZWQgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBjYWxsIHRvIHRoZSBHZXRTcGVjdHJ1bSBmdW5jdGlvbiAgICAgICAgICAqLwogCi19TFZQU0FfSW5zdGFuY2VQcl90LCAqcExWUFNBX0luc3RhbmNlUHJfdDsKK30gTFZQU0FfSW5zdGFuY2VQcl90LCAqcExWUFNBX0luc3RhbmNlUHJfdDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OUyBQUk9UT1RZUEUKQEAgLTEzNSw2ICsxNDAsNiBAQAogLyogIExWUFNBX09LICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0FwcGx5TmV3U2V0dGluZ3MgKExWUFNBX0luc3RhbmNlUHJfdCAgICAgKnBJbnN0KTsKK0xWUFNBX1JFVFVSTiBMVlBTQV9BcHBseU5ld1NldHRpbmdzKExWUFNBX0luc3RhbmNlUHJfdCogcEluc3QpOwogCiAjZW5kaWYgLyogX0xWUFNBX1BSSVZBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuY3BwCmluZGV4IDgxYTg4YzUuLmM4OWM0ZjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jcHAKQEAgLTE1LDIzICsxNSwyMyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgICAgIkxWUFNBLmgiCi0jaW5jbHVkZSAgICAiTFZQU0FfUHJpdmF0ZS5oIgotI2luY2x1ZGUgICAgIkxWTV9NYWNyb3MuaCIKLSNpbmNsdWRlICAgICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiTFZQU0EuaCIKKyNpbmNsdWRlICJMVlBTQV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKIAotI2RlZmluZSBMVk1fTUlOSU5UXzMyICAgMHg4MDAwMDAwMAorI2RlZmluZSBMVk1fTUlOSU5UXzMyIDB4ODAwMDAwMDAKIAogc3RhdGljIExWTV9JTlQzMiBtdWx0MzJ4MzJpbjMyX3NoaWZ0cihMVk1fSU5UMzIgYSwgTFZNX0lOVDMyIGIsIExWTV9JTlQzMiBjKSB7Ci0gIExWTV9JTlQ2NCByZXN1bHQgPSAoKExWTV9JTlQ2NClhICogYikgPj4gYzsKKyAgICBMVk1fSU5UNjQgcmVzdWx0ID0gKChMVk1fSU5UNjQpYSAqIGIpID4+IGM7CiAKLSAgaWYgKHJlc3VsdCA+PSBJTlQzMl9NQVgpIHsKLSAgICByZXR1cm4gSU5UMzJfTUFYOwotICB9IGVsc2UgaWYgKHJlc3VsdCA8PSBJTlQzMl9NSU4pIHsKLSAgICByZXR1cm4gSU5UMzJfTUlOOwotICB9IGVsc2UgewotICAgIHJldHVybiAoTFZNX0lOVDMyKXJlc3VsdDsKLSAgfQorICAgIGlmIChyZXN1bHQgPj0gSU5UMzJfTUFYKSB7CisgICAgICAgIHJldHVybiBJTlQzMl9NQVg7CisgICAgfSBlbHNlIGlmIChyZXN1bHQgPD0gSU5UMzJfTUlOKSB7CisgICAgICAgIHJldHVybiBJTlQzMl9NSU47CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChMVk1fSU5UMzIpcmVzdWx0OworICAgIH0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTU0LDQyICs1NCwzNiBAQAogLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX1Byb2Nlc3MgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcExWUFNBX0lucHV0U2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgIElucHV0QmxvY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfVGltZSAgICAgICAgICAgQXVkaW9UaW1lICAgICAgICAgICAgKQorTFZQU0FfUkVUVVJOIExWUFNBX1Byb2Nlc3MocExWUFNBX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZNX0ZMT0FUKiBwTFZQU0FfSW5wdXRTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBJbnB1dEJsb2NrU2l6ZSwgTFZQU0FfVGltZSBBdWRpb1RpbWUpCiAKIHsKLSAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgaWk7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQXVkaW9UaW1lSW5jOwotICAgIGV4dGVybiBMVk1fVUlOVDMyICAgICAgIExWUFNBX1NhbXBsZVJhdGVJbnZUYWJbXTsKLSAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAqcFdyaXRlX1NhdmU7ICAgICAgICAgLyogUG9zaXRpb24gb2YgdGhlIHdyaXRlIHBvaW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJvY2VzcyAgKi8KKyAgICBMVlBTQV9JbnN0YW5jZVByX3QqIHBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOworICAgIExWTV9GTE9BVCogcFNjcmF0Y2g7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9JTlQzMiBBdWRpb1RpbWVJbmM7CisgICAgZXh0ZXJuIExWTV9VSU5UMzIgTFZQU0FfU2FtcGxlUmF0ZUludlRhYltdOworICAgIExWTV9VSU5UOCogcFdyaXRlX1NhdmU7IC8qIFBvc2l0aW9uIG9mIHRoZSB3cml0ZSBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJvY2VzcyAgKi8KIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICBDSEVDSyBQQVJBTUVURVJTCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZihoSW5zdGFuY2UgPT0gTFZNX05VTEwgfHwgcExWUFNBX0lucHV0U2FtcGxlcyA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7CisgICAgaWYgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCB8fCBwTFZQU0FfSW5wdXRTYW1wbGVzID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybiAoTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOwogICAgIH0KLSAgICBpZihJbnB1dEJsb2NrU2l6ZSA9PSAwIHx8IElucHV0QmxvY2tTaXplID4gcExWUFNBX0luc3QtPk1heElucHV0QmxvY2tTaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7CisgICAgaWYgKElucHV0QmxvY2tTaXplID09IDAgfHwgSW5wdXRCbG9ja1NpemUgPiBwTFZQU0FfSW5zdC0+TWF4SW5wdXRCbG9ja1NpemUpIHsKKyAgICAgICAgcmV0dXJuIChMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOwogICAgIH0KLQotICAgIHBTY3JhdGNoID0gKExWTV9GTE9BVCopcExWUFNBX0luc3QtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOworICAgIHBTY3JhdGNoID0gKExWTV9GTE9BVCopcExWUFNBX0luc3QtPnBTY3JhdGNoOwogICAgIHBXcml0ZV9TYXZlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXI7CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgQVBQTFkgTkVXIFNFVFRJTkdTIElGIE5FRURFRAogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYgKHBMVlBTQV9JbnN0LT5iQ29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCi0gICAgeworICAgIGlmIChwTFZQU0FfSW5zdC0+YkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKSB7CiAgICAgICAgIHBMVlBTQV9JbnN0LT5iQ29udHJvbFBlbmRpbmcgPSAwOwotICAgICAgICBMVlBTQV9BcHBseU5ld1NldHRpbmdzKCBwTFZQU0FfSW5zdCk7CisgICAgICAgIExWUFNBX0FwcGx5TmV3U2V0dGluZ3MocExWUFNBX0luc3QpOwogICAgIH0KIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTk5LDM5ICs5MywzMCBAQAogICAgIENvcHlfRmxvYXQocExWUFNBX0lucHV0U2FtcGxlcywgcFNjcmF0Y2gsIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUpOwogICAgIFNoaWZ0X1NhdF9GbG9hdCgtMSwgcFNjcmF0Y2gsIHBTY3JhdGNoLCAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKIAotICAgIGZvciAoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKQotICAgIHsKLSAgICAgICAgc3dpdGNoKHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uW2lpXSkKLSAgICAgICAgeworICAgIGZvciAoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKSB7CisgICAgICAgIHN3aXRjaCAocExWUFNBX0luc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldKSB7CiAgICAgICAgICAgICBjYXNlIExWUFNBX1NpbXBsZVByZWNpc2lvbkZpbHRlcjoKLSAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAgKCAmcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXNbaWldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgSW5wdXRCbG9ja1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7CisgICAgICAgICAgICAgICAgcExWUFNBX0luc3QtPnNwZWNCaXF1YWRbaWldLnByb2Nlc3MocFNjcmF0Y2ggKyBJbnB1dEJsb2NrU2l6ZSwgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgTFZQU0FfRG91YmxlUHJlY2lzaW9uRmlsdGVyOgotICAgICAgICAgICAgICAgIEJQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxICAoICZwTFZQU0FfSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2ggKyBJbnB1dEJsb2NrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKKyAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+c3BlY0JpcXVhZFtpaV0ucHJvY2VzcyhwU2NyYXRjaCArIElucHV0QmxvY2tTaXplLCBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBMVlBTQV9RUERfUHJvY2Vzc19GbG9hdCAgICggcExWUFNBX0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIElucHV0QmxvY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpKTsKKyAgICAgICAgTFZQU0FfUVBEX1Byb2Nlc3NfRmxvYXQocExWUFNBX0luc3QsIHBTY3JhdGNoICsgSW5wdXRCbG9ja1NpemUsIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpKTsKICAgICB9CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgVVBEQVRFIFNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZQogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgICBpZihwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAhPSBwV3JpdGVfU2F2ZSkKLSAgICB7CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyICE9IHBXcml0ZV9TYXZlKSB7CiAgICAgICAgIEF1ZGlvVGltZUluYyA9IG11bHQzMngzMmluMzJfc2hpZnRyKAogICAgICAgICAgICAgICAgIChBdWRpb1RpbWUgKyAoKExWTV9JTlQzMilwTFZQU0FfSW5zdC0+TG9jYWxTYW1wbGVzQ291bnQgKiAxMDAwKSksCiAgICAgICAgICAgICAgICAgKExWTV9JTlQzMilMVlBTQV9TYW1wbGVSYXRlSW52VGFiW3BMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkZzXSwKQEAgLTEzOSw3ICsxMjQsNyBAQAogICAgICAgICBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lID0gQXVkaW9UaW1lICsgQXVkaW9UaW1lSW5jOwogICAgIH0KIAotICAgIHJldHVybihMVlBTQV9PSyk7CisgICAgcmV0dXJuIChMVlBTQV9PSyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNjIsOTkgKzE0Nyw5NSBAQAogLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0dldFNwZWN0cnVtICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfVGltZSAgICAgICAgICAgR2V0U3BlY3RydW1BdWRpb1RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICpwQ3VycmVudFZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgKnBQZWFrVmFsdWVzICAgICAgICAgICApCitMVlBTQV9SRVRVUk4gTFZQU0FfR2V0U3BlY3RydW0ocExWUFNBX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZQU0FfVGltZSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDgqIHBDdXJyZW50VmFsdWVzLCBMVk1fVUlOVDgqIHBQZWFrVmFsdWVzKQogCiB7CisgICAgTFZQU0FfSW5zdGFuY2VQcl90KiBwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKKyAgICBMVk1fSU5UMzIgU3RhdHVzRGVsdGEsIGlpOworICAgIExWTV9VSU5UOCogcFJlYWQ7CiAKLSAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAqcExWUFNBX0luc3QgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgU3RhdHVzRGVsdGEsIGlpOwotICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICpwUmVhZDsKLQotICAgIGlmKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCB8fCBwQ3VycmVudFZhbHVlcyA9PSBMVk1fTlVMTCB8fCBwUGVha1ZhbHVlcyA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7CisgICAgaWYgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCB8fCBwQ3VycmVudFZhbHVlcyA9PSBMVk1fTlVMTCB8fCBwUGVha1ZhbHVlcyA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm4gKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKICAgICB9CiAKICAgICAvKiBGaXJzdCBmaW5kIHRoZSBwbGFjZSB3aGVyZSB0byBsb29rIGluIHRoZSBzdGF0dXMgYnVmZmVyICovCi0gICAgaWYoR2V0U3BlY3RydW1BdWRpb1RpbWUgPD0gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkKLSAgICB7Ci0gICAgICAgIE1VTDMyeDMySU5UTzMyKChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIC0gR2V0U3BlY3RydW1BdWRpb1RpbWUpLExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVJbnYsU3RhdHVzRGVsdGEsTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0KTsKLSAgICAgICAgaWYoKFN0YXR1c0RlbHRhICogTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZSkgIT0gKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSkpCi0gICAgICAgIHsKKyAgICBpZiAoR2V0U3BlY3RydW1BdWRpb1RpbWUgPD0gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkgeworICAgICAgICBNVUwzMngzMklOVE8zMigocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSAtIEdldFNwZWN0cnVtQXVkaW9UaW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZUludiwgU3RhdHVzRGVsdGEsIExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVTaGlmdCk7CisgICAgICAgIGlmICgoU3RhdHVzRGVsdGEgKiBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lKSAhPQorICAgICAgICAgICAgKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSkpIHsKICAgICAgICAgICAgIFN0YXR1c0RlbHRhICs9IDE7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgICAvKiBUaGlzIHBhcnQgaGFuZGxlcyB0aGUgd3JhcCBhcm91bmQgKi8KLSAgICAgICAgTVVMMzJ4MzJJTlRPMzIoKChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIC0gKExWTV9JTlQzMilMVk1fTUlOSU5UXzMyKSArICgoTFZNX0lOVDMyKUxWTV9NQVhJTlRfMzIgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSkpLExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVJbnYsU3RhdHVzRGVsdGEsTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0KQotICAgICAgICBpZigoKExWTV9JTlQzMikoU3RhdHVzRGVsdGEgKiBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lKSkgIT0gKChMVk1fSU5UMzIpKChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIC0gKExWTV9JTlQzMilMVk1fTUlOSU5UXzMyKSArICgoTFZNX0lOVDMyKUxWTV9NQVhJTlRfMzIgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSkpKSkKLSAgICAgICAgeworICAgICAgICBNVUwzMngzMklOVE8zMigKKyAgICAgICAgICAgICAgICAoKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUgLSAoTFZNX0lOVDMyKUxWTV9NSU5JTlRfMzIpICsKKyAgICAgICAgICAgICAgICAgKChMVk1fSU5UMzIpTFZNX01BWElOVF8zMiAtIEdldFNwZWN0cnVtQXVkaW9UaW1lKSksCisgICAgICAgICAgICAgICAgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZUludiwgU3RhdHVzRGVsdGEsCisgICAgICAgICAgICAgICAgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0KSBpZiAoKChMVk1fSU5UMzIpKFN0YXR1c0RlbHRhICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZSkpICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMVk1fSU5UMzIpKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBMVlBTQV9JbnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMilMVk1fTUlOSU5UXzMyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExWTV9JTlQzMilMVk1fTUFYSU5UXzMyIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTcGVjdHJ1bUF1ZGlvVGltZSkpKSkgewogICAgICAgICAgICAgU3RhdHVzRGVsdGEgKz0gMTsKICAgICAgICAgfQogICAgIH0KICAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBkZXNpcmVkIGxldmVsIGlzIG5vdCB0b28gIm9sZCIgKHNlZSAyLjEwIGluIExWUFNBX0Rlc2lnbk5vdGVzLmRvYykqLwotICAgIGlmKAotICAgICAgICAoKEdldFNwZWN0cnVtQXVkaW9UaW1lIDwgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkmJgotICAgICAgICAgKChHZXRTcGVjdHJ1bUF1ZGlvVGltZTwwKSYmKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWU+MCkpJiYKLSAgICAgICAgICgoKExWTV9JTlQzMikoLUdldFNwZWN0cnVtQXVkaW9UaW1lICsgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkpPkxWTV9NQVhJTlRfMzIpKXx8CisgICAgaWYgKCgoR2V0U3BlY3RydW1BdWRpb1RpbWUgPCBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lKSAmJgorICAgICAgICAgKChHZXRTcGVjdHJ1bUF1ZGlvVGltZSA8IDApICYmIChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lID4gMCkpICYmCisgICAgICAgICAoKChMVk1fSU5UMzIpKC1HZXRTcGVjdHJ1bUF1ZGlvVGltZSArIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUpKSA+CisgICAgICAgICAgTFZNX01BWElOVF8zMikpIHx8CiAKLSAgICAgICAgICgoR2V0U3BlY3RydW1BdWRpb1RpbWUgPiBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lKSYmCi0gICAgICAgICAoKChHZXRTcGVjdHJ1bUF1ZGlvVGltZT49MCkmJihwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lPj0wKSl8fAotICAgICAgICAgICgoR2V0U3BlY3RydW1BdWRpb1RpbWU8PTApJiYocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZTw9MCkpfHwKLSAgICAgICAgICgoKEdldFNwZWN0cnVtQXVkaW9UaW1lPj0wKSYmKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWU8PTApKSYmCi0gICAgICAgICAoKChMVk1fSU5UMzIpKEdldFNwZWN0cnVtQXVkaW9UaW1lIC0gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkpPExWTV9NQVhJTlRfMzIpKSkpfHwKKyAgICAgICAgKChHZXRTcGVjdHJ1bUF1ZGlvVGltZSA+IHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUpICYmCisgICAgICAgICAoKChHZXRTcGVjdHJ1bUF1ZGlvVGltZSA+PSAwKSAmJiAocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSA+PSAwKSkgfHwKKyAgICAgICAgICAoKEdldFNwZWN0cnVtQXVkaW9UaW1lIDw9IDApICYmIChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIDw9IDApKSB8fAorICAgICAgICAgICgoKEdldFNwZWN0cnVtQXVkaW9UaW1lID49IDApICYmIChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIDw9IDApKSAmJgorICAgICAgICAgICAoKChMVk1fSU5UMzIpKEdldFNwZWN0cnVtQXVkaW9UaW1lIC0gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkpIDwKKyAgICAgICAgICAgIExWTV9NQVhJTlRfMzIpKSkpIHx8CiAKLSAgICAgICAgKFN0YXR1c0RlbHRhID4gKExWTV9JTlQzMilwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoKSB8fAotICAgICAgICAoIVN0YXR1c0RlbHRhKSkKLSAgICB7Ci0gICAgICAgIGZvcihpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5CYW5kczsgaWkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcEN1cnJlbnRWYWx1ZXNbaWldICA9IDA7Ci0gICAgICAgICAgICBwUGVha1ZhbHVlc1tpaV0gICAgICA9IDA7CisgICAgICAgIChTdGF0dXNEZWx0YSA+IChMVk1fSU5UMzIpcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCkgfHwgKCFTdGF0dXNEZWx0YSkpIHsKKyAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5CYW5kczsgaWkrKykgeworICAgICAgICAgICAgcEN1cnJlbnRWYWx1ZXNbaWldID0gMDsKKyAgICAgICAgICAgIHBQZWFrVmFsdWVzW2lpXSA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuKExWUFNBX09LKTsKKyAgICAgICAgcmV0dXJuIChMVlBTQV9PSyk7CiAgICAgfQogICAgIC8qIFNldCB0aGUgcmVhZGluZyBwb2ludGVyICovCi0gICAgaWYoKExWTV9JTlQzMikoU3RhdHVzRGVsdGEgKiBwTFZQU0FfSW5zdC0+bkJhbmRzKSA+IChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAtIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQpKQotICAgIHsKLSAgICAgICAgcFJlYWQgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciArIChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoIC0gKExWTV9VSU5UMzIpU3RhdHVzRGVsdGEpICogcExWUFNBX0luc3QtPm5CYW5kczsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcFJlYWQgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAgLSBTdGF0dXNEZWx0YSAqIHBMVlBTQV9JbnN0LT5uQmFuZHM7CisgICAgaWYgKChMVk1fSU5UMzIpKFN0YXR1c0RlbHRhICogcExWUFNBX0luc3QtPm5CYW5kcykgPgorICAgICAgICAocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgLSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0KSkgeworICAgICAgICBwUmVhZCA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyICsKKyAgICAgICAgICAgICAgICAocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCAtIChMVk1fVUlOVDMyKVN0YXR1c0RlbHRhKSAqCisgICAgICAgICAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+bkJhbmRzOworICAgIH0gZWxzZSB7CisgICAgICAgIHBSZWFkID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgLSBTdGF0dXNEZWx0YSAqIHBMVlBTQV9JbnN0LT5uQmFuZHM7CiAgICAgfQogCiAgICAgLyogUmVhZCB0aGUgc3RhdHVzIGJ1ZmZlciBhbmQgZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlcnMgKi8KLSAgICBmb3IoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uQmFuZHM7IGlpKyspCi0gICAgeworICAgIGZvciAoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uQmFuZHM7IGlpKyspIHsKICAgICAgICAgcEN1cnJlbnRWYWx1ZXNbaWldID0gcFJlYWRbaWldOwotICAgICAgICBpZihwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3NbaWldIDw9IHBSZWFkW2lpXSkKLSAgICAgICAgeworICAgICAgICBpZiAocExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXSA8PSBwUmVhZFtpaV0pIHsKICAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0gPSBwUmVhZFtpaV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3NbaWldICE9IDApCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIGlmIChwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3NbaWldICE9IDApIHsKICAgICAgICAgICAgIExWTV9JTlQzMiB0ZW1wOwogICAgICAgICAgICAgLypSZS1jb21wdXRlIG1heCB2YWx1ZXMgZm9yIGRlY2F5ICovCiAgICAgICAgICAgICB0ZW1wID0gKExWTV9JTlQzMikoTFZQU0FfTUFYVU5TSUdORURDSEFSIC0gcExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXSk7Ci0gICAgICAgICAgICB0ZW1wID0gKCh0ZW1wICogTFZQU0FfTUFYTEVWRUxERUNBWUZBQ1RPUik+PkxWUFNBX01BWExFVkVMREVDQVlTSElGVCk7CisgICAgICAgICAgICB0ZW1wID0gKCh0ZW1wICogTFZQU0FfTUFYTEVWRUxERUNBWUZBQ1RPUikgPj4gTFZQU0FfTUFYTEVWRUxERUNBWVNISUZUKTsKICAgICAgICAgICAgIC8qIElmIHRoZSBnYWluIGhhcyBubyBlZmZlY3QsICJoZWxwIiB0aGUgdmFsdWUgdG8gaW5jcmVhc2UgKi8KLSAgICAgICAgICAgIGlmKHRlbXAgPT0gKExWUFNBX01BWFVOU0lHTkVEQ0hBUiAtIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0pKQotICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKHRlbXAgPT0gKExWUFNBX01BWFVOU0lHTkVEQ0hBUiAtIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0pKSB7CiAgICAgICAgICAgICAgICAgdGVtcCArPSAxOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyogU2F0dXJhdGUgKi8KICAgICAgICAgICAgIHRlbXAgPSAodGVtcCA+IExWUFNBX01BWFVOU0lHTkVEQ0hBUikgPyBMVlBTQV9NQVhVTlNJR05FRENIQVIgOiB0ZW1wOwogICAgICAgICAgICAgLyogU3RvcmUgbmV3IG1heCBsZXZlbCAqLwotICAgICAgICAgICAgcExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXSA9ICAoTFZNX1VJTlQ4KShMVlBTQV9NQVhVTlNJR05FRENIQVIgLSB0ZW1wKTsKKyAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0gPSAoTFZNX1VJTlQ4KShMVlBTQV9NQVhVTlNJR05FRENIQVIgLSB0ZW1wKTsKICAgICAgICAgfQogCiAgICAgICAgIHBQZWFrVmFsdWVzW2lpXSA9IHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV07CiAgICAgfQogCi0gICAgcmV0dXJuKExWUFNBX09LKTsKKyAgICByZXR1cm4gKExWUFNBX09LKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUEQuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUEQuaAppbmRleCA2MDlhNDg1Li4yZjc1MmJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBELmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRC5oCkBAIC0yMCw0MSArMjAsMzUgQEAKIAogI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgogCi10eXBlZGVmIHN0cnVjdAotewotICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEZWxheTsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2Vmc1syXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfVFQRF9TdGF0ZV90LCAqcFFQRF9TdGF0ZV90OwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9JTlQzMiogcERlbGF5OyAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fSU5UMzIgQ29lZnNbMl07IC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK30gUVBEX1N0YXRlX3QsICpwUVBEX1N0YXRlX3Q7CiAKLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEZWxheTsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29lZnNbMl07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1RUERfRkxPQVRfU3RhdGVfdCwgKnBRUERfRkxPQVRfU3RhdGVfdDsKKyAgICBMVk1fRkxPQVQqIHBEZWxheTsKKyAgICBMVk1fRkxPQVQgQ29lZnNbMl07IC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK30gUVBEX0ZMT0FUX1N0YXRlX3QsICpwUVBEX0ZMT0FUX1N0YXRlX3Q7CiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0lOVDMyIEtQOyAgICAvKnNob3VsZCBzdG9yZSBhMCovCi0gICAgTFZNX0lOVDMyIEtNOyAgICAvKnNob3VsZCBzdG9yZSBiMiovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0lOVDMyIEtQOyAvKnNob3VsZCBzdG9yZSBhMCovCisgICAgTFZNX0lOVDMyIEtNOyAvKnNob3VsZCBzdG9yZSBiMiovCiAKIH0gUVBEX0MzMl9Db2VmcywgKlBRUERfQzMyX0NvZWZzOwogCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9GTE9BVCBLUDsgICAgLypzaG91bGQgc3RvcmUgYTAqLwotICAgIExWTV9GTE9BVCBLTTsgICAgLypzaG91bGQgc3RvcmUgYjIqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9GTE9BVCBLUDsgLypzaG91bGQgc3RvcmUgYTAqLworICAgIExWTV9GTE9BVCBLTTsgLypzaG91bGQgc3RvcmUgYjIqLwogCiB9IFFQRF9GTE9BVF9Db2VmcywgKlBRUERfRkxPQVRfQ29lZnM7CiAKLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgTFZNX0lOVDMyIFN0b3JhZ2VbMV07CiAKIH0gUVBEX1RhcHNfdCwgKnBRUERfVGFwc190OwogCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAgIExWTV9GTE9BVCBTdG9yYWdlWzFdOwogCiB9IFFQRF9GTE9BVF9UYXBzX3QsICpwUVBEX0ZMT0FUX1RhcHNfdDsKQEAgLTcyLDE1ICs2NiwxMSBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVlBTQV9RUERfUHJvY2VzcyAoICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAqcEluU2FtcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFuZEluZGV4KTsKK3ZvaWQgTFZQU0FfUVBEX1Byb2Nlc3Modm9pZCogaEluc3RhbmNlLCBMVk1fSU5UMTYqIHBJblNhbXBzLCBMVk1fSU5UMTYgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IEJhbmRJbmRleCk7CiAKLXZvaWQgTFZQU0FfUVBEX1Byb2Nlc3NfRmxvYXQgKCAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJblNhbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCk7Cit2b2lkIExWUFNBX1FQRF9Qcm9jZXNzX0Zsb2F0KHZvaWQqIGhJbnN0YW5jZSwgTFZNX0ZMT0FUKiBwSW5TYW1wcywgTFZNX0lOVDE2IG51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBCYW5kSW5kZXgpOwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9RUERfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtOTYsMTMgKzg2LDkgQEAKIC8qIFJFVFVSTlM6ICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZQU0FfUVBEX0luaXQgKCAgIFFQRF9TdGF0ZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBRUERfVGFwc190ICAgICAgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBRUERfQzMyX0NvZWZzICAgICAqcENvZWYgICAgICk7Cit2b2lkIExWUFNBX1FQRF9Jbml0KFFQRF9TdGF0ZV90KiBwSW5zdGFuY2UsIFFQRF9UYXBzX3QqIHBUYXBzLCBRUERfQzMyX0NvZWZzKiBwQ29lZik7CiAKLXZvaWQgTFZQU0FfUVBEX0luaXRfRmxvYXQgKCAgIFFQRF9GTE9BVF9TdGF0ZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUERfRkxPQVRfVGFwc190ICAgICAgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUERfRkxPQVRfQ29lZnMgICAgICAgICAqcENvZWYgICAgICk7Cit2b2lkIExWUFNBX1FQRF9Jbml0X0Zsb2F0KFFQRF9GTE9BVF9TdGF0ZV90KiBwSW5zdGFuY2UsIFFQRF9GTE9BVF9UYXBzX3QqIHBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRUERfRkxPQVRfQ29lZnMqIHBDb2VmKTsKIAogI2VuZGlmCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX0luaXQuY3BwCmluZGV4IDJkYmY2OTQuLmM1MDIzYzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Jbml0LmNwcApAQCAtMzIsMjAgKzMyLDE1IEBACiAvKiBSRVRVUk5TOiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWUFNBX1FQRF9Jbml0ICggICBwUVBEX1N0YXRlX3QgICAgICAgcFFQRF9TdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9UYXBzX3QgICAgICAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9DMzJfQ29lZnMgICAgICpwQ29lZiAgICAgKQotewotICAgIHBRUERfU3RhdGUtPnBEZWxheSAgPSBwVGFwcy0+U3RvcmFnZTsKLSAgICBwUVBEX1N0YXRlLT5Db2Vmc1swXSAgPSBwQ29lZi0+S1A7Ci0gICAgcFFQRF9TdGF0ZS0+Q29lZnNbMV0gID0gcENvZWYtPktNOwordm9pZCBMVlBTQV9RUERfSW5pdChwUVBEX1N0YXRlX3QgcFFQRF9TdGF0ZSwgUVBEX1RhcHNfdCogcFRhcHMsIFFQRF9DMzJfQ29lZnMqIHBDb2VmKSB7CisgICAgcFFQRF9TdGF0ZS0+cERlbGF5ID0gcFRhcHMtPlN0b3JhZ2U7CisgICAgcFFQRF9TdGF0ZS0+Q29lZnNbMF0gPSBwQ29lZi0+S1A7CisgICAgcFFQRF9TdGF0ZS0+Q29lZnNbMV0gPSBwQ29lZi0+S007CiB9CiAKLXZvaWQgTFZQU0FfUVBEX0luaXRfRmxvYXQgKCAgIHBRUERfRkxPQVRfU3RhdGVfdCAgICAgICBwUVBEX1N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVBEX0ZMT0FUX1RhcHNfdCAgICAgICAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9GTE9BVF9Db2VmcyAgICAgICAgICAqcENvZWYgICAgICkKLXsKLSAgICBwUVBEX1N0YXRlLT5wRGVsYXkgID0gcFRhcHMtPlN0b3JhZ2U7Ci0gICAgcFFQRF9TdGF0ZS0+Q29lZnNbMF0gID0gKChMVk1fRkxPQVQpcENvZWYtPktQKTsKLSAgICBwUVBEX1N0YXRlLT5Db2Vmc1sxXSAgPSAoKExWTV9GTE9BVClwQ29lZi0+S00pOwordm9pZCBMVlBTQV9RUERfSW5pdF9GbG9hdChwUVBEX0ZMT0FUX1N0YXRlX3QgcFFQRF9TdGF0ZSwgUVBEX0ZMT0FUX1RhcHNfdCogcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9GTE9BVF9Db2VmcyogcENvZWYpIHsKKyAgICBwUVBEX1N0YXRlLT5wRGVsYXkgPSBwVGFwcy0+U3RvcmFnZTsKKyAgICBwUVBEX1N0YXRlLT5Db2Vmc1swXSA9ICgoTFZNX0ZMT0FUKXBDb2VmLT5LUCk7CisgICAgcFFQRF9TdGF0ZS0+Q29lZnNbMV0gPSAoKExWTV9GTE9BVClwQ29lZi0+S00pOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Qcm9jZXNzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jcHAKaW5kZXggODgwNTQyMC4uZTMwMWNmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Qcm9jZXNzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX1Byb2Nlc3MuY3BwCkBAIC0zNCwxNSArMzQsMTEgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZQU0FfUVBEX1dyaXRlUGVhayggICBwTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgIHBMVlBTQV9JbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICAgKipwcFdyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgQmFuZEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgVmFsdWUgICApOwordm9pZCBMVlBTQV9RUERfV3JpdGVQZWFrKHBMVlBTQV9JbnN0YW5jZVByX3QgcExWUFNBX0luc3QsIExWTV9VSU5UOCoqIHBwV3JpdGUsIExWTV9JTlQxNiBCYW5kSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IFZhbHVlKTsKIAotdm9pZCBMVlBTQV9RUERfV3JpdGVQZWFrX0Zsb2F0KCAgIHBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgcExWUFNBX0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICoqcHBXcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBCYW5kSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgVmFsdWUgICApOwordm9pZCBMVlBTQV9RUERfV3JpdGVQZWFrX0Zsb2F0KHBMVlBTQV9JbnN0YW5jZVByX3QgcExWUFNBX0luc3QsIExWTV9VSU5UOCoqIHBwV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IEJhbmRJbmRleCwgTFZNX0ZMT0FUIFZhbHVlKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU2LDM4ICs1MiwzNCBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVlBTQV9RUERfUHJvY2Vzc19GbG9hdCAoICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAqcEluU2FtcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFuZEluZGV4KQotewotCit2b2lkIExWUFNBX1FQRF9Qcm9jZXNzX0Zsb2F0KHZvaWQqIGhJbnN0YW5jZSwgTFZNX0ZMT0FUKiBwSW5TYW1wcywgTFZNX0lOVDE2IG51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBCYW5kSW5kZXgpIHsKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgUEFSQU1FVEVSUwogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcExWUFNBX0luc3QgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7Ci0gICAgUVBEX0ZMT0FUX1N0YXRlX3QgKnBRUERTdGF0ZSA9ICAoUVBEX0ZMT0FUX1N0YXRlX3QqKSZwTFZQU0FfSW5zdC0+cFFQRF9TdGF0ZXNbQmFuZEluZGV4XTsKKyAgICBMVlBTQV9JbnN0YW5jZVByX3QqIHBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOworICAgIFFQRF9GTE9BVF9TdGF0ZV90KiBwUVBEU3RhdGUgPSAoUVBEX0ZMT0FUX1N0YXRlX3QqKSZwTFZQU0FfSW5zdC0+cFFQRF9TdGF0ZXNbQmFuZEluZGV4XTsKIAogICAgIC8qIFBvaW50ZXIgdG8gdGFwcyAqLwotICAgIExWTV9GTE9BVCogcERlbGF5ICA9IHBRUERTdGF0ZS0+cERlbGF5OworICAgIExWTV9GTE9BVCogcERlbGF5ID0gcFFQRFN0YXRlLT5wRGVsYXk7CiAKICAgICAvKiBQYXJhbWV0ZXJzIG5lZWRlZCBkdXJpbmcgcXVhc2kgcGVhayBjYWxjdWxhdGlvbnMgKi8KLSAgICBMVk1fRkxPQVQgICBYMDsKLSAgICBMVk1fRkxPQVQgICB0ZW1wLHRlbXAyOwotICAgIExWTV9GTE9BVCAgIGFjY3U7Ci0gICAgTFZNX0ZMT0FUICAgWGcwOwotICAgIExWTV9GTE9BVCAgIEQwOwotICAgIExWTV9GTE9BVCAgIFYwID0gKExWTV9GTE9BVCkoKnBEZWxheSk7CisgICAgTFZNX0ZMT0FUIFgwOworICAgIExWTV9GTE9BVCB0ZW1wLCB0ZW1wMjsKKyAgICBMVk1fRkxPQVQgYWNjdTsKKyAgICBMVk1fRkxPQVQgWGcwOworICAgIExWTV9GTE9BVCBEMDsKKyAgICBMVk1fRkxPQVQgVjAgPSAoTFZNX0ZMT0FUKSgqcERlbGF5KTsKIAogICAgIC8qIEZpbHRlcidzIGNvZWYgKi8KLSAgICBMVk1fRkxPQVQgICBLcCA9ICgoTFZNX0ZMT0FUKShwUVBEU3RhdGUtPkNvZWZzWzBdKSk7Ci0gICAgTFZNX0ZMT0FUICAgS20gPSAoKExWTV9GTE9BVCkocFFQRFN0YXRlLT5Db2Vmc1sxXSkpOworICAgIExWTV9GTE9BVCBLcCA9ICgoTFZNX0ZMT0FUKShwUVBEU3RhdGUtPkNvZWZzWzBdKSk7CisgICAgTFZNX0ZMT0FUIEttID0gKChMVk1fRkxPQVQpKHBRUERTdGF0ZS0+Q29lZnNbMV0pKTsKIAotICAgIExWTV9JTlQxNiAgIGlpID0gbnVtU2FtcGxlczsKKyAgICBMVk1fSU5UMTYgaWkgPSBudW1TYW1wbGVzOwogCi0gICAgTFZNX1VJTlQ4ICAqcFdyaXRlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXI7Ci0gICAgTFZNX0lOVDMyICAgQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50ID0gcExWUFNBX0luc3QtPkJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudDsKLSAgICBMVk1fVUlOVDE2ICBEb3duU2FtcGxpbmdGYWN0b3IgPSBwTFZQU0FfSW5zdC0+RG93blNhbXBsaW5nRmFjdG9yOworICAgIExWTV9VSU5UOCogcFdyaXRlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXI7CisgICAgTFZNX0lOVDMyIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCA9IHBMVlBTQV9JbnN0LT5CdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQ7CisgICAgTFZNX1VJTlQxNiBEb3duU2FtcGxpbmdGYWN0b3IgPSBwTFZQU0FfSW5zdC0+RG93blNhbXBsaW5nRmFjdG9yOwogCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIElOSVRJQUxJWkFUSU9OCkBAIC05NywyOSArODksMjcgQEAKICAgICAvKiBDb3JyZWN0IGFsc28gdGhlIG51bWJlciBvZiBzYW1wbGVzICovCiAgICAgaWkgPSAoTFZNX0lOVDE2KShpaSAtIChMVk1fSU5UMTYpcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0NvdW50KTsKIAotICAgIHdoaWxlIChpaSA+IDApCi0gICAgeworICAgIHdoaWxlIChpaSA+IDApIHsKICAgICAgICAgLyogQXBwbHkgcG9zdCBnYWluICovCiAgICAgICAgIC8qIC0gMSB0byBjb21wZW5zYXRlIHNjYWxpbmcgaW4gcHJvY2VzcyBmdW5jdGlvbiovCiAgICAgICAgIFgwID0gKCpwSW5TYW1wcykgKiBwTFZQU0FfSW5zdC0+cFBvc3RHYWluc1tCYW5kSW5kZXhdOwogICAgICAgICBwSW5TYW1wcyA9IHBJblNhbXBzICsgRG93blNhbXBsaW5nRmFjdG9yOwogCiAgICAgICAgIC8qIFNhdHVyYXRlIGFuZCB0YWtlIGFic29sdXRlIHZhbHVlICovCi0gICAgICAgIGlmKFgwIDwgMC4wZikKLSAgICAgICAgICAgIFgwID0gLVgwOworICAgICAgICBpZiAoWDAgPCAwLjBmKSBYMCA9IC1YMDsKICAgICAgICAgaWYgKFgwID4gMS4wZikKICAgICAgICAgICAgIFhnMCA9IDEuMGY7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIFhnMCA9WDA7CisgICAgICAgICAgICBYZzAgPSBYMDsKIAogICAgICAgICAvKiBRdWFzaSBwZWFrIGZpbHRlciBjYWxjdWxhdGlvbiAqLwotICAgICAgICBEMCAgPSBYZzAgLSBWMDsKKyAgICAgICAgRDAgPSBYZzAgLSBWMDsKIAogICAgICAgICB0ZW1wMiA9IEQwOwogCiAgICAgICAgIGFjY3UgPSB0ZW1wMiAqIEtwOwotICAgICAgICBEMCAgICA9IEQwIC8gMi4wZjsKLSAgICAgICAgaWYgKEQwIDwgMC4wZil7CisgICAgICAgIEQwID0gRDAgLyAyLjBmOworICAgICAgICBpZiAoRDAgPCAwLjBmKSB7CiAgICAgICAgICAgICBEMCA9IC1EMDsKICAgICAgICAgfQogCkBAIC0xMzAsMTcgKzEyMCwxMyBAQAogCiAgICAgICAgIGlmIChhY2N1ID4gMS4wZikKICAgICAgICAgICAgIGFjY3UgPSAxLjBmOwotICAgICAgICBlbHNlIGlmKGFjY3UgPCAwLjBmKQorICAgICAgICBlbHNlIGlmIChhY2N1IDwgMC4wZikKICAgICAgICAgICAgIGFjY3UgPSAwLjBmOwogCiAgICAgICAgIFYwID0gYWNjdTsKIAotICAgICAgICBpZigoKHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSAtIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCkgPCBEb3duU2FtcGxpbmdGYWN0b3IpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMVlBTQV9RUERfV3JpdGVQZWFrX0Zsb2F0KCBwTFZQU0FfSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYW5kSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMCk7CisgICAgICAgIGlmICgoKHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSAtIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCkgPCBEb3duU2FtcGxpbmdGYWN0b3IpKSB7CisgICAgICAgICAgICBMVlBTQV9RUERfV3JpdGVQZWFrX0Zsb2F0KHBMVlBTQV9JbnN0LCAmcFdyaXRlLCBCYW5kSW5kZXgsIFYwKTsKIAogICAgICAgICAgICAgQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50IC09IHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZTsKICAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5Mb2NhbFNhbXBsZXNDb3VudCA9IChMVk1fVUlOVDE2KShudW1TYW1wbGVzIC0gaWkpOwpAQCAtMTQ4LDcgKzEzNCw2IEBACiAgICAgICAgIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCArPSBEb3duU2FtcGxpbmdGYWN0b3I7CiAKICAgICAgICAgaWkgPSAoTFZNX0lOVDE2KShpaSAtIERvd25TYW1wbGluZ0ZhY3Rvcik7Ci0KICAgICB9CiAKICAgICAvKiBTdG9yZSBsYXN0IHRhcHMgaW4gbWVtb3J5ICovCkBAIC0xNTYsMjAgKzE0MSwxNSBAQAogCiAgICAgLyogSWYgdGhpcyBpcyB0aGUgbGFzdCBjYWxsIHRvIHRoZSBmdW5jdGlvbiBhZnRlciBsYXN0IGJhbmQgcHJvY2Vzc2luZywKICAgICAgICB1cGRhdGUgdGhlIHBhcmFtZXRlcnMuICovCi0gICAgaWYoQmFuZEluZGV4ID09IChwTFZQU0FfSW5zdC0+blJlbGV2YW50RmlsdGVycyAtIDEpKQotICAgIHsKKyAgICBpZiAoQmFuZEluZGV4ID09IChwTFZQU0FfSW5zdC0+blJlbGV2YW50RmlsdGVycyAtIDEpKSB7CiAgICAgICAgIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyID0gcFdyaXRlOwogICAgICAgICAvKiBBZGp1c3RtZW50IGZvciAxMTAyNUh6IGlucHV0LCAyMjAsNSBpcyBub3JtYWxseQogICAgICAgICAgICB0aGUgZXhhY3QgbnVtYmVyIG9mIHNhbXBsZXMgZm9yIDIwbXMuKi8KLSAgICAgICAgaWYoKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyICE9IHBXcml0ZSkmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5GcyA9PSBMVk1fRlNfMTEwMjUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgPT0gMjIwKQotICAgICAgICAgICAgeworICAgICAgICBpZiAoKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyICE9IHBXcml0ZSkgJiYKKyAgICAgICAgICAgIChwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5GcyA9PSBMVk1fRlNfMTEwMjUpKSB7CisgICAgICAgICAgICBpZiAocExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID09IDIyMCkgewogICAgICAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSA9IDIyMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID0gMjIwOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xOTQsMzcgKzE3NCwyOSBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVlBTQV9RUERfV3JpdGVQZWFrKCAgIHBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgcExWUFNBX0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICoqcHBXcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBCYW5kSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVmFsdWUgICApCi17Ci0gICAgTFZNX1VJTlQ4ICpwV3JpdGUgPSAqcHBXcml0ZTsKK3ZvaWQgTFZQU0FfUVBEX1dyaXRlUGVhayhwTFZQU0FfSW5zdGFuY2VQcl90IHBMVlBTQV9JbnN0LCBMVk1fVUlOVDgqKiBwcFdyaXRlLCBMVk1fSU5UMTYgQmFuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBWYWx1ZSkgeworICAgIExWTV9VSU5UOCogcFdyaXRlID0gKnBwV3JpdGU7CiAKICAgICAvKiBXcml0ZSB0aGUgdmFsdWUgYW5kIHVwZGF0ZSB0aGUgd3JpdGUgcG9pbnRlciAqLwotICAgICoocFdyaXRlICsgQmFuZEluZGV4KSA9IChMVk1fVUlOVDgpKFZhbHVlPj43KTsKKyAgICAqKHBXcml0ZSArIEJhbmRJbmRleCkgPSAoTFZNX1VJTlQ4KShWYWx1ZSA+PiA3KTsKICAgICBwV3JpdGUgKz0gcExWUFNBX0luc3QtPm5CYW5kczsKLSAgICBpZiAocFdyaXRlID09IChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ICsgcExWUFNBX0luc3QtPm5CYW5kcyAqIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGgpKQotICAgIHsKKyAgICBpZiAocFdyaXRlID09IChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+bkJhbmRzICogcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCkpIHsKICAgICAgICAgcFdyaXRlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydDsKICAgICB9CiAKICAgICAqcHBXcml0ZSA9IHBXcml0ZTsKLQogfQotdm9pZCBMVlBTQV9RUERfV3JpdGVQZWFrX0Zsb2F0KCAgIHBMVlBTQV9JbnN0YW5jZVByX3QgICAgIHBMVlBTQV9JbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICoqcHBXcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBCYW5kSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgVmFsdWUgICApCi17Ci0gICAgTFZNX1VJTlQ4ICpwV3JpdGUgPSAqcHBXcml0ZTsKK3ZvaWQgTFZQU0FfUVBEX1dyaXRlUGVha19GbG9hdChwTFZQU0FfSW5zdGFuY2VQcl90IHBMVlBTQV9JbnN0LCBMVk1fVUlOVDgqKiBwcFdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBCYW5kSW5kZXgsIExWTV9GTE9BVCBWYWx1ZSkgeworICAgIExWTV9VSU5UOCogcFdyaXRlID0gKnBwV3JpdGU7CiAKICAgICAvKiBXcml0ZSB0aGUgdmFsdWUgYW5kIHVwZGF0ZSB0aGUgd3JpdGUgcG9pbnRlciAqLwogICAgICoocFdyaXRlICsgQmFuZEluZGV4KSA9IChMVk1fVUlOVDgpKFZhbHVlICogMjU2KTsKICAgICBwV3JpdGUgKz0gcExWUFNBX0luc3QtPm5CYW5kczsKLSAgICBpZiAocFdyaXRlID09IChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ICsgcExWUFNBX0luc3QtPm5CYW5kcyAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGgpKQotICAgIHsKKyAgICBpZiAocFdyaXRlID09IChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+bkJhbmRzICogcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCkpIHsKICAgICAgICAgcFdyaXRlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jcHAKaW5kZXggOWYwYWEwMi4uNGZiZmY2ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jcHAKQEAgLTM0LDE5ICszNCw5IEBACiAgKiBTYW1wbGUgcmF0ZSB0YWJsZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIHRoZSBlbnVtZXJhdGVkIHR5cGUgYW5kIHRoZSBhY3R1YWwKICAqIGZyZXF1ZW5jeQogICovCi1jb25zdCBMVk1fVUlOVDMyICAgIExWUFNBX1NhbXBsZVJhdGVUYWJbXSA9IHsgICA4MDAwLCAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjA1MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc2NDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTIwMDB9OyAgICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgKi8KK2NvbnN0IExWTV9VSU5UMzIgTFZQU0FfU2FtcGxlUmF0ZVRhYltdID0gezgwMDAsIC8qIDhrUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwgNDgwMDAsIDg4MjAwLCA5NjAwMCwgMTc2NDAwLCAxOTIwMDB9OyAvKiAxOTJrUy9zICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTgsMjAgKzQ4LDExIEBACiAgKiBTYW1wbGUgcmF0ZSB0YWJsZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIHRoZSBlbnVtZXJhdGVkIHR5cGUgYW5kIHRoZSBhY3R1YWwKICAqIGZyZXF1ZW5jeQogICovCi1jb25zdCBMVk1fVUlOVDMyICAgIExWUFNBX1NhbXBsZVJhdGVJbnZUYWJbXSA9IHsgICAgMjY4NDM1LCAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTk0NzgzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3ODk1NywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzQyMTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTczOTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODk0NzgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjcxMDksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDg2OTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQ3MzkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMjQzNDgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMjIzNjkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTIxNzQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTExODUgICAgICAgICAgICAgICAgICAvKiAxOTJrUy9zICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Citjb25zdCBMVk1fVUlOVDMyIExWUFNBX1NhbXBsZVJhdGVJbnZUYWJbXSA9IHsKKyAgICAgICAgMjY4NDM1LCAvKiA4a1MvcyAgKi8KKyAgICAgICAgMTk0NzgzLCAxNzg5NTcsIDEzNDIxOCwgOTczOTEsIDg5NDc4LCA2NzEwOSwKKyAgICAgICAgNDg2OTYsICA0NDczOSwgIDI0MzQ4LCAgMjIzNjksIDEyMTc0LCAxMTE4NSAvKiAxOTJrUy9zICovCit9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTgzLDIwICs2NCwxMCBAQAogICogVGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMKICAqIGR1cmluZyAyMG1zCiAgKi8KLWNvbnN0IExWTV9VSU5UMTYgICAgTFZQU0FfblNhbXBsZXNCdWZmZXJVcGRhdGVbXSAgPSB7ICAgMTYwLCAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDE3NjQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDE5MjAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDM1MjgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDM4NDAgICAgICAgICAgICAgICAgICAvKiAxOTJrUy9zICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK2NvbnN0IExWTV9VSU5UMTYgTFZQU0FfblNhbXBsZXNCdWZmZXJVcGRhdGVbXSA9IHsKKyAgICAgICAgMTYwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCisgICAgICAgIDIyMCwgMjQwLCAzMjAsIDQ0MSwgNDgwLCA2NDAsIDg4MiwgOTYwLCAxNzY0LCAxOTIwLCAzNTI4LCAzODQwIC8qIDE5MmtTL3MgKi8KK307CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEb3duIHNhbXBsaW5nIGZhY3RvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMDYsMjAgKzc3LDI1IEBACiAvKgogICogVGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgZG93biBzYW1wbGluZyBmYWN0b3IKICAqLwotY29uc3QgTFZNX1VJTlQxNiAgICBMVlBTQV9Eb3duU2FtcGxpbmdGYWN0b3JbXSAgPSB7ICAgICA1LCAgICAgICAgICAgICAgICAgICAgLyogODAwMCAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LCAgICAgICAgICAgICAgICAgICAgLyogMTEwMjUgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgLyogMTIwMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgLyogMTYwMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgICAgICAgICAgICAgICAgICAgLyogMjIwNTAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgICAgICAgICAgICAgICAgICAgLyogMjQwMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMSwgICAgICAgICAgICAgICAgICAgLyogMzIwMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwgICAgICAgICAgICAgICAgICAgLyogNDQxMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgLyogNDgwMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICw2MCAgICAgICAgICAgICAgICAgICAvKiA4ODIwMCBTL3MgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDY0ICAgICAgICAgICAgICAgICAgIC8qIDk2MDAwIFMvcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTIwICAgICAgICAgICAgICAgICAgLyogMTc2NDAwIFMvcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTI4ICAgICAgICAgICAgICAgICAgLyoxOTIwMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworY29uc3QgTFZNX1VJTlQxNiBMVlBTQV9Eb3duU2FtcGxpbmdGYWN0b3JbXSA9IHsKKyAgICAgICAgNSwgIC8qIDgwMDAgIFMvcyAgKi8KKyAgICAgICAgNywgIC8qIDExMDI1IFMvcyAgKi8KKyAgICAgICAgOCwgIC8qIDEyMDAwIFMvcyAgKi8KKyAgICAgICAgMTAsIC8qIDE2MDAwIFMvcyAgKi8KKyAgICAgICAgMTUsIC8qIDIyMDUwIFMvcyAgKi8KKyAgICAgICAgMTYsIC8qIDI0MDAwIFMvcyAgKi8KKyAgICAgICAgMjEsIC8qIDMyMDAwIFMvcyAgKi8KKyAgICAgICAgMzAsIC8qIDQ0MTAwIFMvcyAgKi8KKyAgICAgICAgMzIgIC8qIDQ4MDAwIFMvcyAgKi8KKyAgICAgICAgLAorICAgICAgICA2MCAvKiA4ODIwMCBTL3MgICovCisgICAgICAgICwKKyAgICAgICAgNjQgLyogOTYwMDAgUy9zICAqLworICAgICAgICAsCisgICAgICAgIDEyMCAvKiAxNzY0MDAgUy9zICAqLworICAgICAgICAsCisgICAgICAgIDEyOCAvKjE5MjAwMCBTL3MgICovCit9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEzMCwxMDIgKzEwNiwzNCBAQAogLyoKICAqIFRhYmxlIGZvciAyICogUGkgLyBGcwogICovCi1jb25zdCBMVk1fSU5UMTYgICAgIExWUFNBX1R3b1BpT25Gc1RhYmxlW10gPSB7ICAyNjM1NCwgICAgICAvKiA4a1MvcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkxMjMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzU2OSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMTc3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk1NjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc4NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTg4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3ODEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM5MgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDIzOTAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyMTk2Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTE5NQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEwOTggICAgLyogMTkya1MvcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK2NvbnN0IExWTV9JTlQxNiBMVlBTQV9Ud29QaU9uRnNUYWJsZVtdID0geworICAgICAgICAyNjM1NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICovCisgICAgICAgIDE5MTIzLCAxNzU2OSwgMTMxNzcsIDk1NjEsIDg3ODUsIDY1ODgsIDQ3ODEsIDQzOTIsIDIzOTAsIDIxOTYsIDExOTUsIDEwOTggLyogMTkya1MvcyAqLworfTsKIAotY29uc3QgTFZNX0ZMT0FUICAgICBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtdID0geyAgMC44MDQyODQ3ZiwgICAgICAvKiA4a1MvcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41ODM2MDU0ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTM2MTc5NmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQwMjE0MjNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yOTE3ODc0ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY4MTA1MWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjIwMTA1NTlmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNDU5MDg5ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTM0MDM3MmYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDcyOTQ3NmYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDY3MDE4NmYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDM2NDczOGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDMzNTA5M2YgICAgLyogMTkya1MvcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK2NvbnN0IExWTV9GTE9BVCBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtdID0geworICAgICAgICAwLjgwNDI4NDdmLCAvKiA4a1MvcyAqLworICAgICAgICAwLjU4MzYwNTRmLCAwLjUzNjE3OTZmLCAwLjQwMjE0MjNmLCAwLjI5MTc4NzRmLCAwLjI2ODEwNTFmLCAwLjIwMTA1NTlmLAorICAgICAgICAwLjE0NTkwODlmLCAwLjEzNDAzNzJmLCAwLjA3Mjk0NzZmLCAwLjA2NzAxODZmLCAwLjAzNjQ3MzhmLCAwLjAzMzUwOTNmIC8qIDE5MmtTL3MgKi8KK307CiAKIC8qCiAgKiBHYWluIHRhYmxlCiAgKi8KLWNvbnN0IExWTV9JTlQxNiAgICAgTFZQU0FfR2FpblRhYmxlW10gPSB7ICAgMzY0LCAgICAgICAgICAvKiAtMTVkQiBnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDU4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3NywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQ3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgxNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTE0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjkyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjI2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODI1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4LCAgICAgICAgIC8qIDBkQiBnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyOTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NzgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4OTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2NDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1ODQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxNDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3NzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0NzYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyNjYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgxNTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkxNDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjY0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTU3Nn07ICAgICAgICAvKiArMTVkQiBnYWluICovCitjb25zdCBMVk1fSU5UMTYgTFZQU0FfR2FpblRhYmxlW10gPSB7MzY0LCAvKiAtMTVkQiBnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA4LCAgNDU4LCAgNTE0LCAgNTc3LCAgNjQ3LCAgNzI2LCAgIDgxNSwgIDkxNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI2LCAxMTUxLCAxMjkyLCAxNDQ5LCAxNjI2LCAxODI1LCAgMjA0OCwgLyogMGRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjk3LCAyNTc4LCAyODkyLCAzMjQ1LCAzNjQxLCA0MDk2LCAgNDU4NCwgNTE0NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzcyLCA2NDc2LCA3MjY2LCA4MTUzLCA5MTQ4LCAxMDI2NCwgMTE1NzZ9OyAvKiArMTVkQiBnYWluICovCiAKLWNvbnN0IExWTV9GTE9BVCAgTFZQU0FfRmxvYXRfR2FpblRhYmxlW109eyAgMC4xNzc3MzQzNzVmLCAgICAgICAgICAvKiAtMTVkQiBnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTk5MjE4NzUwZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjM2MzI4MTJmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDk3NjU2MmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjgxNzM4MjgxZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMTU5MTc5NjhmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM1NDQ5MjE4N2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzk3OTQ5MjE4ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40NDYyODkwNjJmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUwMDk3NjU2MmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTYyMDExNzE4ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC42MzA4NTkzNzVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcwNzUxOTUzMWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzkzOTQ1MzEyZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC44OTExMTMyODFmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAwMDAwMDAwMGYsICAgICAgICAgLyogMGRCIGdhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMjE1ODIwMzFmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI1ODc4OTA2MmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDEyMTA5Mzc1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41ODQ0NzI2NTZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc3NzgzMjAzMWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDAwMDAwMDAwZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4yMzgyODEyNTBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjUxMTcxODc1MGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuODE4MzU5Mzc1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4xNjIxMDkzNzVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjU0Nzg1MTU2MmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuOTgwOTU3MDMxZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC40NjY3OTY4NzVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjAxMTcxODc1MGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuNjUyMzQzNzUwZn07ICAgICAgICAvKiArMTVkQiBnYWluICovCitjb25zdCBMVk1fRkxPQVQgTFZQU0FfRmxvYXRfR2FpblRhYmxlW10gPSB7CisgICAgICAgIDAuMTc3NzM0Mzc1ZiwgLyogLTE1ZEIgZ2FpbiAqLworICAgICAgICAwLjE5OTIxODc1MGYsIDAuMjIzNjMyODEyZiwgMC4yNTA5NzY1NjJmLCAwLjI4MTczODI4MWYsIDAuMzE1OTE3OTY4ZiwKKyAgICAgICAgMC4zNTQ0OTIxODdmLCAwLjM5Nzk0OTIxOGYsIDAuNDQ2Mjg5MDYyZiwgMC41MDA5NzY1NjJmLCAwLjU2MjAxMTcxOGYsCisgICAgICAgIDAuNjMwODU5Mzc1ZiwgMC43MDc1MTk1MzFmLCAwLjc5Mzk0NTMxMmYsIDAuODkxMTEzMjgxZiwgMS4wMDAwMDAwMDBmLCAvKiAwZEIgZ2FpbiAqLworICAgICAgICAxLjEyMTU4MjAzMWYsIDEuMjU4Nzg5MDYyZiwgMS40MTIxMDkzNzVmLCAxLjU4NDQ3MjY1NmYsIDEuNzc3ODMyMDMxZiwKKyAgICAgICAgMi4wMDAwMDAwMDBmLCAyLjIzODI4MTI1MGYsIDIuNTExNzE4NzUwZiwgMi44MTgzNTkzNzVmLCAzLjE2MjEwOTM3NWYsCisgICAgICAgIDMuNTQ3ODUxNTYyZiwgMy45ODA5NTcwMzFmLCA0LjQ2Njc5Njg3NWYsIDUuMDExNzE4NzUwZiwgNS42NTIzNDM3NTBmfTsgLyogKzE1ZEIgZ2FpbiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgQ29zb25lIHBvbHlub21pYWwgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjQxLDIwICsxNDksMjAgQEAKICAqIGEgcmFuZ2Ugb2YgMCB0byBQaS4gVGhlIG91dHB1dCBpcyBpbiB0aGUgcmFuZ2UgMzI3NjcgdG8gLTMyNzY4IHJlcHJlc2VudGluZyB0aGUgcmFuZ2UKICAqICsxLjAgdG8gLTEuMAogICovCi1jb25zdCBMVk1fSU5UMTYgICAgIExWUFNBX0Nvc0NvZWZbXSA9IHsgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOTcyNSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNjcxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzNzMwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05NDkwfTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNSAqLwotY29uc3QgTFZNX0ZMT0FUICAgICBMVlBTQV9GbG9hdF9Db3NDb2VmW10gPSB7IDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMzhmLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDEwOTg2ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjYwMTk3NzVmLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDgxNTE0OWYsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43MjQyMDQyZiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yODk2MjA2Zn07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTUgKi8KK2NvbnN0IExWTV9JTlQxNiBMVlBTQV9Db3NDb2VmW10gPSB7MywgICAgICAgICAgICAgICAgICAvKiBTaGlmdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5NiwgICAgICAgICAgICAgICAvKiBhMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMzYsICAgICAgICAgICAgICAgIC8qIGExICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOTcyNSwgICAgICAgICAgICAgLyogYTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTI2NzEsICAgICAgICAgICAgICAvKiBhMyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzczMCwgICAgICAgICAgICAgIC8qIGE0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05NDkwfTsgICAgICAgICAgICAgLyogYTUgKi8KK2NvbnN0IExWTV9GTE9BVCBMVlBTQV9GbG9hdF9Db3NDb2VmW10gPSB7MywgICAgICAgICAgICAvKiBTaGlmdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDM4ZiwgICAvKiBhMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDEwOTg2ZiwgIC8qIGExICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjYwMTk3NzVmLCAgLyogYTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDgxNTE0OWYsICAvKiBhMyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcyNDIwNDJmLCAgIC8qIGE0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI4OTYyMDZmfTsgLyogYTUgKi8KIC8qCiAgKiBDb2VmZmljaWVudHMgZm9yIGNhbGN1bGF0aW5nIHRoZSBjb3NpbmUgZXJyb3Igd2l0aCB0aGUgZXF1YXRpb246CiAgKgpAQCAtMjY5LDEwMSArMTc3LDEwMCBAQAogICoKICAqIENvcyh4KSA9IDEuMCAtIENvc0Vycih4KQogICovCi1jb25zdCBMVk1fSU5UMTYgICAgIExWUFNBX0RQQ29zQ29lZltdID0geyAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hpZnRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjU4NiwgICAgICAgICAgICAgICAgICAgICAgIC8qIGEyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KLWNvbnN0IExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9EUENvc0NvZWZbXSA9IHsxLjBmLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMGYsICAgICAgICAgICAgICAgICAgICAgICAgLyogYTAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwODMxMWYsICAgICAgICAgICAgICAgICAvKiBhMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTA2MTc5OTlmLCAgICAgICAgICAgICAgICAgLyogYTIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDEzNDI4MWZ9OyAgICAgICAgICAgICAgICAvKiBhMyAqLworY29uc3QgTFZNX0lOVDE2IExWUFNBX0RQQ29zQ29lZltdID0gezEsICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgIC8qIGEwICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYsICAgICAgICAgICAgICAgICAgLyogYTEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjU4NiwgICAgICAgICAgICAgICAvKiBhMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NH07ICAgICAgICAgICAgICAgIC8qIGEzICovCitjb25zdCBMVk1fRkxPQVQgTFZQU0FfRmxvYXRfRFBDb3NDb2VmW10gPSB7MS4wZiwgICAgICAgICAgLyogU2hpZnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wZiwgICAgICAgICAgLyogYTAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwODMxMWYsICAvKiBhMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTA2MTc5OTlmLCAgIC8qIGEyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMzQyODFmfTsgLyogYTMgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFF1YXNpIHBlYWsgZmlsdGVyIGNvZWZmaWNpZW50cyB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgUVBEX0MzMl9Db2VmcyAgICAgTFZQU0FfUVBEX0NvZWZzW10gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLyAgICAvKiBMVlBTQV9TUEVFRF9MT1cgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDgwQ0VGRDJCLDB4MDBDQjlCMTd9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDgwRDI0MkU3LDB4MDBDRUQxMUR9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDgwRENCQUY1LDB4MDBEOTE2Nzl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDgwQ0VGRDJCLDB4MDBDQjlCMTd9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDgwRTEzNzM5LDB4MDBERDdDRDN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDgwRENCQUY1LDB4MDBEOTE2Nzl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDgwRDk0QkFGLDB4MDBENUI3RTd9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDgwRTEzNzM5LDB4MDBERDdDRDN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDgwRENCQUY1LDB4MDBEOTE2Nzl9LCAgLyogNDhrUy9zICovCitjb25zdCBRUERfQzMyX0NvZWZzIExWUFNBX1FQRF9Db2Vmc1tdID0geworICAgICAgICAvKiA4a1MvcyAgKi8gLyogTFZQU0FfU1BFRURfTE9XICAgKi8KKyAgICAgICAgeyhMVk1fSU5UMzIpMHg4MENFRkQyQiwgMHgwMENCOUIxN30sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4ODBEMjQyRTcsIDB4MDBDRUQxMUR9LAorICAgICAgICB7KExWTV9JTlQzMikweDgwRENCQUY1LCAweDAwRDkxNjc5fSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHg4MENFRkQyQiwgMHgwMENCOUIxN30sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4ODBFMTM3MzksIDB4MDBERDdDRDN9LAorICAgICAgICB7KExWTV9JTlQzMikweDgwRENCQUY1LCAweDAwRDkxNjc5fSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHg4MEQ5NEJBRiwgMHgwMEQ1QjdFN30sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4ODBFMTM3MzksIDB4MDBERDdDRDN9LAorICAgICAgICB7KExWTV9JTlQzMikweDgwRENCQUY1LCAweDAwRDkxNjc5fSwgLyogNDhrUy9zICovCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovICAgIC8qIExWUFNBX1NQRUVEX01FRElVTSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDg1ODc1MTNELDB4MDU1QzIyQ0Z9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDg1OUQyOTY3LDB4MDU3MEYwMDd9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDg1RTJFRkFDLDB4MDVCMzRENzl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDg1ODc1MTNELDB4MDU1QzIyQ0Z9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDg2MDBDN0I5LDB4MDVDRkE2Q0Z9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDg1RTJFRkFDLDB4MDVCMzRENzl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDg1Q0MxMDE4LDB4MDU5RDhGNjl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDg2MDBDN0I5LDB4MDVDRkE2Q0Z9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweDg1RTJFRkFDLDB4MDVCMzRENzl9LCAgLyogNDhrUy9zICovCisgICAgICAgIC8qIDhrUy9zICAqLyAvKiBMVlBTQV9TUEVFRF9NRURJVU0gKi8KKyAgICAgICAgeyhMVk1fSU5UMzIpMHg4NTg3NTEzRCwgMHgwNTVDMjJDRn0sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4ODU5RDI5NjcsIDB4MDU3MEYwMDd9LAorICAgICAgICB7KExWTV9JTlQzMikweDg1RTJFRkFDLCAweDA1QjM0RDc5fSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHg4NTg3NTEzRCwgMHgwNTVDMjJDRn0sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4ODYwMEM3QjksIDB4MDVDRkE2Q0Z9LAorICAgICAgICB7KExWTV9JTlQzMikweDg1RTJFRkFDLCAweDA1QjM0RDc5fSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHg4NUNDMTAxOCwgMHgwNTlEOEY2OX0sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4ODYwMEM3QjksIDB4MDVDRkE2Q0Z9LAorICAgICAgICB7KExWTV9JTlQzMikweDg1RTJFRkFDLCAweDA1QjM0RDc5fSwgLyogNDhrUy9zICovCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovICAgLyogTFZQU0FfU1BFRURfSElHSCAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweEExMTVFQTdBLDB4MUNEQjNGNUN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweEExODQ3NUYwLDB4MUQyQzgzQTJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweEEyRTFFOTUwLDB4MUUyQTUzMkV9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweEExMTVFQTdBLDB4MUNEQjNGNUN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweEEzNzVCMkM2LDB4MUU5NDNCQkN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweEEyRTFFOTUwLDB4MUUyQTUzMkV9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweEEyNkZGNkJELDB4MUREODE1MzB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweEEzNzVCMkM2LDB4MUU5NDNCQkN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KExWTV9JTlQzMikweEEyRTFFOTUwLDB4MUUyQTUzMkV9fTsgLyogNDhrUy9zICovCisgICAgICAgIC8qIDhrUy9zICAqLyAvKiBMVlBTQV9TUEVFRF9ISUdIICAgICovCisgICAgICAgIHsoTFZNX0lOVDMyKTB4QTExNUVBN0EsIDB4MUNEQjNGNUN9LAorICAgICAgICB7KExWTV9JTlQzMikweEExODQ3NUYwLCAweDFEMkM4M0EyfSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHhBMkUxRTk1MCwgMHgxRTJBNTMyRX0sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4QTExNUVBN0EsIDB4MUNEQjNGNUN9LAorICAgICAgICB7KExWTV9JTlQzMikweEEzNzVCMkM2LCAweDFFOTQzQkJDfSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHhBMkUxRTk1MCwgMHgxRTJBNTMyRX0sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4QTI2RkY2QkQsIDB4MUREODE1MzB9LAorICAgICAgICB7KExWTV9JTlQzMikweEEzNzVCMkM2LCAweDFFOTQzQkJDfSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHhBMkUxRTk1MCwgMHgxRTJBNTMyRX19OyAvKiA0OGtTL3MgKi8KIAotY29uc3QgUVBEX0ZMT0FUX0NvZWZzICAgICBMVlBTQV9RUERfRmxvYXRfQ29lZnNbXSA9IHsKK2NvbnN0IFFQRF9GTE9BVF9Db2VmcyBMVlBTQV9RUERfRmxvYXRfQ29lZnNbXSA9IHsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8gICAgLyogTFZQU0FfU1BFRURfTE9XICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzY4MzE5ODkzMjU1ODNmLDAuMDA2MjEzNTU2NTA5NDY1MGZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzNTgzMzMzMjEyODgyM2YsMC4wMDYzMTE1NDkzMzk0NDM0Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzY4MzE5ODkzMjU1ODNmLDAuMDA2MjEzNTU2NTA5NDY1MGZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMTI2OTYxODY4MjU2M2YsMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzM2ODY2MzM1OTQzMzRmLDAuMDA2NTIyMTY3MDA4MzcwMmZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMTI2OTYxODY4MjU2M2YsMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMTI2OTYxODY4MjU2M2YsMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzEyNjk2MTg2ODI1NjNmLDAuMDA2NzU5MjY0OTcyMDYwOWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLyAgICAvKiBMVlBTQV9TUEVFRF9NRURJVU0gICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU2ODA3OTQyNTk1MzMyOWYsMC4wNDE4NzQyNjY2OTUyMzEyZn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTYxNDEzMDQ2OTAzOTA4ZiwwLjA0MjUwOTA4MjIzOTEyMTJmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU2ODA3OTQyNTk1MzMyOWYsMC4wNDE4NzQyNjY2OTUyMzEyZn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTMxMDExOTEyMDQwNDEyZiwwLjA0NTM5OTUyMzgwNTgyNjlmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0NzA5OTk1NTM3OTk2M2YsMC4wNDM4NzA4NTU1ODg0NjU5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3sweDg2MDBDN0I5LDB4MDVDRkE2Q0Z9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsMC4wNDUzOTk1MjM4MDU4MjY5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsMC4wNDUzOTk1MjM4MDU4MjY5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1MzEwMTE5MTIwNDA0MTJmLDAuMDQ1Mzk5NTIzODA1ODI2OWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8gICAvKiBMVlBTQV9TUEVFRF9ISUdIICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjc0MTUxODY3OTA3NDk0MzFmLDAuMjI1NDQwOTAyNjM1NDU1MWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzM4MTQ1MTIwNDQxOTEzNmYsMC4yMjc5MjA5NjUyOTE1NTk3Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjc0MTUxODY3OTA3NDk0MzFmLDAuMjI1NDQwOTAyNjM1NDU1MWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzIyOTcwNjMxOTA0OTAwMWYsMC4yMzg4OTg3MjI0NTQ5MDU1Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjczMDk1ODEzNTMzMjkxMjJmLDAuMjMzMTU2ODIyNjIxODIyNGZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzIyOTcwNjMxOTA0OTAwMWYsMC4yMzg4OTg3MjI0NTQ5MDU1Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx7LTAuNzIyOTcwNjMxOTA0OTAwMWYsMC4yMzg4OTg3MjI0NTQ5MDU1Zn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43MjI5NzA2MzE5MDQ5MDAxZiwwLjIzODg5ODcyMjQ1NDkwNTVmfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAvKiA4a1MvcyAgKi8gLyogTFZQU0FfU1BFRURfTE9XICAgKi8KKyAgICAgICAgey0wLjk5MzY4MzE5ODkzMjU1ODNmLCAwLjAwNjIxMzU1NjUwOTQ2NTBmfSwKKyAgICAgICAgey0wLjk5MzU4MzMzMzIxMjg4MjNmLCAwLjAwNjMxMTU0OTMzOTQ0MzRmfSwKKyAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLCAwLjAwNjYyNDk5MzQwMjUxMDlmfSwKKyAgICAgICAgey0wLjk5MzY4MzE5ODkzMjU1ODNmLCAwLjAwNjIxMzU1NjUwOTQ2NTBmfSwKKyAgICAgICAgey0wLjk5MzEyNjk2MTg2ODI1NjNmLCAwLjAwNjc1OTI2NDk3MjA2MDlmfSwKKyAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLCAwLjAwNjYyNDk5MzQwMjUxMDlmfSwKKyAgICAgICAgey0wLjk5MzM2ODY2MzM1OTQzMzRmLCAwLjAwNjUyMjE2NzAwODM3MDJmfSwKKyAgICAgICAgey0wLjk5MzEyNjk2MTg2ODI1NjNmLCAwLjAwNjc1OTI2NDk3MjA2MDlmfSwKKyAgICAgICAgLyogNDhrUy9zICovCisgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwgMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCisgICAgICAgIHstMC45OTMxMjY5NjE4NjgyNTYzZiwgMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCisgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwgMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCisgICAgICAgIHstMC45OTMxMjY5NjE4NjgyNTYzZiwgMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCisgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwgMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCisgICAgICAgIC8qIDhrUy9zICAqLyAvKiBMVlBTQV9TUEVFRF9NRURJVU0gICAgICAqLworICAgICAgICB7LTAuOTU2ODA3OTQyNTk1MzMyOWYsIDAuMDQxODc0MjY2Njk1MjMxMmZ9LAorICAgICAgICB7LTAuOTU2MTQxMzA0NjkwMzkwOGYsIDAuMDQyNTA5MDgyMjM5MTIxMmZ9LAorICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsIDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorICAgICAgICB7LTAuOTU2ODA3OTQyNTk1MzMyOWYsIDAuMDQxODc0MjY2Njk1MjMxMmZ9LAorICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsIDAuMDQ1Mzk5NTIzODA1ODI2OWZ9LAorICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsIDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorICAgICAgICB7LTAuOTU0NzA5OTk1NTM3OTk2M2YsIDAuMDQzODcwODU1NTg4NDY1OWZ9LAorICAgICAgICAvL3sweDg2MDBDN0I5LDB4MDVDRkE2Q0Z9LAorICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsIDAuMDQ1Mzk5NTIzODA1ODI2OWZ9LAorICAgICAgICAvKiA0OGtTL3MgKi8KKyAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLCAwLjA0NDUzNDM4MTk0NDY4NjJmfSwKKyAgICAgICAgey0wLjk1MzEwMTE5MTIwNDA0MTJmLCAwLjA0NTM5OTUyMzgwNTgyNjlmfSwKKyAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLCAwLjA0NDUzNDM4MTk0NDY4NjJmfSwKKyAgICAgICAgey0wLjk1MzEwMTE5MTIwNDA0MTJmLCAwLjA0NTM5OTUyMzgwNTgyNjlmfSwKKyAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLCAwLjA0NDUzNDM4MTk0NDY4NjJmfSwKKyAgICAgICAgLyogOGtTL3MgICovIC8qIExWUFNBX1NQRUVEX0hJR0ggICAgICAqLworICAgICAgICB7LTAuNzQxNTE4Njc5MDc0OTQzMWYsIDAuMjI1NDQwOTAyNjM1NDU1MWZ9LAorICAgICAgICB7LTAuNzM4MTQ1MTIwNDQxOTEzNmYsIDAuMjI3OTIwOTY1MjkxNTU5N2Z9LAorICAgICAgICB7LTAuNzI3NDgwNzMxOTA0NTA2N2YsIDAuMjM1NjY2NjU0MDcyNzAxOWZ9LAorICAgICAgICB7LTAuNzQxNTE4Njc5MDc0OTQzMWYsIDAuMjI1NDQwOTAyNjM1NDU1MWZ9LAorICAgICAgICB7LTAuNzIyOTcwNjMxOTA0OTAwMWYsIDAuMjM4ODk4NzIyNDU0OTA1NWZ9LAorICAgICAgICB7LTAuNzI3NDgwNzMxOTA0NTA2N2YsIDAuMjM1NjY2NjU0MDcyNzAxOWZ9LAorICAgICAgICB7LTAuNzMwOTU4MTM1MzMyOTEyMmYsIDAuMjMzMTU2ODIyNjIxODIyNGZ9LAorICAgICAgICB7LTAuNzIyOTcwNjMxOTA0OTAwMWYsIDAuMjM4ODk4NzIyNDU0OTA1NWZ9LAorICAgICAgICAvKiA0OGtTL3MgKi8KKyAgICAgICAgey0wLjcyNzQ4MDczMTkwNDUwNjdmLCAwLjIzNTY2NjY1NDA3MjcwMTlmfSwKKyAgICAgICAgey0wLjcyMjk3MDYzMTkwNDkwMDFmLCAwLjIzODg5ODcyMjQ1NDkwNTVmfSwKKyAgICAgICAgey0wLjcyNzQ4MDczMTkwNDUwNjdmLCAwLjIzNTY2NjY1NDA3MjcwMTlmfSwKKyAgICAgICAgey0wLjcyMjk3MDYzMTkwNDkwMDFmLCAwLjIzODg5ODcyMjQ1NDkwNTVmfSwKKyAgICAgICAgey0wLjcyNzQ4MDczMTkwNDUwNjdmLCAwLjIzNTY2NjY1NDA3MjcwMTlmfX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmgKaW5kZXggNjU4NzJmZS4uYzc3MWRhZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuaApAQCAtMjcsNyArMjcsNyBAQAogICogU2FtcGxlIHJhdGUgdGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgYWN0dWFsCiAgKiBmcmVxdWVuY3kKICAqLwotZXh0ZXJuIGNvbnN0IExWTV9VSU5UMzIgICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOworZXh0ZXJuIGNvbnN0IExWTV9VSU5UMzIgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM5LDcgKzM5LDcgQEAKICAqIFNhbXBsZSByYXRlIHRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIGFjdHVhbAogICogZnJlcXVlbmN5CiAgKi8KLWV4dGVybiBjb25zdCBMVk1fVUlOVDMyICAgIExWUFNBX1NhbXBsZVJhdGVJbnZUYWJbXTsKK2V4dGVybiBjb25zdCBMVk1fVUlOVDMyIExWUFNBX1NhbXBsZVJhdGVJbnZUYWJbXTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01MSw3ICs1MSw3IEBACiAgKiBUYWJsZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIHRoZSBlbnVtZXJhdGVkIHR5cGUgYW5kIHRoZSBudW1iZXIgb2Ygc2FtcGxlcwogICogZHVyaW5nIDIwbXMKICAqLwotZXh0ZXJuIGNvbnN0IExWTV9VSU5UMTYgICAgTFZQU0FfblNhbXBsZXNCdWZmZXJVcGRhdGVbXTsKK2V4dGVybiBjb25zdCBMVk1fVUlOVDE2IExWUFNBX25TYW1wbGVzQnVmZmVyVXBkYXRlW107CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjIsNyArNjIsNyBAQAogLyoKICAqIFRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIGRvd24gc2FtcGxpbmcgZmFjdG9yCiAgKi8KLWV4dGVybiBjb25zdCBMVk1fVUlOVDE2ICAgIExWUFNBX0Rvd25TYW1wbGluZ0ZhY3RvcltdOworZXh0ZXJuIGNvbnN0IExWTV9VSU5UMTYgTFZQU0FfRG93blNhbXBsaW5nRmFjdG9yW107CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNzMsMTQgKzczLDE0IEBACiAvKgogICogVGFibGUgZm9yIDIgKiBQaSAvIEZzCiAgKi8KLWV4dGVybiBjb25zdCBMVk1fSU5UMTYgICAgIExWUFNBX1R3b1BpT25Gc1RhYmxlW107Ci1leHRlcm4gY29uc3QgTFZNX0ZMT0FUICAgICBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtdOworZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVlBTQV9Ud29QaU9uRnNUYWJsZVtdOworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtdOwogCiAvKgogICogR2FpbiB0YWJsZQogICovCi1leHRlcm4gY29uc3QgTFZNX0lOVDE2ICAgICBMVlBTQV9HYWluVGFibGVbXTsKLWV4dGVybiBjb25zdCBMVk1fRkxPQVQgICAgIExWUFNBX0Zsb2F0X0dhaW5UYWJsZVtdOworZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVlBTQV9HYWluVGFibGVbXTsKK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZQU0FfRmxvYXRfR2FpblRhYmxlW107CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtOTcsOCArOTcsOCBAQAogICogYSByYW5nZSBvZiAwIHRvIFBpLiBUaGUgb3V0cHV0IGlzIGluIHRoZSByYW5nZSAzMjc2NyB0byAtMzI3NjggcmVwcmVzZW50aW5nIHRoZSByYW5nZQogICogKzEuMCB0byAtMS4wCiAgKi8KLWV4dGVybiBjb25zdCBMVk1fSU5UMTYgICAgIExWUFNBX0Nvc0NvZWZbXTsKLWV4dGVybiBjb25zdCBMVk1fRkxPQVQgICAgIExWUFNBX0Zsb2F0X0Nvc0NvZWZbXTsKK2V4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZQU0FfQ29zQ29lZltdOworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCBMVlBTQV9GbG9hdF9Db3NDb2VmW107CiAKIC8qCiAgKiBDb2VmZmljaWVudHMgZm9yIGNhbGN1bGF0aW5nIHRoZSBjb3NpbmUgZXJyb3Igd2l0aCB0aGUgZXF1YXRpb246CkBAIC0xMTQsMTUgKzExNCwxNSBAQAogICoKICAqIENvcyh4KSA9IDEuMCAtIENvc0Vycih4KQogICovCi1leHRlcm4gY29uc3QgTFZNX0lOVDE2ICAgICBMVlBTQV9EUENvc0NvZWZbXTsKLWV4dGVybiBjb25zdCBMVk1fRkxPQVQgICAgTFZQU0FfRmxvYXRfRFBDb3NDb2VmW107CitleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWUFNBX0RQQ29zQ29lZltdOworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCBMVlBTQV9GbG9hdF9EUENvc0NvZWZbXTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgUXVhc2kgcGVhayBmaWx0ZXIgY29lZmZpY2llbnRzIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gY29uc3QgUVBEX0MzMl9Db2VmcyAgICAgTFZQU0FfUVBEX0NvZWZzW107Ci1leHRlcm4gY29uc3QgUVBEX0ZMT0FUX0NvZWZzICAgICBMVlBTQV9RUERfRmxvYXRfQ29lZnNbXTsKK2V4dGVybiBjb25zdCBRUERfQzMyX0NvZWZzIExWUFNBX1FQRF9Db2Vmc1tdOworZXh0ZXJuIGNvbnN0IFFQRF9GTE9BVF9Db2VmcyBMVlBTQV9RUERfRmxvYXRfQ29lZnNbXTsKIAogI2VuZGlmIC8qIF9fTFZQU0FfVEFCTEVTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaAppbmRleCAwYWRmZDFiLi5mZmU3OTAyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaApAQCAtNzEsMjEgKzcxLDE0IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBNZW1vcnkgdGFibGUgKi8KLSNkZWZpbmUgTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEEgICAgMCAgICAvKiBPZmZzZXQgdG8gdGhlIGluc3RhbmNlIG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEEgICAgMSAgICAvKiBPZmZzZXQgdG8gdGhlIHBlcnNpc3RlbnQgZGF0YSBtZW1vcnkgcmVnaW9uICovCi0jZGVmaW5lIExWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGICAgIDIgICAgLyogT2Zmc2V0IHRvIHRoZSBwZXJzaXN0ZW50IGNvZWZmaWNpZW50IG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QgICAgICAgICAgMyAgICAvKiBPZmZzZXQgdG8gdGVtcG9yYXJ5IG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZDU19OUl9NRU1PUllfUkVHSU9OUyAgICAgICAgICAgICAgICAgNCAgICAvKiBOdW1iZXIgb2YgbWVtb3J5IHJlZ2lvbnMgKi8KLQogLyogRWZmZWN0IExldmVsICovCi0jZGVmaW5lIExWQ1NfRUZGRUNUX0xPVyAgICAgICAgICAgICAgICAgICAgMTYzODQgICAgLyogRWZmZWN0IHNjYWxpbmcgNTAlICovCi0jZGVmaW5lIExWQ1NfRUZGRUNUX01FRElVTSAgICAgICAgICAgICAgICAgMjQ1NzYgICAgLyogRWZmZWN0IHNjYWxpbmcgNzUlICovCi0jZGVmaW5lIExWQ1NfRUZGRUNUX0hJR0ggICAgICAgICAgICAgICAgICAgMzI3NjcgICAgLyogRWZmZWN0IFNjYWxpbmcgMTAwJSAqLworI2RlZmluZSBMVkNTX0VGRkVDVF9MT1cgMTYzODQgICAgLyogRWZmZWN0IHNjYWxpbmcgNTAlICovCisjZGVmaW5lIExWQ1NfRUZGRUNUX01FRElVTSAyNDU3NiAvKiBFZmZlY3Qgc2NhbGluZyA3NSUgKi8KKyNkZWZpbmUgTFZDU19FRkZFQ1RfSElHSCAzMjc2NyAgIC8qIEVmZmVjdCBTY2FsaW5nIDEwMCUgKi8KIAogLyogQ2FsbGJhY2sgZXZlbnRzICovCi0jZGVmaW5lIExWQ1NfRVZFTlRfTk9ORSAgICAgICAgICAgICAgICAgICAweDAwMDAgICAgLyogTm90IGEgdmFsaWQgZXZlbnQgKi8KLSNkZWZpbmUgTFZDU19FVkVOVF9BTEdPRkYgICAgICAgICAgICAgICAgIDB4MDAwMSAgICAvKiBDUyBoYXMgY29tcGxldGVkIHN3aXRjaCBvZmYgKi8KKyNkZWZpbmUgTFZDU19FVkVOVF9OT05FIDB4MDAwMCAgIC8qIE5vdCBhIHZhbGlkIGV2ZW50ICovCisjZGVmaW5lIExWQ1NfRVZFTlRfQUxHT0ZGIDB4MDAwMSAvKiBDUyBoYXMgY29tcGxldGVkIHN3aXRjaCBvZmYgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTk0LDcwICs4Nyw0OSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEluc3RhbmNlIGhhbmRsZSAqLwotdHlwZWRlZiB2b2lkICpMVkNTX0hhbmRsZV90OwordHlwZWRlZiB2b2lkKiBMVkNTX0hhbmRsZV90OwogCiAvKiBPcGVyYXRpbmcgbW9kZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWQ1NfT0ZGID0gMCwKLSAgICBMVkNTX09OICA9IDE1LAotICAgIExWQ1NfTUFYID0gTFZNX01BWEVOVU0KLX0gTFZDU19Nb2Rlc19lbjsKLQotLyogTWVtb3J5IFR5cGVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVkNTX1NDUkFUQ0ggICAgICAgID0gMCwKLSAgICBMVkNTX0RBVEEgICAgICAgICAgID0gMSwKLSAgICBMVkNTX0NPRUZGSUNJRU5UICAgID0gMiwKLSAgICBMVkNTX1BFUlNJU1RFTlQgICAgID0gMywKLSAgICBMVkNTX01FTU9SWVRZUEVfTUFYID0gTFZNX01BWEVOVU0KLX0gTFZDU19NZW1vcnlUeXBlc19lbjsKK3R5cGVkZWYgZW51bSB7IExWQ1NfT0ZGID0gMCwgTFZDU19PTiA9IDE1LCBMVkNTX01BWCA9IExWTV9NQVhFTlVNIH0gTFZDU19Nb2Rlc19lbjsKIAogLyogRnVuY3Rpb24gcmV0dXJuIHN0YXR1cyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZDU19TVUNDRVNTICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBhIHJvdXRpbmUgKi8KLSAgICBMVkNTX0FMSUdOTUVOVEVSUk9SID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgYWxpZ25tZW50IGVycm9yICovCi0gICAgTFZDU19OVUxMQUREUkVTUyAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KLSAgICBMVkNTX1RPT01BTllTQU1QTEVTID0gMywgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgZXhjZWVkZWQgKi8KLSAgICBMVkNTX0lOVkFMSURCVUZGRVIgID0gNCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnZhbGlkIGJ1ZmZlciBwcm9jZXNzaW5nIHJlcXVlc3QgKi8KLSAgICBMVkNTX1NUQVRVU01BWCAgICAgID0gTFZNX01BWEVOVU0KK3R5cGVkZWYgZW51bSB7CisgICAgTFZDU19TVUNDRVNTID0gMCwgICAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gYSByb3V0aW5lICovCisgICAgTFZDU19OVUxMQUREUkVTUyA9IDEsICAgIC8qIE5VTEwgYWxsb2NhdGlvbiBhZGRyZXNzICovCisgICAgTFZDU19UT09NQU5ZU0FNUExFUyA9IDIsIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBleGNlZWRlZCAqLworICAgIExWQ1NfU1RBVFVTTUFYID0gTFZNX01BWEVOVU0KIH0gTFZDU19SZXR1cm5TdGF0dXNfZW47CiAKIC8qCiAgKiBTb3VyY2UgZGF0YSBmb3JtYXRzCiAgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWQ1NfU1RFUkVPICAgICAgID0gMCwKK3R5cGVkZWYgZW51bSB7CisgICAgTFZDU19TVEVSRU8gPSAwLAogICAgIExWQ1NfTU9OT0lOU1RFUkVPID0gMSwKLSAgICBMVkNTX1NPVVJDRU1BWCAgICA9IExWTV9NQVhFTlVNCisgICAgTFZDU19TT1VSQ0VNQVggPSBMVk1fTUFYRU5VTQogfSBMVkNTX1NvdXJjZUZvcm1hdF9lbjsKIAogLyoKICAqIFN1cHBvcnRlZCBvdXRwdXQgZGV2aWNlcwogICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVkNTX0hFQURQSE9ORVMgICAgICAgICAgICAgPSAwLAotICAgIExWQ1NfRVhfSEVBRFBIT05FUyAgICAgICAgICA9IDEsCi0gICAgTFZDU19TUEVBS0VSVFlQRV9NQVggICAgICAgID0gTFZNX01BWEVOVU0KK3R5cGVkZWYgZW51bSB7CisgICAgTFZDU19IRUFEUEhPTkVTID0gMCwKKyAgICBMVkNTX0VYX0hFQURQSE9ORVMgPSAxLAorICAgIExWQ1NfU1BFQUtFUlRZUEVfTUFYID0gTFZNX01BWEVOVU0KIH0gTFZDU19TcGVha2VyVHlwZV9lbjsKIAogLyoKICAqIFNwZWFrZXIgQ29lZmZpY2llbnRzIFRhYmxlCiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdm9pZCAgICAqcFRhYmxlMTsKLSAgICB2b2lkICAgICpwVGFibGUyOwotICAgIHZvaWQgICAgKnBUYWJsZTM7Ci0gICAgdm9pZCAgICAqcFRhYmxlNDsKLSAgICB2b2lkICAgICpwVGFibGU1OwotICAgIHZvaWQgICAgKnBUYWJsZTY7Ci0gICAgdm9pZCAgICAqcFRhYmxlNzsKLSAgICB2b2lkICAgICpwVGFibGU4OwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHZvaWQqIHBUYWJsZTE7CisgICAgdm9pZCogcFRhYmxlMjsKKyAgICB2b2lkKiBwVGFibGUzOworICAgIHZvaWQqIHBUYWJsZTQ7CisgICAgdm9pZCogcFRhYmxlNTsKKyAgICB2b2lkKiBwVGFibGU2OworICAgIHZvaWQqIHBUYWJsZTc7CisgICAgdm9pZCogcFRhYmxlODsKIH0gTFZDU19DU01TX0NvZWZfVGFibGVzX3Q7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTY2LDQ0ICsxMzgsMjYgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIE1lbW9yeSByZWdpb24gZGVmaW5pdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gc2l6ZSBpbiBieXRlcyAqLwotICAgIExWQ1NfTWVtb3J5VHlwZXNfZW4gICAgIFR5cGU7ICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiB0eXBlICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnBCYXNlQWRkcmVzczsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgcmVnaW9uIGJhc2UgYWRkcmVzcyAqLwotfSBMVkNTX01lbW9yeVJlZ2lvbl90OwotCi0vKiBNZW1vcnkgdGFibGUgY29udGFpbmluZyB0aGUgcmVnaW9uIGRlZmluaXRpb25zICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWQ1NfTWVtb3J5UmVnaW9uX3QgUmVnaW9uW0xWQ1NfTlJfTUVNT1JZX1JFR0lPTlNdOyAvKiBPbmUgZGVmaW5pdGlvbiBmb3IgZWFjaCByZWdpb24gKi8KLX0gTFZDU19NZW1UYWJfdDsKLQogLyogQ29uY2VydCBTb3VuZCBwYXJhbWV0ZXIgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWQ1NfTW9kZXNfZW4gICAgICAgICAgIE9wZXJhdGluZ01vZGU7ICAgICAgICAgIC8qIEFsZ29yaXRobSBtb2RlICovCi0gICAgTFZDU19TcGVha2VyVHlwZV9lbiAgICAgU3BlYWtlclR5cGU7ICAgICAgICAgICAgLyogT3V0cHV0IGRldmljZSB0eXBlICovCi0gICAgTFZDU19Tb3VyY2VGb3JtYXRfZW4gICAgU291cmNlRm9ybWF0OyAgICAgICAgICAgLyogU291cmNlIGRhdGEgZm9ybWF0ICovCi0gICAgTFZNX01vZGVfZW4gICAgICAgICAgICAgQ29tcHJlc3Nvck1vZGU7ICAgICAgICAgLyogTm9uLUxpbmVhciBDb21wcmVzc29yIE1vZGUgKi8KLSAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICBTYW1wbGVSYXRlOyAgICAgICAgICAgICAvKiBTYW1wbGluZyByYXRlICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgRWZmZWN0TGV2ZWw7ICAgICAgICAgICAgLyogRWZmZWN0IGxldmVsICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgUmV2ZXJiTGV2ZWw7ICAgICAgICAgICAgLyogUmV2ZXJiIGxldmVsIGluICUgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgTnJDaGFubmVsczsKLSNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWQ1NfTW9kZXNfZW4gT3BlcmF0aW5nTW9kZTsgICAgICAgLyogQWxnb3JpdGhtIG1vZGUgKi8KKyAgICBMVkNTX1NwZWFrZXJUeXBlX2VuIFNwZWFrZXJUeXBlOyAgIC8qIE91dHB1dCBkZXZpY2UgdHlwZSAqLworICAgIExWQ1NfU291cmNlRm9ybWF0X2VuIFNvdXJjZUZvcm1hdDsgLyogU291cmNlIGRhdGEgZm9ybWF0ICovCisgICAgTFZNX01vZGVfZW4gQ29tcHJlc3Nvck1vZGU7ICAgICAgICAvKiBOb24tTGluZWFyIENvbXByZXNzb3IgTW9kZSAqLworICAgIExWTV9Gc19lbiBTYW1wbGVSYXRlOyAgICAgICAgICAgICAgLyogU2FtcGxpbmcgcmF0ZSAqLworICAgIExWTV9JTlQxNiBFZmZlY3RMZXZlbDsgICAgICAgICAgICAgLyogRWZmZWN0IGxldmVsICovCisgICAgTFZNX1VJTlQxNiBSZXZlcmJMZXZlbDsgICAgICAgICAgICAvKiBSZXZlcmIgbGV2ZWwgaW4gJSAqLworICAgIExWTV9JTlQzMiBOckNoYW5uZWxzOwogfSBMVkNTX1BhcmFtc190OwogCiAvKiBDb25jZXJ0IFNvdW5kIENhcGFiaWxpdHkgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZTsgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBpbiBzYW1wbGUgcGFpcnMgKi8KKyAgICBMVk1fVUlOVDE2IE1heEJsb2NrU2l6ZTsgLyogTWF4aW11bSBibG9jayBzaXplIGluIHNhbXBsZSBwYWlycyAqLwogCiAgICAgLyogQ2FsbGJhY2sgcGFyYW1ldGVycyAqLwotICAgIExWTV9DYWxsYmFjayAgICAgICAgICAgIENhbGxCYWNrOyAgICAgICAgICAgICAgIC8qIEJ1bmRsZSBjYWxsYmFjayAqLwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpwQnVuZGxlSW5zdGFuY2U7ICAgICAgIC8qIEJ1bmRsZSBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICBMVk1fQ2FsbGJhY2sgQ2FsbEJhY2s7IC8qIEJ1bmRsZSBjYWxsYmFjayAqLworICAgIHZvaWQqIHBCdW5kbGVJbnN0YW5jZTsgLyogQnVuZGxlIGluc3RhbmNlIGhhbmRsZSAqLwogCiB9IExWQ1NfQ2FwYWJpbGl0aWVzX3Q7CiAKQEAgLTIxMyw4MiArMTY3LDQ0IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCi0vKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSBpdCBpcyAgICAgICAgICAgKi8KLS8qICBwYXNzZWQgdGhlIGRlZmF1bHQgY2FwYWJpbGl0aWVzLCBvZiB0aGVzZSBvbmx5IHRoZSBidWZmZXIgcHJvY2Vzc2luZyBzZXR0aW5nIGlzICAgICAqLwotLyogIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gdGhlIG1lbW9yeSBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gICAgICAqLwotLyogIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlICAgICAgICAgICAgICAqLwotLyogIGNhcGFiaWxpdGllcyBhcmUgaWdub3JlZCBhbmQgdGhlIG1lbW9yeSB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCAgICAgICovCi0vKiAgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAqLwotLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlZmF1bHQgY2FwYWJpbGl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZDU19Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ3JlYXRlIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIENvbmNlcnQgU291bmQgbW9kdWxlICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgUG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNhcGFiaWxpdGllcyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwU2NyYXRjaCAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBzY3JhdGNoIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfTlVMTEFERFJFU1MgICAgICAgT25lIG9yIG1vcmUgbWVtb3J5IGhhcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0luaXQoTFZDU19IYW5kbGVfdCogcGhJbnN0YW5jZSwgTFZDU19DYXBhYmlsaXRpZXNfdCogcENhcGFiaWxpdGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwU2NyYXRjaCk7CiAKLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfTWVtb3J5KExWQ1NfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19NZW1UYWJfdCAgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAqcENhcGFiaWxpdGllcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ3JlYXRlIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIENvbmNlcnQgU291bmQgbW9kdWxlICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFsZ29yaXRobSBpbnN0YW5jZSBieSBjYWxsaW5nIHdpdGggICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlIHNldCB0byBOVUxMLiBJbiB0aGlzIGNhc2UgdGhlIGFsZ29yaXRobSByZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgICAgICAgICAgKi8KLS8qICBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBmb3JjZSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24gb2YgdGhlIGFsZ29yaXRobSAgICAgICAgKi8KLS8qICBieSBjYWxsaW5nIHdpdGggaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlLiBJbiB0aGlzIGNhc2UgdGhlIG1lbW9yeSB0YWJsZSAgICAgICAgICAqLwotLyogIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIGVuc3VyZWQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gICAgICovCi0vKiAgTFZDU19NZW1vcnkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZDU19BbGlnbm1lbnRFcnJvciAgICAgSW5zdGFuY2Ugb3Igc2NyYXRjaCBtZW1vcnkgb24gaW5jb3JyZWN0IGFsaWdubWVudCAgICAgICAgICAgKi8KLS8qICBMVkNTX051bGxBZGRyZXNzICAgICAgICBJbnN0YW5jZSBvciBzY3JhdGNoIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiAgVGhlIGluc3RhbmNlIGhhbmRsZSBpcyB0aGUgcG9pbnRlciB0byB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBtZW1vcnkgICAgICAqLwotLyogICAgICByZWdpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMi4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfSW5pdChMVkNTX0hhbmRsZV90ICAgICAgICAgICAgKnBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19NZW1UYWJfdCAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAgICpwQ2FwYWJpbGl0aWVzKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfRGVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEZyZWUgbWVtb3JpZXMgY3JlYXRlZCBkdXJpbmcgdGhlIExWQ1NfSW5pdCBjYWxsIGluY2x1ZGluZyBpbnN0YW5jZSBoYW5kbGUgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIFBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkNTX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkNTX0RlSW5pdChMVkNTX0hhbmRsZV90KiBwaEluc3RhbmNlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTMxMCw4ICsyMjYsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19HZXRQYXJhbWV0ZXJzKExWQ1NfSGFuZGxlX3QgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICpwUGFyYW1zKTsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfR2V0UGFyYW1ldGVycyhMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZDU19QYXJhbXNfdCogcFBhcmFtcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zMzIsOCArMjQ3LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQ29udHJvbChMVkNTX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgKnBQYXJhbXMpOworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Db250cm9sKExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBMVkNTX1BhcmFtc190KiBwUGFyYW1zKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM1Niw5ICsyNzAsNyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2VzcyhMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcE91dERhdGEsIExWTV9VSU5UMTYgTnVtU2FtcGxlcyk7CiAKLSNlbmRpZiAgLyogTFZDU19IICovCisjZW5kaWYgLyogTFZDU19IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguY3BwCmluZGV4IGJhMTUyYzAuLmY4MDVmY2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguY3BwCkBAIC0zMiw5ICszMiw4IEBACiAvKiAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fSU5UMzIgTFZDU19NaXhlckNhbGxiYWNrKCAgIExWQ1NfSGFuZGxlX3QgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqcEdlbmVyYWxQdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgQ2FsbGJhY2tQYXJhbSk7CitMVk1fSU5UMzIgTFZDU19NaXhlckNhbGxiYWNrKExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCB2b2lkKiBwR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBDYWxsYmFja1BhcmFtKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02NSwyOSArNjQsMjIgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0J5cGFzc01peEluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKLXsKLQotICAgIExWTV9VSU5UMTYgICAgICAgICAgT2Zmc2V0OwotICAgIExWTV9GTE9BVCAgICAgICAgICAgR2FpbjsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEN1cnJlbnQ7Ci0gICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZDU19CeXBhc3NNaXhfdCAgICAqcENvbmZpZyAgID0gKExWQ1NfQnlwYXNzTWl4X3QgKikmcEluc3RhbmNlLT5CeXBhc3NNaXg7Ci0gICAgY29uc3QgR2Fpbl90ICAgICAgICAqcE91dHB1dEdhaW5UYWJsZTsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4SW5pdChMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZDU19QYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWTV9VSU5UMTYgT2Zmc2V0OworICAgIExWTV9GTE9BVCBHYWluOworICAgIExWTV9GTE9BVCBDdXJyZW50OworICAgIExWQ1NfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCopaEluc3RhbmNlOworICAgIExWQ1NfQnlwYXNzTWl4X3QqIHBDb25maWcgPSAoTFZDU19CeXBhc3NNaXhfdCopJnBJbnN0YW5jZS0+QnlwYXNzTWl4OworICAgIGNvbnN0IEdhaW5fdCogcE91dHB1dEdhaW5UYWJsZTsKIAogICAgIC8qCiAgICAgICogU2V0IHRoZSB0cmFuc2l0aW9uIGdhaW4KICAgICAgKi8KLSAgICBpZiAoKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgPT0gTFZDU19PTikgJiYKLSAgICAgICAgKHBJbnN0YW5jZS0+YlRpbWVyRG9uZSA9PSBMVk1fVFJVRSkKLSAgICAgICAgJiYgKHBJbnN0YW5jZS0+TVNUYXJnZXQxICE9IDB4N0ZGRikgLyogdGhpcyBpbmRpY2F0ZXMgYW4gb2ZmLT5vbiB0cmFuc3Rpb24gKi8KLSAgICAgICAgKQotICAgIHsKKyAgICBpZiAoKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgPT0gTFZDU19PTikgJiYgKHBJbnN0YW5jZS0+YlRpbWVyRG9uZSA9PSBMVk1fVFJVRSkgJiYKKyAgICAgICAgKHBJbnN0YW5jZS0+TVNUYXJnZXQxICE9IDB4N0ZGRikgLyogdGhpcyBpbmRpY2F0ZXMgYW4gb2ZmLT5vbiB0cmFuc2l0aW9uICovCisgICAgKSB7CiAgICAgICAgIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4gPSAoKExWTV9GTE9BVClwUGFyYW1zLT5FZmZlY3RMZXZlbCAvIDMyNzY3KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgICAvKiBTZWxlY3Qgbm8gZWZmZWN0IGxldmVsICovCiAgICAgICAgIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4gPSAwOwogICAgIH0KQEAgLTk1LDE4ICs4NywxOSBAQAogICAgIC8qCiAgICAgICogQ2FsY3VsYXRlIHRoZSBvdXRwdXQgZ2FpbiB0YWJsZSBvZmZzZXQKICAgICAgKi8KLSAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNikocFBhcmFtcy0+U3BlYWtlclR5cGUgKyAocFBhcmFtcy0+U291cmNlRm9ybWF0KigxK0xWQ1NfRVhfSEVBRFBIT05FUykpKTsKKyAgICBPZmZzZXQgPQorICAgICAgICAgICAgKExWTV9VSU5UMTYpKHBQYXJhbXMtPlNwZWFrZXJUeXBlICsgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAqICgxICsgTFZDU19FWF9IRUFEUEhPTkVTKSkpOwogICAgIHBPdXRwdXRHYWluVGFibGUgPSAoR2Fpbl90KikmTFZDU19PdXRwdXRHYWluVGFibGVbMF07CiAKICAgICAvKgogICAgICAqIFNldHVwIHRoZSBtaXhlciBnYWluIGZvciB0aGUgcHJvY2Vzc2VkIHBhdGgKICAgICAgKi8KLSAgICBHYWluID0gIChMVk1fRkxPQVQpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICogcEluc3RhbmNlLT5UcmFuc2l0aW9uR2Fpbik7CisgICAgR2FpbiA9IChMVk1fRkxPQVQpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICogcEluc3RhbmNlLT5UcmFuc2l0aW9uR2Fpbik7CiAKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtID0gMDsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKLSAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldD0xOworICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMTsKIAogICAgIEN1cnJlbnQgPSBMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0pOwogICAgIExWQ19NaXhlcl9Jbml0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwgKExWTV9GTE9BVCkoR2FpbiksIEN1cnJlbnQpOwpAQCAtMTE2LDggKzEwOSw4IEBACiAgICAgLyoKICAgICAgKiBTZXR1cCB0aGUgbWl4ZXIgZ2FpbiBmb3IgdGhlIHVucHJvY2Vzc2VkIHBhdGgKICAgICAgKi8KLSAgICBHYWluID0gKExWTV9GTE9BVCkocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MgKiAoMS4wIC0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVClwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKSk7CisgICAgR2FpbiA9IChMVk1fRkxPQVQpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICoKKyAgICAgICAgICAgICAgICAgICAgICAgKDEuMCAtIChMVk1fRkxPQVQpcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbikpOwogICAgIEdhaW4gPSAoTFZNX0ZMT0FUKXBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5VbnByb2NMb3NzICogR2FpbjsKICAgICBDdXJyZW50ID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdKTsKICAgICBMVkNfTWl4ZXJfSW5pdCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sIChMVk1fRkxPQVQpKEdhaW4pLCBDdXJyZW50KTsKQEAgLTEyNSw3ICsxMTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOwogICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gPSAwOwogICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSA9IGhJbnN0YW5jZTsKLSAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldD0xOworICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID0gMTsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgPSBMVkNTX01peGVyQ2FsbGJhY2s7CiAKICAgICAvKgpAQCAtMTM3LDQ1ICsxMzAsNDIgQEAKICAgICAgKiBDb3JyZWN0IGdhaW4gZm9yIHRoZSBlZmZlY3QgbGV2ZWwKICAgICAgKi8KICAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgR2FpbkNvcnJlY3Q7Ci0gICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgR2FpbjE7Ci0gICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgR2FpbjI7CisgICAgICAgIExWTV9GTE9BVCBHYWluQ29ycmVjdDsKKyAgICAgICAgTFZNX0ZMT0FUIEdhaW4xOworICAgICAgICBMVk1fRkxPQVQgR2FpbjI7CiAKICAgICAgICAgR2FpbjEgPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSk7CiAgICAgICAgIEdhaW4yID0gTFZDX01peGVyX0dldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0pOwogICAgICAgICAvKgogICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGdhaW4gY29ycmVjdGlvbgogICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLkNvbXByZXNzb3JNb2RlID09IExWTV9NT0RFX09OKQotICAgICAgICB7Ci0gICAgICAgIEdhaW5Db3JyZWN0ID0gKExWTV9GTE9BVCkoICBwSW5zdGFuY2UtPlZvbENvcnJlY3QuR2Fpbk1pbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5NaW4gKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExWTV9GTE9BVClwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoKExWTV9GTE9BVClwSW5zdGFuY2UtPlZvbENvcnJlY3QuR2FpbkZ1bGwgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pKSkpOworICAgICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuQ29tcHJlc3Nvck1vZGUgPT0gTFZNX01PREVfT04pIHsKKyAgICAgICAgICAgIEdhaW5Db3JyZWN0ID0gKExWTV9GTE9BVCkocEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5NaW4gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5NaW4gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5GdWxsICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExWTV9GTE9BVClwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKSkpKTsKIAotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSB0aGUgZ2FpbiBjb3JyZWN0aW9uCi0gICAgICAgICAqLwotICAgICAgICBHYWluMSA9IChHYWluMSAqIEdhaW5Db3JyZWN0KTsKLSAgICAgICAgR2FpbjIgPSAoR2FpbjIgKiBHYWluQ29ycmVjdCk7Ci0KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBcHBseSB0aGUgZ2FpbiBjb3JyZWN0aW9uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEdhaW4xID0gKEdhaW4xICogR2FpbkNvcnJlY3QpOworICAgICAgICAgICAgR2FpbjIgPSAoR2FpbjIgKiBHYWluQ29ycmVjdCk7CiAgICAgICAgIH0KIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGdhaW4gdmFsdWVzCiAgICAgICAgICAqLwogICAgICAgICBwQ29uZmlnLT5PdXRwdXRfU2hpZnQgPSBwQ29uZmlnLT5PdXRwdXRfU2hpZnQ7Ci0gICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLEdhaW4xKTsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sIEdhaW4xKTsKICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOwotICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSxHYWluMik7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLCBHYWluMik7CiAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKICAgICB9CiAKLSAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKLQorICAgIHJldHVybiAoTFZDU19TVUNDRVNTKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIwNSwzOSArMTk1LDMxIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19CeXBhc3NNaXhlcihMVkNTX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcFVucHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcykKLXsKLQotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSAgICAgID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZDU19CeXBhc3NNaXhfdCAgICAqcENvbmZpZyAgICAgICAgPSAoTFZDU19CeXBhc3NNaXhfdCAqKSZwSW5zdGFuY2UtPkJ5cGFzc01peDsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4ZXIoTFZDU19IYW5kbGVfdCBoSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUKiBwVW5wcm9jZXNzZWQsIExWTV9GTE9BVCogcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgTnVtU2FtcGxlcykgeworICAgIExWQ1NfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCopaEluc3RhbmNlOworICAgIExWQ1NfQnlwYXNzTWl4X3QqIHBDb25maWcgPSAoTFZDU19CeXBhc3NNaXhfdCopJnBJbnN0YW5jZS0+QnlwYXNzTWl4OworICAgIExWTV9VSU5UMTYgZGVzdE51bVNhbXBsZXMgPQorICAgICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMgPT0gRkNDXzEpID8gTnVtU2FtcGxlcyA6IEZDQ18yICogTnVtU2FtcGxlczsKIAogICAgIC8qCiAgICAgICogQ2hlY2sgaWYgdGhlIGJ5cGFzcyBtaXhlciBpcyBlbmFibGVkCiAgICAgICovCi0gICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19CWVBBU1NNSVhTV0lUQ0gpICE9IDApCi0gICAgeworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfQllQQVNTTUlYU1dJVENIKSAhPSAwKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIEFwcGx5IHRoZSBieXBhc3MgbWl4CiAgICAgICAgICAqLwotICAgICAgICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikgcFVucHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsKKyAgICAgICAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLCBwUHJvY2Vzc2VkLCAoTFZNX0ZMT0FUKilwVW5wcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAoTFZNX0lOVDE2KWRlc3ROdW1TYW1wbGVzKTsKICAgICAgICAgLyoKICAgICAgICAgICogQXBwbHkgb3V0cHV0IGdhaW4gY29ycmVjdGlvbiBzaGlmdAogICAgICAgICAgKi8KLSAgICAgICAgU2hpZnRfU2F0X0Zsb2F0KChMVk1fSU5UMTYpcENvbmZpZy0+T3V0cHV0X1NoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCopcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKilwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0Ki8KKyAgICAgICAgU2hpZnRfU2F0X0Zsb2F0KChMVk1fSU5UMTYpcENvbmZpZy0+T3V0cHV0X1NoaWZ0LCAoTFZNX0ZMT0FUKilwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQqKXBPdXREYXRhLCAoTFZNX0lOVDE2KWRlc3ROdW1TYW1wbGVzKTsKICAgICB9CiAKLSAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWQ1NfU1VDQ0VTUyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNDUsMjIgKzIyNywxOCBAQAogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfTWl4ZXJDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX0lOVDMyIExWQ1NfTWl4ZXJDYWxsYmFjayhMVkNTX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgKnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIENhbGxiYWNrUGFyYW0pCi17Ci0gICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CitMVk1fSU5UMzIgTFZDU19NaXhlckNhbGxiYWNrKExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCB2b2lkKiBwR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBDYWxsYmFja1BhcmFtKSB7CisgICAgTFZDU19JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90KiloSW5zdGFuY2U7CiAKLSAgICh2b2lkKXBHZW5lcmFsUHVycG9zZTsKKyAgICAodm9pZClwR2VuZXJhbFB1cnBvc2U7CiAKICAgICAvKgogICAgICAqIE9mZiB0cmFuc2l0aW9uIGhhcyBjb21wbGV0ZWQgaW4gSGVhZHBob25lIG1vZGUKICAgICAgKi8KLSAgICBpZiAoKHBJbnN0YW5jZS0+T3V0cHV0RGV2aWNlID09IExWQ1NfSEVBRFBIT05FKSAmJgotICAgICAgICAocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbikgICAgICYmCi0gICAgICAgIChwSW5zdGFuY2UtPk1TVGFyZ2V0MCA9PSAweDAwMDApJiYgIC8qIHRoaXMgaW5kaWNhdGVzIGFuIG9uLT5vZmYgdHJhbnNpdGlvbiAqLwotICAgICAgICAoQ2FsbGJhY2tQYXJhbSA9PSAwKSkKLSAgICB7CisgICAgaWYgKChwSW5zdGFuY2UtPk91dHB1dERldmljZSA9PSBMVkNTX0hFQURQSE9ORSkgJiYgKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24pICYmCisgICAgICAgIChwSW5zdGFuY2UtPk1TVGFyZ2V0MCA9PSAweDAwMDApICYmIC8qIHRoaXMgaW5kaWNhdGVzIGFuIG9uLT5vZmYgdHJhbnNpdGlvbiAqLworICAgICAgICAoQ2FsbGJhY2tQYXJhbSA9PSAwKSkgewogICAgICAgICAvKiBTZXQgb3BlcmF0aW5nIG1vZGUgdG8gT0ZGICovCiAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkNTX09GRjsKIApAQCAtMjY4LDIxICsyNDYsMTcgQEAKICAgICAgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9GQUxTRTsKIAogICAgICAgICAvKiBTaWduYWwgdG8gdGhlIGJ1bmRsZSAqLwotICAgICAgICBpZigoKnBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLkNhbGxCYWNrKSAhPSBMVk1fTlVMTCl7Ci0gICAgICAgICAgICAoKnBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLkNhbGxCYWNrKShwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCwKKyAgICAgICAgaWYgKCgqcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuQ2FsbEJhY2spICE9IExWTV9OVUxMKSB7CisgICAgICAgICAgICAoKnBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLkNhbGxCYWNrKShwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UsIExWTV9OVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFMR09SSVRITV9DU19JRCB8IExWQ1NfRVZFTlRfQUxHT0ZGKSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoKHBJbnN0YW5jZS0+T3V0cHV0RGV2aWNlID09IExWQ1NfSEVBRFBIT05FKSAgJiYKLSAgICAgICAgKHBJbnN0YW5jZS0+TVNUYXJnZXQwID09IDEpICYmCi0gICAgICAgIChwSW5zdGFuY2UtPmJUaW1lckRvbmUgPT0gTFZNX1RSVUUpKXsKLQorICAgIGlmICgocEluc3RhbmNlLT5PdXRwdXREZXZpY2UgPT0gTFZDU19IRUFEUEhPTkUpICYmIChwSW5zdGFuY2UtPk1TVGFyZ2V0MCA9PSAxKSAmJgorICAgICAgICAocEluc3RhbmNlLT5iVGltZXJEb25lID09IExWTV9UUlVFKSkgewogICAgICAgICAvKiBFeGl0IHRyYW5zaXRpb24gc3RhdGUgKi8KICAgICAgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9GQUxTRTsKICAgICB9CiAKICAgICByZXR1cm4gMTsKIH0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5oCmluZGV4IGZjZDhlZTMuLjY5YWZjYmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmgKQEAgLTMzLDIwICszMywxOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogQnlwYXNzIG1peGVyIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBNaXhlciBzZXR0aW5ncyAqLwotICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgIE1peGVyX0luc3RhbmNlOyAgICAgICAgICAgICAvKiBNaXhlciBpbnN0YW5jZSAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE91dHB1dF9TaGlmdDsgICAgICAgICAgICAgICAvKiBDb3JyZWN0aW5nIGdhaW4gb3V0cHV0IHNoaWZ0ICovCisgICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0IE1peGVyX0luc3RhbmNlOyAvKiBNaXhlciBpbnN0YW5jZSAqLworICAgIExWTV9VSU5UMTYgT3V0cHV0X1NoaWZ0OyAgICAgICAgICAgICAgLyogQ29ycmVjdGluZyBnYWluIG91dHB1dCBzaGlmdCAqLwogCiB9IExWQ1NfQnlwYXNzTWl4X3Q7CiAKLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogT3V0cHV0IGdhaW4gc2V0dGluZ3MsIEdhaW4gPSAoTG9zcy8zMjc2OCkgKiAyXlNoaWZ0ICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICBTaGlmdDsgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBzaGlmdHMgcmVxdWlyZWQgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgIExvc3M7ICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3NzIHJlcXVpcmVkICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICBVbnByb2NMb3NzOyAgICAgICAgICAgICAgICAgLyogVW5wcm9jZXNzZWQgcGF0aCBsb3NzICovCisgICAgTFZNX1VJTlQxNiBTaGlmdDsgICAgIC8qIExlZnQgc2hpZnRzIHJlcXVpcmVkICovCisgICAgTFZNX0ZMT0FUIExvc3M7ICAgICAgIC8qIExvc3MgcmVxdWlyZWQgKi8KKyAgICBMVk1fRkxPQVQgVW5wcm9jTG9zczsgLyogVW5wcm9jZXNzZWQgcGF0aCBsb3NzICovCiB9IEdhaW5fdDsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01NCwxMyArNTIsMTAgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4SW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICpwUGFyYW1zKTsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4SW5pdChMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZDU19QYXJhbXNfdCogcFBhcmFtcyk7CiAKLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4ZXIoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnVuUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgTnVtU2FtcGxlcyk7CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0J5cGFzc01peGVyKExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCogdW5Qcm9jZXNzZWQsIExWTV9GTE9BVCogcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgTnVtU2FtcGxlcyk7CiAKLSNlbmRpZiAgLyogQllQQVNTTUlYX0ggKi8KKyNlbmRpZiAvKiBCWVBBU1NNSVhfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0NvbnRyb2wuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0NvbnRyb2wuY3BwCmluZGV4IDUwZGIwM2QuLjg5ZjJmM2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Db250cm9sLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQ29udHJvbC5jcHAKQEAgLTQ1LDE1ICs0NSwxMiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfR2V0UGFyYW1ldGVycyhMVkNTX0hhbmRsZV90ICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAqcFBhcmFtcykKLXsKLQotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9KExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0dldFBhcmFtZXRlcnMoTFZDU19IYW5kbGVfdCBoSW5zdGFuY2UsIExWQ1NfUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVkNTX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKIAogICAgICpwUGFyYW1zID0gcEluc3RhbmNlLT5QYXJhbXM7CiAKLSAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWQ1NfU1VDQ0VTUyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC03NSwzNCArNzIsMjkgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0NvbnRyb2woTFZDU19IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgKnBQYXJhbXMpCi17Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIE9mZnNldDsKLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAgICAgKnBJbnN0YW5jZSA9KExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gICAgICAgIGVycjsKLSAgICBMVkNTX01vZGVzX2VuICAgICAgICAgICAgICAgT3BlcmF0aW5nTW9kZVNhdmUgPSBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlOworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Db250cm9sKExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBMVkNTX1BhcmFtc190KiBwUGFyYW1zKSB7CisgICAgTFZNX0lOVDE2IE9mZnNldDsKKyAgICBMVkNTX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKKyAgICBMVkNTX1JldHVyblN0YXR1c19lbiBlcnI7CisgICAgTFZDU19Nb2Rlc19lbiBPcGVyYXRpbmdNb2RlU2F2ZSA9IHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGU7CiAKLSAgICBpZiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlKQotICAgIHsKKyAgICBpZiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlKSB7CiAgICAgICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMuU2FtcGxpbmdSYXRlID0gTFZDU19TYW1wbGVSYXRlVGFibGVbcFBhcmFtcy0+U2FtcGxlUmF0ZV07CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBJZiB0aGUgcmV2ZXJiIGxldmVsIGhhcyBjaGFuZ2VkCiAgICAgICovCi0gICAgaWYocEluc3RhbmNlLT5QYXJhbXMuUmV2ZXJiTGV2ZWwgIT0gcFBhcmFtcy0+UmV2ZXJiTGV2ZWwpCi0gICAgewotICAgICAgICBlcnI9TFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KGhJbnN0YW5jZSxwUGFyYW1zKTsKKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuUmV2ZXJiTGV2ZWwgIT0gcFBhcmFtcy0+UmV2ZXJiTGV2ZWwpIHsKKyAgICAgICAgZXJyID0gTFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KGhJbnN0YW5jZSwgcFBhcmFtcyk7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBJZiB0aGUgc2FtcGxlIHJhdGUgb3Igc3BlYWtlciBoYXMgY2hhbmdlZCB0aGVuIHBlcmZvcm0gYSBmdWxsIHJlLWluaXRpYWxpc2F0aW9uCiAgICAgICovCiAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8Ci0gICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlICE9IHBQYXJhbXMtPlNwZWFrZXJUeXBlKSkKLSAgICB7Ci0gICAgICAgIGNvbnN0IExWQ1NfVm9sQ29ycmVjdF90ICpwTFZDU19Wb2xDb3JyZWN0VGFibGU7CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAhPSBwUGFyYW1zLT5TcGVha2VyVHlwZSkpIHsKKyAgICAgICAgY29uc3QgTFZDU19Wb2xDb3JyZWN0X3QqIHBMVkNTX1ZvbENvcnJlY3RUYWJsZTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBPdXRwdXQgZGV2aWNlCkBAIC0xMTQsMTUgKzEwNiwxNiBAQAogICAgICAgICAgKi8KICAgICAgICAgLyogVXNlIGludGVybmFsIGNvZWZmaWNpZW50IHRhYmxlICovCiAgICAgICAgIHBMVkNTX1ZvbENvcnJlY3RUYWJsZSA9IChMVkNTX1ZvbENvcnJlY3RfdCopJkxWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOwotICAgICAgICBPZmZzZXQgPSAoTFZNX0lOVDE2KShwUGFyYW1zLT5TcGVha2VyVHlwZSArIHBQYXJhbXMtPlNvdXJjZUZvcm1hdCooMStMVkNTX0VYX0hFQURQSE9ORVMpKTsKKyAgICAgICAgT2Zmc2V0ID0gKExWTV9JTlQxNikocFBhcmFtcy0+U3BlYWtlclR5cGUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgKiAoMSArIExWQ1NfRVhfSEVBRFBIT05FUykpOwogCiAgICAgICAgIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdCA9IHBMVkNTX1ZvbENvcnJlY3RUYWJsZVtPZmZzZXRdOwogCiAgICAgICAgIHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluID0gcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBNaW47CiAgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwgMCwgMCk7CiAgICAgICAgIHsKLSAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICBHYWluOwotICAgICAgICAgICAgY29uc3QgR2Fpbl90ICAgICAgICAqcE91dHB1dEdhaW5UYWJsZSA9IChHYWluX3QqKSZMVkNTX091dHB1dEdhaW5UYWJsZVswXTsKKyAgICAgICAgICAgIExWTV9GTE9BVCBHYWluOworICAgICAgICAgICAgY29uc3QgR2Fpbl90KiBwT3V0cHV0R2FpblRhYmxlID0gKEdhaW5fdCopJkxWQ1NfT3V0cHV0R2FpblRhYmxlWzBdOwogICAgICAgICAgICAgR2FpbiA9IChMVk1fRkxPQVQpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzKTsKICAgICAgICAgICAgIEdhaW4gPSAoTFZNX0ZMT0FUKXBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5VbnByb2NMb3NzICogKEdhaW4pOwogCkBAIC0xMzMsMjIgKzEyNiwxOCBAQAogCiAgICAgICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sIDAsIEdhaW4pOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sCi0gICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sCi0gICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOwogICAgICAgICB9CiAKLSAgICAgICAgZXJyPUxWQ1NfU0VuaGFuY2VySW5pdChoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsKKyAgICAgICAgZXJyID0gTFZDU19TRW5oYW5jZXJJbml0KGhJbnN0YW5jZSwgcFBhcmFtcyk7CiAKLSAgICAgICAgZXJyPUxWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdChoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsKKyAgICAgICAgZXJyID0gTFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KGhJbnN0YW5jZSwgcFBhcmFtcyk7CiAKLSAgICAgICAgZXJyPUxWQ1NfRXF1YWxpc2VySW5pdChoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsKKyAgICAgICAgZXJyID0gTFZDU19FcXVhbGlzZXJJbml0KGhJbnN0YW5jZSwgcFBhcmFtcyk7CiAKLSAgICAgICAgZXJyPUxWQ1NfQnlwYXNzTWl4SW5pdChoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsKKyAgICAgICAgZXJyID0gTFZDU19CeXBhc3NNaXhJbml0KGhJbnN0YW5jZSwgcFBhcmFtcyk7CiAKICAgICB9CiAKQEAgLTE1NiwzMCArMTQ1LDI2IEBACiAgICAgICogQ2hlY2sgaWYgdGhlIGVmZmVjdCBsZXZlbCBvciBzb3VyY2UgZm9ybWF0IGhhcyBjaGFuZ2VkCiAgICAgICovCiAgICAgZWxzZSBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLkVmZmVjdExldmVsICE9IHBQYXJhbXMtPkVmZmVjdExldmVsKSB8fAotICAgICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCAhPSBwUGFyYW1zLT5Tb3VyY2VGb3JtYXQpKQotICAgIHsKLSAgICAgICAgY29uc3QgTFZDU19Wb2xDb3JyZWN0X3QgKnBMVkNTX1ZvbENvcnJlY3RUYWJsZTsKKyAgICAgICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ICE9IHBQYXJhbXMtPlNvdXJjZUZvcm1hdCkpIHsKKyAgICAgICAgY29uc3QgTFZDU19Wb2xDb3JyZWN0X3QqIHBMVkNTX1ZvbENvcnJlY3RUYWJsZTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBHZXQgdGhlIHZvbHVtZSBjb3JyZWN0aW9uIHBhcmFtZXRlcnMKICAgICAgICAgICovCiAgICAgICAgIC8qIFVzZSBpbnRlcm5hbCBjb2VmZmljaWVudCB0YWJsZSAqLwogICAgICAgICBwTFZDU19Wb2xDb3JyZWN0VGFibGUgPSAoTFZDU19Wb2xDb3JyZWN0X3QqKSZMVkNTX1ZvbENvcnJlY3RUYWJsZVswXTsKLSAgICAgICAgT2Zmc2V0ID0gKExWTV9JTlQxNikocFBhcmFtcy0+U3BlYWtlclR5cGUgKyBwUGFyYW1zLT5Tb3VyY2VGb3JtYXQqKDErTFZDU19FWF9IRUFEUEhPTkVTKSk7CisgICAgICAgIE9mZnNldCA9IChMVk1fSU5UMTYpKHBQYXJhbXMtPlNwZWFrZXJUeXBlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+U291cmNlRm9ybWF0ICogKDEgKyBMVkNTX0VYX0hFQURQSE9ORVMpKTsKIAogICAgICAgICBwSW5zdGFuY2UtPlZvbENvcnJlY3QgPSBwTFZDU19Wb2xDb3JyZWN0VGFibGVbT2Zmc2V0XTsKIAogICAgICAgICAvKiBVcGRhdGUgdGhlIGVmZmVjdCBsZXZlbCBhbmQgYWxwaGEtbWl4ZXIgZ2FpbnMgKi8KLSAgICAgICAgZXJyPUxWQ1NfQnlwYXNzTWl4SW5pdChoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsKKyAgICAgICAgZXJyID0gTFZDU19CeXBhc3NNaXhJbml0KGhJbnN0YW5jZSwgcFBhcmFtcyk7CiAKLSAgICAgICAgaWYoZXJyICE9IExWQ1NfU1VDQ0VTUykKLSAgICAgICAgeworICAgICAgICBpZiAoZXJyICE9IExWQ1NfU1VDQ0VTUykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zID0gKnBQYXJhbXM7CiAgICAgfQogCkBAIC0xODksNDAgKzE3NCwzOCBAQAogICAgIHBJbnN0YW5jZS0+UGFyYW1zID0gKnBQYXJhbXM7CiAKICAgICAvKiBTdGF5IG9uIHRoZSBjdXJyZW50IG9wZXJhdGluZyBtb2RlIHVudGlsIHRoZSB0cmFuc2l0aW9uIGlzIGRvbmUgKi8KLSAgICBpZigocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBPcGVyYXRpbmdNb2RlU2F2ZSkgfHwKLSAgICAgICAocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSkpewotCisgICAgaWYgKChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IE9wZXJhdGluZ01vZGVTYXZlKSB8fAorICAgICAgICAocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSkpIHsKICAgICAgICAgLyogU2V0IHRoZSByZXZlcmIgZGVsYXkgdGltZW91dCAqLwotICAgICAgICBpZihwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uICE9IExWTV9UUlVFKXsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gIT0gTFZNX1RSVUUpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+YlRpbWVyRG9uZSA9IExWTV9GQUxTRTsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMuVGltZUluTXMgPQotICAgICAgICAgICAgKExWTV9JTlQxNikoKChwSW5zdGFuY2UtPlJldmVyYmVyYXRpb24uRGVsYXlTaXplIDw8IDIpCi0gICAgICAgICAgICAvcEluc3RhbmNlLT5UaW1lclBhcmFtcy5TYW1wbGluZ1JhdGUpICsgMSk7Ci0gICAgICAgICAgICBMVk1fVGltZXJfSW5pdCAoICZwSW5zdGFuY2UtPlRpbWVySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlRpbWVyUGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoKChwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzID09IEZDQ18xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBJbnN0YW5jZS0+UmV2ZXJiZXJhdGlvbi5EZWxheVNpemUgPDwgMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwSW5zdGFuY2UtPlJldmVyYmVyYXRpb24uRGVsYXlTaXplIDw8IDIpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMuU2FtcGxpbmdSYXRlKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICAgICAgTFZNX1RpbWVyX0luaXQoJnBJbnN0YW5jZS0+VGltZXJJbnN0YW5jZSwgJnBJbnN0YW5jZS0+VGltZXJQYXJhbXMpOwogICAgICAgICB9CiAKICAgICAgICAgLyogVXBkYXRlIHRoZSBlZmZlY3QgbGV2ZWwgYW5kIGFscGhhLW1peGVyIGdhaW5zICovCi0gICAgICAgIGVycj1MVkNTX0J5cGFzc01peEluaXQoaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7CisgICAgICAgIGVyciA9IExWQ1NfQnlwYXNzTWl4SW5pdChoSW5zdGFuY2UsIHBQYXJhbXMpOwogCiAgICAgICAgIC8qIENoYW5nZSB0cmFuc2l0aW9uIGJ5cGFzcyBtaXhlciBzZXR0aW5ncyBpZiBuZWVkZWQgZGVwZW5kaW5nIG9uIHRyYW5zaXRpb24gdHlwZSAqLwotICAgICAgICBpZihwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWQ1NfT0ZGKXsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+TVNUYXJnZXQwPUxWTV9NQVhJTlRfMTY7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPk1TVGFyZ2V0MT0wOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICBpZiAocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVkNTX09GRikgeworICAgICAgICAgICAgcEluc3RhbmNlLT5NU1RhcmdldDAgPSBMVk1fTUFYSU5UXzE2OworICAgICAgICAgICAgcEluc3RhbmNlLT5NU1RhcmdldDEgPSAwOworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IE9wZXJhdGluZ01vZGVTYXZlOwotICAgICAgICAgICAgcEluc3RhbmNlLT5NU1RhcmdldDE9TFZNX01BWElOVF8xNjsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+TVNUYXJnZXQwPTA7CisgICAgICAgICAgICBwSW5zdGFuY2UtPk1TVGFyZ2V0MSA9IExWTV9NQVhJTlRfMTY7CisgICAgICAgICAgICBwSW5zdGFuY2UtPk1TVGFyZ2V0MCA9IDA7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBTZXQgdHJhbnNpdGlvbiBmbGFnICovCiAgICAgICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPSBMVk1fVFJVRTsKICAgICB9CiAKLSAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWQ1NfU1VDQ0VTUyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjMzLDEyICsyMTYsMTEgQEAKIC8qICBDYWxsQmFjayBmdW5jdGlvbiBvZiB0aGUgVGltZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZDU19UaW1lckNhbGxCYWNrICh2b2lkKiBoSW5zdGFuY2UsIHZvaWQqIHBDYWxsQmFja1BhcmFtcywgTFZNX0lOVDMyIENhbGxiYWNrUGFyYW0pCi17Ci0gICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlICA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwordm9pZCBMVkNTX1RpbWVyQ2FsbEJhY2sodm9pZCogaEluc3RhbmNlLCB2b2lkKiBwQ2FsbEJhY2tQYXJhbXMsIExWTV9JTlQzMiBDYWxsYmFja1BhcmFtKSB7CisgICAgTFZDU19JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90KiloSW5zdGFuY2U7CiAKICAgICAvKiBBdm9pZCB3YXJuaW5ncyBiZWNhdXNlIHBDYWxsQmFja1BhcmFtcyBhbmQgQ2FsbGJhY2tQYXJhbSBhcmUgbm90IHVzZWQqLwotICAgIGlmKChwQ2FsbEJhY2tQYXJhbXMgIT0gTFZNX05VTEwpIHx8IChDYWxsYmFja1BhcmFtICE9IDApKXsKKyAgICBpZiAoKHBDYWxsQmFja1BhcmFtcyAhPSBMVk1fTlVMTCkgfHwgKENhbGxiYWNrUGFyYW0gIT0gMCkpIHsKICAgICAgICAgcENhbGxCYWNrUGFyYW1zID0gaEluc3RhbmNlOwogICAgICAgICBDYWxsYmFja1BhcmFtID0gMDsKICAgICAgICAgcmV0dXJuOwpAQCAtMjQ4LDQgKzIzMCwzIEBACiAKICAgICByZXR1cm47CiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5jcHAKaW5kZXggNDMxYjdlMy4uMmI2MjhmMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSAiTFZDUy5oIgogI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkxWQ1NfRXF1YWxpc2VyLmgiCkBAIC01Myw2OCArNTQsMzEgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VySW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQoteworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXJJbml0KExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBMVkNTX1BhcmFtc190KiBwUGFyYW1zKSB7CisgICAgTFZNX1VJTlQxNiBPZmZzZXQ7CisgICAgTFZDU19JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCogcEVxdWFsaXNlckNvZWZUYWJsZTsKIAotICAgIExWTV9VSU5UMTYgICAgICAgICAgT2Zmc2V0OwotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWQ1NfRXF1YWxpc2VyX3QgICAgKnBDb25maWcgICA9IChMVkNTX0VxdWFsaXNlcl90ICopJnBJbnN0YW5jZS0+RXF1YWxpc2VyOwotICAgIExWQ1NfRGF0YV90ICAgICAgICAgKnBEYXRhOwotICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgKnBDb2VmZmljaWVudHM7Ci0gICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgIENvZWZmczsKLSAgICBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICpwRXF1YWxpc2VyQ29lZlRhYmxlOwotCi0gICAgcERhdGEgPSAoTFZDU19EYXRhX3QgKikgXAotICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7Ci0KLSAgICBwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKSBcCi0gICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKICAgICAvKgogICAgICAqIElmIHRoZSBzYW1wbGUgcmF0ZSBjaGFuZ2VzIHJlLWluaXRpYWxpc2UgdGhlIGZpbHRlcnMKICAgICAgKi8KICAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKLSAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlICE9IHBQYXJhbXMtPlNwZWFrZXJUeXBlKSkKLSAgICB7CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAhPSBwUGFyYW1zLT5TcGVha2VyVHlwZSkpIHsKICAgICAgICAgLyoKICAgICAgICAgICogU2V0dXAgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgYW5kIGNsZWFyIHRoZSBoaXN0b3J5CiAgICAgICAgICAqLwogICAgICAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNikocFBhcmFtcy0+U2FtcGxlUmF0ZSArIChwUGFyYW1zLT5TcGVha2VyVHlwZSAqICgxICsgTFZNX0ZTXzQ4MDAwKSkpOwogICAgICAgICBwRXF1YWxpc2VyQ29lZlRhYmxlID0gKEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QqKSZMVkNTX0VxdWFsaXNlckNvZWZUYWJsZVswXTsKIAotICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCBmaWx0ZXJzICovCi0gICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KLSAgICAgICAgQ29lZmZzLkEwID0gKExWTV9GTE9BVCkgcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkEwOwotICAgICAgICBDb2VmZnMuQTEgPSAoTFZNX0ZMT0FUKSBwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQTE7Ci0gICAgICAgIENvZWZmcy5BMiA9IChMVk1fRkxPQVQpIHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5BMjsKLSAgICAgICAgQ29lZmZzLkIxID0gKExWTV9GTE9BVCktcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkIxOwotICAgICAgICBDb2VmZnMuQjIgPSAoTFZNX0ZMT0FUKS1wRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQjI7Ci0KLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KChMVk1fSU5UMTYpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopJnBEYXRhLT5FcXVhbGlzZXJCaXF1YWRUYXBzLCAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5FcXVhbGlzZXJCaXF1YWRUYXBzKSAvIHNpemVvZihMVk1fRkxPQVQpKSk7Ci0KLSAgICAgICAgQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50cy0+RXF1YWxpc2VyQmlxdWFkSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5FcXVhbGlzZXJCaXF1YWRUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnMpOwotCi0gICAgICAgIC8qIENhbGxiYWNrcyAqLwotICAgICAgICBzd2l0Y2gocEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLlNjYWxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKyAgICAgICAgc3RkOjphcnJheTxMVk1fRkxPQVQsIGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjprQmlxdWFkTnVtQ29lZnM+IGNvZWZzID0geworICAgICAgICAgICAgICAgIHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5BMCwgcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkExLAorICAgICAgICAgICAgICAgIHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5BMiwgcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkIxLAorICAgICAgICAgICAgICAgIHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5CMn07CisgICAgICAgIHBJbnN0YW5jZS0+cEVxQmlxdWFkLnJlc2V0KG5ldyBhbmRyb2lkOjphdWRpb191dGlsczo6QmlxdWFkRmlsdGVyPExWTV9GTE9BVD4oCisgICAgICAgICAgICAgICAgKHBQYXJhbXMtPk5yQ2hhbm5lbHMgPT0gRkNDXzEpID8gRkNDXzEgOiBGQ0NfMiwgY29lZnMpKTsKICAgICB9CiAKLSAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWQ1NfU1VDQ0VTUyk7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEzNSwzMCArOTksMTcgQEAKIC8qICAxLiAgQWx3YXlzIHByb2Nlc3NlcyBpbiBwbGFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VyKExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcElucHV0T3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKQotewotCi0gICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZDU19FcXVhbGlzZXJfdCAgICAqcENvbmZpZyAgID0gKExWQ1NfRXF1YWxpc2VyX3QgICopJnBJbnN0YW5jZS0+RXF1YWxpc2VyOwotICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgKnBDb2VmZmljaWVudHM7Ci0KLSAgICBwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKSBcCi0gICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXIoTFZDU19IYW5kbGVfdCBoSW5zdGFuY2UsIExWTV9GTE9BVCogcElucHV0T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKSB7CisgICAgTFZDU19JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90KiloSW5zdGFuY2U7CiAKICAgICAvKgogICAgICAqIENoZWNrIGlmIHRoZSBlcXVhbGlzZXIgaXMgcmVxdWlyZWQKICAgICAgKi8KLSAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgJiBMVkNTX0VRVUFMSVNFUlNXSVRDSCkgIT0gMCkKLSAgICB7CisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19FUVVBTElTRVJTV0lUQ0gpICE9IDApIHsKICAgICAgICAgLyogQXBwbHkgZmlsdGVyIHRvIHRoZSBsZWZ0IGFuZCByaWdodCBjaGFubmVscyAqLwotICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrKSgoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDb2VmZmljaWVudHMtPkVxdWFsaXNlckJpcXVhZEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5wdXRPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbnB1dE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICBwSW5zdGFuY2UtPnBFcUJpcXVhZC0+cHJvY2VzcyhwSW5wdXRPdXRwdXQsIHBJbnB1dE91dHB1dCwgTnVtU2FtcGxlcyk7CiAgICAgfQogCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVkNTX1NVQ0NFU1MpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5oCmluZGV4IDkxOGQ5MzEuLjUyMzczNDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmgKQEAgLTIzLDIzICsyMywxNCBAQAogLyogICAgU3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBFcXVhbGlzZXIgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIHZvaWQgKCpwQmlxdWFkQ2FsbEJhY2spIChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCosIExWTV9GTE9BVCosIExWTV9GTE9BVCosIExWTV9JTlQxNik7Ci19IExWQ1NfRXF1YWxpc2VyX3Q7Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgRnVuY3Rpb24gcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlckluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAqcFBhcmFtcyk7Ci1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlcihMVkNTX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICpwSW5wdXRPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXJJbml0KExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBMVkNTX1BhcmFtc190KiBwUGFyYW1zKTsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VyKExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBMVk1fRkxPQVQqIHBJbnB1dE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgTnVtU2FtcGxlcyk7CiAKLSNlbmRpZiAgLyogRVFVQUxJU0VSX0ggKi8KKyNlbmRpZiAvKiBFUVVBTElTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKaW5kZXggYzdlZTIzMi4uNjljNDZjNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oCkBAIC0yNCwyMDEgKzI0LDIwMSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MTI1OCAqLwotI2RlZmluZSBDU19NSURETEVfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjI3NzIwCi0jZGVmaW5lIENTX01JRERMRV84MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE1MTI1KQotI2RlZmluZSBDU19NSURETEVfODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV84MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTIxODk5KQotI2RlZmluZSBDU19NSURETEVfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgQ1NfU0lERV84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjYxMTQ0MQotI2RlZmluZSBDU19TSURFXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjM4MDM0NCkKLSNkZWZpbmUgQ1NfU0lERV84MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMzEwOTcpCi0jZGVmaW5lIENTX1NJREVfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjIyNDcwKQotI2RlZmluZSBDU19TSURFXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjEzMDc1OSkKLSNkZWZpbmUgQ1NfU0lERV84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX01JRERMRV84MDAwX0EwIDAuMjI3NzIwCisjZGVmaW5lIENTX01JRERMRV84MDAwX0ExICgtMC4yMTUxMjUpCisjZGVmaW5lIENTX01JRERMRV84MDAwX0EyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV84MDAwX0IxICgtMC45MjE4OTkpCisjZGVmaW5lIENTX01JRERMRV84MDAwX0IyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV84MDAwX1NDQUxFIDE1CisjZGVmaW5lIENTX1NJREVfODAwMF9BMCAwLjYxMTQ0MQorI2RlZmluZSBDU19TSURFXzgwMDBfQTEgKC0wLjM4MDM0NCkKKyNkZWZpbmUgQ1NfU0lERV84MDAwX0EyICgtMC4yMzEwOTcpCisjZGVmaW5lIENTX1NJREVfODAwMF9CMSAoLTAuNjIyNDcwKQorI2RlZmluZSBDU19TSURFXzgwMDBfQjIgKC0wLjEzMDc1OSkKKyNkZWZpbmUgQ1NfU0lERV84MDAwX1NDQUxFIDE1CiAKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDExMDI1SHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYyOTQzICovCi0jZGVmaW5lIENTX01JRERMRV8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4yMzA4MzgKLSNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAgICgtMC4yMjE1NTkpCi0jZGVmaW5lIENTX01JRERMRV8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMC45NDMwNTYpCi0jZGVmaW5lIENTX01JRERMRV8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgICAxNQotI2RlZmluZSBDU19TSURFXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTU3MzcyCi0jZGVmaW5lIENTX1NJREVfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzkxNDkwKQotI2RlZmluZSBDU19TSURFXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjE2NTg4MSkKLSNkZWZpbmUgQ1NfU0lERV8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICgtMC44ODA2MDgpCi0jZGVmaW5lIENTX1NJREVfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMzIzOTcKLSNkZWZpbmUgQ1NfU0lERV8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19NSURETEVfMTEwMjVfQTAgMC4yMzA4MzgKKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0ExICgtMC4yMjE1NTkpCisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9BMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTEwMjVfQjEgKC0wLjk0MzA1NikKKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0IyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9TQ0FMRSAxNQorI2RlZmluZSBDU19TSURFXzExMDI1X0EwIDAuNTU3MzcyCisjZGVmaW5lIENTX1NJREVfMTEwMjVfQTEgKC0wLjM5MTQ5MCkKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9BMiAoLTAuMTY1ODgxKQorI2RlZmluZSBDU19TSURFXzExMDI1X0IxICgtMC44ODA2MDgpCisjZGVmaW5lIENTX1NJREVfMTEwMjVfQjIgMC4wMzIzOTcKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9TQ0FMRSAxNQogCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxMjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MjE5MSAqLwotI2RlZmluZSBDU19NSURETEVfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAwLjIyOTkzMgotI2RlZmluZSBDU19NSURETEVfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMjE0MzYpCi0jZGVmaW5lIENTX01JRERMRV8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV8xMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0wLjk0NzYxNikKLSNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgQ1NfU0lERV8xMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAwLjU1ODM5OAotI2RlZmluZSBDU19TSURFXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjM5MjIxMSkKLSNkZWZpbmUgQ1NfU0lERV8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICgtMC4xNjYxODcpCi0jZGVmaW5lIENTX1NJREVfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODkyNTUwKQotI2RlZmluZSBDU19TSURFXzEyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDMyODU2Ci0jZGVmaW5lIENTX1NJREVfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX01JRERMRV8xMjAwMF9BMCAwLjIyOTkzMgorI2RlZmluZSBDU19NSURETEVfMTIwMDBfQTEgKC0wLjIyMTQzNikKKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0EyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8xMjAwMF9CMSAoLTAuOTQ3NjE2KQorI2RlZmluZSBDU19NSURETEVfMTIwMDBfQjIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX1NDQUxFIDE1CisjZGVmaW5lIENTX1NJREVfMTIwMDBfQTAgMC41NTgzOTgKKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9BMSAoLTAuMzkyMjExKQorI2RlZmluZSBDU19TSURFXzEyMDAwX0EyICgtMC4xNjYxODcpCisjZGVmaW5lIENTX1NJREVfMTIwMDBfQjEgKC0wLjg5MjU1MCkKKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9CMiAwLjAzMjg1NgorI2RlZmluZSBDU19TSURFXzEyMDAwX1NDQUxFIDE1CiAKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDE2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYyMzcxICovCi0jZGVmaW5lIENTX01JRERMRV8xNjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4yMzA2MzgKLSNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMC4yMjQyMzIpCi0jZGVmaW5lIENTX01JRERMRV8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMC45NjA1NTApCi0jZGVmaW5lIENTX01JRERMRV8xNjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgQ1NfU0lERV8xNjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAwLjQ5OTY5NQotI2RlZmluZSBDU19TSURFXzE2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjM1NTU0MykKLSNkZWZpbmUgQ1NfU0lERV8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICgtMC4xNDQxNTIpCi0jZGVmaW5lIENTX1NJREVfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMDUwNzg4KQotI2RlZmluZSBDU19TSURFXzE2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTQ0MTA0Ci0jZGVmaW5lIENTX1NJREVfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9BMCAwLjIzMDYzOAorI2RlZmluZSBDU19NSURETEVfMTYwMDBfQTEgKC0wLjIyNDIzMikKKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0EyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9CMSAoLTAuOTYwNTUwKQorI2RlZmluZSBDU19NSURETEVfMTYwMDBfQjIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX1NDQUxFIDE1CisjZGVmaW5lIENTX1NJREVfMTYwMDBfQTAgMC40OTk2OTUKKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9BMSAoLTAuMzU1NTQzKQorI2RlZmluZSBDU19TSURFXzE2MDAwX0EyICgtMC4xNDQxNTIpCisjZGVmaW5lIENTX1NJREVfMTYwMDBfQjEgKC0xLjA1MDc4OCkKKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9CMiAwLjE0NDEwNAorI2RlZmluZSBDU19TSURFXzE2MDAwX1NDQUxFIDE0CiAKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDIyMDUwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYwNzgxICovCi0jZGVmaW5lIENTX01JRERMRV8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4yMjg3NDkKLSNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMC4yMjQxMjgpCi0jZGVmaW5lIENTX01JRERMRV8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMC45NzEyNjIpCi0jZGVmaW5lIENTX01JRERMRV8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC40NDAxMTIKLSNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjYxMDk2KQotI2RlZmluZSBDU19TSURFXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4xNzkwMTYpCi0jZGVmaW5lIENTX1NJREVfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjExNjc4NikKLSNkZWZpbmUgQ1NfU0lERV8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODI1MDcKLSNkZWZpbmUgQ1NfU0lERV8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0EwIDAuMjI4NzQ5CisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9BMSAoLTAuMjI0MTI4KQorI2RlZmluZSBDU19NSURETEVfMjIwNTBfQTIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0IxICgtMC45NzEyNjIpCisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9CMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMjIwNTBfU0NBTEUgMTUKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMCAwLjQ0MDExMgorI2RlZmluZSBDU19TSURFXzIyMDUwX0ExICgtMC4yNjEwOTYpCisjZGVmaW5lIENTX1NJREVfMjIwNTBfQTIgKC0wLjE3OTAxNikKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9CMSAoLTEuMTE2Nzg2KQorI2RlZmluZSBDU19TSURFXzIyMDUwX0IyIDAuMTgyNTA3CisjZGVmaW5lIENTX1NJREVfMjIwNTBfU0NBTEUgMTQKIAogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMjQwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjE4ODIgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjMwMzk1Ci0jZGVmaW5lIENTX01JRERMRV8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMjYxMTcpCi0jZGVmaW5lIENTX01JRERMRV8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfMjQwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTczNTczKQotI2RlZmluZSBDU19NSURETEVfMjQwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgQ1NfU0lERV8yNDAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDE0NzcwCi0jZGVmaW5lIENTX1NJREVfMjQwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yODcxODIpCi0jZGVmaW5lIENTX1NJREVfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4xMjc1ODgpCi0jZGVmaW5lIENTX1NJREVfMjQwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4yMjk2NDgpCi0jZGVmaW5lIENTX1NJREVfMjQwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI4MjE3NwotI2RlZmluZSBDU19TSURFXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU19NSURETEVfMjQwMDBfQTAgMC4yMzAzOTUKKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0ExICgtMC4yMjYxMTcpCisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9BMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMjQwMDBfQjEgKC0wLjk3MzU3MykKKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0IyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9TQ0FMRSAxNQorI2RlZmluZSBDU19TSURFXzI0MDAwX0EwIDAuNDE0NzcwCisjZGVmaW5lIENTX1NJREVfMjQwMDBfQTEgKC0wLjI4NzE4MikKKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9BMiAoLTAuMTI3NTg4KQorI2RlZmluZSBDU19TSURFXzI0MDAwX0IxICgtMS4yMjk2NDgpCisjZGVmaW5lIENTX1NJREVfMjQwMDBfQjIgMC4yODIxNzcKKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9TQ0FMRSAxNAogCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAzMjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MDMyMiAqLwotI2RlZmluZSBDU19NSURETEVfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjI4NDAwCi0jZGVmaW5lIENTX01JRERMRV8zMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjI1MjE0KQotI2RlZmluZSBDU19NSURETEVfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTgwMTI2KQotI2RlZmluZSBDU19NSURETEVfMzIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0jZGVmaW5lIENTX1NJREVfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjQ1NzkKLSNkZWZpbmUgQ1NfU0lERV8zMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMDczNTUpCi0jZGVmaW5lIENTX1NJREVfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMTU3MjI0KQotI2RlZmluZSBDU19TSURFXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjI3NDIzMSkKLSNkZWZpbmUgQ1NfU0lERV8zMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMxMjQ5NQotI2RlZmluZSBDU19TSURFXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU19NSURETEVfMzIwMDBfQTAgMC4yMjg0MDAKKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0ExICgtMC4yMjUyMTQpCisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9BMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMzIwMDBfQjEgKC0wLjk4MDEyNikKKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0IyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9TQ0FMRSAxNQorI2RlZmluZSBDU19TSURFXzMyMDAwX0EwIDAuMzY0NTc5CisjZGVmaW5lIENTX1NJREVfMzIwMDBfQTEgKC0wLjIwNzM1NSkKKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9BMiAoLTAuMTU3MjI0KQorI2RlZmluZSBDU19TSURFXzMyMDAwX0IxICgtMS4yNzQyMzEpCisjZGVmaW5lIENTX1NJREVfMzIwMDBfQjIgMC4zMTI0OTUKKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9TQ0FMRSAxNAogCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciA0NDEwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MzgzNCAqLwotI2RlZmluZSBDU19NSURETEVfNDQxMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzMzU5MwotI2RlZmluZSBDU19NSURETEVfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMC4yMzEyMjUpCi0jZGVmaW5lIENTX01JRERMRV80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0wLjk4NTU0NSkKLSNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4yODQ1NzMKLSNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTAuMjU4OTEwKQotI2RlZmluZSBDU19TSURFXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMjU2NjIpCi0jZGVmaW5lIENTX1NJREVfNDQxMDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjU3MjI0OCkKLSNkZWZpbmUgQ1NfU0lERV80NDEwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC41ODgzOTkKLSNkZWZpbmUgQ1NfU0lERV80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTX01JRERMRV80NDEwMF9BMCAwLjIzMzU5MworI2RlZmluZSBDU19NSURETEVfNDQxMDBfQTEgKC0wLjIzMTIyNSkKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0EyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV80NDEwMF9CMSAoLTAuOTg1NTQ1KQorI2RlZmluZSBDU19NSURETEVfNDQxMDBfQjIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX1NDQUxFIDE1CisjZGVmaW5lIENTX1NJREVfNDQxMDBfQTAgMC4yODQ1NzMKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMSAoLTAuMjU4OTEwKQorI2RlZmluZSBDU19TSURFXzQ0MTAwX0EyICgtMC4wMjU2NjIpCisjZGVmaW5lIENTX1NJREVfNDQxMDBfQjEgKC0xLjU3MjI0OCkKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9CMiAwLjU4ODM5OQorI2RlZmluZSBDU19TSURFXzQ0MTAwX1NDQUxFIDE0CiAKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDQ4MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTY0NDAyICovCi0jZGVmaW5lIENTX01JRERMRV80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjM0NDQ1Ci0jZGVmaW5lIENTX01JRERMRV80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAgKC0wLjIzMjI2MSkKLSNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTAuOTg2NzEzKQotI2RlZmluZSBDU19NSURETEVfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQotI2RlZmluZSBDU19TSURFXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yNzI2MDYKLSNkZWZpbmUgQ1NfU0lERV80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAgKC0wLjI2Njk1MikKLSNkZWZpbmUgQ1NfU0lERV80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwNTY1NCkKLSNkZWZpbmUgQ1NfU0lERV80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjYxNzE0MSkKLSNkZWZpbmUgQ1NfU0lERV80ODAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuNjMwNDA1Ci0jZGVmaW5lIENTX1NJREVfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTX01JRERMRV80ODAwMF9BMCAwLjIzNDQ0NQorI2RlZmluZSBDU19NSURETEVfNDgwMDBfQTEgKC0wLjIzMjI2MSkKKyNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0EyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9CMSAoLTAuOTg2NzEzKQorI2RlZmluZSBDU19NSURETEVfNDgwMDBfQjIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX1NDQUxFIDE1CisjZGVmaW5lIENTX1NJREVfNDgwMDBfQTAgMC4yNzI2MDYKKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9BMSAoLTAuMjY2OTUyKQorI2RlZmluZSBDU19TSURFXzQ4MDAwX0EyICgtMC4wMDU2NTQpCisjZGVmaW5lIENTX1NJREVfNDgwMDBfQjEgKC0xLjYxNzE0MSkKKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9CMiAwLjYzMDQwNQorI2RlZmluZSBDU19TSURFXzQ4MDAwX1NDQUxFIDE0CiAKIC8qIENvZWZmaWNpZW50cyBmb3IgODgyMDBIeiBzYW1wbGUgcmF0ZS4KICAqIFRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFyZSBvYnRhaW5lZCBieSBjYXJyeWluZyBvdXQKICAqIHN0YXRlLXNwYWNlIGFuYWx5c2lzIHVzaW5nIHRoZSBjb2VmZmljaWVudHMgYXZhaWxhYmxlCiAgKiBmb3IgNDQxMDBIei4KICAqLwotI2RlZmluZSBDU19NSURETEVfODgyMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzMzg0NmYKLSNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0ExICAgICAgICAgICAgICAgICAgICAgKC0wLjIzMjY1N2YpCi0jZGVmaW5lIENTX01JRERMRV84ODIwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBDU19NSURETEVfODgyMDBfQjEgICAgICAgICAgICAgICAgICAgICAoLTAuOTkyNzQ3ZikKLSNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIENTX01JRERMRV84ODIwMF9TQ0FMRSAgICAgICAgICAgICAgICAgIDE1Ci0jZGVmaW5lIENTX1NJREVfODgyMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjMxNTQxZgotI2RlZmluZSBDU19TSURFXzg4MjAwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjg5NTg2ZikKLSNkZWZpbmUgQ1NfU0lERV84ODIwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC4wNTgwNDVmCi0jZGVmaW5lIENTX1NJREVfODgyMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS43NjUzMDBmKQotI2RlZmluZSBDU19TSURFXzg4MjAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjc2OTgxNmYKLSNkZWZpbmUgQ1NfU0lERV84ODIwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0EwIDAuMjMzODQ2ZgorI2RlZmluZSBDU19NSURETEVfODgyMDBfQTEgKC0wLjIzMjY1N2YpCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9BMiAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0IxICgtMC45OTI3NDdmKQorI2RlZmluZSBDU19NSURETEVfODgyMDBfQjIgMC4wMDAwMDBmCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9TQ0FMRSAxNQorI2RlZmluZSBDU19TSURFXzg4MjAwX0EwIDAuMjMxNTQxZgorI2RlZmluZSBDU19TSURFXzg4MjAwX0ExICgtMC4yODk1ODZmKQorI2RlZmluZSBDU19TSURFXzg4MjAwX0EyIDAuMDU4MDQ1ZgorI2RlZmluZSBDU19TSURFXzg4MjAwX0IxICgtMS43NjUzMDBmKQorI2RlZmluZSBDU19TSURFXzg4MjAwX0IyIDAuNzY5ODE2ZgorI2RlZmluZSBDU19TSURFXzg4MjAwX1NDQUxFIDE0CiAKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDk2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoICAwLjE2NSovCiAvKiBoaWdoIHBhc3MgZmlsdGVyIHdpdGggY3V0b2ZmIGZyZXF1ZW5jeSAxMDIuMTggSHoqLwotI2RlZmluZSBDU19NSURETEVfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzNTUzMgotI2RlZmluZSBDU19NSURETEVfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMC4yMzQ0MzIpCi0jZGVmaW5lIENTX01JRERMRV85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0wLjk5MzMzNCkKLSNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0EwIDAuMjM1NTMyCisjZGVmaW5lIENTX01JRERMRV85NjAwMF9BMSAoLTAuMjM0NDMyKQorI2RlZmluZSBDU19NSURETEVfOTYwMDBfQTIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0IxICgtMC45OTMzMzQpCisjZGVmaW5lIENTX01JRERMRV85NjAwMF9CMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfOTYwMDBfU0NBTEUgMTUKIC8qIENvZWZmaWNpZW50cyBjYWxjdWxhdGVkIHVzaW5nIHRmMnNzIGFuZCBzczJ0ZiBmdW5jdGlvbnMgYmFzZWQgb24KICAqIGNvZWZmaWNpZW50cyBhdmFpbGFibGUgZm9yIDQ4MDAwSHogc2FtcGxpbmcgZnJlcXVlbmN5CiAgKi8KLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjI0MzI2ZgotI2RlZmluZSBDU19TSURFXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgKC0wLjI5NDkzN2YpCi0jZGVmaW5lIENTX1NJREVfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjA3MDYxMWYKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS43OTIxNjZmKQotI2RlZmluZSBDU19TSURFXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC43OTU4MzBmCi0jZGVmaW5lIENTX1NJREVfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU19TSURFXzk2MDAwX0EwIDAuMjI0MzI2ZgorI2RlZmluZSBDU19TSURFXzk2MDAwX0ExICgtMC4yOTQ5MzdmKQorI2RlZmluZSBDU19TSURFXzk2MDAwX0EyIDAuMDcwNjExZgorI2RlZmluZSBDU19TSURFXzk2MDAwX0IxICgtMS43OTIxNjZmKQorI2RlZmluZSBDU19TSURFXzk2MDAwX0IyIDAuNzk1ODMwZgorI2RlZmluZSBDU19TSURFXzk2MDAwX1NDQUxFIDE0CiAKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDE3NjQwMEh6IHNhbXBsZSByYXRlLgogICogVGhlIGZpbHRlciBjb2VmZmljaWVudHMgYXJlIG9idGFpbmVkIGJ5IGNhcnJ5aW5nIG91dAogICogc3RhdGUtc3BhY2UgYW5hbHlzaXMgdXNpbmcgdGhlIGNvZWZmaWNpZW50cyBhdmFpbGFibGUKICAqIGZvciA0NDEwMEh6LgogICovCi0jZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzMzk3M2YKLSNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9BMSAgICAgICAgICAgICAgICAgICAgICgtMC4yMzMzNzhmKQotI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQjEgICAgICAgICAgICAgICAgICAgICAoLTAuOTk2MzY3ZikKLSNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBDU19NSURETEVfMTc2NDAwX1NDQUxFICAgICAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMTk5ODM2ZgotI2RlZmluZSBDU19TSURFXzE3NjQwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0wLjMwNzU0NGYpCi0jZGVmaW5lIENTX1NJREVfMTc2NDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjEwNzcwOGYKLSNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS44NzY1NzJmKQotI2RlZmluZSBDU19TSURFXzE3NjQwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC44Nzc3NzFmCi0jZGVmaW5lIENTX1NJREVfMTc2NDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0EwIDAuMjMzOTczZgorI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0ExICgtMC4yMzMzNzhmKQorI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0EyIDAuMDAwMDAwZgorI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0IxICgtMC45OTYzNjdmKQorI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0IyIDAuMDAwMDAwZgorI2RlZmluZSBDU19NSURETEVfMTc2NDAwX1NDQUxFIDE1CisjZGVmaW5lIENTX1NJREVfMTc2NDAwX0EwIDAuMTk5ODM2ZgorI2RlZmluZSBDU19TSURFXzE3NjQwMF9BMSAoLTAuMzA3NTQ0ZikKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQTIgMC4xMDc3MDhmCisjZGVmaW5lIENTX1NJREVfMTc2NDAwX0IxICgtMS44NzY1NzJmKQorI2RlZmluZSBDU19TSURFXzE3NjQwMF9CMiAwLjg3Nzc3MWYKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfU0NBTEUgMTQKIAogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTkyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoICAwLjE2ODkqLwotI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yNDEyMTkKLSNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAgKC0wLjI0MDY1NikKLSNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMC45OTY2NjEpCi0jZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9BMCAwLjI0MTIxOQorI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0ExICgtMC4yNDA2NTYpCisjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQTIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9CMSAoLTAuOTk2NjYxKQorI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0IyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfU0NBTEUgMTUKIC8qIENvZWZmaWNpZW50cyBjYWxjdWxhdGVkIHVzaW5nIHRmMnNzIGFuZCBzczJ0ZiBmdW5jdGlvbnMgYmFzZWQgb24KICAqIGNvZWZmaWNpZW50cyBhdmFpbGFibGUgZm9yIDQ4MDAwSHogc2FtcGxpbmcgZnJlcXVlbmN5CiAgKi8KLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgIDAuMTk2MDM5ZgotI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAgKC0wLjMxMTAyN2YpCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAwLjExNDk4OGYKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMS44OTEzODBmKQotI2RlZmluZSBDU19TSURFXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgMC44OTIzNDYwZgotI2RlZmluZSBDU19TSURFXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTAgMC4xOTYwMzlmCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0ExICgtMC4zMTEwMjdmKQorI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMiAwLjExNDk4OGYKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjEgKC0xLjg5MTM4MGYpCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0IyIDAuODkyMzQ2MGYKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfU0NBTEUgMTQKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMjcsMTMzICsyMjcsMTMzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBSZXZlcmIgZGVsYXkgc2V0dGluZ3MgaW4gc2FtcGxlcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzhLSFogICAgICAgICAgICAgICAgICAgICA5MyAgICAgICAgIC8qIFNhbXBsZSByYXRlIDhrUy9zICovCi0jZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTFLSFogICAgICAgICAgICAgICAgICAgMTI4ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTFrUy9zICovCi0jZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTJLSFogICAgICAgICAgICAgICAgICAgMTM5ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTJrUy9zICovCi0jZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTZLSFogICAgICAgICAgICAgICAgICAgMTg2ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTZrUy9zICovCi0jZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjJLSFogICAgICAgICAgICAgICAgICAgMjU2ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMjJrUy9zICovCi0jZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjRLSFogICAgICAgICAgICAgICAgICAgMjc5ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMjRrUy9zICovCi0jZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMzJLSFogICAgICAgICAgICAgICAgICAgMzcyICAgICAgICAgLyogU2FtcGxlIHJhdGUgMzJrUy9zICovCi0jZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDRLSFogICAgICAgICAgICAgICAgICAgNTEyICAgICAgICAgLyogU2FtcGxlIHJhdGUgNDRrUy9zICovCi0jZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFogICAgICAgICAgICAgICAgICAgNTU3ICAgICAgICAgLyogU2FtcGxlIHJhdGUgNDhrUy9zICovCi0jZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfODhLSFogICAgICAgICAgICAgICAgICAgMTAyNCAgICAgICAgLyogU2FtcGxlIHJhdGUgODguMmtTL3MgKi8KLSNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU185NktIWiAgICAgICAgICAgICAgICAgICAxMTE1ICAgICAgICAvKiBTYW1wbGUgcmF0ZSA5NmtTL3MgKi8KLSNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18xNzZLSFogICAgICAgICAgICAgICAgICAyMDQ4ICAgICAgICAvKiBTYW1wbGUgcmF0ZSAxNzYuNGtTL3MgKi8KLSNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18xOTJLSFogICAgICAgICAgICAgICAgICAyMjI5ICAgICAgICAvKiBTYW1wbGUgcmF0ZSAxOTZrUy9zICovCi0jZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfTUFYX1ZBTCAgICAgICAgICAgICAgICAgTFZDU19TVEVSRU9ERUxBWV9DU18xOTJLSFoKKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU184S0haIDkzICAgICAvKiBTYW1wbGUgcmF0ZSA4a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzExS0haIDEyOCAgIC8qIFNhbXBsZSByYXRlIDExa1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzEyS0haIDEzOSAgIC8qIFNhbXBsZSByYXRlIDEya1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzE2S0haIDE4NiAgIC8qIFNhbXBsZSByYXRlIDE2a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzIyS0haIDI1NiAgIC8qIFNhbXBsZSByYXRlIDIya1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzI0S0haIDI3OSAgIC8qIFNhbXBsZSByYXRlIDI0a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzMyS0haIDM3MiAgIC8qIFNhbXBsZSByYXRlIDMya1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzQ0S0haIDUxMiAgIC8qIFNhbXBsZSByYXRlIDQ0a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haIDU1NyAgIC8qIFNhbXBsZSByYXRlIDQ4a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzg4S0haIDEwMjQgIC8qIFNhbXBsZSByYXRlIDg4LjJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfOTZLSFogMTExNSAgLyogU2FtcGxlIHJhdGUgOTZrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTc2S0haIDIwNDggLyogU2FtcGxlIHJhdGUgMTc2LjRrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTkyS0haIDIyMjkgLyogU2FtcGxlIHJhdGUgMTk2a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTX01BWF9WQUwgTFZDU19TVEVSRU9ERUxBWV9DU18xOTJLSFoKIAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgODAwMCBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNjY3MjcxCi0jZGVmaW5lIENTX1JFVkVSQl84MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42NjcyNzEpCi0jZGVmaW5lIENTX1JFVkVSQl84MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjY4MTc5KQotI2RlZmluZSBDU19SRVZFUkJfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQTAgMC42NjcyNzEKKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQTEgKC0wLjY2NzI3MSkKKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQTIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQjEgKC0wLjY2ODE3OSkKKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQjIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfU0NBTEUgMTUKIAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMTEwMjVIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAgMC42OTk2MzgKLSNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAoLTAuNjk5NjM4KQotI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTYpCi0jZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9BMCAwLjY5OTYzOAorI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQTEgKC0wLjY5OTYzOCkKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0EyIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9CMSAoLTAuNzQ5MDk2KQorI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQjIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X1NDQUxFIDE1CiAKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDEyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCi0jZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9BMCAgICAgICAgICAgICAgICAgICAwLjcwNjkzMQotI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAoLTAuNzA2OTMxKQotI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgKC0wLjc2NzMyNykKLSNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0IyICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQTAgMC43MDY5MzEKKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0ExICgtMC43MDY5MzEpCisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9BMiAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQjEgKC0wLjc2NzMyNykKKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0IyIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9TQ0FMRSAxNQogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxNjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwotI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgMC43MjgyNzIKLSNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgKC0wLjcyODI3MikKLSNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICgtMC44MjA2NzkpCi0jZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQTAgMC43MjgyNzIKKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0ExICgtMC43MjgyNzIpCisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9BMiAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQjEgKC0wLjgyMDY3OSkKKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0IyIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9TQ0FMRSAxNQogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAyMjA1MEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwotI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgICAwLjUxNjM5NgotI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgICgtMC41MTYzOTYpCi0jZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9CMSAgICAgICAgICAgICAgICAgICAgKC0wLjUxODUxMikKLSNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgICAoLTAuMjkwOTkwKQotI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQTAgMC41MTYzOTYKKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0ExIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9BMiAoLTAuNTE2Mzk2KQorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQjEgKC0wLjUxODUxMikKKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0IyICgtMC4yOTA5OTApCisjZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9TQ0FMRSAxNQogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAyNDAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwotI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuNDc5NTY1Ci0jZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC40Nzk1NjUpCi0jZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTAuNjM3NzQ1KQotI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgKC0wLjE5ODkxMikKLSNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0EwIDAuNDc5NTY1CisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9BMSAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQTIgKC0wLjQ3OTU2NSkKKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0IxICgtMC42Mzc3NDUpCisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9CMiAoLTAuMTk4OTEyKQorI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfU0NBTEUgMTUKIAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMzIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMzgwMzQ5Ci0jZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMzgwMzQ5KQotI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAoLTAuOTUwODczKQotI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgMC4wNDkxMjcKLSNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0EwIDAuMzgwMzQ5CisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9BMSAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQTIgKC0wLjM4MDM0OSkKKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0IxICgtMC45NTA4NzMpCisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9CMiAwLjA0OTEyNworI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfU0NBTEUgMTUKIAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgNDQxMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjk3Mzg5Ci0jZGVmaW5lIENTX1JFVkVSQl80NDEwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjk3Mzg5KQotI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMjAwNDIzKQotI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTY1MjkKLSNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0EwIDAuMjk3Mzg5CisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9BMSAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQTIgKC0wLjI5NzM4OSkKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0IxICgtMS4yMDA0MjMpCisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9CMiAwLjI1NjUyOQorI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfU0NBTEUgMTQKIAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgNDgwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjI3ODY2MQotI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMjc4NjYxKQotI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjI1NDk5MykKLSNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjMwMzM0NwotI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQTAgMC4yNzg2NjEKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0ExIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9BMiAoLTAuMjc4NjYxKQorI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQjEgKC0xLjI1NDk5MykKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0IyIDAuMzAzMzQ3CisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9TQ0FMRSAxNAogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA4ODIwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjggKi8KIC8qIEJhbmQgcGFzcyBmaWx0ZXIgd2l0aCBmYzE9NTAwIGFuZCBmYzI9ODAwMCAqLwotI2RlZmluZSBDU19SRVZFUkJfODgyMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMTcxOTAxZgotI2RlZmluZSBDU19SRVZFUkJfODgyMDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBDU19SRVZFUkJfODgyMDBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjE3MTkwMWYpCi0jZGVmaW5lIENTX1JFVkVSQl84ODIwMF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuNTUzOTQ4ZikKLSNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0IyICAgICAgICAgICAgICAgICAgICAgICgwLjU3MDI0OGYpCi0jZGVmaW5lIENTX1JFVkVSQl84ODIwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfQTAgMC4xNzE5MDFmCisjZGVmaW5lIENTX1JFVkVSQl84ODIwMF9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0EyICgtMC4xNzE5MDFmKQorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfQjEgKC0xLjU1Mzk0OGYpCisjZGVmaW5lIENTX1JFVkVSQl84ODIwMF9CMiAoMC41NzAyNDhmKQorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfU0NBTEUgMTQKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDk2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuOCAqLwogLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE2MDI0ODgKLSNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjE2MDI0ODgpCi0jZGVmaW5lIENTX1JFVkVSQl85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuNTg1NDEzKQotI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuNTk5Mzc3Ci0jZGVmaW5lIENTX1JFVkVSQl85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9BMCAwLjE2MDI0ODgKKyNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0ExIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9BMiAoLTAuMTYwMjQ4OCkKKyNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0IxICgtMS41ODU0MTMpCisjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9CMiAwLjU5OTM3NworI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfU0NBTEUgMTQKIAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMTc2NDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuOCAqLwogLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwICovCi0jZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDk0NzYzZgotI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDk0NzYzZikKLSNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuNzU4NTkzZikKLSNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9CMiAgICAgICAgICAgICAgICAgICAgICAoMC43NjMwOTFmKQotI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfQTAgMC4wOTQ3NjNmCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfQTEgMC4wMDAwMDBmCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfQTIgKC0wLjA5NDc2M2YpCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfQjEgKC0xLjc1ODU5M2YpCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfQjIgKDAuNzYzMDkxZikKKyNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9TQ0FMRSAxNAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMTkyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuOCAqLwogLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4wODc4MzY5Ci0jZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjA4NzgzNjkpCi0jZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjc3NjU3NjQpCi0jZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuNzgwNDA3NgotI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9BMCAwLjA4NzgzNjkKKyNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9BMSAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0EyICgtMC4wODc4MzY5KQorI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0IxICgtMS43NzY1NzY0KQorI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0IyIDAuNzgwNDA3NgorI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX1NDQUxFIDE0CiAKIC8qIFJldmVyYiBHYWluIFNldHRpbmdzICovCi0jZGVmaW5lIExWQ1NfSEVBRFBIT05FX0RFTEFZR0FJTiAgICAgICAgICAgICAgIDAuODAwMDAwICAgICAgICAgLyogQWxnb3JpdGhtIGRlbGF5IHBhdGggZ2FpbiAqLwotI2RlZmluZSBMVkNTX0hFQURQSE9ORV9PVVRQVVRHQUlOICAgICAgICAgICAgICAxLjAwMDAwMCAgICAgICAgIC8qIEFsZ29yaXRobSBvdXRwdXQgZ2FpbiAqLwotI2RlZmluZSBMVkNTX0hFQURQSE9ORV9QUk9DR0FJTiAgICAgICAgICAgICAgICAgICAxODQwMyAgICAgICAgIC8qIFByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KLSNkZWZpbmUgTFZDU19IRUFEUEhPTkVfVU5QUk9DR0FJTiAgICAgICAgICAgICAgICAgMTg0MDMgICAgICAgICAvKiBVbnByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KLSNkZWZpbmUgTFZDU19IRUFEUEhPTkVfR0FJTkNPUlJFQ1QgICAgICAgICAgICAgMS4wMDkzNDMgICAgICAgICAvKiBEZWxheSBtaXhlciBnYWluIGNvcnJlY3Rpb24gKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfREVMQVlHQUlOIDAuODAwMDAwICAgLyogQWxnb3JpdGhtIGRlbGF5IHBhdGggZ2FpbiAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9PVVRQVVRHQUlOIDEuMDAwMDAwICAvKiBBbGdvcml0aG0gb3V0cHV0IGdhaW4gKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfUFJPQ0dBSU4gMTg0MDMgICAgICAgLyogUHJvY2Vzc2VkIHBhdGggZ2FpbiAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9VTlBST0NHQUlOIDE4NDAzICAgICAvKiBVbnByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfR0FJTkNPUlJFQ1QgMS4wMDkzNDMgLyogRGVsYXkgbWl4ZXIgZ2FpbiBjb3JyZWN0aW9uICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzYzLDIwNSArMzYzLDIwNCBAQAogCiAvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBcCiAgICBDUyBzY2FsZWQgd2l0aCAxLjAzODQ5NyBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3NTQ4MCAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDEuMjYzMzEyCi0jZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0ExICAgICAgICAgICAgICAgICAgICAoLTAuNjAxNzQ4KQotI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjI4MDY4MSkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMC40NzU4NjUpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0IyICAgICAgICAgICAgICAgICAgICAoLTAuNDA4MTU0KQotI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX0EwICAgICAgICAgICAgICAgICAgICAwLjk0MzM1NwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX0ExICAgICAgICAgICAgICAgICAgICgtMC40NDkzNDUpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgKC0wLjIwOTU5NCkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAoLTAuNDc1ODY1KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX0IyICAgICAgICAgICAgICAgICAgICgtMC40MDgxNTQpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0EwIDEuMjYzMzEyCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0ExICgtMC42MDE3NDgpCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0EyICgtMC4yODA2ODEpCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0IxICgtMC40NzU4NjUpCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0IyICgtMC40MDgxNTQpCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX1NDQUxFIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTAgMC45NDMzNTcKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMSAoLTAuNDQ5MzQ1KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX0EyICgtMC4yMDk1OTQpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQjEgKC0wLjQ3NTg2NSkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9CMiAoLTAuNDA4MTU0KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX1NDQUxFIDE1CiAKIC8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDExMDI1SHogc2FtcGxlIHJhdGUsIFwKICAgIENTIHNjYWxlZCB3aXRoIDEuMDI3NzYxIGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzY3NDYzICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgMS4xMDExNDUKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAwLjEzOTAyMAotI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgKC0wLjg2NDQyMykKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAwLjAyNDU0MQotI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgKC0wLjkwODkzMCkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTAgICAgICAgICAgICAgICAgICAgIDAuOTc2MDU4Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICgtMC42OTUzMjYpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICgtMC4wOTA4MDkpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICgtMC42MTA1OTQpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0IyICAgICAgICAgICAgICAgICAgICgtMC4zMTExNDkpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9BMCAxLjEwMTE0NQorI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQTEgMC4xMzkwMjAKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0EyICgtMC44NjQ0MjMpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9CMSAwLjAyNDU0MQorI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQjIgKC0wLjkwODkzMCkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X1NDQUxFIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0EwIDAuOTc2MDU4CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0ExICgtMC42OTUzMjYpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0EyICgtMC4wOTA4MDkpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0IxICgtMC42MTA1OTQpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0IyICgtMC4zMTExNDkpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X1NDQUxFIDE1CiAKIC8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDEyMDAwSHogc2FtcGxlIHJhdGUsIFwKICAgIENTIHNjYWxlZCB3aXRoIDEuMDMyNTIxIGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzcxMDE3ICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAxLjI3NjY2MQotI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAoLTEuMDE3NTE5KQotI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDQ0MTI4KQotI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAoLTAuNzI5NjE2KQotI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAoLTAuMjA0NTMyKQotI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMCAgICAgICAgICAgICAgICAgMS4wMDcwOTUKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTEgICAgICAgICAgICAgICAgKC0wLjg3MTkxMikKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTIgICAgICAgICAgICAgICAgIDAuMDIzMjMyCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0IxICAgICAgICAgICAgICAgICgtMC43NDU4NTcpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0IyICAgICAgICAgICAgICAgICgtMC4xODkxNzEpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9BMCAxLjI3NjY2MQorI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQTEgKC0xLjAxNzUxOSkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0EyICgtMC4wNDQxMjgpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9CMSAoLTAuNzI5NjE2KQorI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQjIgKC0wLjIwNDUzMikKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX1NDQUxFIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0EwIDEuMDA3MDk1CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0ExICgtMC44NzE5MTIpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0EyIDAuMDIzMjMyCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0IxICgtMC43NDU4NTcpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0IyICgtMC4xODkxNzEpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX1NDQUxFIDE0CiAKIC8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDE2MDAwSHogc2FtcGxlIHJhdGUsIFwKICAgIENTIHNjYWxlZCB3aXRoIDEuMDMxMzc4IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzcwMTY0ICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDEuMjgxNjI5Ci0jZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgKC0xLjA3NTg3MikKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDQxMzY1KQotI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMC43MjUyMzkpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9CMiAgICAgICAgICAgICAgICAgICAgKC0wLjIyNDM1OCkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAxLjA4MTA5MQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMSAgICAgICAgICAgICAgICAgKC0wLjg2NzE4MykKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTIgICAgICAgICAgICAgICAgICgtMC4wNzAyNDcpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IxICAgICAgICAgICAgICAgICAoLTAuNTE1MTIxKQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9CMiAgICAgICAgICAgICAgICAgKC0wLjQyNTg5MykKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0EwIDEuMjgxNjI5CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9BMSAoLTEuMDc1ODcyKQorI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTIgKC0wLjA0MTM2NSkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0IxICgtMC43MjUyMzkpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9CMiAoLTAuMjI0MzU4KQorI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfU0NBTEUgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTAgMS4wODEwOTEKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTEgKC0wLjg2NzE4MykKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTIgKC0wLjA3MDI0NykKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjEgKC0wLjUxNTEyMSkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjIgKC0wLjQyNTg5MykKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfU0NBTEUgMTQKIAogLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMjIwNTBIeiBzYW1wbGUgcmF0ZSwgXAogICAgQ1Mgc2NhbGVkIHdpdGggMS4wNDE1NzYgYW5kIENTRVggc2NhbGVkIHdpdGggMC43Nzc3NzkgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgIDEuMzg4NjA1Ci0jZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICgtMS4zMDU3OTkpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAwLjAzOTkyMgotI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAoLTAuNzE5NDk0KQotI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAoLTAuMjQzMjQ1KQotI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAxLjI3MjkxMAotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICgtMS4zNDEwMTQpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgIDAuMTY3NDYyCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgKC0wLjYxNDIxOSkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAoLTAuMzQ1Mzg0KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQTAgMS4zODg2MDUKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0ExICgtMS4zMDU3OTkpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9BMiAwLjAzOTkyMgorI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQjEgKC0wLjcxOTQ5NCkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0IyICgtMC4yNDMyNDUpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRSAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMCAxLjI3MjkxMAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMSAoLTEuMzQxMDE0KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMiAwLjE2NzQ2MgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9CMSAoLTAuNjE0MjE5KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9CMiAoLTAuMzQ1Mzg0KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRSAxNAogCiAvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAyNDAwMEh6IHNhbXBsZSByYXRlLCBcCiAgICBDUyBzY2FsZWQgd2l0aCAxLjAzNDQ5NSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3MjQ5MSAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgIDEuNDA5ODMyCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAoLTEuNDU2NTA2KQotI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgIDAuMTUxNDEwCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAoLTAuODA0MjAxKQotI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQjIgICAgICAgICAgICAgICAgICAgKC0wLjE2Mzc4MykKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAxLjI5OTE5OAotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMSAgICAgICAgICAgICAgICAgKC0xLjQ1MjQ0NykKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAwLjI0MDQ4OQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjY2OTMwMykKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQjIgICAgICAgICAgICAgICAgICgtMC4yOTQ5ODQpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9BMCAxLjQwOTgzMgorI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQTEgKC0xLjQ1NjUwNikKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0EyIDAuMTUxNDEwCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9CMSAoLTAuODA0MjAxKQorI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQjIgKC0wLjE2Mzc4MykKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX1NDQUxFIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0EwIDEuMjk5MTk4CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0ExICgtMS40NTI0NDcpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0EyIDAuMjQwNDg5CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IxICgtMC42NjkzMDMpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IyICgtMC4yOTQ5ODQpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX1NDQUxFIDE0CiAKIC8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDMyMDAwSHogc2FtcGxlIHJhdGUsIFwKICAgIENTIHNjYWxlZCB3aXRoIDEuMDQ0NTU5IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzgwMDA2ICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDEuNTYwOTg4Ci0jZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgKC0xLjg3NzcyNCkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4zODk3NDEKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTAuOTA3NDEwKQotI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQjIgICAgICAgICAgICAgICAgICAgICgtMC4wNzA0ODkpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgMS43ODUwNDkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTEgICAgICAgICAgICAgICAgICgtMi4yMzM0OTcpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgMC41MjY0MzEKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjEgICAgICAgICAgICAgICAgICgtMC40NDU5MzkpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0IyICAgICAgICAgICAgICAgICAoLTAuNTIyNDQ2KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQTAgMS41NjA5ODgKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0ExICgtMS44Nzc3MjQpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMiAwLjM4OTc0MQorI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQjEgKC0wLjkwNzQxMCkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0IyICgtMC4wNzA0ODkpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9TQ0FMRSAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMCAxLjc4NTA0OQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMSAoLTIuMjMzNDk3KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMiAwLjUyNjQzMQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9CMSAoLTAuNDQ1OTM5KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9CMiAoLTAuNTIyNDQ2KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9TQ0FMRSAxMwogCiAvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciA0NDEwMEh6IHNhbXBsZSByYXRlLCBcCiAgICBDUyBzY2FsZWQgd2l0aCAxLjAyMjE3MCBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc2MzI4OCAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQTAgICAgICAgICAgICAgICAgICAxLjYyMzk5MwotI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQTEgICAgICAgICAgICAgICAgICgtMi4yNzA3NDMpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9BMiAgICAgICAgICAgICAgICAgIDAuNjg4ODI5Ci0jZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9CMSAgICAgICAgICAgICAgICAgKC0xLjExNzE5MCkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgMC4xMzAyMDgKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTAgICAgICAgICAgICAgICAgICAgMi4wMjgzMTUKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAoLTIuODgyNDU5KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAwLjkwNDUzNQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9CMSAgICAgICAgICAgICAgICAgICgtMC41OTMzMDgpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgKC0wLjM4NTgxNikKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0EwIDEuNjIzOTkzCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9BMSAoLTIuMjcwNzQzKQorI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQTIgMC42ODg4MjkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0IxICgtMS4xMTcxOTApCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9CMiAwLjEzMDIwOAorI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfU0NBTEUgMTMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTAgMi4wMjgzMTUKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTEgKC0yLjg4MjQ1OSkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTIgMC45MDQ1MzUKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQjEgKC0wLjU5MzMwOCkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQjIgKC0wLjM4NTgxNikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfU0NBTEUgMTMKIAogLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgNDgwMDBIeiBzYW1wbGUgcmF0ZSwgXAogICAgQ1Mgc2NhbGVkIHdpdGggMS4wMTg2MzUgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NjA2NDggKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjY0MTE3NwotI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQTEgICAgICAgICAgICAgICAgICAgKC0yLjM2NDY4NykKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgICAwLjc1OTkxMAotI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgKC0xLjE2Njc3NCkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAgICAwLjE3ODA3NAotI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxMwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMCAgICAgICAgICAgICAgICAgIDIuMDk5NjU1Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAoLTMuMDY1MjIwKQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMiAgICAgICAgICAgICAgICAgIDEuMDEwNDE3Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAoLTAuNjM0MDIxKQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMiAgICAgICAgICAgICAgICAgKC0wLjM0NzMzMikKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0EwIDEuNjQxMTc3CisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9BMSAoLTIuMzY0Njg3KQorI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQTIgMC43NTk5MTAKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IxICgtMS4xNjY3NzQpCisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9CMiAwLjE3ODA3NAorI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfU0NBTEUgMTMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTAgMi4wOTk2NTUKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTEgKC0zLjA2NTIyMCkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTIgMS4wMTA0MTcKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjEgKC0wLjYzNDAyMSkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjIgKC0wLjM0NzMzMikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfU0NBTEUgMTMKIAogLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgODgyMDBIeiBzYW1wbGUgcmF0ZS4KICAqIFRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFyZSBvYnRhaW5lZCBieSBjYXJyeWluZyBvdXQKICAqIHN0YXRlLXNwYWNlIGFuYWx5c2lzIHVzaW5nIHRoZSBjb2VmZmljaWVudHMgYXZhaWxhYmxlCiAgKiBmb3IgNDQxMDBIei4KICAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQTAgICAgICAgICAgICAgICAgICAgMS43NzE4OTlmCi0jZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9BMSAgICAgICAgICAgICAgICAgICAoLTIuOTMwNzYyZikKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0EyICAgICAgICAgICAgICAgICAgIDEuMTcyMTc1ZgotI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQjEgICAgICAgICAgICAgICAgICAgKC0xLjQzODM0OWYpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9CMiAgICAgICAgICAgICAgICAgICAwLjQ0MjUyMGYKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX1NDQUxFICAgICAgICAgICAgICAgIDEzCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0EwICAgICAgICAgICAgICAgICAyLjY3NTI0MWYKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTEgICAgICAgICAgICAgICAgICgtNC40NjYxNTRmKQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMiAgICAgICAgICAgICAgICAgMS44MTAzMDVmCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0IxICAgICAgICAgICAgICAgICAoLTAuOTI1MzUwZikKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfQjIgICAgICAgICAgICAgICAgICgtMC4wNjY2MTZmKQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9TQ0FMRSAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0EwIDEuNzcxODk5ZgorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQTEgKC0yLjkzMDc2MmYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9BMiAxLjE3MjE3NWYKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0IxICgtMS40MzgzNDlmKQorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQjIgMC40NDI1MjBmCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9TQ0FMRSAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMCAyLjY3NTI0MWYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTEgKC00LjQ2NjE1NGYpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0EyIDEuODEwMzA1ZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMSAoLTAuOTI1MzUwZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfQjIgKC0wLjA2NjYxNmYpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX1NDQUxFIDEzCiAKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjc4NDQ5NwotI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgKC0zLjAwMTQzNSkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAxLjIyODQyMgotI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgKC0xLjQ3NzgwNCkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAwLjQ4MTM2OQotI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxMwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMCAgICAgICAgICAgICAgICAgIDIuNzU3MwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMSAgICAgICAgICAgICAgICAgKC00LjY3MjEpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgMS45MzE3Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IxICAgICAgICAgICAgICAgICAoLTAuOTcxNzE4KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMiAgICAgICAgICAgICAgICAgKC0wLjAyMTIxNikKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EwIDEuNzg0NDk3CisjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9BMSAoLTMuMDAxNDM1KQorI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTIgMS4yMjg0MjIKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0IxICgtMS40Nzc4MDQpCisjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9CMiAwLjQ4MTM2OQorI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfU0NBTEUgMTMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTAgMi43NTczCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0ExICgtNC42NzIxKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMiAxLjkzMTcKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjEgKC0wLjk3MTcxOCkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjIgKC0wLjAyMTIxNikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfU0NBTEUgMTMKIC8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDE3NjQwMEh6IHNhbXBsZSByYXRlLgogICogVGhlIGZpbHRlciBjb2VmZmljaWVudHMgYXJlIG9idGFpbmVkIGJ5IGNhcnJ5aW5nIG91dAogICogc3RhdGUtc3BhY2UgYW5hbHlzaXMgdXNpbmcgdGhlIGNvZWZmaWNpZW50cyBhdmFpbGFibGUKICAqIGZvciA0NDEwMEh6LgogICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQTAgICAgICAgICAgICAgICAgICAxLjg4MzQ0MGYKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMSAgICAgICAgICAgICAgICAgICgtMy40MTQyNzJmKQotI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0EyICAgICAgICAgICAgICAgICAgMS41MzQ3MDJmCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQjEgICAgICAgICAgICAgICAgICAoLTEuNjc0NjE0ZikKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9CMiAgICAgICAgICAgICAgICAgIDAuNjc1ODI3ZgotI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX1NDQUxFICAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0EwICAgICAgICAgICAgICAgIDMuMzU1MDY4ZgotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTEgICAgICAgICAgICAgICAgKC02LjExMjU3OGYpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMiAgICAgICAgICAgICAgICAyLjc2NDEzNWYKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0IxICAgICAgICAgICAgICAgICgtMS4yNjg1MzNmKQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQjIgICAgICAgICAgICAgICAgMC4yNzEyNzdmCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9TQ0FMRSAgICAgICAgICAgICAxMworI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0EwIDEuODgzNDQwZgorI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0ExICgtMy40MTQyNzJmKQorI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0EyIDEuNTM0NzAyZgorI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0IxICgtMS42NzQ2MTRmKQorI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0IyIDAuNjc1ODI3ZgorI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX1NDQUxFIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMCAzLjM1NTA2OGYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0ExICgtNi4xMTI1NzhmKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTIgMi43NjQxMzVmCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMSAoLTEuMjY4NTMzZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0IyIDAuMjcxMjc3ZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEUgMTMKIAotI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjg4OTU4MgotI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICgtMy40NTYxNDApCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAgIDEuNTY5ODY0Ci0jZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgKC0xLjcwMDc5OCkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgMC43MDE4MjQKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDEzCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgIDMuNDI3MwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICgtNi4yOTM2KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAyLjg3MjAKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAoLTEuMzEwNzQpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgMC4zMTMxMgotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMCAxLjg4OTU4MgorI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0ExICgtMy40NTYxNDApCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfQTIgMS41Njk4NjQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMSAoLTEuNzAwNzk4KQorI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0IyIDAuNzAxODI0CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEUgMTMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0EwIDMuNDI3MworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTEgKC02LjI5MzYpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMiAyLjg3MjAKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IxICgtMS4zMTA3NCkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IyIDAuMzEzMTIKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX1NDQUxFIDEzCiAKLSNkZWZpbmUgTFZDU19IRUFEUEhPTkVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgIC8qIE91dHB1dCBTaGlmdCAqLwotI2RlZmluZSBMVkNTX0hFQURQSE9ORV9TSElGVExPU1MgICAgICAgICAgICAgICAgICAwLjg0Nzc3MzUgICAgICAgICAgLyogT3V0cHV0IFNoaWZ0IGxvc3MgKi8KLSNkZWZpbmUgTFZDU19IRUFEUEhPTkVfR0FJTiAgICAgICAgICAgICAgICAgICAgICAgMC4yMDg3NDY1ICAgICAgICAgIC8qIFVucHJvY2Vzc2VkIHBhdGggZ2FpbiAqLwotI2RlZmluZSBMVkNTX0VYX0hFQURQSE9ORV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgICAgICAgLyogRVggT3V0cHV0IFNoaWZ0ICovCi0jZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUTE9TUyAgICAgICAgICAgICAgIDAuNTY5MjI1ICAgICAgICAgICAvKiBFWCBPdXRwdXQgU2hpZnQgbG9zcyAqLwotI2RlZmluZSBMVkNTX0VYX0hFQURQSE9ORV9HQUlOICAgICAgICAgICAgICAgICAgICAwLjA3Nzk0NDI1ICAgICAgICAgLyogRVggVW5wcm9jZXNzZWQgcGF0aCBnYWluICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX1NISUZUIDIgICAgICAgICAgICAgICAvKiBPdXRwdXQgU2hpZnQgKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfU0hJRlRMT1NTIDAuODQ3NzczNSAgIC8qIE91dHB1dCBTaGlmdCBsb3NzICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX0dBSU4gMC4yMDg3NDY1ICAgICAgICAvKiBVbnByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KKyNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfU0hJRlQgMyAgICAgICAgICAgIC8qIEVYIE91dHB1dCBTaGlmdCAqLworI2RlZmluZSBMVkNTX0VYX0hFQURQSE9ORV9TSElGVExPU1MgMC41NjkyMjUgLyogRVggT3V0cHV0IFNoaWZ0IGxvc3MgKi8KKyNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfR0FJTiAwLjA3Nzk0NDI1ICAgIC8qIEVYIFVucHJvY2Vzc2VkIHBhdGggZ2FpbiAqLwogI2VuZGlmCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmNwcAppbmRleCA2MzBlY2Y3Li5kZDFiYWYzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSW5pdC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0luaXQuY3BwCkBAIC0yMCw5OSArMjAsMTEgQEAKIC8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgIkxWQ1MuaCIKICNpbmNsdWRlICJMVkNTX1ByaXZhdGUuaCIKICNpbmNsdWRlICJMVkNTX1RhYmxlcy5oIgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCi0vKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSBpdCBpcyAgICAgICAgICAgKi8KLS8qICBwYXNzZWQgdGhlIGRlZmF1bHQgY2FwYWJpbGl0aWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIHRoZSBtZW1vcnkgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uICAgICAgKi8KLS8qICByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSAgICAgICAgICAgICAgKi8KLS8qICBjYXBhYmlsaXRpZXMgYXJlIGlnbm9yZWQgYW5kIHRoZSBtZW1vcnkgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgICAgICAqLwotLyogIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KLS8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19NZW1vcnkoTFZDU19IYW5kbGVfdCAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX01lbVRhYl90ICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0NhcGFiaWxpdGllc190ICAgICpwQ2FwYWJpbGl0aWVzKQotewotCi0gICAgTFZNX1VJTlQzMiAgICAgICAgICBTY3JhdGNoU2l6ZTsKLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICopaEluc3RhbmNlOwotCi0gICAgLyoKLSAgICAgKiBGaWxsIGluIHRoZSBtZW1vcnkgdGFibGUKLSAgICAgKi8KLSAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogSW5zdGFuY2UgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSAgICAgICAgID0gKExWTV9VSU5UMzIpc2l6ZW9mKExWQ1NfSW5zdGFuY2VfdCk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5UeXBlICAgICAgICAgPSBMVkNTX1BFUlNJU1RFTlQ7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBEYXRhIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUgICAgICAgICA9IChMVk1fVUlOVDMyKXNpemVvZihMVkNTX0RhdGFfdCk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVkNTX0RBVEE7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDb2VmZmljaWVudCBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplICAgICAgICAgPSAoTFZNX1VJTlQzMilzaXplb2YoTFZDU19Db2VmZmljaWVudF90KTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlR5cGUgICAgICAgICA9IExWQ1NfQ09FRkZJQ0lFTlQ7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTY3JhdGNoIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgLyogSW5wbGFjZSBwcm9jZXNzaW5nICovCi0gICAgICAgIFNjcmF0Y2hTaXplID0gKExWTV9VSU5UMzIpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIChMVkNTX1NDUkFUQ0hCVUZGRVJTICogc2l6ZW9mKExWTV9GTE9BVCkgKiBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSAgICAgICAgID0gU2NyYXRjaFNpemU7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5UeXBlICAgICAgICAgPSBMVkNTX1NDUkFUQ0g7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogUmVhZCBiYWNrIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCi0gICAgICAgICpwTWVtb3J5VGFibGUgPSBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlOwotICAgIH0KLQotICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMjAsOTEgKzMyLDk1IEBACiAvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIENyZWF0ZSBhbmQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBDb25jZXJ0IFNvdW5kIG1vZHVsZSAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gYWxnb3JpdGhtIGluc3RhbmNlIGJ5IGNhbGxpbmcgd2l0aCAgICAgICAqLwotLyogIGhJbnN0YW5jZSBzZXQgdG8gTFZNX05VTEwuIEluIHRoaXMgY2FzZSB0aGUgYWxnb3JpdGhtIHJldHVybnMgdGhlIG5ldyBpbnN0YW5jZSAgKi8KLS8qICBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZm9yY2UgYSBmdWxsIHJlLWluaXRpYWxpc2F0aW9uIG9mIHRoZSBhbGdvcml0aG0gICAgKi8KLS8qICBieSBjYWxsaW5nIHdpdGggaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlLiBJbiB0aGlzIGNhc2UgdGhlIG1lbW9yeSB0YWJsZSAgICAgICovCi0vKiAgc2hvdWxkIGJlIGNvcnJlY3QgZm9yIHRoZSBpbnN0YW5jZSwgdGhpcyBjYW4gYmUgZW5zdXJlZCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiAqLwotLyogIExWQ1NfTWVtb3J5IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgUG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNhcGFiaWxpdGllcyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwU2NyYXRjaCAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHNjcmF0Y2ggYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfTlVMTEFERFJFU1MgICAgICAgT25lIG9yIG1vcmUgbWVtb3J5IGhhcyBhIE5VTEwgcG9pbnRlciAtIG1hbGxvYyBmYWlsdXJlICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoZSBpbnN0YW5jZSBoYW5kbGUgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWVtb3J5ICAqLwotLyogICAgICByZWdpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAyLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZDU19Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICovCi0vKiAgMy4gIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgc2FtZSBjYXBhYmlsaXRpZXMgYXMgdXNlZCBmb3IgdGhlICAgICAqLwotLyogICAgICBjYWxsIHRvIHRoZSBtZW1vcnkgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZDU19Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Jbml0KExWQ1NfSGFuZGxlX3QgICAgICAgICAqcGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX01lbVRhYl90ICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0NhcGFiaWxpdGllc190ICAgKnBDYXBhYmlsaXRpZXMpCi17Ci0KLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAgICAgICAgICpwSW5zdGFuY2U7Ci0gICAgTFZDU19Wb2xDb3JyZWN0X3QgICAgICAgICAgICAgICAqcExWQ1NfVm9sQ29ycmVjdFRhYmxlOworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Jbml0KExWQ1NfSGFuZGxlX3QqIHBoSW5zdGFuY2UsIExWQ1NfQ2FwYWJpbGl0aWVzX3QqIHBDYXBhYmlsaXRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFNjcmF0Y2gpIHsKKyAgICBMVkNTX0luc3RhbmNlX3QqIHBJbnN0YW5jZTsKKyAgICBMVkNTX1ZvbENvcnJlY3RfdCogcExWQ1NfVm9sQ29ycmVjdFRhYmxlOwogCiAgICAgLyoKLSAgICAgKiBTZXQgdGhlIGluc3RhbmNlIGhhbmRsZSBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXNlZAorICAgICAqIENyZWF0ZSB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkCiAgICAgICovCi0gICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgKnBoSW5zdGFuY2UgPSAoTFZDU19IYW5kbGVfdClwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzOworICAgIGlmICgqcGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgeworICAgICAgICAqcGhJbnN0YW5jZSA9IG5ldyBMVkNTX0luc3RhbmNlX3R7fTsKICAgICB9Ci0gICAgcEluc3RhbmNlID0oTFZDU19JbnN0YW5jZV90ICAqKSpwaEluc3RhbmNlOworICAgIHBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QqKSpwaEluc3RhbmNlOwogCiAgICAgLyoKICAgICAgKiBTYXZlIHRoZSBjYXBhYmlsaXRpZXMgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZQogICAgICAqLwogICAgIHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzID0gKnBDYXBhYmlsaXRpZXM7CiAKLSAgICAvKgotICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlCi0gICAgICovCi0gICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZSA9ICpwTWVtb3J5VGFibGU7CisgICAgcEluc3RhbmNlLT5wU2NyYXRjaCA9IHBTY3JhdGNoOwogCiAgICAgLyoKICAgICAgKiBTZXQgYWxsIGluaXRpYWwgcGFyYW1ldGVycyB0byBpbnZhbGlkIHRvIGZvcmNlIGEgZnVsbCBpbml0aWFsaXNhdGlvbgogICAgICAqLwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgID0gTFZDU19PRkY7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgICAgPSBMVkNTX1NQRUFLRVJUWVBFX01BWDsKLSAgICBwSW5zdGFuY2UtPk91dHB1dERldmljZSAgICAgICAgICA9IExWQ1NfSEVBRFBIT05FOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCAgID0gTFZDU19TT1VSQ0VNQVg7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWQ1NfT0ZGOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlID0gTFZDU19TUEVBS0VSVFlQRV9NQVg7CisgICAgcEluc3RhbmNlLT5PdXRwdXREZXZpY2UgPSBMVkNTX0hFQURQSE9ORTsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkNTX1NPVVJDRU1BWDsKICAgICBwSW5zdGFuY2UtPlBhcmFtcy5Db21wcmVzc29yTW9kZSA9IExWTV9NT0RFX09GRjsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICAgICA9IExWTV9GU19JTlZBTElEOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLkVmZmVjdExldmVsICAgID0gMDsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5SZXZlcmJMZXZlbCAgICA9IChMVk1fVUlOVDE2KTB4ODAwMDsKLSAgICBwTFZDU19Wb2xDb3JyZWN0VGFibGUgICAgICAgICAgICA9IChMVkNTX1ZvbENvcnJlY3RfdCopJkxWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOwotICAgIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdCAgICAgICAgICAgID0gcExWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOwotICAgIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4gICAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlID0gTFZNX0ZTX0lOVkFMSUQ7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuRWZmZWN0TGV2ZWwgPSAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlJldmVyYkxldmVsID0gKExWTV9VSU5UMTYpMHg4MDAwOworICAgIHBMVkNTX1ZvbENvcnJlY3RUYWJsZSA9IChMVkNTX1ZvbENvcnJlY3RfdCopJkxWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOworICAgIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdCA9IHBMVkNTX1ZvbENvcnJlY3RUYWJsZVswXTsKKyAgICBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluID0gMDsKIAogICAgIC8qIFRoZXNlIGN1cnJlbnQgYW5kIHRhcmdldCB2YWx1ZXMgYXJlIGludGlhbGl6ZWQgYWdhaW4gaW4gTFZDU19Db250cm9sLmMgKi8KLSAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sMCwwKTsKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sIDAsIDApOwogICAgIC8qIFRoZXNlIGN1cnJlbnQgYW5kIHRhcmdldCB2YWx1ZXMgYXJlIGludGlhbGl6ZWQgYWdhaW4gaW4gTFZDU19Db250cm9sLmMgKi8KLSAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sMCwwKTsKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sIDAsIDApOwogCiAgICAgLyoKICAgICAgKiBJbml0aWFsaXNlIHRoZSBieXBhc3MgdmFyaWFibGVzCiAgICAgICovCi0gICAgcEluc3RhbmNlLT5NU1RhcmdldDA9MDsKLSAgICBwSW5zdGFuY2UtPk1TVGFyZ2V0MT0wOwotICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gICAgICAgICAgPSBMVk1fRkFMU0U7Ci0gICAgcEluc3RhbmNlLT5iVGltZXJEb25lICAgICAgICAgICAgICAgICAgICAgICAgPSBMVk1fRkFMU0U7Ci0gICAgcEluc3RhbmNlLT5UaW1lclBhcmFtcy5DYWxsQmFja1BhcmFtICAgICAgICAgPSAwOwotICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMucENhbGxCYWNrICAgICAgICAgICAgID0gTFZDU19UaW1lckNhbGxCYWNrOwotICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMucENhbGxiYWNrSW5zdGFuY2UgICAgID0gcEluc3RhbmNlOwotICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMucENhbGxCYWNrUGFyYW1zICAgICAgID0gTFZNX05VTEw7CisgICAgcEluc3RhbmNlLT5NU1RhcmdldDAgPSAwOworICAgIHBJbnN0YW5jZS0+TVNUYXJnZXQxID0gMDsKKyAgICBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID0gTFZNX0ZBTFNFOworICAgIHBJbnN0YW5jZS0+YlRpbWVyRG9uZSA9IExWTV9GQUxTRTsKKyAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLkNhbGxCYWNrUGFyYW0gPSAwOworICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMucENhbGxCYWNrID0gTFZDU19UaW1lckNhbGxCYWNrOworICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMucENhbGxiYWNrSW5zdGFuY2UgPSBwSW5zdGFuY2U7CisgICAgcEluc3RhbmNlLT5UaW1lclBhcmFtcy5wQ2FsbEJhY2tQYXJhbXMgPSBMVk1fTlVMTDsKIAotICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZDU19TVUNDRVNTKTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19EZUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnJlZSBtZW1vcmllcyBjcmVhdGVkIGR1cmluZyB0aGUgTFZDU19Jbml0IGNhbGwgaW5jbHVkaW5nIGluc3RhbmNlIGhhbmRsZSAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgUG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIExWQ1NfRGVJbml0KExWQ1NfSGFuZGxlX3QqIHBoSW5zdGFuY2UpIHsKKyAgICBMVkNTX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QqKSpwaEluc3RhbmNlOworICAgIGlmIChwSW5zdGFuY2UgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBkZWxldGUgcEluc3RhbmNlOworICAgICpwaEluc3RhbmNlID0gTFZNX05VTEw7CisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKaW5kZXggMTU0ZWE1NS4uNThlMjFiZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oCkBAIC0zMywxMSArMzMsMTIgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaW5jbHVkZSAiTFZDUy5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYWxsaW5nIG9yIEFwcGxpY2F0aW9uIGxheWVyIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiTFZDU19TdGVyZW9FbmhhbmNlci5oIiAgICAgICAgICAgICAgICAvKiBTdGVyZW8gZW5oYW5jZXIgbW9kdWxlIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiTFZDU19SZXZlcmJHZW5lcmF0b3IuaCIgICAgICAgICAgICAgICAvKiBSZXZlcmJlcmF0aW9uIG1vZHVsZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgIkxWQ1NfRXF1YWxpc2VyLmgiICAgICAgICAgICAgICAgICAgICAgLyogRXF1YWxpc2VyIG1vZHVsZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgIkxWQ1NfQnlwYXNzTWl4LmgiICAgICAgICAgICAgICAgICAgICAgLyogQnlwYXNzIE1peGVyIG1vZHVsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL0JpcXVhZEZpbHRlci5oPgorI2luY2x1ZGUgIkxWQ1MuaCIgICAgICAgICAgICAgICAgIC8qIENhbGxpbmcgb3IgQXBwbGljYXRpb24gbGF5ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJMVkNTX1N0ZXJlb0VuaGFuY2VyLmgiICAvKiBTdGVyZW8gZW5oYW5jZXIgbW9kdWxlIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiTFZDU19SZXZlcmJHZW5lcmF0b3IuaCIgLyogUmV2ZXJiZXJhdGlvbiBtb2R1bGUgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJMVkNTX0VxdWFsaXNlci5oIiAgICAgICAvKiBFcXVhbGlzZXIgbW9kdWxlIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiTFZDU19CeXBhc3NNaXguaCIgICAgICAgLyogQnlwYXNzIE1peGVyIG1vZHVsZSBkZWZpbml0aW9ucyAqLwogI2luY2x1ZGUgIkxWTV9UaW1lci5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDcsMzUgKzQ4LDI5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBDb25maWd1cmF0aW9uIHN3aXRjaCBjb250cm9scyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0VOSEFOQ0VTV0lUQ0ggICAgMHgwMDAxICAgICAgLyogU3RlcmVvIGVuaGFuY2VtZW50IGVuYWJsZSBjb250cm9sICovCi0jZGVmaW5lIExWQ1NfUkVWRVJCU1dJVENIICAgICAgICAgICAweDAwMDIgICAgICAvKiBSZXZlcmJlcmF0aW9uIGVuYWJsZSBjb250cm9sICovCi0jZGVmaW5lIExWQ1NfRVFVQUxJU0VSU1dJVENIICAgICAgICAweDAwMDQgICAgICAvKiBFcXVhbGlzZXIgZW5hYmxlIGNvbnRyb2wgKi8KLSNkZWZpbmUgTFZDU19CWVBBU1NNSVhTV0lUQ0ggICAgICAgIDB4MDAwOCAgICAgIC8qIEJ5cGFzcyBtaXhlciBlbmFibGUgY29udHJvbCAqLwotI2RlZmluZSBMVkNTX0NPTVBHQUlORlJBTUUgICAgICAgICAgNjQgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHVwZGF0ZSBpbnRlcnZhbCAqLworI2RlZmluZSBMVkNTX1NURVJFT0VOSEFOQ0VTV0lUQ0ggMHgwMDAxIC8qIFN0ZXJlbyBlbmhhbmNlbWVudCBlbmFibGUgY29udHJvbCAqLworI2RlZmluZSBMVkNTX1JFVkVSQlNXSVRDSCAweDAwMDIgICAgICAgIC8qIFJldmVyYmVyYXRpb24gZW5hYmxlIGNvbnRyb2wgKi8KKyNkZWZpbmUgTFZDU19FUVVBTElTRVJTV0lUQ0ggMHgwMDA0ICAgICAvKiBFcXVhbGlzZXIgZW5hYmxlIGNvbnRyb2wgKi8KKyNkZWZpbmUgTFZDU19CWVBBU1NNSVhTV0lUQ0ggMHgwMDA4ICAgICAvKiBCeXBhc3MgbWl4ZXIgZW5hYmxlIGNvbnRyb2wgKi8KKyNkZWZpbmUgTFZDU19DT01QR0FJTkZSQU1FIDY0ICAgICAgICAgICAvKiBDb21wcmVzc29yIGdhaW4gdXBkYXRlIGludGVydmFsICovCiAKIC8qIE1lbW9yeSAqLwotI2lmZGVmIFNVUFBPUlRfTUMKLSNkZWZpbmUgTFZDU19TQ1JBVENIQlVGRkVSUyAgICAgICAgICAgICAgOCAgICAgIC8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KLSNlbHNlCi0jZGVmaW5lIExWQ1NfU0NSQVRDSEJVRkZFUlMgICAgICAgICAgICAgIDYgICAgICAvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCi0jZW5kaWYKLSNpZmRlZiBTVVBQT1JUX01DCisjZGVmaW5lIExWQ1NfU0NSQVRDSEJVRkZFUlMgOCAvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCiAvKgogICogVGhlIENvbmNlcnQgU3Vycm91bmQgbW9kdWxlIGFwcGxpZXMgcHJvY2Vzc2luZyBvbmx5IG9uIHRoZSBmaXJzdCB0d28KICAqIGNoYW5uZWxzIG9mIGEgbXVsdGljaGFubmVsIGlucHV0LiBUaGUgZGF0YSBvZiBmaXJzdCB0d28gY2hhbm5lbHMgaXMgY29waWVkCiAgKiBmcm9tIHRoZSBtdWx0aWNoYW5uZWwgaW5wdXQgaW50byBzY3JhdGNoIGJ1ZmZlci4gVGhlIGJ1ZmZlcnMgYWRkZWQgaGVyZQogICogYXJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZQogICovCi0jZGVmaW5lIExWQ1NfTUNfU0NSQVRDSEJVRkZFUlMgICAgICAgICAgIDIKLSNlbmRpZgorI2RlZmluZSBMVkNTX01DX1NDUkFUQ0hCVUZGRVJTIDIKIAogLyogR2VuZXJhbCAqLwotI2RlZmluZSBMVkNTX0lOVkFMSUQgICAgICAgICAgICAgICAgMHhGRkZGICAgICAgLyogSW52YWxpZCBpbml0IHBhcmFtZXRlciAqLwotI2RlZmluZSBMVkNTX0JZUEFTU19NSVhFUl9UQyAgICAgICAgMTAwICAgICAgICAgLyogQnlwYXNzIG1peGVyIHRpbWUgKi8KKyNkZWZpbmUgTFZDU19JTlZBTElEIDB4RkZGRiAgICAgIC8qIEludmFsaWQgaW5pdCBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgTFZDU19CWVBBU1NfTUlYRVJfVEMgMTAwIC8qIEJ5cGFzcyBtaXhlciB0aW1lICovCiAKIC8qIEFjY2VzcyB0byBleHRlcm5hbCBjb2VmZmljaWVudHMgdGFibGUgKi8KLSNkZWZpbmUgTFZDU19OUl9PRl9GUyAgICAgICAgICAgICAgICAgICAgOQotI2RlZmluZSBMVkNTX05SX09GX0NIQU5fQ0ZHICAgICAgICAgICAgICAyCisjZGVmaW5lIExWQ1NfTlJfT0ZfRlMgOQorI2RlZmluZSBMVkNTX05SX09GX0NIQU5fQ0ZHIDIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC04MywxMyArNzgsOSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXR5cGVkZWYgTFZNX1VJTlQxNiAgTFZDU19Db25maWd1cmF0aW9uX3Q7ICAgICAgIC8qIEludGVybmFsIGFsZ29yaXRobSBjb25maWd1cmF0aW9uICovCit0eXBlZGVmIExWTV9VSU5UMTYgTFZDU19Db25maWd1cmF0aW9uX3Q7IC8qIEludGVybmFsIGFsZ29yaXRobSBjb25maWd1cmF0aW9uICovCiAKLXR5cGVkZWYgZW51bQotewotICAgIExWQ1NfSEVBRFBIT05FICA9IDAsCi0gICAgTFZDU19ERVZJQ0VfTUFYID0gTFZNX01BWEVOVU0KLX0gTFZDU19PdXRwdXREZXZpY2VfZW47Cit0eXBlZGVmIGVudW0geyBMVkNTX0hFQURQSE9ORSA9IDAsIExWQ1NfREVWSUNFX01BWCA9IExWTV9NQVhFTlVNIH0gTFZDU19PdXRwdXREZXZpY2VfZW47CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtOTgsNjUgKzg5LDUwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBWb2x1bWUgY29ycmVjdGlvbiBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0ZMT0FUICAgQ29tcEZ1bGw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBQb3N0IENTIGNvbXByZXNzaW9uIDEwMCUgZWZmZWN0ICovCi0gICAgTFZNX0ZMT0FUICAgQ29tcE1pbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb3N0IENTIGNvbXByZXNzaW9uIDAlIGVmZmVjdCAqLwotICAgIExWTV9GTE9BVCAgIEdhaW5GdWxsOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ1MgZ2FpbiBjb3JyZWN0IDEwMCUgZWZmZWN0ICovCi0gICAgTFZNX0ZMT0FUICAgR2Fpbk1pbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBDUyBnYWluIGNvcnJlY3QgMCUgZWZmZWN0ICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0ZMT0FUIENvbXBGdWxsOyAvKiBQb3N0IENTIGNvbXByZXNzaW9uIDEwMCUgZWZmZWN0ICovCisgICAgTFZNX0ZMT0FUIENvbXBNaW47ICAvKiBQb3N0IENTIGNvbXByZXNzaW9uIDAlIGVmZmVjdCAqLworICAgIExWTV9GTE9BVCBHYWluRnVsbDsgLyogQ1MgZ2FpbiBjb3JyZWN0IDEwMCUgZWZmZWN0ICovCisgICAgTFZNX0ZMT0FUIEdhaW5NaW47ICAvKiBDUyBnYWluIGNvcnJlY3QgMCUgZWZmZWN0ICovCiB9IExWQ1NfVm9sQ29ycmVjdF90OwogCiAvKiBJbnN0YW5jZSBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogUHVibGljIHBhcmFtZXRlcnMgKi8KLSAgICBMVkNTX01lbVRhYl90ICAgICAgICAgICBNZW1vcnlUYWJsZTsgICAgICAgIC8qIEluc3RhbmNlIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCi0gICAgTFZDU19QYXJhbXNfdCAgICAgICAgICAgUGFyYW1zOyAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwYXJhbWV0ZXJzICovCi0gICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAgQ2FwYWJpbGl0aWVzOyAgICAgICAvKiBJbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMgKi8KKyAgICBMVkNTX1BhcmFtc190IFBhcmFtczsgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLworICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgQ2FwYWJpbGl0aWVzOyAvKiBJbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMgKi8KIAogICAgIC8qIFByaXZhdGUgcGFyYW1ldGVycyAqLwotICAgIExWQ1NfT3V0cHV0RGV2aWNlX2VuICAgIE91dHB1dERldmljZTsgICAgICAgLyogU2VsZWN0ZWQgb3V0cHV0IGRldmljZSB0eXBlICovCi0gICAgTFZDU19Wb2xDb3JyZWN0X3QgICAgICAgVm9sQ29ycmVjdDsgICAgICAgICAvKiBWb2x1bWUgY29ycmVjdGlvbiBzZXR0aW5ncyAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIFRyYW5zaXRpb25HYWluOyAgICAgLyogVHJhbnNpdGlvbiBnYWluICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgQ29tcHJlc3NHYWluOyAgICAgICAvKiBMYXN0IHVzZWQgY29tcHJlc3NvciBnYWluKi8KKyAgICBMVkNTX091dHB1dERldmljZV9lbiBPdXRwdXREZXZpY2U7IC8qIFNlbGVjdGVkIG91dHB1dCBkZXZpY2UgdHlwZSAqLworICAgIExWQ1NfVm9sQ29ycmVjdF90IFZvbENvcnJlY3Q7ICAgICAgLyogVm9sdW1lIGNvcnJlY3Rpb24gc2V0dGluZ3MgKi8KKyAgICBMVk1fRkxPQVQgVHJhbnNpdGlvbkdhaW47ICAgICAgICAgIC8qIFRyYW5zaXRpb24gZ2FpbiAqLworICAgIExWTV9GTE9BVCBDb21wcmVzc0dhaW47ICAgICAgICAgICAgLyogTGFzdCB1c2VkIGNvbXByZXNzb3IgZ2FpbiovCiAKICAgICAvKiBTdWItYmxvY2sgY29uZmlndXJhdGlvbnMgKi8KLSAgICBMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgICBTdGVyZW9FbmhhbmNlcjsgICAgIC8qIFN0ZXJlbyBlbmhhbmNlciBjb25maWd1cmF0aW9uICovCi0gICAgTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAgUmV2ZXJiZXJhdGlvbjsgICAgICAvKiBSZXZlcmJlcmF0aW9uIGNvbmZpZ3VyYXRpb24gKi8KLSAgICBMVkNTX0VxdWFsaXNlcl90ICAgICAgICBFcXVhbGlzZXI7ICAgICAgICAgIC8qIEVxdWFsaXNlciBjb25maWd1cmF0aW9uICovCi0gICAgTFZDU19CeXBhc3NNaXhfdCAgICAgICAgQnlwYXNzTWl4OyAgICAgICAgICAvKiBCeXBhc3MgbWl4ZXIgY29uZmlndXJhdGlvbiAqLworICAgIExWQ1NfU3RlcmVvRW5oYW5jZXJfdCBTdGVyZW9FbmhhbmNlcjsgLyogU3RlcmVvIGVuaGFuY2VyIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBMVkNTX1JldmVyYkdlbmVyYXRvcl90IFJldmVyYmVyYXRpb247IC8qIFJldmVyYmVyYXRpb24gY29uZmlndXJhdGlvbiAqLworICAgIExWQ1NfQnlwYXNzTWl4X3QgQnlwYXNzTWl4OyAgICAgICAgICAgLyogQnlwYXNzIG1peGVyIGNvbmZpZ3VyYXRpb24gKi8KIAogICAgIC8qIEJ5cGFzcyB2YXJpYWJsZSAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE1TVGFyZ2V0MDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1peGVyIHN0YXRlIGNvbnRyb2wgdmFyaWFibGUgZm9yIHNtb290aCB0cmFuc3Rpb24gKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBNU1RhcmdldDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNaXhlciBzdGF0ZSBjb250cm9sIHZhcmlhYmxlIGZvciBzbW9vdGggdHJhbnN0aW9uICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgYkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb247ICAgICAgICAgLyogT3BlcmF0aW5nIG1vZGUgdHJhbnNpdGlvbiBmbGFnICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgYlRpbWVyRG9uZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGltZXIgY29tcGxldGlvbiBmbGFnICovCi0gICAgTFZNX1RpbWVyX1BhcmFtc190ICAgICAgVGltZXJQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVGltZXIgcGFyYW1ldGVycyAqLwotICAgIExWTV9UaW1lcl9JbnN0YW5jZV90ICAgIFRpbWVySW5zdGFuY2U7ICAgICAgICAgICAgICAgICAgICAgIC8qIFRpbWVyIGluc3RhbmNlICovCisgICAgTFZNX0lOVDE2IE1TVGFyZ2V0MDsgICAgICAgICAgICAgICAgICAvKiBNaXhlciBzdGF0ZSBjb250cm9sIHZhcmlhYmxlIGZvciBzbW9vdGggdHJhbnNpdGlvbiAqLworICAgIExWTV9JTlQxNiBNU1RhcmdldDE7ICAgICAgICAgICAgICAgICAgLyogTWl4ZXIgc3RhdGUgY29udHJvbCB2YXJpYWJsZSBmb3Igc21vb3RoIHRyYW5zaXRpb24gKi8KKyAgICBMVk1fSU5UMTYgYkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb247IC8qIE9wZXJhdGluZyBtb2RlIHRyYW5zaXRpb24gZmxhZyAqLworICAgIExWTV9JTlQxNiBiVGltZXJEb25lOyAgICAgICAgICAgICAgICAgLyogVGltZXIgY29tcGxldGlvbiBmbGFnICovCisgICAgTFZNX1RpbWVyX1BhcmFtc190IFRpbWVyUGFyYW1zOyAgICAgICAvKiBUaW1lciBwYXJhbWV0ZXJzICovCisgICAgTFZNX1RpbWVyX0luc3RhbmNlX3QgVGltZXJJbnN0YW5jZTsgICAvKiBUaW1lciBpbnN0YW5jZSAqLworICAgIHN0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjphdWRpb191dGlsczo6QmlxdWFkRmlsdGVyPExWTV9GTE9BVD4+CisgICAgICAgICAgICBwRXFCaXF1YWQ7IC8qIEJpcXVhZCBmaWx0ZXIgaW5zdGFuY2UgZm9yIEVxdWFsaXNlciAqLworICAgIHN0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjphdWRpb191dGlsczo6QmlxdWFkRmlsdGVyPExWTV9GTE9BVD4+CisgICAgICAgICAgICBwUmV2QmlxdWFkOyAvKiBCaXF1YWQgZmlsdGVyIGluc3RhbmNlIGZvciBSZXZlcmJlcmF0aW9uICovCisgICAgc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpCaXF1YWRGaWx0ZXI8TFZNX0ZMT0FUPj4KKyAgICAgICAgICAgIHBTRU1pZEJpcXVhZDsgLyogQmlxdWFkIGZpbHRlciBpbnN0YW5jZSBmb3IgU3RlcmVvIGVuaGFuY2VtZW50IG1pZCAqLworICAgIHN0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjphdWRpb191dGlsczo6QmlxdWFkRmlsdGVyPExWTV9GTE9BVD4+CisgICAgICAgICAgICBwU0VTaWRlQmlxdWFkOyAvKiBCaXF1YWQgZmlsdGVyIGluc3RhbmNlIGZvciBTdGVyZW8gZW5oYW5jZW1lbnQgc2lkZSAqLworICAgIHZvaWQqIHBTY3JhdGNoOyAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBidW5kbGUgc2NyYXRjaCBidWZmZXIgKi8KIAogfSBMVkNTX0luc3RhbmNlX3Q7CiAKLS8qIENvZWZmaWNpZW50IFN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBFcXVhbGlzZXJCaXF1YWRJbnN0YW5jZTsKLSAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBSZXZlcmJCaXF1YWRJbnN0YW5jZTsKLSAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBTRUJpcXVhZEluc3RhbmNlTWlkOwotICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIFNFQmlxdWFkSW5zdGFuY2VTaWRlOwotfSBMVkNTX0NvZWZmaWNpZW50X3Q7CiAKLS8qIERhdGEgU3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190IEVxdWFsaXNlckJpcXVhZFRhcHM7Ci0gICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgUmV2ZXJiQmlxdWFkVGFwczsKLSAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCBTRUJpcXVhZFRhcHNNaWQ7Ci0gICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgU0VCaXF1YWRUYXBzU2lkZTsKLX0gTFZDU19EYXRhX3Q7Cit2b2lkIExWQ1NfVGltZXJDYWxsQmFjayh2b2lkKiBoSW5zdGFuY2UsIHZvaWQqIHBDYWxsQmFja1BhcmFtcywgTFZNX0lOVDMyIENhbGxiYWNrUGFyYW0pOwogCi12b2lkIExWQ1NfVGltZXJDYWxsQmFjayAoICAgdm9pZCogaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBDYWxsQmFja1BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgQ2FsbGJhY2tQYXJhbSk7Ci0KLSNlbmRpZiAgICAgIC8qIFBSSVZBVEVfSCAqLwotCisjZW5kaWYgLyogUFJJVkFURV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jcHAKaW5kZXggOGUwOWJlMi4uNmFmMGY3NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmNwcApAQCAtNjUsMTE2ICs2NSw3NSBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzX0NTKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcykKLXsKLSAgICBjb25zdCBMVk1fRkxPQVQgICAgICpwSW5wdXQ7Ci0gICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFNjcmF0Y2g7CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1Byb2Nlc3NfQ1MoTFZDU19IYW5kbGVfdCBoSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBPdXREYXRhLCBMVk1fVUlOVDE2IE51bVNhbXBsZXMpIHsKKyAgICBjb25zdCBMVk1fRkxPQVQqIHBJbnB1dDsKKyAgICBMVkNTX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKKyAgICBMVk1fRkxPQVQqIHBTY3JhdGNoOwogICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuIGVycjsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFN0SW47Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICBjaGFubmVscyA9IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHM7CisgICAgTFZNX0ZMT0FUKiBwU3RJbjsKKyAgICBMVk1fSU5UMzIgY2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOwogI2RlZmluZSBOckZyYW1lcyBOdW1TYW1wbGVzICAvLyBhbGlhcyBmb3IgY2xhcml0eQogCi0gICAgLypJbiBjYXNlIG9mIG1vbm8gcHJvY2Vzc2luZywgc3RlcmVvIGlucHV0IGlzIGNyZWF0ZWQgZnJvbSBtb25vCi0gICAgICphbmQgc3RvcmVkIGluIHBJbkRhdGEgYmVmb3JlIGFwcGx5aW5nIGFueSBvZiB0aGUgZWZmZWN0cy4KLSAgICAgKkhvd2V2ZXIgd2UgZG8gbm90IHVwZGF0ZSB0aGUgdmFsdWUgcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscwotICAgICAqYXQgdGhpcyBwb2ludC4KLSAgICAgKlNvIHRvIHRyZWF0IHRoZSBwSW5EYXRhIGFzIHN0ZXJlbyB3ZSBhcmUgc2V0dGluZyBjaGFubmVscyB0byAyCi0gICAgICovCi0gICAgaWYgKGNoYW5uZWxzID09IDEpCi0gICAgewotICAgICAgICBjaGFubmVscyA9IDI7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopIFwKLSAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7CisgICAgcFNjcmF0Y2ggPSAoTFZNX0ZMT0FUKilwSW5zdGFuY2UtPnBTY3JhdGNoOwogCiAgICAgLyoKICAgICAgKiBDaGVjayBpZiB0aGUgcHJvY2Vzc2luZyBpcyBpbnBsYWNlCiAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgIC8qCiAgICAgICogVGhlIHBJbnB1dCBidWZmZXIgaG9sZHMgdGhlIGZpcnN0IDIgKExlZnQsIFJpZ2h0KSBjaGFubmVscyBpbmZvcm1hdGlvbi4KICAgICAgKiBIZW5jZSB0aGUgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoaXMgYnVmZmVyIGlzIDIgKiBOdW1GcmFtZXMuCiAgICAgICogVGhlIENvbmNlcnQgU3Vycm91bmQgbW9kdWxlIGNhcnJpZXMgb3V0IHByb2Nlc3Npbmcgb25seSBvbiBMLCBSLgogICAgICAqLwogICAgIHBJbnB1dCA9IHBTY3JhdGNoICsgKDIgKiBOckZyYW1lcyk7Ci0gICAgcFN0SW4gID0gcFNjcmF0Y2ggKyAoKExWQ1NfU0NSQVRDSEJVRkZFUlMgLSAyKSAqIE5yRnJhbWVzKTsKLSAgICAvKiBUaGUgZmlyc3QgdHdvIGNoYW5uZWwgZGF0YSBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQKLSAgICAgKiBjb3BpZWQgaW50byBwSW5wdXQgYnVmZmVyCi0gICAgICovCi0gICAgQ29weV9GbG9hdF9NY19TdGVyZW8oKExWTV9GTE9BVCAqKXBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyk7Ci0gICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcElucHV0LAotICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTdEluLAotICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE5yRnJhbWVzKSk7Ci0jZWxzZQotICAgIGlmIChwSW5EYXRhID09IHBPdXREYXRhKQotICAgIHsKLSAgICAgICAgLyogUHJvY2Vzc2luZyBpbnBsYWNlICovCi0gICAgICAgIHBJbnB1dCA9IHBTY3JhdGNoICsgKDIgKiBOdW1TYW1wbGVzKTsKLSAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5wdXQsICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KKyAgICBwU3RJbiA9IHBTY3JhdGNoICsgKChMVkNTX1NDUkFUQ0hCVUZGRVJTIC0gMikgKiBOckZyYW1lcyk7CisgICAgaWYgKGNoYW5uZWxzID09IEZDQ18xKSB7CisgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCopcEluRGF0YSwgKExWTV9GTE9BVCopcElucHV0LCAoTFZNX0lOVDE2KU5yRnJhbWVzKTsKKyAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUKilwSW5wdXQsIChMVk1fRkxPQVQqKXBTdEluLCAoTFZNX0lOVDE2KU5yRnJhbWVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBUaGUgZmlyc3QgdHdvIGNoYW5uZWwgZGF0YSBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQKKyAgICAgICAgICogY29waWVkIGludG8gcElucHV0IGJ1ZmZlcgorICAgICAgICAgKi8KKyAgICAgICAgQ29weV9GbG9hdF9NY19TdGVyZW8oKExWTV9GTE9BVCopcEluRGF0YSwgKExWTV9GTE9BVCopcElucHV0LCBOckZyYW1lcywgY2hhbm5lbHMpOworICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQqKXBJbnB1dCwgKExWTV9GTE9BVCopcFN0SW4sIChMVk1fSU5UMTYpKEZDQ18yICogTnJGcmFtZXMpKTsKICAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogUHJvY2Vzc2luZyBvdXRwbGFjZSAqLwotICAgICAgICBwSW5wdXQgPSBwSW5EYXRhOwotICAgIH0KLSNlbmRpZgogICAgIC8qCiAgICAgICogQ2FsbCB0aGUgc3RlcmVvIGVuaGFuY2VyCiAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwotICAgIGVyciA9IExWQ1NfU3RlcmVvRW5oYW5jZXIoaEluc3RhbmNlLCAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RJbiwgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMpOyAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGZyYW1lcyB0byBwcm9jZXNzICovCi0jZWxzZQotICAgIGVyciA9IExWQ1NfU3RlcmVvRW5oYW5jZXIoaEluc3RhbmNlLCAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLwotI2VuZGlmCisgICAgZXJyID0gTFZDU19TdGVyZW9FbmhhbmNlcihoSW5zdGFuY2UsIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0SW4sICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgIC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcyk7IC8qIE51bWJlciBvZiBmcmFtZXMgdG8gcHJvY2VzcyAqLwogCiAgICAgLyoKICAgICAgKiBDYWxsIHRoZSByZXZlcmIgZ2VuZXJhdG9yCiAgICAgICovCi0gICAgZXJyID0gTFZDU19SZXZlcmJHZW5lcmF0b3IoaEluc3RhbmNlLCAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisgICAgZXJyID0gTFZDU19SZXZlcmJHZW5lcmF0b3IoaEluc3RhbmNlLCAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgIC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KIAogICAgIC8qCiAgICAgICogQ2FsbCB0aGUgZXF1YWxpc2VyCiAgICAgICovCi0gICAgZXJyID0gTFZDU19FcXVhbGlzZXIoaEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLworICAgIGVyciA9IExWQ1NfRXF1YWxpc2VyKGhJbnN0YW5jZSwgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCiAKICAgICAvKgogICAgICAqIENhbGwgdGhlIGJ5cGFzcyBtaXhlcgogICAgICAqLwotICAgIGVyciA9IExWQ1NfQnlwYXNzTWl4ZXIoaEluc3RhbmNlLCAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgcHJvY2Vzc2VkIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCAodW5wcm9jZXNzZWQpIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKyAgICBlcnIgPSBMVkNTX0J5cGFzc01peGVyKGhJbnN0YW5jZSwgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAvKiBQb2ludGVyIHRvIHRoZSBwcm9jZXNzZWQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0LCAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0ICh1bnByb2Nlc3NlZCkgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgIC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLwogCi0gICAgaWYoZXJyICE9IExWQ1NfU1VDQ0VTUykKLSAgICB7CisgICAgaWYgKGVyciAhPSBMVkNTX1NVQ0NFU1MpIHsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWQ1NfU1VDQ0VTUyk7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIwMiwxNzEgKzE2MSwxMTcgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2VzcyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgTnVtU2FtcGxlcykKLXsKLQotICAgIExWQ1NfSW5zdGFuY2VfdCAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1Byb2Nlc3MoTFZDU19IYW5kbGVfdCBoSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBPdXREYXRhLCBMVk1fVUlOVDE2IE51bVNhbXBsZXMpIHsKKyAgICBMVkNTX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKICAgICBMVkNTX1JldHVyblN0YXR1c19lbiBlcnI7Ci0jaWZkZWYgU1VQUE9SVF9NQwogICAgIC8qRXh0cmFjdCBudW1iZXIgb2YgQ2hhbm5lbHMgaW5mbyovCiAgICAgTFZNX0lOVDMyIGNoYW5uZWxzID0gcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKKyAgICBMVk1fVUlOVDE2IGRlc3ROdW1TYW1wbGVzID0gKGNoYW5uZWxzID09IEZDQ18xKSA/IE51bVNhbXBsZXMgOiBGQ0NfMiAqIE51bVNhbXBsZXM7CisgICAgTFZNX0lOVDMyIGNvbXBHYWluSW50ZXJ2YWwgPQorICAgICAgICAgICAgKGNoYW5uZWxzID09IEZDQ18xKSA/IExWQ1NfQ09NUEdBSU5GUkFNRSA6IEZDQ18yICogTFZDU19DT01QR0FJTkZSQU1FOwogI2RlZmluZSBOckZyYW1lcyBOdW1TYW1wbGVzICAvLyBhbGlhcyBmb3IgY2xhcml0eQotICAgIGlmIChjaGFubmVscyA9PSAxKQotICAgIHsKLSAgICAgICAgY2hhbm5lbHMgPSAyOwotICAgIH0KLSNlbmRpZgogICAgIC8qCiAgICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKICAgICAgKi8KLSAgICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVkNTX1RPT01BTllTQU1QTEVTKTsKKyAgICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkgeworICAgICAgICByZXR1cm4gKExWQ1NfVE9PTUFOWVNBTVBMRVMpOwogICAgIH0KIAogICAgIC8qCiAgICAgICogQ2hlY2sgaWYgdGhlIGFsZ29yaXRobSBpcyBlbmFibGVkCiAgICAgICovCi0gICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gTFZDU19PRkYpCi0gICAgewotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICAgICAgTFZNX0ZMT0FUICpwU3RlcmVvT3V0OworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICE9IExWQ1NfT0ZGKSB7CisgICAgICAgIExWTV9GTE9BVCogcFN0ZXJlb091dDsKICAgICAgICAgLyoKICAgICAgICAgICogTFZDU19Qcm9jZXNzX0NTIHVzZXMgb3V0cHV0IGJ1ZmZlciB0byBzdG9yZSBpbnRlcm1lZGlhdGUgb3V0cHV0cyBvZiBTdGVyZW9FbmhhbmNlciwKICAgICAgICAgICogRXF1YWxpemVyLCBSZXZlcmJHZW5lcmF0b3IgYW5kIEJ5cGFzc01peGVyLgogICAgICAgICAgKiBTbywgdG8gYXZvaWQgaS9vIGRhdGEgb3ZlcmxhcHBpbmcsIHdoZW4gaS9vIGJ1ZmZlcnMgYXJlIGNvbW1vbiwgdXNlIHNjcmF0Y2ggYnVmZmVyCiAgICAgICAgICAqIHRvIHN0b3JlIGludGVybWVkaWF0ZSBvdXRwdXRzLgogICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBPdXREYXRhID09IHBJbkRhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAvKgotICAgICAgICAgICAqIFNjcmF0Y2ggbWVtb3J5IGlzIHVzZWQgaW4gNCBjaHVua3Mgb2YgKDIgKiBOckZyYW1lcykgc2l6ZS4KLSAgICAgICAgICAgKiBGaXJzdCBjaHVuayBvZiBtZW1vcnkgaXMgdXNlZCBieSBMVkNTX1N0ZXJlb0VuaGFuY2VyIGFuZCBMVkNTX1JldmVyYkdlbmVyYXRvciwKLSAgICAgICAgICAgKiBzZWNvbmQgYW5kIGZvdXJ0aCBhcmUgdXNlZCBhcyBpbnB1dCBidWZmZXJzIGJ5IHBJbnB1dCBhbmQgcFN0SW4gaW4gTFZDU19Qcm9jZXNzX0NTLgotICAgICAgICAgICAqIEhlbmNlLCBwU3RlcmVvT3V0IGlzIHBvaW50ZWQgdG8gdXNlIHVudXNlZCB0aGlyZCBwb3J0aW9uIG9mIHNjcmF0Y2ggbWVtb3J5LgotICAgICAgICAgICAqLwotICAgICAgICAgICAgcFN0ZXJlb091dCA9IChMVk1fRkxPQVQgKikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKChMVkNTX1NDUkFUQ0hCVUZGRVJTIC0gNCkgKiBOckZyYW1lcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIGlmIChwT3V0RGF0YSA9PSBwSW5EYXRhKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU2NyYXRjaCBtZW1vcnkgaXMgdXNlZCBpbiA0IGNodW5rcyBvZiAoMiAqIE5yRnJhbWVzKSBzaXplLgorICAgICAgICAgICAgICogRmlyc3QgY2h1bmsgb2YgbWVtb3J5IGlzIHVzZWQgYnkgTFZDU19TdGVyZW9FbmhhbmNlciBhbmQgTFZDU19SZXZlcmJHZW5lcmF0b3IsCisgICAgICAgICAgICAgKiBzZWNvbmQgYW5kIGZvdXJ0aCBhcmUgdXNlZCBhcyBpbnB1dCBidWZmZXJzIGJ5IHBJbnB1dCBhbmQgcFN0SW4gaW4gTFZDU19Qcm9jZXNzX0NTLgorICAgICAgICAgICAgICogSGVuY2UsIHBTdGVyZW9PdXQgaXMgcG9pbnRlZCB0byB1c2UgdW51c2VkIHRoaXJkIHBvcnRpb24gb2Ygc2NyYXRjaCBtZW1vcnkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBTdGVyZW9PdXQgPSAoTFZNX0ZMT0FUKilwSW5zdGFuY2UtPnBTY3JhdGNoICsgKChMVkNTX1NDUkFUQ0hCVUZGRVJTIC0gNCkgKiBOckZyYW1lcyk7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwU3RlcmVvT3V0ID0gcE91dERhdGE7CiAgICAgICAgIH0KIAogICAgICAgICAvKgogICAgICAgICAgKiBDYWxsIENTIHByb2Nlc3MgZnVuY3Rpb24KICAgICAgICAgICovCi0gICAgICAgICAgICBlcnIgPSBMVkNTX1Byb2Nlc3NfQ1MoaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0ZXJlb091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcyk7Ci0jZWxzZQotICAgICAgICAgICAgZXJyID0gTFZDU19Qcm9jZXNzX0NTKGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOwotI2VuZGlmCisgICAgICAgIGVyciA9IExWQ1NfUHJvY2Vzc19DUyhoSW5zdGFuY2UsIHBJbkRhdGEsIHBTdGVyZW9PdXQsIE5yRnJhbWVzKTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBDb21wcmVzcyB0byByZWR1Y2UgZXhwYW5zaW9uIGVmZmVjdCBvZiBDb25jZXJ0IFNvdW5kIGFuZCBjb3JyZWN0IHZvbHVtZQogICAgICAgICAgKiBkaWZmZXJlbmNlcyBmb3IgZGlmZmVyZW5jZSBzZXR0aW5ncy4gTm90IGFwcGxpZWQgaW4gdGVzdCBtb2RlcwogICAgICAgICAgKi8KLSAgICAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWQ1NfT04pJiYgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Db21wcmVzc29yTW9kZSA9PSBMVk1fTU9ERV9PTikpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWQ1NfT04pICYmCisgICAgICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuQ29tcHJlc3Nvck1vZGUgPT0gTFZNX01PREVfT04pKSB7CiAgICAgICAgICAgICBMVk1fRkxPQVQgR2FpbiA9IHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluOwogICAgICAgICAgICAgTFZNX0ZMT0FUIEN1cnJlbnQxOwogCiAgICAgICAgICAgICBDdXJyZW50MSA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSk7Ci0gICAgICAgICAgICBHYWluID0gKExWTV9GTE9BVCkoICBwSW5zdGFuY2UtPlZvbENvcnJlY3QuQ29tcE1pbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKCgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluICAqIChDdXJyZW50MSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wRnVsbCAqIChDdXJyZW50MSkpKSk7CisgICAgICAgICAgICBHYWluID0gKExWTV9GTE9BVCkocEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBNaW4gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKExWTV9GTE9BVClwSW5zdGFuY2UtPlZvbENvcnJlY3QuQ29tcE1pbiAqIChDdXJyZW50MSkpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wRnVsbCAqIChDdXJyZW50MSkpKSk7CiAKLSAgICAgICAgICAgIGlmKE51bVNhbXBsZXMgPCBMVkNTX0NPTVBHQUlORlJBTUUpCi0gICAgICAgICAgICB7Ci0jaWZkZWYgU1VQUE9SVF9NQwotICAgICAgICAgICAgICAgIE5vbkxpbkNvbXBfRmxvYXQoR2FpbiwgICAgICAgICAgICAgICAgICAgIC8qIENvbXByZXNzb3IgZ2FpbiBzZXR0aW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RlcmVvT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0ZXJlb091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKDIgKiBOckZyYW1lcykpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICBOb25MaW5Db21wX0Zsb2F0KEdhaW4sICAgICAgICAgICAgICAgICAgICAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKDIgKiBOdW1TYW1wbGVzKSk7Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMVk1fRkxPQVQgIEdhaW5TdGVwOwotICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgRmluYWxHYWluOwotICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgU2FtcGxlVG9Qcm9jZXNzID0gTnVtU2FtcGxlczsKLSAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpwT3V0UHRyOworICAgICAgICAgICAgaWYgKE51bVNhbXBsZXMgPCBMVkNTX0NPTVBHQUlORlJBTUUpIHsKKyAgICAgICAgICAgICAgICBOb25MaW5Db21wX0Zsb2F0KEdhaW4sIC8qIENvbXByZXNzb3IgZ2FpbiBzZXR0aW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RlcmVvT3V0LCBwU3RlcmVvT3V0LCAoTFZNX0lOVDMyKWRlc3ROdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTFZNX0ZMT0FUIEdhaW5TdGVwOworICAgICAgICAgICAgICAgIExWTV9GTE9BVCBGaW5hbEdhaW47CisgICAgICAgICAgICAgICAgTFZNX0lOVDE2IFNhbXBsZVRvUHJvY2VzcyA9IE51bVNhbXBsZXM7CisgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwT3V0UHRyOwogCiAgICAgICAgICAgICAgICAgLyogTGFyZ2UgY2hhbmdlcyBpbiBHYWluIGNhbiBjYXVzZSBjbGlja3MgaW4gb3V0cHV0CiAgICAgICAgICAgICAgICAgICAgU3BsaXQgZGF0YSBpbnRvIHNtYWxsIGJsb2NrcyBhbmQgdXNlIGludGVycG9sYXRlZCBnYWluIHZhbHVlcyAqLwogCi0gICAgICAgICAgICAgICAgR2FpblN0ZXAgPSAoTFZNX0ZMT0FUKSgoKEdhaW4tcEluc3RhbmNlLT5Db21wcmVzc0dhaW4pICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19DT01QR0FJTkZSQU1FKSAvIE51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gKExWTV9GTE9BVCkoKChHYWluIC0gcEluc3RhbmNlLT5Db21wcmVzc0dhaW4pICogTFZDU19DT01QR0FJTkZSQU1FKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKIAotICAgICAgICAgICAgICAgIGlmKChHYWluU3RlcCA9PSAwKSAmJiAocEluc3RhbmNlLT5Db21wcmVzc0dhaW4gPCBHYWluKSkKLSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChHYWluU3RlcCA9PSAwKSAmJiAocEluc3RhbmNlLT5Db21wcmVzc0dhaW4gPCBHYWluKSkgewogICAgICAgICAgICAgICAgICAgICBHYWluU3RlcCA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKChHYWluU3RlcCA9PSAwKSAmJiAocEluc3RhbmNlLT5Db21wcmVzc0dhaW4gPiBHYWluKSkKLSAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoR2FpblN0ZXAgPT0gMCkgJiYgKHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluID4gR2FpbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gLTE7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBGaW5hbEdhaW4gPSBHYWluOwogICAgICAgICAgICAgICAgIEdhaW4gPSBwSW5zdGFuY2UtPkNvbXByZXNzR2FpbjsKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICAgICAgICAgcE91dFB0ciA9IHBTdGVyZW9PdXQ7Ci0jZWxzZQotICAgICAgICAgICAgICAgIHBPdXRQdHIgPSBwT3V0RGF0YTsKLSNlbmRpZgogCi0gICAgICAgICAgICAgICAgd2hpbGUoU2FtcGxlVG9Qcm9jZXNzID4gMCkKLSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKFNhbXBsZVRvUHJvY2VzcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgR2FpbiA9IChMVk1fRkxPQVQpKEdhaW4gKyBHYWluU3RlcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKChHYWluU3RlcCA+IDApICYmIChGaW5hbEdhaW4gPD0gR2FpbikpCi0gICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChHYWluU3RlcCA+IDApICYmIChGaW5hbEdhaW4gPD0gR2FpbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW4gPSBGaW5hbEdhaW47CiAgICAgICAgICAgICAgICAgICAgICAgICBHYWluU3RlcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZigoR2FpblN0ZXAgPCAwKSAmJiAoRmluYWxHYWluID4gR2FpbikpCi0gICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChHYWluU3RlcCA8IDApICYmIChGaW5hbEdhaW4gPiBHYWluKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgR2FpbiA9IEZpbmFsR2FpbjsKICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gMDsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmKFNhbXBsZVRvUHJvY2VzcyA+IExWQ1NfQ09NUEdBSU5GUkFNRSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTm9uTGluQ29tcF9GbG9hdChHYWluLCAgICAgICAgICAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoMiAqIExWQ1NfQ09NUEdBSU5GUkFNRSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciArPSAoMiAqIExWQ1NfQ09NUEdBSU5GUkFNRSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChTYW1wbGVUb1Byb2Nlc3MgPiBMVkNTX0NPTVBHQUlORlJBTUUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vbkxpbkNvbXBfRmxvYXQoR2FpbiwgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwgcE91dFB0ciwgY29tcEdhaW5JbnRlcnZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyICs9IGNvbXBHYWluSW50ZXJ2YWw7CiAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVUb1Byb2Nlc3MgPSAoTFZNX0lOVDE2KShTYW1wbGVUb1Byb2Nlc3MgLSBMVkNTX0NPTVBHQUlORlJBTUUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTm9uTGluQ29tcF9GbG9hdChHYWluLCAgICAgICAgICAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoMiAqIFNhbXBsZVRvUHJvY2VzcykpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTm9uTGluQ29tcF9GbG9hdChHYWluLCAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLCBwT3V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbm5lbHMgPT0gRkNDXzEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoTFZNX0lOVDMyKShTYW1wbGVUb1Byb2Nlc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoTFZNX0lOVDMyKShGQ0NfMiAqIFNhbXBsZVRvUHJvY2VzcykpOwogICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlVG9Qcm9jZXNzID0gMDsKICAgICAgICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC0zNzQsNTcgKzI3OSwzMyBAQAogICAgICAgICAgICAgcEluc3RhbmNlLT5Db21wcmVzc0dhaW4gPSBHYWluOwogICAgICAgICB9CiAKLSAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSl7Ci0KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPT0gTFZNX1RSVUUpIHsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBSZS1pbml0IGJ5cGFzcyBtaXggd2hlbiB0aW1lciBoYXMgY29tcGxldGVkCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5iVGltZXJEb25lID09IExWTV9UUlVFKSAmJgotICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCA9PSAwKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBMVkNTX0J5cGFzc01peEluaXQoaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QYXJhbXMpOworICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCA9PSAwKSkgeworICAgICAgICAgICAgICAgIGVyciA9IExWQ1NfQnlwYXNzTWl4SW5pdChoSW5zdGFuY2UsICZwSW5zdGFuY2UtPlBhcmFtcyk7CiAKLSAgICAgICAgICAgICAgICBpZihlcnIgIT0gTFZDU19TVUNDRVNTKQotICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IExWQ1NfU1VDQ0VTUykgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICBMVk1fVGltZXIgKCAmcEluc3RhbmNlLT5UaW1lckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExWTV9UaW1lcigmcEluc3RhbmNlLT5UaW1lckluc3RhbmNlLCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0jaWZkZWYgU1VQUE9SVF9NQwotICAgICAgICBDb3B5X0Zsb2F0X1N0ZXJlb19NYyhwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RlcmVvT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzKTsKLSNlbmRpZgotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkKLSAgICAgICAgewotI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgQ29weV9GbG9hdF9TdGVyZW9fTWMocEluRGF0YSwgKGNvbnN0IExWTV9GTE9BVCopcFN0ZXJlb091dCwgcE91dERhdGEsIE5yRnJhbWVzLCBjaGFubmVscyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpIHsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIHNvIGp1c3QgY29weSB0aGUgZGF0YQogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE91dERhdGEsICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoY2hhbm5lbHMgKiBOckZyYW1lcykpOyAgICAvKiBBbGwgQ2hhbm5lbHMqLwotI2Vsc2UKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIHNvIGp1c3QgY29weSB0aGUgZGF0YQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE91dERhdGEsICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KLSNlbmRpZgorICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUKilwSW5EYXRhLCAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKilwT3V0RGF0YSwgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKGNoYW5uZWxzICogTnJGcmFtZXMpKTsgLyogQWxsIENoYW5uZWxzKi8KICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZDU19TVUNDRVNTKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jcHAKaW5kZXggZDBlNmUwOS4uZGUyM2QwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jcHAKQEAgLTIwLDcgKzIwLDggQEAKIC8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgIkxWQ1MuaCIKICNpbmNsdWRlICJMVkNTX1ByaXZhdGUuaCIKICNpbmNsdWRlICJMVkNTX1JldmVyYkdlbmVyYXRvci5oIgpAQCAtNTcsMzEgKzU4LDE5IEBACiAvKiAgMi4gIFRoZSBudW1lcmF0b3IgY29lZmZpY2llbnRzIG9mIHRoZSBmaWx0ZXIgYXJlIG5lZ2F0ZWQgdG8gY2F1c2UgYW4gaW52ZXJzaW9uLiAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvckluaXQoTFZDU19IYW5kbGVfdCAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICpwUGFyYW1zKQotewotCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgRGVsYXk7Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgT2Zmc2V0OwotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVkNTX1JldmVyYkdlbmVyYXRvcl90ICAqcENvbmZpZyAgID0gKExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QgKikmcEluc3RhbmNlLT5SZXZlcmJlcmF0aW9uOwotICAgIExWQ1NfRGF0YV90ICAgICAgICAgICAgICpwRGF0YTsKLSAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50czsKLSAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgQ29lZmZzOwotICAgIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgICpwUmV2ZXJiQ29lZlRhYmxlOwotCi0gICAgcERhdGEgPSAoTFZDU19EYXRhX3QgKikgXAotICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzOwotCi0gICAgcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAotICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBMVkNTX1BhcmFtc190KiBwUGFyYW1zKSB7CisgICAgTFZNX1VJTlQxNiBEZWxheTsKKyAgICBMVk1fVUlOVDE2IE9mZnNldDsKKyAgICBMVkNTX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKKyAgICBMVkNTX1JldmVyYkdlbmVyYXRvcl90KiBwQ29uZmlnID0gKExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QqKSZwSW5zdGFuY2UtPlJldmVyYmVyYXRpb247CisgICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCogcFJldmVyYkNvZWZUYWJsZTsKIAogICAgIC8qCiAgICAgICogSW5pdGlhbGlzZSB0aGUgZGVsYXkgYW5kIGZpbHRlcnMgaWY6CiAgICAgICogIC0gdGhlIHNhbXBsZSByYXRlIGhhcyBjaGFuZ2VkCiAgICAgICogIC0gdGhlIHNwZWFrZXIgdHlwZSBoYXMgY2hhbmdlZCB0byBvciBmcm9tIHRoZSBtb2JpbGUgc3BlYWtlcgogICAgICAqLwotICAgIGlmKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSApICAgICAgLyogU2FtcGxlIHJhdGUgY2hhbmdlIHRlc3QgKi8KKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSAvKiBTYW1wbGUgcmF0ZSBjaGFuZ2UgdGVzdCAqLwogCiAgICAgewogICAgICAgICAvKgpAQCAtODksNTkgKzc4LDM2IEBACiAgICAgICAgICAqLwogICAgICAgICBEZWxheSA9IChMVk1fVUlOVDE2KUxWQ1NfU3RlcmVvRGVsYXlDU1soTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsKIAotICAgICAgICBwQ29uZmlnLT5EZWxheVNpemUgICAgICA9IChMVk1fSU5UMTYpKDIgKiBEZWxheSk7Ci0gICAgICAgIHBDb25maWctPkRlbGF5T2Zmc2V0ICAgID0gMDsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKSZwQ29uZmlnLT5TdGVyZW9TYW1wbGVzWzBdLCAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocENvbmZpZy0+U3RlcmVvU2FtcGxlcykgLyBzaXplb2YoTFZNX0ZMT0FUKSkpOworICAgICAgICBwQ29uZmlnLT5EZWxheVNpemUgPQorICAgICAgICAgICAgICAgIChwUGFyYW1zLT5OckNoYW5uZWxzID09IEZDQ18xKSA/IChMVk1fSU5UMTYpRGVsYXkgOiAoTFZNX0lOVDE2KShGQ0NfMiAqIERlbGF5KTsKKyAgICAgICAgcENvbmZpZy0+RGVsYXlPZmZzZXQgPSAwOworICAgICAgICBtZW1zZXQocENvbmZpZy0+U3RlcmVvU2FtcGxlcywgMCwgc2l6ZW9mKHBDb25maWctPlN0ZXJlb1NhbXBsZXMpKTsKICAgICAgICAgLyoKICAgICAgICAgICogU2V0dXAgdGhlIGZpbHRlcnMKICAgICAgICAgICovCiAgICAgICAgIE9mZnNldCA9IChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGU7CiAgICAgICAgIHBSZXZlcmJDb2VmVGFibGUgPSAoQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCopJkxWQ1NfUmV2ZXJiQ29lZlRhYmxlWzBdOwogCi0gICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KLSAgICAgICAgQ29lZmZzLkEwID0gKExWTV9GTE9BVClwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQTA7Ci0gICAgICAgIENvZWZmcy5BMSA9IChMVk1fRkxPQVQpcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkExOwotICAgICAgICBDb2VmZnMuQTIgPSAoTFZNX0ZMT0FUKXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5BMjsKLSAgICAgICAgQ29lZmZzLkIxID0gKExWTV9GTE9BVCktcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkIxOwotICAgICAgICBDb2VmZnMuQjIgPSAoTFZNX0ZMT0FUKS1wUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQjI7Ci0KLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcERhdGEtPlJldmVyYkJpcXVhZFRhcHMsIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPlJldmVyYkJpcXVhZFRhcHMpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKLQotICAgICAgICBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnRzLT5SZXZlcmJCaXF1YWRJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPlJldmVyYkJpcXVhZFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmcyk7Ci0KLSAgICAgICAgLyogQ2FsbGJhY2tzICovCi0gICAgICAgIHN3aXRjaChwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uU2NhbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKyAgICAgICAgc3RkOjphcnJheTxMVk1fRkxPQVQsIGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjprQmlxdWFkTnVtQ29lZnM+IGNvZWZzID0geworICAgICAgICAgICAgICAgIHBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5BMCwgcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkExLAorICAgICAgICAgICAgICAgIHBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5BMiwgcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkIxLAorICAgICAgICAgICAgICAgIHBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5CMn07CisgICAgICAgIHBJbnN0YW5jZS0+cFJldkJpcXVhZC5yZXNldChuZXcgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxMVk1fRkxPQVQ+KAorICAgICAgICAgICAgICAgIChwUGFyYW1zLT5OckNoYW5uZWxzID09IEZDQ18xKSA/IEZDQ18xIDogRkNDXzIsIGNvZWZzKSk7CiAKICAgICAgICAgLyoKICAgICAgICAgICogU2V0dXAgdGhlIG1peGVyCiAgICAgICAgICAqLwogICAgICAgICBwQ29uZmlnLT5Qcm9jR2FpbiA9IChMVk1fVUlOVDE2KShIRUFEUEhPTkVHQUlOUFJPQyk7Ci0gICAgICAgIHBDb25maWctPlVucHJvY0dhaW4gID0gKExWTV9VSU5UMTYpKEhFQURQSE9ORUdBSU5VTlBST0MpOworICAgICAgICBwQ29uZmlnLT5VbnByb2NHYWluID0gKExWTV9VSU5UMTYpKEhFQURQSE9ORUdBSU5VTlBST0MpOwogICAgIH0KIAotICAgIGlmKHBJbnN0YW5jZS0+UGFyYW1zLlJldmVyYkxldmVsICE9IHBQYXJhbXMtPlJldmVyYkxldmVsKQotICAgIHsKLSAgICAgICAgTFZNX0lOVDMyICAgUmV2ZXJiUGVyY2VudGFnZSA9IDgzODg2OyAgICAgIC8vIDEgUGVyY2VudCBSZXZlcmIgaS5lIDEvMTAwIGluIFEgMjMgZm9ybWF0CisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLlJldmVyYkxldmVsICE9IHBQYXJhbXMtPlJldmVyYkxldmVsKSB7CisgICAgICAgIExWTV9JTlQzMiBSZXZlcmJQZXJjZW50YWdlID0gODM4ODY7ICAgICAgICAvLyAxIFBlcmNlbnQgUmV2ZXJiIGkuZSAxLzEwMCBpbiBRIDIzIGZvcm1hdAogICAgICAgICBSZXZlcmJQZXJjZW50YWdlICo9IHBQYXJhbXMtPlJldmVyYkxldmVsOyAgLy8gQWN0dWFsIFJldmVyYiBMZXZlbCBpbiBRIDIzIGZvcm1hdAotICAgICAgICBwQ29uZmlnLT5SZXZlcmJMZXZlbCA9ICgoTFZNX0ZMT0FUKShSZXZlcmJQZXJjZW50YWdlPj44KSkgLyAzMjc2Ny4wZjsKKyAgICAgICAgcENvbmZpZy0+UmV2ZXJiTGV2ZWwgPSAoKExWTV9GTE9BVCkoUmV2ZXJiUGVyY2VudGFnZSA+PiA4KSkgLyAzMjc2Ny4wZjsKICAgICB9Ci0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVkNTX1NVQ0NFU1MpOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xODEsNDYgKzE0NywzOCBAQAogLyogIDIuICBUaGUgR2FpbiBpcyBjb21iaW5lZCB3aXRoIHRoZSBMUEYgYW5kIGluY29ycG9yYXRlZCBpbiB0byB0aGUgY29lZmZpY2llbnRzICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3IoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcykKLXsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9yKExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBPdXREYXRhLCBMVk1fVUlOVDE2IE51bVNhbXBsZXMpIHsKKyAgICBMVkNTX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKKyAgICBMVkNTX1JldmVyYkdlbmVyYXRvcl90KiBwQ29uZmlnID0gKExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QqKSZwSW5zdGFuY2UtPlJldmVyYmVyYXRpb247CisgICAgTFZNX0ZMT0FUKiBwU2NyYXRjaDsKKyAgICBMVk1fSU5UMzIgTnVtQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOworICAgIExWTV9VSU5UMTYgZGVzdE51bVNhbXBsZXMgPQorICAgICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMgPT0gRkNDXzEpID8gTnVtU2FtcGxlcyA6IEZDQ18yICogTnVtU2FtcGxlczsKIAotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVkNTX1JldmVyYkdlbmVyYXRvcl90ICAqcENvbmZpZyAgID0gKExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QgKikmcEluc3RhbmNlLT5SZXZlcmJlcmF0aW9uOwotICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgICAgICpwQ29lZmZpY2llbnRzOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwU2NyYXRjaDsKLQotICAgIHBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopXAotICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7Ci0KLSAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopXAotICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOworICAgIHBTY3JhdGNoID0gKExWTV9GTE9BVCopcEluc3RhbmNlLT5wU2NyYXRjaDsKIAogICAgIC8qCiAgICAgICogQ29weSB0aGUgZGF0YSB0byB0aGUgb3V0cHV0IGluIG91dHBsYWNlIHByb2Nlc3NpbmcKICAgICAgKi8KLSAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkKLSAgICB7CisgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpIHsKICAgICAgICAgLyoKICAgICAgICAgICogUmV2ZXJiIG5vdCByZXF1aXJlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKICAgICAgICAgICovCi0gICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCopcEluRGF0YSwgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQqKXBPdXREYXRhLCAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpZGVzdE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2YgZnJhbWVzICovCiAgICAgfQogCiAgICAgLyoKICAgICAgKiBDaGVjayBpZiB0aGUgcmV2ZXJiIGlzIHJlcXVpcmVkCiAgICAgICovCiAgICAgLyogRGlzYWJsZSB3aGVuIENTNE1TIGluIHN0ZXJlbyBtb2RlICovCi0gICAgaWYgKCgoKExWQ1NfT3V0cHV0RGV2aWNlX2VuKXBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlID09IExWQ1NfSEVBRFBIT05FKSB8fCBcCisgICAgaWYgKCgoKExWQ1NfT3V0cHV0RGV2aWNlX2VuKXBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlID09IExWQ1NfSEVBRFBIT05FKSB8fAogICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlID09IExWQ1NfRVhfSEVBRFBIT05FUykgfHwKLSAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgIT0gTFZDU19TVEVSRU8pKSAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciB2YWxpZGF0aW9uIHRlc3RpbmcgKi8KLSAgICAgICAgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19SRVZFUkJTV0lUQ0gpICE9MCkpCi0gICAgeworICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCAhPSBMVkNTX1NURVJFTykpICYmCisgICAgICAgIC8qIEZvciB2YWxpZGF0aW9uIHRlc3RpbmcgKi8KKyAgICAgICAgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19SRVZFUkJTV0lUQ0gpICE9IDApKSB7CiAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAvKiBDb3B5IHRoZSBpbnB1dCBkYXRhIHRvIHNjcmF0Y2ggbWVtb3J5IGFuZCBmaWx0ZXIgaXQgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMzAsMzQgKzE4OCwyNCBAQAogICAgICAgICAvKgogICAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBkYXRhIHRvIHRoZSBzY3JhdGNoIG1lbW9yeQogICAgICAgICAgKi8KLSAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KKyAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUKilwSW5EYXRhLCAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCopcFNjcmF0Y2gsICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilkZXN0TnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBmcmFtZXMgKi8KIAogICAgICAgICAvKgogICAgICAgICAgKiBGaWx0ZXIgdGhlIGRhdGEKICAgICAgICAgICovCi0gICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2spKChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCopJnBDb2VmZmljaWVudHMtPlJldmVyYkJpcXVhZEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgcEluc3RhbmNlLT5wUmV2QmlxdWFkLT5wcm9jZXNzKHBTY3JhdGNoLCBwU2NyYXRjaCwgTnVtU2FtcGxlcyk7CiAKLSAgICAgICAgTXVsdDNzX0Zsb2F0KCAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+UmV2ZXJiTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7CisgICAgICAgIE11bHQzc19GbG9hdCgoTFZNX0ZMT0FUKilwU2NyYXRjaCwgcENvbmZpZy0+UmV2ZXJiTGV2ZWwsIChMVk1fRkxPQVQqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilkZXN0TnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBmcmFtZXMgKi8KIAogICAgICAgICAvKgogICAgICAgICAgKiBBcHBseSB0aGUgZGVsYXkgbWl4CiAgICAgICAgICAqLwotICAgICAgICBEZWxheU1peF9GbG9hdCgoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICZwQ29uZmlnLT5TdGVyZW9TYW1wbGVzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5EZWxheVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAmcENvbmZpZy0+RGVsYXlPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0KKyAgICAgICAgRGVsYXlNaXhfRmxvYXQoKExWTV9GTE9BVCopcFNjcmF0Y2gsICZwQ29uZmlnLT5TdGVyZW9TYW1wbGVzWzBdLCBwQ29uZmlnLT5EZWxheVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAmcENvbmZpZy0+RGVsYXlPZmZzZXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcywgTnVtQ2hhbm5lbHMpOwogICAgIH0KIAotICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZDU19TVUNDRVNTKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaAppbmRleCAxYmM0MzM4Li4wNDllZWYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oCkBAIC0zMiw4ICszMiw4IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSAgICAgSEVBRFBIT05FR0FJTlBST0MgICAgICAgICAgIExWQ1NfSEVBRFBIT05FX1BST0NHQUlOCi0jZGVmaW5lICAgICBIRUFEUEhPTkVHQUlOVU5QUk9DICAgICAgICAgTFZDU19IRUFEUEhPTkVfVU5QUk9DR0FJTgorI2RlZmluZSBIRUFEUEhPTkVHQUlOUFJPQyBMVkNTX0hFQURQSE9ORV9QUk9DR0FJTgorI2RlZmluZSBIRUFEUEhPTkVHQUlOVU5QUk9DIExWQ1NfSEVBRFBIT05FX1VOUFJPQ0dBSU4KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00MiwyMCArNDIsMTUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIFJldmVyYmVyYXRpb24gbW9kdWxlIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLQordHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIFN0ZXJlbyBkZWxheSAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBEZWxheVNpemU7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIERlbGF5T2Zmc2V0OwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBQcm9jR2FpbjsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgVW5wcm9jR2FpbjsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgU3RlcmVvU2FtcGxlc1syICogTFZDU19TVEVSRU9ERUxBWV9DU19NQVhfVkFMXTsKKyAgICBMVk1fSU5UMTYgRGVsYXlTaXplOworICAgIExWTV9JTlQxNiBEZWxheU9mZnNldDsKKyAgICBMVk1fSU5UMTYgUHJvY0dhaW47CisgICAgTFZNX0lOVDE2IFVucHJvY0dhaW47CisgICAgTFZNX0ZMT0FUIFN0ZXJlb1NhbXBsZXNbMiAqIExWQ1NfU1RFUkVPREVMQVlfQ1NfTUFYX1ZBTF07CiAgICAgLyogUmV2ZXJiIExldmVsICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgIFJldmVyYkxldmVsOwotICAgIC8qIEZpbHRlciAqLwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFjaykgKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqLCBMVk1fRkxPQVQqLCBMVk1fSU5UMTYpOworICAgIExWTV9GTE9BVCBSZXZlcmJMZXZlbDsKIH0gTFZDU19SZXZlcmJHZW5lcmF0b3JfdDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTY0LDExICs1OSw4IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvckluaXQoTFZDU19IYW5kbGVfdCAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICpwUGFyYW1zKTsKLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9yKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKTsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdChMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZDU19QYXJhbXNfdCogcFBhcmFtcyk7CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvcihMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBPdXRwdXQsIExWTV9VSU5UMTYgTnVtU2FtcGxlcyk7CiAKLSNlbmRpZiAgLyogUkVWRVJCX0ggKi8KKyNlbmRpZiAvKiBSRVZFUkJfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5jcHAKaW5kZXggN2ZkODQ0NC4uM2NhMjVmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgIkxWQ1MuaCIKICNpbmNsdWRlICJMVkNTX1ByaXZhdGUuaCIKICNpbmNsdWRlICJMVkNTX1N0ZXJlb0VuaGFuY2VyLmgiCkBAIC00OSw5NiArNTAsMzkgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU0VuaGFuY2VySW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQotewotCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgT2Zmc2V0OwotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgICAqcENvbmZpZyAgID0gKExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAqKSZwSW5zdGFuY2UtPlN0ZXJlb0VuaGFuY2VyOwotICAgIExWQ1NfRGF0YV90ICAgICAgICAgICAgICpwRGF0YTsKLSAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50OwotICAgIEZPX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgQ29lZmZzTWlkOwotICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgQ29lZmZzU2lkZTsKLSAgICBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICpwU0VTaWRlQ29lZnM7Ci0KLSAgICBwRGF0YSAgICAgPSAoTFZDU19EYXRhX3QgKikgXAotICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzczsKLQotICAgIHBDb2VmZmljaWVudCA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAotICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU0VuaGFuY2VySW5pdChMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZDU19QYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWTV9VSU5UMTYgT2Zmc2V0OworICAgIExWQ1NfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCopaEluc3RhbmNlOworICAgIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QqIHBTRVNpZGVDb2VmczsKIAogICAgIC8qCiAgICAgICogSWYgdGhlIHNhbXBsZSByYXRlIG9yIHNwZWFrZXIgdHlwZSBoYXMgY2hhbmdlZCB1cGRhdGUgdGhlIGZpbHRlcnMKICAgICAgKi8KICAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKLSAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlICE9IHBQYXJhbXMtPlNwZWFrZXJUeXBlKSkKLSAgICB7CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAhPSBwUGFyYW1zLT5TcGVha2VyVHlwZSkpIHsKICAgICAgICAgLyoKICAgICAgICAgICogU2V0IHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGJhc2VkIG9uIHRoZSBzYW1wbGUgcmF0ZQogICAgICAgICAgKi8KICAgICAgICAgLyogTWlkIGZpbHRlciAqLwogICAgICAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlOwogCi0gICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KLSAgICAgICAgQ29lZmZzTWlkLkEwID0gKExWTV9GTE9BVCkgTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLkEwOwotICAgICAgICBDb2VmZnNNaWQuQTEgPSAoTFZNX0ZMT0FUKSBMVkNTX1NFTWlkQ29lZlRhYmxlW09mZnNldF0uQTE7Ci0gICAgICAgIENvZWZmc01pZC5CMSA9IChMVk1fRkxPQVQpLUxWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5CMTsKLQotICAgICAgICAvKiBDbGVhciB0aGUgdGFwcyAqLwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcERhdGEtPlNFQmlxdWFkVGFwc01pZCwgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwRGF0YS0+U0VCaXF1YWRUYXBzTWlkKSAvIHNpemVvZihMVk1fRkxPQVQpKSk7Ci0KLSAgICAgICAgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlTWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+U0VCaXF1YWRUYXBzTWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnNNaWQpOwotCi0gICAgICAgIC8qIENhbGxiYWNrcyAqLwotICAgICAgICBpZihMVkNTX1NFTWlkQ29lZlRhYmxlW09mZnNldF0uU2NhbGUgPT0gMTUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFja19NaWQgID0gRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDE7Ci0gICAgICAgIH0KKyAgICAgICAgc3RkOjphcnJheTxMVk1fRkxPQVQsIGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjprQmlxdWFkTnVtQ29lZnM+IGNvZWZzID0geworICAgICAgICAgICAgICAgIExWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5BMCwgTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLkExLCAwLjAsCisgICAgICAgICAgICAgICAgTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLkIxLCAwLjB9OworICAgICAgICBwSW5zdGFuY2UtPnBTRU1pZEJpcXVhZC5yZXNldCgKKyAgICAgICAgICAgICAgICBuZXcgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxMVk1fRkxPQVQ+KEZDQ18xLCBjb2VmcykpOwogCiAgICAgICAgIE9mZnNldCA9IChMVk1fVUlOVDE2KShwUGFyYW1zLT5TYW1wbGVSYXRlKTsKICAgICAgICAgcFNFU2lkZUNvZWZzID0gKEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QqKSZMVkNTX1NFU2lkZUNvZWZUYWJsZVswXTsKIAogICAgICAgICAvKiBTaWRlIGZpbHRlciAqLwotICAgICAgICAvKiBDb252ZXJ0IGluY29taW5nIGNvZWZmaWNpZW50cyB0byB0aGUgcmVxdWlyZWQgZm9ybWF0L29yZGVyaW5nICovCi0gICAgICAgIENvZWZmc1NpZGUuQTAgPSAoTFZNX0ZMT0FUKSBwU0VTaWRlQ29lZnNbT2Zmc2V0XS5BMDsKLSAgICAgICAgQ29lZmZzU2lkZS5BMSA9IChMVk1fRkxPQVQpIHBTRVNpZGVDb2Vmc1tPZmZzZXRdLkExOwotICAgICAgICBDb2VmZnNTaWRlLkEyID0gKExWTV9GTE9BVCkgcFNFU2lkZUNvZWZzW09mZnNldF0uQTI7Ci0gICAgICAgIENvZWZmc1NpZGUuQjEgPSAoTFZNX0ZMT0FUKS1wU0VTaWRlQ29lZnNbT2Zmc2V0XS5CMTsKLSAgICAgICAgQ29lZmZzU2lkZS5CMiA9IChMVk1fRkxPQVQpLXBTRVNpZGVDb2Vmc1tPZmZzZXRdLkIyOwotCi0gICAgICAgIC8qIENsZWFyIHRoZSB0YXBzICovCi0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcERhdGEtPlNFQmlxdWFkVGFwc1NpZGUsIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPlNFQmlxdWFkVGFwc1NpZGUpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKLSAgICAgICAgLyogQ2FsbGJhY2tzICovCi0gICAgICAgIHN3aXRjaChwU0VTaWRlQ29lZnNbT2Zmc2V0XS5TY2FsZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgICBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VTaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmc1NpZGUpOwotCi0gICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX1NpZGUgID0gQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICAgIEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZVNpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPlNFQmlxdWFkVGFwc1NpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzU2lkZSk7Ci0KLSAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfU2lkZSAgPSBCUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCisgICAgICAgIGNvZWZzID0ge3BTRVNpZGVDb2Vmc1tPZmZzZXRdLkEwLCBwU0VTaWRlQ29lZnNbT2Zmc2V0XS5BMSwgcFNFU2lkZUNvZWZzW09mZnNldF0uQTIsCisgICAgICAgICAgICAgICAgIHBTRVNpZGVDb2Vmc1tPZmZzZXRdLkIxLCBwU0VTaWRlQ29lZnNbT2Zmc2V0XS5CMn07CisgICAgICAgIHBJbnN0YW5jZS0+cFNFU2lkZUJpcXVhZC5yZXNldCgKKyAgICAgICAgICAgICAgICBuZXcgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxMVk1fRkxPQVQ+KEZDQ18xLCBjb2VmcykpOwogICAgIH0KIAotICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZDU19TVUNDRVNTKTsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTc4LDg1ICsxMjIsNjcgQEAKIC8qICAxLiAgVGhlIHNpZGUgZmlsdGVyIGlzIG5vdCB1c2VkIGluIE1vYmlsZSBTcGVha2VyIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU3RlcmVvRW5oYW5jZXIoTFZDU19IYW5kbGVfdCAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgIE51bVNhbXBsZXMpCi17Ci0KLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZDU19TdGVyZW9FbmhhbmNlcl90ICAgKnBDb25maWcgICA9IChMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgKikmcEluc3RhbmNlLT5TdGVyZW9FbmhhbmNlcjsKLSAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50OwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwU2NyYXRjaDsKLQotICAgIHBDb2VmZmljaWVudCA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAotICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7Ci0KLSAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopIFwKLSAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU3RlcmVvRW5oYW5jZXIoTFZDU19IYW5kbGVfdCBoSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwT3V0RGF0YSwgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKSB7CisgICAgTFZDU19JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgTFZDU19TdGVyZW9FbmhhbmNlcl90KiBwQ29uZmlnID0gKExWQ1NfU3RlcmVvRW5oYW5jZXJfdCopJnBJbnN0YW5jZS0+U3RlcmVvRW5oYW5jZXI7CisgICAgTFZNX0ZMT0FUKiBwU2NyYXRjaDsKKyAgICBwU2NyYXRjaCA9IChMVk1fRkxPQVQqKXBJbnN0YW5jZS0+cFNjcmF0Y2g7CisgICAgTFZNX0lOVDMyIE51bUNoYW5uZWxzID0gcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKKyAgICBMVk1fVUlOVDE2IGRlc3ROdW1TYW1wbGVzID0gKE51bUNoYW5uZWxzID09IEZDQ18xKSA/IE51bVNhbXBsZXMgOiBGQ0NfMiAqIE51bVNhbXBsZXM7CiAgICAgLyoKICAgICAgKiBDaGVjayBpZiB0aGUgU3RlcmVvIEVuaGFuY2VyIGlzIGVuYWJsZWQKICAgICAgKi8KLSAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgJiBMVkNTX1NURVJFT0VOSEFOQ0VTV0lUQ0gpICE9IDApCi0gICAgICAgIHsKKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgJiBMVkNTX1NURVJFT0VOSEFOQ0VTV0lUQ0gpICE9IDApIHsKICAgICAgICAgLyoKICAgICAgICAgICogQ29udmVydCBmcm9tIHN0ZXJlbyB0byBtaWRkbGUgYW5kIHNpZGUKICAgICAgICAgICovCi0gICAgICAgIEZyb20yaVRvTVNfRmxvYXQocEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIE51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgaWYgKE51bUNoYW5uZWxzID09IDEpIHsKKyAgICAgICAgICAgIC8vIENvcHkgc2FtZSBpbnB1dCB0byBzY3JhdGNoIGFzIE1pZGRsZSBkYXRhCisgICAgICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQqKXBJbkRhdGEsIChMVk1fRkxPQVQqKXBTY3JhdGNoLCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRnJvbTJpVG9NU19GbG9hdChwSW5EYXRhLCBwU2NyYXRjaCwgcFNjcmF0Y2ggKyBOdW1TYW1wbGVzLCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICB9CiAKICAgICAgICAgLyoKICAgICAgICAgICogQXBwbHkgZmlsdGVyIHRvIHRoZSBtaWRkbGUgc2lnbmFsCiAgICAgICAgICAqLwotICAgICAgICBpZiAocEluc3RhbmNlLT5PdXRwdXREZXZpY2UgPT0gTFZDU19IRUFEUEhPTkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfTWlkKSgoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZU1pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNdWx0M3NfRmxvYXQocFNjcmF0Y2gsICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKXBDb25maWctPk1pZEdhaW4sICAgICAgLyogR2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+T3V0cHV0RGV2aWNlID09IExWQ1NfSEVBRFBIT05FKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPnBTRU1pZEJpcXVhZC0+cHJvY2VzcyhwU2NyYXRjaCwgcFNjcmF0Y2gsIE51bVNhbXBsZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTXVsdDNzX0Zsb2F0KHBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVClwQ29uZmlnLT5NaWRHYWluLCAvKiBHYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KICAgICAgICAgfQogCiAgICAgICAgIC8qCiAgICAgICAgICAqIEFwcGx5IHRoZSBmaWx0ZXIgdGhlIHNpZGUgc2lnbmFsIG9ubHkgaW4gc3RlcmVvIG1vZGUgZm9yIGhlYWRwaG9uZXMKICAgICAgICAgICogYW5kIGluIGFsbCBtb2RlcyBmb3IgbW9iaWxlIHNwZWFrZXJzCiAgICAgICAgICAqLwotICAgICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ID09IExWQ1NfU1RFUkVPKQotICAgICAgICB7Ci0gICAgICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX1NpZGUpKChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCopIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZVNpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikocFNjcmF0Y2ggKyBOdW1TYW1wbGVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKShwU2NyYXRjaCArIE51bVNhbXBsZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ID09IExWQ1NfU1RFUkVPKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPnBTRVNpZGVCaXF1YWQtPnByb2Nlc3MocFNjcmF0Y2ggKyBOdW1TYW1wbGVzLCBwU2NyYXRjaCArIE51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7CiAgICAgICAgIH0KIAotICAgICAgICAvKgotICAgICAgICAgKiBDb252ZXJ0IGZyb20gbWlkZGxlIGFuZCBzaWRlIHRvIHN0ZXJlbwotICAgICAgICAgKi8KLSAgICAgICAgTVNUbzJpX1NhdF9GbG9hdChwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIE51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgaWYgKE51bUNoYW5uZWxzID09IDEpIHsKKyAgICAgICAgICAgIC8vIENvcHkgcHJvY2Vzc2VkIE1pZGRsZSBkYXRhIGZyb20gc2NyYXRjaCB0byBwT3V0RGF0YQorICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUKilwU2NyYXRjaCwgKExWTV9GTE9BVCopcE91dERhdGEsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29udmVydCBmcm9tIG1pZGRsZSBhbmQgc2lkZSB0byBzdGVyZW8KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgTVNUbzJpX1NhdF9GbG9hdChwU2NyYXRjaCwgcFNjcmF0Y2ggKyBOdW1TYW1wbGVzLCBwT3V0RGF0YSwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgfQogCi0gICAgfQotICAgIGVsc2UKLSAgICB7CisgICAgfSBlbHNlIHsKICAgICAgICAgLyoKICAgICAgICAgICogVGhlIHN0ZXJlbyBlbmhhbmNlciBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKICAgICAgICAgICovCi0gICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE91dERhdGEsICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCopcEluRGF0YSwgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQqKXBPdXREYXRhLCAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpZGVzdE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2YgZnJhbWVzICovCiAgICAgfQogCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVkNTX1NVQ0NFU1MpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuaAppbmRleCAxMmE1OTgyLi4wYmVkNTkxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuaApAQCAtMjQsOCArMjQsOCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpbmNsdWRlICJGaWx0ZXJzLmgiICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgiICAgICAgICAgIC8qIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KKyNpbmNsdWRlICJGaWx0ZXJzLmgiICAgICAgICAgICAgICAgLyogRmlsdGVyIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgiIC8qIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KICNpbmNsdWRlICJCSVFVQUQuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM1LDIxICszNSw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBTdGVyZW8gZW5oYW5jZXIgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewotCi0gICAgLyoKLSAgICAgKiBNaWRkbGUgZmlsdGVyCi0gICAgICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKCpwQmlxdWFkQ2FsbEJhY2tfTWlkKShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqLCBMVk1fRkxPQVQqLCBMVk1fSU5UMTYpOwotCi0gICAgLyoKLSAgICAgKiBTaWRlIGZpbHRlcgotICAgICAqLwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrX1NpZGUpKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCosIExWTV9GTE9BVCosIExWTV9JTlQxNik7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICBNaWRHYWluOyAgICAgICAgICAgIC8qIE1pZGRsZSBnYWluIGluIG1vYmlsZSBzcGVha2VyIG1vZGUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fRkxPQVQgTWlkR2FpbjsgLyogTWlkZGxlIGdhaW4gaW4gbW9iaWxlIHNwZWFrZXIgbW9kZSAqLwogfSBMVkNTX1N0ZXJlb0VuaGFuY2VyX3Q7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC01OCwxMiArNDUsOSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU0VuaGFuY2VySW5pdChMVkNTX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAgKnBQYXJhbXMpOworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TRW5oYW5jZXJJbml0KExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBMVkNTX1BhcmFtc190KiBwUGFyYW1zKTsKIAotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TdGVyZW9FbmhhbmNlcihMVkNTX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcyk7CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1N0ZXJlb0VuaGFuY2VyKExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcE91dERhdGEsIExWTV9VSU5UMTYgTnVtU2FtcGxlcyk7CiAKLSNlbmRpZiAgLyogU1RFUkVPRU5IQU5DRV9IICovCisjZW5kaWYgLyogU1RFUkVPRU5IQU5DRV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuY3BwCmluZGV4IGQ3OWRiNjEuLjU1YjUyNDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuY3BwCkBAIC0yMyw5ICsyMyw5IEBACiAKICNpbmNsdWRlICJMVkNTX1ByaXZhdGUuaCIKICNpbmNsdWRlICJMVkNTX1RhYmxlcy5oIgotI2luY2x1ZGUgIkZpbHRlcnMuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiQklRVUFELmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXF1YWQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJMVkNTX0hlYWRwaG9uZV9Db2VmZnMuaCIgICAgICAgICAgICAgIC8qIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KKyNpbmNsdWRlICJGaWx0ZXJzLmgiICAgICAgICAgICAgICAgLyogRmlsdGVyIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiQklRVUFELmgiICAgICAgICAgICAgICAgIC8qIEJpcXVhZCBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkxWQ1NfSGVhZHBob25lX0NvZWZmcy5oIiAvKiBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzUsMTQ0ICszNSw3NSBAQAogCiAvKiBDb2VmZmljaWVudCB0YWJsZSBmb3IgdGhlIG1pZGRsZSBmaWx0ZXIgKi8KIGNvbnN0IEJpcXVhZEEwMUIxQ29lZnNTUF90IExWQ1NfU0VNaWRDb2VmVGFibGVbXSA9IHsKLSAgICB7Q1NfTUlERExFXzgwMDBfQTAsICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX01JRERMRV84MDAwX0ExLAotICAgICBDU19NSURETEVfODAwMF9CMSwKLSAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV84MDAwX1NDQUxFfSwKLSAgICB7Q1NfTUlERExFXzExMDI1X0EwLCAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19NSURETEVfMTEwMjVfQTEsCi0gICAgIENTX01JRERMRV8xMTAyNV9CMSwKLSAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV8xMTAyNV9TQ0FMRX0sCi0gICAge0NTX01JRERMRV8xMjAwMF9BMCwgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfTUlERExFXzEyMDAwX0ExLAotICAgICBDU19NSURETEVfMTIwMDBfQjEsCi0gICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfMTIwMDBfU0NBTEV9LAotICAgIHtDU19NSURETEVfMTYwMDBfQTAsICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX01JRERMRV8xNjAwMF9BMSwKLSAgICAgQ1NfTUlERExFXzE2MDAwX0IxLAotICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzE2MDAwX1NDQUxFfSwKLSAgICB7Q1NfTUlERExFXzIyMDUwX0EwLCAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19NSURETEVfMjIwNTBfQTEsCi0gICAgIENTX01JRERMRV8yMjA1MF9CMSwKLSAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV8yMjA1MF9TQ0FMRX0sCi0gICAge0NTX01JRERMRV8yNDAwMF9BMCwgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfTUlERExFXzI0MDAwX0ExLAotICAgICBDU19NSURETEVfMjQwMDBfQjEsCi0gICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfMjQwMDBfU0NBTEV9LAotICAgIHtDU19NSURETEVfMzIwMDBfQTAsICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX01JRERMRV8zMjAwMF9BMSwKLSAgICAgQ1NfTUlERExFXzMyMDAwX0IxLAotICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzMyMDAwX1NDQUxFfSwKLSAgICB7Q1NfTUlERExFXzQ0MTAwX0EwLCAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19NSURETEVfNDQxMDBfQTEsCi0gICAgIENTX01JRERMRV80NDEwMF9CMSwKLSAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV80NDEwMF9TQ0FMRX0sCi0gICAge0NTX01JRERMRV80ODAwMF9BMCwgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfTUlERExFXzQ4MDAwX0ExLAotICAgICBDU19NSURETEVfNDgwMDBfQjEsCi0gICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfNDgwMDBfU0NBTEV9Ci0gICAgLAotICAgIHtDU19NSURETEVfODgyMDBfQTAsICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX01JRERMRV84ODIwMF9BMSwKLSAgICAgQ1NfTUlERExFXzg4MjAwX0IxLAotICAgICAoTFZNX1VJTlQxNilDU19NSURETEVfODgyMDBfU0NBTEV9LAotICAgIHtDU19NSURETEVfOTYwMDBfQTAsICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX01JRERMRV85NjAwMF9BMSwKLSAgICAgQ1NfTUlERExFXzk2MDAwX0IxLAotICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzk2MDAwX1NDQUxFfSwKLSAgICB7Q1NfTUlERExFXzE3NjQwMF9BMCwgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX01JRERMRV8xNzY0MDBfQTEsCi0gICAgIENTX01JRERMRV8xNzY0MDBfQjEsCi0gICAgIChMVk1fVUlOVDE2KUNTX01JRERMRV8xNzY0MDBfU0NBTEV9LAotICAgIHtDU19NSURETEVfMTkyMDAwX0EwLCAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfTUlERExFXzE5MjAwMF9BMSwKLSAgICAgQ1NfTUlERExFXzE5MjAwMF9CMSwKLSAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV8xOTIwMDBfU0NBTEV9Ci0gICAgfTsKKyAgICAgICAge0NTX01JRERMRV84MDAwX0EwLCAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX01JRERMRV84MDAwX0ExLCBDU19NSURETEVfODAwMF9CMSwgKExWTV9VSU5UMTYpQ1NfTUlERExFXzgwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfTUlERExFXzExMDI1X0EwLCAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19NSURETEVfMTEwMjVfQTEsIENTX01JRERMRV8xMTAyNV9CMSwgKExWTV9VSU5UMTYpQ1NfTUlERExFXzExMDI1X1NDQUxFfSwKKyAgICAgICAge0NTX01JRERMRV8xMjAwMF9BMCwgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfTUlERExFXzEyMDAwX0ExLCBDU19NSURETEVfMTIwMDBfQjEsIChMVk1fVUlOVDE2KUNTX01JRERMRV8xMjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19NSURETEVfMTYwMDBfQTAsIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX01JRERMRV8xNjAwMF9BMSwgQ1NfTUlERExFXzE2MDAwX0IxLCAoTFZNX1VJTlQxNilDU19NSURETEVfMTYwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfTUlERExFXzIyMDUwX0EwLCAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19NSURETEVfMjIwNTBfQTEsIENTX01JRERMRV8yMjA1MF9CMSwgKExWTV9VSU5UMTYpQ1NfTUlERExFXzIyMDUwX1NDQUxFfSwKKyAgICAgICAge0NTX01JRERMRV8yNDAwMF9BMCwgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfTUlERExFXzI0MDAwX0ExLCBDU19NSURETEVfMjQwMDBfQjEsIChMVk1fVUlOVDE2KUNTX01JRERMRV8yNDAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19NSURETEVfMzIwMDBfQTAsIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX01JRERMRV8zMjAwMF9BMSwgQ1NfTUlERExFXzMyMDAwX0IxLCAoTFZNX1VJTlQxNilDU19NSURETEVfMzIwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfTUlERExFXzQ0MTAwX0EwLCAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19NSURETEVfNDQxMDBfQTEsIENTX01JRERMRV80NDEwMF9CMSwgKExWTV9VSU5UMTYpQ1NfTUlERExFXzQ0MTAwX1NDQUxFfSwKKyAgICAgICAge0NTX01JRERMRV80ODAwMF9BMCwgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfTUlERExFXzQ4MDAwX0ExLCBDU19NSURETEVfNDgwMDBfQjEsIChMVk1fVUlOVDE2KUNTX01JRERMRV80ODAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19NSURETEVfODgyMDBfQTAsIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX01JRERMRV84ODIwMF9BMSwgQ1NfTUlERExFXzg4MjAwX0IxLCAoTFZNX1VJTlQxNilDU19NSURETEVfODgyMDBfU0NBTEV9LAorICAgICAgICB7Q1NfTUlERExFXzk2MDAwX0EwLCAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19NSURETEVfOTYwMDBfQTEsIENTX01JRERMRV85NjAwMF9CMSwgKExWTV9VSU5UMTYpQ1NfTUlERExFXzk2MDAwX1NDQUxFfSwKKyAgICAgICAge0NTX01JRERMRV8xNzY0MDBfQTAsIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19NSURETEVfMTc2NDAwX0ExLCBDU19NSURETEVfMTc2NDAwX0IxLCAoTFZNX1VJTlQxNilDU19NSURETEVfMTc2NDAwX1NDQUxFfSwKKyAgICAgICAge0NTX01JRERMRV8xOTIwMDBfQTAsIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19NSURETEVfMTkyMDAwX0ExLCBDU19NSURETEVfMTkyMDAwX0IxLCAoTFZNX1VJTlQxNilDU19NSURETEVfMTkyMDAwX1NDQUxFfX07CiAKIC8qIENvZWZmaWNpZW50IHRhYmxlIGZvciB0aGUgc2lkZSBmaWx0ZXIgKi8KIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19TRVNpZGVDb2VmVGFibGVbXSA9IHsKLSAgICAvKiBIZWFkcGhvbmUgU2lkZSBjb2VmZmljaWVudHMgKi8KLSAgICB7Q1NfU0lERV84MDAwX0EwLCAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1NJREVfODAwMF9BMSwKLSAgICAgQ1NfU0lERV84MDAwX0EyLAotICAgICBDU19TSURFXzgwMDBfQjEsCi0gICAgIENTX1NJREVfODAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfODAwMF9TQ0FMRX0sCi0gICAge0NTX1NJREVfMTEwMjVfQTAsICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfU0lERV8xMTAyNV9BMSwKLSAgICAgQ1NfU0lERV8xMTAyNV9BMiwKLSAgICAgQ1NfU0lERV8xMTAyNV9CMSwKLSAgICAgQ1NfU0lERV8xMTAyNV9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfMTEwMjVfU0NBTEV9LAotICAgIHtDU19TSURFXzEyMDAwX0EwLCAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1NJREVfMTIwMDBfQTEsCi0gICAgIENTX1NJREVfMTIwMDBfQTIsCi0gICAgIENTX1NJREVfMTIwMDBfQjEsCi0gICAgIENTX1NJREVfMTIwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19TSURFXzEyMDAwX1NDQUxFfSwKLSAgICB7Q1NfU0lERV8xNjAwMF9BMCwgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19TSURFXzE2MDAwX0ExLAotICAgICBDU19TSURFXzE2MDAwX0EyLAotICAgICBDU19TSURFXzE2MDAwX0IxLAotICAgICBDU19TSURFXzE2MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV8xNjAwMF9TQ0FMRX0sCi0gICAge0NTX1NJREVfMjIwNTBfQTAsICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfU0lERV8yMjA1MF9BMSwKLSAgICAgQ1NfU0lERV8yMjA1MF9BMiwKLSAgICAgQ1NfU0lERV8yMjA1MF9CMSwKLSAgICAgQ1NfU0lERV8yMjA1MF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfMjIwNTBfU0NBTEV9LAotICAgIHtDU19TSURFXzI0MDAwX0EwLCAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1NJREVfMjQwMDBfQTEsCi0gICAgIENTX1NJREVfMjQwMDBfQTIsCi0gICAgIENTX1NJREVfMjQwMDBfQjEsCi0gICAgIENTX1NJREVfMjQwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19TSURFXzI0MDAwX1NDQUxFfSwKLSAgICB7Q1NfU0lERV8zMjAwMF9BMCwgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19TSURFXzMyMDAwX0ExLAotICAgICBDU19TSURFXzMyMDAwX0EyLAotICAgICBDU19TSURFXzMyMDAwX0IxLAotICAgICBDU19TSURFXzMyMDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV8zMjAwMF9TQ0FMRX0sCi0gICAge0NTX1NJREVfNDQxMDBfQTAsICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfU0lERV80NDEwMF9BMSwKLSAgICAgQ1NfU0lERV80NDEwMF9BMiwKLSAgICAgQ1NfU0lERV80NDEwMF9CMSwKLSAgICAgQ1NfU0lERV80NDEwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfNDQxMDBfU0NBTEV9LAotICAgIHtDU19TSURFXzQ4MDAwX0EwLCAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1NJREVfNDgwMDBfQTEsCi0gICAgIENTX1NJREVfNDgwMDBfQTIsCi0gICAgIENTX1NJREVfNDgwMDBfQjEsCi0gICAgIENTX1NJREVfNDgwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19TSURFXzQ4MDAwX1NDQUxFfQotICAgICAsCi0gICAge0NTX1NJREVfODgyMDBfQTAsICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfU0lERV84ODIwMF9BMSwKLSAgICAgQ1NfU0lERV84ODIwMF9BMiwKLSAgICAgQ1NfU0lERV84ODIwMF9CMSwKLSAgICAgQ1NfU0lERV84ODIwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV84ODIwMF9TQ0FMRX0sCi0gICAgIHtDU19TSURFXzk2MDAwX0EwLCAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1NJREVfOTYwMDBfQTEsCi0gICAgIENTX1NJREVfOTYwMDBfQTIsCi0gICAgIENTX1NJREVfOTYwMDBfQjEsCi0gICAgIENTX1NJREVfOTYwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19TSURFXzk2MDAwX1NDQUxFfSwKLSAgICB7Q1NfU0lERV8xNzY0MDBfQTAsICAgICAgICAgIC8qMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfU0lERV8xNzY0MDBfQTEsCi0gICAgIENTX1NJREVfMTc2NDAwX0EyLAotICAgICBDU19TSURFXzE3NjQwMF9CMSwKLSAgICAgQ1NfU0lERV8xNzY0MDBfQjIsCi0gICAgIChMVk1fVUlOVDE2KUNTX1NJREVfMTc2NDAwX1NDQUxFfSwKLSAgICAge0NTX1NJREVfMTkyMDAwX0EwLCAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19TSURFXzE5MjAwMF9BMSwKLSAgICAgQ1NfU0lERV8xOTIwMDBfQTIsCi0gICAgIENTX1NJREVfMTkyMDAwX0IxLAotICAgICBDU19TSURFXzE5MjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfMTkyMDAwX1NDQUxFfQotfTsKKyAgICAgICAgLyogSGVhZHBob25lIFNpZGUgY29lZmZpY2llbnRzICovCisgICAgICAgIHtDU19TSURFXzgwMDBfQTAsIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfU0lERV84MDAwX0ExLCBDU19TSURFXzgwMDBfQTIsIENTX1NJREVfODAwMF9CMSwgQ1NfU0lERV84MDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV84MDAwX1NDQUxFfSwKKyAgICAgICAge0NTX1NJREVfMTEwMjVfQTAsIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1NJREVfMTEwMjVfQTEsIENTX1NJREVfMTEwMjVfQTIsIENTX1NJREVfMTEwMjVfQjEsIENTX1NJREVfMTEwMjVfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19TSURFXzExMDI1X1NDQUxFfSwKKyAgICAgICAge0NTX1NJREVfMTIwMDBfQTAsIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1NJREVfMTIwMDBfQTEsIENTX1NJREVfMTIwMDBfQTIsIENTX1NJREVfMTIwMDBfQjEsIENTX1NJREVfMTIwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19TSURFXzEyMDAwX1NDQUxFfSwKKyAgICAgICAge0NTX1NJREVfMTYwMDBfQTAsIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1NJREVfMTYwMDBfQTEsIENTX1NJREVfMTYwMDBfQTIsIENTX1NJREVfMTYwMDBfQjEsIENTX1NJREVfMTYwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19TSURFXzE2MDAwX1NDQUxFfSwKKyAgICAgICAge0NTX1NJREVfMjIwNTBfQTAsIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1NJREVfMjIwNTBfQTEsIENTX1NJREVfMjIwNTBfQTIsIENTX1NJREVfMjIwNTBfQjEsIENTX1NJREVfMjIwNTBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19TSURFXzIyMDUwX1NDQUxFfSwKKyAgICAgICAge0NTX1NJREVfMjQwMDBfQTAsIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1NJREVfMjQwMDBfQTEsIENTX1NJREVfMjQwMDBfQTIsIENTX1NJREVfMjQwMDBfQjEsIENTX1NJREVfMjQwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19TSURFXzI0MDAwX1NDQUxFfSwKKyAgICAgICAge0NTX1NJREVfMzIwMDBfQTAsIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1NJREVfMzIwMDBfQTEsIENTX1NJREVfMzIwMDBfQTIsIENTX1NJREVfMzIwMDBfQjEsIENTX1NJREVfMzIwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19TSURFXzMyMDAwX1NDQUxFfSwKKyAgICAgICAge0NTX1NJREVfNDQxMDBfQTAsIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1NJREVfNDQxMDBfQTEsIENTX1NJREVfNDQxMDBfQTIsIENTX1NJREVfNDQxMDBfQjEsIENTX1NJREVfNDQxMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19TSURFXzQ0MTAwX1NDQUxFfSwKKyAgICAgICAge0NTX1NJREVfNDgwMDBfQTAsIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1NJREVfNDgwMDBfQTEsIENTX1NJREVfNDgwMDBfQTIsIENTX1NJREVfNDgwMDBfQjEsIENTX1NJREVfNDgwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19TSURFXzQ4MDAwX1NDQUxFfSwKKyAgICAgICAge0NTX1NJREVfODgyMDBfQTAsIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1NJREVfODgyMDBfQTEsIENTX1NJREVfODgyMDBfQTIsIENTX1NJREVfODgyMDBfQjEsIENTX1NJREVfODgyMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19TSURFXzg4MjAwX1NDQUxFfSwKKyAgICAgICAge0NTX1NJREVfOTYwMDBfQTAsIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1NJREVfOTYwMDBfQTEsIENTX1NJREVfOTYwMDBfQTIsIENTX1NJREVfOTYwMDBfQjEsIENTX1NJREVfOTYwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19TSURFXzk2MDAwX1NDQUxFfSwKKyAgICAgICAge0NTX1NJREVfMTc2NDAwX0EwLCAvKjE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19TSURFXzE3NjQwMF9BMSwgQ1NfU0lERV8xNzY0MDBfQTIsIENTX1NJREVfMTc2NDAwX0IxLCBDU19TSURFXzE3NjQwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX1NJREVfMTc2NDAwX1NDQUxFfSwKKyAgICAgICAge0NTX1NJREVfMTkyMDAwX0EwLCAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfU0lERV8xOTIwMDBfQTEsIENTX1NJREVfMTkyMDAwX0EyLCBDU19TSURFXzE5MjAwMF9CMSwgQ1NfU0lERV8xOTIwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19TSURFXzE5MjAwMF9TQ0FMRX19OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE4MSwxNjcgKzExMiw4NyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX0VxdWFsaXNlckNvZWZUYWJsZVtdID0gewotICAgIC8qIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KLSAgICB7Q1NfRVFVQUxJU0VSXzgwMDBfQTAsICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX0VRVUFMSVNFUl84MDAwX0ExLAotICAgICBDU19FUVVBTElTRVJfODAwMF9BMiwKLSAgICAgQ1NfRVFVQUxJU0VSXzgwMDBfQjEsCi0gICAgIENTX0VRVUFMSVNFUl84MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzgwMDBfU0NBTEV9LAotICAgIHtDU19FUVVBTElTRVJfMTEwMjVfQTAsICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX0VRVUFMSVNFUl8xMTAyNV9BMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzExMDI1X0EyLAotICAgICBDU19FUVVBTElTRVJfMTEwMjVfQjEsCi0gICAgIENTX0VRVUFMSVNFUl8xMTAyNV9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRX0sCi0gICAge0NTX0VRVUFMSVNFUl8xMjAwMF9BMCwgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfRVFVQUxJU0VSXzEyMDAwX0ExLAotICAgICBDU19FUVVBTElTRVJfMTIwMDBfQTIsCi0gICAgIENTX0VRVUFMSVNFUl8xMjAwMF9CMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzEyMDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzEyMDAwX1NDQUxFfSwKLSAgICB7Q1NfRVFVQUxJU0VSXzE2MDAwX0EwLCAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19FUVVBTElTRVJfMTYwMDBfQTEsCi0gICAgIENTX0VRVUFMSVNFUl8xNjAwMF9BMiwKLSAgICAgQ1NfRVFVQUxJU0VSXzE2MDAwX0IxLAotICAgICBDU19FUVVBTElTRVJfMTYwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfMTYwMDBfU0NBTEV9LAotICAgIHtDU19FUVVBTElTRVJfMjIwNTBfQTAsICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX0VRVUFMSVNFUl8yMjA1MF9BMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzIyMDUwX0EyLAotICAgICBDU19FUVVBTElTRVJfMjIwNTBfQjEsCi0gICAgIENTX0VRVUFMSVNFUl8yMjA1MF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRX0sCi0gICAge0NTX0VRVUFMSVNFUl8yNDAwMF9BMCwgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfRVFVQUxJU0VSXzI0MDAwX0ExLAotICAgICBDU19FUVVBTElTRVJfMjQwMDBfQTIsCi0gICAgIENTX0VRVUFMSVNFUl8yNDAwMF9CMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzI0MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzI0MDAwX1NDQUxFfSwKLSAgICB7Q1NfRVFVQUxJU0VSXzMyMDAwX0EwLCAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19FUVVBTElTRVJfMzIwMDBfQTEsCi0gICAgIENTX0VRVUFMSVNFUl8zMjAwMF9BMiwKLSAgICAgQ1NfRVFVQUxJU0VSXzMyMDAwX0IxLAotICAgICBDU19FUVVBTElTRVJfMzIwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfMzIwMDBfU0NBTEV9LAotICAgIHtDU19FUVVBTElTRVJfNDQxMDBfQTAsICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX0VRVUFMSVNFUl80NDEwMF9BMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzQ0MTAwX0EyLAotICAgICBDU19FUVVBTElTRVJfNDQxMDBfQjEsCi0gICAgIENTX0VRVUFMSVNFUl80NDEwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl80NDEwMF9TQ0FMRX0sCi0gICAge0NTX0VRVUFMSVNFUl80ODAwMF9BMCwgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0ExLAotICAgICBDU19FUVVBTElTRVJfNDgwMDBfQTIsCi0gICAgIENTX0VRVUFMSVNFUl80ODAwMF9CMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfSwKLSAgICB7Q1NfRVFVQUxJU0VSXzg4MjAwX0EwLCAgICAgLyogODhrUy9zIGNvZWZmaWVpZW50cyAqLwotICAgICBDU19FUVVBTElTRVJfODgyMDBfQTEsCi0gICAgIENTX0VRVUFMSVNFUl84ODIwMF9BMiwKLSAgICAgQ1NfRVFVQUxJU0VSXzg4MjAwX0IxLAotICAgICBDU19FUVVBTElTRVJfODgyMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl84ODIwMF9TQ0FMRX0sCi0gICAge0NTX0VRVUFMSVNFUl85NjAwMF9BMCwgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0ExLAotICAgICBDU19FUVVBTElTRVJfOTYwMDBfQTIsCi0gICAgIENTX0VRVUFMSVNFUl85NjAwMF9CMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzk2MDAwX1NDQUxFfSwKLSAgICB7Q1NfRVFVQUxJU0VSXzE3NjQwMF9BMCwgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQTEsCi0gICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQTIsCi0gICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQjEsCi0gICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQjIsCi0gICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEV9LAotICAgIHtDU19FUVVBTElTRVJfMTkyMDAwX0EwLCAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMiwKLSAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEV9LAorICAgICAgICAvKiBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCisgICAgICAgIHtDU19FUVVBTElTRVJfODAwMF9BMCwgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19FUVVBTElTRVJfODAwMF9BMSwgQ1NfRVFVQUxJU0VSXzgwMDBfQTIsIENTX0VRVUFMSVNFUl84MDAwX0IxLCBDU19FUVVBTElTRVJfODAwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl84MDAwX1NDQUxFfSwKKyAgICAgICAge0NTX0VRVUFMSVNFUl8xMTAyNV9BMCwgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfRVFVQUxJU0VSXzExMDI1X0ExLCBDU19FUVVBTElTRVJfMTEwMjVfQTIsIENTX0VRVUFMSVNFUl8xMTAyNV9CMSwgQ1NfRVFVQUxJU0VSXzExMDI1X0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfRVFVQUxJU0VSXzExMDI1X1NDQUxFfSwKKyAgICAgICAge0NTX0VRVUFMSVNFUl8xMjAwMF9BMCwgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfRVFVQUxJU0VSXzEyMDAwX0ExLCBDU19FUVVBTElTRVJfMTIwMDBfQTIsIENTX0VRVUFMSVNFUl8xMjAwMF9CMSwgQ1NfRVFVQUxJU0VSXzEyMDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfRVFVQUxJU0VSXzEyMDAwX1NDQUxFfSwKKyAgICAgICAge0NTX0VRVUFMSVNFUl8xNjAwMF9BMCwgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfRVFVQUxJU0VSXzE2MDAwX0ExLCBDU19FUVVBTElTRVJfMTYwMDBfQTIsIENTX0VRVUFMSVNFUl8xNjAwMF9CMSwgQ1NfRVFVQUxJU0VSXzE2MDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfRVFVQUxJU0VSXzE2MDAwX1NDQUxFfSwKKyAgICAgICAge0NTX0VRVUFMSVNFUl8yMjA1MF9BMCwgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfRVFVQUxJU0VSXzIyMDUwX0ExLCBDU19FUVVBTElTRVJfMjIwNTBfQTIsIENTX0VRVUFMSVNFUl8yMjA1MF9CMSwgQ1NfRVFVQUxJU0VSXzIyMDUwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfRVFVQUxJU0VSXzIyMDUwX1NDQUxFfSwKKyAgICAgICAge0NTX0VRVUFMSVNFUl8yNDAwMF9BMCwgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfRVFVQUxJU0VSXzI0MDAwX0ExLCBDU19FUVVBTElTRVJfMjQwMDBfQTIsIENTX0VRVUFMSVNFUl8yNDAwMF9CMSwgQ1NfRVFVQUxJU0VSXzI0MDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfRVFVQUxJU0VSXzI0MDAwX1NDQUxFfSwKKyAgICAgICAge0NTX0VRVUFMSVNFUl8zMjAwMF9BMCwgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfRVFVQUxJU0VSXzMyMDAwX0ExLCBDU19FUVVBTElTRVJfMzIwMDBfQTIsIENTX0VRVUFMSVNFUl8zMjAwMF9CMSwgQ1NfRVFVQUxJU0VSXzMyMDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfRVFVQUxJU0VSXzMyMDAwX1NDQUxFfSwKKyAgICAgICAge0NTX0VRVUFMSVNFUl80NDEwMF9BMCwgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfRVFVQUxJU0VSXzQ0MTAwX0ExLCBDU19FUVVBTElTRVJfNDQxMDBfQTIsIENTX0VRVUFMSVNFUl80NDEwMF9CMSwgQ1NfRVFVQUxJU0VSXzQ0MTAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfRVFVQUxJU0VSXzQ0MTAwX1NDQUxFfSwKKyAgICAgICAge0NTX0VRVUFMSVNFUl80ODAwMF9BMCwgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0ExLCBDU19FUVVBTElTRVJfNDgwMDBfQTIsIENTX0VRVUFMSVNFUl80ODAwMF9CMSwgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfSwKKyAgICAgICAge0NTX0VRVUFMSVNFUl84ODIwMF9BMCwgLyogODhrUy9zIGNvZWZmaWVpZW50cyAqLworICAgICAgICAgQ1NfRVFVQUxJU0VSXzg4MjAwX0ExLCBDU19FUVVBTElTRVJfODgyMDBfQTIsIENTX0VRVUFMSVNFUl84ODIwMF9CMSwgQ1NfRVFVQUxJU0VSXzg4MjAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfRVFVQUxJU0VSXzg4MjAwX1NDQUxFfSwKKyAgICAgICAge0NTX0VRVUFMSVNFUl85NjAwMF9BMCwgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0ExLCBDU19FUVVBTElTRVJfOTYwMDBfQTIsIENTX0VRVUFMSVNFUl85NjAwMF9CMSwgQ1NfRVFVQUxJU0VSXzk2MDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfRVFVQUxJU0VSXzk2MDAwX1NDQUxFfSwKKyAgICAgICAge0NTX0VRVUFMSVNFUl8xNzY0MDBfQTAsIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19FUVVBTElTRVJfMTc2NDAwX0ExLCBDU19FUVVBTElTRVJfMTc2NDAwX0EyLCBDU19FUVVBTElTRVJfMTc2NDAwX0IxLAorICAgICAgICAgQ1NfRVFVQUxJU0VSXzE3NjQwMF9CMiwgKExWTV9VSU5UMTYpQ1NfRVFVQUxJU0VSXzE3NjQwMF9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfMTkyMDAwX0EwLCAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMSwgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMiwgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMSwKKyAgICAgICAgIENTX0VRVUFMSVNFUl8xOTIwMDBfQjIsIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEV9LAogCi0gICAgLyogQ29uY2VydCBTb3VuZCBFWCBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCi0gICAge0NTRVhfRVFVQUxJU0VSXzgwMDBfQTAsICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU0VYX0VRVUFMSVNFUl84MDAwX0ExLAotICAgICBDU0VYX0VRVUFMSVNFUl84MDAwX0EyLAotICAgICBDU0VYX0VRVUFMSVNFUl84MDAwX0IxLAotICAgICBDU0VYX0VRVUFMSVNFUl84MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfODAwMF9TQ0FMRX0sCi0gICAge0NTRVhfRVFVQUxJU0VSXzExMDI1X0EwLCAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzExMDI1X0EyLAotICAgICBDU0VYX0VRVUFMSVNFUl8xMTAyNV9CMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRX0sCi0gICAge0NTRVhfRVFVQUxJU0VSXzEyMDAwX0EwLCAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzEyMDAwX0EyLAotICAgICBDU0VYX0VRVUFMSVNFUl8xMjAwMF9CMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8xMjAwMF9TQ0FMRX0sCi0gICAge0NTRVhfRVFVQUxJU0VSXzE2MDAwX0EwLCAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzE2MDAwX0EyLAotICAgICBDU0VYX0VRVUFMSVNFUl8xNjAwMF9CMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8xNjAwMF9TQ0FMRX0sCi0gICAge0NTRVhfRVFVQUxJU0VSXzIyMDUwX0EwLCAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzIyMDUwX0EyLAotICAgICBDU0VYX0VRVUFMSVNFUl8yMjA1MF9CMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRX0sCi0gICAge0NTRVhfRVFVQUxJU0VSXzI0MDAwX0EwLCAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzI0MDAwX0EyLAotICAgICBDU0VYX0VRVUFMSVNFUl8yNDAwMF9CMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8yNDAwMF9TQ0FMRX0sCi0gICAge0NTRVhfRVFVQUxJU0VSXzMyMDAwX0EwLCAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzMyMDAwX0EyLAotICAgICBDU0VYX0VRVUFMSVNFUl8zMjAwMF9CMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8zMjAwMF9TQ0FMRX0sCi0gICAge0NTRVhfRVFVQUxJU0VSXzQ0MTAwX0EwLCAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0EyLAotICAgICBDU0VYX0VRVUFMSVNFUl80NDEwMF9CMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl80NDEwMF9TQ0FMRX0sCi0gICAge0NTRVhfRVFVQUxJU0VSXzQ4MDAwX0EwLCAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0EyLAotICAgICBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl80ODAwMF9TQ0FMRX0KLSAgICAsCi0gICAge0NTRVhfRVFVQUxJU0VSXzg4MjAwX0EwLCAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzg4MjAwX0EyLAotICAgICBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfODgyMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzg4MjAwX1NDQUxFfSwKLSAgICB7Q1NFWF9FUVVBTElTRVJfOTYwMDBfQTAsICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTIsCi0gICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IxLAotICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFfSwKLSAgICB7Q1NFWF9FUVVBTElTRVJfMTc2NDAwX0EwLCAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0EyLAotICAgICBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQjEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYpQ1NFWF9FUVVBTElTRVJfMTc2NDAwX1NDQUxFfSwKLSAgICAge0NTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMCwgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IxLAotICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEV9Ci19OworICAgICAgICAvKiBDb25jZXJ0IFNvdW5kIEVYIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzgwMDBfQTAsIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NFWF9FUVVBTElTRVJfODAwMF9BMSwgQ1NFWF9FUVVBTElTRVJfODAwMF9BMiwgQ1NFWF9FUVVBTElTRVJfODAwMF9CMSwKKyAgICAgICAgIENTRVhfRVFVQUxJU0VSXzgwMDBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzgwMDBfU0NBTEV9LAorICAgICAgICB7Q1NFWF9FUVVBTElTRVJfMTEwMjVfQTAsIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTRVhfRVFVQUxJU0VSXzExMDI1X0ExLCBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMiwgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjEsCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8xMTAyNV9CMiwgKExWTV9VSU5UMTYpQ1NFWF9FUVVBTElTRVJfMTEwMjVfU0NBTEV9LAorICAgICAgICB7Q1NFWF9FUVVBTElTRVJfMTIwMDBfQTAsIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTRVhfRVFVQUxJU0VSXzEyMDAwX0ExLCBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMiwgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjEsCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8xMjAwMF9CMiwgKExWTV9VSU5UMTYpQ1NFWF9FUVVBTElTRVJfMTIwMDBfU0NBTEV9LAorICAgICAgICB7Q1NFWF9FUVVBTElTRVJfMTYwMDBfQTAsIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTRVhfRVFVQUxJU0VSXzE2MDAwX0ExLCBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMiwgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjEsCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8xNjAwMF9CMiwgKExWTV9VSU5UMTYpQ1NFWF9FUVVBTElTRVJfMTYwMDBfU0NBTEV9LAorICAgICAgICB7Q1NFWF9FUVVBTElTRVJfMjIwNTBfQTAsIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTRVhfRVFVQUxJU0VSXzIyMDUwX0ExLCBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMiwgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQjEsCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8yMjA1MF9CMiwgKExWTV9VSU5UMTYpQ1NFWF9FUVVBTElTRVJfMjIwNTBfU0NBTEV9LAorICAgICAgICB7Q1NFWF9FUVVBTElTRVJfMjQwMDBfQTAsIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTRVhfRVFVQUxJU0VSXzI0MDAwX0ExLCBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMiwgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQjEsCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8yNDAwMF9CMiwgKExWTV9VSU5UMTYpQ1NFWF9FUVVBTElTRVJfMjQwMDBfU0NBTEV9LAorICAgICAgICB7Q1NFWF9FUVVBTElTRVJfMzIwMDBfQTAsIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTRVhfRVFVQUxJU0VSXzMyMDAwX0ExLCBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMiwgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjEsCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8zMjAwMF9CMiwgKExWTV9VSU5UMTYpQ1NFWF9FUVVBTElTRVJfMzIwMDBfU0NBTEV9LAorICAgICAgICB7Q1NFWF9FUVVBTElTRVJfNDQxMDBfQTAsIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0ExLCBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMiwgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQjEsCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl80NDEwMF9CMiwgKExWTV9VSU5UMTYpQ1NFWF9FUVVBTElTRVJfNDQxMDBfU0NBTEV9LAorICAgICAgICB7Q1NFWF9FUVVBTElTRVJfNDgwMDBfQTAsIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0ExLCBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMiwgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjEsCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMiwgKExWTV9VSU5UMTYpQ1NFWF9FUVVBTElTRVJfNDgwMDBfU0NBTEV9LAorICAgICAgICB7Q1NFWF9FUVVBTElTRVJfODgyMDBfQTAsIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTRVhfRVFVQUxJU0VSXzg4MjAwX0ExLCBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMiwgQ1NFWF9FUVVBTElTRVJfODgyMDBfQjEsCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMiwgKExWTV9VSU5UMTYpQ1NFWF9FUVVBTElTRVJfODgyMDBfU0NBTEV9LAorICAgICAgICB7Q1NFWF9FUVVBTElTRVJfOTYwMDBfQTAsIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0ExLCBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMiwgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjEsCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMiwgKExWTV9VSU5UMTYpQ1NFWF9FUVVBTElTRVJfOTYwMDBfU0NBTEV9LAorICAgICAgICB7Q1NFWF9FUVVBTElTRVJfMTc2NDAwX0EwLCAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0ExLCBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTIsIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMSwKKyAgICAgICAgIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMiwgKExWTV9VSU5UMTYpQ1NFWF9FUVVBTElTRVJfMTc2NDAwX1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMCwgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMSwgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0EyLCBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQjEsCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzE5MjAwMF9TQ0FMRX19OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM1MCwyMCArMjAxLDEyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBTdGVyZW8gZGVsYXkgdGFibGUgZm9yIENvbmNlcnQgU291bmQgKi8KLWNvbnN0IExWTV9VSU5UMTYgICAgTFZDU19TdGVyZW9EZWxheUNTW10gPSB7Ci0gICAgTFZDU19TVEVSRU9ERUxBWV9DU184S0haLAotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTFLSFosCi0gICAgTFZDU19TVEVSRU9ERUxBWV9DU18xMktIWiwKLSAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzE2S0haLAotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjJLSFosCi0gICAgTFZDU19TVEVSRU9ERUxBWV9DU18yNEtIWiwKLSAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzMyS0haLAotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDRLSFosCi0gICAgTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWiwKLSAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzg4S0haLAotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfOTZLSFosCi0gICAgTFZDU19TVEVSRU9ERUxBWV9DU18xNzZLSFosCi0gICAgTFZDU19TVEVSRU9ERUxBWV9DU18xOTJLSFosCitjb25zdCBMVk1fVUlOVDE2IExWQ1NfU3RlcmVvRGVsYXlDU1tdID0geworICAgICAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzhLSFosICAgTFZDU19TVEVSRU9ERUxBWV9DU18xMUtIWiwgTFZDU19TVEVSRU9ERUxBWV9DU18xMktIWiwKKyAgICAgICAgTFZDU19TVEVSRU9ERUxBWV9DU18xNktIWiwgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjJLSFosIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjRLSFosCisgICAgICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMzJLSFosICBMVkNTX1NURVJFT0RFTEFZX0NTXzQ0S0haLCBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haLAorICAgICAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzg4S0haLCAgTFZDU19TVEVSRU9ERUxBWV9DU185NktIWiwgTFZDU19TVEVSRU9ERUxBWV9DU18xNzZLSFosCisgICAgICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTkyS0haLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM3Myw4NyArMjE2LDQ2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90IExWQ1NfUmV2ZXJiQ29lZlRhYmxlW10gPSB7Ci0gICAgLyogSGVhZHBob25lIGNvZWZmaWNpZW50cyAqLwotICAgIHtDU19SRVZFUkJfODAwMF9BMCwgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1JFVkVSQl84MDAwX0ExLAotICAgICBDU19SRVZFUkJfODAwMF9BMiwKLSAgICAgQ1NfUkVWRVJCXzgwMDBfQjEsCi0gICAgIENTX1JFVkVSQl84MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzgwMDBfU0NBTEV9LAotICAgIHtDU19SRVZFUkJfMTEwMjVfQTAsICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19SRVZFUkJfMTEwMjVfQTEsCi0gICAgIENTX1JFVkVSQl8xMTAyNV9BMiwKLSAgICAgQ1NfUkVWRVJCXzExMDI1X0IxLAotICAgICBDU19SRVZFUkJfMTEwMjVfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMTEwMjVfU0NBTEV9LAotICAgIHtDU19SRVZFUkJfMTIwMDBfQTAsICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19SRVZFUkJfMTIwMDBfQTEsCi0gICAgIENTX1JFVkVSQl8xMjAwMF9BMiwKLSAgICAgQ1NfUkVWRVJCXzEyMDAwX0IxLAotICAgICBDU19SRVZFUkJfMTIwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMTIwMDBfU0NBTEV9LAotICAgIHtDU19SRVZFUkJfMTYwMDBfQTAsICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19SRVZFUkJfMTYwMDBfQTEsCi0gICAgIENTX1JFVkVSQl8xNjAwMF9BMiwKLSAgICAgQ1NfUkVWRVJCXzE2MDAwX0IxLAotICAgICBDU19SRVZFUkJfMTYwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMTYwMDBfU0NBTEV9LAotICAgIHtDU19SRVZFUkJfMjIwNTBfQTAsICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19SRVZFUkJfMjIwNTBfQTEsCi0gICAgIENTX1JFVkVSQl8yMjA1MF9BMiwKLSAgICAgQ1NfUkVWRVJCXzIyMDUwX0IxLAotICAgICBDU19SRVZFUkJfMjIwNTBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMjIwNTBfU0NBTEV9LAotICAgIHtDU19SRVZFUkJfMjQwMDBfQTAsICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19SRVZFUkJfMjQwMDBfQTEsCi0gICAgIENTX1JFVkVSQl8yNDAwMF9BMiwKLSAgICAgQ1NfUkVWRVJCXzI0MDAwX0IxLAotICAgICBDU19SRVZFUkJfMjQwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMjQwMDBfU0NBTEV9LAotICAgIHtDU19SRVZFUkJfMzIwMDBfQTAsICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19SRVZFUkJfMzIwMDBfQTEsCi0gICAgIENTX1JFVkVSQl8zMjAwMF9BMiwKLSAgICAgQ1NfUkVWRVJCXzMyMDAwX0IxLAotICAgICBDU19SRVZFUkJfMzIwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMzIwMDBfU0NBTEV9LAotICAgIHtDU19SRVZFUkJfNDQxMDBfQTAsICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19SRVZFUkJfNDQxMDBfQTEsCi0gICAgIENTX1JFVkVSQl80NDEwMF9BMiwKLSAgICAgQ1NfUkVWRVJCXzQ0MTAwX0IxLAotICAgICBDU19SRVZFUkJfNDQxMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfNDQxMDBfU0NBTEV9LAotICAgIHtDU19SRVZFUkJfNDgwMDBfQTAsICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19SRVZFUkJfNDgwMDBfQTEsCi0gICAgIENTX1JFVkVSQl80ODAwMF9BMiwKLSAgICAgQ1NfUkVWRVJCXzQ4MDAwX0IxLAotICAgICBDU19SRVZFUkJfNDgwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfNDgwMDBfU0NBTEV9Ci0gICAgLAotICAgIHtDU19SRVZFUkJfODgyMDBfQTAsICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19SRVZFUkJfODgyMDBfQTEsCi0gICAgIENTX1JFVkVSQl84ODIwMF9BMiwKLSAgICAgQ1NfUkVWRVJCXzg4MjAwX0IxLAotICAgICBDU19SRVZFUkJfODgyMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2KUNTX1JFVkVSQl84ODIwMF9TQ0FMRX0sCi0gICAge0NTX1JFVkVSQl85NjAwMF9BMCwgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1JFVkVSQl85NjAwMF9BMSwKLSAgICAgQ1NfUkVWRVJCXzk2MDAwX0EyLAotICAgICBDU19SRVZFUkJfOTYwMDBfQjEsCi0gICAgIENTX1JFVkVSQl85NjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl85NjAwMF9TQ0FMRX0sCi0gICAge0NTX1JFVkVSQl8xNzY0MDBfQTAsICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfUkVWRVJCXzE3NjQwMF9BMSwKLSAgICAgQ1NfUkVWRVJCXzE3NjQwMF9BMiwKLSAgICAgQ1NfUkVWRVJCXzE3NjQwMF9CMSwKLSAgICAgQ1NfUkVWRVJCXzE3NjQwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYpQ1NfUkVWRVJCXzE3NjQwMF9TQ0FMRX0sCi0gICAgIHtDU19SRVZFUkJfMTkyMDAwX0EwLCAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1JFVkVSQl8xOTIwMDBfQTEsCi0gICAgIENTX1JFVkVSQl8xOTIwMDBfQTIsCi0gICAgIENTX1JFVkVSQl8xOTIwMDBfQjEsCi0gICAgIENTX1JFVkVSQl8xOTIwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMTkyMDAwX1NDQUxFfQotfTsKKyAgICAgICAgLyogSGVhZHBob25lIGNvZWZmaWNpZW50cyAqLworICAgICAgICB7Q1NfUkVWRVJCXzgwMDBfQTAsIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfUkVWRVJCXzgwMDBfQTEsIENTX1JFVkVSQl84MDAwX0EyLCBDU19SRVZFUkJfODAwMF9CMSwgQ1NfUkVWRVJCXzgwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfODAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19SRVZFUkJfMTEwMjVfQTAsIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1JFVkVSQl8xMTAyNV9BMSwgQ1NfUkVWRVJCXzExMDI1X0EyLCBDU19SRVZFUkJfMTEwMjVfQjEsIENTX1JFVkVSQl8xMTAyNV9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX1JFVkVSQl8xMTAyNV9TQ0FMRX0sCisgICAgICAgIHtDU19SRVZFUkJfMTIwMDBfQTAsIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1JFVkVSQl8xMjAwMF9BMSwgQ1NfUkVWRVJCXzEyMDAwX0EyLCBDU19SRVZFUkJfMTIwMDBfQjEsIENTX1JFVkVSQl8xMjAwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX1JFVkVSQl8xMjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19SRVZFUkJfMTYwMDBfQTAsIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1JFVkVSQl8xNjAwMF9BMSwgQ1NfUkVWRVJCXzE2MDAwX0EyLCBDU19SRVZFUkJfMTYwMDBfQjEsIENTX1JFVkVSQl8xNjAwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX1JFVkVSQl8xNjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19SRVZFUkJfMjIwNTBfQTAsIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1JFVkVSQl8yMjA1MF9BMSwgQ1NfUkVWRVJCXzIyMDUwX0EyLCBDU19SRVZFUkJfMjIwNTBfQjEsIENTX1JFVkVSQl8yMjA1MF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX1JFVkVSQl8yMjA1MF9TQ0FMRX0sCisgICAgICAgIHtDU19SRVZFUkJfMjQwMDBfQTAsIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1JFVkVSQl8yNDAwMF9BMSwgQ1NfUkVWRVJCXzI0MDAwX0EyLCBDU19SRVZFUkJfMjQwMDBfQjEsIENTX1JFVkVSQl8yNDAwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX1JFVkVSQl8yNDAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19SRVZFUkJfMzIwMDBfQTAsIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1JFVkVSQl8zMjAwMF9BMSwgQ1NfUkVWRVJCXzMyMDAwX0EyLCBDU19SRVZFUkJfMzIwMDBfQjEsIENTX1JFVkVSQl8zMjAwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX1JFVkVSQl8zMjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19SRVZFUkJfNDQxMDBfQTAsIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1JFVkVSQl80NDEwMF9BMSwgQ1NfUkVWRVJCXzQ0MTAwX0EyLCBDU19SRVZFUkJfNDQxMDBfQjEsIENTX1JFVkVSQl80NDEwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX1JFVkVSQl80NDEwMF9TQ0FMRX0sCisgICAgICAgIHtDU19SRVZFUkJfNDgwMDBfQTAsIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1JFVkVSQl80ODAwMF9BMSwgQ1NfUkVWRVJCXzQ4MDAwX0EyLCBDU19SRVZFUkJfNDgwMDBfQjEsIENTX1JFVkVSQl80ODAwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX1JFVkVSQl80ODAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19SRVZFUkJfODgyMDBfQTAsIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1JFVkVSQl84ODIwMF9BMSwgQ1NfUkVWRVJCXzg4MjAwX0EyLCBDU19SRVZFUkJfODgyMDBfQjEsIENTX1JFVkVSQl84ODIwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX1JFVkVSQl84ODIwMF9TQ0FMRX0sCisgICAgICAgIHtDU19SRVZFUkJfOTYwMDBfQTAsIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1JFVkVSQl85NjAwMF9BMSwgQ1NfUkVWRVJCXzk2MDAwX0EyLCBDU19SRVZFUkJfOTYwMDBfQjEsIENTX1JFVkVSQl85NjAwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX1JFVkVSQl85NjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19SRVZFUkJfMTc2NDAwX0EwLCAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfUkVWRVJCXzE3NjQwMF9BMSwgQ1NfUkVWRVJCXzE3NjQwMF9BMiwgQ1NfUkVWRVJCXzE3NjQwMF9CMSwgQ1NfUkVWRVJCXzE3NjQwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX1JFVkVSQl8xNzY0MDBfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzE5MjAwMF9BMCwgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1JFVkVSQl8xOTIwMDBfQTEsIENTX1JFVkVSQl8xOTIwMDBfQTIsIENTX1JFVkVSQl8xOTIwMDBfQjEsIENTX1JFVkVSQl8xOTIwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfMTkyMDAwX1NDQUxFfX07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDYxLDIwICsyNjMsMTQgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1jb25zdCBHYWluX3QgTFZDU19PdXRwdXRHYWluVGFibGVbXSA9IHsKLSAgICB7TFZDU19IRUFEUEhPTkVfU0hJRlQsICAgICAgICAgLyogSGVhZHBob25lLCBzdGVyZW8gbW9kZSAqLwotICAgICBMVkNTX0hFQURQSE9ORV9TSElGVExPU1MsCi0gICAgIExWQ1NfSEVBRFBIT05FX0dBSU59LAotICAgIHtMVkNTX0VYX0hFQURQSE9ORV9TSElGVCwgICAgICAvKiBFWCBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCi0gICAgIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUTE9TUywKLSAgICAgTFZDU19FWF9IRUFEUEhPTkVfR0FJTn0sCi0gICAge0xWQ1NfSEVBRFBIT05FX1NISUZULCAgICAgICAgIC8qIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCi0gICAgIExWQ1NfSEVBRFBIT05FX1NISUZUTE9TUywKLSAgICAgTFZDU19IRUFEUEhPTkVfR0FJTn0sCi0gICAge0xWQ1NfRVhfSEVBRFBIT05FX1NISUZULCAgICAgIC8qIEVYIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCi0gICAgIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUTE9TUywKLSAgICAgTFZDU19FWF9IRUFEUEhPTkVfR0FJTn0KLX07Citjb25zdCBHYWluX3QgTFZDU19PdXRwdXRHYWluVGFibGVbXSA9IHt7TFZDU19IRUFEUEhPTkVfU0hJRlQsIC8qIEhlYWRwaG9uZSwgc3RlcmVvIG1vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0hFQURQSE9ORV9TSElGVExPU1MsIExWQ1NfSEVBRFBIT05FX0dBSU59LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0xWQ1NfRVhfSEVBRFBIT05FX1NISUZULCAvKiBFWCBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19FWF9IRUFEUEhPTkVfU0hJRlRMT1NTLCBMVkNTX0VYX0hFQURQSE9ORV9HQUlOfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtMVkNTX0hFQURQSE9ORV9TSElGVCwgLyogSGVhZHBob25lLCBtb25vIG1vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0hFQURQSE9ORV9TSElGVExPU1MsIExWQ1NfSEVBRFBIT05FX0dBSU59LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0xWQ1NfRVhfSEVBRFBIT05FX1NISUZULCAvKiBFWCBIZWFkcGhvbmUsIG1vbm8gbW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUTE9TUywgTFZDU19FWF9IRUFEUEhPTkVfR0FJTn19OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTUwMSwyNCArMjk3LDE0IEBACiAvKiAgICAgICAgICAxMDI0ICAgIGlzIC0xMmRCIGdhaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBMVkNTX1ZvbENvcnJlY3RfdCBMVkNTX1ZvbENvcnJlY3RUYWJsZVtdID0gewotICAgIHswLjQzMzM2MmYsICAgICAgICAgIC8qIEhlYWRwaG9uZSwgc3RlcmVvIG1vZGUgKi8KLSAgICAgMC4wMDAwMDBmLAotICAgICAxLjAwMDAyNGYsCi0gICAgIDEuNDEyNjQwZn0sCi0gICAgezAuNDMzMzYyZiwgICAgICAgICAgLyogRVggSGVhZHBob25lLCBzdGVyZW8gbW9kZSAqLwotICAgICAwLjAwMDAwMGYsCi0gICAgIDEuMDAwMDI0ZiwKLSAgICAgMS40MTI2NDBmfSwKLSAgICB7MS4wMDAwMDBmLCAgICAgICAgIC8qIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCi0gICAgIDAuMDAwMDAwZiwKLSAgICAgMS4wMDAwMjRmLAotICAgICAxLjQxMjY0MGZ9LAotICAgIHsxLjAwMDAwMGYsICAgICAgICAgLyogRVggSGVhZHBob25lLCBtb25vIG1vZGUgKi8KLSAgICAgMC4wMDAwMDBmLAotICAgICAxLjAwMDAyNGYsCi0gICAgIDEuNDEyNjQwZn0KLX07Citjb25zdCBMVkNTX1ZvbENvcnJlY3RfdCBMVkNTX1ZvbENvcnJlY3RUYWJsZVtdID0ge3swLjQzMzM2MmYsIC8qIEhlYWRwaG9uZSwgc3RlcmVvIG1vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZiwgMS4wMDAwMjRmLCAxLjQxMjY0MGZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MC40MzMzNjJmLCAvKiBFWCBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYsIDEuMDAwMDI0ZiwgMS40MTI2NDBmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEuMDAwMDAwZiwgLyogSGVhZHBob25lLCBtb25vIG1vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZiwgMS4wMDAwMjRmLCAxLjQxMjY0MGZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MS4wMDAwMDBmLCAvKiBFWCBIZWFkcGhvbmUsIG1vbm8gbW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmLCAxLjAwMDAyNGYsIDEuNDEyNjQwZn19OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTUyNiw1MSArMzEyLDMyIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBMVkNTX1ZPTF9UQ19GczgwMDAgICAgICAzMjU4MCAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NDI2MjY5NSAqLwotI2RlZmluZSBMVkNTX1ZPTF9UQ19GczExMDI1ICAgICAzMjYzMiAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NTg0OTYwOSAqLwotI2RlZmluZSBMVkNTX1ZPTF9UQ19GczEyMDAwICAgICAzMjY0MyAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NjE4NTMwMyAqLwotI2RlZmluZSBMVkNTX1ZPTF9UQ19GczE2MDAwICAgICAzMjY3NCAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzEzMTM0OCAqLwotI2RlZmluZSBMVkNTX1ZPTF9UQ19GczIyMDUwICAgICAzMjcwMCAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzkyNDgwNSAqLwotI2RlZmluZSBMVkNTX1ZPTF9UQ19GczI0MDAwICAgICAzMjcwNSAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODA3NzM5MyAqLwotI2RlZmluZSBMVkNTX1ZPTF9UQ19GczMyMDAwICAgICAzMjcyMSAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODU2NTY3NCAqLwotI2RlZmluZSBMVkNTX1ZPTF9UQ19GczQ0MTAwICAgICAzMjczNCAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODk2MjQwMiAqLwotI2RlZmluZSBMVkNTX1ZPTF9UQ19GczQ4MDAwICAgICAzMjczNyAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTA1Mzk1NSAqLwotI2RlZmluZSBMVkNTX1ZPTF9UQ19Gczg4MjAwICAgICAzMjc1MSAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTQ4MTA2NiAqLwotI2RlZmluZSBMVkNTX1ZPTF9UQ19Gczk2MDAwICAgICAzMjc1MSAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTUxMTcwMyAqLyAgIC8qIFRvZG8gQCBuZWVkIHRvIHJlIGNoZWNrIHRoaXMgdmFsdWUqLwotI2RlZmluZSBMVkNTX1ZPTF9UQ19GczE3NjQwMCAgICAzMjc1OSAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTc0MDQ5OSAqLwotI2RlZmluZSBMVkNTX1ZPTF9UQ19GczE5MjAwMCAgICAzMjc2MyAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTg3NzkyNSAqLyAgLyogVG9kbyBAIG5lZWQgdG8gcmUgY2hlY2sgdGhpcyB2YWx1ZSovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzODAwMCAzMjU4MCAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTQyNjI2OTUgKi8KKyNkZWZpbmUgTFZDU19WT0xfVENfRnMxMTAyNSAzMjYzMiAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NTg0OTYwOSAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczEyMDAwIDMyNjQzIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk2MTg1MzAzICovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMTYwMDAgMzI2NzQgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTcxMzEzNDggKi8KKyNkZWZpbmUgTFZDU19WT0xfVENfRnMyMjA1MCAzMjcwMCAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzkyNDgwNSAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczI0MDAwIDMyNzA1IC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4MDc3MzkzICovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMzIwMDAgMzI3MjEgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg1NjU2NzQgKi8KKyNkZWZpbmUgTFZDU19WT0xfVENfRnM0NDEwMCAzMjczNCAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODk2MjQwMiAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczQ4MDAwIDMyNzM3IC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5MDUzOTU1ICovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzODgyMDAgMzI3NTEgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk0ODEwNjYgKi8KKyNkZWZpbmUgTFZDU19WT0xfVENfRnM5NjAwMCBcCisgICAgMzI3NTEgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk1MTE3MDMgKi8gLyogVG9kbyBAIG5lZWQgdG8gcmUgY2hlY2sgdGhpcyB2YWx1ZSovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMTc2NDAwIDMyNzU5ICAgICAgICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk3NDA0OTkgKi8KKyNkZWZpbmUgTFZDU19WT0xfVENfRnMxOTIwMDAgXAorICAgIDMyNzYzIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5ODc3OTI1ICovIC8qIFRvZG8gQCBuZWVkIHRvIHJlIGNoZWNrIHRoaXMgdmFsdWUqLwogCi1jb25zdCBMVk1fSU5UMTYgTFZDU19Wb2x1bWVUQ1RhYmxlWzEzXSA9IHtMVkNTX1ZPTF9UQ19GczgwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczExMDI1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTYwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczIyMDUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMyNDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMzIwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczQ0MTAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0ODAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzODgyMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19Gczk2MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxNzY0MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczE5MjAwMAotfTsKK2NvbnN0IExWTV9JTlQxNiBMVkNTX1ZvbHVtZVRDVGFibGVbMTNdID0geworICAgICAgICBMVkNTX1ZPTF9UQ19GczgwMDAsICBMVkNTX1ZPTF9UQ19GczExMDI1LCBMVkNTX1ZPTF9UQ19GczEyMDAwLCBMVkNTX1ZPTF9UQ19GczE2MDAwLAorICAgICAgICBMVkNTX1ZPTF9UQ19GczIyMDUwLCBMVkNTX1ZPTF9UQ19GczI0MDAwLCBMVkNTX1ZPTF9UQ19GczMyMDAwLCBMVkNTX1ZPTF9UQ19GczQ0MTAwLAorICAgICAgICBMVkNTX1ZPTF9UQ19GczQ4MDAwLCBMVkNTX1ZPTF9UQ19Gczg4MjAwLCBMVkNTX1ZPTF9UQ19Gczk2MDAwLCBMVkNTX1ZPTF9UQ19GczE3NjQwMCwKKyAgICAgICAgTFZDU19WT0xfVENfRnMxOTIwMDB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBTYW1wbGUgcmF0ZSB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IExWTV9JTlQzMiAgIExWQ1NfU2FtcGxlUmF0ZVRhYmxlWzEzXSA9IHs4MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MjAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3NjQwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTIwMDAKLX07Citjb25zdCBMVk1fSU5UMzIgTFZDU19TYW1wbGVSYXRlVGFibGVbMTNdID0gezgwMDAsICAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgIDI0MDAwLCAzMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsIDQ4MDAwLCA4ODIwMCwgOTYwMDAsIDE3NjQwMCwgMTkyMDAwfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuaAppbmRleCA1NDkwNjk5Li43NjZmNWYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5oCkBAIC0yNCw3ICsyNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2luY2x1ZGUgIkJJUVVBRC5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQmlxdWFkIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiQklRVUFELmgiIC8qIEJpcXVhZCBkZWZpbml0aW9ucyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEwNiwzNSArMTA2LDM0IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotZXh0ZXJuIGNvbnN0IExWTV9JTlQzMiAgICAgICAgICBMVkNTX1NhbXBsZVJhdGVUYWJsZVtdOworZXh0ZXJuIGNvbnN0IExWTV9JTlQzMiBMVkNTX1NhbXBsZVJhdGVUYWJsZVtdOwogCiAvKlNwZWFrZXIgY29lZmZpZW50IHRhYmxlcyovCi1leHRlcm4gTFZNX1VJTlQxNiAgICAgICAgICAgICAgIExWQ1NfTVNfU21hbGxfU0VNaWRkbGVHYWluVGFibGVbXTsKLWV4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19TbWFsbF9TRVNpZGVDb2VmVGFibGVbXTsKLWV4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19TbWFsbF9FcXVhbGlzZXJDb2VmVGFibGVbXTsKLWV4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19TbWFsbF9SZXZlcmJDb2VmVGFibGVbXSA7Ci1leHRlcm4gTFZNX1VJTlQxNiAgICAgICAgICAgICAgIExWQ1NfTVNfU21hbGxfU3RlcmVvRGVsYXlDUzRNU1tdOwotZXh0ZXJuIEdhaW5fdCAgICAgICAgICAgICAgICAgICBMVkNTX01TX1NtYWxsX091dHB1dEdhaW5UYWJsZVtdOwotZXh0ZXJuIExWQ1NfVm9sQ29ycmVjdF90ICAgICAgICBMVkNTX01TX1NtYWxsX1ZvbENvcnJlY3RUYWJsZVtdOwotZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgICAgICAgICBMVkNTX01TX1NtYWxsX1JldmVyYkdhaW5UYWJsZVtdOworZXh0ZXJuIExWTV9VSU5UMTYgTFZDU19NU19TbWFsbF9TRU1pZGRsZUdhaW5UYWJsZVtdOworZXh0ZXJuIEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19NU19TbWFsbF9TRVNpZGVDb2VmVGFibGVbXTsKK2V4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90IExWQ1NfTVNfU21hbGxfRXF1YWxpc2VyQ29lZlRhYmxlW107CitleHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX01TX1NtYWxsX1JldmVyYkNvZWZUYWJsZVtdOworZXh0ZXJuIExWTV9VSU5UMTYgTFZDU19NU19TbWFsbF9TdGVyZW9EZWxheUNTNE1TW107CitleHRlcm4gR2Fpbl90IExWQ1NfTVNfU21hbGxfT3V0cHV0R2FpblRhYmxlW107CitleHRlcm4gTFZDU19Wb2xDb3JyZWN0X3QgTFZDU19NU19TbWFsbF9Wb2xDb3JyZWN0VGFibGVbXTsKK2V4dGVybiBMVk1fVUlOVDE2IExWQ1NfTVNfU21hbGxfUmV2ZXJiR2FpblRhYmxlW107CiAKLWV4dGVybiBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgTFZDU19NU19NZWRpdW1fU0VNaWRkbGVHYWluVGFibGVbXTsKLWV4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19NZWRpdW1fU0VTaWRlQ29lZlRhYmxlW107Ci1leHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgIExWQ1NfTVNfTWVkaXVtX0VxdWFsaXNlckNvZWZUYWJsZVtdOwotZXh0ZXJuIEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgICBMVkNTX01TX01lZGl1bV9SZXZlcmJDb2VmVGFibGVbXSA7Ci1leHRlcm4gTFZNX1VJTlQxNiAgICAgICAgICAgICAgIExWQ1NfTVNfTWVkaXVtX1N0ZXJlb0RlbGF5Q1M0TVNbXTsKLWV4dGVybiBHYWluX3QgICAgICAgICAgICAgICAgICAgTFZDU19NU19NZWRpdW1fT3V0cHV0R2FpblRhYmxlW107Ci1leHRlcm4gTFZDU19Wb2xDb3JyZWN0X3QgICAgICAgIExWQ1NfTVNfTWVkaXVtX1ZvbENvcnJlY3RUYWJsZVtdOwotZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgICAgICAgICBMVkNTX01TX01lZGl1bV9SZXZlcmJHYWluVGFibGVbXTsKK2V4dGVybiBMVk1fVUlOVDE2IExWQ1NfTVNfTWVkaXVtX1NFTWlkZGxlR2FpblRhYmxlW107CitleHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX01TX01lZGl1bV9TRVNpZGVDb2VmVGFibGVbXTsKK2V4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90IExWQ1NfTVNfTWVkaXVtX0VxdWFsaXNlckNvZWZUYWJsZVtdOworZXh0ZXJuIEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19NU19NZWRpdW1fUmV2ZXJiQ29lZlRhYmxlW107CitleHRlcm4gTFZNX1VJTlQxNiBMVkNTX01TX01lZGl1bV9TdGVyZW9EZWxheUNTNE1TW107CitleHRlcm4gR2Fpbl90IExWQ1NfTVNfTWVkaXVtX091dHB1dEdhaW5UYWJsZVtdOworZXh0ZXJuIExWQ1NfVm9sQ29ycmVjdF90IExWQ1NfTVNfTWVkaXVtX1ZvbENvcnJlY3RUYWJsZVtdOworZXh0ZXJuIExWTV9VSU5UMTYgTFZDU19NU19NZWRpdW1fUmV2ZXJiR2FpblRhYmxlW107CiAKLWV4dGVybiBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgTFZDU19NU19MYXJnZV9TRU1pZGRsZUdhaW5UYWJsZVtdOwotZXh0ZXJuIEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgICBMVkNTX01TX0xhcmdlX1NFU2lkZUNvZWZUYWJsZVtdOwotZXh0ZXJuIEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgICBMVkNTX01TX0xhcmdlX0VxdWFsaXNlckNvZWZUYWJsZVtdOwotZXh0ZXJuIEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgICBMVkNTX01TX0xhcmdlX1JldmVyYkNvZWZUYWJsZVtdIDsKLWV4dGVybiBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgTFZDU19NU19MYXJnZV9TdGVyZW9EZWxheUNTNE1TW107Ci1leHRlcm4gR2Fpbl90ICAgICAgICAgICAgICAgICAgIExWQ1NfTVNfTGFyZ2VfT3V0cHV0R2FpblRhYmxlW107Ci1leHRlcm4gTFZDU19Wb2xDb3JyZWN0X3QgICAgICAgIExWQ1NfTVNfTGFyZ2VfVm9sQ29ycmVjdFRhYmxlW107Ci1leHRlcm4gTFZNX1VJTlQxNiAgICAgICAgICAgICAgIExWQ1NfTVNfTGFyZ2VfUmV2ZXJiR2FpblRhYmxlW107CitleHRlcm4gTFZNX1VJTlQxNiBMVkNTX01TX0xhcmdlX1NFTWlkZGxlR2FpblRhYmxlW107CitleHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX01TX0xhcmdlX1NFU2lkZUNvZWZUYWJsZVtdOworZXh0ZXJuIEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19NU19MYXJnZV9FcXVhbGlzZXJDb2VmVGFibGVbXTsKK2V4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90IExWQ1NfTVNfTGFyZ2VfUmV2ZXJiQ29lZlRhYmxlW107CitleHRlcm4gTFZNX1VJTlQxNiBMVkNTX01TX0xhcmdlX1N0ZXJlb0RlbGF5Q1M0TVNbXTsKK2V4dGVybiBHYWluX3QgTFZDU19NU19MYXJnZV9PdXRwdXRHYWluVGFibGVbXTsKK2V4dGVybiBMVkNTX1ZvbENvcnJlY3RfdCBMVkNTX01TX0xhcmdlX1ZvbENvcnJlY3RUYWJsZVtdOworZXh0ZXJuIExWTV9VSU5UMTYgTFZDU19NU19MYXJnZV9SZXZlcmJHYWluVGFibGVbXTsKIAogI2VuZGlmIC8qIF9fTFZDU19UQUJMRVNfSF9fICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDY3NGMyNDYuLjk5MzllZDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDY0IEBACiAvLyBCdWlsZCB0aGUgdW5pdCB0ZXN0cyBmb3IgZWZmZWN0cwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJFZmZlY3RSZXZlcmJUZXN0IiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgZ3Rlc3Q6IHRydWUsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAiRWZmZWN0UmV2ZXJiVGVzdC5jcHAiLAorICAgICAgICAiRWZmZWN0VGVzdEhlbHBlci5jcHAiLAorICAgIF0sCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlicmV2ZXJiIiwKKyAgICAgICAgImxpYnJldmVyYndyYXBwZXIiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9lZmZlY3RzIiwKKyAgICAgICAgImxpYmhhcmR3YXJlX2hlYWRlcnMiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJFZmZlY3RCdW5kbGVUZXN0IiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgZ3Rlc3Q6IHRydWUsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisgICAgc3JjczogWworICAgICAgICAiRWZmZWN0QnVuZGxlVGVzdC5jcHAiLAorICAgICAgICAiRWZmZWN0VGVzdEhlbHBlci5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYnVuZGxld3JhcHBlciIsCisgICAgICAgICJsaWJtdXNpY2J1bmRsZSIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICBdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAibHZtdGVzdCIsCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IGZhbHNlLApAQCAtNDQsNiArMTAzLDQwIEBACiB9CiAKIGNjX3Rlc3QgeworICAgIG5hbWU6ICJyZXZlcmJfdGVzdCIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgcHJvcHJpZXRhcnk6IHRydWUsCisgICAgZ3Rlc3Q6IGZhbHNlLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJyZXZlcmIiLAorICAgICAgICAibGlicmV2ZXJid3JhcHBlciIsCisgICAgXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJyZXZlcmJfdGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CiAgICAgbmFtZTogInNuciIsCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IGZhbHNlLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9FZmZlY3RCdW5kbGVUZXN0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0VmZmVjdEJ1bmRsZVRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MWZmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9FZmZlY3RCdW5kbGVUZXN0LmNwcApAQCAtMCwwICsxLDE5OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkVmZmVjdFRlc3RIZWxwZXIuaCIKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyBVcGRhdGUgaXNCYXNzQm9vc3QsIGlmIHRoZSBvcmRlciBvZiBlZmZlY3RzIGlzIHVwZGF0ZWQKK2NvbnN0ZXhwciBlZmZlY3RfdXVpZF90IGtFZmZlY3RVdWlkc1tdID0geworICAgICAgICAvLyBOWFAgU1cgQmFzc0Jvb3N0CisgICAgICAgIHsweDg2MzFmMzAwLCAweDcyZTIsIDB4MTFkZiwgMHhiNTdlLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICAvLyBOWFAgU1cgVmlydHVhbGl6ZXIKKyAgICAgICAgezB4MWQ0MDMzYzAsIDB4ODU1NywgMHgxMWRmLCAweDlmMmQsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCisgICAgICAgIC8vIE5YUCBTVyBFcXVhbGl6ZXIKKyAgICAgICAgezB4Y2U3NzJmMjAsIDB4ODQ3ZCwgMHgxMWRmLCAweGJiMTcsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCisgICAgICAgIC8vIE5YUCBTVyBWb2x1bWUKKyAgICAgICAgezB4MTE5MzQxYTAsIDB4ODQ2OSwgMHgxMWRmLCAweDgxZjksIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCit9OworCitzdGF0aWMgYm9vbCBpc0Jhc3NCb29zdChjb25zdCBlZmZlY3RfdXVpZF90KiB1dWlkKSB7CisgICAgLy8gVXBkYXRlIHRoaXMsIGlmIHRoZSBvcmRlciBvZiBlZmZlY3RzIGluIGtFZmZlY3RVdWlkcyBpcyB1cGRhdGVkCisgICAgcmV0dXJuIHV1aWQgPT0gJmtFZmZlY3RVdWlkc1swXTsKK30KKworY29uc3RleHByIHNpemVfdCBrTnVtRWZmZWN0VXVpZHMgPSBzdGQ6OnNpemUoa0VmZmVjdFV1aWRzKTsKKwordHlwZWRlZiBzdGQ6OnR1cGxlPGludCwgaW50LCBpbnQsIGludCwgaW50PiBTaW5nbGVFZmZlY3RUZXN0UGFyYW07CitjbGFzcyBTaW5nbGVFZmZlY3RUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxTaW5nbGVFZmZlY3RUZXN0UGFyYW0+IHsKKyAgcHVibGljOgorICAgIFNpbmdsZUVmZmVjdFRlc3QoKQorICAgICAgICA6IG1DaE1hc2soRWZmZWN0VGVzdEhlbHBlcjo6a0NoTWFza3Nbc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSldKSwKKyAgICAgICAgICBtQ2hhbm5lbENvdW50KGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtQ2hNYXNrKSksCisgICAgICAgICAgbVNhbXBsZVJhdGUoRWZmZWN0VGVzdEhlbHBlcjo6a1NhbXBsZVJhdGVzW3N0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpXSksCisgICAgICAgICAgbUZyYW1lQ291bnQoRWZmZWN0VGVzdEhlbHBlcjo6a0ZyYW1lQ291bnRzW3N0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpXSksCisgICAgICAgICAgbUxvb3BDb3VudChFZmZlY3RUZXN0SGVscGVyOjprTG9vcENvdW50c1tzdGQ6OmdldDwzPihHZXRQYXJhbSgpKV0pLAorICAgICAgICAgIG1Ub3RhbEZyYW1lQ291bnQobUZyYW1lQ291bnQgKiBtTG9vcENvdW50KSwKKyAgICAgICAgICBtVXVpZCgma0VmZmVjdFV1aWRzW3N0ZDo6Z2V0PDQ+KEdldFBhcmFtKCkpXSkge30KKworICAgIGNvbnN0IHNpemVfdCBtQ2hNYXNrOworICAgIGNvbnN0IHNpemVfdCBtQ2hhbm5lbENvdW50OworICAgIGNvbnN0IHNpemVfdCBtU2FtcGxlUmF0ZTsKKyAgICBjb25zdCBzaXplX3QgbUZyYW1lQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90IG1Mb29wQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90IG1Ub3RhbEZyYW1lQ291bnQ7CisgICAgY29uc3QgZWZmZWN0X3V1aWRfdCogbVV1aWQ7Cit9OworCisvLyBUZXN0cyBhcHBseWluZyBhIHNpbmdsZSBlZmZlY3QKK1RFU1RfUChTaW5nbGVFZmZlY3RUZXN0LCBTaW1wbGVQcm9jZXNzKSB7CisgICAgU0NPUEVEX1RSQUNFKHRlc3Rpbmc6Ok1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICA8PCAiY2hNYXNrOiAiIDw8IG1DaE1hc2sgPDwgIiBzYW1wbGVSYXRlOiAiIDw8IG1TYW1wbGVSYXRlCisgICAgICAgICAgICAgICAgIDw8ICIgZnJhbWVDb3VudDogIiA8PCBtRnJhbWVDb3VudCA8PCAiIGxvb3BDb3VudDogIiA8PCBtTG9vcENvdW50KTsKKworICAgIEVmZmVjdFRlc3RIZWxwZXIgZWZmZWN0KG1VdWlkLCBtQ2hNYXNrLCBtQ2hNYXNrLCBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsIG1Mb29wQ291bnQpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZWZmZWN0LmNyZWF0ZUVmZmVjdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShlZmZlY3Quc2V0Q29uZmlnKCkpOworCisgICAgLy8gSW5pdGlhbGl6ZSBpbnB1dCBidWZmZXIgd2l0aCBkZXRlcm1pbmlzdGljIHBzZXVkby1yYW5kb20gdmFsdWVzCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGlucHV0KG1Ub3RhbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50KTsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gb3V0cHV0KG1Ub3RhbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50KTsKKyAgICBzdGQ6Om1pbnN0ZF9yYW5kIGdlbihtQ2hNYXNrKTsKKyAgICBzdGQ6OnVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248PiBkaXMoLTEuMGYsIDEuMGYpOworICAgIGZvciAoYXV0byYgaW4gOiBpbnB1dCkgeworICAgICAgICBpbiA9IGRpcyhnZW4pOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShlZmZlY3QucHJvY2VzcyhpbnB1dC5kYXRhKCksIG91dHB1dC5kYXRhKCkpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShlZmZlY3QucmVsZWFzZUVmZmVjdCgpKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBFZmZlY3RCdW5kbGVUZXN0QWxsLCBTaW5nbGVFZmZlY3RUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OkNvbWJpbmUoOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KUVmZmVjdFRlc3RIZWxwZXI6OmtOdW1DaE1hc2tzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClFZmZlY3RUZXN0SGVscGVyOjprTnVtU2FtcGxlUmF0ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KUVmZmVjdFRlc3RIZWxwZXI6OmtOdW1GcmFtZUNvdW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpRWZmZWN0VGVzdEhlbHBlcjo6a051bUxvb3BDb3VudHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KWtOdW1FZmZlY3RVdWlkcykpKTsKKwordHlwZWRlZiBzdGQ6OnR1cGxlPGludCwgaW50LCBpbnQsIGludD4gU2luZ2xlRWZmZWN0Q29tcGFyaXNvblRlc3RQYXJhbTsKK2NsYXNzIFNpbmdsZUVmZmVjdENvbXBhcmlzb25UZXN0CisgICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPFNpbmdsZUVmZmVjdENvbXBhcmlzb25UZXN0UGFyYW0+IHsKKyAgcHVibGljOgorICAgIFNpbmdsZUVmZmVjdENvbXBhcmlzb25UZXN0KCkKKyAgICAgICAgOiBtU2FtcGxlUmF0ZShFZmZlY3RUZXN0SGVscGVyOjprU2FtcGxlUmF0ZXNbc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSldKSwKKyAgICAgICAgICBtRnJhbWVDb3VudChFZmZlY3RUZXN0SGVscGVyOjprRnJhbWVDb3VudHNbc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSldKSwKKyAgICAgICAgICBtTG9vcENvdW50KEVmZmVjdFRlc3RIZWxwZXI6OmtMb29wQ291bnRzW3N0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpXSksCisgICAgICAgICAgbVRvdGFsRnJhbWVDb3VudChtRnJhbWVDb3VudCAqIG1Mb29wQ291bnQpLAorICAgICAgICAgIG1VdWlkKCZrRWZmZWN0VXVpZHNbc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSldKSB7fQorCisgICAgY29uc3Qgc2l6ZV90IG1TYW1wbGVSYXRlOworICAgIGNvbnN0IHNpemVfdCBtRnJhbWVDb3VudDsKKyAgICBjb25zdCBzaXplX3QgbUxvb3BDb3VudDsKKyAgICBjb25zdCBzaXplX3QgbVRvdGFsRnJhbWVDb3VudDsKKyAgICBjb25zdCBlZmZlY3RfdXVpZF90KiBtVXVpZDsKK307CisKKy8vIENvbXBhcmVzIGZpcnN0IHR3byBjaGFubmVscyBpbiBtdWx0aS1jaGFubmVsIG91dHB1dCB0byBzdGVyZW8gb3V0cHV0IHdoZW4gc2FtZSBlZmZlY3QgaXMgYXBwbGllZAorVEVTVF9QKFNpbmdsZUVmZmVjdENvbXBhcmlzb25UZXN0LCBTaW1wbGVQcm9jZXNzKSB7CisgICAgU0NPUEVEX1RSQUNFKHRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiIHNhbXBsZVJhdGU6ICIgPDwgbVNhbXBsZVJhdGUgPDwgIiBmcmFtZUNvdW50OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBtRnJhbWVDb3VudCA8PCAiIGxvb3BDb3VudDogIiA8PCBtTG9vcENvdW50KTsKKworICAgIC8vIEluaXRpYWxpemUgbW9ubyBpbnB1dCBidWZmZXIgd2l0aCBkZXRlcm1pbmlzdGljIHBzZXVkby1yYW5kb20gdmFsdWVzCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG1vbm9JbnB1dChtVG90YWxGcmFtZUNvdW50KTsKKworICAgIHN0ZDo6bWluc3RkX3JhbmQgZ2VuKG1TYW1wbGVSYXRlKTsKKyAgICBzdGQ6OnVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248PiBkaXMoLTEuMGYsIDEuMGYpOworICAgIGZvciAoYXV0byYgaW4gOiBtb25vSW5wdXQpIHsKKyAgICAgICAgaW4gPSBkaXMoZ2VuKTsKKyAgICB9CisKKyAgICAvLyBHZW5lcmF0ZSBzdGVyZW8gYnkgcmVwZWF0aW5nIG1vbm8gY2hhbm5lbCBkYXRhCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHN0ZXJlb0lucHV0KG1Ub3RhbEZyYW1lQ291bnQgKiBGQ0NfMik7CisgICAgYWRqdXN0X2NoYW5uZWxzKG1vbm9JbnB1dC5kYXRhKCksIEZDQ18xLCBzdGVyZW9JbnB1dC5kYXRhKCksIEZDQ18yLCBzaXplb2YoZmxvYXQpLAorICAgICAgICAgICAgICAgICAgICBtVG90YWxGcmFtZUNvdW50ICogc2l6ZW9mKGZsb2F0KSAqIEZDQ18xKTsKKworICAgIC8vIEFwcGx5IGVmZmVjdCBvbiBzdGVyZW8gY2hhbm5lbHMKKyAgICBFZmZlY3RUZXN0SGVscGVyIHN0ZXJlb0VmZmVjdChtVXVpZCwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1GcmFtZUNvdW50LCBtTG9vcENvdW50KTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHN0ZXJlb0VmZmVjdC5jcmVhdGVFZmZlY3QoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoc3RlcmVvRWZmZWN0LnNldENvbmZpZygpKTsKKworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBzdGVyZW9PdXRwdXQobVRvdGFsRnJhbWVDb3VudCAqIEZDQ18yKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzdGVyZW9FZmZlY3QucHJvY2VzcyhzdGVyZW9JbnB1dC5kYXRhKCksIHN0ZXJlb091dHB1dC5kYXRhKCkpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzdGVyZW9FZmZlY3QucmVsZWFzZUVmZmVjdCgpKTsKKworICAgIC8vIENvbnZlcnQgc3RlcmVvIGZsb2F0IGRhdGEgdG8gc3RlcmVvIGludDE2X3QgdG8gYmUgdXNlZCBhcyByZWZlcmVuY2UKKyAgICBzdGQ6OnZlY3RvcjxpbnQxNl90PiBzdGVyZW9SZWZJMTYobVRvdGFsRnJhbWVDb3VudCAqIEZDQ18yKTsKKyAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoc3RlcmVvUmVmSTE2LmRhdGEoKSwgc3RlcmVvT3V0cHV0LmRhdGEoKSwgbVRvdGFsRnJhbWVDb3VudCAqIEZDQ18yKTsKKworICAgIGZvciAoc2l6ZV90IGNoTWFzayA6IEVmZmVjdFRlc3RIZWxwZXI6OmtDaE1hc2tzKSB7CisgICAgICAgIHNpemVfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hNYXNrKTsKKyAgICAgICAgRWZmZWN0VGVzdEhlbHBlciB0ZXN0RWZmZWN0KG1VdWlkLCBjaE1hc2ssIGNoTWFzaywgbVNhbXBsZVJhdGUsIG1GcmFtZUNvdW50LCBtTG9vcENvdW50KTsKKworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh0ZXN0RWZmZWN0LmNyZWF0ZUVmZmVjdCgpKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodGVzdEVmZmVjdC5zZXRDb25maWcoKSk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHRlc3RJbnB1dChtVG90YWxGcmFtZUNvdW50ICogY2hhbm5lbENvdW50KTsKKworICAgICAgICAvLyBSZXBlYXQgbW9ubyBjaGFubmVsIGRhdGEgdG8gYWxsIHRoZSBjaGFubmVscworICAgICAgICAvLyBhZGp1c3RfY2hhbm5lbHMoKSB6ZXJvIGZpbGxzIGNoYW5uZWxzID4gMiwgaGVuY2UgY2FuJ3QgYmUgdXNlZCBoZXJlCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRvdGFsRnJhbWVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBhdXRvKiBmcCA9ICZ0ZXN0SW5wdXRbaSAqIGNoYW5uZWxDb3VudF07CisgICAgICAgICAgICBzdGQ6OmZpbGwoZnAsIGZwICsgY2hhbm5lbENvdW50LCBtb25vSW5wdXRbaV0pOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHRlc3RPdXRwdXQobVRvdGFsRnJhbWVDb3VudCAqIGNoYW5uZWxDb3VudCk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHRlc3RFZmZlY3QucHJvY2Vzcyh0ZXN0SW5wdXQuZGF0YSgpLCB0ZXN0T3V0cHV0LmRhdGEoKSkpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh0ZXN0RWZmZWN0LnJlbGVhc2VFZmZlY3QoKSk7CisKKyAgICAgICAgLy8gRXh0cmFjdCBmaXJzdCB0d28gY2hhbm5lbHMKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHN0ZXJlb1Rlc3RPdXRwdXQobVRvdGFsRnJhbWVDb3VudCAqIEZDQ18yKTsKKyAgICAgICAgYWRqdXN0X2NoYW5uZWxzKHRlc3RPdXRwdXQuZGF0YSgpLCBjaGFubmVsQ291bnQsIHN0ZXJlb1Rlc3RPdXRwdXQuZGF0YSgpLCBGQ0NfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmbG9hdCksIG1Ub3RhbEZyYW1lQ291bnQgKiBzaXplb2YoZmxvYXQpICogY2hhbm5lbENvdW50KTsKKworICAgICAgICAvLyBDb252ZXJ0IHRoZSB0ZXN0IGRhdGEgdG8gaW50MTZfdAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQxNl90PiBzdGVyZW9UZXN0STE2KG1Ub3RhbEZyYW1lQ291bnQgKiBGQ0NfMik7CisgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChzdGVyZW9UZXN0STE2LmRhdGEoKSwgc3RlcmVvVGVzdE91dHB1dC5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG90YWxGcmFtZUNvdW50ICogRkNDXzIpOworCisgICAgICAgIGlmIChpc0Jhc3NCb29zdChtVXVpZCkpIHsKKyAgICAgICAgICAgIC8vIFNOUiBtdXN0IGJlIGFib3ZlIHRoZSB0aHJlc2hvbGQKKyAgICAgICAgICAgIGZsb2F0IHNuciA9IGNvbXB1dGVTbnI8aW50MTZfdD4oc3RlcmVvUmVmSTE2LmRhdGEoKSwgc3RlcmVvVGVzdEkxNi5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbEZyYW1lQ291bnQgKiBGQ0NfMik7CisgICAgICAgICAgICBBU1NFUlRfR1Qoc25yLCBFZmZlY3RUZXN0SGVscGVyOjprU05SVGhyZXNob2xkKQorICAgICAgICAgICAgICAgICAgICA8PCAiU05SICIgPDwgc25yIDw8ICJpcyBsb3dlciB0aGFuICIgPDwgRWZmZWN0VGVzdEhlbHBlcjo6a1NOUlRocmVzaG9sZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgwLAorICAgICAgICAgICAgICAgICAgICAgIG1lbWNtcChzdGVyZW9SZWZJMTYuZGF0YSgpLCBzdGVyZW9UZXN0STE2LmRhdGEoKSwgbVRvdGFsRnJhbWVDb3VudCAqIEZDQ18yKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkZpcnN0IHR3byBjaGFubmVscyBkbyBub3QgbWF0Y2ggd2l0aCBzdGVyZW8gb3V0cHV0IFxuIjsKKyAgICAgICAgfQorICAgIH0KK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBFZmZlY3RCdW5kbGVUZXN0QWxsLCBTaW5nbGVFZmZlY3RDb21wYXJpc29uVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpDb21iaW5lKDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClFZmZlY3RUZXN0SGVscGVyOjprTnVtU2FtcGxlUmF0ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KUVmZmVjdFRlc3RIZWxwZXI6OmtOdW1GcmFtZUNvdW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpRWZmZWN0VGVzdEhlbHBlcjo6a051bUxvb3BDb3VudHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KWtOdW1FZmZlY3RVdWlkcykpKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICBBTE9HVigiVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvRWZmZWN0UmV2ZXJiVGVzdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9FZmZlY3RSZXZlcmJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTQ1M2ViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvRWZmZWN0UmV2ZXJiVGVzdC5jcHAKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9wcmVzZXRyZXZlcmIuaD4KKyNpbmNsdWRlIDxWZWN0b3JBcml0aG1ldGljLmg+CisKKyNpbmNsdWRlICJFZmZlY3RUZXN0SGVscGVyLmgiCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY29uc3RleHByIGVmZmVjdF91dWlkX3Qga0VmZmVjdFV1aWRzW10gPSB7CisgICAgICAgIC8vIE5YUCBTVyBpbnNlcnQgZW52aXJvbm1lbnRhbCByZXZlcmIKKyAgICAgICAgezB4YzdhNTExYTAsIDB4YTNiYiwgMHgxMWRmLCAweDg2MGUsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCisgICAgICAgIC8vIE5YUCBTVyBpbnNlcnQgcHJlc2V0IHJldmVyYgorICAgICAgICB7MHgxNzJjZGYwMCwgMHhhM2JjLCAweDExZGYsIDB4YTcyZiwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgLy8gTlhQIFNXIGF1eGlsaWFyeSBlbnZpcm9ubWVudGFsIHJldmVyYgorICAgICAgICB7MHg0YTM4N2ZjMCwgMHg4YWIzLCAweDExZGYsIDB4OGJhZCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgLy8gTlhQIFNXIGF1eGlsaWFyeSBwcmVzZXQgcmV2ZXJiCisgICAgICAgIHsweGYyOWExNDAwLCAweGEzYmIsIDB4MTFkZiwgMHg4ZGRjLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorfTsKKworY29uc3RleHByIHNpemVfdCBrTnVtRWZmZWN0VXVpZHMgPSBzdGQ6OnNpemUoa0VmZmVjdFV1aWRzKTsKKworc3RhdGljIGJvb2wgaXNBdXhNb2RlKGNvbnN0IGVmZmVjdF91dWlkX3QqIHV1aWQpIHsKKyAgICAvLyBVcGRhdGUgdGhpcywgaWYgdGhlIG9yZGVyIG9mIGVmZmVjdHMgaW4ga0VmZmVjdFV1aWRzIGlzIHVwZGF0ZWQKKyAgICByZXR1cm4gKHV1aWQgPT0gJmtFZmZlY3RVdWlkc1syXSB8fCB1dWlkID09ICZrRWZmZWN0VXVpZHNbM10pOworfQorCitjb25zdGV4cHIgaW50IGtQcmVzZXRzW10gPSB7CisgICAgICAgIFJFVkVSQl9QUkVTRVRfTk9ORSwgICAgICBSRVZFUkJfUFJFU0VUX1NNQUxMUk9PTSwgIFJFVkVSQl9QUkVTRVRfTUVESVVNUk9PTSwKKyAgICAgICAgUkVWRVJCX1BSRVNFVF9MQVJHRVJPT00sIFJFVkVSQl9QUkVTRVRfTUVESVVNSEFMTCwgUkVWRVJCX1BSRVNFVF9MQVJHRUhBTEwsCisgICAgICAgIFJFVkVSQl9QUkVTRVRfUExBVEUsCit9OworCitjb25zdGV4cHIgc2l6ZV90IGtOdW1QcmVzZXRzID0gc3RkOjpzaXplKGtQcmVzZXRzKTsKKwordHlwZWRlZiBzdGQ6OnR1cGxlPGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQ+IFNpbmdsZUVmZmVjdFRlc3RQYXJhbTsKK2NsYXNzIFNpbmdsZUVmZmVjdFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPFNpbmdsZUVmZmVjdFRlc3RQYXJhbT4geworICBwdWJsaWM6CisgICAgU2luZ2xlRWZmZWN0VGVzdCgpCisgICAgICAgIDogbVNhbXBsZVJhdGUoRWZmZWN0VGVzdEhlbHBlcjo6a1NhbXBsZVJhdGVzW3N0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpXSksCisgICAgICAgICAgbUZyYW1lQ291bnQoRWZmZWN0VGVzdEhlbHBlcjo6a0ZyYW1lQ291bnRzW3N0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpXSksCisgICAgICAgICAgbUxvb3BDb3VudChFZmZlY3RUZXN0SGVscGVyOjprTG9vcENvdW50c1tzdGQ6OmdldDwzPihHZXRQYXJhbSgpKV0pLAorICAgICAgICAgIG1Ub3RhbEZyYW1lQ291bnQobUZyYW1lQ291bnQgKiBtTG9vcENvdW50KSwKKyAgICAgICAgICBtVXVpZCgma0VmZmVjdFV1aWRzW3N0ZDo6Z2V0PDQ+KEdldFBhcmFtKCkpXSksCisgICAgICAgICAgbUluQ2hNYXNrKGlzQXV4TW9kZShtVXVpZCkgPyBBVURJT19DSEFOTkVMX09VVF9NT05PCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBFZmZlY3RUZXN0SGVscGVyOjprQ2hNYXNrc1tzdGQ6OmdldDwwPihHZXRQYXJhbSgpKV0pLAorICAgICAgICAgIG1JbkNoYW5uZWxDb3VudChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUluQ2hNYXNrKSksCisgICAgICAgICAgbU91dENoTWFzayhFZmZlY3RUZXN0SGVscGVyOjprQ2hNYXNrc1tzdGQ6OmdldDwwPihHZXRQYXJhbSgpKV0pLAorICAgICAgICAgIG1PdXRDaGFubmVsQ291bnQoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1PdXRDaE1hc2spKSwKKyAgICAgICAgICBtUHJlc2V0KGtQcmVzZXRzW3N0ZDo6Z2V0PDU+KEdldFBhcmFtKCkpXSkge30KKworICAgIGNvbnN0IHNpemVfdCBtU2FtcGxlUmF0ZTsKKyAgICBjb25zdCBzaXplX3QgbUZyYW1lQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90IG1Mb29wQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90IG1Ub3RhbEZyYW1lQ291bnQ7CisgICAgY29uc3QgZWZmZWN0X3V1aWRfdCogbVV1aWQ7CisgICAgY29uc3Qgc2l6ZV90IG1JbkNoTWFzazsKKyAgICBjb25zdCBzaXplX3QgbUluQ2hhbm5lbENvdW50OworICAgIGNvbnN0IHNpemVfdCBtT3V0Q2hNYXNrOworICAgIGNvbnN0IHNpemVfdCBtT3V0Q2hhbm5lbENvdW50OworICAgIGNvbnN0IHNpemVfdCBtUHJlc2V0OworfTsKKworLy8gVGVzdHMgYXBwbHlpbmcgYSBzaW5nbGUgZWZmZWN0CitURVNUX1AoU2luZ2xlRWZmZWN0VGVzdCwgU2ltcGxlUHJvY2VzcykgeworICAgIFNDT1BFRF9UUkFDRSh0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgIm91dENoTWFzazogIiA8PCBtT3V0Q2hNYXNrIDw8ICIgc2FtcGxlUmF0ZTogIiA8PCBtU2FtcGxlUmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmcmFtZUNvdW50OiAiIDw8IG1GcmFtZUNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGxvb3BDb3VudDogIiA8PCBtTG9vcENvdW50IDw8ICIgcHJlc2V0OiAiIDw8IG1QcmVzZXQpOworCisgICAgRWZmZWN0VGVzdEhlbHBlciBlZmZlY3QobVV1aWQsIG1JbkNoTWFzaywgbU91dENoTWFzaywgbVNhbXBsZVJhdGUsIG1GcmFtZUNvdW50LCBtTG9vcENvdW50KTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGVmZmVjdC5jcmVhdGVFZmZlY3QoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZWZmZWN0LnNldENvbmZpZygpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShlZmZlY3Quc2V0UGFyYW0oUkVWRVJCX1BBUkFNX1BSRVNFVCwgbVByZXNldCkpOworCisgICAgLy8gSW5pdGlhbGl6ZSBpbnB1dCBidWZmZXIgd2l0aCBkZXRlcm1pbmlzdGljIHBzZXVkby1yYW5kb20gdmFsdWVzCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGlucHV0KG1Ub3RhbEZyYW1lQ291bnQgKiBtSW5DaGFubmVsQ291bnQpOworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBvdXRwdXQobVRvdGFsRnJhbWVDb3VudCAqIG1PdXRDaGFubmVsQ291bnQpOworICAgIHN0ZDo6bWluc3RkX3JhbmQgZ2VuKG1PdXRDaE1hc2spOworICAgIHN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjw+IGRpcygtMS4wZiwgMS4wZik7CisgICAgZm9yIChhdXRvJiBpbiA6IGlucHV0KSB7CisgICAgICAgIGluID0gZGlzKGdlbik7CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGVmZmVjdC5wcm9jZXNzKGlucHV0LmRhdGEoKSwgb3V0cHV0LmRhdGEoKSkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGVmZmVjdC5yZWxlYXNlRWZmZWN0KCkpOworfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIEVmZmVjdFJldmVyYlRlc3RBbGwsIFNpbmdsZUVmZmVjdFRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6Q29tYmluZSg6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpRWZmZWN0VGVzdEhlbHBlcjo6a051bUNoTWFza3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KUVmZmVjdFRlc3RIZWxwZXI6OmtOdW1TYW1wbGVSYXRlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpRWZmZWN0VGVzdEhlbHBlcjo6a051bUZyYW1lQ291bnRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClFZmZlY3RUZXN0SGVscGVyOjprTnVtTG9vcENvdW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpa051bUVmZmVjdFV1aWRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClrTnVtUHJlc2V0cykpKTsKKwordHlwZWRlZiBzdGQ6OnR1cGxlPGludCwgaW50LCBpbnQsIGludCwgaW50PiBTaW5nbGVFZmZlY3RDb21wYXJpc29uVGVzdFBhcmFtOworY2xhc3MgU2luZ2xlRWZmZWN0Q29tcGFyaXNvblRlc3QKKyAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08U2luZ2xlRWZmZWN0Q29tcGFyaXNvblRlc3RQYXJhbT4geworICBwdWJsaWM6CisgICAgU2luZ2xlRWZmZWN0Q29tcGFyaXNvblRlc3QoKQorICAgICAgICA6IG1TYW1wbGVSYXRlKEVmZmVjdFRlc3RIZWxwZXI6OmtTYW1wbGVSYXRlc1tzdGQ6OmdldDwwPihHZXRQYXJhbSgpKV0pLAorICAgICAgICAgIG1GcmFtZUNvdW50KEVmZmVjdFRlc3RIZWxwZXI6OmtGcmFtZUNvdW50c1tzdGQ6OmdldDwxPihHZXRQYXJhbSgpKV0pLAorICAgICAgICAgIG1Mb29wQ291bnQoRWZmZWN0VGVzdEhlbHBlcjo6a0xvb3BDb3VudHNbc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSldKSwKKyAgICAgICAgICBtVG90YWxGcmFtZUNvdW50KG1GcmFtZUNvdW50ICogbUxvb3BDb3VudCksCisgICAgICAgICAgbVV1aWQoJmtFZmZlY3RVdWlkc1tzdGQ6OmdldDwzPihHZXRQYXJhbSgpKV0pLAorICAgICAgICAgIG1QcmVzZXQoa1ByZXNldHNbc3RkOjpnZXQ8ND4oR2V0UGFyYW0oKSldKSB7fQorCisgICAgY29uc3Qgc2l6ZV90IG1TYW1wbGVSYXRlOworICAgIGNvbnN0IHNpemVfdCBtRnJhbWVDb3VudDsKKyAgICBjb25zdCBzaXplX3QgbUxvb3BDb3VudDsKKyAgICBjb25zdCBzaXplX3QgbVRvdGFsRnJhbWVDb3VudDsKKyAgICBjb25zdCBlZmZlY3RfdXVpZF90KiBtVXVpZDsKKyAgICBjb25zdCBzaXplX3QgbVByZXNldDsKK307CisKKy8vIENvbXBhcmVzIGZpcnN0IHR3byBjaGFubmVscyBpbiBtdWx0aS1jaGFubmVsIG91dHB1dCB0byBzdGVyZW8gb3V0cHV0IHdoZW4gc2FtZSBlZmZlY3QgaXMgYXBwbGllZAorVEVTVF9QKFNpbmdsZUVmZmVjdENvbXBhcmlzb25UZXN0LCBTaW1wbGVQcm9jZXNzKSB7CisgICAgU0NPUEVEX1RSQUNFKHRlc3Rpbmc6Ok1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICA8PCAiIHNhbXBsZVJhdGU6ICIgPDwgbVNhbXBsZVJhdGUgPDwgIiBmcmFtZUNvdW50OiAiIDw8IG1GcmFtZUNvdW50CisgICAgICAgICAgICAgICAgIDw8ICIgbG9vcENvdW50OiAiIDw8IG1Mb29wQ291bnQgPDwgIiBwcmVzZXQ6ICIgPDwgbVByZXNldCk7CisKKyAgICAvLyBJbml0aWFsaXplIG1vbm8gaW5wdXQgYnVmZmVyIHdpdGggZGV0ZXJtaW5pc3RpYyBwc2V1ZG8tcmFuZG9tIHZhbHVlcworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBtb25vSW5wdXQobVRvdGFsRnJhbWVDb3VudCk7CisKKyAgICBzdGQ6Om1pbnN0ZF9yYW5kIGdlbihtU2FtcGxlUmF0ZSk7CisgICAgc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPD4gZGlzKC0xLjBmLCAxLjBmKTsKKyAgICBmb3IgKGF1dG8mIGluIDogbW9ub0lucHV0KSB7CisgICAgICAgIGluID0gZGlzKGdlbik7CisgICAgfQorCisgICAgLy8gR2VuZXJhdGUgc3RlcmVvIGJ5IHJlcGVhdGluZyBtb25vIGNoYW5uZWwgZGF0YQorICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBzdGVyZW9JbnB1dChtVG90YWxGcmFtZUNvdW50ICogRkNDXzIpOworICAgIGFkanVzdF9jaGFubmVscyhtb25vSW5wdXQuZGF0YSgpLCBGQ0NfMSwgc3RlcmVvSW5wdXQuZGF0YSgpLCBGQ0NfMiwgc2l6ZW9mKGZsb2F0KSwKKyAgICAgICAgICAgICAgICAgICAgbVRvdGFsRnJhbWVDb3VudCAqIHNpemVvZihmbG9hdCkgKiBGQ0NfMSk7CisKKyAgICAvLyBBcHBseSBlZmZlY3Qgb24gc3RlcmVvIGNoYW5uZWxzCisgICAgRWZmZWN0VGVzdEhlbHBlciBzdGVyZW9FZmZlY3QoCisgICAgICAgICAgICBtVXVpZCwgaXNBdXhNb2RlKG1VdWlkKSA/IEFVRElPX0NIQU5ORUxfT1VUX01PTk8gOiBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCisgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbUxvb3BDb3VudCk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzdGVyZW9FZmZlY3QuY3JlYXRlRWZmZWN0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHN0ZXJlb0VmZmVjdC5zZXRDb25maWcoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoc3RlcmVvRWZmZWN0LnNldFBhcmFtKFJFVkVSQl9QQVJBTV9QUkVTRVQsIG1QcmVzZXQpKTsKKworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBzdGVyZW9PdXRwdXQobVRvdGFsRnJhbWVDb3VudCAqIEZDQ18yKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzdGVyZW9FZmZlY3QucHJvY2VzcygKKyAgICAgICAgICAgIChpc0F1eE1vZGUobVV1aWQpID8gbW9ub0lucHV0LmRhdGEoKSA6IHN0ZXJlb0lucHV0LmRhdGEoKSksIHN0ZXJlb091dHB1dC5kYXRhKCkpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzdGVyZW9FZmZlY3QucmVsZWFzZUVmZmVjdCgpKTsKKworICAgIC8vIEF2ZXJhZ2Ugb2YgYm90aCBjaGFubmVscyBkYXRhIGlzIHN0b3JlZCBmb3IgbW9ubyBjb21wYXJpc29uCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG1vbm9PdXRwdXQobVRvdGFsRnJhbWVDb3VudCk7CisgICAgRnJvbTJpVG9Nb25vX0Zsb2F0KChjb25zdCBmbG9hdCopc3RlcmVvT3V0cHV0LmRhdGEoKSwgbW9ub091dHB1dC5kYXRhKCksIG1Ub3RhbEZyYW1lQ291bnQpOworCisgICAgLy8gQ29udmVydCBzdGVyZW8gZmxvYXQgZGF0YSB0byBzdGVyZW8gaW50MTZfdCB0byBiZSB1c2VkIGFzIHJlZmVyZW5jZQorICAgIHN0ZDo6dmVjdG9yPGludDE2X3Q+IHN0ZXJlb1JlZkkxNihtVG90YWxGcmFtZUNvdW50ICogRkNDXzIpOworICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChzdGVyZW9SZWZJMTYuZGF0YSgpLCBzdGVyZW9PdXRwdXQuZGF0YSgpLCBtVG90YWxGcmFtZUNvdW50ICogRkNDXzIpOworCisgICAgLy8gbW9ubyBpbnQxNl90IHRvIGJlIHVzZWQgYXMgcmVmZXJuZWNlIGZvciBtb25vIGNvbXBhcmlzb24KKyAgICBzdGQ6OnZlY3RvcjxpbnQxNl90PiBtb25vUmVmSTE2KG1Ub3RhbEZyYW1lQ291bnQpOworICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChtb25vUmVmSTE2LmRhdGEoKSwgbW9ub091dHB1dC5kYXRhKCksIG1Ub3RhbEZyYW1lQ291bnQpOworCisgICAgZm9yIChzaXplX3Qgb3V0Q2hNYXNrIDogRWZmZWN0VGVzdEhlbHBlcjo6a0NoTWFza3MpIHsKKyAgICAgICAgc2l6ZV90IG91dENoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhvdXRDaE1hc2spOworICAgICAgICBzaXplX3QgaW5DaE1hc2sgPSBpc0F1eE1vZGUobVV1aWQpID8gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyA6IG91dENoTWFzazsKKworICAgICAgICBFZmZlY3RUZXN0SGVscGVyIHRlc3RFZmZlY3QobVV1aWQsIGluQ2hNYXNrLCBvdXRDaE1hc2ssIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb29wQ291bnQpOworCisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHRlc3RFZmZlY3QuY3JlYXRlRWZmZWN0KCkpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh0ZXN0RWZmZWN0LnNldENvbmZpZygpKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodGVzdEVmZmVjdC5zZXRQYXJhbShSRVZFUkJfUEFSQU1fUFJFU0VULCBtUHJlc2V0KSk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHRlc3RJbnB1dChtVG90YWxGcmFtZUNvdW50ICogb3V0Q2hhbm5lbENvdW50KTsKKworICAgICAgICAvLyBSZXBlYXQgbW9ubyBjaGFubmVsIGRhdGEgdG8gYWxsIHRoZSBjaGFubmVscworICAgICAgICAvLyBhZGp1c3RfY2hhbm5lbHMoKSB6ZXJvIGZpbGxzIGNoYW5uZWxzID4gMiwgaGVuY2UgY2FuJ3QgYmUgdXNlZCBoZXJlCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRvdGFsRnJhbWVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBhdXRvKiBmcCA9ICZ0ZXN0SW5wdXRbaSAqIG91dENoYW5uZWxDb3VudF07CisgICAgICAgICAgICBzdGQ6OmZpbGwoZnAsIGZwICsgb3V0Q2hhbm5lbENvdW50LCBtb25vSW5wdXRbaV0pOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHRlc3RPdXRwdXQobVRvdGFsRnJhbWVDb3VudCAqIG91dENoYW5uZWxDb3VudCk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHRlc3RFZmZlY3QucHJvY2VzcygKKyAgICAgICAgICAgICAgICAoaXNBdXhNb2RlKG1VdWlkKSA/IG1vbm9JbnB1dC5kYXRhKCkgOiB0ZXN0SW5wdXQuZGF0YSgpKSwgdGVzdE91dHB1dC5kYXRhKCkpKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodGVzdEVmZmVjdC5yZWxlYXNlRWZmZWN0KCkpOworCisgICAgICAgIGlmIChvdXRDaGFubmVsQ291bnQgPT0gRkNDXzEpIHsKKyAgICAgICAgICAgIC8vIENvbnZlcnQgdGhlIHRlc3QgZGF0YSB0byBpbnQxNl90CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQxNl90PiBtb25vVGVzdEkxNihtVG90YWxGcmFtZUNvdW50KTsKKyAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChtb25vVGVzdEkxNi5kYXRhKCksIHRlc3RPdXRwdXQuZGF0YSgpLCBtVG90YWxGcmFtZUNvdW50KTsKKworICAgICAgICAgICAgQVNTRVJUX0VRKDAsIG1lbWNtcChtb25vUmVmSTE2LmRhdGEoKSwgbW9ub1Rlc3RJMTYuZGF0YSgpLCBtVG90YWxGcmFtZUNvdW50ICogRkNDXzIpKQorICAgICAgICAgICAgICAgICAgICA8PCAiTW9ubyBjaGFubmVsIGRvIG5vdCBtYXRjaCB3aXRoIHJlZmVyZW5jZSBvdXRwdXQgXG4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRXh0cmFjdCBmaXJzdCB0d28gY2hhbm5lbHMKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBzdGVyZW9UZXN0T3V0cHV0KG1Ub3RhbEZyYW1lQ291bnQgKiBGQ0NfMik7CisgICAgICAgICAgICBhZGp1c3RfY2hhbm5lbHModGVzdE91dHB1dC5kYXRhKCksIG91dENoYW5uZWxDb3VudCwgc3RlcmVvVGVzdE91dHB1dC5kYXRhKCksIEZDQ18yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmbG9hdCksIG1Ub3RhbEZyYW1lQ291bnQgKiBzaXplb2YoZmxvYXQpICogb3V0Q2hhbm5lbENvdW50KTsKKworICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgdGVzdCBkYXRhIHRvIGludDE2X3QKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDE2X3Q+IHN0ZXJlb1Rlc3RJMTYobVRvdGFsRnJhbWVDb3VudCAqIEZDQ18yKTsKKyAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChzdGVyZW9UZXN0STE2LmRhdGEoKSwgc3RlcmVvVGVzdE91dHB1dC5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdGFsRnJhbWVDb3VudCAqIEZDQ18yKTsKKworICAgICAgICAgICAgQVNTRVJUX0VRKDAsCisgICAgICAgICAgICAgICAgICAgICAgbWVtY21wKHN0ZXJlb1JlZkkxNi5kYXRhKCksIHN0ZXJlb1Rlc3RJMTYuZGF0YSgpLCBtVG90YWxGcmFtZUNvdW50ICogRkNDXzIpKQorICAgICAgICAgICAgICAgICAgICA8PCAiRmlyc3QgdHdvIGNoYW5uZWxzIGRvIG5vdCBtYXRjaCB3aXRoIHN0ZXJlbyBvdXRwdXQgXG4iOworICAgICAgICB9CisgICAgfQorfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIEVmZmVjdFJldmVyYlRlc3RBbGwsIFNpbmdsZUVmZmVjdENvbXBhcmlzb25UZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OkNvbWJpbmUoOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KUVmZmVjdFRlc3RIZWxwZXI6OmtOdW1TYW1wbGVSYXRlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpRWZmZWN0VGVzdEhlbHBlcjo6a051bUZyYW1lQ291bnRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClFZmZlY3RUZXN0SGVscGVyOjprTnVtTG9vcENvdW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpa051bUVmZmVjdFV1aWRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClrTnVtUHJlc2V0cykpKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICBBTE9HVigiVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvRWZmZWN0VGVzdEhlbHBlci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9FZmZlY3RUZXN0SGVscGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjVjMTVhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvRWZmZWN0VGVzdEhlbHBlci5jcHAKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkVmZmVjdFRlc3RIZWxwZXIuaCIKK2V4dGVybiBhdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3ZvaWQgRWZmZWN0VGVzdEhlbHBlcjo6Y3JlYXRlRWZmZWN0KCkgeworICAgIGludCBzdGF0dXMgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTS5jcmVhdGVfZWZmZWN0KG1VdWlkLCAxLCAxLCAmbUVmZmVjdEhhbmRsZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgImNyZWF0ZV9lZmZlY3QgcmV0dXJuZWQgYW4gZXJyb3IgIiA8PCBzdGF0dXM7Cit9CisKK3ZvaWQgRWZmZWN0VGVzdEhlbHBlcjo6cmVsZWFzZUVmZmVjdCgpIHsKKyAgICBpbnQgc3RhdHVzID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0ucmVsZWFzZV9lZmZlY3QobUVmZmVjdEhhbmRsZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgInJlbGVhc2VfZWZmZWN0IHJldHVybmVkIGFuIGVycm9yICIgPDwgc3RhdHVzOworfQorCit2b2lkIEVmZmVjdFRlc3RIZWxwZXI6OnNldENvbmZpZygpIHsKKyAgICBlZmZlY3RfY29uZmlnX3QgY29uZmlne307CisgICAgY29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gbVNhbXBsZVJhdGU7CisgICAgY29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gbUluQ2hNYXNrOworICAgIGNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBtT3V0Q2hNYXNrOworICAgIGNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBjb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisKKyAgICBpbnQgcmVwbHkgPSAwOworICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihyZXBseSk7CisgICAgaW50IHN0YXR1cyA9ICgqbUVmZmVjdEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAtPmNvbW1hbmQobUVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfQ09ORklHLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAic2V0X2NvbmZpZyByZXR1cm5lZCBhbiBlcnJvciAiIDw8IHN0YXR1czsKKyAgICBBU1NFUlRfRVEocmVwbHksIDApIDw8ICJzZXRfY29uZmlnIHJlcGx5IG5vbiB6ZXJvICIgPDwgcmVwbHk7CisKKyAgICBzdGF0dXMgPSAoKm1FZmZlY3RIYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAtPmNvbW1hbmQobUVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9FTkFCTEUsIDAsIG51bGxwdHIsICZyZXBseVNpemUsICZyZXBseSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgImNtZF9lbmFibGUgcmV0dXJuZWQgYW4gZXJyb3IgIiA8PCBzdGF0dXM7CisgICAgQVNTRVJUX0VRKHJlcGx5LCAwKSA8PCAiY21kX2VuYWJsZSByZXBseSBub24gemVybyAiIDw8IHJlcGx5OworfQorCit2b2lkIEVmZmVjdFRlc3RIZWxwZXI6OnNldFBhcmFtKHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IHZhbHVlKSB7CisgICAgaW50IHJlcGx5ID0gMDsKKyAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAgIHVpbnQzMl90IHBhcmFtRGF0YVsyXSA9IHt0eXBlLCB2YWx1ZX07CisgICAgYXV0byBlZmZlY3RQYXJhbSA9IG5ldyBlZmZlY3RfcGFyYW1fdFtzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKHBhcmFtRGF0YSldOworICAgIG1lbWNweSgmZWZmZWN0UGFyYW0tPmRhdGFbMF0sICZwYXJhbURhdGFbMF0sIHNpemVvZihwYXJhbURhdGEpKTsKKyAgICBlZmZlY3RQYXJhbS0+cHNpemUgPSBzaXplb2YocGFyYW1EYXRhWzBdKTsKKyAgICBlZmZlY3RQYXJhbS0+dnNpemUgPSBzaXplb2YocGFyYW1EYXRhWzFdKTsKKyAgICBpbnQgc3RhdHVzID0gKCptRWZmZWN0SGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgIC0+Y29tbWFuZChtRWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihwYXJhbURhdGEpLCBlZmZlY3RQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICBkZWxldGVbXSBlZmZlY3RQYXJhbTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAic2V0X3BhcmFtIHJldHVybmVkIGFuIGVycm9yICIgPDwgc3RhdHVzOworICAgIEFTU0VSVF9FUShyZXBseSwgMCkgPDwgInNldF9wYXJhbSByZXBseSBub24gemVybyAiIDw8IHJlcGx5OworfQorCit2b2lkIEVmZmVjdFRlc3RIZWxwZXI6OnByb2Nlc3MoZmxvYXQqIGlucHV0LCBmbG9hdCogb3V0cHV0KSB7CisgICAgYXVkaW9fYnVmZmVyX3QgaW5CdWZmZXIgPSB7LmZyYW1lQ291bnQgPSBtRnJhbWVDb3VudCwgLmYzMiA9IGlucHV0fTsKKyAgICBhdWRpb19idWZmZXJfdCBvdXRCdWZmZXIgPSB7LmZyYW1lQ291bnQgPSBtRnJhbWVDb3VudCwgLmYzMiA9IG91dHB1dH07CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTG9vcENvdW50OyBpKyspIHsKKyAgICAgICAgaW50IHN0YXR1cyA9ICgqbUVmZmVjdEhhbmRsZSktPnByb2Nlc3MobUVmZmVjdEhhbmRsZSwgJmluQnVmZmVyLCAmb3V0QnVmZmVyKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgInByb2Nlc3MgcmV0dXJuZWQgYW4gZXJyb3IgIiA8PCBzdGF0dXM7CisKKyAgICAgICAgaW5CdWZmZXIuZjMyICs9IG1GcmFtZUNvdW50ICogbUluQ2hhbm5lbENvdW50OworICAgICAgICBvdXRCdWZmZXIuZjMyICs9IG1GcmFtZUNvdW50ICogbU91dENoYW5uZWxDb3VudDsKKyAgICB9Cit9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvRWZmZWN0VGVzdEhlbHBlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvRWZmZWN0VGVzdEhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NTRkNDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9FZmZlY3RUZXN0SGVscGVyLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPHJhbmRvbT4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIGZsb2F0IGNvbXB1dGVTbnIoY29uc3QgVCogcmVmLCBjb25zdCBUKiB0c3QsIHNpemVfdCBjb3VudCkgeworICAgIGRvdWJsZSBzaWduYWx7fTsKKyAgICBkb3VibGUgbm9pc2V7fTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICBjb25zdCBkb3VibGUgdmFsdWUocmVmW2ldKTsKKyAgICAgICAgY29uc3QgZG91YmxlIGRpZmYodHN0W2ldIC0gdmFsdWUpOworICAgICAgICBzaWduYWwgKz0gdmFsdWUgKiB2YWx1ZTsKKyAgICAgICAgbm9pc2UgKz0gZGlmZiAqIGRpZmY7CisgICAgfQorICAgIC8vIEluaXRpYWxpemVkIHRvIGxhcmdlIHZhbHVlIHRvIGhhbmRsZQorICAgIC8vIGNhc2VzIHdoZXJlIHJlZiBhbmQgdHN0IG1hdGNoIGV4YWN0bHkKKyAgICBmbG9hdCBzbnIgPSBGTFRfTUFYOworICAgIGlmIChzaWduYWwgPiAwLjBmICYmIG5vaXNlID4gMC4wZikgeworICAgICAgICBzbnIgPSAxMC5mICogbG9nKHNpZ25hbCAvIG5vaXNlKTsKKyAgICB9CisgICAgcmV0dXJuIHNucjsKK30KKworY2xhc3MgRWZmZWN0VGVzdEhlbHBlciB7CisgIHB1YmxpYzoKKyAgICBFZmZlY3RUZXN0SGVscGVyKGNvbnN0IGVmZmVjdF91dWlkX3QqIHV1aWQsIHNpemVfdCBpbkNoTWFzaywgc2l6ZV90IG91dENoTWFzaywKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzYW1wbGVSYXRlLCBzaXplX3QgZnJhbWVDb3VudCwgc2l6ZV90IGxvb3BDb3VudCkKKyAgICAgICAgOiBtVXVpZCh1dWlkKSwKKyAgICAgICAgICBtSW5DaE1hc2soaW5DaE1hc2spLAorICAgICAgICAgIG1JbkNoYW5uZWxDb3VudChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUluQ2hNYXNrKSksCisgICAgICAgICAgbU91dENoTWFzayhvdXRDaE1hc2spLAorICAgICAgICAgIG1PdXRDaGFubmVsQ291bnQoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1PdXRDaE1hc2spKSwKKyAgICAgICAgICBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKSwKKyAgICAgICAgICBtRnJhbWVDb3VudChmcmFtZUNvdW50KSwKKyAgICAgICAgICBtTG9vcENvdW50KGxvb3BDb3VudCkge30KKyAgICB2b2lkIGNyZWF0ZUVmZmVjdCgpOworICAgIHZvaWQgcmVsZWFzZUVmZmVjdCgpOworICAgIHZvaWQgc2V0Q29uZmlnKCk7CisgICAgdm9pZCBzZXRQYXJhbSh1aW50MzJfdCB0eXBlLCB1aW50MzJfdCB2YWwpOworICAgIHZvaWQgcHJvY2VzcyhmbG9hdCogaW5wdXQsIGZsb2F0KiBvdXRwdXQpOworCisgICAgLy8gQ29ycmVzcG9uZHMgdG8gU05SIGZvciAxIGJpdCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGludDE2X3Qgc2lnbmFscworICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQga1NOUlRocmVzaG9sZCA9IDkwLjMwODk5ODsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgYXVkaW9fY2hhbm5lbF9tYXNrX3Qga0NoTWFza3NbXSA9IHsKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX01PTk8sICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDEsICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDBQT0lOVDIsCisgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9RVUFELCAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0ssCisgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREUsICAgICBBVURJT19DSEFOTkVMX09VVF9TVVJST1VORCwKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS180LCAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDFQT0lOVDIsCisgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyLCBBVURJT19DSEFOTkVMX09VVF9QRU5UQSwKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS181LCAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDFQT0lOVDIsCisgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCAgICAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0ssCisgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREUsICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNiwKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzZQT0lOVDEsICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS183LAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMVBPSU5UMiwgQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSwKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS184LCAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS185LAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEwLCAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzExLAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEyLCAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEzLAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE0LCAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE1LAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE2LCAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE3LAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE4LCAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE5LAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIwLCAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIxLAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIyLCAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIzLAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzI0LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTnVtQ2hNYXNrcyA9IHN0ZDo6c2l6ZShrQ2hNYXNrcyk7CisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrU2FtcGxlUmF0ZXNbXSA9IHs4MDAwLCAgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsICAyNDAwMCwgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsIDQ4MDAwLCA4ODIwMCwgOTYwMDAsIDE3NjQwMCwgMTkyMDAwfTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtOdW1TYW1wbGVSYXRlcyA9IHN0ZDo6c2l6ZShrU2FtcGxlUmF0ZXMpOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0ZyYW1lQ291bnRzW10gPSB7NCwgMjA0OH07CisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTnVtRnJhbWVDb3VudHMgPSBzdGQ6OnNpemUoa0ZyYW1lQ291bnRzKTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtMb29wQ291bnRzW10gPSB7MSwgNH07CisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTnVtTG9vcENvdW50cyA9IHN0ZDo6c2l6ZShrTG9vcENvdW50cyk7CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBlZmZlY3RfdXVpZF90KiBtVXVpZDsKKyAgICBjb25zdCBzaXplX3QgbUluQ2hNYXNrOworICAgIGNvbnN0IHNpemVfdCBtSW5DaGFubmVsQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90IG1PdXRDaE1hc2s7CisgICAgY29uc3Qgc2l6ZV90IG1PdXRDaGFubmVsQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90IG1TYW1wbGVSYXRlOworICAgIGNvbnN0IHNpemVfdCBtRnJhbWVDb3VudDsKKyAgICBjb25zdCBzaXplX3QgbUxvb3BDb3VudDsKKyAgICBlZmZlY3RfaGFuZGxlX3QgbUVmZmVjdEhhbmRsZXt9OworfTsKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaAppbmRleCBhOTdhY2M5Li43NTcxYTI0IDEwMDc1NQotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKQEAgLTIzLDcgKzIzLDcgQEAKIGVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCiBlY2hvICJ0ZXN0aW5nIGx2bSIKIGFkYiBzaGVsbCBta2RpciAtcCAkdGVzdGRpcgotYWRiIHB1c2ggJEFORFJPSURfQlVJTERfVE9QL2N0cy90ZXN0cy90ZXN0cy9tZWRpYS9yZXMvcmF3L3NpbmVzd2VlcHJhdy5yYXcgJHRlc3RkaXIKK2FkYiBwdXNoICRBTkRST0lEX0JVSUxEX1RPUC9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvcmVzL3Jhdy9zaW5lc3dlZXByYXcucmF3ICR0ZXN0ZGlyCiBhZGIgcHVzaCAkT1VUL3Rlc3RjYXNlcy9zbnIvYXJtNjQvc25yICR0ZXN0ZGlyCiAKIEVfVkFMPTEKQEAgLTUzLDE2ICs1MywxNiBAQAogZmxhZ3NfYXJyPSgKICAgICAiLWNzRSIKICAgICAiLWVxRSIKLSAgICAiLXRFIgotICAgICItY3NFIC10RSAtZXFFIgorICAgICItdEUgLXRyZWJsZUx2bDoxNSIKKyAgICAiLWNzRSAtdEUgLXRyZWJsZUx2bDoxNSAtZXFFIgogICAgICItYkUgLU0iCi0gICAgIi1jc0UgLXRFIgotICAgICItY3NFIC1lcUUiICItdEUgLWVxRSIKLSAgICAiLWNzRSAtdEUgLWJFIC1NIC1lcUUiCi0gICAgIi10RSAtZXFFIC12Y0JhbDo5NiAtTSIKLSAgICAiLXRFIC1lcUUgLXZjQmFsOi05NiAtTSIKLSAgICAiLXRFIC1lcUUgLXZjQmFsOjAgLU0iCi0gICAgIi10RSAtZXFFIC1iRSAtdmNCYWw6MzAgLU0iCisgICAgIi1jc0UgLXRFIC10cmVibGVMdmw6MTUiCisgICAgIi1jc0UgLWVxRSIgIi10RSAtdHJlYmxlTHZsOjE1IC1lcUUiCisgICAgIi1jc0UgLXRFIC10cmVibGVMdmw6MTUgLWJFIC1NIC1lcUUiCisgICAgIi10RSAtdHJlYmxlTHZsOjE1IC1lcUUgLXZjQmFsOjk2IC1NIgorICAgICItdEUgLXRyZWJsZUx2bDoxNSAtZXFFIC12Y0JhbDotOTYgLU0iCisgICAgIi10RSAtdHJlYmxlTHZsOjE1IC1lcUUgLXZjQmFsOjAgLU0iCisgICAgIi10RSAtdHJlYmxlTHZsOjE1IC1lcUUgLWJFIC12Y0JhbDozMCAtTSIKICkKIAogZnNfYXJyPSgKQEAgLTkxLDcgKzkxLDcgQEAKICAgICBkbwogICAgICAgICBmb3IgZnMgaW4gJHtmc19hcnJbKl19CiAgICAgICAgIGRvCi0gICAgICAgICAgICBmb3IgY2hNYXNrIGluIHswLi4yMn0KKyAgICAgICAgICAgIGZvciBjaE1hc2sgaW4gezAuLjM4fQogICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgICBhZGIgc2hlbGwgJHRlc3RkaXIvbHZtdGVzdCAtaTokdGVzdGRpci9zaW5lc3dlZXByYXcucmF3IFwKICAgICAgICAgICAgICAgICAgICAgLW86JHRlc3RkaXIvc2luZXN3ZWVwXyQoKGNoTWFzaykpXyQoKGZzKSkucmF3IC1jaE1hc2s6JGNoTWFzayAtZnM6JGZzICRmbGFncwpAQCAtMTAyLDYgKzEwMiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAoKCsrZXJyb3JfY291bnQpKQogICAgICAgICAgICAgICAgIGZpCiAKKyAgICAgICAgICAgICAgICAjIERvIG5vdCBjb21wYXJlIGNhc2VzIHdoZXJlIC12Y0JhbCBpcyBpbiBmbGFncyBhbmQgY2hNYXNrIGlzIDAgKGR1ZSB0bworICAgICAgICAgICAgICAgICMgc3RlcmVvIGNvbXB1dGF0aW9uKQorICAgICAgICAgICAgICAgIGlmIFtbICRmbGFncyA9PSAqIi12Y0JhbDoiKiBdXSAmJiBbWyAkY2hNYXNrIC1lcSAwIF1dOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZmkKIAogICAgICAgICAgICAgICAgICMgdHdvIGNoYW5uZWwgZmlsZXMgc2hvdWxkIGJlIGlkZW50aWNhbCB0byBoaWdoZXIgY2hhbm5lbAogICAgICAgICAgICAgICAgICMgY29tcHV0YXRpb24gKGZpcnN0IDIgY2hhbm5lbHMpLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0c19yZXZlcmIuc2ggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzX3JldmVyYi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MmIzNzBlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0c19yZXZlcmIuc2gKQEAgLTAsMCArMSwxMDUgQEAKKyMhL2Jpbi9iYXNoCisjCisjIHJldmVyYiB0ZXN0CisjCisKK2lmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICBleGl0IC0xCitmaQorCisjIGVuc3VyZSB3ZSBoYXZlIG1tCisuICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAorCittbSAtagorCitlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCisKK2FkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAorCisjIGxvY2F0aW9uIG9mIHRlc3QgZmlsZXMKK3Rlc3RkaXI9Ii9kYXRhL2xvY2FsL3RtcC9yZXZUZXN0IgorCitlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorZWNobyAidGVzdGluZyByZXZlcmIiCithZGIgc2hlbGwgbWtkaXIgLXAgJHRlc3RkaXIKK2FkYiBwdXNoICRBTkRST0lEX0JVSUxEX1RPUC9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvcmVzL3Jhdy9zaW5lc3dlZXByYXcucmF3ICR0ZXN0ZGlyCisKK0VfVkFMPTEKK2NtZHM9ImFkYiBwdXNoICRPVVQvdGVzdGNhc2VzL3JldmVyYl90ZXN0L2FybS9yZXZlcmJfdGVzdCAkdGVzdGRpciIKKworZnNfYXJyPSgKKyAgICA4MDAwCisgICAgMTYwMDAKKyAgICAyMjA1MAorICAgIDMyMDAwCisgICAgNDQxMDAKKyAgICA0ODAwMAorICAgIDg4MjAwCisgICAgOTYwMDAKKyAgICAxNzY0MDAKKyAgICAxOTIwMDAKKykKKworZmxhZ3NfYXJyPSgKKyAgICAiLS1NIC0tZmNoIDEiCisgICAgIi0tZmNoIDIiCispCisKKyMgcnVuIHJldmVyYiBhdCBkaWZmZXJlbnQgY29uZmlncywgc2F2aW5nIG9ubHkgdGhlIHN0ZXJlbyBjaGFubmVsCisjIHBhaXIuCitlcnJvcl9jb3VudD0wCit0ZXN0Y2FzZV9jb3VudD0wCitmb3IgY21kIGluICIke2NtZHNbQF19IgorZG8KKyAgICAkY21kCisgICAgZm9yIGZsYWdzIGluICIke2ZsYWdzX2FycltAXX0iCisgICAgZG8KKyAgICAgICAgZm9yIHByZXNldF92YWwgaW4gezAuLjZ9CisgICAgICAgIGRvCisgICAgICAgICAgICBmb3IgZnMgaW4gJHtmc19hcnJbKl19CisgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIGZvciBjaE1hc2sgaW4gezAuLjM4fQorICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgIGFkYiBzaGVsbCAkdGVzdGRpci9yZXZlcmJfdGVzdCBcCisgICAgICAgICAgICAgICAgICAgICAgICAtLWlucHV0ICR0ZXN0ZGlyL3NpbmVzd2VlcHJhdy5yYXcgXAorICAgICAgICAgICAgICAgICAgICAgICAgLS1vdXRwdXQgJHRlc3RkaXIvc2luZXN3ZWVwXyQoKGNoTWFzaykpXyQoKGZzKSkucmF3IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tY2hNYXNrICRjaE1hc2sgJGZsYWdzIC0tZnMgJGZzIC0tcHJlc2V0ICRwcmVzZXRfdmFsCisKKyAgICAgICAgICAgICAgICAgICAgc2hlbGxfcmV0PSQ/CisgICAgICAgICAgICAgICAgICAgIGlmIFsgJHNoZWxsX3JldCAtbmUgMCBdOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICJlcnJvcjogJHNoZWxsX3JldCIKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKytlcnJvcl9jb3VudCkpCisgICAgICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAgICAgaWYgW1sgIiRjaE1hc2siIC1ndCAwIF1dICYmIFtbICRmbGFncyAhPSAqIi0tZmNoIDIiKiBdXQorICAgICAgICAgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAjIHNpbmdsZSBjaGFubmVsIGZpbGVzIHNob3VsZCBiZSBpZGVudGljYWwgdG8gaGlnaGVyIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICMgY29tcHV0YXRpb24gKGZpcnN0IGNoYW5uZWwpLgorICAgICAgICAgICAgICAgICAgICAgICAgYWRiIHNoZWxsIGNtcCAkdGVzdGRpci9zaW5lc3dlZXBfMF8kKChmcykpLnJhdyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRlc3RkaXIvc2luZXN3ZWVwXyQoKGNoTWFzaykpXyQoKGZzKSkucmF3CisgICAgICAgICAgICAgICAgICAgIGVsaWYgW1sgIiRjaE1hc2siIC1ndCAxIF1dCisgICAgICAgICAgICAgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICMgdHdvIGNoYW5uZWwgZmlsZXMgc2hvdWxkIGJlIGlkZW50aWNhbCB0byBoaWdoZXIgY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICAgIyBjb21wdXRhdGlvbiAoZmlyc3QgMiBjaGFubmVscykuCisgICAgICAgICAgICAgICAgICAgICAgICBhZGIgc2hlbGwgY21wICR0ZXN0ZGlyL3NpbmVzd2VlcF8xXyQoKGZzKSkucmF3IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGVzdGRpci9zaW5lc3dlZXBfJCgoY2hNYXNrKSlfJCgoZnMpKS5yYXcKKyAgICAgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICAgICAjIGNtcCByZXR1cm5zIEVYSVRfRkFJTFVSRSBvbiBtaXNtYXRjaC4KKyAgICAgICAgICAgICAgICAgICAgc2hlbGxfcmV0PSQ/CisgICAgICAgICAgICAgICAgICAgIGlmIFsgJHNoZWxsX3JldCAtbmUgMCBdOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICJlcnJvcjogJHNoZWxsX3JldCIKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKytlcnJvcl9jb3VudCkpCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICgoKyt0ZXN0Y2FzZV9jb3VudCkpCisgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgZG9uZQorICAgICAgICBkb25lCisgICAgZG9uZQorZG9uZQorCithZGIgc2hlbGwgcm0gLXIgJHRlc3RkaXIKK2VjaG8gIiR0ZXN0Y2FzZV9jb3VudCB0ZXN0cyBwZXJmb3JtZWQiCitlY2hvICIkZXJyb3JfY291bnQgZXJyb3JzIgorZXhpdCAkZXJyb3JfY291bnQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvbHZtdGVzdC5jcHAKaW5kZXggYTRhY2U2Yy4uZTY1MjI4YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvbHZtdGVzdC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvbHZtdGVzdC5jcHAKQEAgLTMzLDE5OCArMzMsMTY1IEBACiAjZGVmaW5lIEFMT0dWViBBTE9HVgogI2Vsc2UKICNkZWZpbmUgQUxPR1ZWKGEuLi4pIFwKLSAgZG8geyAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoZmFsc2UpCisgICAgZG8geyAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoZmFsc2UpCiAjZW5kaWYKIAotI2RlZmluZSBDSEVDS19BUkcoY29uZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCEoY29uZCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQUxPR0UoIlx0TFZNX0VSUk9SIDogSW52YWxpZCBhcmd1bWVudDogIiAjY29uZCk7IFwKLSAgICAgIHJldHVybiAtRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBcCi19CisjZGVmaW5lIENIRUNLX0FSRyhjb25kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCEoY29uZCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRSgiXHRMVk1fRVJST1IgOiBJbnZhbGlkIGFyZ3VtZW50OiAiICNjb25kKTsgXAorICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQogCi0jZGVmaW5lIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKSAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX05VTExBRERSRVNTKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBBTE9HRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAibnVsbCBwb2ludGVyIHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCAgICAgICAgICBcCi0gICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX0FMSUdOTUVOVEVSUk9SKSB7ICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBBTE9HRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAiYmFkIGFsaWdubWVudCByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgICAgICAgICBcCi0gICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX0lOVkFMSUROVU1TQU1QTEVTKSB7ICAgICAgICAgICAgICAgICBcCi0gICAgICBBTE9HRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAiYmFkIG51bWJlciBvZiBzYW1wbGVzIHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCBcCi0gICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX09VVE9GUkFOR0UpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBBTE9HRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAib3V0IG9mIHJhbmdlIHJldHVybmVkIGJ5ICVzIGluICVzXG4iLCAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQorI2RlZmluZSBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYykgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX05VTExBRERSRVNTKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0UoIlx0TFZNX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIm51bGwgcG9pbnRlciByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX0FMSUdOTUVOVEVSUk9SKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0UoIlx0TFZNX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgImJhZCBhbGlnbm1lbnQgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX0lOVkFMSUROVU1TQU1QTEVTKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0UoIlx0TFZNX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgImJhZCBudW1iZXIgb2Ygc2FtcGxlcyByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgXAorICAgICAgICAgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX09VVE9GUkFOR0UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0UoIlx0TFZNX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIm91dCBvZiByYW5nZSByZXR1cm5lZCBieSAlcyBpbiAlc1xuIiwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KIAogc3RydWN0IGx2bUNvbmZpZ1BhcmFtc190IHsKLSAgaW50ICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgICAgPSA0NDEwMDsKLSAgaW50ICAgICAgICAgICAgICBuckNoYW5uZWxzICAgICAgPSAyOwotICBpbnQgICAgICAgICAgICAgIGNoTWFzayAgICAgICAgICA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgaW50ICAgICAgICAgICAgICB2Y0JhbCAgICAgICAgICAgPSAwOwotICBpbnQgICAgICAgICAgICAgIGZDaGFubmVscyAgICAgICA9IDI7Ci0gIGJvb2wgICAgICAgICAgICAgbW9ub01vZGUgICAgICAgID0gZmFsc2U7Ci0gIGludCAgICAgICAgICAgICAgYmFzc0VmZmVjdExldmVsID0gMDsKLSAgaW50ICAgICAgICAgICAgICBlcVByZXNldExldmVsICAgPSAwOwotICBpbnQgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoICAgICA9IDI1NjsKLSAgTFZNX0JFX01vZGVfZW4gICBiYXNzRW5hYmxlICAgICAgPSBMVk1fQkVfT0ZGOwotICBMVk1fVEVfTW9kZV9lbiAgIHRyZWJsZUVuYWJsZSAgICA9IExWTV9URV9PRkY7Ci0gIExWTV9FUU5CX01vZGVfZW4gZXFFbmFibGUgICAgICAgID0gTFZNX0VRTkJfT0ZGOwotICBMVk1fTW9kZV9lbiAgICAgIGNzRW5hYmxlICAgICAgICA9IExWTV9NT0RFX09GRjsKKyAgICBpbnQgc2FtcGxpbmdGcmVxID0gNDQxMDA7CisgICAgaW50IG5yQ2hhbm5lbHMgPSAyOworICAgIGludCBjaE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgaW50IHZjQmFsID0gMDsKKyAgICBpbnQgZkNoYW5uZWxzID0gMjsKKyAgICBib29sIG1vbm9Nb2RlID0gZmFsc2U7CisgICAgaW50IGJhc3NFZmZlY3RMZXZlbCA9IDA7CisgICAgaW50IGVxUHJlc2V0TGV2ZWwgPSAwOworICAgIGludCBmcmFtZUxlbmd0aCA9IDI1NjsKKyAgICBpbnQgdHJlYmxlRWZmZWN0TGV2ZWwgPSAwOworICAgIExWTV9CRV9Nb2RlX2VuIGJhc3NFbmFibGUgPSBMVk1fQkVfT0ZGOworICAgIExWTV9URV9Nb2RlX2VuIHRyZWJsZUVuYWJsZSA9IExWTV9URV9PRkY7CisgICAgTFZNX0VRTkJfTW9kZV9lbiBlcUVuYWJsZSA9IExWTV9FUU5CX09GRjsKKyAgICBMVk1fTW9kZV9lbiBjc0VuYWJsZSA9IExWTV9NT0RFX09GRjsKIH07CiAKIGNvbnN0ZXhwciBhdWRpb19jaGFubmVsX21hc2tfdCBsdm1Db25maWdDaE1hc2tbXSA9IHsKLSAgICBBVURJT19DSEFOTkVMX09VVF9NT05PLAotICAgIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKLSAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxLAotICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDBQT0lOVDIsCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCwKLSAgICBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0ssCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFLAotICAgIEFVRElPX0NIQU5ORUxfT1VUX1NVUlJPVU5ELAotICAgICgxIDw8IDQpIC0gMSwKLSAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyLAotICAgIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDBQT0lOVDIsCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEsCi0gICAgKDEgPDwgNSkgLSAxLAotICAgIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDFQT0lOVDIsCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwKLSAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0ssCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFLAotICAgICgxIDw8IDYpIC0gMSwKLSAgICBBVURJT19DSEFOTkVMX09VVF82UE9JTlQxLAotICAgICgxIDw8IDcpIC0gMSwKLSAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyLAotICAgIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEsCi0gICAgKDEgPDwgOCkgLSAxLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF9NT05PLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDEsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDBQT0lOVDIsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1FVQUQsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfQkFDSywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF9TVVJST1VORCwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzQsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDFQT0lOVDIsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDBQT0lOVDIsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1BFTlRBLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMVBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREUsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS182LAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF82UE9JTlQxLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMVBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzgsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS185LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTAsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEyLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTMsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNCwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE1LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTYsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE4LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTksCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMCwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIxLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjIsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzI0LAogfTsKIAotCiB2b2lkIHByaW50VXNhZ2UoKSB7Ci0gIHByaW50ZigiXG5Vc2FnZTogIik7Ci0gIHByaW50ZigiXG4gICAgIDxleGVjdXRhYmxlPiAtaTo8aW5wdXRfZmlsZT4gLW86PG91dF9maWxlPiBbb3B0aW9uc11cbiIpOwotICBwcmludGYoIlxud2hlcmUsIFxuICAgICA8aW5wdXRmaWxlPiAgaXMgdGhlIGlucHV0IGZpbGUgbmFtZSIpOwotICBwcmludGYoIlxuICAgICAgICAgICAgICAgICAgb24gd2hpY2ggTFZNIGVmZmVjdHMgYXJlIGFwcGxpZWQiKTsKLSAgcHJpbnRmKCJcbiAgICAgPG91dHB1dGZpbGU+IHByb2Nlc3NlZCBvdXRwdXQgZmlsZSIpOwotICBwcmludGYoIlxuICAgICBhbmQgb3B0aW9ucyBhcmUgbWVudGlvbmVkIGJlbG93Iik7Ci0gIHByaW50ZigiXG4iKTsKLSAgcHJpbnRmKCJcbiAgICAgLWhlbHAgKG9yKSAtaCIpOwotICBwcmludGYoIlxuICAgICAgICAgICBQcmludHMgdGhpcyB1c2FnZSBpbmZvcm1hdGlvbiIpOwotICBwcmludGYoIlxuIik7Ci0gIHByaW50ZigiXG4gICAgIC1jaE1hc2s6PGNoYW5uZWxfbWFzaz5cbiIpOwotICBwcmludGYoIlxuICAgICAgICAgMCAgLSBBVURJT19DSEFOTkVMX09VVF9NT05PIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAxICAtIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIpOwotICBwcmludGYoIlxuICAgICAgICAgMiAgLSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAzICAtIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDBQT0lOVDIiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgIDQgIC0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCIpOwotICBwcmludGYoIlxuICAgICAgICAgNSAgLSBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0siKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgIDYgIC0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFIik7Ci0gIHByaW50ZigiXG4gICAgICAgICA3ICAtIEFVRElPX0NIQU5ORUxfT1VUX1NVUlJPVU5EIik7Ci0gIHByaW50ZigiXG4gICAgICAgICA4ICAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDQgY2g6ICgxIDw8IDQpIC0gMSIpOwotICBwcmludGYoIlxuICAgICAgICAgOSAgLSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAxMCAtIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDBQT0lOVDIiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgIDExIC0gQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgIDEyIC0gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggbWFzayBmb3IgNSBjaDogKDEgPDwgNSkgLSAxIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAxMyAtIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDFQT0lOVDIiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgIDE0IC0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSIpOwotICBwcmludGYoIlxuICAgICAgICAgMTUgLSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0siKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgIDE2IC0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAxNyAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDYgY2g6ICgxIDw8IDYpIC0gMSIpOwotICBwcmludGYoIlxuICAgICAgICAgMTggLSBBVURJT19DSEFOTkVMX09VVF82UE9JTlQxIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAxOSAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDcgY2g6ICgxIDw8IDcpIC0gMSIpOwotICBwcmludGYoIlxuICAgICAgICAgMjAgLSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAyMSAtIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgIDIyIC0gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggbWFzayBmb3IgOCBjaDogKDEgPDwgOCkgLSAxIik7Ci0gIHByaW50ZigiXG4gICAgICAgICBkZWZhdWx0IDAiKTsKLSAgcHJpbnRmKCJcbiAgICAgLXZjQmFsOjxMZWZ0IFJpZ2h0IEJhbGFuY2UgY29udHJvbCBpbiBkQiBbLTk2IHRvIDk2IGRCXT4iKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgICAgIC12ZSB2YWx1ZXMgcmVkdWNlIFJpZ2h0IGNoYW5uZWwgd2hpbGUgK3ZlIHZhbHVlIHJlZHVjZXMgTGVmdCBjaGFubmVsIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAgICAgICAgIGRlZmF1bHQgMCIpOwotICBwcmludGYoIlxuICAgICAtZmNoOjxmaWxlX2NoYW5uZWxzPiAoMSB0aHJvdWdoIDgpXG5cbiIpOwotICBwcmludGYoIlxuICAgICAtTSIpOwotICBwcmludGYoIlxuICAgICAgICAgICBNb25vIG1vZGUgKGZvcmNlIGFsbCBpbnB1dCBhdWRpbyBjaGFubmVscyB0byBiZSBpZGVudGljYWwpIik7Ci0gIHByaW50ZigiXG4gICAgIC1iYXNzbHZsOjxlZmZlY3RfbGV2ZWw+Iik7Ci0gIHByaW50ZigiXG4gICAgICAgICAgIEEgdmFsdWUgdGhhdCByYW5nZXMgYmV0d2VlbiAlZCAtICVkIGRlZmF1bHQgMCIsIExWTV9CRV9NSU5fRUZGRUNUTEVWRUwsCi0gICAgTFZNX0JFX01BWF9FRkZFQ1RMRVZFTCk7Ci0gIHByaW50ZigiXG4iKTsKLSAgcHJpbnRmKCJcbiAgICAgLWVxUHJlc2V0OjxwcmVzZXQgVmFsdWU+Iik7Ci0gIGNvbnN0IHNpemVfdCBudW1QcmVzZXRMdmxzICA9IHN0ZDo6c2l6ZShnRXF1YWxpemVyUHJlc2V0cyk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUHJlc2V0THZsczsgKytpKSB7Ci0gICAgcHJpbnRmKCJcbiAgICAgICAgICAgJXp1IC0gJXMiLCBpLCBnRXF1YWxpemVyUHJlc2V0c1tpXS5uYW1lKTsKLSAgfQotICBwcmludGYoIlxuICAgICAgICAgICBkZWZhdWx0IC0gMCIpOwotICBwcmludGYoIlxuICAgICAtYkUgIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQiKTsKLSAgcHJpbnRmKCJcbiIpOwotICBwcmludGYoIlxuICAgICAtdEUgIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBUcmVibGUgQm9vc3QiKTsKLSAgcHJpbnRmKCJcbiIpOwotICBwcmludGYoIlxuICAgICAtY3NFICIpOwotICBwcmludGYoIlxuICAgICAgICAgICBFbmFibGUgQ29uY2VydCBTdXJyb3VuZCIpOwotICBwcmludGYoIlxuIik7Ci0gIHByaW50ZigiXG4gICAgIC1lcUUgIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBFcXVhbGl6ZXIiKTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBMdm1FZmZlY3RfZnJlZSgpCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFB1cnBvc2U6IEZyZWUgYWxsIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIEJ1bmRsZS4KLS8vCi0vLyBJbnB1dHM6Ci0vLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0Ci0vLwotLy8gT3V0cHV0czoKLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBMdm1FZmZlY3RfZnJlZShzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQpIHsKLSAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KLSAgTFZNX01lbVRhYl90IE1lbVRhYjsKLQotICAvKiBGcmVlIHRoZSBhbGdvcml0aG0gbWVtb3J5ICovCi0gIEx2bVN0YXR1cyA9IExWTV9HZXRNZW1vcnlUYWJsZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZNZW1UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7Ci0KLSAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRNZW1vcnlUYWJsZSIsICJMdm1FZmZlY3RfZnJlZSIpCi0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykgewotICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCkgewotICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2ZyZWUgLSBTVEFSVCBmcmVlaW5nICUiIFBSSXUzMgotICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCi0gICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotCi0gICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotCi0gICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9mcmVlIC0gRU5EICAgZnJlZWluZyAlIiBQUkl1MzIKLSAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAotICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKAotICAgICAgICAgICAgIlx0TFZNX0VSUk9SIDogTHZtRWZmZWN0X2ZyZWUgLSB0cnlpbmcgdG8gZnJlZSB3aXRoIE5VTEwgcG9pbnRlciAiCi0gICAgICAgICAgICAiJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcCBFUlJPUlxuIiwKLSAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotICAgICAgfQorICAgIHByaW50ZigiXG5Vc2FnZTogIik7CisgICAgcHJpbnRmKCJcbiAgICAgPGV4ZWN1dGFibGU+IC1pOjxpbnB1dF9maWxlPiAtbzo8b3V0X2ZpbGU+IFtvcHRpb25zXVxuIik7CisgICAgcHJpbnRmKCJcbndoZXJlLCBcbiAgICAgPGlucHV0ZmlsZT4gIGlzIHRoZSBpbnB1dCBmaWxlIG5hbWUiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAgICAgICAgb24gd2hpY2ggTFZNIGVmZmVjdHMgYXJlIGFwcGxpZWQiKTsKKyAgICBwcmludGYoIlxuICAgICA8b3V0cHV0ZmlsZT4gcHJvY2Vzc2VkIG91dHB1dCBmaWxlIik7CisgICAgcHJpbnRmKCJcbiAgICAgYW5kIG9wdGlvbnMgYXJlIG1lbnRpb25lZCBiZWxvdyIpOworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIlxuICAgICAtaGVscCAob3IpIC1oIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgUHJpbnRzIHRoaXMgdXNhZ2UgaW5mb3JtYXRpb24iKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCJcbiAgICAgLWNoTWFzazo8Y2hhbm5lbF9tYXNrPlxuIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgIDAgIC0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyIpOworICAgIHByaW50ZigiXG4gICAgICAgICAxICAtIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIpOworICAgIHByaW50ZigiXG4gICAgICAgICAyICAtIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDEiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMyAgLSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQwUE9JTlQyIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgIDQgIC0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCIpOworICAgIHByaW50ZigiXG4gICAgICAgICA1ICAtIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfQkFDSyIpOworICAgIHByaW50ZigiXG4gICAgICAgICA2ICAtIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERSIpOworICAgIHByaW50ZigiXG4gICAgICAgICA3ICAtIEFVRElPX0NIQU5ORUxfT1VUX1NVUlJPVU5EIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgIDggIC0gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggbWFzayBmb3IgNCBjaDogKDEgPDwgNCkgLSAxIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgIDkgIC0gQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMVBPSU5UMiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAxMCAtIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDBQT0lOVDIiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMTEgLSBBVURJT19DSEFOTkVMX09VVF9QRU5UQSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAxMiAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDUgY2g6ICgxIDw8IDUpIC0gMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAxMyAtIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDFQT0lOVDIiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMTQgLSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgIDE1IC0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgIDE2IC0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgIDE3IC0gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggbWFzayBmb3IgNiBjaDogKDEgPDwgNikgLSAxIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgIDE4IC0gQVVESU9fQ0hBTk5FTF9PVVRfNlBPSU5UMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAxOSAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDcgY2g6ICgxIDw8IDcpIC0gMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAyMCAtIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFQT0lOVDIiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMjEgLSBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgIDIyIC0gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggbWFzayBmb3IgOCBjaDogKDEgPDwgOCkgLSAxIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgIGRlZmF1bHQgMCIpOworICAgIHByaW50ZigiXG4gICAgIC12Y0JhbDo8TGVmdCBSaWdodCBCYWxhbmNlIGNvbnRyb2wgaW4gZEIgWy05NiB0byA5NiBkQl0+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgIC12ZSB2YWx1ZXMgcmVkdWNlIFJpZ2h0IGNoYW5uZWwgd2hpbGUgK3ZlIHZhbHVlIHJlZHVjZXMgTGVmdCBjaGFubmVsIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgICAgICAgZGVmYXVsdCAwIik7CisgICAgcHJpbnRmKCJcbiAgICAgLWZjaDo8ZmlsZV9jaGFubmVscz4gKDEgdGhyb3VnaCA4KVxuXG4iKTsKKyAgICBwcmludGYoIlxuICAgICAtTSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIE1vbm8gbW9kZSAoZm9yY2UgYWxsIGlucHV0IGF1ZGlvIGNoYW5uZWxzIHRvIGJlIGlkZW50aWNhbCkiKTsKKyAgICBwcmludGYoIlxuICAgICAtYmFzc2x2bDo8ZWZmZWN0X2xldmVsPiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEEgdmFsdWUgdGhhdCByYW5nZXMgYmV0d2VlbiAlZCAtICVkIGRlZmF1bHQgMCIsIExWTV9CRV9NSU5fRUZGRUNUTEVWRUwsCisgICAgICAgICAgIExWTV9CRV9NQVhfRUZGRUNUTEVWRUwpOworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIlxuICAgICAtZXFQcmVzZXQ6PHByZXNldCBWYWx1ZT4iKTsKKyAgICBjb25zdCBzaXplX3QgbnVtUHJlc2V0THZscyA9IHN0ZDo6c2l6ZShnRXF1YWxpemVyUHJlc2V0cyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1QcmVzZXRMdmxzOyArK2kpIHsKKyAgICAgICAgcHJpbnRmKCJcbiAgICAgICAgICAgJXp1IC0gJXMiLCBpLCBnRXF1YWxpemVyUHJlc2V0c1tpXS5uYW1lKTsKICAgICB9Ci0gIH0KLX0gLyogZW5kIEx2bUVmZmVjdF9mcmVlICovCisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgZGVmYXVsdCAtIDAiKTsKKyAgICBwcmludGYoIlxuICAgICAtYkUgIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCIpOworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIlxuICAgICAtdEUgIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIFRyZWJsZSBCb29zdCIpOworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIlxuICAgICAtY3NFICIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBDb25jZXJ0IFN1cnJvdW5kIik7CisgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiXG4gICAgIC1lcUUgIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIEVxdWFsaXplciIpOworfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEx2bUJ1bmRsZV9pbml0KCkKQEAgLTIzOSw1ODYgKzIwNiw0NjcgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IEx2bUJ1bmRsZV9pbml0KHN0cnVjdCBFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgTFZNX0NvbnRyb2xQYXJhbXNfdCAqcGFyYW1zKSB7Ci0gIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IHN0YXJ0Iik7CitpbnQgTHZtQnVuZGxlX2luaXQoc3RydWN0IEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCBMVk1fQ29udHJvbFBhcmFtc190KiBwYXJhbXMpIHsKKyAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBzdGFydCIpOwogCi0gIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7Ci0gIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7Ci0gIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7Ci0gIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKLSAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKLSAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwotICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKLSAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7Ci0gIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKLSAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7Ci0gIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7Ci0gIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwotICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwotICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKIAotICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlICE9IE5VTEwpIHsKLSAgICBBTE9HVigKLSAgICAgICAgIlx0THZtQnVuZGxlX2luaXQgcENvbnRleHQtPnBCYXNzQm9vc3QgIT0gTlVMTCAiCi0gICAgICAgICItPiBDYWxsaW5nIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKKyAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgcENvbnRleHQtPnBCYXNzQm9vc3QgIT0gTlVMTCAiCisgICAgICAgICAgICAgICItPiBDYWxsaW5nIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKKyAgICAgICAgTFZNX0RlbEluc3RhbmNlSGFuZGxlKCZwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UpOwogCi0gICAgTHZtRWZmZWN0X2ZyZWUocENvbnRleHQpOwotCi0gICAgQUxPR1YoCi0gICAgICAgICJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgotICAgICAgICAiLT4gQ2FsbGVkIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKLSAgfQotCi0gIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCi0gIExWTV9JbnN0UGFyYW1zX3QgSW5zdFBhcmFtczsgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KLSAgTFZNX0VRTkJfQmFuZERlZl90IEJhbmREZWZzW01BWF9OVU1fQkFORFNdOyAgLyogRXF1YWxpc2VyIGJhbmQgZGVmaW5pdGlvbnMgKi8KLSAgTFZNX0hlYWRyb29tUGFyYW1zX3QgSGVhZHJvb21QYXJhbXM7ICAgICAgICAgLyogSGVhZHJvb20gcGFyYW1ldGVycyAqLwotICBMVk1fSGVhZHJvb21CYW5kRGVmX3QgSGVhZHJvb21CYW5kRGVmW0xWTV9IRUFEUk9PTV9NQVhfTkJBTkRTXTsKLSAgTFZNX01lbVRhYl90IE1lbVRhYjsgLyogTWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KLSAgYm9vbCBiTWFsbG9jRmFpbHVyZSA9IExWTV9GQUxTRTsKLQotICAvKiBTZXQgdGhlIGNhcGFiaWxpdGllcyAqLwotICBJbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlM7Ci0gIEluc3RQYXJhbXMuTWF4QmxvY2tTaXplID0gTUFYX0NBTExfU0laRTsKLSAgSW5zdFBhcmFtcy5FUU5CX051bUJhbmRzID0gTUFYX05VTV9CQU5EUzsKLSAgSW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgPSBMVk1fUFNBX09OOwotCi0gIC8qIEFsbG9jYXRlIG1lbW9yeSwgZm9yY2luZyBhbGlnbm1lbnQgKi8KLSAgTHZtU3RhdHVzID0gTFZNX0dldE1lbW9yeVRhYmxlKExWTV9OVUxMLCAmTWVtVGFiLCAmSW5zdFBhcmFtcyk7Ci0KLSAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRNZW1vcnlUYWJsZSIsICJMdm1CdW5kbGVfaW5pdCIpOwotICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKLQotICBBTE9HVigiXHRDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX0dldE1lbW9yeVRhYmxlXG4iKTsKLQotICAvKiBBbGxvY2F0ZSBtZW1vcnkgKi8KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykgewotICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCkgewotICAgICAgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPSBtYWxsb2MoTWVtVGFiLlJlZ2lvbltpXS5TaXplKTsKLQotICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID09IExWTV9OVUxMKSB7Ci0gICAgICAgIEFMT0dFKAotICAgICAgICAgICAgIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgIgotICAgICAgICAgICAgIiUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXVcbiIsCi0gICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkpOwotICAgICAgICBiTWFsbG9jRmFpbHVyZSA9IExWTV9UUlVFOwotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIGFsbG9jYXRlZCAlIiBQUkl1MzIKLSAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAotICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKLSAgICAgIH0KKyAgICAgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgcENvbnRleHQtPnBCYXNzQm9vc3QgIT0gTlVMTCAiCisgICAgICAgICAgICAgICItPiBDYWxsZWQgcENvbnRleHQtPnBCYXNzQm9vc3QtPmZyZWUoKSIpOwogICAgIH0KLSAgfQogCi0gIC8qIElmIG9uZSBvciBtb3JlIG9mIHRoZSBtZW1vcnkgcmVnaW9ucyBmYWlsZWQgdG8gYWxsb2NhdGUsIGZyZWUgdGhlIHJlZ2lvbnMKLSAgICogdGhhdCB3ZXJlCi0gICAqIHN1Y2Nlc2Z1bGx5IGFsbG9jYXRlZCBhbmQgcmV0dXJuIHdpdGggYW4gZXJyb3IKLSAgICovCi0gIGlmIChiTWFsbG9jRmFpbHVyZSA9PSBMVk1fVFJVRSkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspIHsKLSAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCkgewotICAgICAgICBBTE9HRSgKLSAgICAgICAgICAgICJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICIKLSAgICAgICAgICAgICIlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IE5vdCBmcmVlaW5nXG4iLAotICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKAotICAgICAgICAgICAgIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQ6IGJ1dCBhbGxvY2F0ZWQgIgotICAgICAgICAgICAgIiUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXAtIGZyZWVcbiIsCi0gICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKLSAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICB9CisgICAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fSW5zdFBhcmFtc190IEluc3RQYXJhbXM7ICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwYXJhbWV0ZXJzICovCisgICAgTFZNX0VRTkJfQmFuZERlZl90IEJhbmREZWZzW01BWF9OVU1fQkFORFNdOyAgLyogRXF1YWxpc2VyIGJhbmQgZGVmaW5pdGlvbnMgKi8KKyAgICBMVk1fSGVhZHJvb21QYXJhbXNfdCBIZWFkcm9vbVBhcmFtczsgICAgICAgICAvKiBIZWFkcm9vbSBwYXJhbWV0ZXJzICovCisgICAgTFZNX0hlYWRyb29tQmFuZERlZl90IEhlYWRyb29tQmFuZERlZltMVk1fSEVBRFJPT01fTUFYX05CQU5EU107CisKKyAgICAvKiBTZXQgdGhlIGNhcGFiaWxpdGllcyAqLworICAgIEluc3RQYXJhbXMuQnVmZmVyTW9kZSA9IExWTV9VTk1BTkFHRURfQlVGRkVSUzsKKyAgICBJbnN0UGFyYW1zLk1heEJsb2NrU2l6ZSA9IE1BWF9DQUxMX1NJWkU7CisgICAgSW5zdFBhcmFtcy5FUU5CX051bUJhbmRzID0gTUFYX05VTV9CQU5EUzsKKyAgICBJbnN0UGFyYW1zLlBTQV9JbmNsdWRlZCA9IExWTV9QU0FfT047CisKKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0SW5zdGFuY2VIYW5kbGUoJnBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkluc3RQYXJhbXMpOworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRJbnN0YW5jZUhhbmRsZSIsICJMdm1CdW5kbGVfaW5pdCIpOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2Vzc2Z1bGx5IGNhbGxlZCAiCisgICAgICAgICAgIkxWTV9HZXRJbnN0YW5jZUhhbmRsZVxuIik7CisKKyAgICAvKiBTZXQgdGhlIGluaXRpYWwgcHJvY2VzcyBwYXJhbWV0ZXJzICovCisgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLT5PcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT047CisgICAgcGFyYW1zLT5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworICAgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX1NURVJFTzsKKyAgICBwYXJhbXMtPkNoTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICBwYXJhbXMtPlNwZWFrZXJUeXBlID0gTFZNX0hFQURQSE9ORVM7CisKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworCisgICAgLyogQ29uY2VydCBTb3VuZCBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLT5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PRkY7CisgICAgcGFyYW1zLT5WaXJ0dWFsaXplclR5cGUgPSBMVk1fQ09OQ0VSVFNPVU5EOworICAgIHBhcmFtcy0+VmlydHVhbGl6ZXJSZXZlcmJMZXZlbCA9IDEwMDsKKyAgICBwYXJhbXMtPkNTX0VmZmVjdExldmVsID0gTFZNX0NTX0VGRkVDVF9OT05FOworCisgICAgLyogTi1CYW5kIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLT5FUU5CX09wZXJhdGluZ01vZGUgPSBMVk1fRVFOQl9PTjsKKyAgICBwYXJhbXMtPkVRTkJfTkJhbmRzID0gRklWRUJBTkRfTlVNQkFORFM7CisgICAgcGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9ICZCYW5kRGVmc1swXTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgeworICAgICAgICBCYW5kRGVmc1tpXS5GcmVxdWVuY3kgPSBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW2ldOworICAgICAgICBCYW5kRGVmc1tpXS5RRmFjdG9yID0gRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tpXTsKKyAgICAgICAgQmFuZERlZnNbaV0uR2FpbiA9IEVRTkJfNUJhbmRTb2Z0UHJlc2V0c1tpXTsKICAgICB9Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci0gIH0KLSAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgbWFsbG9jJ2QgbWVtb3J5XG4iKTsKIAotICAvKiBJbml0aWFsaXNlICovCi0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSA9IExWTV9OVUxMOworICAgIC8qIFZvbHVtZSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMtPlZDX0VmZmVjdExldmVsID0gMDsKKyAgICBwYXJhbXMtPlZDX0JhbGFuY2UgPSAwOwogCi0gIC8qIEluaXQgc2V0cyB0aGUgaW5zdGFuY2UgaGFuZGxlICovCi0gIEx2bVN0YXR1cyA9IExWTV9HZXRJbnN0YW5jZUhhbmRsZSgmcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lbVRhYiwgJkluc3RQYXJhbXMpOworICAgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID0gTFZNX1RFX09GRjsKKyAgICBwYXJhbXMtPlRFX0VmZmVjdExldmVsID0gMDsKIAotICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldEluc3RhbmNlSGFuZGxlIiwgIkx2bUJ1bmRsZV9pbml0Iik7Ci0gIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMtPlBTQV9FbmFibGUgPSBMVk1fUFNBX09GRjsKKyAgICBwYXJhbXMtPlBTQV9QZWFrRGVjYXlSYXRlID0gKExWTV9QU0FfRGVjYXlTcGVlZF9lbikwOwogCi0gIEFMT0dWKAotICAgICAgIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkICIKLSAgICAgICJMVk1fR2V0SW5zdGFuY2VIYW5kbGVcbiIpOworICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy0+QkVfT3BlcmF0aW5nTW9kZSA9IExWTV9CRV9PTjsKKyAgICBwYXJhbXMtPkJFX0VmZmVjdExldmVsID0gMDsKKyAgICBwYXJhbXMtPkJFX0NlbnRyZUZyZXEgPSBMVk1fQkVfQ0VOVFJFXzkwSHo7CisgICAgcGFyYW1zLT5CRV9IUEYgPSBMVk1fQkVfSFBGX09OOwogCi0gIC8qIFNldCB0aGUgaW5pdGlhbCBwcm9jZXNzIHBhcmFtZXRlcnMgKi8KLSAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCi0gIHBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09OOwotICBwYXJhbXMtPlNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7Ci0gIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX1NURVJFTzsKLSAgcGFyYW1zLT5DaE1hc2sgICAgICAgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gIHBhcmFtcy0+U3BlYWtlclR5cGUgPSBMVk1fSEVBRFBIT05FUzsKKyAgICAvKiBQU0EgQ29udHJvbCBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLT5QU0FfRW5hYmxlID0gTFZNX1BTQV9PRkY7CisgICAgcGFyYW1zLT5QU0FfUGVha0RlY2F5UmF0ZSA9IExWTV9QU0FfU1BFRURfTUVESVVNOwogCi0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7CisgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCBwYXJhbXMpOwogCi0gIC8qIENvbmNlcnQgU291bmQgcGFyYW1ldGVycyAqLwotICBwYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09GRjsKLSAgcGFyYW1zLT5WaXJ0dWFsaXplclR5cGUgPSBMVk1fQ09OQ0VSVFNPVU5EOwotICBwYXJhbXMtPlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgPSAxMDA7Ci0gIHBhcmFtcy0+Q1NfRWZmZWN0TGV2ZWwgPSBMVk1fQ1NfRUZGRUNUX05PTkU7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJMdm1CdW5kbGVfaW5pdCIpOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCi0gIC8qIE4tQmFuZCBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLwotICBwYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSA9IExWTV9FUU5CX09OOwotICBwYXJhbXMtPkVRTkJfTkJhbmRzID0gRklWRUJBTkRfTlVNQkFORFM7Ci0gIHBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb24gPSAmQmFuZERlZnNbMF07CisgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2Vzc2Z1bGx5IGNhbGxlZCAiCisgICAgICAgICAgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CiAKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7Ci0gICAgQmFuZERlZnNbaV0uRnJlcXVlbmN5ID0gRVFOQl81QmFuZFByZXNldHNGcmVxdWVuY2llc1tpXTsKLSAgICBCYW5kRGVmc1tpXS5RRmFjdG9yID0gRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tpXTsKLSAgICBCYW5kRGVmc1tpXS5HYWluID0gRVFOQl81QmFuZFNvZnRQcmVzZXRzW2ldOwotICB9CisgICAgLyogU2V0IHRoZSBoZWFkcm9vbSBwYXJhbWV0ZXJzICovCisgICAgSGVhZHJvb21CYW5kRGVmWzBdLkxpbWl0X0xvdyA9IDIwOworICAgIEhlYWRyb29tQmFuZERlZlswXS5MaW1pdF9IaWdoID0gNDk5OTsKKyAgICBIZWFkcm9vbUJhbmREZWZbMF0uSGVhZHJvb21fT2Zmc2V0ID0gMDsKKyAgICBIZWFkcm9vbUJhbmREZWZbMV0uTGltaXRfTG93ID0gNTAwMDsKKyAgICBIZWFkcm9vbUJhbmREZWZbMV0uTGltaXRfSGlnaCA9IDI0MDAwOworICAgIEhlYWRyb29tQmFuZERlZlsxXS5IZWFkcm9vbV9PZmZzZXQgPSAwOworICAgIEhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb24gPSAmSGVhZHJvb21CYW5kRGVmWzBdOworICAgIEhlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGUgPSBMVk1fSEVBRFJPT01fT047CisgICAgSGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHMgPSAyOwogCi0gIC8qIFZvbHVtZSBDb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgcGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA9IDA7Ci0gIHBhcmFtcy0+VkNfQmFsYW5jZSA9IDA7CisgICAgTHZtU3RhdHVzID0gTFZNX1NldEhlYWRyb29tUGFyYW1zKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkhlYWRyb29tUGFyYW1zKTsKIAotICAvKiBUcmVibGUgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLwotICBwYXJhbXMtPlRFX09wZXJhdGluZ01vZGUgPSBMVk1fVEVfT0ZGOwotICBwYXJhbXMtPlRFX0VmZmVjdExldmVsID0gMDsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldEhlYWRyb29tUGFyYW1zIiwgIkx2bUJ1bmRsZV9pbml0Iik7CisgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKLSAgLyogUFNBIENvbnRyb2wgcGFyYW1ldGVycyAqLwotICBwYXJhbXMtPlBTQV9FbmFibGUgPSBMVk1fUFNBX09GRjsKLSAgcGFyYW1zLT5QU0FfUGVha0RlY2F5UmF0ZSA9IChMVk1fUFNBX0RlY2F5U3BlZWRfZW4pMDsKLQotICAvKiBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KLSAgcGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlID0gTFZNX0JFX09OOwotICBwYXJhbXMtPkJFX0VmZmVjdExldmVsID0gMDsKLSAgcGFyYW1zLT5CRV9DZW50cmVGcmVxID0gTFZNX0JFX0NFTlRSRV85MEh6OwotICBwYXJhbXMtPkJFX0hQRiA9IExWTV9CRV9IUEZfT047Ci0KLSAgLyogUFNBIENvbnRyb2wgcGFyYW1ldGVycyAqLwotICBwYXJhbXMtPlBTQV9FbmFibGUgPSBMVk1fUFNBX09GRjsKLSAgcGFyYW1zLT5QU0FfUGVha0RlY2F5UmF0ZSA9IExWTV9QU0FfU1BFRURfTUVESVVNOwotCi0gIC8qIFRFIENvbnRyb2wgcGFyYW1ldGVycyAqLwotICBwYXJhbXMtPlRFX09wZXJhdGluZ01vZGUgPSBMVk1fVEVfT0ZGOwotICBwYXJhbXMtPlRFX0VmZmVjdExldmVsID0gMDsKLQotICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLwotICBMdm1TdGF0dXMgPQotICAgICAgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgcGFyYW1zKTsKLQotICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUJ1bmRsZV9pbml0Iik7Ci0gIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwotCi0gIEFMT0dWKAotICAgICAgIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkICIKLSAgICAgICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotCi0gIC8qIFNldCB0aGUgaGVhZHJvb20gcGFyYW1ldGVycyAqLwotICBIZWFkcm9vbUJhbmREZWZbMF0uTGltaXRfTG93ID0gMjA7Ci0gIEhlYWRyb29tQmFuZERlZlswXS5MaW1pdF9IaWdoID0gNDk5OTsKLSAgSGVhZHJvb21CYW5kRGVmWzBdLkhlYWRyb29tX09mZnNldCA9IDA7Ci0gIEhlYWRyb29tQmFuZERlZlsxXS5MaW1pdF9Mb3cgPSA1MDAwOwotICBIZWFkcm9vbUJhbmREZWZbMV0uTGltaXRfSGlnaCA9IDI0MDAwOwotICBIZWFkcm9vbUJhbmREZWZbMV0uSGVhZHJvb21fT2Zmc2V0ID0gMDsKLSAgSGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbiA9ICZIZWFkcm9vbUJhbmREZWZbMF07Ci0gIEhlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGUgPSBMVk1fSEVBRFJPT01fT047Ci0gIEhlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzID0gMjsKLQotICBMdm1TdGF0dXMgPSBMVk1fU2V0SGVhZHJvb21QYXJhbXMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkhlYWRyb29tUGFyYW1zKTsKLQotICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldEhlYWRyb29tUGFyYW1zIiwgIkx2bUJ1bmRsZV9pbml0Iik7Ci0gIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwotCi0gIEFMT0dWKAotICAgICAgIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkICIKLSAgICAgICJMVk1fU2V0SGVhZHJvb21QYXJhbXNcbiIpOwotICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBFbmQiKTsKLSAgcmV0dXJuIDA7CisgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2Vzc2Z1bGx5IGNhbGxlZCAiCisgICAgICAgICAgIkxWTV9TZXRIZWFkcm9vbVBhcmFtc1xuIik7CisgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgRW5kIik7CisgICAgcmV0dXJuIDA7CiB9IC8qIGVuZCBMdm1CdW5kbGVfaW5pdCAqLwogCi1pbnQgbHZtQ3JlYXRlKHN0cnVjdCBFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zX3QgICAgKnBsdm1Db25maWdQYXJhbXMsCi0gICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICpwYXJhbXMpIHsKLSAgaW50IHJldCA9IDA7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQgPSBOVUxMOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0ID0gKEJ1bmRsZWRFZmZlY3RDb250ZXh0ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgQnVuZGxlZEVmZmVjdENvbnRleHQpKTsKLSAgaWYgKE5VTEwgPT0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCkgewotICAgIHJldHVybiAtRUlOVkFMOwotICB9Ci0KLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vID0gMDsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbklkID0gMDsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlID0gTlVMTDsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgPSBMVk1fRkFMU0U7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID0gTFZNX0ZBTFNFOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPSBMVk1fRkFMU0U7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID0gTFZNX0ZBTFNFOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5PdXRwdXREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+blZpcnR1YWxpemVyRm9yY2VkRGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkID0gMDsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCA9IDA7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZpcnN0Vm9sdW1lID0gTFZNX1RSVUU7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnZvbHVtZSA9IDA7Ci0KLSAgLyogU2F2ZWQgc3RyZW5ndGggaXMgdXNlZCB0byByZXR1cm4gdGhlIGV4YWN0IHN0cmVuZ3RoIHRoYXQgd2FzIHVzZWQgaW4gdGhlCi0gICAqIHNldCB0byB0aGUgZ2V0Ci0gICAqIGJlY2F1c2Ugd2UgbWFwIHRoZSBvcmlnaW5hbCBzdHJlbmd0aCByYW5nZSBvZiAwOjEwMDAgdG8gMToxNSwgYW5kIHRoaXMgd2lsbAotICAgKiBhdm9pZAotICAgKiBxdWFudGlzYXRpb24gbGlrZSBlZmZlY3Qgd2hlbiByZXR1cm5pbmcKLSAgICovCi0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkID0gMDsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+VmlydFN0cmVuZ3RoU2F2ZWQgPSAwOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DdXJQcmVzZXQgPSBQUkVTRVRfQ1VTVE9NOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5sZXZlbFNhdmVkID0gMDsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkID0gTFZNX0ZBTFNFOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iU3RlcmVvUG9zaXRpb25FbmFibGVkID0gTFZNX0ZBTFNFOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkID0gMDsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9IE5VTEw7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPSAtMTsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA9IDA7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiID0gMDsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPSAwOwotICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKLSAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldID0gRVFOQl81QmFuZFNvZnRQcmVzZXRzW2ldOwotICB9Ci0gIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBwbHZtQ29uZmlnUGFyYW1zLT5uckNoYW5uZWxzOwotICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBDYWxsaW5nIEx2bUJ1bmRsZV9pbml0Iik7Ci0gIHJldCA9IEx2bUJ1bmRsZV9pbml0KHBDb250ZXh0LCBwYXJhbXMpOwotCi0gIGlmIChyZXQgPCAwKSB7Ci0gICAgQUxPR0UoIlx0TFZNX0VSUk9SIDogbHZtQ3JlYXRlKCkgQnVuZGxlIGluaXQgZmFpbGVkIik7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotaW50IGx2bUNvbnRyb2woc3RydWN0IEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zX3QgICAgKnBsdm1Db25maWdQYXJhbXMsCi0gICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAqcGFyYW1zKSB7Ci0gIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCi0KLSAgLyogU2V0IHRoZSBpbml0aWFsIHByb2Nlc3MgcGFyYW1ldGVycyAqLwotICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KLSAgcGFyYW1zLT5PcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT047Ci0gIHBhcmFtcy0+U3BlYWtlclR5cGUgPSBMVk1fSEVBRFBIT05FUzsKLQotICBwYXJhbXMtPkNoTWFzayAgICAgPSBwbHZtQ29uZmlnUGFyYW1zLT5jaE1hc2s7Ci0gIHBhcmFtcy0+TnJDaGFubmVscyA9IHBsdm1Db25maWdQYXJhbXMtPm5yQ2hhbm5lbHM7Ci0gIGlmIChwYXJhbXMtPk5yQ2hhbm5lbHMgPT0gMSkgewotICAgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX01PTk87Ci0gIH0gZWxzZSBpZiAocGFyYW1zLT5OckNoYW5uZWxzID09IDIpIHsKLSAgICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9TVEVSRU87Ci0gIH0gZWxzZSBpZiAocGFyYW1zLT5OckNoYW5uZWxzID4gMiAmJiBwYXJhbXMtPk5yQ2hhbm5lbHMgPD0gOCkgeyAvLyBGQ0NfMiBGQ0NfOAotICAgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX01VTFRJQ0hBTk5FTDsKLSAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAtRUlOVkFMOwotICB9Ci0KLSAgTFZNX0ZzX2VuIHNhbXBsZVJhdGU7Ci0gIHN3aXRjaCAocGx2bUNvbmZpZ1BhcmFtcy0+c2FtcGxpbmdGcmVxKSB7Ci0gICAgY2FzZSA4MDAwOgotICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU184MDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMTAyNToKLSAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMTEwMjU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEyMDAwOgotICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18xMjAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTYwMDA6Ci0gICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzE2MDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMjA1MDoKLSAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMjIwNTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0MDAwOgotICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18yNDAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzIwMDA6Ci0gICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzMyMDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0NDEwMDoKLSAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ4MDAwOgotICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgODgyMDA6Ci0gICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzg4MjAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5NjAwMDoKLSAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfOTYwMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE3NjQwMDoKLSAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOTIwMDA6Ci0gICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzE5MjAwMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gLUVJTlZBTDsKLSAgfQotICBwYXJhbXMtPlNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOwotCi0gIC8qIENvbmNlcnQgU291bmQgcGFyYW1ldGVycyAqLwotICBwYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSA9IHBsdm1Db25maWdQYXJhbXMtPmNzRW5hYmxlOwotICBwYXJhbXMtPlZpcnR1YWxpemVyVHlwZSA9IExWTV9DT05DRVJUU09VTkQ7Ci0gIHBhcmFtcy0+VmlydHVhbGl6ZXJSZXZlcmJMZXZlbCA9IDEwMDsKLSAgcGFyYW1zLT5DU19FZmZlY3RMZXZlbCA9IExWTV9DU19FRkZFQ1RfTk9ORTsKLQotICAvKiBOLUJhbmQgRXF1YWxpc2VyIHBhcmFtZXRlcnMgKi8KLSAgY29uc3QgaW50IGVxUHJlc2V0TGV2ZWwgPSBwbHZtQ29uZmlnUGFyYW1zLT5lcVByZXNldExldmVsOwotICBMVk1fRVFOQl9CYW5kRGVmX3QgQmFuZERlZnNbTUFYX05VTV9CQU5EU107ICAvKiBFcXVhbGlzZXIgYmFuZCBkZWZpbml0aW9ucyAqLwotICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKLSAgICBCYW5kRGVmc1tpXS5GcmVxdWVuY3kgPSBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW2ldOwotICAgIEJhbmREZWZzW2ldLlFGYWN0b3IgPSBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW2ldOwotICAgIEJhbmREZWZzW2ldLkdhaW4gPQotICAgICAgICBFUU5CXzVCYW5kU29mdFByZXNldHNbKEZJVkVCQU5EX05VTUJBTkRTICogZXFQcmVzZXRMZXZlbCkgKyBpXTsKLSAgfQotICBwYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSA9IHBsdm1Db25maWdQYXJhbXMtPmVxRW5hYmxlOwotIC8vIENhdXRpb246IHJhdyBwb2ludGVyIHRvIHN0YWNrIGRhdGEsIHN0b3JlZCBpbiBpbnN0YW5jZSBieSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMuCi0gIHBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb24gPSAmQmFuZERlZnNbMF07Ci0KLSAgLyogVm9sdW1lIENvbnRyb2wgcGFyYW1ldGVycyAqLwotICBwYXJhbXMtPlZDX0VmZmVjdExldmVsID0gMDsKLSAgcGFyYW1zLT5WQ19CYWxhbmNlID0gcGx2bUNvbmZpZ1BhcmFtcy0+dmNCYWw7Ci0KLSAgLyogVHJlYmxlIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KLSAgcGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID0gcGx2bUNvbmZpZ1BhcmFtcy0+dHJlYmxlRW5hYmxlOwotCi0gIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgcGFyYW1zLT5QU0FfRW5hYmxlID0gTFZNX1BTQV9PTjsKLQotICAvKiBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KLSAgcGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlID0gcGx2bUNvbmZpZ1BhcmFtcy0+YmFzc0VuYWJsZTsKLQotICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLwotICBMdm1TdGF0dXMgPQotICAgICAgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgcGFyYW1zKTsKLQotICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUJ1bmRsZV9pbml0Iik7Ci0gIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwotCi0gIEx2bVN0YXR1cyA9IExWTV9BcHBseU5ld1NldHRpbmdzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSk7Ci0KLSAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBsdm1FeGVjdXRlKGZsb2F0ICpmbG9hdEluLCBmbG9hdCAqZmxvYXRPdXQsIHN0cnVjdCBFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtc190ICpwbHZtQ29uZmlnUGFyYW1zKSB7Ci0gIGNvbnN0IGludCBmcmFtZUxlbmd0aCA9IHBsdm1Db25maWdQYXJhbXMtPmZyYW1lTGVuZ3RoOwotICByZXR1cm4KLSAgICAgIExWTV9Qcm9jZXNzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgLyogSW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgICBmbG9hdEluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgZmxvYXRPdXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNilmcmFtZUxlbmd0aCwgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCAqLwotICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIEF1ZGlvIFRpbWUgKi8KLX0KLQotaW50IGx2bU1haW5Qcm9jZXNzKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgKnBQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zX3QgKnBsdm1Db25maWdQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgRklMRSAqZmlucCwKLSAgICAgICAgICAgICAgICAgICBGSUxFICpmb3V0KSB7Ci0gIGludCBlcnJDb2RlID0gbHZtQ29udHJvbChwQ29udGV4dCwgcGx2bUNvbmZpZ1BhcmFtcywgcFBhcmFtcyk7Ci0gIGlmIChlcnJDb2RlKSB7Ci0gICAgQUxPR0UoIkVycm9yOiBsdm1Db250cm9sIHJldHVybmVkIHdpdGggJWRcbiIsIGVyckNvZGUpOwotICAgIHJldHVybiBlcnJDb2RlOwotICB9Ci0KLSAgY29uc3QgaW50IGNoYW5uZWxDb3VudCA9IHBsdm1Db25maWdQYXJhbXMtPm5yQ2hhbm5lbHM7Ci0gIGNvbnN0IGludCBmcmFtZUxlbmd0aCA9IHBsdm1Db25maWdQYXJhbXMtPmZyYW1lTGVuZ3RoOwotICBjb25zdCBpbnQgZnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogc2l6ZW9mKGZsb2F0KTsgIC8vIHByb2Nlc3Npbmcgc2l6ZQotICBjb25zdCBpbnQgaW9DaGFubmVsQ291bnQgPSBwbHZtQ29uZmlnUGFyYW1zLT5mQ2hhbm5lbHM7Ci0gIGNvbnN0IGludCBpb0ZyYW1lU2l6ZSA9IGlvQ2hhbm5lbENvdW50ICogc2l6ZW9mKHNob3J0KTsgLy8gZmlsZSBsb2FkIHNpemUKLSAgY29uc3QgaW50IG1heENoYW5uZWxDb3VudCA9IHN0ZDo6bWF4KGNoYW5uZWxDb3VudCwgaW9DaGFubmVsQ291bnQpOwotICAvKgotICAgKiBNb25vIGlucHV0IHdpbGwgYmUgY29udmVydGVkIHRvIDIgY2hhbm5lbHMgaW50ZXJuYWxseSBpbiB0aGUgcHJvY2VzcyBjYWxsCi0gICAqIGJ5IGNvcHlpbmcgdGhlIHNhbWUgZGF0YSBpbnRvIHRoZSBzZWNvbmQgY2hhbm5lbC4KLSAgICogSGVuY2Ugd2hlbiBjaGFubmVsQ291bnQgaXMgMSwgb3V0cHV0IGJ1ZmZlciBzaG91bGQgYmUgYWxsb2NhdGVkIGZvcgotICAgKiAyIGNoYW5uZWxzLiBUaGUgbWVtQWxsb2NDaENvdW50IHRha2VzIGNhcmUgb2YgYWxsb2NhdGlvbiBvZiBzdWZmaWNpZW50Ci0gICAqIG1lbW9yeSBmb3IgdGhlIG91dHB1dCBidWZmZXIuCi0gICAqLwotICBjb25zdCBpbnQgbWVtQWxsb2NDaENvdW50ID0gKGNoYW5uZWxDb3VudCA9PSAxID8gMiA6IGNoYW5uZWxDb3VudCk7Ci0KLSAgc3RkOjp2ZWN0b3I8c2hvcnQ+IGluKGZyYW1lTGVuZ3RoICogbWF4Q2hhbm5lbENvdW50KTsKLSAgc3RkOjp2ZWN0b3I8c2hvcnQ+IG91dChmcmFtZUxlbmd0aCAqIG1heENoYW5uZWxDb3VudCk7Ci0gIHN0ZDo6dmVjdG9yPGZsb2F0PiBmbG9hdEluKGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKLSAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGZsb2F0T3V0KGZyYW1lTGVuZ3RoICogbWVtQWxsb2NDaENvdW50KTsKLQotICBpbnQgZnJhbWVDb3VudGVyID0gMDsKLSAgd2hpbGUgKGZyZWFkKGluLmRhdGEoKSwgaW9GcmFtZVNpemUsIGZyYW1lTGVuZ3RoLCBmaW5wKSA9PSAoc2l6ZV90KWZyYW1lTGVuZ3RoKSB7Ci0gICAgaWYgKGlvQ2hhbm5lbENvdW50ICE9IGNoYW5uZWxDb3VudCkgewotICAgICAgICBhZGp1c3RfY2hhbm5lbHMoaW4uZGF0YSgpLCBpb0NoYW5uZWxDb3VudCwgaW4uZGF0YSgpLCBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICBzaXplb2Yoc2hvcnQpLCBmcmFtZUxlbmd0aCAqIGlvRnJhbWVTaXplKTsKK2ludCBsdm1DcmVhdGUoc3RydWN0IEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCBsdm1Db25maWdQYXJhbXNfdCogcGx2bUNvbmZpZ1BhcmFtcywKKyAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCogcGFyYW1zKSB7CisgICAgaW50IHJldCA9IDA7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCA9IE5VTEw7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCA9IChCdW5kbGVkRWZmZWN0Q29udGV4dCopbWFsbG9jKHNpemVvZihzdHJ1Y3QgQnVuZGxlZEVmZmVjdENvbnRleHQpKTsKKyAgICBpZiAoTlVMTCA9PSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0KSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KLSAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoZmxvYXRJbi5kYXRhKCksIGluLmRhdGEoKSwgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOwogCi0gICAgLy8gTW9ubyBtb2RlIHdpbGwgcmVwbGljYXRlIHRoZSBmaXJzdCBjaGFubmVsIHRvIGFsbCBvdGhlciBjaGFubmVscy4KLSAgICAvLyBUaGlzIGVuc3VyZXMgYWxsIGF1ZGlvIGNoYW5uZWxzIGFyZSBpZGVudGljYWwuIFRoaXMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nCi0gICAgLy8gQmFzcyBCb29zdCwgd2hpY2ggZXh0cmFjdHMgYSBtb25vIHNpZ25hbCBmb3IgcHJvY2Vzc2luZy4KLSAgICBpZiAocGx2bUNvbmZpZ1BhcmFtcy0+bW9ub01vZGUgJiYgY2hhbm5lbENvdW50ID4gMSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lTGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIGF1dG8gKmZwID0gJmZsb2F0SW5baSAqIGNoYW5uZWxDb3VudF07Ci0gICAgICAgICAgICBzdGQ6OmZpbGwoZnAgKyAxLCBmcCArIGNoYW5uZWxDb3VudCwgKmZwKTsgLy8gcmVwbGljYXRlIGNoIDAKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uTm8gPSAwOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25JZCA9IDA7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlID0gTlVMTDsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVm9sdW1lRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iRXF1YWxpemVyRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bk91dHB1dERldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5WaXJ0dWFsaXplckZvcmNlZERldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkID0gMDsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkID0gMDsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5maXJzdFZvbHVtZSA9IExWTV9UUlVFOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnZvbHVtZSA9IDA7CisKKyAgICAvKiBTYXZlZCBzdHJlbmd0aCBpcyB1c2VkIHRvIHJldHVybiB0aGUgZXhhY3Qgc3RyZW5ndGggdGhhdCB3YXMgdXNlZCBpbiB0aGUKKyAgICAgKiBzZXQgdG8gdGhlIGdldAorICAgICAqIGJlY2F1c2Ugd2UgbWFwIHRoZSBvcmlnaW5hbCBzdHJlbmd0aCByYW5nZSBvZiAwOjEwMDAgdG8gMToxNSwgYW5kIHRoaXMgd2lsbAorICAgICAqIGF2b2lkCisgICAgICogcXVhbnRpc2F0aW9uIGxpa2UgZWZmZWN0IHdoZW4gcmV0dXJuaW5nCisgICAgICovCisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQgPSAwOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlZpcnRTdHJlbmd0aFNhdmVkID0gMDsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DdXJQcmVzZXQgPSBQUkVTRVRfQ1VTVE9NOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmxldmVsU2F2ZWQgPSAwOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iU3RlcmVvUG9zaXRpb25FbmFibGVkID0gTFZNX0ZBTFNFOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQgPSAwOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPSBOVUxMOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPSAtMTsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ID0gMDsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA9IDA7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgeworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldID0gRVFOQl81QmFuZFNvZnRQcmVzZXRzW2ldOworICAgIH0KKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gcGx2bUNvbmZpZ1BhcmFtcy0+bnJDaGFubmVsczsKKyAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBDYWxsaW5nIEx2bUJ1bmRsZV9pbml0Iik7CisgICAgcmV0ID0gTHZtQnVuZGxlX2luaXQocENvbnRleHQsIHBhcmFtcyk7CisKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBBTE9HRSgiXHRMVk1fRVJST1IgOiBsdm1DcmVhdGUoKSBCdW5kbGUgaW5pdCBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBsdm1Db250cm9sKHN0cnVjdCBFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgbHZtQ29uZmlnUGFyYW1zX3QqIHBsdm1Db25maWdQYXJhbXMsCisgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190KiBwYXJhbXMpIHsKKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgLyogU2V0IHRoZSBpbml0aWFsIHByb2Nlc3MgcGFyYW1ldGVycyAqLworICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09OOworICAgIHBhcmFtcy0+U3BlYWtlclR5cGUgPSBMVk1fSEVBRFBIT05FUzsKKworICAgIHBhcmFtcy0+Q2hNYXNrID0gcGx2bUNvbmZpZ1BhcmFtcy0+Y2hNYXNrOworICAgIHBhcmFtcy0+TnJDaGFubmVscyA9IHBsdm1Db25maWdQYXJhbXMtPm5yQ2hhbm5lbHM7CisgICAgaWYgKHBhcmFtcy0+TnJDaGFubmVscyA9PSAxKSB7CisgICAgICAgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX01PTk87CisgICAgfSBlbHNlIGlmIChwYXJhbXMtPk5yQ2hhbm5lbHMgPT0gMikgeworICAgICAgICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9TVEVSRU87CisgICAgfSBlbHNlIGlmIChwYXJhbXMtPk5yQ2hhbm5lbHMgPiBGQ0NfMiAmJiBwYXJhbXMtPk5yQ2hhbm5lbHMgPD0gRkNDXzI0KSB7CisgICAgICAgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX01VTFRJQ0hBTk5FTDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgcGFyYW1zLT5TYW1wbGVSYXRlID0gbHZtRnNGb3JTYW1wbGVSYXRlKHBsdm1Db25maWdQYXJhbXMtPnNhbXBsaW5nRnJlcSk7CisgICAgaWYgKHBhcmFtcy0+U2FtcGxlUmF0ZSA9PSBMVk1fRlNfSU5WQUxJRCkgeworICAgICAgICBBTE9HRSgibHZtQ29udHJvbCBpbnZhbGlkIHNhbXBsaW5nIHJhdGUgJWQiLCBwbHZtQ29uZmlnUGFyYW1zLT5zYW1wbGluZ0ZyZXEpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvKiBDb25jZXJ0IFNvdW5kIHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSA9IHBsdm1Db25maWdQYXJhbXMtPmNzRW5hYmxlOworICAgIHBhcmFtcy0+VmlydHVhbGl6ZXJUeXBlID0gTFZNX0NPTkNFUlRTT1VORDsKKyAgICBwYXJhbXMtPlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgPSAxMDA7CisgICAgcGFyYW1zLT5DU19FZmZlY3RMZXZlbCA9IExWTV9DU19FRkZFQ1RfTk9ORTsKKworICAgIC8qIE4tQmFuZCBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLworICAgIGNvbnN0IGludCBlcVByZXNldExldmVsID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZXFQcmVzZXRMZXZlbDsKKyAgICBMVk1fRVFOQl9CYW5kRGVmX3QgQmFuZERlZnNbTUFYX05VTV9CQU5EU107IC8qIEVxdWFsaXNlciBiYW5kIGRlZmluaXRpb25zICovCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7CisgICAgICAgIEJhbmREZWZzW2ldLkZyZXF1ZW5jeSA9IEVRTkJfNUJhbmRQcmVzZXRzRnJlcXVlbmNpZXNbaV07CisgICAgICAgIEJhbmREZWZzW2ldLlFGYWN0b3IgPSBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW2ldOworICAgICAgICBCYW5kRGVmc1tpXS5HYWluID0gRVFOQl81QmFuZFNvZnRQcmVzZXRzWyhGSVZFQkFORF9OVU1CQU5EUyAqIGVxUHJlc2V0TGV2ZWwpICsgaV07CisgICAgfQorICAgIHBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZXFFbmFibGU7CisgICAgLy8gQ2F1dGlvbjogcmF3IHBvaW50ZXIgdG8gc3RhY2sgZGF0YSwgc3RvcmVkIGluIGluc3RhbmNlIGJ5IExWTV9TZXRDb250cm9sUGFyYW1ldGVycy4KKyAgICBwYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uID0gJkJhbmREZWZzWzBdOworCisgICAgLyogVm9sdW1lIENvbnRyb2wgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy0+VkNfRWZmZWN0TGV2ZWwgPSAwOworICAgIHBhcmFtcy0+VkNfQmFsYW5jZSA9IHBsdm1Db25maWdQYXJhbXMtPnZjQmFsOworCisgICAgLyogVHJlYmxlIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMtPlRFX09wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT50cmVibGVFbmFibGU7CisgICAgcGFyYW1zLT5URV9FZmZlY3RMZXZlbCA9IHBsdm1Db25maWdQYXJhbXMtPnRyZWJsZUVmZmVjdExldmVsOworCisgICAgLyogUFNBIENvbnRyb2wgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy0+UFNBX0VuYWJsZSA9IExWTV9QU0FfT047CisKKyAgICAvKiBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMtPkJFX09wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT5iYXNzRW5hYmxlOworCisgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCBwYXJhbXMpOworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJMdm1CdW5kbGVfaW5pdCIpOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgTHZtU3RhdHVzID0gTFZNX0FwcGx5TmV3U2V0dGluZ3MocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlKTsKKworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBsdm1FeGVjdXRlKGZsb2F0KiBmbG9hdEluLCBmbG9hdCogZmxvYXRPdXQsIHN0cnVjdCBFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtc190KiBwbHZtQ29uZmlnUGFyYW1zKSB7CisgICAgY29uc3QgaW50IGZyYW1lTGVuZ3RoID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZnJhbWVMZW5ndGg7CisgICAgcmV0dXJuIExWTV9Qcm9jZXNzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0SW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0T3V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNilmcmFtZUxlbmd0aCwgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdWRpbyBUaW1lICovCit9CisKK2ludCBsdm1NYWluUHJvY2VzcyhFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgTFZNX0NvbnRyb2xQYXJhbXNfdCogcFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBsdm1Db25maWdQYXJhbXNfdCogcGx2bUNvbmZpZ1BhcmFtcywgRklMRSogZmlucCwgRklMRSogZm91dCkgeworICAgIGludCBlcnJDb2RlID0gbHZtQ29udHJvbChwQ29udGV4dCwgcGx2bUNvbmZpZ1BhcmFtcywgcFBhcmFtcyk7CisgICAgaWYgKGVyckNvZGUpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yOiBsdm1Db250cm9sIHJldHVybmVkIHdpdGggJWRcbiIsIGVyckNvZGUpOworICAgICAgICByZXR1cm4gZXJyQ29kZTsKKyAgICB9CisKKyAgICBjb25zdCBpbnQgY2hhbm5lbENvdW50ID0gcGx2bUNvbmZpZ1BhcmFtcy0+bnJDaGFubmVsczsKKyAgICBjb25zdCBpbnQgZnJhbWVMZW5ndGggPSBwbHZtQ29uZmlnUGFyYW1zLT5mcmFtZUxlbmd0aDsKKyAgICBjb25zdCBpbnQgZnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogc2l6ZW9mKGZsb2F0KTsgIC8vIHByb2Nlc3Npbmcgc2l6ZQorICAgIGNvbnN0IGludCBpb0NoYW5uZWxDb3VudCA9IHBsdm1Db25maWdQYXJhbXMtPmZDaGFubmVsczsKKyAgICBjb25zdCBpbnQgaW9GcmFtZVNpemUgPSBpb0NoYW5uZWxDb3VudCAqIHNpemVvZihzaG9ydCk7ICAvLyBmaWxlIGxvYWQgc2l6ZQorICAgIGNvbnN0IGludCBtYXhDaGFubmVsQ291bnQgPSBzdGQ6Om1heChjaGFubmVsQ291bnQsIGlvQ2hhbm5lbENvdW50KTsKKworICAgIHN0ZDo6dmVjdG9yPHNob3J0PiBpbihmcmFtZUxlbmd0aCAqIG1heENoYW5uZWxDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8c2hvcnQ+IG91dChmcmFtZUxlbmd0aCAqIG1heENoYW5uZWxDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGZsb2F0SW4oZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBmbG9hdE91dChmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQgZnJhbWVDb3VudGVyID0gMDsKKyAgICB3aGlsZSAoZnJlYWQoaW4uZGF0YSgpLCBpb0ZyYW1lU2l6ZSwgZnJhbWVMZW5ndGgsIGZpbnApID09IChzaXplX3QpZnJhbWVMZW5ndGgpIHsKKyAgICAgICAgaWYgKGlvQ2hhbm5lbENvdW50ICE9IGNoYW5uZWxDb3VudCkgeworICAgICAgICAgICAgYWRqdXN0X2NoYW5uZWxzKGluLmRhdGEoKSwgaW9DaGFubmVsQ291bnQsIGluLmRhdGEoKSwgY2hhbm5lbENvdW50LCBzaXplb2Yoc2hvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoICogaW9GcmFtZVNpemUpOworICAgICAgICB9CisgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNihmbG9hdEluLmRhdGEoKSwgaW4uZGF0YSgpLCBmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7CisKKyAgICAgICAgLy8gTW9ubyBtb2RlIHdpbGwgcmVwbGljYXRlIHRoZSBmaXJzdCBjaGFubmVsIHRvIGFsbCBvdGhlciBjaGFubmVscy4KKyAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGFsbCBhdWRpbyBjaGFubmVscyBhcmUgaWRlbnRpY2FsLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGVzdGluZworICAgICAgICAvLyBCYXNzIEJvb3N0LCB3aGljaCBleHRyYWN0cyBhIG1vbm8gc2lnbmFsIGZvciBwcm9jZXNzaW5nLgorICAgICAgICBpZiAocGx2bUNvbmZpZ1BhcmFtcy0+bW9ub01vZGUgJiYgY2hhbm5lbENvdW50ID4gMSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgYXV0byogZnAgPSAmZmxvYXRJbltpICogY2hhbm5lbENvdW50XTsKKyAgICAgICAgICAgICAgICBzdGQ6OmZpbGwoZnAgKyAxLCBmcCArIGNoYW5uZWxDb3VudCwgKmZwKTsgIC8vIHJlcGxpY2F0ZSBjaCAwCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZm5kZWYgQllQQVNTX0VYRUMKKyAgICAgICAgZXJyQ29kZSA9IGx2bUV4ZWN1dGUoZmxvYXRJbi5kYXRhKCksIGZsb2F0T3V0LmRhdGEoKSwgcENvbnRleHQsIHBsdm1Db25maWdQYXJhbXMpOworICAgICAgICBpZiAoZXJyQ29kZSkgeworICAgICAgICAgICAgcHJpbnRmKCJcbkVycm9yOiBsdm1FeGVjdXRlIHJldHVybmVkIHdpdGggJWRcbiIsIGVyckNvZGUpOworICAgICAgICAgICAgcmV0dXJuIGVyckNvZGU7CisgICAgICAgIH0KKworICAgICAgICAodm9pZClmcmFtZVNpemU7ICAvLyBlbGltaW5hdGUgd2FybmluZworI2Vsc2UKKyAgICAgICAgbWVtY3B5KGZsb2F0T3V0LmRhdGEoKSwgZmxvYXRJbi5kYXRhKCksIGZyYW1lTGVuZ3RoICogZnJhbWVTaXplKTsKKyNlbmRpZgorICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQob3V0LmRhdGEoKSwgZmxvYXRPdXQuZGF0YSgpLCBmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7CisgICAgICAgIGlmIChpb0NoYW5uZWxDb3VudCAhPSBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgICAgIGFkanVzdF9jaGFubmVscyhvdXQuZGF0YSgpLCBjaGFubmVsQ291bnQsIG91dC5kYXRhKCksIGlvQ2hhbm5lbENvdW50LCBzaXplb2Yoc2hvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50ICogc2l6ZW9mKHNob3J0KSk7CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpZndyaXRlKG91dC5kYXRhKCksIGlvRnJhbWVTaXplLCBmcmFtZUxlbmd0aCwgZm91dCk7CisgICAgICAgIGZyYW1lQ291bnRlciArPSBmcmFtZUxlbmd0aDsKKyAgICB9CisgICAgcHJpbnRmKCJmcmFtZUNvdW50ZXI6IFslZF1cbiIsIGZyYW1lQ291bnRlcik7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiBhcmd2W10pIHsKKyAgICBpZiAoYXJnYyA9PSAxKSB7CisgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGx2bUNvbmZpZ1BhcmFtc190IGx2bUNvbmZpZ1BhcmFtc3t9OyAgLy8gZGVmYXVsdCBpbml0aWFsaXplCisgICAgY29uc3QgY2hhciogaW5maWxlID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyKiBvdXRmaWxlID0gbnVsbHB0cjsKKworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgIHByaW50ZigiJXMgIiwgYXJndltpXSk7CisgICAgICAgIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWk6IiwgMykpIHsKKyAgICAgICAgICAgIGluZmlsZSA9IGFyZ3ZbaV0gKyAzOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItbzoiLCAzKSkgeworICAgICAgICAgICAgb3V0ZmlsZSA9IGFyZ3ZbaV0gKyAzOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItZnM6IiwgNCkpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBzYW1wbGluZ0ZyZXEgPSBhdG9pKGFyZ3ZbaV0gKyA0KTsKKyAgICAgICAgICAgIGlmIChzYW1wbGluZ0ZyZXEgIT0gODAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMTEwMjUgJiYgc2FtcGxpbmdGcmVxICE9IDEyMDAwICYmCisgICAgICAgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDE2MDAwICYmIHNhbXBsaW5nRnJlcSAhPSAyMjA1MCAmJiBzYW1wbGluZ0ZyZXEgIT0gMjQwMDAgJiYKKyAgICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMzIwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDQ0MTAwICYmIHNhbXBsaW5nRnJlcSAhPSA0ODAwMCAmJgorICAgICAgICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSA4ODIwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gOTYwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDE3NjQwMCAmJgorICAgICAgICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAxOTIwMDApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkVycm9yOiBVbnN1cHBvcnRlZCBTYW1wbGluZyBGcmVxdWVuY3kgOiAlZFxuIiwgc2FtcGxpbmdGcmVxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsdm1Db25maWdQYXJhbXMuc2FtcGxpbmdGcmVxID0gc2FtcGxpbmdGcmVxOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItY2hNYXNrOiIsIDgpKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgY2hNYXNrQ29uZmlnSWR4ID0gYXRvaShhcmd2W2ldICsgOCk7CisgICAgICAgICAgICBpZiAoY2hNYXNrQ29uZmlnSWR4IDwgMCB8fCAoc2l6ZV90KWNoTWFza0NvbmZpZ0lkeCA+PSBzdGQ6OnNpemUobHZtQ29uZmlnQ2hNYXNrKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJcbkVycm9yOiBVbnN1cHBvcnRlZCBDaGFubmVsIE1hc2sgOiAlZFxuIiwgY2hNYXNrQ29uZmlnSWR4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBjaE1hc2sgPSBsdm1Db25maWdDaE1hc2tbY2hNYXNrQ29uZmlnSWR4XTsKKyAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtcy5jaE1hc2sgPSBjaE1hc2s7CisgICAgICAgICAgICBsdm1Db25maWdQYXJhbXMubnJDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaE1hc2spOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItdmNCYWw6IiwgNykpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB2Y0JhbGFuY2UgPSBhdG9pKGFyZ3ZbaV0gKyA3KTsKKyAgICAgICAgICAgIGlmICh2Y0JhbGFuY2UgPiA5NiB8fCB2Y0JhbGFuY2UgPCAtOTYpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiXG5FcnJvcjogVW5zdXBwb3J0ZWQgdm9sdW1lIGJhbGFuY2UgdmFsdWU6ICVkXG4iLCB2Y0JhbGFuY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLnZjQmFsID0gdmNCYWxhbmNlOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItZmNoOiIsIDUpKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgZkNoYW5uZWxzID0gYXRvaShhcmd2W2ldICsgNSk7CisgICAgICAgICAgICBpZiAoZkNoYW5uZWxzID4gOCB8fCBmQ2hhbm5lbHMgPCAxKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJFcnJvcjogVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGZpbGUgY2hhbm5lbHMgOiAlZFxuIiwgZkNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsdm1Db25maWdQYXJhbXMuZkNoYW5uZWxzID0gZkNoYW5uZWxzOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1NIikpIHsKKyAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtcy5tb25vTW9kZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1iYXNzbHZsOiIsIDkpKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgYmFzc0VmZmVjdExldmVsID0gYXRvaShhcmd2W2ldICsgOSk7CisgICAgICAgICAgICBpZiAoYmFzc0VmZmVjdExldmVsID4gTFZNX0JFX01BWF9FRkZFQ1RMRVZFTCB8fAorICAgICAgICAgICAgICAgIGJhc3NFZmZlY3RMZXZlbCA8IExWTV9CRV9NSU5fRUZGRUNUTEVWRUwpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkVycm9yOiBVbnN1cHBvcnRlZCBCYXNzIEVmZmVjdCBMZXZlbCA6ICVkXG4iLCBiYXNzRWZmZWN0TGV2ZWwpOworICAgICAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsdm1Db25maWdQYXJhbXMuYmFzc0VmZmVjdExldmVsID0gYmFzc0VmZmVjdExldmVsOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItZXFQcmVzZXQ6IiwgMTApKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgZXFQcmVzZXRMZXZlbCA9IGF0b2koYXJndltpXSArIDEwKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBudW1QcmVzZXRMdmxzID0gc3RkOjpzaXplKGdFcXVhbGl6ZXJQcmVzZXRzKTsKKyAgICAgICAgICAgIGlmIChlcVByZXNldExldmVsID49IG51bVByZXNldEx2bHMgfHwgZXFQcmVzZXRMZXZlbCA8IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkVycm9yOiBVbnN1cHBvcnRlZCBFcXVhbGl6ZXIgUHJlc2V0IDogJWRcbiIsIGVxUHJlc2V0TGV2ZWwpOworICAgICAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsdm1Db25maWdQYXJhbXMuZXFQcmVzZXRMZXZlbCA9IGVxUHJlc2V0TGV2ZWw7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi10cmVibGVMdmw6IiwgMTEpKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgdHJlYmxlRWZmZWN0TGV2ZWwgPSBhdG9pKGFyZ3ZbaV0gKyAxMSk7CisgICAgICAgICAgICBpZiAodHJlYmxlRWZmZWN0TGV2ZWwgPiBMVk1fVEVfTUFYX0VGRkVDVExFVkVMIHx8CisgICAgICAgICAgICAgICAgdHJlYmxlRWZmZWN0TGV2ZWwgPCBMVk1fVEVfTUlOX0VGRkVDVExFVkVMKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJFcnJvcjogVW5zdXBwb3J0ZWQgVHJlYmxlIEVmZmVjdCBMZXZlbCA6ICVkXG4iLCB0cmVibGVFZmZlY3RMZXZlbCk7CisgICAgICAgICAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtcy50cmVibGVFZmZlY3RMZXZlbCA9IHRyZWJsZUVmZmVjdExldmVsOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1iRSIpKSB7CisgICAgICAgICAgICBsdm1Db25maWdQYXJhbXMuYmFzc0VuYWJsZSA9IExWTV9CRV9PTjsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItZXFFIikpIHsKKyAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtcy5lcUVuYWJsZSA9IExWTV9FUU5CX09OOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi10RSIpKSB7CisgICAgICAgICAgICBsdm1Db25maWdQYXJhbXMudHJlYmxlRW5hYmxlID0gTFZNX1RFX09OOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1jc0UiKSkgeworICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLmNzRW5hYmxlID0gTFZNX01PREVfT047CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWgiKSkgeworICAgICAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICB9Ci0jaWZuZGVmIEJZUEFTU19FWEVDCi0gICAgZXJyQ29kZSA9IGx2bUV4ZWN1dGUoZmxvYXRJbi5kYXRhKCksIGZsb2F0T3V0LmRhdGEoKSwgcENvbnRleHQsIHBsdm1Db25maWdQYXJhbXMpOwotICAgIGlmIChlcnJDb2RlKSB7Ci0gICAgICBwcmludGYoIlxuRXJyb3I6IGx2bUV4ZWN1dGUgcmV0dXJuZWQgd2l0aCAlZFxuIiwgZXJyQ29kZSk7Ci0gICAgICByZXR1cm4gZXJyQ29kZTsKLSAgICB9CiAKLSAgICAodm9pZClmcmFtZVNpemU7IC8vIGVsaW1pbmF0ZSB3YXJuaW5nCi0jZWxzZQotICAgIG1lbWNweShmbG9hdE91dC5kYXRhKCksIGZsb2F0SW4uZGF0YSgpLCBmcmFtZUxlbmd0aCAqIGZyYW1lU2l6ZSk7Ci0jZW5kaWYKLSAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQob3V0LmRhdGEoKSwgZmxvYXRPdXQuZGF0YSgpLCBmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7Ci0gICAgaWYgKGlvQ2hhbm5lbENvdW50ICE9IGNoYW5uZWxDb3VudCkgewotICAgICAgICBhZGp1c3RfY2hhbm5lbHMob3V0LmRhdGEoKSwgY2hhbm5lbENvdW50LCBvdXQuZGF0YSgpLCBpb0NoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgIHNpemVvZihzaG9ydCksIGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50ICogc2l6ZW9mKHNob3J0KSk7Ci0gICAgfQotICAgICh2b2lkKSBmd3JpdGUob3V0LmRhdGEoKSwgaW9GcmFtZVNpemUsIGZyYW1lTGVuZ3RoLCBmb3V0KTsKLSAgICBmcmFtZUNvdW50ZXIgKz0gZnJhbWVMZW5ndGg7Ci0gIH0KLSAgcHJpbnRmKCJmcmFtZUNvdW50ZXI6IFslZF1cbiIsIGZyYW1lQ291bnRlcik7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7Ci0gIGlmIChhcmdjID09IDEpIHsKLSAgICBwcmludFVzYWdlKCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgbHZtQ29uZmlnUGFyYW1zX3QgbHZtQ29uZmlnUGFyYW1ze307IC8vIGRlZmF1bHQgaW5pdGlhbGl6ZQotICBjb25zdCBjaGFyICppbmZpbGUgPSBudWxscHRyOwotICBjb25zdCBjaGFyICpvdXRmaWxlID0gbnVsbHB0cjsKLQotICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgewotICAgIHByaW50ZigiJXMgIiwgYXJndltpXSk7Ci0gICAgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItaToiLCAzKSkgewotICAgICAgaW5maWxlID0gYXJndltpXSArIDM7Ci0gICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLW86IiwgMykpIHsKLSAgICAgIG91dGZpbGUgPSBhcmd2W2ldICsgMzsKLSAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItZnM6IiwgNCkpIHsKLSAgICAgIGNvbnN0IGludCBzYW1wbGluZ0ZyZXEgPSBhdG9pKGFyZ3ZbaV0gKyA0KTsKLSAgICAgIGlmIChzYW1wbGluZ0ZyZXEgIT0gODAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMTEwMjUgJiYKLSAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMTIwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDE2MDAwICYmCi0gICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDIyMDUwICYmIHNhbXBsaW5nRnJlcSAhPSAyNDAwMCAmJgotICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAzMjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gNDQxMDAgJiYKLSAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gNDgwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDg4MjAwICYmCi0gICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDk2MDAwICYmIHNhbXBsaW5nRnJlcSAhPSAxNzY0MDAgJiYKLSAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMTkyMDAwKSB7Ci0gICAgICAgIHByaW50ZigiRXJyb3I6IFVuc3VwcG9ydGVkIFNhbXBsaW5nIEZyZXF1ZW5jeSA6ICVkXG4iLCBzYW1wbGluZ0ZyZXEpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBsdm1Db25maWdQYXJhbXMuc2FtcGxpbmdGcmVxID0gc2FtcGxpbmdGcmVxOwotICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1jaE1hc2s6IiwgOCkpIHsKLSAgICAgIGNvbnN0IGludCBjaE1hc2tDb25maWdJZHggPSBhdG9pKGFyZ3ZbaV0gKyA4KTsKLSAgICAgIGlmIChjaE1hc2tDb25maWdJZHggPCAwIHx8IChzaXplX3QpY2hNYXNrQ29uZmlnSWR4ID49IHN0ZDo6c2l6ZShsdm1Db25maWdDaE1hc2spKSB7Ci0gICAgICAgIEFMT0dFKCJcbkVycm9yOiBVbnN1cHBvcnRlZCBDaGFubmVsIE1hc2sgOiAlZFxuIiwgY2hNYXNrQ29uZmlnSWR4KTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hNYXNrID0gbHZtQ29uZmlnQ2hNYXNrW2NoTWFza0NvbmZpZ0lkeF07Ci0gICAgICBsdm1Db25maWdQYXJhbXMuY2hNYXNrID0gY2hNYXNrOwotICAgICAgbHZtQ29uZmlnUGFyYW1zLm5yQ2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hNYXNrKTsKLSAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItdmNCYWw6IiwgNykpIHsKLSAgICAgIGNvbnN0IGludCB2Y0JhbGFuY2UgPSBhdG9pKGFyZ3ZbaV0gKyA3KTsKLSAgICAgIGlmICh2Y0JhbGFuY2UgPiA5NiB8fCB2Y0JhbGFuY2UgPCAtOTYpIHsKLSAgICAgICAgQUxPR0UoIlxuRXJyb3I6IFVuc3VwcG9ydGVkIHZvbHVtZSBiYWxhbmNlIHZhbHVlOiAlZFxuIiwgdmNCYWxhbmNlKTsKLSAgICAgIH0KLSAgICAgIGx2bUNvbmZpZ1BhcmFtcy52Y0JhbCA9IHZjQmFsYW5jZTsKLSAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItZmNoOiIsIDUpKSB7Ci0gICAgICBjb25zdCBpbnQgZkNoYW5uZWxzID0gYXRvaShhcmd2W2ldICsgNSk7Ci0gICAgICBpZiAoZkNoYW5uZWxzID4gOCB8fCBmQ2hhbm5lbHMgPCAxKSB7Ci0gICAgICAgICAgICAgcHJpbnRmKCJFcnJvcjogVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGZpbGUgY2hhbm5lbHMgOiAlZFxuIiwgZkNoYW5uZWxzKTsKLSAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLmZDaGFubmVscyA9IGZDaGFubmVsczsKLSAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwiLU0iKSkgewotICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtcy5tb25vTW9kZSA9IHRydWU7Ci0gICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWJhc3Nsdmw6IiwgOSkpIHsKLSAgICAgIGNvbnN0IGludCBiYXNzRWZmZWN0TGV2ZWwgPSBhdG9pKGFyZ3ZbaV0gKyA5KTsKLSAgICAgIGlmIChiYXNzRWZmZWN0TGV2ZWwgPiBMVk1fQkVfTUFYX0VGRkVDVExFVkVMIHx8IGJhc3NFZmZlY3RMZXZlbCA8IExWTV9CRV9NSU5fRUZGRUNUTEVWRUwpIHsKLSAgICAgICAgcHJpbnRmKCJFcnJvcjogVW5zdXBwb3J0ZWQgQmFzcyBFZmZlY3QgTGV2ZWwgOiAlZFxuIiwKLSAgICAgICAgICAgICAgIGJhc3NFZmZlY3RMZXZlbCk7CisgICAgaWYgKGluZmlsZSA9PSBudWxscHRyIHx8IG91dGZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICBwcmludGYoIkVycm9yOiBtaXNzaW5nIGlucHV0L291dHB1dCBmaWxlc1xuIik7CiAgICAgICAgIHByaW50VXNhZ2UoKTsKICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgbHZtQ29uZmlnUGFyYW1zLmJhc3NFZmZlY3RMZXZlbCA9IGJhc3NFZmZlY3RMZXZlbDsKLSAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItZXFQcmVzZXQ6IiwgMTApKSB7Ci0gICAgICBjb25zdCBpbnQgZXFQcmVzZXRMZXZlbCA9IGF0b2koYXJndltpXSArIDEwKTsKLSAgICAgIGNvbnN0IGludCBudW1QcmVzZXRMdmxzID0gc3RkOjpzaXplKGdFcXVhbGl6ZXJQcmVzZXRzKTsKLSAgICAgIGlmIChlcVByZXNldExldmVsID49IG51bVByZXNldEx2bHMgfHwgZXFQcmVzZXRMZXZlbCA8IDApIHsKLSAgICAgICAgcHJpbnRmKCJFcnJvcjogVW5zdXBwb3J0ZWQgRXF1YWxpemVyIFByZXNldCA6ICVkXG4iLCBlcVByZXNldExldmVsKTsKLSAgICAgICAgcHJpbnRVc2FnZSgpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBsdm1Db25maWdQYXJhbXMuZXFQcmVzZXRMZXZlbCA9IGVxUHJlc2V0TGV2ZWw7Ci0gICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItYkUiKSkgewotICAgICAgbHZtQ29uZmlnUGFyYW1zLmJhc3NFbmFibGUgPSBMVk1fQkVfT047Ci0gICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItZXFFIikpIHsKLSAgICAgIGx2bUNvbmZpZ1BhcmFtcy5lcUVuYWJsZSA9IExWTV9FUU5CX09OOwotICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXRFIikpIHsKLSAgICAgIGx2bUNvbmZpZ1BhcmFtcy50cmVibGVFbmFibGUgPSBMVk1fVEVfT047Ci0gICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItY3NFIikpIHsKLSAgICAgIGx2bUNvbmZpZ1BhcmFtcy5jc0VuYWJsZSA9IExWTV9NT0RFX09OOwotICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWgiKSkgewotICAgICAgcHJpbnRVc2FnZSgpOwotICAgICAgcmV0dXJuIDA7CiAgICAgfQotICB9CiAKLSAgaWYgKGluZmlsZSA9PSBudWxscHRyIHx8IG91dGZpbGUgPT0gbnVsbHB0cikgewotICAgIHByaW50ZigiRXJyb3I6IG1pc3NpbmcgaW5wdXQvb3V0cHV0IGZpbGVzXG4iKTsKLSAgICBwcmludFVzYWdlKCk7Ci0gICAgcmV0dXJuIC0xOwotICB9CisgICAgRklMRSogZmlucCA9IGZvcGVuKGluZmlsZSwgInJiIik7CisgICAgaWYgKGZpbnAgPT0gbnVsbHB0cikgeworICAgICAgICBwcmludGYoIkNhbm5vdCBvcGVuIGlucHV0IGZpbGUgJXMiLCBpbmZpbGUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0gIEZJTEUgKmZpbnAgPSBmb3BlbihpbmZpbGUsICJyYiIpOwotICBpZiAoZmlucCA9PSBudWxscHRyKSB7Ci0gICAgcHJpbnRmKCJDYW5ub3Qgb3BlbiBpbnB1dCBmaWxlICVzIiwgaW5maWxlKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KKyAgICBGSUxFKiBmb3V0ID0gZm9wZW4ob3V0ZmlsZSwgIndiIik7CisgICAgaWYgKGZvdXQgPT0gbnVsbHB0cikgeworICAgICAgICBwcmludGYoIkNhbm5vdCBvcGVuIG91dHB1dCBmaWxlICVzIiwgb3V0ZmlsZSk7CisgICAgICAgIGZjbG9zZShmaW5wKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotICBGSUxFICpmb3V0ID0gZm9wZW4ob3V0ZmlsZSwgIndiIik7Ci0gIGlmIChmb3V0ID09IG51bGxwdHIpIHsKLSAgICBwcmludGYoIkNhbm5vdCBvcGVuIG91dHB1dCBmaWxlICVzIiwgb3V0ZmlsZSk7CisgICAgRWZmZWN0Q29udGV4dCBjb250ZXh0OworICAgIExWTV9Db250cm9sUGFyYW1zX3QgcGFyYW1zOworICAgIGludCBlcnJDb2RlID0gbHZtQ3JlYXRlKCZjb250ZXh0LCAmbHZtQ29uZmlnUGFyYW1zLCAmcGFyYW1zKTsKKyAgICBpZiAoZXJyQ29kZSA9PSAwKSB7CisgICAgICAgIGVyckNvZGUgPSBsdm1NYWluUHJvY2VzcygmY29udGV4dCwgJnBhcmFtcywgJmx2bUNvbmZpZ1BhcmFtcywgZmlucCwgZm91dCk7CisgICAgICAgIGlmIChlcnJDb2RlICE9IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiRXJyb3I6IGx2bU1haW5Qcm9jZXNzIHJldHVybmVkIHdpdGggdGhlIGVycm9yOiAlZCIsIGVyckNvZGUpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJFcnJvcjogbHZtQ3JlYXRlIHJldHVybmVkIHdpdGggdGhlIGVycm9yOiAlZCIsIGVyckNvZGUpOworICAgIH0KICAgICBmY2xvc2UoZmlucCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgRWZmZWN0Q29udGV4dCBjb250ZXh0OwotICBMVk1fQ29udHJvbFBhcmFtc190IHBhcmFtczsKLSAgaW50IGVyckNvZGUgPSBsdm1DcmVhdGUoJmNvbnRleHQsICZsdm1Db25maWdQYXJhbXMsICZwYXJhbXMpOwotICBpZiAoZXJyQ29kZSA9PSAwKSB7Ci0gICAgZXJyQ29kZSA9IGx2bU1haW5Qcm9jZXNzKCZjb250ZXh0LCAmcGFyYW1zLCAmbHZtQ29uZmlnUGFyYW1zLCBmaW5wLCBmb3V0KTsKLSAgICBpZiAoZXJyQ29kZSAhPSAwKSB7Ci0gICAgICBwcmludGYoIkVycm9yOiBsdm1NYWluUHJvY2VzcyByZXR1cm5lZCB3aXRoIHRoZSBlcnJvcjogJWQiLGVyckNvZGUpOworICAgIGZjbG9zZShmb3V0KTsKKyAgICAvKiBGcmVlIHRoZSBhbGxvY2F0ZWQgYnVmZmVycyAqLworICAgIGlmIChjb250ZXh0LnBCdW5kbGVkQ29udGV4dCAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChjb250ZXh0LnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIExWTV9EZWxJbnN0YW5jZUhhbmRsZSgmY29udGV4dC5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShjb250ZXh0LnBCdW5kbGVkQ29udGV4dCk7CiAgICAgfQotICB9IGVsc2UgewotICAgIHByaW50ZigiRXJyb3I6IGx2bUNyZWF0ZSByZXR1cm5lZCB3aXRoIHRoZSBlcnJvcjogJWQiLCBlcnJDb2RlKTsKLSAgfQotICBmY2xvc2UoZmlucCk7Ci0gIGZjbG9zZShmb3V0KTsKLSAgLyogRnJlZSB0aGUgYWxsb2NhdGVkIGJ1ZmZlcnMgKi8KLSAgaWYgKGNvbnRleHQucEJ1bmRsZWRDb250ZXh0ICE9IG51bGxwdHIpIHsKLSAgICBpZiAoY29udGV4dC5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSAhPSBudWxscHRyKSB7Ci0gICAgICBMdm1FZmZlY3RfZnJlZSgmY29udGV4dCk7Ci0gICAgfQotICAgIGZyZWUoY29udGV4dC5wQnVuZGxlZENvbnRleHQpOwotICB9CiAKLSAgaWYgKGVyckNvZGUpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIDA7CisgICAgaWYgKGVyckNvZGUpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL3JldmVyYl90ZXN0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL3JldmVyYl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmI2OTcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvcmV2ZXJiX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNDAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJFZmZlY3RSZXZlcmIuaCIKKworLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAorZXh0ZXJuIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU07CisKKy8vIEdsb2JhbCBWYXJpYWJsZXMKK2VudW0gUmV2ZXJiUGFyYW1zIHsKKyAgICBBUkdfSEVMUCA9IDEsCisgICAgQVJHX0lOUFVULAorICAgIEFSR19PVVRQVVQsCisgICAgQVJHX0ZTLAorICAgIEFSR19DSF9NQVNLLAorICAgIEFSR19QUkVTRVQsCisgICAgQVJHX0FVWCwKKyAgICBBUkdfTU9OT19NT0RFLAorICAgIEFSR19GSUxFX0NILAorfTsKKworY29uc3QgZWZmZWN0X3V1aWRfdCBrUmV2ZXJiVXVpZHNbXSA9IHsKKyAgICAgICAgezB4MTcyY2RmMDAsCisgICAgICAgICAweGEzYmMsCisgICAgICAgICAweDExZGYsCisgICAgICAgICAweGE3MmYsCisgICAgICAgICB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gcHJlc2V0LWluc2VydCBtb2RlCisgICAgICAgIHsweGYyOWExNDAwLAorICAgICAgICAgMHhhM2JiLAorICAgICAgICAgMHgxMWRmLAorICAgICAgICAgMHg4ZGRjLAorICAgICAgICAgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgIC8vIHByZXNldC1hdXggbW9kZQorfTsKKworLy8gc3RydWN0dXJlcworc3RydWN0IHJldmVyYkNvbmZpZ1BhcmFtc190IHsKKyAgICBpbnQgZkNoYW5uZWxzID0gMjsKKyAgICBpbnQgbW9ub01vZGUgPSBmYWxzZTsKKyAgICBpbnQgZnJhbWVMZW5ndGggPSAyNTY7CisgICAgaW50IHByZXNldCA9IDA7CisgICAgaW50IG5yQ2hhbm5lbHMgPSAyOworICAgIGludCBzYW1wbGVSYXRlID0gNDgwMDA7CisgICAgaW50IGF1eGlsaWFyeSA9IDA7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworfTsKKworY29uc3RleHByIGF1ZGlvX2NoYW5uZWxfbWFza190IGtSZXZlcmJDb25maWdDaE1hc2tbXSA9IHsKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfTU9OTywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQwUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF9RVUFELAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0ssCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfU1VSUk9VTkQsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS180LAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF9QRU5UQSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzUsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDFQT0lOVDIsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfNlBPSU5UMSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzcsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFQT0lOVDIsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS184LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEwLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTEsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEzLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTQsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE2LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTcsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xOCwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE5LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjAsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIyLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjMsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yNCwKK307CisKK2NvbnN0ZXhwciBpbnQga1JldmVyYkNvbmZpZ0NoTWFza0NvdW50ID0gc3RkOjpzaXplKGtSZXZlcmJDb25maWdDaE1hc2spOworCitpbnQgcmV2ZXJiQ3JlYXRlRWZmZWN0KGVmZmVjdF9oYW5kbGVfdCogcEVmZmVjdEhhbmRsZSwgZWZmZWN0X2NvbmZpZ190KiBwQ29uZmlnLCBpbnQgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW9JZCwgaW50IGF1eEZsYWcpIHsKKyAgICBpZiAoaW50IHN0YXR1cyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLmNyZWF0ZV9lZmZlY3QoJmtSZXZlcmJVdWlkc1thdXhGbGFnXSwgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb0lkLCBwRWZmZWN0SGFuZGxlKTsKKyAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIlJldmVyYiBjcmVhdGUgcmV0dXJuZWQgYW4gZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICAgaW50IHJlcGx5ID0gMDsKKyAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAgICgqKnBFZmZlY3RIYW5kbGUpCisgICAgICAgICAgICAtPmNvbW1hbmQoKnBFZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX0NPTkZJRywgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCksIHBDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICByZXR1cm4gcmVwbHk7Cit9CisKK2ludCByZXZlcmJTZXRDb25maWdQYXJhbSh1aW50MzJfdCBwYXJhbVR5cGUsIHVpbnQzMl90IHBhcmFtVmFsdWUsIGVmZmVjdF9oYW5kbGVfdCBlZmZlY3RIYW5kbGUpIHsKKyAgICBpbnQgcmVwbHkgPSAwOworICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihyZXBseSk7CisgICAgdWludDMyX3QgcGFyYW1EYXRhWzJdID0ge3BhcmFtVHlwZSwgcGFyYW1WYWx1ZX07CisgICAgZWZmZWN0X3BhcmFtX3QqIGVmZmVjdFBhcmFtID0gKGVmZmVjdF9wYXJhbV90KiltYWxsb2Moc2l6ZW9mKCplZmZlY3RQYXJhbSkgKyBzaXplb2YocGFyYW1EYXRhKSk7CisgICAgbWVtY3B5KCZlZmZlY3RQYXJhbS0+ZGF0YVswXSwgJnBhcmFtRGF0YVswXSwgc2l6ZW9mKHBhcmFtRGF0YSkpOworICAgIGVmZmVjdFBhcmFtLT5wc2l6ZSA9IHNpemVvZihwYXJhbURhdGFbMF0pOworICAgIGVmZmVjdFBhcmFtLT52c2l6ZSA9IHNpemVvZihwYXJhbURhdGFbMV0pOworICAgIGludCBzdGF0dXMgPSAoKmVmZmVjdEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAtPmNvbW1hbmQoZWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihwYXJhbURhdGEpLCBlZmZlY3RQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICBmcmVlKGVmZmVjdFBhcmFtKTsKKyAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIlJldmVyYiBzZXQgY29uZmlnIHJldHVybmVkIGFuIGVycm9yID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiByZXBseTsKK30KKwordm9pZCBwcmludFVzYWdlKCkgeworICAgIHByaW50ZigiXG5Vc2FnZTogIik7CisgICAgcHJpbnRmKCJcbiAgICAgPGV4ZWN1dGFibGU+IFtvcHRpb25zXVxuIik7CisgICAgcHJpbnRmKCJcbndoZXJlIG9wdGlvbnMgYXJlLCAiKTsKKyAgICBwcmludGYoIlxuICAgICAtLWlucHV0IDxpbnB1dGZpbGU+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgcGF0aCB0byB0aGUgaW5wdXQgZmlsZSIpOworICAgIHByaW50ZigiXG4gICAgIC0tb3V0cHV0IDxvdXRwdXRmaWxlPiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIHBhdGggdG8gdGhlIG91dHB1dCBmaWxlIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1oZWxwIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgcHJpbnRzIHRoaXMgdXNhZ2UgaW5mb3JtYXRpb24iKTsKKyAgICBwcmludGYoIlxuICAgICAtLWNoTWFzayA8Y2hhbm5lbF9tYXNrPlxuIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMCAgLSBBVURJT19DSEFOTkVMX09VVF9NT05PIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMSAgLSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAyICAtIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDEiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAzICAtIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDBQT0lOVDIiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICA0ICAtIEFVRElPX0NIQU5ORUxfT1VUX1FVQUQiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICA1ICAtIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfQkFDSyIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDYgIC0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgNyAgLSBBVURJT19DSEFOTkVMX09VVF9TVVJST1VORCIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDggIC0gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggbWFzayBmb3IgNCBjaDogKDEgPDwgNCkgLSAxIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgOSAgLSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMTAgLSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMTEgLSBBVURJT19DSEFOTkVMX09VVF9QRU5UQSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDEyIC0gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggbWFzayBmb3IgNSBjaDogKDEgPDwgNSkgLSAxIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMTMgLSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMTQgLSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMTUgLSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0siKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAxNiAtIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDE3IC0gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggbWFzayBmb3IgNiBjaDogKDEgPDwgNikgLSAxIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMTggLSBBVURJT19DSEFOTkVMX09VVF82UE9JTlQxIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMTkgLSBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCBtYXNrIGZvciA3IGNoOiAoMSA8PCA3KSAtIDEiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAyMCAtIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFQT0lOVDIiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAyMSAtIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAyMiAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDggY2g6ICgxIDw8IDgpIC0gMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgMCIpOworICAgIHByaW50ZigiXG4gICAgIC0tZnMgPHNhbXBsaW5nX2ZyZXE+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgU2FtcGxpbmcgZnJlcXVlbmN5IGluIEh6LCBkZWZhdWx0IDQ4MDAwLiIpOworICAgIHByaW50ZigiXG4gICAgIC0tcHJlc2V0IDxwcmVzZXRfdmFsdWU+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMCAtIE5vbmUiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAxIC0gU21hbGwgUm9vbSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDIgLSBNZWRpdW0gUm9vbSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDMgLSBMYXJnZSBSb29tIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgNCAtIE1lZGl1bSBIYWxsIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgNSAtIExhcmdlIEhhbGwiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICA2IC0gUGxhdGUiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBkZWZhdWx0IDAiKTsKKyAgICBwcmludGYoIlxuICAgICAtLWZjaCA8ZmlsZV9jaGFubmVscz4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBudW1iZXIgb2YgY2hhbm5lbHMgaW4gaW5wdXQgZmlsZSAoMSB0aHJvdWdoIDgpLCBkZWZhdWx0IDEiKTsKKyAgICBwcmludGYoIlxuICAgICAtLU0iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBNb25vIG1vZGUgKGZvcmNlIGFsbCBpbnB1dCBhdWRpbyBjaGFubmVscyB0byBiZSBpZGVudGljYWwpIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1hdXggPGF1eGlsaWFyeV9mbGFnPiAiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAwIC0gSW5zZXJ0IE1vZGUgb24iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAxIC0gYXV4aWxpYXJ5IE1vZGUgb24iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBkZWZhdWx0IDAiKTsKKyAgICBwcmludGYoIlxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiBhcmd2W10pIHsKKyAgICBpZiAoYXJnYyA9PSAxKSB7CisgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIlcyAiLCBhcmd2W2ldKTsKKyAgICB9CisgICAgcmV2ZXJiQ29uZmlnUGFyYW1zX3QgcmV2Q29uZmlnUGFyYW1ze307ICAvLyBkZWZhdWx0IGluaXRpYWxpemUKKyAgICBjb25zdCBjaGFyKiBpbnB1dEZpbGUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIqIG91dHB1dEZpbGUgPSBudWxscHRyOworCisgICAgY29uc3Qgb3B0aW9uIGxvbmdfb3B0c1tdID0geworICAgICAgICAgICAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIG51bGxwdHIsIEFSR19IRUxQfSwKKyAgICAgICAgICAgIHsiaW5wdXQiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0lOUFVUfSwKKyAgICAgICAgICAgIHsib3V0cHV0IiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19PVVRQVVR9LAorICAgICAgICAgICAgeyJmcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfRlN9LAorICAgICAgICAgICAgeyJjaE1hc2siLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0NIX01BU0t9LAorICAgICAgICAgICAgeyJwcmVzZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX1BSRVNFVH0sCisgICAgICAgICAgICB7ImF1eCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfQVVYfSwKKyAgICAgICAgICAgIHsiTSIsIG5vX2FyZ3VtZW50LCAmcmV2Q29uZmlnUGFyYW1zLm1vbm9Nb2RlLCB0cnVlfSwKKyAgICAgICAgICAgIHsiZmNoIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19GSUxFX0NIfSwKKyAgICAgICAgICAgIHtudWxscHRyLCAwLCBudWxscHRyLCAwfSwKKyAgICB9OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgY29uc3QgaW50IG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIChjaGFyKiBjb25zdCopYXJndiwgImk6bzoiLCBsb25nX29wdHMsIG51bGxwdHIpOworICAgICAgICBpZiAob3B0ID09IC0xKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgICAgICAgY2FzZSBBUkdfSEVMUDoKKyAgICAgICAgICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKyAgICAgICAgICAgIGNhc2UgQVJHX0lOUFVUOiB7CisgICAgICAgICAgICAgICAgaW5wdXRGaWxlID0gKGNoYXIqKW9wdGFyZzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQVJHX09VVFBVVDogeworICAgICAgICAgICAgICAgIG91dHB1dEZpbGUgPSAoY2hhciopb3B0YXJnOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBUkdfRlM6IHsKKyAgICAgICAgICAgICAgICByZXZDb25maWdQYXJhbXMuc2FtcGxlUmF0ZSA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQVJHX0NIX01BU0s6IHsKKyAgICAgICAgICAgICAgICBpbnQgY2hNYXNrSWR4ID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgICAgIGlmIChjaE1hc2tJZHggPCAwIG9yIGNoTWFza0lkeCA+IGtSZXZlcmJDb25maWdDaE1hc2tDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ2hhbm5lbCBNYXNrIGluZGV4IG5vdCBpbiBjb3JyZWN0IHJhbmdlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXZDb25maWdQYXJhbXMuY2hNYXNrID0ga1JldmVyYkNvbmZpZ0NoTWFza1tjaE1hc2tJZHhdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBUkdfUFJFU0VUOiB7CisgICAgICAgICAgICAgICAgcmV2Q29uZmlnUGFyYW1zLnByZXNldCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQVJHX0FVWDogeworICAgICAgICAgICAgICAgIHJldkNvbmZpZ1BhcmFtcy5hdXhpbGlhcnkgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFSR19NT05PX01PREU6IHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQVJHX0ZJTEVfQ0g6IHsKKyAgICAgICAgICAgICAgICByZXZDb25maWdQYXJhbXMuZkNoYW5uZWxzID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbnB1dEZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRXJyb3I6IG1pc3NpbmcgaW5wdXQgZmlsZXNcbiIpOworICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxGSUxFLCBkZWNsdHlwZSgmZmNsb3NlKT4gaW5wdXRGcChmb3BlbihpbnB1dEZpbGUsICJyYiIpLCAmZmNsb3NlKTsKKworICAgIGlmIChpbnB1dEZwID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBvcGVuIGlucHV0IGZpbGUgJXNcbiIsIGlucHV0RmlsZSk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgaWYgKG91dHB1dEZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRXJyb3I6IG1pc3Npbmcgb3V0cHV0IGZpbGVzXG4iKTsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RklMRSwgZGVjbHR5cGUoJmZjbG9zZSk+IG91dHB1dEZwKGZvcGVuKG91dHB1dEZpbGUsICJ3YiIpLCAmZmNsb3NlKTsKKworICAgIGlmIChvdXRwdXRGcCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAlc1xuIiwgb3V0cHV0RmlsZSk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgaW50MzJfdCBzZXNzaW9uSWQgPSAxOworICAgIGludDMyX3QgaW9JZCA9IDE7CisgICAgZWZmZWN0X2hhbmRsZV90IGVmZmVjdEhhbmRsZSA9IG51bGxwdHI7CisgICAgZWZmZWN0X2NvbmZpZ190IGNvbmZpZzsKKyAgICBjb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gY29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSByZXZDb25maWdQYXJhbXMuc2FtcGxlUmF0ZTsKKyAgICBjb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBjb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gcmV2Q29uZmlnUGFyYW1zLmNoTWFzazsKKyAgICBjb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gY29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgIGlmIChpbnQgc3RhdHVzID0gcmV2ZXJiQ3JlYXRlRWZmZWN0KCZlZmZlY3RIYW5kbGUsICZjb25maWcsIHNlc3Npb25JZCwgaW9JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZDb25maWdQYXJhbXMuYXV4aWxpYXJ5KTsKKyAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIkNyZWF0ZSBlZmZlY3QgY2FsbCByZXR1cm5lZCBlcnJvciAlaSIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgaW50IHJlcGx5ID0gMDsKKyAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAgICgqZWZmZWN0SGFuZGxlKS0+Y29tbWFuZChlZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfRU5BQkxFLCAwLCBudWxscHRyLCAmcmVwbHlTaXplLCAmcmVwbHkpOworICAgIGlmIChyZXBseSAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJDb21tYW5kIGVuYWJsZSBjYWxsIHJldHVybmVkIGVycm9yICVkXG4iLCByZXBseSk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgaWYgKGludCBzdGF0dXMgPSByZXZlcmJTZXRDb25maWdQYXJhbShSRVZFUkJfUEFSQU1fUFJFU0VULCAodWludDMyX3QpcmV2Q29uZmlnUGFyYW1zLnByZXNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEhhbmRsZSk7CisgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHJldmVyYiBwcmVzZXQuIEVycm9yICVkXG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIHJldkNvbmZpZ1BhcmFtcy5uckNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHJldkNvbmZpZ1BhcmFtcy5jaE1hc2spOworICAgIGNvbnN0IGludCBjaGFubmVsQ291bnQgPSByZXZDb25maWdQYXJhbXMubnJDaGFubmVsczsKKyAgICBjb25zdCBpbnQgZnJhbWVMZW5ndGggPSByZXZDb25maWdQYXJhbXMuZnJhbWVMZW5ndGg7CisjaWZkZWYgQllQQVNTX0VYRUMKKyAgICBjb25zdCBpbnQgZnJhbWVTaXplID0gKGludCljaGFubmVsQ291bnQgKiBzaXplb2YoZmxvYXQpOworI2VuZGlmCisgICAgY29uc3QgaW50IGlvQ2hhbm5lbENvdW50ID0gcmV2Q29uZmlnUGFyYW1zLmZDaGFubmVsczsKKyAgICBjb25zdCBpbnQgaW9GcmFtZVNpemUgPSBpb0NoYW5uZWxDb3VudCAqIHNpemVvZihzaG9ydCk7CisgICAgY29uc3QgaW50IG1heENoYW5uZWxDb3VudCA9IHN0ZDo6bWF4KGNoYW5uZWxDb3VudCwgaW9DaGFubmVsQ291bnQpOworCisgICAgc3RkOjp2ZWN0b3I8c2hvcnQ+IGluKGZyYW1lTGVuZ3RoICogbWF4Q2hhbm5lbENvdW50KTsKKyAgICBzdGQ6OnZlY3RvcjxzaG9ydD4gb3V0KGZyYW1lTGVuZ3RoICogbWF4Q2hhbm5lbENvdW50KTsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gZmxvYXRJbihmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGZsb2F0T3V0KGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKKworICAgIGludCBmcmFtZUNvdW50ZXIgPSAwOworCisgICAgd2hpbGUgKGZyZWFkKGluLmRhdGEoKSwgaW9GcmFtZVNpemUsIGZyYW1lTGVuZ3RoLCBpbnB1dEZwLmdldCgpKSA9PSAoc2l6ZV90KWZyYW1lTGVuZ3RoKSB7CisgICAgICAgIGlmIChpb0NoYW5uZWxDb3VudCAhPSBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgICAgIGFkanVzdF9jaGFubmVscyhpbi5kYXRhKCksIGlvQ2hhbm5lbENvdW50LCBpbi5kYXRhKCksIGNoYW5uZWxDb3VudCwgc2l6ZW9mKHNob3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbmd0aCAqIGlvRnJhbWVTaXplKTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoZmxvYXRJbi5kYXRhKCksIGluLmRhdGEoKSwgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworCisgICAgICAgIC8vIE1vbm8gbW9kZSB3aWxsIHJlcGxpY2F0ZSB0aGUgZmlyc3QgY2hhbm5lbCB0byBhbGwgb3RoZXIgY2hhbm5lbHMuCisgICAgICAgIC8vIFRoaXMgZW5zdXJlcyBhbGwgYXVkaW8gY2hhbm5lbHMgYXJlIGlkZW50aWNhbC4gVGhpcyBpcyB1c2VmdWwgZm9yIHRlc3RpbmcKKyAgICAgICAgLy8gQmFzcyBCb29zdCwgd2hpY2ggZXh0cmFjdHMgYSBtb25vIHNpZ25hbCBmb3IgcHJvY2Vzc2luZy4KKyAgICAgICAgaWYgKHJldkNvbmZpZ1BhcmFtcy5tb25vTW9kZSAmJiBjaGFubmVsQ291bnQgPiAxKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lTGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBhdXRvKiBmcCA9ICZmbG9hdEluW2kgKiBjaGFubmVsQ291bnRdOworICAgICAgICAgICAgICAgIHN0ZDo6ZmlsbChmcCArIDEsIGZwICsgY2hhbm5lbENvdW50LCAqZnApOyAgLy8gcmVwbGljYXRlIGNoIDAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGF1ZGlvX2J1ZmZlcl90IGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXI7CisgICAgICAgIGlucHV0QnVmZmVyLmZyYW1lQ291bnQgPSBvdXRwdXRCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lTGVuZ3RoOworICAgICAgICBpbnB1dEJ1ZmZlci5mMzIgPSBmbG9hdEluLmRhdGEoKTsKKyAgICAgICAgb3V0cHV0QnVmZmVyLmYzMiA9IGZsb2F0T3V0LmRhdGEoKTsKKyNpZm5kZWYgQllQQVNTX0VYRUMKKyAgICAgICAgaWYgKGludCBzdGF0dXMgPSAoKmVmZmVjdEhhbmRsZSktPnByb2Nlc3MoZWZmZWN0SGFuZGxlLCAmaW5wdXRCdWZmZXIsICZvdXRwdXRCdWZmZXIpOworICAgICAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJcbkVycm9yOiBQcm9jZXNzIHJldHVybmVkIHdpdGggZXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisjZWxzZQorICAgICAgICBtZW1jcHkoZmxvYXRPdXQuZGF0YSgpLCBmbG9hdEluLmRhdGEoKSwgZnJhbWVMZW5ndGggKiBmcmFtZVNpemUpOworI2VuZGlmCisgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChvdXQuZGF0YSgpLCBmbG9hdE91dC5kYXRhKCksIGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKKworICAgICAgICBpZiAoaW9DaGFubmVsQ291bnQgIT0gY2hhbm5lbENvdW50KSB7CisgICAgICAgICAgICBhZGp1c3RfY2hhbm5lbHMob3V0LmRhdGEoKSwgY2hhbm5lbENvdW50LCBvdXQuZGF0YSgpLCBpb0NoYW5uZWxDb3VudCwgc2l6ZW9mKHNob3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihzaG9ydCkpOworICAgICAgICB9CisgICAgICAgICh2b2lkKWZ3cml0ZShvdXQuZGF0YSgpLCBpb0ZyYW1lU2l6ZSwgZnJhbWVMZW5ndGgsIG91dHB1dEZwLmdldCgpKTsKKyAgICAgICAgZnJhbWVDb3VudGVyICs9IGZyYW1lTGVuZ3RoOworICAgIH0KKworICAgIGlmIChpbnQgc3RhdHVzID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0ucmVsZWFzZV9lZmZlY3QoZWZmZWN0SGFuZGxlKTsgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvIFByZXByb2Nlc3NpbmcgcmVsZWFzZSByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICBwcmludGYoImZyYW1lQ291bnRlcjogWyVkXVxuIiwgZnJhbWVDb3VudGVyKTsKKworICAgIHJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9zbnIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvc25yLmNwcAppbmRleCA4ODU5OTRjLi4wZmVmMzM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9zbnIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL3Nuci5jcHAKQEAgLTIyLDg0ICsyMiw4MyBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEEgPSBmbG9hdD4KLXN0ZDo6cGFpcjxBLCBBPiBnZXRTaWduYWxOb2lzZShGSUxFICpmaW5wLCBGSUxFICpmcmVmKSB7Ci0gIGNvbnN0ZXhwciBzaXplX3QgZnJhbWVzaXplID0gMjU2OwotICBzdGQ6OnZlY3RvcjxUPiBpbihmcmFtZXNpemUpOwotICBzdGQ6OnZlY3RvcjxUPiByZWYoZnJhbWVzaXplKTsKLSAgQSBzaWduYWx7fTsKLSAgQSBub2lzZXt9Oworc3RkOjpwYWlyPEEsIEE+IGdldFNpZ25hbE5vaXNlKEZJTEUqIGZpbnAsIEZJTEUqIGZyZWYpIHsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGZyYW1lc2l6ZSA9IDI1NjsKKyAgICBzdGQ6OnZlY3RvcjxUPiBpbihmcmFtZXNpemUpOworICAgIHN0ZDo6dmVjdG9yPFQ+IHJlZihmcmFtZXNpemUpOworICAgIEEgc2lnbmFse307CisgICAgQSBub2lzZXt9OwogCi0gIGZvciAoOzspIHsKLSAgICBzaXplX3QgcmVhZF9zYW1wbGVzX2luID0gZnJlYWQoJmluWzBdLCBzaXplb2YoVCksIGZyYW1lc2l6ZSwgZmlucCk7Ci0gICAgY29uc3Qgc2l6ZV90IHJlYWRfc2FtcGxlc19yZWYgPSBmcmVhZCgmcmVmWzBdLCBzaXplb2YoVCksIGZyYW1lc2l6ZSwgZnJlZik7Ci0gICAgaWYgKHJlYWRfc2FtcGxlc19pbiAhPSByZWFkX3NhbXBsZXNfcmVmKSB7Ci0gICAgICBwcmludGYoImZpbGUgc2l6ZXMgZG8gbm90IG1hdGNoIChsYXN0ICV6dSAlenUpIiwgcmVhZF9zYW1wbGVzX2luLCByZWFkX3NhbXBsZXNfcmVmKTsKLSAgICAgIHJlYWRfc2FtcGxlc19pbiA9IHN0ZDo6bWluKHJlYWRfc2FtcGxlc19pbiwgcmVhZF9zYW1wbGVzX3JlZik7CisgICAgZm9yICg7OykgeworICAgICAgICBzaXplX3QgcmVhZF9zYW1wbGVzX2luID0gZnJlYWQoJmluWzBdLCBzaXplb2YoVCksIGZyYW1lc2l6ZSwgZmlucCk7CisgICAgICAgIGNvbnN0IHNpemVfdCByZWFkX3NhbXBsZXNfcmVmID0gZnJlYWQoJnJlZlswXSwgc2l6ZW9mKFQpLCBmcmFtZXNpemUsIGZyZWYpOworICAgICAgICBpZiAocmVhZF9zYW1wbGVzX2luICE9IHJlYWRfc2FtcGxlc19yZWYpIHsKKyAgICAgICAgICAgIHByaW50ZigiZmlsZSBzaXplcyBkbyBub3QgbWF0Y2ggKGxhc3QgJXp1ICV6dSkiLCByZWFkX3NhbXBsZXNfaW4sIHJlYWRfc2FtcGxlc19yZWYpOworICAgICAgICAgICAgcmVhZF9zYW1wbGVzX2luID0gc3RkOjptaW4ocmVhZF9zYW1wbGVzX2luLCByZWFkX3NhbXBsZXNfcmVmKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVhZF9zYW1wbGVzX2luID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiB7c2lnbmFsLCBub2lzZX07CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWFkX3NhbXBsZXNfaW47ICsraSkgeworICAgICAgICAgICAgY29uc3QgQSB2YWx1ZShyZWZbaV0pOworICAgICAgICAgICAgY29uc3QgQSBkaWZmKEEoaW5baV0pIC0gdmFsdWUpOworICAgICAgICAgICAgc2lnbmFsICs9IHZhbHVlICogdmFsdWU7CisgICAgICAgICAgICBub2lzZSArPSBkaWZmICogZGlmZjsKKyAgICAgICAgfQogICAgIH0KLSAgICBpZiAocmVhZF9zYW1wbGVzX2luID09IDApIHsKLSAgICAgICAgcmV0dXJuIHsgc2lnbmFsLCBub2lzZSB9OwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlYWRfc2FtcGxlc19pbjsgKytpKSB7Ci0gICAgICAgY29uc3QgQSB2YWx1ZShyZWZbaV0pOwotICAgICAgIGNvbnN0IEEgZGlmZihBKGluW2ldKSAtIHZhbHVlKTsKLSAgICAgICBzaWduYWwgKz0gdmFsdWUgKiB2YWx1ZTsKLSAgICAgICBub2lzZSArPSBkaWZmICogZGlmZjsKLSAgICB9Ci0gIH0KIH0KIAogdm9pZCBwcmludFVzYWdlKCkgewotICBwcmludGYoIlxuVXNhZ2U6ICIpOwotICBwcmludGYoIlxuICAgICBzbnIgPHJlZl9maWxlPiA8dGVzdF9maWxlPiBbb3B0aW9uc11cbiIpOwotICBwcmludGYoIlxud2hlcmUsIFxuICAgICA8cmVmX2ZpbGU+ICBpcyB0aGUgcmVmZXJlbmNlIGZpbGUgbmFtZSIpOwotICBwcmludGYoIlxuICAgICAgICAgICAgICAgICAgb24gd2hpY2ggd2lsbCBiZSB0YWtlbiBhcyBwdXJlIHNpZ25hbCIpOwotICBwcmludGYoIlxuICAgICA8dGVzdF9maWxlPiBpcyB0ZXN0IGZpbGUgZm9yIHNuciBjYWxjdWxhdGlvbiIpOwotICBwcmludGYoIlxuICAgICBhbmQgb3B0aW9ucyBhcmUgbWVudGlvbmVkIGJlbG93Iik7Ci0gIHByaW50ZigiXG4iKTsKLSAgcHJpbnRmKCJcbiAgICAgLXBjbV9mb3JtYXQ6PHBjbSBmb3JtYXQgb2YgaW5wdXQgZmlsZXM+Iik7Ci0gIHByaW50ZigiXG4gICAgICAgICAgIDAgLSAxNiBiaXQgcGNtIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAgIDEgLSAzMiBiaXQgZmxvYXQiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgICAgZGVmYXVsdCAwIik7Ci0gIHByaW50ZigiXG4gICAgIC10aHI6PHRocmVzaG9sZCB2YWx1ZT4iKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgICAgZGVmYXVsdCAtIG5lZ2F0aXZlIGluZmluaXR5XG5cbiIpOworICAgIHByaW50ZigiXG5Vc2FnZTogIik7CisgICAgcHJpbnRmKCJcbiAgICAgc25yIDxyZWZfZmlsZT4gPHRlc3RfZmlsZT4gW29wdGlvbnNdXG4iKTsKKyAgICBwcmludGYoIlxud2hlcmUsIFxuICAgICA8cmVmX2ZpbGU+ICBpcyB0aGUgcmVmZXJlbmNlIGZpbGUgbmFtZSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgICAgICAgICBvbiB3aGljaCB3aWxsIGJlIHRha2VuIGFzIHB1cmUgc2lnbmFsIik7CisgICAgcHJpbnRmKCJcbiAgICAgPHRlc3RfZmlsZT4gaXMgdGVzdCBmaWxlIGZvciBzbnIgY2FsY3VsYXRpb24iKTsKKyAgICBwcmludGYoIlxuICAgICBhbmQgb3B0aW9ucyBhcmUgbWVudGlvbmVkIGJlbG93Iik7CisgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiXG4gICAgIC1wY21fZm9ybWF0OjxwY20gZm9ybWF0IG9mIGlucHV0IGZpbGVzPiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDAgLSAxNiBiaXQgcGNtIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMSAtIDMyIGJpdCBmbG9hdCIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgMCIpOworICAgIHByaW50ZigiXG4gICAgIC10aHI6PHRocmVzaG9sZCB2YWx1ZT4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBkZWZhdWx0IC0gbmVnYXRpdmUgaW5maW5pdHlcblxuIik7CiB9CiAKLWludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKLSAgaWYgKGFyZ2MgPCAzKSB7Ci0gICAgcHJpbnRVc2FnZSgpOwotICAgIHJldHVybiAtMTsKLSAgfQotICBpbnQgcGNtX2Zvcm1hdCA9IDA7Ci0gIGZsb2F0IHRociA9IC0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCk7Ci0gIEZJTEUgKmZyZWYgPSBmb3Blbihhcmd2WzFdLCAicmIiKTsKLSAgRklMRSAqZmlucCA9IGZvcGVuKGFyZ3ZbMl0sICJyYiIpOwotICBmb3IgKGludCBpID0gMzsgaSA8IGFyZ2M7IGkrKykgewotICAgIGlmICghc3RybmNtcChhcmd2W2ldLCAiLXBjbV9mb3JtYXQ6IiwgMTIpKSB7Ci0gICAgICBwY21fZm9ybWF0ID0gYXRvaShhcmd2W2ldICsgMTIpOwotICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi10aHI6IiwgNSkpIHsKLSAgICAgIHRociA9IGF0b2YoYXJndltpXSArIDUpOworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGFyZ3ZbXSkgeworICAgIGlmIChhcmdjIDwgMykgeworICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gIH0KLSAgaWYgKGZpbnAgPT0gbnVsbHB0ciB8fCBmcmVmID09IG51bGxwdHIpIHsKLSAgICBwcmludGYoIlxuRXJyb3I6IG1pc3NpbmcgaW5wdXQvcmVmZXJlbmNlIGZpbGVzXG4iKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaW50IHJldCA9IEVYSVRfU1VDQ0VTUzsKLSAgYXV0byBzbiA9IHBjbV9mb3JtYXQgPT0gMAotICAgICAgPyBnZXRTaWduYWxOb2lzZTxzaG9ydD4oZmlucCwgZnJlZikKLSAgICAgIDogZ2V0U2lnbmFsTm9pc2U8ZmxvYXQ+KGZpbnAsIGZyZWYpOwotICBpZiAoc24uZmlyc3QgPiAwLmYgJiYgc24uc2Vjb25kID4gMC5mKSB7Ci0gICAgZmxvYXQgc25yID0gMTAuZiAqIGxvZyhzbi5maXJzdCAvIHNuLnNlY29uZCk7Ci0gICAgLy8gY29tcGFyZSB0aGUgbWVhc3VyZWQgc25yIHZhbHVlIHdpdGggdGhyZXNob2xkCi0gICAgaWYgKHNuciA8IHRocikgewotICAgICAgcHJpbnRmKCIlLjZmIGxlc3MgdGhhbiB0aHJlc2hvbGQgJS42ZlxuIiwgc25yLCB0aHIpOwotICAgICAgcmV0ID0gRVhJVF9GQUlMVVJFOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGYoIiUuNmZcbiIsIHNucik7CisgICAgaW50IHBjbV9mb3JtYXQgPSAwOworICAgIGZsb2F0IHRociA9IC1zdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKTsKKyAgICBGSUxFKiBmcmVmID0gZm9wZW4oYXJndlsxXSwgInJiIik7CisgICAgRklMRSogZmlucCA9IGZvcGVuKGFyZ3ZbMl0sICJyYiIpOworICAgIGZvciAoaW50IGkgPSAzOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgIGlmICghc3RybmNtcChhcmd2W2ldLCAiLXBjbV9mb3JtYXQ6IiwgMTIpKSB7CisgICAgICAgICAgICBwY21fZm9ybWF0ID0gYXRvaShhcmd2W2ldICsgMTIpOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItdGhyOiIsIDUpKSB7CisgICAgICAgICAgICB0aHIgPSBhdG9mKGFyZ3ZbaV0gKyA1KTsKKyAgICAgICAgfQogICAgIH0KLSAgfQotICBmY2xvc2UoZmlucCk7Ci0gIGZjbG9zZShmcmVmKTsKKyAgICBpZiAoZmlucCA9PSBudWxscHRyIHx8IGZyZWYgPT0gbnVsbHB0cikgeworICAgICAgICBwcmludGYoIlxuRXJyb3I6IG1pc3NpbmcgaW5wdXQvcmVmZXJlbmNlIGZpbGVzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpbnQgcmV0ID0gRVhJVF9TVUNDRVNTOworICAgIGF1dG8gc24gPQorICAgICAgICAgICAgcGNtX2Zvcm1hdCA9PSAwID8gZ2V0U2lnbmFsTm9pc2U8c2hvcnQ+KGZpbnAsIGZyZWYpIDogZ2V0U2lnbmFsTm9pc2U8ZmxvYXQ+KGZpbnAsIGZyZWYpOworICAgIGlmIChzbi5maXJzdCA+IDAuZiAmJiBzbi5zZWNvbmQgPiAwLmYpIHsKKyAgICAgICAgZmxvYXQgc25yID0gMTAuZiAqIGxvZyhzbi5maXJzdCAvIHNuLnNlY29uZCk7CisgICAgICAgIC8vIGNvbXBhcmUgdGhlIG1lYXN1cmVkIHNuciB2YWx1ZSB3aXRoIHRocmVzaG9sZAorICAgICAgICBpZiAoc25yIDwgdGhyKSB7CisgICAgICAgICAgICBwcmludGYoIiUuNmYgbGVzcyB0aGFuIHRocmVzaG9sZCAlLjZmXG4iLCBzbnIsIHRocik7CisgICAgICAgICAgICByZXQgPSBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiUuNmZcbiIsIHNucik7CisgICAgICAgIH0KKyAgICB9CisgICAgZmNsb3NlKGZpbnApOworICAgIGZjbG9zZShmcmVmKTsKIAotICByZXR1cm4gcmV0OworICAgIHJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQuYnAKaW5kZXggYWZjNDIyMC4uZTE2OWUzYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5icApAQCAtMSw1ICsxLDI0IEBACiAvLyBtdXNpYyBidW5kbGUgd3JhcHBlcgotY2NfbGlicmFyeV9zaGFyZWQgeworcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYmVmZmVjdHNfbHZtX3dyYXBwZXJfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGliZWZmZWN0c19sdm1fd3JhcHBlcl9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliYnVuZGxld3JhcHBlciIsCiAKICAgICBhcmNoOiB7CkBAIC05LDExICsyOCwxMSBAQAogICAgIH0sCiAKICAgICB2ZW5kb3I6IHRydWUsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgc3JjczogWyJCdW5kbGUvRWZmZWN0QnVuZGxlLmNwcCJdLAogCiAgICAgY3BwZmxhZ3M6IFsKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAotICAgICAgICAiLURTVVBQT1JUX01DIiwKIAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCkBAIC0yNiw3ICs0NSw2IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmRsIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKIApAQCAtMzksNyArNTcsNyBAQAogfQogCiAvLyByZXZlcmIgd3JhcHBlcgotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYnJldmVyYndyYXBwZXIiLAogCiAgICAgYXJjaDogewpAQCAtNDksNiArNjcsNyBAQAogICAgIH0sCiAKICAgICB2ZW5kb3I6IHRydWUsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgc3JjczogWyJSZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcCJdLAogCiAgICAgY3BwZmxhZ3M6IFsKQEAgLTY1LDcgKzg0LDYgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliZGwiLAogICAgICAgICAibGlibG9nIiwKICAgICBdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAppbmRleCA2ZmNhMGU3Li5kZjY0Njc2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKQEAgLTE4LDcgKzE4LDcgQEAKIHR5cGVkZWYgZmxvYXQgTFZNX0ZMT0FUOwogI2VuZGlmCiAjZGVmaW5lIExPR19UQUcgIkJ1bmRsZSIKLSNkZWZpbmUgQVJSQVlfU0laRShhcnJheSkgKHNpemVvZiAoYXJyYXkpIC8gc2l6ZW9mIChhcnJheSlbMF0pCisjZGVmaW5lIEFSUkFZX1NJWkUoYXJyYXkpIChzaXplb2YoYXJyYXkpIC8gc2l6ZW9mKGFycmF5KVswXSkKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPGFzc2VydC5oPgpAQCAtNDIsMjYgKzQyLDMzIEBACiAjaWZkZWYgVkVSWV9WRVJZX1ZFUkJPU0VfTE9HR0lORwogI2RlZmluZSBBTE9HVlYgQUxPR1YKICNlbHNlCi0jZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUgKGZhbHNlKQorI2RlZmluZSBBTE9HVlYoYS4uLikgXAorICAgIGRvIHsgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKGZhbHNlKQogI2VuZGlmCiAKLSNkZWZpbmUgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpe1wKLSAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9OVUxMQUREUkVTUyl7XAotICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIlwKLSAgICAgICAgICAgICAgICAgICAgIm51bGwgcG9pbnRlciByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpO1wKLSAgICAgICAgfVwKLSAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9BTElHTk1FTlRFUlJPUil7XAotICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIlwKLSAgICAgICAgICAgICAgICAgICAgImJhZCBhbGlnbm1lbnQgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTtcCi0gICAgICAgIH1cCi0gICAgICAgIGlmICgoTHZtU3RhdHVzKSA9PSBMVk1fSU5WQUxJRE5VTVNBTVBMRVMpe1wKLSAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICJcCi0gICAgICAgICAgICAgICAgICAgICJiYWQgbnVtYmVyIG9mIHNhbXBsZXMgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTtcCi0gICAgICAgIH1cCi0gICAgICAgIGlmICgoTHZtU3RhdHVzKSA9PSBMVk1fT1VUT0ZSQU5HRSl7XAotICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIlwKLSAgICAgICAgICAgICAgICAgICAgIm91dCBvZiByYW5nZSByZXR1cm5lZCBieSAlcyBpbiAlc1xuIiwgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpO1wKLSAgICAgICAgfVwKKyNkZWZpbmUgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9OVUxMQUREUkVTUykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICJudWxsIHBvaW50ZXIgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9BTElHTk1FTlRFUlJPUikgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICJiYWQgYWxpZ25tZW50IHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9JTlZBTElETlVNU0FNUExFUykgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICJiYWQgbnVtYmVyIG9mIHNhbXBsZXMgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsIFwKKyAgICAgICAgICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9PVVRPRlJBTkdFKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICJvdXQgb2YgcmFuZ2UgcmV0dXJuZWQgYnkgJXMgaW4gJXNcbiIsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9CiAKIC8vIE5hbWVzcGFjZXMKQEAgLTc0LDIwICs4MSwyMSBAQAogaW50IFNlc3Npb25JbmRleFtMVk1fTUFYX1NFU1NJT05TXTsKIAogLyogbG9jYWwgZnVuY3Rpb25zICovCi0jZGVmaW5lIENIRUNLX0FSRyhjb25kKSB7ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghKGNvbmQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogSW52YWxpZCBhcmd1bWVudDogIiNjb25kKTsgICAgICBcCi0gICAgICAgIHJldHVybiAtRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KKyNkZWZpbmUgQ0hFQ0tfQVJHKGNvbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIShjb25kKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEludmFsaWQgYXJndW1lbnQ6ICIgI2NvbmQpOyBcCisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CiAKIC8vIE5YUCBTVyBCYXNzQm9vc3QgVVVJRAogY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnQmFzc0Jvb3N0RGVzY3JpcHRvciA9IHsKLSAgICAgICAgezB4MDYzNGYyMjAsIDB4ZGRkNCwgMHgxMWRiLCAweGEwZmMsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9fSwKLSAgICAgICAgezB4ODYzMWYzMDAsIDB4NzJlMiwgMHgxMWRmLCAweGI1N2UsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sIC8vIHV1aWQKKyAgICAgICAgezB4MDYzNGYyMjAsIDB4ZGRkNCwgMHgxMWRiLCAweGEwZmMsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCisgICAgICAgIHsweDg2MzFmMzAwLCAweDcyZTIsIDB4MTFkZiwgMHhiNTdlLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gdXVpZAogICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKLSAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUIHwgRUZGRUNUX0ZMQUdfREVWSUNFX0lORAotICAgICAgICB8IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMKSwKKyAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUIHwgRUZGRUNUX0ZMQUdfREVWSUNFX0lORCB8CisgICAgICAgICBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCksCiAgICAgICAgIEJBU1NfQk9PU1RfQ1VQX0xPQURfQVJNOUUsCiAgICAgICAgIEJVTkRMRV9NRU1fVVNBR0UsCiAgICAgICAgICJEeW5hbWljIEJhc3MgQm9vc3QiLApAQCAtOTksOCArMTA3LDggQEAKICAgICAgICAgezB4MzdjYzJjMDAsIDB4ZGRkZCwgMHgxMWRiLCAweDg1NzcsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCiAgICAgICAgIHsweDFkNDAzM2MwLCAweDg1NTcsIDB4MTFkZiwgMHg5ZjJkLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAogICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKLSAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1QgfCBFRkZFQ1RfRkxBR19ERVZJQ0VfSU5ECi0gICAgICAgIHwgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwpLAorICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVCB8IEVGRkVDVF9GTEFHX0RFVklDRV9JTkQgfAorICAgICAgICAgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwpLAogICAgICAgICBWSVJUVUFMSVpFUl9DVVBfTE9BRF9BUk05RSwKICAgICAgICAgQlVORExFX01FTV9VU0FHRSwKICAgICAgICAgIlZpcnR1YWxpemVyIiwKQEAgLTEwOSw4ICsxMTcsOCBAQAogCiAvLyBOWFAgU1cgRXF1YWxpemVyIFVVSUQKIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0VxdWFsaXplckRlc2NyaXB0b3IgPSB7Ci0gICAgICAgIHsweDBiZWQ0MzAwLCAweGRkZDYsIDB4MTFkYiwgMHg4ZjM0LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAvLyB0eXBlCi0gICAgICAgIHsweGNlNzcyZjIwLCAweDg0N2QsIDB4MTFkZiwgMHhiYjE3LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAvLyB1dWlkIEVxIE5YUAorICAgICAgICB7MHgwYmVkNDMwMCwgMHhkZGQ2LCAweDExZGIsIDB4OGYzNCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgIC8vIHR5cGUKKyAgICAgICAgezB4Y2U3NzJmMjAsIDB4ODQ3ZCwgMHgxMWRmLCAweGJiMTcsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyB1dWlkIEVxIE5YUAogICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKICAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUIHwgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwpLAogICAgICAgICBFUVVBTElaRVJfQ1VQX0xPQURfQVJNOUUsCkBAIC0xMjEsOCArMTI5LDggQEAKIAogLy8gTlhQIFNXIFZvbHVtZSBVVUlECiBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdWb2x1bWVEZXNjcmlwdG9yID0gewotICAgICAgICB7MHgwOWU4ZWRlMCwgMHhkZGRlLCAweDExZGIsIDB4YjRmNiwgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH19LAotICAgICAgICB7MHgxMTkzNDFhMCwgMHg4NDY5LCAweDExZGYsIDB4ODFmOSwgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH19LCAvL3V1aWQgVk9MIE5YUAorICAgICAgICB7MHgwOWU4ZWRlMCwgMHhkZGRlLCAweDExZGIsIDB4YjRmNiwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgezB4MTE5MzQxYTAsIDB4ODQ2OSwgMHgxMWRmLCAweDgxZjksIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyB1dWlkIFZPTCBOWFAKICAgICAgICAgRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04sCiAgICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUIHwgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwpLAogICAgICAgICBWT0xVTUVfQ1VQX0xPQURfQVJNOUUsCkBAIC0xMzIsNzcgKzE0MCw1MCBAQAogfTsKIAogLy8tLS0gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotdm9pZCBMdm1HbG9iYWxCdW5kbGVfaW5pdCAgICAgICh2b2lkKTsKLWludCAgTHZtQnVuZGxlX2luaXQgICAgICAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpOwotaW50ICBMdm1FZmZlY3RfZW5hYmxlICAgICAgICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCk7Ci1pbnQgIEx2bUVmZmVjdF9kaXNhYmxlICAgICAgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KTsKLXZvaWQgTHZtRWZmZWN0X2ZyZWUgICAgICAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpOwotaW50ICBFZmZlY3Rfc2V0Q29uZmlnICAgICAgICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKTsKLXZvaWQgRWZmZWN0X2dldENvbmZpZyAgICAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCAqcENvbmZpZyk7Ci1pbnQgIEJhc3NCb29zdF9zZXRQYXJhbWV0ZXIgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBwYXJhbVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOwotaW50ICBCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgKnBWYWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSk7Ci1pbnQgIFZpcnR1YWxpemVyX3NldFBhcmFtZXRlciAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBwYXJhbVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOwotaW50ICBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgKnBWYWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSk7Ci1pbnQgIEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBwYXJhbVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOwotaW50ICBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgKnBWYWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSk7Ci1pbnQgIFZvbHVtZV9zZXRQYXJhbWV0ZXIgICAgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBwYXJhbVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOwotaW50ICBWb2x1bWVfZ2V0UGFyYW1ldGVyICAgICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgKnBWYWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSk7Ci1pbnQgRWZmZWN0X3NldEVuYWJsZWQoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGJvb2wgZW5hYmxlZCk7Cit2b2lkIEx2bUdsb2JhbEJ1bmRsZV9pbml0KHZvaWQpOworaW50IEx2bUJ1bmRsZV9pbml0KEVmZmVjdENvbnRleHQqIHBDb250ZXh0KTsKK2ludCBMdm1FZmZlY3RfZW5hYmxlKEVmZmVjdENvbnRleHQqIHBDb250ZXh0KTsKK2ludCBMdm1FZmZlY3RfZGlzYWJsZShFZmZlY3RDb250ZXh0KiBwQ29udGV4dCk7CitpbnQgRWZmZWN0X3NldENvbmZpZyhFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190KiBwQ29uZmlnKTsKK3ZvaWQgRWZmZWN0X2dldENvbmZpZyhFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190KiBwQ29uZmlnKTsKK2ludCBCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBwYXJhbVNpemUsIHZvaWQqIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKTsKK2ludCBCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBwYXJhbVNpemUsIHZvaWQqIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwVmFsdWVTaXplLCB2b2lkKiBwVmFsdWUpOworaW50IFZpcnR1YWxpemVyX3NldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgdWludDMyX3QgcGFyYW1TaXplLCB2b2lkKiBwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKTsKK2ludCBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIHVpbnQzMl90IHBhcmFtU2l6ZSwgdm9pZCogcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcFZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKTsKK2ludCBFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBwYXJhbVNpemUsIHZvaWQqIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKTsKK2ludCBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBwYXJhbVNpemUsIHZvaWQqIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwVmFsdWVTaXplLCB2b2lkKiBwVmFsdWUpOworaW50IFZvbHVtZV9zZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIHVpbnQzMl90IHBhcmFtU2l6ZSwgdm9pZCogcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWVTaXplLCB2b2lkKiBwVmFsdWUpOworaW50IFZvbHVtZV9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIHVpbnQzMl90IHBhcmFtU2l6ZSwgdm9pZCogcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBWYWx1ZVNpemUsIHZvaWQqIHBWYWx1ZSk7CitpbnQgRWZmZWN0X3NldEVuYWJsZWQoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIGJvb2wgZW5hYmxlZCk7CiAKIC8qIEVmZmVjdCBMaWJyYXJ5IEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbiAqLwogCi1leHRlcm4gIkMiIGludCBFZmZlY3RDcmVhdGUoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGlvSWQgX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICAqcEhhbmRsZSl7CitleHRlcm4gIkMiIGludCBFZmZlY3RDcmVhdGUoY29uc3QgZWZmZWN0X3V1aWRfdCogdXVpZCwgaW50MzJfdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAvKiBpb0lkIF9fdW51c2VkICovLCBlZmZlY3RfaGFuZGxlX3QqIHBIYW5kbGUpIHsKICAgICBpbnQgcmV0ID0gMDsKICAgICBpbnQgc2Vzc2lvbk5vID0gLTE7CiAgICAgaW50IGk7Ci0gICAgRWZmZWN0Q29udGV4dCAqcENvbnRleHQgPSBOVUxMOworICAgIEVmZmVjdENvbnRleHQqIHBDb250ZXh0ID0gTlVMTDsKICAgICBib29sIG5ld0J1bmRsZSA9IGZhbHNlOwotICAgIFNlc3Npb25Db250ZXh0ICpwU2Vzc2lvbkNvbnRleHQ7CisgICAgU2Vzc2lvbkNvbnRleHQqIHBTZXNzaW9uQ29udGV4dDsKIAogICAgIEFMT0dWKCJcblx0RWZmZWN0Q3JlYXRlIHN0YXJ0IHNlc3Npb24gJWQiLCBzZXNzaW9uSWQpOwogCi0gICAgaWYgKHBIYW5kbGUgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpeworICAgIGlmIChwSGFuZGxlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdENyZWF0ZSgpIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIpOwogICAgICAgICByZXQgPSAtRUlOVkFMOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogCi0gICAgaWYoTHZtSW5pdEZsYWcgPT0gTFZNX0ZBTFNFKXsKKyAgICBpZiAoTHZtSW5pdEZsYWcgPT0gTFZNX0ZBTFNFKSB7CiAgICAgICAgIEx2bUluaXRGbGFnID0gTFZNX1RSVUU7CiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIEluaXRpYWxpemluZyBhbGwgZ2xvYmFsIG1lbW9yeSIpOwogICAgICAgICBMdm1HbG9iYWxCdW5kbGVfaW5pdCgpOwpAQCAtMjEwLDcgKzE5MSw3IEBACiAKICAgICAvLyBGaW5kIHNlc3Npb25ObzogaWYgb25lIGFscmVhZHkgZXhpc3RzIGZvciB0aGUgc2Vzc2lvbklkIHVzZSBpdCwKICAgICAvLyBvdGhlcndpc2UgY2hvb3NlIHRoZSBmaXJzdCBhdmFpbGFibGUgZW1wdHkgc2xvdC4KLSAgICBmb3IoaT0wOyBpPExWTV9NQVhfU0VTU0lPTlM7IGkrKyl7CisgICAgZm9yIChpID0gMDsgaSA8IExWTV9NQVhfU0VTU0lPTlM7IGkrKykgewogICAgICAgICBpZiAoU2Vzc2lvbkluZGV4W2ldID09IHNlc3Npb25JZCkgewogICAgICAgICAgICAgc2Vzc2lvbk5vID0gaTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjMyLDEwNiArMjEzLDEwMiBAQAogICAgIHBDb250ZXh0ID0gbmV3IEVmZmVjdENvbnRleHQ7CiAKICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBjcmVhdGUgaW4gdGhpcyBzZXNzaW9uCi0gICAgaWYoR2xvYmFsU2Vzc2lvbk1lbW9yeVtzZXNzaW9uTm9dLmJCdW5kbGVkRWZmZWN0c0VuYWJsZWQgPT0gTFZNX0ZBTFNFKXsKKyAgICBpZiAoR2xvYmFsU2Vzc2lvbk1lbW9yeVtzZXNzaW9uTm9dLmJCdW5kbGVkRWZmZWN0c0VuYWJsZWQgPT0gTFZNX0ZBTFNFKSB7CiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIFRoaXMgaXMgdGhlIGZpcnN0IGVmZmVjdCBpbiBjdXJyZW50IHNlc3Npb25JZCAlZCBzZXNzaW9uTm8gJWQiLAotICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgc2Vzc2lvbk5vKTsKKyAgICAgICAgICAgICAgc2Vzc2lvbklkLCBzZXNzaW9uTm8pOwogCiAgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbc2Vzc2lvbk5vXS5iQnVuZGxlZEVmZmVjdHNFbmFibGVkID0gTFZNX1RSVUU7Ci0gICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbc2Vzc2lvbk5vXS5wQnVuZGxlZENvbnRleHQgICAgICAgID0gbmV3IEJ1bmRsZWRFZmZlY3RDb250ZXh0OworICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W3Nlc3Npb25Ob10ucEJ1bmRsZWRDb250ZXh0ID0gbmV3IEJ1bmRsZWRFZmZlY3RDb250ZXh0OwogICAgICAgICBuZXdCdW5kbGUgPSB0cnVlOwogCiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQgPSBHbG9iYWxTZXNzaW9uTWVtb3J5W3Nlc3Npb25Ob10ucEJ1bmRsZWRDb250ZXh0OwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uTm8gICAgICAgICAgICAgICAgPSBzZXNzaW9uTm87Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25JZCAgICAgICAgICAgICAgICA9IHNlc3Npb25JZDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlICAgICAgICAgICAgICAgID0gTlVMTDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgICAgICAgICAgID0gTFZNX0ZBTFNFOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iRXF1YWxpemVyRW5hYmxlZCAgICAgICAgPSBMVk1fRkFMU0U7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzRW5hYmxlZCAgICAgICAgICAgICA9IExWTV9GQUxTRTsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NUZW1wRGlzYWJsZWQgICAgICAgID0gTFZNX0ZBTFNFOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkICAgICAgPSBMVk1fRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25ObyA9IHNlc3Npb25ObzsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgPSBOVUxMOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVm9sdW1lRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkVxdWFsaXplckVuYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPSBMVk1fRkFMU0U7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9IExWTV9GQUxTRTsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bk91dHB1dERldmljZSAgICAgICAgICAgID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5PdXRwdXREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+blZpcnR1YWxpemVyRm9yY2VkRGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkICAgICA9IDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQgICAgICA9IDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZpcnN0Vm9sdW1lICAgICAgICAgICAgICA9IExWTV9UUlVFOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT52b2x1bWUgICAgICAgICAgICAgICAgICAgPSAwOwotCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCA9IDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZpcnN0Vm9sdW1lID0gTFZNX1RSVUU7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnZvbHVtZSA9IDA7CiAKICAgICAgICAgLyogU2F2ZWQgc3RyZW5ndGggaXMgdXNlZCB0byByZXR1cm4gdGhlIGV4YWN0IHN0cmVuZ3RoIHRoYXQgd2FzIHVzZWQgaW4gdGhlIHNldCB0byB0aGUgZ2V0CiAgICAgICAgICAqIGJlY2F1c2Ugd2UgbWFwIHRoZSBvcmlnaW5hbCBzdHJlbmd0aCByYW5nZSBvZiAwOjEwMDAgdG8gMToxNSwgYW5kIHRoaXMgd2lsbCBhdm9pZAogICAgICAgICAgKiBxdWFudGlzYXRpb24gbGlrZSBlZmZlY3Qgd2hlbiByZXR1cm5pbmcKICAgICAgICAgICovCi0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkICAgICAgICA9IDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlZpcnRTdHJlbmd0aFNhdmVkICAgICAgICA9IDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkN1clByZXNldCAgICAgICAgICAgICAgICA9IFBSRVNFVF9DVVNUT007Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmxldmVsU2F2ZWQgICAgICAgICAgICAgICA9IDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCAgICAgICAgICAgICA9IExWTV9GQUxTRTsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZCAgID0gTFZNX0ZBTFNFOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkICAgICAgICAgICAgPSAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyICAgICAgICAgICAgICAgPSBOVUxMOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50ICAgICAgICAgICAgICAgPSAtMTsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCAgID0gMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgICAgID0gMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgICAgID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQgPSAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5WaXJ0U3RyZW5ndGhTYXZlZCA9IDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkN1clByZXNldCA9IFBSRVNFVF9DVVNUT007CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmxldmVsU2F2ZWQgPSAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJTdGVyZW9Qb3NpdGlvbkVuYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQgPSAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyID0gTlVMTDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCA9IC0xOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPSAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA9IDA7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgewogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpXSA9IEVRTkJfNUJhbmRTb2Z0UHJlc2V0c1tpXTsKICAgICAgICAgfQotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5lZmZlY3RQcm9jZXNzQ2FsbGVkICAgICAgPSAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5lZmZlY3RJbkRyYWluICAgICAgICAgICAgPSAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5lZmZlY3RQcm9jZXNzQ2FsbGVkID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZWZmZWN0SW5EcmFpbiA9IDA7CiAKICAgICAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gQ2FsbGluZyBMdm1CdW5kbGVfaW5pdCIpOwogICAgICAgICByZXQgPSBMdm1CdW5kbGVfaW5pdChwQ29udGV4dCk7CiAKLSAgICAgICAgaWYgKHJldCA8IDApeworICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0Q3JlYXRlKCkgQnVuZGxlIGluaXQgZmFpbGVkIik7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZXsKKyAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBBc3NpZ25pbmcgbWVtb3J5IGZvciBwcmV2aW91c2x5IGNyZWF0ZWQgZWZmZWN0IG9uIHNlc3Npb25ObyAlZCIsCi0gICAgICAgICAgICAgICAgc2Vzc2lvbk5vKTsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtzZXNzaW9uTm9dLnBCdW5kbGVkQ29udGV4dDsKKyAgICAgICAgICAgICAgc2Vzc2lvbk5vKTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCA9IEdsb2JhbFNlc3Npb25NZW1vcnlbc2Vzc2lvbk5vXS5wQnVuZGxlZENvbnRleHQ7CiAgICAgfQogICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIHBCdW5kbGVkQ29udGV4dCBpcyAlcCIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQpOwogCiAgICAgcFNlc3Npb25Db250ZXh0ID0gJkdsb2JhbFNlc3Npb25NZW1vcnlbcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vXTsKIAogICAgIC8vIENyZWF0ZSBlYWNoIEVmZmVjdAotICAgIGlmIChtZW1jbXAodXVpZCwgJmdCYXNzQm9vc3REZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCl7CisgICAgaWYgKG1lbWNtcCh1dWlkLCAmZ0Jhc3NCb29zdERlc2NyaXB0b3IudXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CiAgICAgICAgIC8vIENyZWF0ZSBCYXNzIEJvb3N0CiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIEVmZmVjdCB0byBiZSBjcmVhdGVkIGlzIExWTV9CQVNTX0JPT1NUIik7CiAgICAgICAgIHBTZXNzaW9uQ29udGV4dC0+YkJhc3NJbnN0YW50aWF0ZWQgPSBMVk1fVFJVRTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPSAwOwogCi0gICAgICAgIHBDb250ZXh0LT5pdGZlICAgICAgID0gJmdMdm1FZmZlY3RJbnRlcmZhY2U7CisgICAgICAgIHBDb250ZXh0LT5pdGZlID0gJmdMdm1FZmZlY3RJbnRlcmZhY2U7CiAgICAgICAgIHBDb250ZXh0LT5FZmZlY3RUeXBlID0gTFZNX0JBU1NfQk9PU1Q7Ci0gICAgfSBlbHNlIGlmIChtZW1jbXAodXVpZCwgJmdWaXJ0dWFsaXplckRlc2NyaXB0b3IudXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKXsKKyAgICB9IGVsc2UgaWYgKG1lbWNtcCh1dWlkLCAmZ1ZpcnR1YWxpemVyRGVzY3JpcHRvci51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKICAgICAgICAgLy8gQ3JlYXRlIFZpcnR1YWxpemVyCiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIEVmZmVjdCB0byBiZSBjcmVhdGVkIGlzIExWTV9WSVJUVUFMSVpFUiIpOwotICAgICAgICBwU2Vzc2lvbkNvbnRleHQtPmJWaXJ0dWFsaXplckluc3RhbnRpYXRlZD1MVk1fVFJVRTsKKyAgICAgICAgcFNlc3Npb25Db250ZXh0LT5iVmlydHVhbGl6ZXJJbnN0YW50aWF0ZWQgPSBMVk1fVFJVRTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA9IDA7CiAKLSAgICAgICAgcENvbnRleHQtPml0ZmUgICAgICAgPSAmZ0x2bUVmZmVjdEludGVyZmFjZTsKKyAgICAgICAgcENvbnRleHQtPml0ZmUgPSAmZ0x2bUVmZmVjdEludGVyZmFjZTsKICAgICAgICAgcENvbnRleHQtPkVmZmVjdFR5cGUgPSBMVk1fVklSVFVBTElaRVI7Ci0gICAgfSBlbHNlIGlmIChtZW1jbXAodXVpZCwgJmdFcXVhbGl6ZXJEZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCl7CisgICAgfSBlbHNlIGlmIChtZW1jbXAodXVpZCwgJmdFcXVhbGl6ZXJEZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewogICAgICAgICAvLyBDcmVhdGUgRXF1YWxpemVyCiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIEVmZmVjdCB0byBiZSBjcmVhdGVkIGlzIExWTV9FUVVBTElaRVIiKTsKICAgICAgICAgcFNlc3Npb25Db250ZXh0LT5iRXF1YWxpemVySW5zdGFudGlhdGVkID0gTFZNX1RSVUU7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxID0gMDsKIAotICAgICAgICBwQ29udGV4dC0+aXRmZSAgICAgICA9ICZnTHZtRWZmZWN0SW50ZXJmYWNlOworICAgICAgICBwQ29udGV4dC0+aXRmZSA9ICZnTHZtRWZmZWN0SW50ZXJmYWNlOwogICAgICAgICBwQ29udGV4dC0+RWZmZWN0VHlwZSA9IExWTV9FUVVBTElaRVI7Ci0gICAgfSBlbHNlIGlmIChtZW1jbXAodXVpZCwgJmdWb2x1bWVEZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCl7CisgICAgfSBlbHNlIGlmIChtZW1jbXAodXVpZCwgJmdWb2x1bWVEZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewogICAgICAgICAvLyBDcmVhdGUgVm9sdW1lCiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIEVmZmVjdCB0byBiZSBjcmVhdGVkIGlzIExWTV9WT0xVTUUiKTsKICAgICAgICAgcFNlc3Npb25Db250ZXh0LT5iVm9sdW1lSW5zdGFudGlhdGVkID0gTFZNX1RSVUU7CiAKLSAgICAgICAgcENvbnRleHQtPml0ZmUgICAgICAgPSAmZ0x2bUVmZmVjdEludGVyZmFjZTsKKyAgICAgICAgcENvbnRleHQtPml0ZmUgPSAmZ0x2bUVmZmVjdEludGVyZmFjZTsKICAgICAgICAgcENvbnRleHQtPkVmZmVjdFR5cGUgPSBMVk1fVk9MVU1FOwotICAgIH0KLSAgICBlbHNleworICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdENyZWF0ZSgpIGludmFsaWQgVVVJRCIpOwogICAgICAgICByZXQgPSAtRUlOVkFMOwogICAgICAgICBnb3RvIGV4aXQ7CkBAIC0zNDcsNjYgKzMyNCw2NCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZGVsZXRlIHBDb250ZXh0OwogICAgICAgICB9Ci0gICAgICAgIGlmIChwSGFuZGxlICE9IE5VTEwpCi0gICAgICAgICAgKnBIYW5kbGUgPSAoZWZmZWN0X2hhbmRsZV90KU5VTEw7CisgICAgICAgIGlmIChwSGFuZGxlICE9IE5VTEwpICpwSGFuZGxlID0gKGVmZmVjdF9oYW5kbGVfdClOVUxMOwogICAgIH0gZWxzZSB7Ci0gICAgICBpZiAocEhhbmRsZSAhPSBOVUxMKQotICAgICAgICAqcEhhbmRsZSA9IChlZmZlY3RfaGFuZGxlX3QpcENvbnRleHQ7CisgICAgICAgIGlmIChwSGFuZGxlICE9IE5VTEwpICpwSGFuZGxlID0gKGVmZmVjdF9oYW5kbGVfdClwQ29udGV4dDsKICAgICB9CiAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIGVuZC4uXG5cbiIpOwogICAgIHJldHVybiByZXQ7CiB9IC8qIGVuZCBFZmZlY3RDcmVhdGUgKi8KIAotZXh0ZXJuICJDIiBpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaGFuZGxlX3QgaGFuZGxlKXsKK2V4dGVybiAiQyIgaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSkgewogICAgIEFMT0dWKCJcblx0RWZmZWN0UmVsZWFzZSBzdGFydCAlcCIsIGhhbmRsZSk7Ci0gICAgRWZmZWN0Q29udGV4dCAqIHBDb250ZXh0ID0gKEVmZmVjdENvbnRleHQgKiloYW5kbGU7CisgICAgRWZmZWN0Q29udGV4dCogcENvbnRleHQgPSAoRWZmZWN0Q29udGV4dCopaGFuZGxlOwogCiAgICAgQUxPR1YoIlx0RWZmZWN0UmVsZWFzZSBzdGFydCBoYW5kbGU6ICVwLCBjb250ZXh0ICVwIiwgaGFuZGxlLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0KTsKLSAgICBpZiAocENvbnRleHQgPT0gTlVMTCl7CisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpIHsKICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0UmVsZWFzZSBjYWxsZWQgd2l0aCBOVUxMIHBvaW50ZXIiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgU2Vzc2lvbkNvbnRleHQgKnBTZXNzaW9uQ29udGV4dCA9ICZHbG9iYWxTZXNzaW9uTWVtb3J5W3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25Ob107CisgICAgU2Vzc2lvbkNvbnRleHQqIHBTZXNzaW9uQ29udGV4dCA9ICZHbG9iYWxTZXNzaW9uTWVtb3J5W3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25Ob107CiAKICAgICAvLyBDbGVhciB0aGUgaW5zdGFudGlhdGVkIGZsYWcgZm9yIHRoZSBlZmZlY3QKICAgICAvLyBwcm90ZWN0IGFnYWlucyB0aGUgY2FzZSB3aGVyZSBhbiBlZmZlY3QgaXMgdW4taW5zdGFudGlhdGVkIHdpdGhvdXQgYmVpbmcgZGlzYWJsZWQKIAotICAgIGludCAmZWZmZWN0SW5EcmFpbiA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmVmZmVjdEluRHJhaW47Ci0gICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpIHsKKyAgICBpbnQmIGVmZmVjdEluRHJhaW4gPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5lZmZlY3RJbkRyYWluOworICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgewogICAgICAgICBBTE9HVigiXHRFZmZlY3RSZWxlYXNlIExWTV9CQVNTX0JPT1NUIENsZWFyaW5nIGdsb2JhbCBpbnRzdGFudGlhdGVkIGZsYWciKTsKICAgICAgICAgcFNlc3Npb25Db250ZXh0LT5iQmFzc0luc3RhbnRpYXRlZCA9IExWTV9GQUxTRTsKLSAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPiAwKXsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiID4gMCkgewogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQtLTsKICAgICAgICAgfQogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA9IDA7Ci0gICAgfSBlbHNlIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUikgeworICAgIH0gZWxzZSBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSB7CiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdFJlbGVhc2UgTFZNX1ZJUlRVQUxJWkVSIENsZWFyaW5nIGdsb2JhbCBpbnRzdGFudGlhdGVkIGZsYWciKTsKICAgICAgICAgcFNlc3Npb25Db250ZXh0LT5iVmlydHVhbGl6ZXJJbnN0YW50aWF0ZWQgPSBMVk1fRkFMU0U7Ci0gICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPiAwKXsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPiAwKSB7CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZC0tOwogICAgICAgICB9CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPSAwOwotICAgIH0gZWxzZSBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSB7CisgICAgfSBlbHNlIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSB7CiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdFJlbGVhc2UgTFZNX0VRVUFMSVpFUiBDbGVhcmluZyBnbG9iYWwgaW50c3RhbnRpYXRlZCBmbGFnIik7Ci0gICAgICAgIHBTZXNzaW9uQ29udGV4dC0+YkVxdWFsaXplckluc3RhbnRpYXRlZCA9TFZNX0ZBTFNFOwotICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA+IDApeworICAgICAgICBwU2Vzc2lvbkNvbnRleHQtPmJFcXVhbGl6ZXJJbnN0YW50aWF0ZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA+IDApIHsKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLS07CiAgICAgICAgIH0KICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPSAwOwotICAgIH0gZWxzZSBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKSB7CisgICAgfSBlbHNlIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKSB7CiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdFJlbGVhc2UgTFZNX1ZPTFVNRSBDbGVhcmluZyBnbG9iYWwgaW50c3RhbnRpYXRlZCBmbGFnIik7CiAgICAgICAgIHBTZXNzaW9uQ29udGV4dC0+YlZvbHVtZUluc3RhbnRpYXRlZCA9IExWTV9GQUxTRTsKICAgICAgICAgLy8gVGhlcmUgaXMgbm8gc2FtcGxlc1RvRXhpdENvdW50IGZvciB2b2x1bWUgc28gd2UgYWxzbyB1c2UgdGhlIGRyYWluIGZsYWcgdG8gY2hlY2sKICAgICAgICAgLy8gaWYgd2Ugc2hvdWxkIGRlY3JlbWVudCB0aGUgZWZmZWN0cyBlbmFibGVkLgotICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgPT0gTFZNX1RSVUUKLSAgICAgICAgICAgICAgICB8fCAoZWZmZWN0SW5EcmFpbiAmIDEgPDwgTFZNX1ZPTFVNRSkgIT0gMCkgeworICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgPT0gTFZNX1RSVUUgfHwKKyAgICAgICAgICAgIChlZmZlY3RJbkRyYWluICYgMSA8PCBMVk1fVk9MVU1FKSAhPSAwKSB7CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZC0tOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0UmVsZWFzZSA6IFVuc3VwcG9ydGVkIGVmZmVjdFxuXG5cblxuXG5cblxuIik7CiAgICAgfQotICAgIGVmZmVjdEluRHJhaW4gJj0gfigxIDw8IHBDb250ZXh0LT5FZmZlY3RUeXBlKTsgLy8gbm8gbmVlZCB0byBkcmFpbiBpZiByZWxlYXNlZAorICAgIGVmZmVjdEluRHJhaW4gJj0gfigxIDw8IHBDb250ZXh0LT5FZmZlY3RUeXBlKTsgIC8vIG5vIG5lZWQgdG8gZHJhaW4gaWYgcmVsZWFzZWQKIAogICAgIC8vIERpc2FibGUgZWZmZWN0LCBpbiB0aGlzIGNhc2UgaWdub3JlIGVycm9ycyAocmV0dXJuIGNvZGVzKQogICAgIC8vIGlmIGFuIGVmZmVjdCBoYXMgYWxyZWFkeSBiZWVuIGRpc2FibGVkCkBAIC00MTQsMTcgKzM4OSwxNSBAQAogCiAgICAgLy8gaWYgYWxsIGVmZmVjdHMgYXJlIG5vIGxvbmdlciBpbnN0YW50aWFlZCBmcmVlIHRoZSBsdm0gbWVtb3J5IGFuZCBkZWxldGUgQnVuZGxlZEVmZmVjdENvbnRleHQKICAgICBpZiAoKHBTZXNzaW9uQ29udGV4dC0+YkJhc3NJbnN0YW50aWF0ZWQgPT0gTFZNX0ZBTFNFKSAmJgotICAgICAgICAgICAgKHBTZXNzaW9uQ29udGV4dC0+YlZvbHVtZUluc3RhbnRpYXRlZCA9PSBMVk1fRkFMU0UpICYmCi0gICAgICAgICAgICAocFNlc3Npb25Db250ZXh0LT5iRXF1YWxpemVySW5zdGFudGlhdGVkID09TFZNX0ZBTFNFKSAmJgotICAgICAgICAgICAgKHBTZXNzaW9uQ29udGV4dC0+YlZpcnR1YWxpemVySW5zdGFudGlhdGVkPT1MVk1fRkFMU0UpKQotICAgIHsKLQorICAgICAgICAocFNlc3Npb25Db250ZXh0LT5iVm9sdW1lSW5zdGFudGlhdGVkID09IExWTV9GQUxTRSkgJiYKKyAgICAgICAgKHBTZXNzaW9uQ29udGV4dC0+YkVxdWFsaXplckluc3RhbnRpYXRlZCA9PSBMVk1fRkFMU0UpICYmCisgICAgICAgIChwU2Vzc2lvbkNvbnRleHQtPmJWaXJ0dWFsaXplckluc3RhbnRpYXRlZCA9PSBMVk1fRkFMU0UpKSB7CiAgICAgICAgIC8vIENsZWFyIHRoZSBTZXNzaW9uSW5kZXgKLSAgICAgICAgZm9yKGludCBpPTA7IGk8TFZNX01BWF9TRVNTSU9OUzsgaSsrKXsKLSAgICAgICAgICAgIGlmKFNlc3Npb25JbmRleFtpXSA9PSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uSWQpeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IExWTV9NQVhfU0VTU0lPTlM7IGkrKykgeworICAgICAgICAgICAgaWYgKFNlc3Npb25JbmRleFtpXSA9PSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uSWQpIHsKICAgICAgICAgICAgICAgICBTZXNzaW9uSW5kZXhbaV0gPSBMVk1fVU5VU0VEX1NFU1NJT047Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0UmVsZWFzZTogQ2xlYXJpbmcgU2Vzc2lvbkluZGV4IFNlc3Npb25ObyAlZCBmb3IgU2Vzc2lvbklkICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgaSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRFZmZlY3RSZWxlYXNlOiBDbGVhcmluZyBTZXNzaW9uSW5kZXggU2Vzc2lvbk5vICVkIGZvciBTZXNzaW9uSWQgJWRcbiIsIGksCisgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbklkKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDMzLDcgKzQwNiw3IEBACiAgICAgICAgIHBTZXNzaW9uQ29udGV4dC0+YkJ1bmRsZWRFZmZlY3RzRW5hYmxlZCA9IExWTV9GQUxTRTsKICAgICAgICAgcFNlc3Npb25Db250ZXh0LT5wQnVuZGxlZENvbnRleHQgPSBMVk1fTlVMTDsKICAgICAgICAgQUxPR1YoIlx0RWZmZWN0UmVsZWFzZTogRnJlZWluZyBMVk0gQnVuZGxlIG1lbW9yeVxuIik7Ci0gICAgICAgIEx2bUVmZmVjdF9mcmVlKHBDb250ZXh0KTsKKyAgICAgICAgTFZNX0RlbEluc3RhbmNlSGFuZGxlKCZwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UpOwogICAgICAgICBBTE9HVigiXHRFZmZlY3RSZWxlYXNlOiBEZWxldGluZyBMVk0gQnVuZGxlIGNvbnRleHQgJXBcbiIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQpOwogICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIpOwpAQCAtNDQ5LDExICs0MjIsMTAgQEAKIAogfSAvKiBlbmQgRWZmZWN0UmVsZWFzZSAqLwogCi1leHRlcm4gIkMiIGludCBFZmZlY3RHZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0gICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYyA9IE5VTEw7CitleHRlcm4gIkMiIGludCBFZmZlY3RHZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QqIHV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIHBEZXNjcmlwdG9yKSB7CisgICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCogZGVzYyA9IE5VTEw7CiAKLSAgICBpZiAocERlc2NyaXB0b3IgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpeworICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiRWZmZWN0R2V0RGVzY3JpcHRvcigpIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CkBAIC00NjksNyArNDQxLDcgQEAKICAgICB9CiAKICAgICBpZiAoZGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAgLUVJTlZBTDsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCiAgICAgKnBEZXNjcmlwdG9yID0gKmRlc2M7CkBAIC00NzcsMTUgKzQ0OSwxNSBAQAogICAgIHJldHVybiAwOwogfSAvKiBlbmQgRWZmZWN0R2V0RGVzY3JpcHRvciAqLwogCi12b2lkIEx2bUdsb2JhbEJ1bmRsZV9pbml0KCl7Cit2b2lkIEx2bUdsb2JhbEJ1bmRsZV9pbml0KCkgewogICAgIEFMT0dWKCJcdEx2bUdsb2JhbEJ1bmRsZV9pbml0IHN0YXJ0Iik7Ci0gICAgZm9yKGludCBpPTA7IGk8TFZNX01BWF9TRVNTSU9OUzsgaSsrKXsKLSAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtpXS5iQnVuZGxlZEVmZmVjdHNFbmFibGVkICAgPSBMVk1fRkFMU0U7Ci0gICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbaV0uYlZvbHVtZUluc3RhbnRpYXRlZCAgICAgID0gTFZNX0ZBTFNFOwotICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W2ldLmJFcXVhbGl6ZXJJbnN0YW50aWF0ZWQgICA9IExWTV9GQUxTRTsKLSAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtpXS5iQmFzc0luc3RhbnRpYXRlZCAgICAgICAgPSBMVk1fRkFMU0U7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMVk1fTUFYX1NFU1NJT05TOyBpKyspIHsKKyAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtpXS5iQnVuZGxlZEVmZmVjdHNFbmFibGVkID0gTFZNX0ZBTFNFOworICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W2ldLmJWb2x1bWVJbnN0YW50aWF0ZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbaV0uYkVxdWFsaXplckluc3RhbnRpYXRlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtpXS5iQmFzc0luc3RhbnRpYXRlZCA9IExWTV9GQUxTRTsKICAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtpXS5iVmlydHVhbGl6ZXJJbnN0YW50aWF0ZWQgPSBMVk1fRkFMU0U7Ci0gICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbaV0ucEJ1bmRsZWRDb250ZXh0ICAgICAgICAgID0gTFZNX05VTEw7CisgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbaV0ucEJ1bmRsZWRDb250ZXh0ID0gTFZNX05VTEw7CiAKICAgICAgICAgU2Vzc2lvbkluZGV4W2ldID0gTFZNX1VOVVNFRF9TRVNTSU9OOwogICAgIH0KQEAgLTUwNCwyMDMgKzQ3NiwxNDAgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IEx2bUJ1bmRsZV9pbml0KEVmZmVjdENvbnRleHQgKnBDb250ZXh0KXsKK2ludCBMdm1CdW5kbGVfaW5pdChFZmZlY3RDb250ZXh0KiBwQ29udGV4dCkgewogICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IHN0YXJ0Iik7CiAKLSAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSAgICAgICAgICAgICAgICAgID0gNDQxMDA7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgICAgICA9IE5VTEw7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyICA9IE5VTEw7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgICAgICAgICA9IE5VTEw7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5tYXNrICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9DT05GSUdfQUxMOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSAgICAgICAgICAgICAgICAgPSA0NDEwMDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgICAgID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSAgICAgICAgPSBOVUxMOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLm1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKIAogICAgIENIRUNLX0FSRyhwQ29udGV4dCAhPSBOVUxMKTsKIAotICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgIT0gTlVMTCl7CisgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSAhPSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgotICAgICAgICAgICAgICAgICItPiBDYWxsaW5nIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKLQotICAgICAgICBMdm1FZmZlY3RfZnJlZShwQ29udGV4dCk7CisgICAgICAgICAgICAgICItPiBDYWxsaW5nIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKKyAgICAgICAgTFZNX0RlbEluc3RhbmNlSGFuZGxlKCZwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UpOwogCiAgICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgotICAgICAgICAgICAgICAgICItPiBDYWxsZWQgcENvbnRleHQtPnBCYXNzQm9vc3QtPmZyZWUoKSIpOworICAgICAgICAgICAgICAiLT4gQ2FsbGVkIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKICAgICB9CiAKLSAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCi0gICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgcGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVk1fSW5zdFBhcmFtc190ICAgICAgICBJbnN0UGFyYW1zOyAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fRVFOQl9CYW5kRGVmX3QgICAgICBCYW5kRGVmc1tNQVhfTlVNX0JBTkRTXTsgICAgICAgIC8qIEVxdWFsaXNlciBiYW5kIGRlZmluaXRpb25zICovCi0gICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgSGVhZHJvb21QYXJhbXM7ICAgICAgICAgICAgICAgICAvKiBIZWFkcm9vbSBwYXJhbWV0ZXJzICovCi0gICAgTFZNX0hlYWRyb29tQmFuZERlZl90ICAgSGVhZHJvb21CYW5kRGVmW0xWTV9IRUFEUk9PTV9NQVhfTkJBTkRTXTsKLSAgICBMVk1fTWVtVGFiX3QgICAgICAgICAgICBNZW1UYWI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgYk1hbGxvY0ZhaWx1cmUgPSBMVk1fRkFMU0U7CisgICAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fQ29udHJvbFBhcmFtc190IHBhcmFtczsgICAgICAgICAgICAgICAgICAvKiBDb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fSW5zdFBhcmFtc190IEluc3RQYXJhbXM7ICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwYXJhbWV0ZXJzICovCisgICAgTFZNX0VRTkJfQmFuZERlZl90IEJhbmREZWZzW01BWF9OVU1fQkFORFNdOyAgLyogRXF1YWxpc2VyIGJhbmQgZGVmaW5pdGlvbnMgKi8KKyAgICBMVk1fSGVhZHJvb21QYXJhbXNfdCBIZWFkcm9vbVBhcmFtczsgICAgICAgICAvKiBIZWFkcm9vbSBwYXJhbWV0ZXJzICovCisgICAgTFZNX0hlYWRyb29tQmFuZERlZl90IEhlYWRyb29tQmFuZERlZltMVk1fSEVBRFJPT01fTUFYX05CQU5EU107CiAKICAgICAvKiBTZXQgdGhlIGNhcGFiaWxpdGllcyAqLwotICAgIEluc3RQYXJhbXMuQnVmZmVyTW9kZSAgICAgICA9IExWTV9VTk1BTkFHRURfQlVGRkVSUzsKLSAgICBJbnN0UGFyYW1zLk1heEJsb2NrU2l6ZSAgICAgPSBNQVhfQ0FMTF9TSVpFOwotICAgIEluc3RQYXJhbXMuRVFOQl9OdW1CYW5kcyAgICA9IE1BWF9OVU1fQkFORFM7Ci0gICAgSW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgICAgID0gTFZNX1BTQV9PTjsKKyAgICBJbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlM7CisgICAgSW5zdFBhcmFtcy5NYXhCbG9ja1NpemUgPSBNQVhfQ0FMTF9TSVpFOworICAgIEluc3RQYXJhbXMuRVFOQl9OdW1CYW5kcyA9IE1BWF9OVU1fQkFORFM7CisgICAgSW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgPSBMVk1fUFNBX09OOwogCi0gICAgLyogQWxsb2NhdGUgbWVtb3J5LCBmb3JjaW5nIGFsaWdubWVudCAqLwotICAgIEx2bVN0YXR1cyA9IExWTV9HZXRNZW1vcnlUYWJsZShMVk1fTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJbnN0UGFyYW1zKTsKLQotICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0TWVtb3J5VGFibGUiLCAiTHZtQnVuZGxlX2luaXQiKQotICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7Ci0KLSAgICBBTE9HVigiXHRDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX0dldE1lbW9yeVRhYmxlXG4iKTsKLQotICAgIC8qIEFsbG9jYXRlIG1lbW9yeSAqLwotICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7Ci0gICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCl7Ci0gICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9IG1hbGxvYyhNZW1UYWIuUmVnaW9uW2ldLlNpemUpOwotCi0gICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICUiIFBSSXUzMgotICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1XG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKLSAgICAgICAgICAgICAgICBiTWFsbG9jRmFpbHVyZSA9IExWTV9UUlVFOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgYWxsb2NhdGVkICUiIFBSSXUzMgotICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBJZiBvbmUgb3IgbW9yZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbnMgZmFpbGVkIHRvIGFsbG9jYXRlLCBmcmVlIHRoZSByZWdpb25zIHRoYXQgd2VyZQotICAgICAqIHN1Y2Nlc2Z1bGx5IGFsbG9jYXRlZCBhbmQgcmV0dXJuIHdpdGggYW4gZXJyb3IKLSAgICAgKi8KLSAgICBpZihiTWFsbG9jRmFpbHVyZSA9PSBMVk1fVFJVRSl7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7Ci0gICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICUiIFBSSXUzMgotICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IE5vdCBmcmVlaW5nXG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkOiBidXQgYWxsb2NhdGVkICUiIFBSSXUzMgotICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwLSBmcmVlXG4iLAotICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IG1hbGxvYydkIG1lbW9yeVxuIik7Ci0KLSAgICAvKiBJbml0aWFsaXNlICovCi0gICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlID0gTFZNX05VTEw7Ci0KLSAgICAvKiBJbml0IHNldHMgdGhlIGluc3RhbmNlIGhhbmRsZSAqLwotICAgIEx2bVN0YXR1cyA9IExWTV9HZXRJbnN0YW5jZUhhbmRsZSgmcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSW5zdFBhcmFtcyk7CisgICAgTHZtU3RhdHVzID0gTFZNX0dldEluc3RhbmNlSGFuZGxlKCZwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZJbnN0UGFyYW1zKTsKIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0SW5zdGFuY2VIYW5kbGUiLCAiTHZtQnVuZGxlX2luaXQiKQotICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX0dldEluc3RhbmNlSGFuZGxlXG4iKTsKKyAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNzZnVsbHkgY2FsbGVkIExWTV9HZXRJbnN0YW5jZUhhbmRsZVxuIik7CiAKICAgICAvKiBTZXQgdGhlIGluaXRpYWwgcHJvY2VzcyBwYXJhbWV0ZXJzICovCiAgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCi0gICAgcGFyYW1zLk9wZXJhdGluZ01vZGUgICAgICAgICAgPSBMVk1fTU9ERV9PTjsKLSAgICBwYXJhbXMuU2FtcGxlUmF0ZSAgICAgICAgICAgICA9IExWTV9GU180NDEwMDsKLSAgICBwYXJhbXMuU291cmNlRm9ybWF0ICAgICAgICAgICA9IExWTV9TVEVSRU87Ci0gICAgcGFyYW1zLlNwZWFrZXJUeXBlICAgICAgICAgICAgPSBMVk1fSEVBRFBIT05FUzsKKyAgICBwYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09OOworICAgIHBhcmFtcy5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworICAgIHBhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVk1fU1RFUkVPOworICAgIHBhcmFtcy5TcGVha2VyVHlwZSA9IExWTV9IRUFEUEhPTkVTOwogCiAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q2hNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotI2VuZGlmCiAKICAgICAvKiBDb25jZXJ0IFNvdW5kIHBhcmFtZXRlcnMgKi8KLSAgICBwYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlICAgPSBMVk1fTU9ERV9PRkY7Ci0gICAgcGFyYW1zLlZpcnR1YWxpemVyVHlwZSAgICAgICAgICAgID0gTFZNX0NPTkNFUlRTT1VORDsKLSAgICBwYXJhbXMuVmlydHVhbGl6ZXJSZXZlcmJMZXZlbCAgICAgPSAxMDA7Ci0gICAgcGFyYW1zLkNTX0VmZmVjdExldmVsICAgICAgICAgICAgID0gTFZNX0NTX0VGRkVDVF9OT05FOworICAgIHBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PRkY7CisgICAgcGFyYW1zLlZpcnR1YWxpemVyVHlwZSA9IExWTV9DT05DRVJUU09VTkQ7CisgICAgcGFyYW1zLlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgPSAxMDA7CisgICAgcGFyYW1zLkNTX0VmZmVjdExldmVsID0gTFZNX0NTX0VGRkVDVF9OT05FOwogCiAgICAgLyogTi1CYW5kIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCi0gICAgcGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSAgICAgPSBMVk1fRVFOQl9PRkY7Ci0gICAgcGFyYW1zLkVRTkJfTkJhbmRzICAgICAgICAgICAgPSBGSVZFQkFORF9OVU1CQU5EUzsKLSAgICBwYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb24gICA9ICZCYW5kRGVmc1swXTsKKyAgICBwYXJhbXMuRVFOQl9PcGVyYXRpbmdNb2RlID0gTFZNX0VRTkJfT0ZGOworICAgIHBhcmFtcy5FUU5CX05CYW5kcyA9IEZJVkVCQU5EX05VTUJBTkRTOworICAgIHBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9ICZCYW5kRGVmc1swXTsKIAotICAgIGZvciAoaW50IGk9MDsgaTxGSVZFQkFORF9OVU1CQU5EUzsgaSsrKQotICAgIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKICAgICAgICAgQmFuZERlZnNbaV0uRnJlcXVlbmN5ID0gRVFOQl81QmFuZFByZXNldHNGcmVxdWVuY2llc1tpXTsKLSAgICAgICAgQmFuZERlZnNbaV0uUUZhY3RvciAgID0gRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tpXTsKLSAgICAgICAgQmFuZERlZnNbaV0uR2FpbiAgICAgID0gRVFOQl81QmFuZFNvZnRQcmVzZXRzW2ldOworICAgICAgICBCYW5kRGVmc1tpXS5RRmFjdG9yID0gRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tpXTsKKyAgICAgICAgQmFuZERlZnNbaV0uR2FpbiA9IEVRTkJfNUJhbmRTb2Z0UHJlc2V0c1tpXTsKICAgICB9CiAKICAgICAvKiBWb2x1bWUgQ29udHJvbCBwYXJhbWV0ZXJzICovCi0gICAgcGFyYW1zLlZDX0VmZmVjdExldmVsICAgICAgICAgPSAwOwotICAgIHBhcmFtcy5WQ19CYWxhbmNlICAgICAgICAgICAgID0gMDsKKyAgICBwYXJhbXMuVkNfRWZmZWN0TGV2ZWwgPSAwOworICAgIHBhcmFtcy5WQ19CYWxhbmNlID0gMDsKIAogICAgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCi0gICAgcGFyYW1zLlRFX09wZXJhdGluZ01vZGUgICAgICAgPSBMVk1fVEVfT0ZGOwotICAgIHBhcmFtcy5URV9FZmZlY3RMZXZlbCAgICAgICAgID0gMDsKKyAgICBwYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSA9IExWTV9URV9PRkY7CisgICAgcGFyYW1zLlRFX0VmZmVjdExldmVsID0gMDsKIAogICAgIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgICBwYXJhbXMuUFNBX0VuYWJsZSAgICAgICAgICAgICA9IExWTV9QU0FfT0ZGOwotICAgIHBhcmFtcy5QU0FfUGVha0RlY2F5UmF0ZSAgICAgID0gKExWTV9QU0FfRGVjYXlTcGVlZF9lbikwOworICAgIHBhcmFtcy5QU0FfRW5hYmxlID0gTFZNX1BTQV9PRkY7CisgICAgcGFyYW1zLlBTQV9QZWFrRGVjYXlSYXRlID0gKExWTV9QU0FfRGVjYXlTcGVlZF9lbikwOwogCiAgICAgLyogQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCi0gICAgcGFyYW1zLkJFX09wZXJhdGluZ01vZGUgICAgICAgPSBMVk1fQkVfT0ZGOwotICAgIHBhcmFtcy5CRV9FZmZlY3RMZXZlbCAgICAgICAgID0gMDsKLSAgICBwYXJhbXMuQkVfQ2VudHJlRnJlcSAgICAgICAgICA9IExWTV9CRV9DRU5UUkVfOTBIejsKLSAgICBwYXJhbXMuQkVfSFBGICAgICAgICAgICAgICAgICA9IExWTV9CRV9IUEZfT047CisgICAgcGFyYW1zLkJFX09wZXJhdGluZ01vZGUgPSBMVk1fQkVfT0ZGOworICAgIHBhcmFtcy5CRV9FZmZlY3RMZXZlbCA9IDA7CisgICAgcGFyYW1zLkJFX0NlbnRyZUZyZXEgPSBMVk1fQkVfQ0VOVFJFXzkwSHo7CisgICAgcGFyYW1zLkJFX0hQRiA9IExWTV9CRV9IUEZfT047CiAKICAgICAvKiBQU0EgQ29udHJvbCBwYXJhbWV0ZXJzICovCi0gICAgcGFyYW1zLlBTQV9FbmFibGUgICAgICAgICAgICAgPSBMVk1fUFNBX09GRjsKLSAgICBwYXJhbXMuUFNBX1BlYWtEZWNheVJhdGUgICAgICA9IExWTV9QU0FfU1BFRURfTUVESVVNOworICAgIHBhcmFtcy5QU0FfRW5hYmxlID0gTFZNX1BTQV9PRkY7CisgICAgcGFyYW1zLlBTQV9QZWFrRGVjYXlSYXRlID0gTFZNX1BTQV9TUEVFRF9NRURJVU07CiAKICAgICAvKiBURSBDb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgICBwYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSAgICAgICA9IExWTV9URV9PRkY7Ci0gICAgcGFyYW1zLlRFX0VmZmVjdExldmVsICAgICAgICAgPSAwOworICAgIHBhcmFtcy5URV9PcGVyYXRpbmdNb2RlID0gTFZNX1RFX09GRjsKKyAgICBwYXJhbXMuVEVfRWZmZWN0TGV2ZWwgPSAwOwogCi0jaWZkZWYgU1VQUE9SVF9NQwotICAgIHBhcmFtcy5OckNoYW5uZWxzICAgICAgICAgICAgID0KLSAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7Ci0gICAgcGFyYW1zLkNoTWFzayAgICAgICAgICAgICAgICAgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0jZW5kaWYKKyAgICBwYXJhbXMuTnJDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOworICAgIHBhcmFtcy5DaE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KLSAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmcGFyYW1zKTsKIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtQnVuZGxlX2luaXQiKQotICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CiAKICAgICAvKiBTZXQgdGhlIGhlYWRyb29tIHBhcmFtZXRlcnMgKi8KLSAgICBIZWFkcm9vbUJhbmREZWZbMF0uTGltaXRfTG93ICAgICAgICAgID0gMjA7Ci0gICAgSGVhZHJvb21CYW5kRGVmWzBdLkxpbWl0X0hpZ2ggICAgICAgICA9IDQ5OTk7Ci0gICAgSGVhZHJvb21CYW5kRGVmWzBdLkhlYWRyb29tX09mZnNldCAgICA9IDA7Ci0gICAgSGVhZHJvb21CYW5kRGVmWzFdLkxpbWl0X0xvdyAgICAgICAgICA9IDUwMDA7Ci0gICAgSGVhZHJvb21CYW5kRGVmWzFdLkxpbWl0X0hpZ2ggICAgICAgICA9IDI0MDAwOwotICAgIEhlYWRyb29tQmFuZERlZlsxXS5IZWFkcm9vbV9PZmZzZXQgICAgPSAwOwotICAgIEhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb24gICAgPSAmSGVhZHJvb21CYW5kRGVmWzBdOworICAgIEhlYWRyb29tQmFuZERlZlswXS5MaW1pdF9Mb3cgPSAyMDsKKyAgICBIZWFkcm9vbUJhbmREZWZbMF0uTGltaXRfSGlnaCA9IDQ5OTk7CisgICAgSGVhZHJvb21CYW5kRGVmWzBdLkhlYWRyb29tX09mZnNldCA9IDA7CisgICAgSGVhZHJvb21CYW5kRGVmWzFdLkxpbWl0X0xvdyA9IDUwMDA7CisgICAgSGVhZHJvb21CYW5kRGVmWzFdLkxpbWl0X0hpZ2ggPSAyNDAwMDsKKyAgICBIZWFkcm9vbUJhbmREZWZbMV0uSGVhZHJvb21fT2Zmc2V0ID0gMDsKKyAgICBIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uID0gJkhlYWRyb29tQmFuZERlZlswXTsKICAgICBIZWFkcm9vbVBhcmFtcy5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlID0gTFZNX0hFQURST09NX09OOwotICAgIEhlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzICAgICAgICAgPSAyOworICAgIEhlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzID0gMjsKIAotICAgIEx2bVN0YXR1cyA9IExWTV9TZXRIZWFkcm9vbVBhcmFtcyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIZWFkcm9vbVBhcmFtcyk7CisgICAgTHZtU3RhdHVzID0gTFZNX1NldEhlYWRyb29tUGFyYW1zKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkhlYWRyb29tUGFyYW1zKTsKIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0SGVhZHJvb21QYXJhbXMiLCAiTHZtQnVuZGxlX2luaXQiKQotICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldEhlYWRyb29tUGFyYW1zXG4iKTsKKyAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNzZnVsbHkgY2FsbGVkIExWTV9TZXRIZWFkcm9vbVBhcmFtc1xuIik7CiAgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgRW5kIik7CiAgICAgcmV0dXJuIDA7Ci19ICAgLyogZW5kIEx2bUJ1bmRsZV9pbml0ICovCit9IC8qIGVuZCBMdm1CdW5kbGVfaW5pdCAqLwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEx2bUJ1bmRsZV9wcm9jZXNzKCkKQEAgLTcxOSwyNSArNjI4LDIyIEBACiAvLyAgcE91dDogICAgICAgcG9pbnRlciB0byB1cGRhdGVkIHN0ZXJlbyAxNiBiaXQgb3V0cHV0IGRhdGEKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBMdm1CdW5kbGVfcHJvY2VzcyhlZmZlY3RfYnVmZmVyX3QgICpwSW4sCi0gICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2J1ZmZlcl90ICAqcE91dCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgRWZmZWN0Q29udGV4dCAgICAqcENvbnRleHQpewotCi0gICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7ICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCi0gICAgZWZmZWN0X2J1ZmZlcl90ICAgICAgICAgKnBPdXRUbXA7CitpbnQgTHZtQnVuZGxlX3Byb2Nlc3MoZWZmZWN0X2J1ZmZlcl90KiBwSW4sIGVmZmVjdF9idWZmZXJfdCogcE91dCwgaW50IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0Q29udGV4dCogcENvbnRleHQpIHsKKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIGVmZmVjdF9idWZmZXJfdCogcE91dFRtcDsKICAgICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9Ci0gICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKIAotICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFKXsKKyAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSkgewogICAgICAgICBwT3V0VG1wID0gcE91dDsKLSAgICB9IGVsc2UgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSl7CisgICAgfSBlbHNlIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgIT0gZnJhbWVDb3VudCkgewogICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgKGVmZmVjdF9idWZmZXJfdCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIE5yQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICAoZWZmZWN0X2J1ZmZlcl90KiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCkgKiBOckNoYW5uZWxzKTsKICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKICAgICAgICAgICAgIH0KQEAgLTc0OSw3ICs2NTUsNiBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLQogICAgIC8qIFByb2Nlc3MgdGhlIHNhbXBsZXMgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fUHJvY2VzcyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIC8qIEluc3RhbmNlIGhhbmRsZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgYnVmZmVyICovCkBAIC03NTcsMTYgKzY2MiwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KWZyYW1lQ291bnQsICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXVkaW8gVGltZSAqLwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fUHJvY2VzcyIsICJMdm1CdW5kbGVfcHJvY2VzcyIpCi0gICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKIAotCi0gICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSl7CisgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQgKiBOckNoYW5uZWxzOyBpKyspIHsKICAgICAgICAgICAgIHBPdXRbaV0gPSBwT3V0W2ldICsgcE91dFRtcFtpXTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gMDsKLX0gICAgLyogZW5kIEx2bUJ1bmRsZV9wcm9jZXNzICovCit9IC8qIGVuZCBMdm1CdW5kbGVfcHJvY2VzcyAqLwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEVxdWFsaXplclVwZGF0ZUFjdGl2ZVBhcmFtcygpCkBAIC03NzksMjkgKzY4MywyOCBAQAogLy8gT3V0cHV0czoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgRXF1YWxpemVyVXBkYXRlQWN0aXZlUGFyYW1zKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KSB7Ci0gICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwordm9pZCBFcXVhbGl6ZXJVcGRhdGVBY3RpdmVQYXJhbXMoRWZmZWN0Q29udGV4dCogcENvbnRleHQpIHsKKyAgICBMVk1fQ29udHJvbFBhcmFtc190IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkVxdWFsaXplclVwZGF0ZUFjdGl2ZVBhcmFtcyIpCi0gICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJVcGRhdGVBY3RpdmVQYXJhbXMgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0RXF1YWxpemVyVXBkYXRlQWN0aXZlUGFyYW1zIGp1c3QgR290IC0+ICVkXG4iLAorICAgIC8vIEFMT0dWKCJcdEVxdWFsaXplclVwZGF0ZUFjdGl2ZVBhcmFtcyBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdEVxdWFsaXplclVwZGF0ZUFjdGl2ZVBhcmFtcyBqdXN0IEdvdCAtPiAlZFxuIiwKICAgICAvLyAgICAgICAgICBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb25bYmFuZF0uR2Fpbik7CiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKLSAgICAgICAgICAgQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeSA9IEVRTkJfNUJhbmRQcmVzZXRzRnJlcXVlbmNpZXNbaV07Ci0gICAgICAgICAgIEFjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXS5RRmFjdG9yICAgPSBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW2ldOwotICAgICAgICAgICBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb25baV0uR2FpbiA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV07Ci0gICAgICAgfQorICAgICAgICBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5ID0gRVFOQl81QmFuZFByZXNldHNGcmVxdWVuY2llc1tpXTsKKyAgICAgICAgQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLlFGYWN0b3IgPSBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW2ldOworICAgICAgICBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb25baV0uR2FpbiA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV07CisgICAgfQogCiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkVxdWFsaXplclVwZGF0ZUFjdGl2ZVBhcmFtcyIpCi0gICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJVcGRhdGVBY3RpdmVQYXJhbXMganVzdCBTZXQgLT4gJWRcbiIsCisgICAgLy8gQUxPR1YoIlx0RXF1YWxpemVyVXBkYXRlQWN0aXZlUGFyYW1zIGp1c3QgU2V0IC0+ICVkXG4iLAogICAgIC8vICAgICAgICAgIEFjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbltiYW5kXS5HYWluKTsKLQogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTgxNiwxOSArNzE5LDE5IEBACiAvLyBPdXRwdXRzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBMdm1FZmZlY3RfbGltaXRMZXZlbChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCkgewotICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWTV9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KK3ZvaWQgTHZtRWZmZWN0X2xpbWl0TGV2ZWwoRWZmZWN0Q29udGV4dCogcENvbnRleHQpIHsKKyAgICBMVk1fQ29udHJvbFBhcmFtc190IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUVmZmVjdF9saW1pdExldmVsIikKLSAgICAvL0FMT0dWKCJcdEx2bUVmZmVjdF9saW1pdExldmVsIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdEx2bUVmZmVjdF9saW1pdExldmVsIGp1c3QgR290IC0+ICVkXG4iLAorICAgIC8vIEFMT0dWKCJcdEx2bUVmZmVjdF9saW1pdExldmVsIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0THZtRWZmZWN0X2xpbWl0TGV2ZWwganVzdCBHb3QgLT4gJWRcbiIsCiAgICAgLy8gICAgICAgICAgQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uW2JhbmRdLkdhaW4pOwogCiAgICAgaW50IGdhaW5Db3JyZWN0aW9uID0gMDsKLSAgICAvL0NvdW50IHRoZSBlbmVyZ3kgY29udHJpYnV0aW9uIHBlciBiYW5kIGZvciBFUSBhbmQgQmFzc0Jvb3N0IG9ubHkgaWYgdGhleSBhcmUgYWN0aXZlLgorICAgIC8vIENvdW50IHRoZSBlbmVyZ3kgY29udHJpYnV0aW9uIHBlciBiYW5kIGZvciBFUSBhbmQgQmFzc0Jvb3N0IG9ubHkgaWYgdGhleSBhcmUgYWN0aXZlLgogICAgIGZsb2F0IGVuZXJneUNvbnRyaWJ1dGlvbiA9IDA7CiAgICAgZmxvYXQgZW5lcmd5Q3Jvc3MgPSAwOwogICAgIGZsb2F0IGVuZXJneUJhc3NCb29zdCA9IDA7CkBAIC04MzgsODggKzc0MSw4MyBAQAogICAgIGJvb2wgYmJFbmFibGVkID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NFbmFibGVkID09IExWTV9UUlVFOwogICAgIGJvb2wgdmlFbmFibGVkID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRTsKIAotICAgIC8vRVEgY29udHJpYnV0aW9uCisgICAgLy8gRVEgY29udHJpYnV0aW9uCiAgICAgaWYgKGVxRW5hYmxlZCkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKLSAgICAgICAgICAgIGZsb2F0IGJhbmRGYWN0b3IgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldLzE1LjA7CisgICAgICAgICAgICBmbG9hdCBiYW5kRmFjdG9yID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpXSAvIDE1LjA7CiAgICAgICAgICAgICBmbG9hdCBiYW5kQ29lZmZpY2llbnQgPSBMaW1pdExldmVsX2JhbmRFbmVyZ3lDb2VmZmljaWVudFtpXTsKICAgICAgICAgICAgIGZsb2F0IGJhbmRFbmVyZ3kgPSBiYW5kRmFjdG9yICogYmFuZENvZWZmaWNpZW50ICogYmFuZENvZWZmaWNpZW50OwotICAgICAgICAgICAgaWYgKGJhbmRFbmVyZ3kgPiAwKQotICAgICAgICAgICAgICAgIGVuZXJneUNvbnRyaWJ1dGlvbiArPSBiYW5kRW5lcmd5OworICAgICAgICAgICAgaWYgKGJhbmRFbmVyZ3kgPiAwKSBlbmVyZ3lDb250cmlidXRpb24gKz0gYmFuZEVuZXJneTsKICAgICAgICAgfQogCi0gICAgICAgIC8vY3Jvc3MgRVEgY29lZmZpY2llbnRzCisgICAgICAgIC8vIGNyb3NzIEVRIGNvZWZmaWNpZW50cwogICAgICAgICBmbG9hdCBiYW5kRmFjdG9yU3VtID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUy0xOyBpKyspIHsKLSAgICAgICAgICAgIGZsb2F0IGJhbmRGYWN0b3IxID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpXS8xNS4wOwotICAgICAgICAgICAgZmxvYXQgYmFuZEZhY3RvcjIgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2krMV0vMTUuMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUyAtIDE7IGkrKykgeworICAgICAgICAgICAgZmxvYXQgYmFuZEZhY3RvcjEgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldIC8gMTUuMDsKKyAgICAgICAgICAgIGZsb2F0IGJhbmRGYWN0b3IyID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpICsgMV0gLyAxNS4wOwogCiAgICAgICAgICAgICBpZiAoYmFuZEZhY3RvcjEgPiAwICYmIGJhbmRGYWN0b3IyID4gMCkgewotICAgICAgICAgICAgICAgIGZsb2F0IGNyb3NzRW5lcmd5ID0gYmFuZEZhY3RvcjEgKiBiYW5kRmFjdG9yMiAqCi0gICAgICAgICAgICAgICAgICAgICAgICBMaW1pdExldmVsX2JhbmRFbmVyZ3lDcm9zc0NvZWZmaWNpZW50W2ldOworICAgICAgICAgICAgICAgIGZsb2F0IGNyb3NzRW5lcmd5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbmRGYWN0b3IxICogYmFuZEZhY3RvcjIgKiBMaW1pdExldmVsX2JhbmRFbmVyZ3lDcm9zc0NvZWZmaWNpZW50W2ldOwogICAgICAgICAgICAgICAgIGJhbmRGYWN0b3JTdW0gKz0gYmFuZEZhY3RvcjEgKiBiYW5kRmFjdG9yMjsKIAotICAgICAgICAgICAgICAgIGlmIChjcm9zc0VuZXJneSA+IDApCi0gICAgICAgICAgICAgICAgICAgIGVuZXJneUNyb3NzICs9IGNyb3NzRW5lcmd5OworICAgICAgICAgICAgICAgIGlmIChjcm9zc0VuZXJneSA+IDApIGVuZXJneUNyb3NzICs9IGNyb3NzRW5lcmd5OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGJhbmRGYWN0b3JTdW0gLT0gMS4wOwotICAgICAgICBpZiAoYmFuZEZhY3RvclN1bSA+IDApCi0gICAgICAgICAgY3Jvc3NDb3JyZWN0aW9uID0gYmFuZEZhY3RvclN1bSAqIDAuNzsKKyAgICAgICAgaWYgKGJhbmRGYWN0b3JTdW0gPiAwKSBjcm9zc0NvcnJlY3Rpb24gPSBiYW5kRmFjdG9yU3VtICogMC43OwogICAgIH0KIAotICAgIC8vQmFzc0Jvb3N0IGNvbnRyaWJ1dGlvbgorICAgIC8vIEJhc3NCb29zdCBjb250cmlidXRpb24KICAgICBpZiAoYmJFbmFibGVkKSB7Ci0gICAgICAgIGZsb2F0IGJvb3N0RmFjdG9yID0gKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkKS8xMDAwLjA7CisgICAgICAgIGZsb2F0IGJvb3N0RmFjdG9yID0gKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkKSAvIDEwMDAuMDsKICAgICAgICAgZmxvYXQgYm9vc3RDb2VmZmljaWVudCA9IExpbWl0TGV2ZWxfYmFzc0Jvb3N0RW5lcmd5Q29lZmZpY2llbnQ7CiAKICAgICAgICAgZW5lcmd5Q29udHJpYnV0aW9uICs9IGJvb3N0RmFjdG9yICogYm9vc3RDb2VmZmljaWVudCAqIGJvb3N0Q29lZmZpY2llbnQ7CiAKICAgICAgICAgaWYgKGVxRW5hYmxlZCkgewogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgYmFuZEZhY3RvciA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV0vMTUuMDsKKyAgICAgICAgICAgICAgICBmbG9hdCBiYW5kRmFjdG9yID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpXSAvIDE1LjA7CiAgICAgICAgICAgICAgICAgZmxvYXQgYmFuZENyb3NzQ29lZmZpY2llbnQgPSBMaW1pdExldmVsX2Jhc3NCb29zdEVuZXJneUNyb3NzQ29lZmZpY2llbnRbaV07Ci0gICAgICAgICAgICAgICAgZmxvYXQgYmFuZEVuZXJneSA9IGJvb3N0RmFjdG9yICogYmFuZEZhY3RvciAqCi0gICAgICAgICAgICAgICAgICAgIGJhbmRDcm9zc0NvZWZmaWNpZW50OwotICAgICAgICAgICAgICAgIGlmIChiYW5kRW5lcmd5ID4gMCkKLSAgICAgICAgICAgICAgICAgIGVuZXJneUJhc3NCb29zdCArPSBiYW5kRW5lcmd5OworICAgICAgICAgICAgICAgIGZsb2F0IGJhbmRFbmVyZ3kgPSBib29zdEZhY3RvciAqIGJhbmRGYWN0b3IgKiBiYW5kQ3Jvc3NDb2VmZmljaWVudDsKKyAgICAgICAgICAgICAgICBpZiAoYmFuZEVuZXJneSA+IDApIGVuZXJneUJhc3NCb29zdCArPSBiYW5kRW5lcmd5OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgLy9WaXJ0dWFsaXplciBjb250cmlidXRpb24KKyAgICAvLyBWaXJ0dWFsaXplciBjb250cmlidXRpb24KICAgICBpZiAodmlFbmFibGVkKSB7Ci0gICAgICAgIGVuZXJneUNvbnRyaWJ1dGlvbiArPSBMaW1pdExldmVsX3ZpcnR1YWxpemVyQ29udHJpYnV0aW9uICoKLSAgICAgICAgICAgICAgICBMaW1pdExldmVsX3ZpcnR1YWxpemVyQ29udHJpYnV0aW9uOworICAgICAgICBlbmVyZ3lDb250cmlidXRpb24gKz0KKyAgICAgICAgICAgICAgICBMaW1pdExldmVsX3ZpcnR1YWxpemVyQ29udHJpYnV0aW9uICogTGltaXRMZXZlbF92aXJ0dWFsaXplckNvbnRyaWJ1dGlvbjsKICAgICB9CiAKLSAgICBkb3VibGUgdG90YWxFbmVyZ3lFc3RpbWF0aW9uID0gc3FydChlbmVyZ3lDb250cmlidXRpb24gKyBlbmVyZ3lDcm9zcyArIGVuZXJneUJhc3NCb29zdCkgLQotICAgICAgICAgICAgY3Jvc3NDb3JyZWN0aW9uOworICAgIGRvdWJsZSB0b3RhbEVuZXJneUVzdGltYXRpb24gPQorICAgICAgICAgICAgc3FydChlbmVyZ3lDb250cmlidXRpb24gKyBlbmVyZ3lDcm9zcyArIGVuZXJneUJhc3NCb29zdCkgLSBjcm9zc0NvcnJlY3Rpb247CiAgICAgQUxPR1YoIiBUT1RBTCBlbmVyZ3kgZXN0aW1hdGlvbjogJTAuMmYgZEIiLCB0b3RhbEVuZXJneUVzdGltYXRpb24pOwogCi0gICAgLy9yb3VuZG9mZgorICAgIC8vIHJvdW5kb2ZmCiAgICAgaW50IG1heExldmVsUm91bmQgPSAoaW50KSh0b3RhbEVuZXJneUVzdGltYXRpb24gKyAwLjk5KTsKICAgICBpZiAobWF4TGV2ZWxSb3VuZCArIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnZvbHVtZSA+IDApIHsKICAgICAgICAgZ2FpbkNvcnJlY3Rpb24gPSBtYXhMZXZlbFJvdW5kICsgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+dm9sdW1lOwogICAgIH0KIAotICAgIEFjdGl2ZVBhcmFtcy5WQ19FZmZlY3RMZXZlbCAgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT52b2x1bWUgLSBnYWluQ29ycmVjdGlvbjsKKyAgICBBY3RpdmVQYXJhbXMuVkNfRWZmZWN0TGV2ZWwgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT52b2x1bWUgLSBnYWluQ29ycmVjdGlvbjsKICAgICBpZiAoQWN0aXZlUGFyYW1zLlZDX0VmZmVjdExldmVsIDwgLTk2KSB7CiAgICAgICAgIEFjdGl2ZVBhcmFtcy5WQ19FZmZlY3RMZXZlbCA9IC05NjsKICAgICB9CiAgICAgQUxPR1YoIlx0Vm9sOiVkLCBHYWluQ29ycmVjdGlvbjogJWQsIEFjdHVhbCB2b2w6ICVkIiwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+dm9sdW1lLAotICAgICAgICAgICAgZ2FpbkNvcnJlY3Rpb24sIEFjdGl2ZVBhcmFtcy5WQ19FZmZlY3RMZXZlbCk7CisgICAgICAgICAgZ2FpbkNvcnJlY3Rpb24sIEFjdGl2ZVBhcmFtcy5WQ19FZmZlY3RMZXZlbCk7CiAKICAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtRWZmZWN0X2xpbWl0TGV2ZWwiKQogCiAgICAgQUxPR1YoIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyByZXR1cm46JWQiLCAoaW50KUx2bVN0YXR1cyk7Ci0gICAgLy9BTE9HVigiXHRMdm1FZmZlY3RfbGltaXRMZXZlbCBqdXN0IFNldCAtPiAlZFxuIiwKKyAgICAvLyBBTE9HVigiXHRMdm1FZmZlY3RfbGltaXRMZXZlbCBqdXN0IFNldCAtPiAlZFxuIiwKICAgICAvLyAgICAgICAgICBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb25bYmFuZF0uR2Fpbik7CiAKLSAgICAvL0FMT0dWKCJcdEx2bUVmZmVjdF9saW1pdExldmVsIGp1c3Qgc2V0ICgtOTZkQiAtPiAwZEIpIC0+ICVkXG4iLEFjdGl2ZVBhcmFtcy5WQ19FZmZlY3RMZXZlbCApOwotICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5maXJzdFZvbHVtZSA9PSBMVk1fVFJVRSl7CisgICAgLy8gQUxPR1YoIlx0THZtRWZmZWN0X2xpbWl0TGV2ZWwganVzdCBzZXQgKC05NmRCIC0+IDBkQikgLT4gJWRcbiIsQWN0aXZlUGFyYW1zLlZDX0VmZmVjdExldmVsICk7CisgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZpcnN0Vm9sdW1lID09IExWTV9UUlVFKSB7CiAgICAgICAgIEx2bVN0YXR1cyA9IExWTV9TZXRWb2x1bWVOb1Ntb290aGluZyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldFZvbHVtZU5vU21vb3RoaW5nIiwgIkx2bUJ1bmRsZV9wcm9jZXNzIikKICAgICAgICAgQUxPR1YoIlx0TFZNX1ZPTFVNRTogRGlzYWJsaW5nIFNtb290aGluZyBmb3IgZmlyc3Qgdm9sdW1lIGNoYW5nZSB0byByZW1vdmUgc3Bpa2VzL2NsaWNrcyIpOwpAQCAtOTM5LDQyICs4MzcsNDEgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IEx2bUVmZmVjdF9lbmFibGUoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpewotICAgIC8vQUxPR1YoIlx0THZtRWZmZWN0X2VuYWJsZSBzdGFydCIpOworaW50IEx2bUVmZmVjdF9lbmFibGUoRWZmZWN0Q29udGV4dCogcENvbnRleHQpIHsKKyAgICAvLyBBTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIHN0YXJ0Iik7CiAKLSAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fQ29udHJvbFBhcmFtc190IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KLSAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWN0aXZlUGFyYW1zKTsKKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtRWZmZWN0X2VuYWJsZSIpCi0gICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKLSAgICAvL0FMT0dWKCJcdEx2bUVmZmVjdF9lbmFibGUgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgLy8gQUxPR1YoIlx0THZtRWZmZWN0X2VuYWJsZSBTdWNjZXNzZnVsbHkgY2FsbGVkIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CiAKLSAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgeworICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgewogICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIDogRW5hYmxpbmcgTFZNX0JBU1NfQk9PU1QiKTsKLSAgICAgICAgQWN0aXZlUGFyYW1zLkJFX09wZXJhdGluZ01vZGUgICAgICAgPSBMVk1fQkVfT047CisgICAgICAgIEFjdGl2ZVBhcmFtcy5CRV9PcGVyYXRpbmdNb2RlID0gTFZNX0JFX09OOwogICAgIH0KLSAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpIHsKKyAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSB7CiAgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9lbmFibGUgOiBFbmFibGluZyBMVk1fVklSVFVBTElaRVIiKTsKLSAgICAgICAgQWN0aXZlUGFyYW1zLlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSAgID0gTFZNX01PREVfT047CisgICAgICAgIEFjdGl2ZVBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PTjsKICAgICB9Ci0gICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUikgeworICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSB7CiAgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9lbmFibGUgOiBFbmFibGluZyBMVk1fRVFVQUxJWkVSIik7Ci0gICAgICAgIEFjdGl2ZVBhcmFtcy5FUU5CX09wZXJhdGluZ01vZGUgICAgID0gTFZNX0VRTkJfT047CisgICAgICAgIEFjdGl2ZVBhcmFtcy5FUU5CX09wZXJhdGluZ01vZGUgPSBMVk1fRVFOQl9PTjsKICAgICB9Ci0gICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZPTFVNRSkgeworICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKSB7CiAgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9lbmFibGUgOiBFbmFibGluZyBMVk1fVk9MVU1FIik7CiAgICAgfQogCiAgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJMdm1FZmZlY3RfZW5hYmxlIikKLSAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCi0gICAgLy9BTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0THZtRWZmZWN0X2VuYWJsZSBlbmQiKTsKKyAgICAvLyBBTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIFN1Y2Nlc3NmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIGVuZCIpOwogICAgIEx2bUVmZmVjdF9saW1pdExldmVsKHBDb250ZXh0KTsKICAgICByZXR1cm4gMDsKIH0KQEAgLTk5MSw4MiArODg4LDQ1IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBMdm1FZmZlY3RfZGlzYWJsZShFZmZlY3RDb250ZXh0ICpwQ29udGV4dCl7Ci0gICAgLy9BTE9HVigiXHRMdm1FZmZlY3RfZGlzYWJsZSBzdGFydCIpOworaW50IEx2bUVmZmVjdF9kaXNhYmxlKEVmZmVjdENvbnRleHQqIHBDb250ZXh0KSB7CisgICAgLy8gQUxPR1YoIlx0THZtRWZmZWN0X2Rpc2FibGUgc3RhcnQiKTsKIAotICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9Db250cm9sUGFyYW1zX3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KLSAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWN0aXZlUGFyYW1zKTsKKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtRWZmZWN0X2Rpc2FibGUiKQotICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7Ci0gICAgLy9BTE9HVigiXHRMdm1FZmZlY3RfZGlzYWJsZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICAvLyBBTE9HVigiXHRMdm1FZmZlY3RfZGlzYWJsZSBTdWNjZXNzZnVsbHkgY2FsbGVkIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CiAKLSAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgeworICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgewogICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZGlzYWJsZSA6IERpc2FibGluZyBMVk1fQkFTU19CT09TVCIpOwotICAgICAgICBBY3RpdmVQYXJhbXMuQkVfT3BlcmF0aW5nTW9kZSAgICAgICA9IExWTV9CRV9PRkY7CisgICAgICAgIEFjdGl2ZVBhcmFtcy5CRV9PcGVyYXRpbmdNb2RlID0gTFZNX0JFX09GRjsKICAgICB9Ci0gICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSB7CisgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUikgewogICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZGlzYWJsZSA6IERpc2FibGluZyBMVk1fVklSVFVBTElaRVIiKTsKLSAgICAgICAgQWN0aXZlUGFyYW1zLlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSAgID0gTFZNX01PREVfT0ZGOworICAgICAgICBBY3RpdmVQYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT0ZGOwogICAgIH0KLSAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSB7CisgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpIHsKICAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2Rpc2FibGUgOiBEaXNhYmxpbmcgTFZNX0VRVUFMSVpFUiIpOwotICAgICAgICBBY3RpdmVQYXJhbXMuRVFOQl9PcGVyYXRpbmdNb2RlICAgICA9IExWTV9FUU5CX09GRjsKKyAgICAgICAgQWN0aXZlUGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSA9IExWTV9FUU5CX09GRjsKICAgICB9Ci0gICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZPTFVNRSkgeworICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKSB7CiAgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9kaXNhYmxlIDogRGlzYWJsaW5nIExWTV9WT0xVTUUiKTsKICAgICB9CiAKICAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUVmZmVjdF9kaXNhYmxlIikKLSAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCi0gICAgLy9BTE9HVigiXHRMdm1FZmZlY3RfZGlzYWJsZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdEx2bUVmZmVjdF9kaXNhYmxlIGVuZCIpOworICAgIC8vIEFMT0dWKCJcdEx2bUVmZmVjdF9kaXNhYmxlIFN1Y2Nlc3NmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRMdm1FZmZlY3RfZGlzYWJsZSBlbmQiKTsKICAgICBMdm1FZmZlY3RfbGltaXRMZXZlbChwQ29udGV4dCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTHZtRWZmZWN0X2ZyZWUoKQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQdXJwb3NlOiBGcmVlIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBCdW5kbGUuCi0vLwotLy8gSW5wdXRzOgotLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAotLy8KLS8vIE91dHB1dHM6Ci0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgTHZtRWZmZWN0X2ZyZWUoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpewotICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVk1fU1VDQ0VTUzsgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICAgIExWTV9NZW1UYWJfdCAgICAgICAgICAgIE1lbVRhYjsKLQotICAgIC8qIEZyZWUgdGhlIGFsZ29yaXRobSBtZW1vcnkgKi8KLSAgICBMdm1TdGF0dXMgPSBMVk1fR2V0TWVtb3J5VGFibGUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7Ci0KLSAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldE1lbW9yeVRhYmxlIiwgIkx2bUVmZmVjdF9mcmVlIikKLQotICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7Ci0gICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCl7Ci0gICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgIT0gTlVMTCl7Ci0gICAgICAgICAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBMdm1FZmZlY3RfZnJlZSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICUiIFBSSXUzMgotICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwIEVSUk9SXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19ICAgIC8qIGVuZCBMdm1FZmZlY3RfZnJlZSAqLwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEVmZmVjdF9zZXRDb25maWcoKQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBQdXJwb3NlOiBTZXQgaW5wdXQgYW5kIG91dHB1dCBhdWRpbyBjb25maWd1cmF0aW9uLgpAQCAtMTA4MCw5ICs5NDAsOSBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgRWZmZWN0X3NldENvbmZpZyhFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKXsKLSAgICBMVk1fRnNfZW4gICBTYW1wbGVSYXRlOwotICAgIC8vQUxPR1YoIlx0RWZmZWN0X3NldENvbmZpZyBzdGFydCIpOworaW50IEVmZmVjdF9zZXRDb25maWcoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCogcENvbmZpZykgeworICAgIExWTV9Gc19lbiBTYW1wbGVSYXRlOworICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9zZXRDb25maWcgc3RhcnQiKTsKIAogICAgIENIRUNLX0FSRyhwQ29udGV4dCAhPSBOVUxMKTsKICAgICBDSEVDS19BUkcocENvbmZpZyAhPSBOVUxMKTsKQEAgLTEwOTAsMTA3ICs5NTAsNjQgQEAKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlID09IHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCk7Ci0jaWZkZWYgU1VQUE9SVF9NQwogICAgIENIRUNLX0FSRyhhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpIDw9IExWTV9NQVhfQ0hBTk5FTFMpOwotI2Vsc2UKLSAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKLSNlbmRpZgotICAgIENIRUNLX0FSRyhwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURQotICAgICAgICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKTsKKyAgICBDSEVDS19BUkcocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUgfHwKKyAgICAgICAgICAgICAgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVCk7CiAgICAgcENvbnRleHQtPmNvbmZpZyA9ICpwQ29uZmlnOwogICAgIGNvbnN0IExWTV9JTlQxNiBOckNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKIAotICAgIHN3aXRjaCAocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlKSB7Ci0gICAgY2FzZSA4MDAwOgotICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzgwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA4MDAwICogTnJDaGFubmVsczsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjAwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xNjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE2MDAwICogTnJDaGFubmVsczsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMjA1MDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDIyMDUwICogTnJDaGFubmVsczsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjAwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18zMjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDMyMDAwICogTnJDaGFubmVsczsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0NDEwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ0MTAwICogTnJDaGFubmVsczsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0ODAwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ4MDAwICogTnJDaGFubmVsczsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4ODIwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184ODIwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDg4MjAwICogTnJDaGFubmVsczsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5NjAwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU185NjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDk2MDAwICogTnJDaGFubmVsczsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNzY0MDA6Ci0gICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gMTc2NDAwICogTnJDaGFubmVsczsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOTIwMDA6Ci0gICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTkyMDAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gMTkyMDAwICogTnJDaGFubmVsczsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1YoIlx0RWZmZWN0X3NldENvbmZpZyBpbnZhbGlkIHNhbXBsaW5nIHJhdGUgJWQiLCBwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpOworICAgIFNhbXBsZVJhdGUgPSBsdm1Gc0ZvclNhbXBsZVJhdGUocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlKTsKKyAgICBpZiAoU2FtcGxlUmF0ZSA9PSBMVk1fRlNfSU5WQUxJRCkgeworICAgICAgICBBTE9HVigiRWZmZWN0X3NldENvbmZpZyBpbnZhbGlkIHNhbXBsaW5nIHJhdGUgJWQiLCBwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSAqIE5yQ2hhbm5lbHM7CiAKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZVJhdGUgIT0gU2FtcGxlUmF0ZSB8fAogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DaE1hc2sgIT0gcENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpIHsKLSNlbHNlCi0gICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlUmF0ZSAhPSBTYW1wbGVSYXRlKXsKLSNlbmRpZgotCi0gICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsKLSAgICAgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7CisgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgQWN0aXZlUGFyYW1zOworICAgICAgICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOwogCiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdF9zZXRDb25maWcgY2hhbmdlIHNhbXBsaW5nIHJhdGUgdG8gJWQiLCBTYW1wbGVSYXRlKTsKIAogICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KLSAgICAgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFjdGl2ZVBhcmFtcyk7CisgICAgICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogCiAgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiRWZmZWN0X3NldENvbmZpZyIpCi0gICAgICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCiAgICAgICAgIEFjdGl2ZVBhcmFtcy5TYW1wbGVSYXRlID0gU2FtcGxlUmF0ZTsKIAotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgQWN0aXZlUGFyYW1zLk5yQ2hhbm5lbHMgPSBOckNoYW5uZWxzOwogICAgICAgICBBY3RpdmVQYXJhbXMuQ2hNYXNrID0gcENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHM7Ci0jZW5kaWYKKworICAgICAgICBpZiAoTnJDaGFubmVscyA9PSAxKSB7CisgICAgICAgICAgICBBY3RpdmVQYXJhbXMuU291cmNlRm9ybWF0ID0gTFZNX01PTk87CisgICAgICAgIH0gZWxzZSBpZiAoTnJDaGFubmVscyA9PSAyKSB7CisgICAgICAgICAgICBBY3RpdmVQYXJhbXMuU291cmNlRm9ybWF0ID0gTFZNX1NURVJFTzsKKyAgICAgICAgfSBlbHNlIGlmIChOckNoYW5uZWxzID4gMiAmJiBOckNoYW5uZWxzIDw9IExWTV9NQVhfQ0hBTk5FTFMpIHsKKyAgICAgICAgICAgIEFjdGl2ZVBhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVk1fTVVMVElDSEFOTkVMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KIAogICAgICAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKIAogICAgICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkVmZmVjdF9zZXRDb25maWciKQotICAgICAgICBBTE9HVigiXHRFZmZlY3Rfc2V0Q29uZmlnIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgICAgICBBTE9HVigiXHRFZmZlY3Rfc2V0Q29uZmlnIFN1Y2Nlc3NmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlUmF0ZSA9IFNhbXBsZVJhdGU7Ci0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DaE1hc2sgPSBwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVsczsKLSNlbmRpZgogCiAgICAgICAgIEx2bUVmZmVjdF9saW1pdExldmVsKHBDb250ZXh0KTsKIAotICAgIH1lbHNlewotICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9zZXRDb25maWcga2VlcCBzYW1wbGluZyByYXRlIGF0ICVkIiwgU2FtcGxlUmF0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X3NldENvbmZpZyBrZWVwIHNhbXBsaW5nIHJhdGUgYXQgJWQiLCBTYW1wbGVSYXRlKTsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdEVmZmVjdF9zZXRDb25maWcgRW5kLi4uLiIpOworICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9zZXRDb25maWcgRW5kLi4uLiIpOwogICAgIHJldHVybiAwOwotfSAgIC8qIGVuZCBFZmZlY3Rfc2V0Q29uZmlnICovCit9IC8qIGVuZCBFZmZlY3Rfc2V0Q29uZmlnICovCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gRWZmZWN0X2dldENvbmZpZygpCkBAIC0xMjA2LDEwICsxMDIzLDkgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotdm9pZCBFZmZlY3RfZ2V0Q29uZmlnKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpCi17Cit2b2lkIEVmZmVjdF9nZXRDb25maWcoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCogcENvbmZpZykgewogICAgICpwQ29uZmlnID0gcENvbnRleHQtPmNvbmZpZzsKLX0gICAvKiBlbmQgRWZmZWN0X2dldENvbmZpZyAqLworfSAvKiBlbmQgRWZmZWN0X2dldENvbmZpZyAqLwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEJhc3NHZXRTdHJlbmd0aCgpCkBAIC0xMjI1LDMyICsxMDQxLDMxIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXVpbnQzMl90IEJhc3NHZXRTdHJlbmd0aChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCl7Ci0gICAgLy9BTE9HVigiXHRCYXNzR2V0U3RyZW5ndGgoKSAoMC0xMDAwKSAtPiAlZFxuIiwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQpOwordWludDMyX3QgQmFzc0dldFN0cmVuZ3RoKEVmZmVjdENvbnRleHQqIHBDb250ZXh0KSB7CisgICAgLy8gQUxPR1YoIlx0QmFzc0dldFN0cmVuZ3RoKCkgKDAtMTAwMCkgLT4gJWRcbiIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkKTsKIAotICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9Db250cm9sUGFyYW1zX3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KLSAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWN0aXZlUGFyYW1zKTsKKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiQmFzc0dldFN0cmVuZ3RoIikKLSAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCi0gICAgLy9BTE9HVigiXHRCYXNzR2V0U3RyZW5ndGggU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdEJhc3NHZXRTdHJlbmd0aCBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwogCiAgICAgLyogQ2hlY2sgdGhhdCB0aGUgc3RyZW5ndGggcmV0dXJuZWQgbWF0Y2hlcyB0aGUgc3RyZW5ndGggdGhhdCB3YXMgc2V0IGVhcmxpZXIgKi8KLSAgICBpZihBY3RpdmVQYXJhbXMuQkVfRWZmZWN0TGV2ZWwgIT0KLSAgICAgICAoTFZNX0lOVDE2KSgoMTUqcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQpLzEwMDApKXsKKyAgICBpZiAoQWN0aXZlUGFyYW1zLkJFX0VmZmVjdExldmVsICE9CisgICAgICAgIChMVk1fSU5UMTYpKCgxNSAqIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkKSAvIDEwMDApKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEJhc3NHZXRTdHJlbmd0aCBtb2R1bGUgc3RyZW5ndGggZG9lcyBub3QgbWF0Y2ggc2F2ZWRTdHJlbmd0aCAlZCAlZFxuIiwKLSAgICAgICAgICAgICAgICBBY3RpdmVQYXJhbXMuQkVfRWZmZWN0TGV2ZWwsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkKTsKKyAgICAgICAgICAgICAgQWN0aXZlUGFyYW1zLkJFX0VmZmVjdExldmVsLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCk7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlx0QmFzc0dldFN0cmVuZ3RoKCkgKDAtMTUpICAgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5CRV9FZmZlY3RMZXZlbCApOwotICAgIC8vQUxPR1YoIlx0QmFzc0dldFN0cmVuZ3RoKCkgKHNhdmVkKSAgLT4gJWRcbiIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkICk7CisgICAgLy8gQUxPR1YoIlx0QmFzc0dldFN0cmVuZ3RoKCkgKDAtMTUpICAgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5CRV9FZmZlY3RMZXZlbCApOworICAgIC8vIEFMT0dWKCJcdEJhc3NHZXRTdHJlbmd0aCgpIChzYXZlZCkgIC0+ICVkXG4iLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCApOwogICAgIHJldHVybiBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZDsKLX0gICAgLyogZW5kIEJhc3NHZXRTdHJlbmd0aCAqLworfSAvKiBlbmQgQmFzc0dldFN0cmVuZ3RoICovCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQmFzc1NldFN0cmVuZ3RoKCkKQEAgLTEyNjQsMzUgKzEwNzksMzQgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotdm9pZCBCYXNzU2V0U3RyZW5ndGgoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHVpbnQzMl90IHN0cmVuZ3RoKXsKLSAgICAvL0FMT0dWKCJcdEJhc3NTZXRTdHJlbmd0aCglZCkiLCBzdHJlbmd0aCk7Cit2b2lkIEJhc3NTZXRTdHJlbmd0aChFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgdWludDMyX3Qgc3RyZW5ndGgpIHsKKyAgICAvLyBBTE9HVigiXHRCYXNzU2V0U3RyZW5ndGgoJWQpIiwgc3RyZW5ndGgpOwogCiAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQgPSAoaW50KXN0cmVuZ3RoOwogCi0gICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9Db250cm9sUGFyYW1zX3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KIAogICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwotICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBY3RpdmVQYXJhbXMpOworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogCiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJCYXNzU2V0U3RyZW5ndGgiKQotICAgIC8vQUxPR1YoIlx0QmFzc1NldFN0cmVuZ3RoIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRCYXNzU2V0U3RyZW5ndGggU3VjY2Vzc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKIAogICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLwotICAgIEFjdGl2ZVBhcmFtcy5CRV9FZmZlY3RMZXZlbCAgICA9IChMVk1fSU5UMTYpKCgxNSpzdHJlbmd0aCkvMTAwMCk7Ci0gICAgQWN0aXZlUGFyYW1zLkJFX0NlbnRyZUZyZXEgICAgID0gTFZNX0JFX0NFTlRSRV85MEh6OworICAgIEFjdGl2ZVBhcmFtcy5CRV9FZmZlY3RMZXZlbCA9IChMVk1fSU5UMTYpKCgxNSAqIHN0cmVuZ3RoKSAvIDEwMDApOworICAgIEFjdGl2ZVBhcmFtcy5CRV9DZW50cmVGcmVxID0gTFZNX0JFX0NFTlRSRV85MEh6OwogCi0gICAgLy9BTE9HVigiXHRCYXNzU2V0U3RyZW5ndGgoKSAoMC0xNSkgICAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkJFX0VmZmVjdExldmVsICk7CisgICAgLy8gQUxPR1YoIlx0QmFzc1NldFN0cmVuZ3RoKCkgKDAtMTUpICAgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5CRV9FZmZlY3RMZXZlbCApOwogCiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiQmFzc1NldFN0cmVuZ3RoIikKLSAgICAvL0FMT0dWKCJcdEJhc3NTZXRTdHJlbmd0aCBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRCYXNzU2V0U3RyZW5ndGggU3VjY2Vzc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwogCiAgICAgTHZtRWZmZWN0X2xpbWl0TGV2ZWwocENvbnRleHQpOwotfSAgICAvKiBlbmQgQmFzc1NldFN0cmVuZ3RoICovCit9IC8qIGVuZCBCYXNzU2V0U3RyZW5ndGggKi8KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBWaXJ0dWFsaXplckdldFN0cmVuZ3RoKCkKQEAgLTEzMDgsMjEgKzExMjIsMjMgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotdWludDMyX3QgVmlydHVhbGl6ZXJHZXRTdHJlbmd0aChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCl7Ci0gICAgLy9BTE9HVigiXHRWaXJ0dWFsaXplckdldFN0cmVuZ3RoICgwLTEwMDApIC0+ICVkXG4iLHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlZpcnRTdHJlbmd0aFNhdmVkKTsKK3VpbnQzMl90IFZpcnR1YWxpemVyR2V0U3RyZW5ndGgoRWZmZWN0Q29udGV4dCogcENvbnRleHQpIHsKKyAgICAvLyBBTE9HVigiXHRWaXJ0dWFsaXplckdldFN0cmVuZ3RoICgwLTEwMDApIC0+CisgICAgLy8gJWRcbiIscENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+VmlydFN0cmVuZ3RoU2F2ZWQpOwogCi0gICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7ICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCiAgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZpcnR1YWxpemVyR2V0U3RyZW5ndGgiKQotICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKLSAgICAvL0FMT0dWKCJcdFZpcnR1YWxpemVyR2V0U3RyZW5ndGggU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0VmlydHVhbGl6ZXJHZXRTdHJlbmd0aCgpICgwLTEwMCkgICAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwqMTApOworICAgIC8vIEFMT0dWKCJcdFZpcnR1YWxpemVyR2V0U3RyZW5ndGggU3VjY2Vzc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRWaXJ0dWFsaXplckdldFN0cmVuZ3RoKCkgKDAtMTAwKSAgIC0+ICVkXG4iLAorICAgIC8vIEFjdGl2ZVBhcmFtcy5WaXJ0dWFsaXplclJldmVyYkxldmVsKjEwKTsKICAgICByZXR1cm4gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+VmlydFN0cmVuZ3RoU2F2ZWQ7Ci19ICAgIC8qIGVuZCBnZXRTdHJlbmd0aCAqLworfSAvKiBlbmQgZ2V0U3RyZW5ndGggKi8KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBWaXJ0dWFsaXplclNldFN0cmVuZ3RoKCkKQEAgLTEzMzYsMzEgKzExNTIsMzEgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotdm9pZCBWaXJ0dWFsaXplclNldFN0cmVuZ3RoKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB1aW50MzJfdCBzdHJlbmd0aCl7Ci0gICAgLy9BTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoKCVkKSIsIHN0cmVuZ3RoKTsKLSAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVk1fU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCit2b2lkIFZpcnR1YWxpemVyU2V0U3RyZW5ndGgoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIHVpbnQzMl90IHN0cmVuZ3RoKSB7CisgICAgLy8gQUxPR1YoIlx0VmlydHVhbGl6ZXJTZXRTdHJlbmd0aCglZCkiLCBzdHJlbmd0aCk7CisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCiAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+VmlydFN0cmVuZ3RoU2F2ZWQgPSAoaW50KXN0cmVuZ3RoOwogCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCi0gICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwmQWN0aXZlUGFyYW1zKTsKKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVmlydHVhbGl6ZXJTZXRTdHJlbmd0aCIpCi0gICAgLy9BTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CiAKICAgICAvKiBWaXJ0dWFsaXplciBwYXJhbWV0ZXJzICovCi0gICAgQWN0aXZlUGFyYW1zLkNTX0VmZmVjdExldmVsICAgICAgICAgICAgID0gKGludCkoKHN0cmVuZ3RoKjMyNzY3KS8xMDAwKTsKKyAgICBBY3RpdmVQYXJhbXMuQ1NfRWZmZWN0TGV2ZWwgPSAoaW50KSgoc3RyZW5ndGggKiAzMjc2NykgLyAxMDAwKTsKIAotICAgIEFMT0dWKCJcdFZpcnR1YWxpemVyU2V0U3RyZW5ndGgoKSAoMC0xMDAwKSAgIC0+ICVkXG4iLCBzdHJlbmd0aCApOwotICAgIEFMT0dWKCJcdFZpcnR1YWxpemVyU2V0U3RyZW5ndGgoKSAoMC0gMTAwKSAgIC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuQ1NfRWZmZWN0TGV2ZWwgKTsKKyAgICBBTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoKCkgKDAtMTAwMCkgICAtPiAlZFxuIiwgc3RyZW5ndGgpOworICAgIEFMT0dWKCJcdFZpcnR1YWxpemVyU2V0U3RyZW5ndGgoKSAoMC0gMTAwKSAgIC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuQ1NfRWZmZWN0TGV2ZWwpOwogCiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZpcnR1YWxpemVyU2V0U3RyZW5ndGgiKQotICAgIC8vQUxPR1YoIlx0VmlydHVhbGl6ZXJTZXRTdHJlbmd0aCBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG5cbiIpOworICAgIC8vIEFMT0dWKCJcdFZpcnR1YWxpemVyU2V0U3RyZW5ndGggU3VjY2Vzc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcblxuIik7CiAgICAgTHZtRWZmZWN0X2xpbWl0TGV2ZWwocENvbnRleHQpOwotfSAgICAvKiBlbmQgc2V0U3RyZW5ndGggKi8KK30gLyogZW5kIHNldFN0cmVuZ3RoICovCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZCgpCkBAIC0xMzc2LDE0ICsxMTkyLDE0IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGludCBWaXJ0dWFsaXplcklzRGV2aWNlU3VwcG9ydGVkKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlKSB7CiAgICAgc3dpdGNoIChkZXZpY2VUeXBlKSB7Ci0gICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ6Ci0gICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORToKLSAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzoKLSAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQ6Ci0gICAgLy8gY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U6ICAvLyBGb3IgVVNCIHRlc3Rpbmcgb2YgdGhlIHZpcnR1YWxpemVyIG9ubHkuCi0gICAgICAgIHJldHVybiAwOwotICAgIGRlZmF1bHQgOgotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQ6CisgICAgICAgICAgICAvLyBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRTogIC8vIEZvciBVU0IgdGVzdGluZyBvZiB0aGUgdmlydHVhbGl6ZXIgb25seS4KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogfQogCkBAIC0xNDAxLDkgKzEyMTcsOSBAQAogLy8gIDAgICAgICAgICAgICBpZiB0aGUgY29uZmlndXJhdGlvbiBpcyBzdXBwb3J0ZWQKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogaW50IFZpcnR1YWxpemVySXNDb25maWd1cmF0aW9uU3VwcG9ydGVkKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlKSB7CiAgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKLSAgICBpZiAoY2hhbm5lbENvdW50IDwgMSB8fCBjaGFubmVsQ291bnQgPiBGQ0NfMikgeyAvLyBUT0RPOiB1cGRhdGUgdG8gOCBjaGFubmVscyB3aGVuIHN1cHBvcnRlZC4KKyAgICBpZiAoY2hhbm5lbENvdW50IDwgMSB8fCBjaGFubmVsQ291bnQgPiBGQ0NfMikgeyAgLy8gVE9ETzogdXBkYXRlIHRvIDggY2hhbm5lbHMgd2hlbiBzdXBwb3J0ZWQuCiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KICAgICByZXR1cm4gVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZChkZXZpY2VUeXBlKTsKQEAgLTE0MjMsMTYgKzEyMzksMTYgQEAKIC8vICAwICAgICAgICAgICAgaWYgdGhlIGRldmljZSBpcyBzdXBwb3J0ZWQgYW5kIHRoZSB2aXJ0dWFsaXphdGlvbiBtb2RlIGZvcmNlZAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50IFZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGUoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGF1ZGlvX2RldmljZXNfdCBmb3JjZWREZXZpY2UpIHsKK2ludCBWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCBhdWRpb19kZXZpY2VzX3QgZm9yY2VkRGV2aWNlKSB7CiAgICAgQUxPR1YoIlZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGU6IGZvcmNlZERldj0weCV4IGVuYWJsZWQ9JWQgdG1wRGlzYWJsZWQ9JWQiLAotICAgICAgICAgICAgZm9yY2VkRGV2aWNlLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkLAotICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkKTsKKyAgICAgICAgICBmb3JjZWREZXZpY2UsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQsCisgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkKTsKICAgICBpbnQgc3RhdHVzID0gMDsKICAgICBib29sIHVzZVZpcnR1YWxpemVyID0gZmFsc2U7CiAKICAgICBpZiAoVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZChmb3JjZWREZXZpY2UpICE9IDApIHsKICAgICAgICAgaWYgKGZvcmNlZERldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgLy9mb3JjZWQgZGV2aWNlIGlzIG5vdCBzdXBwb3J0ZWQsIG1ha2UgaXQgYmVoYXZlIGFzIGEgcmVzZXQgb2YgZm9yY2VkIG1vZGUKKyAgICAgICAgICAgIC8vIGZvcmNlZCBkZXZpY2UgaXMgbm90IHN1cHBvcnRlZCwgbWFrZSBpdCBiZWhhdmUgYXMgYSByZXNldCBvZiBmb3JjZWQgbW9kZQogICAgICAgICAgICAgZm9yY2VkRGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CiAgICAgICAgICAgICAvLyBidXQgcmV0dXJuIGFuIGVycm9yCiAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwpAQCAtMTQ3Miw4ICsxMjg4LDggQEAKICAgICB9CiAKICAgICBBTE9HVigiXHRhZnRlciBWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlOiBlbmFibGVkPSVkIHRtcERpc2FibGVkPSVkIiwKLSAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQsCi0gICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQpOworICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQsCisgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkKTsKIAogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC0xNDk5LDIzICsxMzE1LDI0IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB2b2lkIFZpcnR1YWxpemVyR2V0U3BlYWtlckFuZ2xlcyhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgX191bnVzZWQsIGludDMyX3QgKnBTcGVha2VyQW5nbGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgLyogZGV2aWNlVHlwZSBfX3VudXNlZCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBTcGVha2VyQW5nbGVzKSB7CiAgICAgLy8gdGhlIGNoYW5uZWwgY291bnQgaXMgZ3VhcmFudGVlZCB0byBiZSAxIG9yIDIKICAgICAvLyB0aGUgZGV2aWNlIGlzIGd1YXJhbnRlZWQgdG8gYmUgb2YgdHlwZSBoZWFkcGhvbmUKICAgICAvLyB0aGlzIHZpcnR1YWxpemVyIGlzIGFsd2F5cyB1c2luZyAyIHZpcnR1YWwgc3BlYWtlcnMgYXQgLTkwIGFuZCA5MGRlZyBvZiBhemltdXRoLCAwZGVnIG9mCiAgICAgLy8gZWxldmF0aW9uIGJ1dCB0aGUgcmV0dXJuIGluZm9ybWF0aW9uIGlzIHNpemVkIGZvciBuYkNoYW5uZWxzICogMywgc28gd2UgaGF2ZSB0byBjb25zaWRlcgogICAgIC8vIHRoZSAoZmFsc2UgaGVyZSkgY2FzZSBvZiBhIHNpbmdsZSBjaGFubmVsLCBhbmQgcmV0dXJuIG9ubHkgMyBmaWVsZHMuCiAgICAgaWYgKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzaykgPT0gMSkgewotICAgICAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IChpbnQzMl90KSBBVURJT19DSEFOTkVMX09VVF9NT05POyAvLyBzYW1lIGFzIEZST05UX0xFRlQKLSAgICAgICAgKnBTcGVha2VyQW5nbGVzKysgPSAwOyAvLyBhemltdXRoCi0gICAgICAgICpwU3BlYWtlckFuZ2xlcyA9IDA7IC8vIGVsZXZhdGlvbgorICAgICAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IChpbnQzMl90KUFVRElPX0NIQU5ORUxfT1VUX01PTk87ICAvLyBzYW1lIGFzIEZST05UX0xFRlQKKyAgICAgICAgKnBTcGVha2VyQW5nbGVzKysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXppbXV0aAorICAgICAgICAqcFNwZWFrZXJBbmdsZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGV2YXRpb24KICAgICB9IGVsc2UgewotICAgICAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IChpbnQzMl90KSBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUOwotICAgICAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IC05MDsgLy8gYXppbXV0aAotICAgICAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IDA7ICAgLy8gZWxldmF0aW9uCi0gICAgICAgICpwU3BlYWtlckFuZ2xlcysrID0gKGludDMyX3QpIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUOworICAgICAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IChpbnQzMl90KUFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQ7CisgICAgICAgICpwU3BlYWtlckFuZ2xlcysrID0gLTkwOyAgLy8gYXppbXV0aAorICAgICAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IDA7ICAgIC8vIGVsZXZhdGlvbgorICAgICAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IChpbnQzMl90KUFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUOwogICAgICAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IDkwOyAgLy8gYXppbXV0aAotICAgICAgICAqcFNwZWFrZXJBbmdsZXMgICA9IDA7ICAgLy8gZWxldmF0aW9uCisgICAgICAgICpwU3BlYWtlckFuZ2xlcyA9IDA7ICAgICAvLyBlbGV2YXRpb24KICAgICB9CiB9CiAKQEAgLTE1MjksMTAgKzEzNDYsMTAgQEAKIC8vICAgQVVESU9fREVWSUNFX05PTkUgaWYgdGhlIGVmZmVjdCBpcyBub3QgdmlydHVhbGl6aW5nCiAvLyAgIG9yIHRoZSBkZXZpY2UgdHlwZSBpZiB0aGUgZWZmZWN0IGlzIHZpcnR1YWxpemluZwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1hdWRpb19kZXZpY2VzX3QgVmlydHVhbGl6ZXJHZXRWaXJ0dWFsaXphdGlvbk1vZGUoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpIHsKK2F1ZGlvX2RldmljZXNfdCBWaXJ0dWFsaXplckdldFZpcnR1YWxpemF0aW9uTW9kZShFZmZlY3RDb250ZXh0KiBwQ29udGV4dCkgewogICAgIGF1ZGlvX2RldmljZXNfdCB2aXJ0RGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgaWYgKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFKQotICAgICAgICAgICAgJiYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9PSBMVk1fRkFMU0UpKSB7CisgICAgaWYgKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFKSAmJgorICAgICAgICAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID09IExWTV9GQUxTRSkpIHsKICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5WaXJ0dWFsaXplckZvcmNlZERldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewogICAgICAgICAgICAgLy8gdmlydHVhbGl6YXRpb24gbW9kZSBpcyBmb3JjZWQsIHJldHVybiB0aGF0IGRldmljZQogICAgICAgICAgICAgdmlydERldmljZSA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5WaXJ0dWFsaXplckZvcmNlZERldmljZTsKQEAgLTE1NTcsOCArMTM3NCw4IEBACiAvLyBPdXRwdXRzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50MzJfdCBFcXVhbGl6ZXJHZXRCYW5kTGV2ZWwoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludDMyX3QgYmFuZCl7Ci0gICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJHZXRCYW5kTGV2ZWwgLT4gJWRcbiIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbYmFuZF0gKTsKK2ludDMyX3QgRXF1YWxpemVyR2V0QmFuZExldmVsKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCBpbnQzMl90IGJhbmQpIHsKKyAgICAvLyBBTE9HVigiXHRFcXVhbGl6ZXJHZXRCYW5kTGV2ZWwgLT4gJWRcbiIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbYmFuZF0gKTsKICAgICByZXR1cm4gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltiYW5kXSAqIDEwMDsKIH0KIApAQCAtMTU3NiwxNCArMTM5MywxNCBAQAogLy8gT3V0cHV0czoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBFcXVhbGl6ZXJTZXRCYW5kTGV2ZWwoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludCBiYW5kLCBzaG9ydCBHYWluKXsKK3ZvaWQgRXF1YWxpemVyU2V0QmFuZExldmVsKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCBpbnQgYmFuZCwgc2hvcnQgR2FpbikgewogICAgIGludCBnYWluUm91bmRlZDsKLSAgICBpZihHYWluID4gMCl7Ci0gICAgICAgIGdhaW5Sb3VuZGVkID0gKGludCkoKEdhaW4rNTApLzEwMCk7Ci0gICAgfWVsc2V7Ci0gICAgICAgIGdhaW5Sb3VuZGVkID0gKGludCkoKEdhaW4tNTApLzEwMCk7CisgICAgaWYgKEdhaW4gPiAwKSB7CisgICAgICAgIGdhaW5Sb3VuZGVkID0gKGludCkoKEdhaW4gKyA1MCkgLyAxMDApOworICAgIH0gZWxzZSB7CisgICAgICAgIGdhaW5Sb3VuZGVkID0gKGludCkoKEdhaW4gLSA1MCkgLyAxMDApOwogICAgIH0KLSAgICAvL0FMT0dWKCJcdEVxdWFsaXplclNldEJhbmRMZXZlbCglZCktPiglZCkiLCBHYWluLCBnYWluUm91bmRlZCk7CisgICAgLy8gQUxPR1YoIlx0RXF1YWxpemVyU2V0QmFuZExldmVsKCVkKS0+KCVkKSIsIEdhaW4sIGdhaW5Sb3VuZGVkKTsKICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2JhbmRdID0gZ2FpblJvdW5kZWQ7CiAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q3VyUHJlc2V0ID0gUFJFU0VUX0NVU1RPTTsKIApAQCAtMTYwMywyMyArMTQyMCwyMiBAQAogLy8gT3V0cHV0czoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludDMyX3QgRXF1YWxpemVyR2V0Q2VudHJlRnJlcXVlbmN5KEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBpbnQzMl90IGJhbmQpewotICAgIGludDMyX3QgRnJlcXVlbmN5ID0wOworaW50MzJfdCBFcXVhbGl6ZXJHZXRDZW50cmVGcmVxdWVuY3koRWZmZWN0Q29udGV4dCogcENvbnRleHQsIGludDMyX3QgYmFuZCkgeworICAgIGludDMyX3QgRnJlcXVlbmN5ID0gMDsKIAotICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICAgIExWTV9FUU5CX0JhbmREZWZfdCAgICAgICpCYW5kRGVmOworICAgIExWTV9Db250cm9sUGFyYW1zX3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fRVFOQl9CYW5kRGVmX3QqIEJhbmREZWY7CiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCi0gICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFjdGl2ZVBhcmFtcyk7CisgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkVxdWFsaXplckdldENlbnRyZUZyZXF1ZW5jeSIpCiAKLSAgICBCYW5kRGVmICAgPSBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb247Ci0gICAgRnJlcXVlbmN5ID0gKGludDMyX3QpQmFuZERlZltiYW5kXS5GcmVxdWVuY3kqMTAwMDsgICAgIC8vIENvbnZlcnQgdG8gbWlsbGliZWxzCisgICAgQmFuZERlZiA9IEFjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbjsKKyAgICBGcmVxdWVuY3kgPSAoaW50MzJfdClCYW5kRGVmW2JhbmRdLkZyZXF1ZW5jeSAqIDEwMDA7ICAvLyBDb252ZXJ0IHRvIG1pbGxpYmVscwogCi0gICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJHZXRDZW50cmVGcmVxdWVuY3kgLT4gJWRcbiIsIEZyZXF1ZW5jeSApOwotICAgIC8vQUxPR1YoIlx0RXF1YWxpemVyR2V0Q2VudHJlRnJlcXVlbmN5IFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRFcXVhbGl6ZXJHZXRDZW50cmVGcmVxdWVuY3kgLT4gJWRcbiIsIEZyZXF1ZW5jeSApOworICAgIC8vIEFMT0dWKCJcdEVxdWFsaXplckdldENlbnRyZUZyZXF1ZW5jeSBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwogICAgIHJldHVybiBGcmVxdWVuY3k7CiB9CiAKQEAgLTE2NDEsMTAgKzE0NTcsMTAgQEAKIC8vICBwTG93OiAgICAgICBsb3dlciBiYW5kIHJhbmdlCiAvLyAgcExvdzogICAgICAgdXBwZXIgYmFuZCByYW5nZQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQzMl90IEVxdWFsaXplckdldEJhbmRGcmVxUmFuZ2UoRWZmZWN0Q29udGV4dCAqcENvbnRleHQgX191bnVzZWQsIGludDMyX3QgYmFuZCwgdWludDMyX3QgKnBMb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBIaSl7CitpbnQzMl90IEVxdWFsaXplckdldEJhbmRGcmVxUmFuZ2UoRWZmZWN0Q29udGV4dCogLyogcENvbnRleHQgX191bnVzZWQgKi8sIGludDMyX3QgYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcExvdywgdWludDMyX3QqIHBIaSkgewogICAgICpwTG93ID0gYmFuZEZyZXFSYW5nZVtiYW5kXVswXTsKLSAgICAqcEhpICA9IGJhbmRGcmVxUmFuZ2VbYmFuZF1bMV07CisgICAgKnBIaSA9IGJhbmRGcmVxUmFuZ2VbYmFuZF1bMV07CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE2NjUsMTYgKzE0ODEsMTYgQEAKIC8vICBwTG93OiAgICAgICBsb3dlciBiYW5kIHJhbmdlCiAvLyAgcExvdzogICAgICAgdXBwZXIgYmFuZCByYW5nZQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQzMl90IEVxdWFsaXplckdldEJhbmQoRWZmZWN0Q29udGV4dCAqcENvbnRleHQgX191bnVzZWQsIHVpbnQzMl90IHRhcmdldEZyZXEpeworaW50MzJfdCBFcXVhbGl6ZXJHZXRCYW5kKEVmZmVjdENvbnRleHQqIC8qIHBDb250ZXh0IF9fdW51c2VkICovLCB1aW50MzJfdCB0YXJnZXRGcmVxKSB7CiAgICAgaW50IGJhbmQgPSAwOwogCi0gICAgaWYodGFyZ2V0RnJlcSA8IGJhbmRGcmVxUmFuZ2VbMF1bMF0peworICAgIGlmICh0YXJnZXRGcmVxIDwgYmFuZEZyZXFSYW5nZVswXVswXSkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9ZWxzZSBpZih0YXJnZXRGcmVxID09IGJhbmRGcmVxUmFuZ2VbMF1bMF0peworICAgIH0gZWxzZSBpZiAodGFyZ2V0RnJlcSA9PSBiYW5kRnJlcVJhbmdlWzBdWzBdKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBmb3IoaW50IGk9MDsgaTxGSVZFQkFORF9OVU1CQU5EUztpKyspewotICAgICAgICBpZigodGFyZ2V0RnJlcSA+IGJhbmRGcmVxUmFuZ2VbaV1bMF0pJiYodGFyZ2V0RnJlcSA8PSBiYW5kRnJlcVJhbmdlW2ldWzFdKSl7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7CisgICAgICAgIGlmICgodGFyZ2V0RnJlcSA+IGJhbmRGcmVxUmFuZ2VbaV1bMF0pICYmICh0YXJnZXRGcmVxIDw9IGJhbmRGcmVxUmFuZ2VbaV1bMV0pKSB7CiAgICAgICAgICAgICBiYW5kID0gaTsKICAgICAgICAgfQogICAgIH0KQEAgLTE2OTQsNyArMTUxMCw3IEBACiAvLyAgcENvbnRleHQ6ICAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50MzJfdCBFcXVhbGl6ZXJHZXRQcmVzZXQoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpeworaW50MzJfdCBFcXVhbGl6ZXJHZXRQcmVzZXQoRWZmZWN0Q29udGV4dCogcENvbnRleHQpIHsKICAgICByZXR1cm4gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q3VyUHJlc2V0OwogfQogCkBAIC0xNzExLDE0ICsxNTI3LDEyIEBACiAvLyAgcHJlc2V0ICAgICAgIFRoZSBwcmVzZXQgSUQuCiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIEVxdWFsaXplclNldFByZXNldChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50IHByZXNldCl7Ci0KLSAgICAvL0FMT0dWKCJcdEVxdWFsaXplclNldFByZXNldCglZCkiLCBwcmVzZXQpOwordm9pZCBFcXVhbGl6ZXJTZXRQcmVzZXQoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIGludCBwcmVzZXQpIHsKKyAgICAvLyBBTE9HVigiXHRFcXVhbGl6ZXJTZXRQcmVzZXQoJWQpIiwgcHJlc2V0KTsKICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DdXJQcmVzZXQgPSBwcmVzZXQ7CiAKLSAgICAvL0FjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9ICZCYW5kRGVmc1swXTsKLSAgICBmb3IgKGludCBpPTA7IGk8RklWRUJBTkRfTlVNQkFORFM7IGkrKykKLSAgICB7CisgICAgLy8gQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uID0gJkJhbmREZWZzWzBdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgewogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldID0KICAgICAgICAgICAgICAgICBFUU5CXzVCYW5kU29mdFByZXNldHNbaSArIHByZXNldCAqIEZJVkVCQU5EX05VTUJBTkRTXTsKICAgICB9CkBAIC0xNzI2LDExICsxNTQwLDExIEBACiAgICAgRXF1YWxpemVyVXBkYXRlQWN0aXZlUGFyYW1zKHBDb250ZXh0KTsKICAgICBMdm1FZmZlY3RfbGltaXRMZXZlbChwQ29udGV4dCk7CiAKLSAgICAvL0FMT0dWKCJcdEVxdWFsaXplclNldFByZXNldCBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRFcXVhbGl6ZXJTZXRQcmVzZXQgU3VjY2Vzc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwogICAgIHJldHVybjsKIH0KIAotaW50MzJfdCBFcXVhbGl6ZXJHZXROdW1QcmVzZXRzKCl7CitpbnQzMl90IEVxdWFsaXplckdldE51bVByZXNldHMoKSB7CiAgICAgcmV0dXJuIHNpemVvZihnRXF1YWxpemVyUHJlc2V0cykgLyBzaXplb2YoUHJlc2V0Q29uZmlnKTsKIH0KIApAQCAtMTc0NSwxNCArMTU1OSwxNCBAQAogLy8gcHJlc2V0ICAgICAgIFRoZSBwcmVzZXQgSUQuIE11c3QgYmUgbGVzcyB0aGFuIG51bWJlciBvZiBwcmVzZXRzLgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY29uc3QgY2hhciAqIEVxdWFsaXplckdldFByZXNldE5hbWUoaW50MzJfdCBwcmVzZXQpewotICAgIC8vQUxPR1YoIlx0RXF1YWxpemVyR2V0UHJlc2V0TmFtZSBzdGFydCglZCkiLCBwcmVzZXQpOworY29uc3QgY2hhciogRXF1YWxpemVyR2V0UHJlc2V0TmFtZShpbnQzMl90IHByZXNldCkgeworICAgIC8vIEFMT0dWKCJcdEVxdWFsaXplckdldFByZXNldE5hbWUgc3RhcnQoJWQpIiwgcHJlc2V0KTsKICAgICBpZiAocHJlc2V0ID09IFBSRVNFVF9DVVNUT00pIHsKICAgICAgICAgcmV0dXJuICJDdXN0b20iOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBnRXF1YWxpemVyUHJlc2V0c1twcmVzZXRdLm5hbWU7CiAgICAgfQotICAgIC8vQUxPR1YoIlx0RXF1YWxpemVyR2V0UHJlc2V0TmFtZSBlbmQoJWQpIiwgcHJlc2V0KTsKKyAgICAvLyBBTE9HVigiXHRFcXVhbGl6ZXJHZXRQcmVzZXROYW1lIGVuZCglZCkiLCBwcmVzZXQpOwogICAgIHJldHVybiAwOwogfQogCkBAIC0xNzY3LDggKzE1ODEsNyBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgVm9sdW1lU2V0Vm9sdW1lTGV2ZWwoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludDE2X3QgbGV2ZWwpewotCitpbnQgVm9sdW1lU2V0Vm9sdW1lTGV2ZWwoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIGludDE2X3QgbGV2ZWwpIHsKICAgICBpZiAobGV2ZWwgPiAwIHx8IGxldmVsIDwgLTk2MDApIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtMTc4Miw3ICsxNTk1LDcgQEAKICAgICBMdm1FZmZlY3RfbGltaXRMZXZlbChwQ29udGV4dCk7CiAKICAgICByZXR1cm4gMDsKLX0gICAgLyogZW5kIFZvbHVtZVNldFZvbHVtZUxldmVsICovCit9IC8qIGVuZCBWb2x1bWVTZXRWb2x1bWVMZXZlbCAqLwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFZvbHVtZUdldFZvbHVtZUxldmVsKCkKQEAgLTE3OTQsMTUgKzE2MDcsMTQgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IFZvbHVtZUdldFZvbHVtZUxldmVsKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBpbnQxNl90ICpsZXZlbCl7Ci0KK2ludCBWb2x1bWVHZXRWb2x1bWVMZXZlbChFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgaW50MTZfdCogbGV2ZWwpIHsKICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkID09IExWTV9UUlVFKSB7CiAgICAgICAgICpsZXZlbCA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmxldmVsU2F2ZWQgKiAxMDA7CiAgICAgfSBlbHNlIHsKICAgICAgICAgKmxldmVsID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+dm9sdW1lICogMTAwOwogICAgIH0KICAgICByZXR1cm4gMDsKLX0gICAgLyogZW5kIFZvbHVtZUdldFZvbHVtZUxldmVsICovCit9IC8qIGVuZCBWb2x1bWVHZXRWb2x1bWVMZXZlbCAqLwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFZvbHVtZVNldE11dGUoKQpAQCAtMTgxNSwyMyArMTYyNywyMyBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQzMl90IFZvbHVtZVNldE11dGUoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHVpbnQzMl90IG11dGUpewotICAgIC8vQUxPR1YoIlx0Vm9sdW1lU2V0TXV0ZSBzdGFydCglZCkiLCBtdXRlKTsKK2ludDMyX3QgVm9sdW1lU2V0TXV0ZShFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgdWludDMyX3QgbXV0ZSkgeworICAgIC8vIEFMT0dWKCJcdFZvbHVtZVNldE11dGUgc3RhcnQoJWQpIiwgbXV0ZSk7CiAKICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQgPSBtdXRlOwogCiAgICAgLyogU2V0IGFwcHJvcHJpYXRlIHZvbHVtZSBsZXZlbCAqLwotICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCA9PSBMVk1fVFJVRSl7CisgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCA9PSBMVk1fVFJVRSkgewogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5sZXZlbFNhdmVkID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+dm9sdW1lOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT52b2x1bWUgPSAtOTY7Ci0gICAgfWVsc2V7CisgICAgfSBlbHNlIHsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+dm9sdW1lID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bGV2ZWxTYXZlZDsKICAgICB9CiAKICAgICBMdm1FZmZlY3RfbGltaXRMZXZlbChwQ29udGV4dCk7CiAKICAgICByZXR1cm4gMDsKLX0gICAgLyogZW5kIHNldE11dGUgKi8KK30gLyogZW5kIHNldE11dGUgKi8KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBWb2x1bWVHZXRNdXRlKCkKQEAgLTE4NDUsMjYgKzE2NTcsMjUgQEAKIC8vICBtdXRlOiAgICAgICBlbmFibGUvZGlzYWJsZSBmbGFnCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50MzJfdCBWb2x1bWVHZXRNdXRlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB1aW50MzJfdCAqbXV0ZSl7Ci0gICAgLy9BTE9HVigiXHRWb2x1bWVHZXRNdXRlIHN0YXJ0Iik7Ci0gICAgaWYoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCA9PSBMVk1fRkFMU0UpfHwKLSAgICAgICAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkID09IExWTV9UUlVFKSl7CitpbnQzMl90IFZvbHVtZUdldE11dGUoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIHVpbnQzMl90KiBtdXRlKSB7CisgICAgLy8gQUxPR1YoIlx0Vm9sdW1lR2V0TXV0ZSBzdGFydCIpOworICAgIGlmICgocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkID09IExWTV9GQUxTRSkgfHwKKyAgICAgICAgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCA9PSBMVk1fVFJVRSkpIHsKICAgICAgICAgKm11dGUgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQ7CiAgICAgICAgIHJldHVybiAwOwotICAgIH1lbHNleworICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFZvbHVtZUdldE11dGUgcmVhZCBhbiBpbnZhbGlkIHZhbHVlIGZyb20gY29udGV4dCAlZCIsCiAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCk7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KLSAgICAvL0FMT0dWKCJcdFZvbHVtZUdldE11dGUgZW5kIik7Ci19ICAgIC8qIGVuZCBnZXRNdXRlICovCisgICAgLy8gQUxPR1YoIlx0Vm9sdW1lR2V0TXV0ZSBlbmQiKTsKK30gLyogZW5kIGdldE11dGUgKi8KIAotaW50MTZfdCBWb2x1bWVDb252ZXJ0U3RlcmVvUG9zaXRpb24oaW50MTZfdCBwb3NpdGlvbil7CitpbnQxNl90IFZvbHVtZUNvbnZlcnRTdGVyZW9Qb3NpdGlvbihpbnQxNl90IHBvc2l0aW9uKSB7CiAgICAgaW50MTZfdCBjb252ZXJ0ZWRQb3NpdGlvbiA9IDA7CiAKLSAgICBjb252ZXJ0ZWRQb3NpdGlvbiA9IChpbnQxNl90KSgoKGZsb2F0KXBvc2l0aW9uLzEwMDApKjk2KTsKKyAgICBjb252ZXJ0ZWRQb3NpdGlvbiA9IChpbnQxNl90KSgoKGZsb2F0KXBvc2l0aW9uIC8gMTAwMCkgKiA5Nik7CiAgICAgcmV0dXJuIGNvbnZlcnRlZFBvc2l0aW9uOwotCiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTg3OSw1NSArMTY5MCw1NSBAQAogLy8gT3V0cHV0czoKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24oRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludDE2X3QgcG9zaXRpb24pewotCi0gICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJhbGFuY2UgPSAwOworaW50IFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCBpbnQxNl90IHBvc2l0aW9uKSB7CisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9JTlQxNiBCYWxhbmNlID0gMDsKIAogICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQgPSBwb3NpdGlvbjsKICAgICBCYWxhbmNlID0gVm9sdW1lQ29udmVydFN0ZXJlb1Bvc2l0aW9uKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQpOwogCi0gICAgLy9BTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiBzdGFydCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkID0gJWQiLAotICAgIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CisgICAgLy8gQUxPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gc3RhcnQgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCA9ICVkIiwKKyAgICAvLyBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkKTsKIAotICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJTdGVyZW9Qb3NpdGlvbkVuYWJsZWQgPT0gTFZNX1RSVUUpewotCi0gICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gUG9zaXRpb24gdG8gYmUgc2V0IGlzICVkICVkXG4iLCBwb3NpdGlvbiwgQmFsYW5jZSk7CisgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJTdGVyZW9Qb3NpdGlvbkVuYWJsZWQgPT0gTFZNX1RSVUUpIHsKKyAgICAgICAgLy8gQUxPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gUG9zaXRpb24gdG8gYmUgc2V0IGlzICVkICVkXG4iLCBwb3NpdGlvbiwgQmFsYW5jZSk7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQgPSBwb3NpdGlvbjsKICAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIikKLSAgICAgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgLy9BTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVycyBnb3Q6IgorICAgICAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgLy8gQUxPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gU3VjY2Vzc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzCisgICAgICAgIC8vIGdvdDoiCiAgICAgICAgIC8vICAgICAiICVkXG4iLCBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSk7CiAKICAgICAgICAgLyogVm9sdW1lIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UgID0gQmFsYW5jZTsKLSAgICAgICAgLy9BTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbigpICgtOTZkQiAtPiArOTZkQikgICAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UgKTsKKyAgICAgICAgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UgPSBCYWxhbmNlOworICAgICAgICAvLyBBTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbigpICgtOTZkQiAtPiArOTZkQikgICAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UKKyAgICAgICAgLy8gKTsKIAogICAgICAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLwogICAgICAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiIpCi0gICAgICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCi0gICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgICAgIC8vIEFMT0dWKCJcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIFN1Y2Nlc3NmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKIAogICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KICAgICAgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24iKQotICAgICAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwotICAgICAgICAvL0FMT0dWKCJcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIGdvdDogIgorICAgICAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgLy8gQUxPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gU3VjY2Vzc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIGdvdDoKKyAgICAgICAgLy8gIgogICAgICAgICAvLyAgICAgIiVkXG4iLCBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQUxPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gUG9zaXRpb24gYXR0ZW1wdGluZyB0byBzZXQsIGJ1dCBub3QgZW5hYmxlZCAlZCAlZFxuIiwKKyAgICAgICAgLy8gcG9zaXRpb24sIEJhbGFuY2UpOwogICAgIH0KLSAgICBlbHNlewotICAgICAgICAvL0FMT0dWKCJcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIFBvc2l0aW9uIGF0dGVtcHRpbmcgdG8gc2V0LCBidXQgbm90IGVuYWJsZWQgJWQgJWRcbiIsCi0gICAgICAgIC8vcG9zaXRpb24sIEJhbGFuY2UpOwotICAgIH0KLSAgICAvL0FMT0dWKCJcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIGVuZCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkID0gJWRcbiIsCi0gICAgLy9wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkKTsKKyAgICAvLyBBTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiBlbmQgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCA9ICVkXG4iLAorICAgIC8vIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQpOwogICAgIHJldHVybiAwOwotfSAgICAvKiBlbmQgVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gKi8KK30gLyogZW5kIFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uICovCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gVm9sdW1lR2V0U3RlcmVvUG9zaXRpb24oKQpAQCAtMTk0MSwzNSArMTc1MiwzNSBAQAogLy8gIHBvc2l0aW9uOiAgICAgICBzdGVyZW8gcG9zaXRpb24KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQzMl90IFZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBpbnQxNl90ICpwb3NpdGlvbil7Ci0gICAgLy9BTE9HVigiXHRWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbiBzdGFydCIpOworaW50MzJfdCBWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbihFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgaW50MTZfdCogcG9zaXRpb24pIHsKKyAgICAvLyBBTE9HVigiXHRWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbiBzdGFydCIpOwogCi0gICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7ICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgYmFsYW5jZTsKKyAgICBMVk1fQ29udHJvbFBhcmFtc190IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0lOVDE2IGJhbGFuY2U7CiAKLSAgICAvL0FMT0dWKCJcdFZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uIHN0YXJ0IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQgPSAlZCIsCi0gICAgLy9wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkKTsKKyAgICAvLyBBTE9HVigiXHRWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbiBzdGFydCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkID0gJWQiLAorICAgIC8vIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQpOwogCiAgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbiIpCi0gICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKIAotICAgIC8vQUxPR1YoIlx0Vm9sdW1lR2V0U3RlcmVvUG9zaXRpb24gLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlKTsKLSAgICAvL0FMT0dWKCJcdFZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbiAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UpOworICAgIC8vIEFMT0dWKCJcdFZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CiAKICAgICBiYWxhbmNlID0gVm9sdW1lQ29udmVydFN0ZXJlb1Bvc2l0aW9uKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQpOwogCi0gICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZCA9PSBMVk1fVFJVRSl7Ci0gICAgICAgIGlmKGJhbGFuY2UgIT0gQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UpeworICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iU3RlcmVvUG9zaXRpb25FbmFibGVkID09IExWTV9UUlVFKSB7CisgICAgICAgIGlmIChiYWxhbmNlICE9IEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlKSB7CiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQogICAgIH0KLSAgICAqcG9zaXRpb24gPSAoTFZNX0lOVDE2KXBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQ7ICAgICAvLyBDb252ZXJ0IGRCIHRvIG1pbGxpYmVscwotICAgIC8vQUxPR1YoIlx0Vm9sdW1lR2V0U3RlcmVvUG9zaXRpb24gZW5kIHJldHVybmluZyBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkID0lZFxuIiwKLSAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQpOworICAgICpwb3NpdGlvbiA9IChMVk1fSU5UMTYpcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZDsgIC8vIENvbnZlcnQgZEIgdG8gbWlsbGliZWxzCisgICAgLy8gQUxPR1YoIlx0Vm9sdW1lR2V0U3RlcmVvUG9zaXRpb24gZW5kIHJldHVybmluZyBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkCisgICAgLy8gPSVkXG4iLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkKTsKICAgICByZXR1cm4gMDsKLX0gICAgLyogZW5kIFZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uICovCit9IC8qIGVuZCBWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbiAqLwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uKCkKQEAgLTE5ODIsNDAgKzE3OTMsNDAgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50MzJfdCBWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbihFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgdWludDMyX3QgZW5hYmxlZCl7Ci0gICAgLy9BTE9HVigiXHRWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbiBzdGFydCgpIik7CitpbnQzMl90IFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBlbmFibGVkKSB7CisgICAgLy8gQUxPR1YoIlx0Vm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24gc3RhcnQoKSIpOwogCiAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZCA9IGVuYWJsZWQ7CiAKLSAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVk1fU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbiIpCi0gICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKIAotICAgIC8vQUxPR1YoIlx0Vm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24gU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0Vm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24gdG8gJWQsIHBvc2l0aW9uIHdhcyAlZFxuIiwKKyAgICAvLyBBTE9HVigiXHRWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbiBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uIHRvICVkLCBwb3NpdGlvbiB3YXMgJWRcbiIsCiAgICAgLy8gICAgIGVuYWJsZWQsIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlICk7CiAKICAgICAvKiBTZXQgYXBwcm9wcmlhdGUgc3RlcmVvIHBvc2l0aW9uICovCi0gICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZCA9PSBMVk1fRkFMU0UpeworICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iU3RlcmVvUG9zaXRpb25FbmFibGVkID09IExWTV9GQUxTRSkgewogICAgICAgICBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSA9IDA7Ci0gICAgfWVsc2V7Ci0gICAgICAgIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlICA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lQ29udmVydFN0ZXJlb1Bvc2l0aW9uKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlID0KKyAgICAgICAgICAgICAgICBWb2x1bWVDb252ZXJ0U3RlcmVvUG9zaXRpb24ocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CiAgICAgfQogCiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uIikKLSAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCi0gICAgLy9BTE9HVigiXHRWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbiBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uIGVuZCgpXG4iKTsKKyAgICAvLyBBTE9HVigiXHRWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbiBTdWNjZXNzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0Vm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24gZW5kKClcbiIpOwogICAgIHJldHVybiAwOwotfSAgICAvKiBlbmQgVm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24gKi8KK30gLyogZW5kIFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uICovCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQmFzc0Jvb3N0X2dldFBhcmFtZXRlcigpCkBAIC0yMDM4LDEzICsxODQ5LDEwIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAqcFZhbHVlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSkgeworaW50IEJhc3NCb29zdF9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIHVpbnQzMl90IHBhcmFtU2l6ZSwgdm9pZCogcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBWYWx1ZVNpemUsIHZvaWQqIHBWYWx1ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwotICAgIGludDMyX3QgKnBhcmFtcyA9IChpbnQzMl90ICopcFBhcmFtOworICAgIGludDMyX3QqIHBhcmFtcyA9IChpbnQzMl90KilwUGFyYW07CiAKICAgICBBTE9HVlYoIiVzIHN0YXJ0IiwgX19mdW5jX18pOwogCkBAIC0yMDU1LDI4ICsxODYzLDI3IEBACiAgICAgc3dpdGNoIChwYXJhbXNbMF0pIHsKICAgICAgICAgY2FzZSBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEhfU1VQUE9SVEVEOgogICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZih1aW50MzJfdCkpIHsgIC8vIGxlZ2FjeTogY2hlY2sgZXF1YWxpdHkgaGVyZS4KLSAgICAgICAgICAgICAgICBBTE9HVigiJXMgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIX1NVUFBPUlRFRCBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzZXQgKnBWYWx1ZVNpemUKIAotICAgICAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSA9IDE7Ci0gICAgICAgICAgICBBTE9HVlYoIiVzIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQgJXUiLCBfX2Z1bmNfXywgKih1aW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICAqKHVpbnQzMl90KilwVmFsdWUgPSAxOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEhfU1VQUE9SVEVEICV1IiwgX19mdW5jX18sICoodWludDMyX3QqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSDoKICAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpIHsgIC8vIGxlZ2FjeTogY2hlY2sgZXF1YWxpdHkgaGVyZS4KLSAgICAgICAgICAgICAgICBBTE9HVigiJXMgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHNldCAqcFZhbHVlU2l6ZQogCi0gICAgICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSBCYXNzR2V0U3RyZW5ndGgocENvbnRleHQpOwotICAgICAgICAgICAgQUxPR1ZWKCIlcyBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEggJWQiLCBfX2Z1bmNfXywgKihpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgICooaW50MTZfdCopcFZhbHVlID0gQmFzc0dldFN0cmVuZ3RoKHBDb250ZXh0KTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIICVkIiwgX19mdW5jX18sICooaW50MTZfdCopcFZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CkBAIC0yMTA0LDEzICsxOTExLDEwIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKSB7CitpbnQgQmFzc0Jvb3N0X3NldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgdWludDMyX3QgcGFyYW1TaXplLCB2b2lkKiBwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZVNpemUsIHZvaWQqIHBWYWx1ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwotICAgIGludDMyX3QgKnBhcmFtcyA9IChpbnQzMl90ICopcFBhcmFtOworICAgIGludDMyX3QqIHBhcmFtcyA9IChpbnQzMl90KilwUGFyYW07CiAKICAgICBBTE9HVlYoIiVzIHN0YXJ0IiwgX19mdW5jX18pOwogCkBAIC0yMTI2LDcgKzE5MzAsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjb25zdCBpbnQxNl90IHN0cmVuZ3RoID0gKihpbnQxNl90ICopcFZhbHVlOworICAgICAgICAgICAgY29uc3QgaW50MTZfdCBzdHJlbmd0aCA9ICooaW50MTZfdCopcFZhbHVlOwogICAgICAgICAgICAgQUxPR1ZWKCIlcyBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEggJWQiLCBfX2Z1bmNfXywgc3RyZW5ndGgpOwogICAgICAgICAgICAgQUxPR1ZWKCIlcyBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEggQ2FsbGluZyBCYXNzU2V0U3RyZW5ndGgiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBCYXNzU2V0U3RyZW5ndGgocENvbnRleHQsIChpbnQzMl90KXN0cmVuZ3RoKTsKQEAgLTIxNjQsMTMgKzE5NjgsMTAgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IFZpcnR1YWxpemVyX2dldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgKnBWYWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSkgeworaW50IFZpcnR1YWxpemVyX2dldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgdWludDMyX3QgcGFyYW1TaXplLCB2b2lkKiBwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwVmFsdWVTaXplLCB2b2lkKiBwVmFsdWUpIHsKICAgICBpbnQgc3RhdHVzID0gMDsKLSAgICBpbnQzMl90ICpwYXJhbXMgPSAoaW50MzJfdCAqKXBQYXJhbTsKKyAgICBpbnQzMl90KiBwYXJhbXMgPSAoaW50MzJfdCopcFBhcmFtOwogCiAgICAgQUxPR1ZWKCIlcyBzdGFydCIsIF9fZnVuY19fKTsKIApAQCAtMjE4MCw0NyArMTk4MSw0NyBAQAogICAgIH0KICAgICBzd2l0Y2ggKHBhcmFtc1swXSkgewogICAgICAgICBjYXNlIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIX1NVUFBPUlRFRDoKLSAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKSB7IC8vIGxlZ2FjeTogY2hlY2sgZXF1YWxpdHkgaGVyZS4KLSAgICAgICAgICAgICAgICBBTE9HVigiJXMgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEhfU1VQUE9SVEVEIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKSB7ICAvLyBsZWdhY3k6IGNoZWNrIGVxdWFsaXR5IGhlcmUuCisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIX1NVUFBPUlRFRCBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgKnBWYWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHNldCAqcFZhbHVlU2l6ZQogCi0gICAgICAgICAgICAqKHVpbnQzMl90ICopcFZhbHVlID0gMTsKLSAgICAgICAgICAgIEFMT0dWVigiJXMgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEhfU1VQUE9SVEVEICVkIiwgX19mdW5jX18sICoodWludDMyX3QgKilwVmFsdWUpOworICAgICAgICAgICAgKih1aW50MzJfdCopcFZhbHVlID0gMTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEhfU1VQUE9SVEVEICVkIiwgX19mdW5jX18sICoodWludDMyX3QqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIOgotICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSkgeyAvLyBsZWdhY3k6IGNoZWNrIGVxdWFsaXR5IGhlcmUuCi0gICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpIHsgIC8vIGxlZ2FjeTogY2hlY2sgZXF1YWxpdHkgaGVyZS4KKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEggaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzZXQgKnBWYWx1ZVNpemUKIAotICAgICAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gVmlydHVhbGl6ZXJHZXRTdHJlbmd0aChwQ29udGV4dCk7CisgICAgICAgICAgICAqKGludDE2X3QqKXBWYWx1ZSA9IFZpcnR1YWxpemVyR2V0U3RyZW5ndGgocENvbnRleHQpOwogCi0gICAgICAgICAgICBBTE9HVlYoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIICVkIiwgX19mdW5jX18sICooaW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICBBTE9HVlYoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIICVkIiwgX19mdW5jX18sICooaW50MTZfdCopcFZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fVklSVFVBTF9TUEVBS0VSX0FOR0xFUzogewogICAgICAgICAgICAgaWYgKHBhcmFtU2l6ZSA8IDMgKiBzaXplb2YoaW50MzJfdCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXMgVklSVFVBTElaRVJfUEFSQU1fU1BFQUtFUl9BTkdMRVMgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwYXJhbVNpemUpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9TUEVBS0VSX0FOR0xFUyBpbnZhbGlkIHBhcmFtU2l6ZTogJXUiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICBwYXJhbVNpemUpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gKGF1ZGlvX2NoYW5uZWxfbWFza190KSBwYXJhbXNbMV07Ci0gICAgICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IChhdWRpb19kZXZpY2VzX3QpIHBhcmFtc1syXTsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gKGF1ZGlvX2NoYW5uZWxfbWFza190KXBhcmFtc1sxXTsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gKGF1ZGlvX2RldmljZXNfdClwYXJhbXNbMl07CiAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBuYkNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHZhbHVlU2l6ZVJlcXVpcmVkID0gMyAqIG5iQ2hhbm5lbHMgKiBzaXplb2YoaW50MzJfdCk7CiAgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCB2YWx1ZVNpemVSZXF1aXJlZCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9TUEVBS0VSX0FOR0xFUyBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1NQRUFLRVJfQU5HTEVTIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICAqcFZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTIyMjksMjMgKzIwMzAsMjMgQEAKICAgICAgICAgICAgIC8vIHZlcmlmeSB0aGUgY29uZmlndXJhdGlvbiBpcyBzdXBwb3J0ZWQKICAgICAgICAgICAgIHN0YXR1cyA9IFZpcnR1YWxpemVySXNDb25maWd1cmF0aW9uU3VwcG9ydGVkKGNoYW5uZWxNYXNrLCBkZXZpY2VUeXBlKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9WSVJUVUFMX1NQRUFLRVJfQU5HTEVTIG1hc2s9MHgleCBkZXZpY2U9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2hhbm5lbE1hc2ssIGRldmljZVR5cGUpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9WSVJUVUFMX1NQRUFLRVJfQU5HTEVTIG1hc2s9MHgleCBkZXZpY2U9MHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBkZXZpY2VUeXBlKTsKICAgICAgICAgICAgICAgICAvLyBjb25maWd1cmF0aW9uIGlzIHN1cHBvcnRlZCwgZ2V0IHRoZSBhbmdsZXMKLSAgICAgICAgICAgICAgICBWaXJ0dWFsaXplckdldFNwZWFrZXJBbmdsZXMoY2hhbm5lbE1hc2ssIGRldmljZVR5cGUsIChpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgICAgICBWaXJ0dWFsaXplckdldFNwZWFrZXJBbmdsZXMoY2hhbm5lbE1hc2ssIGRldmljZVR5cGUsIChpbnQzMl90KilwVmFsdWUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fVklSVFVBTElaQVRJT05fTU9ERToKLSAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKSB7IC8vIGxlZ2FjeTogY2hlY2sgZXF1YWxpdHkgaGVyZS4KLSAgICAgICAgICAgICAgICBBTE9HVigiJXMgVklSVFVBTElaRVJfUEFSQU1fVklSVFVBTElaQVRJT05fTU9ERSBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSkgeyAgLy8gbGVnYWN5OiBjaGVjayBlcXVhbGl0eSBoZXJlLgorICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9WSVJUVUFMSVpBVElPTl9NT0RFIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICAqcFZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gc2V0ICpwVmFsdWVTaXplCiAKLSAgICAgICAgICAgICoodWludDMyX3QgKilwVmFsdWUgPSAodWludDMyX3QpIFZpcnR1YWxpemVyR2V0VmlydHVhbGl6YXRpb25Nb2RlKHBDb250ZXh0KTsKKyAgICAgICAgICAgICoodWludDMyX3QqKXBWYWx1ZSA9ICh1aW50MzJfdClWaXJ0dWFsaXplckdldFZpcnR1YWxpemF0aW9uTW9kZShwQ29udGV4dCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgpAQCAtMjI3MywxNyArMjA3NCwxNCBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgVmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBwYXJhbVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpIHsKK2ludCBWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIHVpbnQzMl90IHBhcmFtU2l6ZSwgdm9pZCogcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZVNpemUsIHZvaWQqIHBWYWx1ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwotICAgIGludDMyX3QgKnBhcmFtcyA9IChpbnQzMl90ICopcFBhcmFtOworICAgIGludDMyX3QqIHBhcmFtcyA9IChpbnQzMl90KilwUGFyYW07CiAKICAgICBBTE9HVlYoIiVzIHN0YXJ0IiwgX19mdW5jX18pOwogCi0gICAgaWYgKHBhcmFtU2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpIHsgLy8gbGVnYWN5OiBjaGVjayBlcXVhbGl0eSBoZXJlLgorICAgIGlmIChwYXJhbVNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7ICAvLyBsZWdhY3k6IGNoZWNrIGVxdWFsaXR5IGhlcmUuCiAgICAgICAgIEFMT0dWKCIlcyBpbnZhbGlkIHBhcmFtU2l6ZTogJXUiLCBfX2Z1bmNfXywgcGFyYW1TaXplKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtMjI5NSw3ICsyMDkzLDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY29uc3QgaW50MTZfdCBzdHJlbmd0aCA9ICooaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3Qgc3RyZW5ndGggPSAqKGludDE2X3QqKXBWYWx1ZTsKICAgICAgICAgICAgIEFMT0dWVigiJXMgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEggJWQiLCBfX2Z1bmNfXywgc3RyZW5ndGgpOwogICAgICAgICAgICAgQUxPR1ZWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSCBDYWxsaW5nIFZpcnR1YWxpemVyU2V0U3RyZW5ndGgiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBWaXJ0dWFsaXplclNldFN0cmVuZ3RoKHBDb250ZXh0LCAoaW50MzJfdClzdHJlbmd0aCk7CkBAIC0yMzA1LDE2ICsyMTAzLDE2IEBACiAgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fRk9SQ0VfVklSVFVBTElaQVRJT05fTU9ERTogewogICAgICAgICAgICAgaWYgKHZhbHVlU2l6ZSA8IHNpemVvZihpbnQzMl90KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9GT1JDRV9WSVJUVUFMSVpBVElPTl9NT0RFIGludmFsaWQgdmFsdWVTaXplOiAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjY0NDc4MDAzIik7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSAoYXVkaW9fZGV2aWNlc190KSooaW50MzJfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gKGF1ZGlvX2RldmljZXNfdCkgKiAoaW50MzJfdCopcFZhbHVlOwogICAgICAgICAgICAgc3RhdHVzID0gVmlydHVhbGl6ZXJGb3JjZVZpcnR1YWxpemF0aW9uTW9kZShwQ29udGV4dCwgZGV2aWNlVHlwZSk7Ci0gICAgICAgICAgICBBTE9HVlYoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX0ZPUkNFX1ZJUlRVQUxJWkFUSU9OX01PREUgZGV2aWNlPSUjeCByZXN1bHQ9JWQiLAotICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGV2aWNlVHlwZSwgc3RhdHVzKTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgVklSVFVBTElaRVJfUEFSQU1fRk9SQ0VfVklSVFVBTElaQVRJT05fTU9ERSBkZXZpY2U9JSN4IHJlc3VsdD0lZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgIGRldmljZVR5cGUsIHN0YXR1cyk7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTIzNDcsMTMgKzIxNDUsMTAgQEAKIC8vIFNpZGUgRWZmZWN0czoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAqcFZhbHVlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSkgeworaW50IEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIHVpbnQzMl90IHBhcmFtU2l6ZSwgdm9pZCogcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBWYWx1ZVNpemUsIHZvaWQqIHBWYWx1ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwotICAgIGludDMyX3QgKnBhcmFtcyA9IChpbnQzMl90ICopcFBhcmFtOworICAgIGludDMyX3QqIHBhcmFtcyA9IChpbnQzMl90KilwUGFyYW07CiAKICAgICBBTE9HVlYoIiVzIHN0YXJ0IiwgX19mdW5jX18pOwogCkBAIC0yMzYyLDIxMSArMjE1NywyMTAgQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogICAgIHN3aXRjaCAocGFyYW1zWzBdKSB7Ci0gICAgY2FzZSBFUV9QQVJBTV9OVU1fQkFORFM6Ci0gICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZih1aW50MTZfdCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9OVU1fQkFORFMgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDE2X3QpOwotCi0gICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSAodWludDE2X3QpRklWRUJBTkRfTlVNQkFORFM7Ci0gICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fTlVNX0JBTkRTICV1IiwgX19mdW5jX18sICoodWludDE2X3QgKilwVmFsdWUpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgRVFfUEFSQU1fQ1VSX1BSRVNFVDoKLSAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKHVpbnQxNl90KSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0NVUl9QUkVTRVQgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDE2X3QpOwotCi0gICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSAodWludDE2X3QpRXF1YWxpemVyR2V0UHJlc2V0KHBDb250ZXh0KTsKLSAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9DVVJfUFJFU0VUICV1IiwgX19mdW5jX18sICoodWludDE2X3QgKilwVmFsdWUpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgRVFfUEFSQU1fR0VUX05VTV9PRl9QUkVTRVRTOgotICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YodWludDE2X3QpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fR0VUX05VTV9PRl9QUkVTRVRTIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQxNl90KTsKLQotICAgICAgICAqKHVpbnQxNl90ICopcFZhbHVlID0gKHVpbnQxNl90KUVxdWFsaXplckdldE51bVByZXNldHMoKTsKLSAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9HRVRfTlVNX09GX1BSRVNFVFMgJXUiLCBfX2Z1bmNfXywgKih1aW50MTZfdCAqKXBWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFUV9QQVJBTV9HRVRfQkFORDogewotICAgICAgICBpZiAocGFyYW1TaXplIDwgMiAqIHNpemVvZihpbnQzMl90KSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0dFVF9CQU5EIGludmFsaWQgcGFyYW1TaXplOiAldSIsIF9fZnVuY19fLCBwYXJhbVNpemUpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZih1aW50MTZfdCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9HRVRfQkFORCBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih1aW50MTZfdCk7Ci0KLSAgICAgICAgY29uc3QgaW50MzJfdCBmcmVxdWVuY3kgPSBwYXJhbXNbMV07Ci0gICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSAodWludDE2X3QpRXF1YWxpemVyR2V0QmFuZChwQ29udGV4dCwgZnJlcXVlbmN5KTsKLSAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9HRVRfQkFORCBmcmVxdWVuY3kgJWQsIGJhbmQgJXUiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fLCBmcmVxdWVuY3ksICoodWludDE2X3QgKilwVmFsdWUpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEVRX1BBUkFNX0JBTkRfTEVWRUw6IHsKLSAgICAgICAgaWYgKHBhcmFtU2l6ZSA8IDIgKiBzaXplb2YoaW50MzJfdCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9CQU5EX0xFVkVMIGludmFsaWQgcGFyYW1TaXplICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKGludDE2X3QpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQkFORF9MRVZFTCBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKLQotICAgICAgICBjb25zdCBpbnQzMl90IGJhbmQgPSBwYXJhbXNbMV07Ci0gICAgICAgIGlmIChiYW5kIDwgMCB8fCBiYW5kID49IEZJVkVCQU5EX05VTUJBTkRTKSB7Ci0gICAgICAgICAgICBpZiAoYmFuZCA8IDApIHsKLSAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjMyNDM4NTk4Iik7Ci0gICAgICAgICAgICAgICAgQUxPR1coIiVzIEVRX1BBUkFNX0JBTkRfTEVWRUwgaW52YWxpZCBiYW5kICVkIiwgX19mdW5jX18sIGJhbmQpOworICAgICAgICBjYXNlIEVRX1BBUkFNX05VTV9CQU5EUzoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZih1aW50MTZfdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fTlVNX0JBTkRTIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gKGludDE2X3QpRXF1YWxpemVyR2V0QmFuZExldmVsKHBDb250ZXh0LCBiYW5kKTsKLSAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9CQU5EX0xFVkVMIGJhbmQgJWQsIGxldmVsICVkIiwKLSAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYmFuZCwgKihpbnQxNl90ICopcFZhbHVlKTsKLSAgICB9IGJyZWFrOworICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDE2X3QpOwogCi0gICAgY2FzZSBFUV9QQVJBTV9MRVZFTF9SQU5HRToKLSAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgMiAqIHNpemVvZihpbnQxNl90KSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0xFVkVMX1JBTkdFIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICoodWludDE2X3QqKXBWYWx1ZSA9ICh1aW50MTZfdClGSVZFQkFORF9OVU1CQU5EUzsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fTlVNX0JBTkRTICV1IiwgX19mdW5jX18sICoodWludDE2X3QqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAqcFZhbHVlU2l6ZSA9IDIgKiBzaXplb2YoaW50MTZfdCk7CiAKLSAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gLTE1MDA7Ci0gICAgICAgICooKGludDE2X3QgKilwVmFsdWUgKyAxKSA9IDE1MDA7Ci0gICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fTEVWRUxfUkFOR0UgbWluICVkLCBtYXggJWQiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fLCAqKGludDE2X3QgKilwVmFsdWUsICooKGludDE2X3QgKilwVmFsdWUgKyAxKSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFUV9QQVJBTV9CQU5EX0ZSRVFfUkFOR0U6IHsKLSAgICAgICAgaWYgKHBhcmFtU2l6ZSA8IDIgKiBzaXplb2YoaW50MzJfdCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9CQU5EX0ZSRVFfUkFOR0UgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgMiAqIHNpemVvZihpbnQzMl90KSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRSBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAqcFZhbHVlU2l6ZSA9IDIgKiBzaXplb2YoaW50MzJfdCk7Ci0KLSAgICAgICAgY29uc3QgaW50MzJfdCBiYW5kID0gcGFyYW1zWzFdOwotICAgICAgICBpZiAoYmFuZCA8IDAgfHwgYmFuZCA+PSBGSVZFQkFORF9OVU1CQU5EUykgewotICAgICAgICAgICAgaWYgKGJhbmQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMjI0Nzk0OCIpOwotICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBFUV9QQVJBTV9CQU5EX0ZSRVFfUkFOR0UgaW52YWxpZCBiYW5kICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBiYW5kKTsKKyAgICAgICAgY2FzZSBFUV9QQVJBTV9DVVJfUFJFU0VUOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKHVpbnQxNl90KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9DVVJfUFJFU0VUIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgRXF1YWxpemVyR2V0QmFuZEZyZXFSYW5nZShwQ29udGV4dCwgYmFuZCwgKHVpbnQzMl90ICopcFZhbHVlLCAoKHVpbnQzMl90ICopcFZhbHVlICsgMSkpOwotICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRSBiYW5kICVkLCBtaW4gJWQsIG1heCAlZCIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIGJhbmQsICooaW50MzJfdCAqKXBWYWx1ZSwgKigoaW50MzJfdCAqKXBWYWx1ZSArIDEpKTsKKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQxNl90KTsKIAotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEVRX1BBUkFNX0NFTlRFUl9GUkVROiB7Ci0gICAgICAgIGlmIChwYXJhbVNpemUgPCAyICogc2l6ZW9mKGludDMyX3QpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQ0VOVEVSX0ZSRVEgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgKih1aW50MTZfdCopcFZhbHVlID0gKHVpbnQxNl90KUVxdWFsaXplckdldFByZXNldChwQ29udGV4dCk7CisgICAgICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0NVUl9QUkVTRVQgJXUiLCBfX2Z1bmNfXywgKih1aW50MTZfdCopcFZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZihpbnQzMl90KSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0NFTlRFUl9GUkVRIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDMyX3QpOwogCi0gICAgICAgIGNvbnN0IGludDMyX3QgYmFuZCA9IHBhcmFtc1sxXTsKLSAgICAgICAgaWYgKGJhbmQgPCAwIHx8IGJhbmQgPj0gRklWRUJBTkRfTlVNQkFORFMpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBpZiAoYmFuZCA8IDApIHsKLSAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjMyNDM2MzQxIik7Ci0gICAgICAgICAgICAgICAgQUxPR1coIiVzIEVRX1BBUkFNX0NFTlRFUl9GUkVRIGludmFsaWQgYmFuZCAlZCIsIF9fZnVuY19fLCBiYW5kKTsKKyAgICAgICAgY2FzZSBFUV9QQVJBTV9HRVRfTlVNX09GX1BSRVNFVFM6CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YodWludDE2X3QpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0dFVF9OVU1fT0ZfUFJFU0VUUyBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAqKGludDMyX3QgKilwVmFsdWUgPSBFcXVhbGl6ZXJHZXRDZW50cmVGcmVxdWVuY3kocENvbnRleHQsIGJhbmQpOwotICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0NFTlRFUl9GUkVRIGJhbmQgJWQsIGZyZXF1ZW5jeSAlZCIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIGJhbmQsICooaW50MzJfdCAqKXBWYWx1ZSk7Ci0gICAgfSBicmVhazsKKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQxNl90KTsKIAotICAgIGNhc2UgRVFfUEFSQU1fR0VUX1BSRVNFVF9OQU1FOiB7Ci0gICAgICAgIGlmIChwYXJhbVNpemUgPCAyICogc2l6ZW9mKGludDMyX3QpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fUFJFU0VUX05BTUUgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgKih1aW50MTZfdCopcFZhbHVlID0gKHVpbnQxNl90KUVxdWFsaXplckdldE51bVByZXNldHMoKTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fR0VUX05VTV9PRl9QUkVTRVRTICV1IiwgX19mdW5jX18sICoodWludDE2X3QqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCAxKSB7Ci0gICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjM3NTM2NDA3Iik7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KIAotICAgICAgICBjb25zdCBpbnQzMl90IHByZXNldCA9IHBhcmFtc1sxXTsKLSAgICAgICAgaWYgKChwcmVzZXQgPCAwICYmIHByZXNldCAhPSBQUkVTRVRfQ1VTVE9NKSB8fCAgcHJlc2V0ID49IEVxdWFsaXplckdldE51bVByZXNldHMoKSkgewotICAgICAgICAgICAgaWYgKHByZXNldCA8IDApIHsKLSAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjMyNDQ4MjU4Iik7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzIEVRX1BBUkFNX0dFVF9QUkVTRVRfTkFNRSBwcmVzZXQgJWQiLCBfX2Z1bmNfXywgcHJlc2V0KTsKKyAgICAgICAgY2FzZSBFUV9QQVJBTV9HRVRfQkFORDogeworICAgICAgICAgICAgaWYgKHBhcmFtU2l6ZSA8IDIgKiBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fR0VUX0JBTkQgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZih1aW50MTZfdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fR0VUX0JBTkQgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQxNl90KTsKKworICAgICAgICAgICAgY29uc3QgaW50MzJfdCBmcmVxdWVuY3kgPSBwYXJhbXNbMV07CisgICAgICAgICAgICAqKHVpbnQxNl90KilwVmFsdWUgPSAodWludDE2X3QpRXF1YWxpemVyR2V0QmFuZChwQ29udGV4dCwgZnJlcXVlbmN5KTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fR0VUX0JBTkQgZnJlcXVlbmN5ICVkLCBiYW5kICV1IiwgX19mdW5jX18sIGZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAqKHVpbnQxNl90KilwVmFsdWUpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgRVFfUEFSQU1fQkFORF9MRVZFTDogeworICAgICAgICAgICAgaWYgKHBhcmFtU2l6ZSA8IDIgKiBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQkFORF9MRVZFTCBpbnZhbGlkIHBhcmFtU2l6ZSAldSIsIF9fZnVuY19fLCBwYXJhbVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YoaW50MTZfdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQkFORF9MRVZFTCBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7CisKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYmFuZCA9IHBhcmFtc1sxXTsKKyAgICAgICAgICAgIGlmIChiYW5kIDwgMCB8fCBiYW5kID49IEZJVkVCQU5EX05VTUJBTkRTKSB7CisgICAgICAgICAgICAgICAgaWYgKGJhbmQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzI0Mzg1OTgiKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzIEVRX1BBUkFNX0JBTkRfTEVWRUwgaW52YWxpZCBiYW5kICVkIiwgX19mdW5jX18sIGJhbmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKihpbnQxNl90KilwVmFsdWUgPSAoaW50MTZfdClFcXVhbGl6ZXJHZXRCYW5kTGV2ZWwocENvbnRleHQsIGJhbmQpOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9CQU5EX0xFVkVMIGJhbmQgJWQsIGxldmVsICVkIiwgX19mdW5jX18sIGJhbmQsICooaW50MTZfdCopcFZhbHVlKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEVRX1BBUkFNX0xFVkVMX1JBTkdFOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgMiAqIHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9MRVZFTF9SQU5HRSBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSAyICogc2l6ZW9mKGludDE2X3QpOworCisgICAgICAgICAgICAqKGludDE2X3QqKXBWYWx1ZSA9IC0xNTAwOworICAgICAgICAgICAgKigoaW50MTZfdCopcFZhbHVlICsgMSkgPSAxNTAwOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9MRVZFTF9SQU5HRSBtaW4gJWQsIG1heCAlZCIsIF9fZnVuY19fLCAqKGludDE2X3QqKXBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAqKChpbnQxNl90KilwVmFsdWUgKyAxKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRTogeworICAgICAgICAgICAgaWYgKHBhcmFtU2l6ZSA8IDIgKiBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFIGludmFsaWQgcGFyYW1TaXplOiAldSIsIF9fZnVuY19fLCBwYXJhbVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCAyICogc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRSBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSAyICogc2l6ZW9mKGludDMyX3QpOworCisgICAgICAgICAgICBjb25zdCBpbnQzMl90IGJhbmQgPSBwYXJhbXNbMV07CisgICAgICAgICAgICBpZiAoYmFuZCA8IDAgfHwgYmFuZCA+PSBGSVZFQkFORF9OVU1CQU5EUykgeworICAgICAgICAgICAgICAgIGlmIChiYW5kIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjMyMjQ3OTQ4Iik7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBFUV9QQVJBTV9CQU5EX0ZSRVFfUkFOR0UgaW52YWxpZCBiYW5kICVkIiwgX19mdW5jX18sIGJhbmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXF1YWxpemVyR2V0QmFuZEZyZXFSYW5nZShwQ29udGV4dCwgYmFuZCwgKHVpbnQzMl90KilwVmFsdWUsICgodWludDMyX3QqKXBWYWx1ZSArIDEpKTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFIGJhbmQgJWQsIG1pbiAlZCwgbWF4ICVkIiwgX19mdW5jX18sIGJhbmQsCisgICAgICAgICAgICAgICAgICAgKihpbnQzMl90KilwVmFsdWUsICooKGludDMyX3QqKXBWYWx1ZSArIDEpKTsKKworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgRVFfUEFSQU1fQ0VOVEVSX0ZSRVE6IHsKKyAgICAgICAgICAgIGlmIChwYXJhbVNpemUgPCAyICogc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0NFTlRFUl9GUkVRIGludmFsaWQgcGFyYW1TaXplOiAldSIsIF9fZnVuY19fLCBwYXJhbVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQ0VOVEVSX0ZSRVEgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDMyX3QpOworCisgICAgICAgICAgICBjb25zdCBpbnQzMl90IGJhbmQgPSBwYXJhbXNbMV07CisgICAgICAgICAgICBpZiAoYmFuZCA8IDAgfHwgYmFuZCA+PSBGSVZFQkFORF9OVU1CQU5EUykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgaWYgKGJhbmQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzI0MzYzNDEiKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzIEVRX1BBUkFNX0NFTlRFUl9GUkVRIGludmFsaWQgYmFuZCAlZCIsIF9fZnVuY19fLCBiYW5kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqKGludDMyX3QqKXBWYWx1ZSA9IEVxdWFsaXplckdldENlbnRyZUZyZXF1ZW5jeShwQ29udGV4dCwgYmFuZCk7CisgICAgICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0NFTlRFUl9GUkVRIGJhbmQgJWQsIGZyZXF1ZW5jeSAlZCIsIF9fZnVuY19fLCBiYW5kLAorICAgICAgICAgICAgICAgICAgICooaW50MzJfdCopcFZhbHVlKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEVRX1BBUkFNX0dFVF9QUkVTRVRfTkFNRTogeworICAgICAgICAgICAgaWYgKHBhcmFtU2l6ZSA8IDIgKiBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fUFJFU0VUX05BTUUgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IDEpIHsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjM3NTM2NDA3Iik7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgaW50MzJfdCBwcmVzZXQgPSBwYXJhbXNbMV07CisgICAgICAgICAgICBpZiAoKHByZXNldCA8IDAgJiYgcHJlc2V0ICE9IFBSRVNFVF9DVVNUT00pIHx8IHByZXNldCA+PSBFcXVhbGl6ZXJHZXROdW1QcmVzZXRzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJlc2V0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjMyNDQ4MjU4Iik7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBFUV9QQVJBTV9HRVRfUFJFU0VUX05BTUUgcHJlc2V0ICVkIiwgX19mdW5jX18sIHByZXNldCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNoYXIqIGNvbnN0IG5hbWUgPSAoY2hhciopcFZhbHVlOworICAgICAgICAgICAgc3RybmNweShuYW1lLCBFcXVhbGl6ZXJHZXRQcmVzZXROYW1lKHByZXNldCksICpwVmFsdWVTaXplIC0gMSk7CisgICAgICAgICAgICBuYW1lWypwVmFsdWVTaXplIC0gMV0gPSAwOworICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzdHJsZW4obmFtZSkgKyAxOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9HRVRfUFJFU0VUX05BTUUgcHJlc2V0ICVkLCBuYW1lICVzIGxlbiAlZCIsIF9fZnVuY19fLCBwcmVzZXQsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgKnBWYWx1ZVNpemUpOworCisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBFUV9QQVJBTV9QUk9QRVJUSUVTOiB7CisgICAgICAgICAgICBjb25zdGV4cHIgdWludDMyX3QgcmVxdWlyZWRWYWx1ZVNpemUgPSAoMiArIEZJVkVCQU5EX05VTUJBTkRTKSAqIHNpemVvZih1aW50MTZfdCk7CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCByZXF1aXJlZFZhbHVlU2l6ZSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9QUk9QRVJUSUVTIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHJlcXVpcmVkVmFsdWVTaXplOworCisgICAgICAgICAgICBpbnQxNl90KiBwID0gKGludDE2X3QqKXBWYWx1ZTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9QUk9QRVJUSUVTIiwgX19mdW5jX18pOworICAgICAgICAgICAgcFswXSA9IChpbnQxNl90KUVxdWFsaXplckdldFByZXNldChwQ29udGV4dCk7CisgICAgICAgICAgICBwWzFdID0gKGludDE2X3QpRklWRUJBTkRfTlVNQkFORFM7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwWzIgKyBpXSA9IChpbnQxNl90KUVxdWFsaXplckdldEJhbmRMZXZlbChwQ29udGV4dCwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dWKCIlcyBpbnZhbGlkIHBhcmFtICVkIiwgX19mdW5jX18sIHBhcmFtc1swXSk7CiAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjaGFyICogY29uc3QgbmFtZSA9IChjaGFyICopcFZhbHVlOwotICAgICAgICBzdHJuY3B5KG5hbWUsIEVxdWFsaXplckdldFByZXNldE5hbWUocHJlc2V0KSwgKnBWYWx1ZVNpemUgLSAxKTsKLSAgICAgICAgbmFtZVsqcFZhbHVlU2l6ZSAtIDFdID0gMDsKLSAgICAgICAgKnBWYWx1ZVNpemUgPSBzdHJsZW4obmFtZSkgKyAxOwotICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0dFVF9QUkVTRVRfTkFNRSBwcmVzZXQgJWQsIG5hbWUgJXMgbGVuICVkIiwKLSAgICAgICAgICAgICAgIF9fZnVuY19fLCBwcmVzZXQsIG5hbWUsICpwVmFsdWVTaXplKTsKLQotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEVRX1BBUkFNX1BST1BFUlRJRVM6IHsKLSAgICAgICAgY29uc3RleHByIHVpbnQzMl90IHJlcXVpcmVkVmFsdWVTaXplID0gKDIgKyBGSVZFQkFORF9OVU1CQU5EUykgKiBzaXplb2YodWludDE2X3QpOwotICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCByZXF1aXJlZFZhbHVlU2l6ZSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX1BST1BFUlRJRVMgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgKnBWYWx1ZVNpemUgPSByZXF1aXJlZFZhbHVlU2l6ZTsKLQotICAgICAgICBpbnQxNl90ICpwID0gKGludDE2X3QgKilwVmFsdWU7Ci0gICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9QUk9QRVJUSUVTIiwgX19mdW5jX18pOwotICAgICAgICBwWzBdID0gKGludDE2X3QpRXF1YWxpemVyR2V0UHJlc2V0KHBDb250ZXh0KTsKLSAgICAgICAgcFsxXSA9IChpbnQxNl90KUZJVkVCQU5EX05VTUJBTkRTOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKLSAgICAgICAgICAgIHBbMiArIGldID0gKGludDE2X3QpRXF1YWxpemVyR2V0QmFuZExldmVsKHBDb250ZXh0LCBpKTsKLSAgICAgICAgfQotICAgIH0gYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVigiJXMgaW52YWxpZCBwYXJhbSAlZCIsIF9fZnVuY19fLCBwYXJhbXNbMF0pOwotICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICBicmVhazsKICAgICB9CiAKICAgICBBTE9HVlYoIiVzIGVuZCBwYXJhbTogJWQsIHN0YXR1czogJWQiLCBfX2Z1bmNfXywgcGFyYW1zWzBdLCBzdGF0dXMpOwpAQCAtMjU4OSwxMyArMjM4MywxMCBAQAogLy8gT3V0cHV0czoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKSB7CitpbnQgRXF1YWxpemVyX3NldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgdWludDMyX3QgcGFyYW1TaXplLCB2b2lkKiBwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZVNpemUsIHZvaWQqIHBWYWx1ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwotICAgIGludDMyX3QgKnBhcmFtcyA9IChpbnQzMl90ICopcFBhcmFtOworICAgIGludDMyX3QqIHBhcmFtcyA9IChpbnQzMl90KilwUGFyYW07CiAKICAgICBBTE9HVlYoIiVzIHN0YXJ0IiwgX19mdW5jX18pOwogCkBAIC0yNjA0LDg3ICsyMzk1LDg3IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KICAgICBzd2l0Y2ggKHBhcmFtc1swXSkgewotICAgIGNhc2UgRVFfUEFSQU1fQ1VSX1BSRVNFVDogewotICAgICAgICBpZiAodmFsdWVTaXplIDwgc2l6ZW9mKGludDE2X3QpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQ1VSX1BSRVNFVCBpbnZhbGlkIHZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCB2YWx1ZVNpemUpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGludDMyX3QgcHJlc2V0ID0gKGludDMyX3QpKih1aW50MTZfdCAqKXBWYWx1ZTsKLQotICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0NVUl9QUkVTRVQgJWQiLCBfX2Z1bmNfXywgcHJlc2V0KTsKLSAgICAgICAgaWYgKHByZXNldCA+PSBFcXVhbGl6ZXJHZXROdW1QcmVzZXRzKCkgfHwgcHJlc2V0IDwgMCkgewotICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0NVUl9QUkVTRVQgaW52YWxpZCBwcmVzZXQgJWQiLCBfX2Z1bmNfXywgcHJlc2V0KTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBFcXVhbGl6ZXJTZXRQcmVzZXQocENvbnRleHQsIHByZXNldCk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgRVFfUEFSQU1fQkFORF9MRVZFTDogewotICAgICAgICBpZiAocGFyYW1TaXplIDwgMiAqIHNpemVvZihpbnQzMl90KSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0JBTkRfTEVWRUwgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0JBTkRfTEVWRUwgaW52YWxpZCB2YWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgdmFsdWVTaXplKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBpbnQzMl90IGJhbmQgPSAgcGFyYW1zWzFdOwotICAgICAgICBjb25zdCBpbnQzMl90IGxldmVsID0gKGludDMyX3QpKihpbnQxNl90ICopcFZhbHVlOwotICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0JBTkRfTEVWRUwgYmFuZCAlZCwgbGV2ZWwgJWQiLCBfX2Z1bmNfXywgYmFuZCwgbGV2ZWwpOwotICAgICAgICBpZiAoYmFuZCA8IDAgfHwgYmFuZCA+PSBGSVZFQkFORF9OVU1CQU5EUykgewotICAgICAgICAgICAgaWYgKGJhbmQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMjA5NTYyNiIpOwotICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBFUV9QQVJBTV9CQU5EX0xFVkVMIGludmFsaWQgYmFuZCAlZCIsIF9fZnVuY19fLCBiYW5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBFcXVhbGl6ZXJTZXRCYW5kTGV2ZWwocENvbnRleHQsIGJhbmQsIGxldmVsKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBFUV9QQVJBTV9QUk9QRVJUSUVTOiB7Ci0gICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fUFJPUEVSVElFUyIsIF9fZnVuY19fKTsKLSAgICAgICAgaWYgKHZhbHVlU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX1BST1BFUlRJRVMgaW52YWxpZCB2YWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgdmFsdWVTaXplKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpbnQxNl90ICpwID0gKGludDE2X3QgKilwVmFsdWU7Ci0gICAgICAgIGlmICgoaW50KXBbMF0gPj0gRXF1YWxpemVyR2V0TnVtUHJlc2V0cygpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fUFJPUEVSVElFUyBpbnZhbGlkIHByZXNldCAlZCIsIF9fZnVuY19fLCAoaW50KXBbMF0pOwotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwWzBdID49IDApIHsKLSAgICAgICAgICAgIEVxdWFsaXplclNldFByZXNldChwQ29udGV4dCwgKGludClwWzBdKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnN0ZXhwciB1aW50MzJfdCB2YWx1ZVNpemVSZXF1aXJlZCA9ICgyICsgRklWRUJBTkRfTlVNQkFORFMpICogc2l6ZW9mKGludDE2X3QpOwotICAgICAgICAgICAgaWYgKHZhbHVlU2l6ZSA8IHZhbHVlU2l6ZVJlcXVpcmVkKSB7Ci0gICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzc1NjMzNzEiKTsKLSAgICAgICAgICAgICAgQUxPR0UoIiVzIEVRX1BBUkFNX1BST1BFUlRJRVMgaW52YWxpZCB2YWx1ZVNpemUgJXUgPCAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHZhbHVlU2l6ZSwgdmFsdWVTaXplUmVxdWlyZWQpOwotICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoaW50KXBbMV0gIT0gRklWRUJBTkRfTlVNQkFORFMpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fUFJPUEVSVElFUyBpbnZhbGlkIGJhbmRzICVkIiwgX19mdW5jX18sIChpbnQpcFsxXSk7CisgICAgICAgIGNhc2UgRVFfUEFSQU1fQ1VSX1BSRVNFVDogeworICAgICAgICAgICAgaWYgKHZhbHVlU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9DVVJfUFJFU0VUIGludmFsaWQgdmFsdWVTaXplICV1IiwgX19mdW5jX18sIHZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgewotICAgICAgICAgICAgICAgIEVxdWFsaXplclNldEJhbmRMZXZlbChwQ29udGV4dCwgaSwgKGludClwWzIgKyBpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGJyZWFrOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCBwcmVzZXQgPSAoaW50MzJfdCkgKiAodWludDE2X3QqKXBWYWx1ZTsKIAotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dWKCIlcyBpbnZhbGlkIHBhcmFtICVkIiwgX19mdW5jX18sIHBhcmFtc1swXSk7Ci0gICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgIGJyZWFrOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9DVVJfUFJFU0VUICVkIiwgX19mdW5jX18sIHByZXNldCk7CisgICAgICAgICAgICBpZiAocHJlc2V0ID49IEVxdWFsaXplckdldE51bVByZXNldHMoKSB8fCBwcmVzZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0NVUl9QUkVTRVQgaW52YWxpZCBwcmVzZXQgJWQiLCBfX2Z1bmNfXywgcHJlc2V0KTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXF1YWxpemVyU2V0UHJlc2V0KHBDb250ZXh0LCBwcmVzZXQpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgRVFfUEFSQU1fQkFORF9MRVZFTDogeworICAgICAgICAgICAgaWYgKHBhcmFtU2l6ZSA8IDIgKiBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQkFORF9MRVZFTCBpbnZhbGlkIHBhcmFtU2l6ZTogJXUiLCBfX2Z1bmNfXywgcGFyYW1TaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZhbHVlU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9CQU5EX0xFVkVMIGludmFsaWQgdmFsdWVTaXplICV1IiwgX19mdW5jX18sIHZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYmFuZCA9IHBhcmFtc1sxXTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgbGV2ZWwgPSAoaW50MzJfdCkgKiAoaW50MTZfdCopcFZhbHVlOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9CQU5EX0xFVkVMIGJhbmQgJWQsIGxldmVsICVkIiwgX19mdW5jX18sIGJhbmQsIGxldmVsKTsKKyAgICAgICAgICAgIGlmIChiYW5kIDwgMCB8fCBiYW5kID49IEZJVkVCQU5EX05VTUJBTkRTKSB7CisgICAgICAgICAgICAgICAgaWYgKGJhbmQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzIwOTU2MjYiKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzIEVRX1BBUkFNX0JBTkRfTEVWRUwgaW52YWxpZCBiYW5kICVkIiwgX19mdW5jX18sIGJhbmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXF1YWxpemVyU2V0QmFuZExldmVsKHBDb250ZXh0LCBiYW5kLCBsZXZlbCk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBFUV9QQVJBTV9QUk9QRVJUSUVTOiB7CisgICAgICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX1BST1BFUlRJRVMiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBpZiAodmFsdWVTaXplIDwgc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX1BST1BFUlRJRVMgaW52YWxpZCB2YWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgdmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50MTZfdCogcCA9IChpbnQxNl90KilwVmFsdWU7CisgICAgICAgICAgICBpZiAoKGludClwWzBdID49IEVxdWFsaXplckdldE51bVByZXNldHMoKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9QUk9QRVJUSUVTIGludmFsaWQgcHJlc2V0ICVkIiwgX19mdW5jX18sIChpbnQpcFswXSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwWzBdID49IDApIHsKKyAgICAgICAgICAgICAgICBFcXVhbGl6ZXJTZXRQcmVzZXQocENvbnRleHQsIChpbnQpcFswXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnN0ZXhwciB1aW50MzJfdCB2YWx1ZVNpemVSZXF1aXJlZCA9ICgyICsgRklWRUJBTkRfTlVNQkFORFMpICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZVNpemUgPCB2YWx1ZVNpemVSZXF1aXJlZCkgeworICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjM3NTYzMzcxIik7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBFUV9QQVJBTV9QUk9QRVJUSUVTIGludmFsaWQgdmFsdWVTaXplICV1IDwgJXUiLCBfX2Z1bmNfXywgdmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVNpemVSZXF1aXJlZCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGludClwWzFdICE9IEZJVkVCQU5EX05VTUJBTkRTKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9QUk9QRVJUSUVTIGludmFsaWQgYmFuZHMgJWQiLCBfX2Z1bmNfXywgKGludClwWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBFcXVhbGl6ZXJTZXRCYW5kTGV2ZWwocENvbnRleHQsIGksIChpbnQpcFsyICsgaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1YoIiVzIGludmFsaWQgcGFyYW0gJWQiLCBfX2Z1bmNfXywgcGFyYW1zWzBdKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKICAgICB9CiAKICAgICBBTE9HVlYoIiVzIGVuZCBwYXJhbTogJWQsIHN0YXR1czogJWQiLCBfX2Z1bmNfXywgcGFyYW1zWzBdLCBzdGF0dXMpOwpAQCAtMjcxMiwxMyArMjUwMywxMCBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgVm9sdW1lX2dldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHBhcmFtU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgKnBWYWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpIHsKK2ludCBWb2x1bWVfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBwYXJhbVNpemUsIHZvaWQqIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwVmFsdWVTaXplLCB2b2lkKiBwVmFsdWUpIHsKICAgICBpbnQgc3RhdHVzID0gMDsKLSAgICBpbnQzMl90ICpwYXJhbXMgPSAoaW50MzJfdCAqKXBQYXJhbTsKKyAgICBpbnQzMl90KiBwYXJhbXMgPSAoaW50MzJfdCopcFBhcmFtOwogCiAgICAgQUxPR1ZWKCIlcyBzdGFydCIsIF9fZnVuY19fKTsKIApAQCAtMjcyOCwxOSArMjUxNiwxOSBAQAogICAgIH0KICAgICBzd2l0Y2ggKHBhcmFtc1swXSkgewogICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9MRVZFTDoKLSAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpIHsgLy8gbGVnYWN5OiBjaGVjayBlcXVhbGl0eSBoZXJlLgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSkgeyAgLy8gbGVnYWN5OiBjaGVjayBlcXVhbGl0eSBoZXJlLgogICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWT0xVTUVfUEFSQU1fTEVWRUwgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gc2V0ICpwVmFsdWVTaXplCiAKLSAgICAgICAgICAgIHN0YXR1cyA9IFZvbHVtZUdldFZvbHVtZUxldmVsKHBDb250ZXh0LCAoaW50MTZfdCAqKShwVmFsdWUpKTsKLSAgICAgICAgICAgIEFMT0dWVigiJXMgVk9MVU1FX1BBUkFNX0xFVkVMICVkIiwgX19mdW5jX18sICooaW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICBzdGF0dXMgPSBWb2x1bWVHZXRWb2x1bWVMZXZlbChwQ29udGV4dCwgKGludDE2X3QqKShwVmFsdWUpKTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgVk9MVU1FX1BBUkFNX0xFVkVMICVkIiwgX19mdW5jX18sICooaW50MTZfdCopcFZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX01BWExFVkVMOgotICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSkgeyAvLyBsZWdhY3k6IGNoZWNrIGVxdWFsaXR5IGhlcmUuCisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKSB7ICAvLyBsZWdhY3k6IGNoZWNrIGVxdWFsaXR5IGhlcmUuCiAgICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZPTFVNRV9QQVJBTV9NQVhMRVZFTCBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjc0OCwyMSArMjUzNiwyMSBAQAogICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzZXQgKnBWYWx1ZVNpemUKIAogICAgICAgICAgICAgLy8gaW4gbWlsbGliZWwKLSAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IDA7Ci0gICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9NQVhMRVZFTCAlZCIsIF9fZnVuY19fLCAqKGludDE2X3QgKilwVmFsdWUpOworICAgICAgICAgICAgKihpbnQxNl90KilwVmFsdWUgPSAwOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fTUFYTEVWRUwgJWQiLCBfX2Z1bmNfXywgKihpbnQxNl90KilwVmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT046Ci0gICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKSB7IC8vIGxlZ2FjeTogY2hlY2sgZXF1YWxpdHkgaGVyZS4KLSAgICAgICAgICAgICAgICBBTE9HVigiJXMgVk9MVU1FX1BBUkFNX1NURVJFT1BPU0lUSU9OIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpIHsgIC8vIGxlZ2FjeTogY2hlY2sgZXF1YWxpdHkgaGVyZS4KKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgVk9MVU1FX1BBUkFNX1NURVJFT1BPU0lUSU9OIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICAqcFZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gc2V0ICpwVmFsdWVTaXplCiAKLSAgICAgICAgICAgIFZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uKHBDb250ZXh0LCAoaW50MTZfdCAqKXBWYWx1ZSk7Ci0gICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9TVEVSRU9QT1NJVElPTiAlZCIsIF9fZnVuY19fLCAqKGludDE2X3QgKilwVmFsdWUpOworICAgICAgICAgICAgVm9sdW1lR2V0U3RlcmVvUG9zaXRpb24ocENvbnRleHQsIChpbnQxNl90KilwVmFsdWUpOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT04gJWQiLCBfX2Z1bmNfXywgKihpbnQxNl90KilwVmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fTVVURToKQEAgLTI3NzMsMjEgKzI1NjEsMjEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKIAotICAgICAgICAgICAgc3RhdHVzID0gVm9sdW1lR2V0TXV0ZShwQ29udGV4dCwgKHVpbnQzMl90ICopcFZhbHVlKTsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBWT0xVTUVfUEFSQU1fTVVURSAldSIsIF9fZnVuY19fLCAqKHVpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFZvbHVtZUdldE11dGUocENvbnRleHQsICh1aW50MzJfdCopcFZhbHVlKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBWT0xVTUVfUEFSQU1fTVVURSAldSIsIF9fZnVuY19fLCAqKHVpbnQzMl90KilwVmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fRU5BQkxFU1RFUkVPUE9TSVRJT046CiAgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YoaW50MzJfdCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXMgVk9MVU1FX1BBUkFNX0VOQUJMRVNURVJFT1BPU0lUSU9OIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgVk9MVU1FX1BBUkFNX0VOQUJMRVNURVJFT1BPU0lUSU9OIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICAqcFZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDMyX3QpOwogCi0gICAgICAgICAgICAqKGludDMyX3QgKilwVmFsdWUgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iU3RlcmVvUG9zaXRpb25FbmFibGVkOwotICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fRU5BQkxFU1RFUkVPUE9TSVRJT04gJWQiLCBfX2Z1bmNfXywgKihpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgICooaW50MzJfdCopcFZhbHVlID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZDsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgVk9MVU1FX1BBUkFNX0VOQUJMRVNURVJFT1BPU0lUSU9OICVkIiwgX19mdW5jX18sICooaW50MzJfdCopcFZhbHVlKTsKIAogICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTI4MTYsMTMgKzI2MDQsMTAgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IFZvbHVtZV9zZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBwYXJhbVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB2YWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpIHsKK2ludCBWb2x1bWVfc2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBwYXJhbVNpemUsIHZvaWQqIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKSB7CiAgICAgaW50IHN0YXR1cyA9IDA7Ci0gICAgaW50MzJfdCAqcGFyYW1zID0gKGludDMyX3QgKilwUGFyYW07CisgICAgaW50MzJfdCogcGFyYW1zID0gKGludDMyX3QqKXBQYXJhbTsKIAogICAgIEFMT0dWVigiJXMgc3RhcnQiLCBfX2Z1bmNfXyk7CiAKQEAgLTI4MzgsNyArMjYyMyw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNvbnN0IGludDE2X3QgbGV2ZWwgPSAqKGludDE2X3QgKilwVmFsdWU7CisgICAgICAgICAgICBjb25zdCBpbnQxNl90IGxldmVsID0gKihpbnQxNl90KilwVmFsdWU7CiAgICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9MRVZFTCAlZCIsIF9fZnVuY19fLCBsZXZlbCk7CiAgICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9MRVZFTCBDYWxsaW5nIFZvbHVtZVNldFZvbHVtZUxldmVsIiwgX19mdW5jX18pOwogICAgICAgICAgICAgc3RhdHVzID0gVm9sdW1lU2V0Vm9sdW1lTGV2ZWwocENvbnRleHQsIGxldmVsKTsKQEAgLTI4NTMsNyArMjYzOCw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IG11dGUgPSAqKHVpbnQzMl90ICopcFZhbHVlOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbXV0ZSA9ICoodWludDMyX3QqKXBWYWx1ZTsKICAgICAgICAgICAgIEFMT0dWVigiJXMgVk9MVU1FX1BBUkFNX01VVEUgJWQiLCBfX2Z1bmNfXywgbXV0ZSk7CiAgICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9NVVRFIENhbGxpbmcgVm9sdW1lU2V0TXV0ZSIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHN0YXR1cyA9IFZvbHVtZVNldE11dGUocENvbnRleHQsIG11dGUpOwpAQCAtMjg2MiwxNSArMjY0NywxNiBAQAogCiAgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX0VOQUJMRVNURVJFT1BPU0lUSU9OOiB7CiAgICAgICAgICAgICBpZiAodmFsdWVTaXplIDwgc2l6ZW9mKHVpbnQzMl90KSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWT0xVTUVfUEFSQU1fRU5BQkxFU1RFUkVPUE9TSVRJT04gaW52YWxpZCB2YWx1ZVNpemUgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTiBpbnZhbGlkIHZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgcG9zaXRpb25FbmFibGVkID0gKih1aW50MzJfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHBvc2l0aW9uRW5hYmxlZCA9ICoodWludDMyX3QqKXBWYWx1ZTsKICAgICAgICAgICAgIHN0YXR1cyA9IFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uKHBDb250ZXh0LCBwb3NpdGlvbkVuYWJsZWQpCi0gICAgICAgICAgICAgICAgICAgID86IFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uKHBDb250ZXh0LCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPzogVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24ocENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQpOwogICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fRU5BQkxFU1RFUkVPUE9TSVRJT04gY2FsbGVkIiwgX19mdW5jX18pOwogICAgICAgICB9IGJyZWFrOwogCkBAIC0yODgxLDEzICsyNjY3LDExIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNvbnN0IGludDE2X3QgcG9zaXRpb24gPSAqKGludDE2X3QgKilwVmFsdWU7CisgICAgICAgICAgICBjb25zdCBpbnQxNl90IHBvc2l0aW9uID0gKihpbnQxNl90KilwVmFsdWU7CiAgICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9TVEVSRU9QT1NJVElPTiAlZCIsIF9fZnVuY19fLCBwb3NpdGlvbik7Ci0gICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9TVEVSRU9QT1NJVElPTiBDYWxsaW5nIFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT04gQ2FsbGluZyBWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHN0YXR1cyA9IFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uKHBDb250ZXh0LCBwb3NpdGlvbik7Ci0gICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9TVEVSRU9QT1NJVElPTiBDYWxsZWQgVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24iLAotICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9TVEVSRU9QT1NJVElPTiBDYWxsZWQgVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24iLCBfX2Z1bmNfXyk7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTI5MTIsMTggKzI2OTYsMTUgQEAKICAqICBSZW1hcmtzICAgICA6CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZNX0lOVDE2IExWQ19Ub0RCX3MzMlRvczE2KExWTV9JTlQzMiBMaW5fZml4KQotewotICAgIExWTV9JTlQxNiAgIGRiX2ZpeDsKLSAgICBMVk1fSU5UMTYgICBTaGlmdDsKLSAgICBMVk1fSU5UMTYgICBTbWFsbFJlbWFpbmRlcjsKLSAgICBMVk1fVUlOVDMyICBSZW1haW5kZXIgPSAoTFZNX1VJTlQzMilMaW5fZml4OworTFZNX0lOVDE2IExWQ19Ub0RCX3MzMlRvczE2KExWTV9JTlQzMiBMaW5fZml4KSB7CisgICAgTFZNX0lOVDE2IGRiX2ZpeDsKKyAgICBMVk1fSU5UMTYgU2hpZnQ7CisgICAgTFZNX0lOVDE2IFNtYWxsUmVtYWluZGVyOworICAgIExWTV9VSU5UMzIgUmVtYWluZGVyID0gKExWTV9VSU5UMzIpTGluX2ZpeDsKIAogICAgIC8qIENvdW50IGxlYWRpbmcgYml0cywgMSBjeWNsZSBpbiBhc3NlbWJseSovCi0gICAgZm9yIChTaGlmdCA9IDA7IFNoaWZ0PDMyOyBTaGlmdCsrKQotICAgIHsKLSAgICAgICAgaWYgKChSZW1haW5kZXIgJiAweDgwMDAwMDAwVSkhPTApCi0gICAgICAgIHsKKyAgICBmb3IgKFNoaWZ0ID0gMDsgU2hpZnQgPCAzMjsgU2hpZnQrKykgeworICAgICAgICBpZiAoKFJlbWFpbmRlciAmIDB4ODAwMDAwMDBVKSAhPSAwKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBSZW1haW5kZXIgPSBSZW1haW5kZXIgPDwgMTsKQEAgLTI5MzQsOSArMjcxNSw5IEBACiAgICAgICoKICAgICAgKiBkQiA9IC05NiAqIFNoaWZ0ICsgMTYgKiAoOCAqIFJlbWFpbmRlciAtIDIgKiBSZW1haW5kZXJeMikKICAgICAgKi8KLSAgICBkYl9maXggICAgPSAoTFZNX0lOVDE2KSgtOTYgKiBTaGlmdCk7ICAgICAgICAgICAgICAgLyogU2l4IGRCIHN0ZXBzIGluIFExMS40IGZvcm1hdCovCisgICAgZGJfZml4ID0gKExWTV9JTlQxNikoLTk2ICogU2hpZnQpOyAvKiBTaXggZEIgc3RlcHMgaW4gUTExLjQgZm9ybWF0Ki8KICAgICBTbWFsbFJlbWFpbmRlciA9IChMVk1fSU5UMTYpKChSZW1haW5kZXIgJiAweDdmZmZmZmZmKSA+PiAyNCk7Ci0gICAgZGJfZml4ID0gKExWTV9JTlQxNikoZGJfZml4ICsgU21hbGxSZW1haW5kZXIgKTsKKyAgICBkYl9maXggPSAoTFZNX0lOVDE2KShkYl9maXggKyBTbWFsbFJlbWFpbmRlcik7CiAgICAgU21hbGxSZW1haW5kZXIgPSAoTFZNX0lOVDE2KShTbWFsbFJlbWFpbmRlciAqIFNtYWxsUmVtYWluZGVyKTsKICAgICBkYl9maXggPSAoTFZNX0lOVDE2KShkYl9maXggLSAoTFZNX0lOVDE2KSgoTFZNX1VJTlQxNilTbWFsbFJlbWFpbmRlciA+PiA5KSk7CiAKQEAgLTI5NjAsMTEgKzI3NDEsMTAgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IEVmZmVjdF9zZXRFbmFibGVkKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBib29sIGVuYWJsZWQpCi17Ci0gICAgQUxPR1YoIiVzIGVmZmVjdFR5cGUgJWQsIGVuYWJsZWQgJWQsIGN1cnJlbnRseSBlbmFibGVkICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICBwQ29udGV4dC0+RWZmZWN0VHlwZSwgZW5hYmxlZCwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQpOwotICAgIGludCAmZWZmZWN0SW5EcmFpbiA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmVmZmVjdEluRHJhaW47CitpbnQgRWZmZWN0X3NldEVuYWJsZWQoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIGJvb2wgZW5hYmxlZCkgeworICAgIEFMT0dWKCIlcyBlZmZlY3RUeXBlICVkLCBlbmFibGVkICVkLCBjdXJyZW50bHkgZW5hYmxlZCAlZCIsIF9fZnVuY19fLCBwQ29udGV4dC0+RWZmZWN0VHlwZSwKKyAgICAgICAgICBlbmFibGVkLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCk7CisgICAgaW50JiBlZmZlY3RJbkRyYWluID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZWZmZWN0SW5EcmFpbjsKICAgICBpZiAoZW5hYmxlZCkgewogICAgICAgICAvLyBCYXNzIGJvb3N0IG9yIFZpcnR1YWxpemVyIGNhbiBiZSB0ZW1wb3JhcmlseSBkaXNhYmxlZCBpZiBwbGF5aW5nIG92ZXIgZGV2aWNlIHNwZWFrZXIgZHVlCiAgICAgICAgIC8vIHRvIHRoZWlyIG5hdHVyZS4KQEAgLTI5NzIsMTUgKzI3NTIsMTUgQEAKICAgICAgICAgc3dpdGNoIChwQ29udGV4dC0+RWZmZWN0VHlwZSkgewogICAgICAgICAgICAgY2FzZSBMVk1fQkFTU19CT09TVDoKICAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NFbmFibGVkID09IExWTV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFZmZlY3Rfc2V0RW5hYmxlZCgpIExWTV9CQVNTX0JPT1NUIGlzIGFscmVhZHkgZW5hYmxlZCIpOwotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVmZmVjdF9zZXRFbmFibGVkKCkgTFZNX0JBU1NfQk9PU1QgaXMgYWxyZWFkeSBlbmFibGVkIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA8PSAwKXsKKyAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPD0gMCkgewogICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCsrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlZmZlY3RJbkRyYWluICY9IH4oMSA8PCBMVk1fQkFTU19CT09TVCk7CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPQotICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCowLjEpOworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCAqIDAuMSk7CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NFbmFibGVkID0gTFZNX1RSVUU7CiAgICAgICAgICAgICAgICAgdGVtcERpc2FibGVkID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NUZW1wRGlzYWJsZWQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0yOTg5LDEyICsyNzY5LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVmZmVjdF9zZXRFbmFibGVkKCkgTFZNX0VRVUFMSVpFUiBpcyBhbHJlYWR5IGVuYWJsZWQiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxIDw9IDApeworICAgICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkKys7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVmZmVjdEluRHJhaW4gJj0gfigxIDw8IExWTV9FUVVBTElaRVIpOwogICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxID0KLSAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQqMC4xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgKiAwLjEpOwogICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID0gTFZNX1RSVUU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIExWTV9WSVJUVUFMSVpFUjoKQEAgLTMwMDIsMTIgKzI3ODIsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0X3NldEVuYWJsZWQoKSBMVk1fVklSVFVBTElaRVIgaXMgYWxyZWFkeSBlbmFibGVkIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0IDw9IDApeworICAgICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0IDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQrKzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWZmZWN0SW5EcmFpbiAmPSB+KDEgPDwgTFZNX1ZJUlRVQUxJWkVSKTsKICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ID0KLSAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQqMC4xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgKiAwLjEpOwogICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPSBMVk1fVFJVRTsKICAgICAgICAgICAgICAgICB0ZW1wRGlzYWJsZWQgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0zMDg0LDQxICsyODY0LDM5IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQxNl90IExWQ19Db252ZXJ0X1ZvbFRvRGIodWludDMyX3Qgdm9sKXsKLSAgICBpbnQxNl90ICBkQjsKK2ludDE2X3QgTFZDX0NvbnZlcnRfVm9sVG9EYih1aW50MzJfdCB2b2wpIHsKKyAgICBpbnQxNl90IGRCOwogCi0gICAgZEIgPSBMVkNfVG9EQl9zMzJUb3MxNih2b2wgPDw3KTsKLSAgICBkQiA9IChkQiArOCk+PjQ7Ci0gICAgZEIgPSAoZEIgPC05NikgPyAtOTYgOiBkQiA7CisgICAgZEIgPSBMVkNfVG9EQl9zMzJUb3MxNih2b2wgPDwgNyk7CisgICAgZEIgPSAoZEIgKyA4KSA+PiA0OworICAgIGRCID0gKGRCIDwgLTk2KSA/IC05NiA6IGRCOwogCiAgICAgcmV0dXJuIGRCOwogfQogCi19IC8vIG5hbWVzcGFjZQotfSAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogZXh0ZXJuICJDIiB7CiAvKiBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb246IFByb2Nlc3MgKi8KLWludCBFZmZlY3RfcHJvY2VzcyhlZmZlY3RfaGFuZGxlX3QgICAgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAgICAgICAgICppbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICAgICAgICAgKm91dEJ1ZmZlcil7Ci0gICAgRWZmZWN0Q29udGV4dCAqIHBDb250ZXh0ID0gKEVmZmVjdENvbnRleHQgKikgc2VsZjsKLSAgICBpbnQgICAgc3RhdHVzID0gMDsKLSAgICBpbnQgICAgcHJvY2Vzc1N0YXR1cyA9IDA7CitpbnQgRWZmZWN0X3Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90IHNlbGYsIGF1ZGlvX2J1ZmZlcl90KiBpbkJ1ZmZlciwgYXVkaW9fYnVmZmVyX3QqIG91dEJ1ZmZlcikgeworICAgIEVmZmVjdENvbnRleHQqIHBDb250ZXh0ID0gKEVmZmVjdENvbnRleHQqKXNlbGY7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgaW50IHByb2Nlc3NTdGF0dXMgPSAwOwogICAgIGNvbnN0IGludCBOckNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOwogCi0vL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzIFN0YXJ0IDogRW5hYmxlZCA9ICVkICAgICBDYWxsZWQgPSAlZCAoJThkICU4ZCAlOGQpIiwKLS8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQscENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwKLS8vICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiLAotLy8gICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCwKLS8vICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxKTsKKyAgICAvLyBBTE9HVigiXHRFZmZlY3RfcHJvY2VzcyBTdGFydCA6IEVuYWJsZWQgPSAlZCAgICAgQ2FsbGVkID0gJWQgKCU4ZCAlOGQgJThkKSIsCisgICAgLy8gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQscENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwKKyAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiwKKyAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0LAorICAgIC8vICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxKTsKIAotICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKXsKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RfcHJvY2VzcygpIEVSUk9SIHBDb250ZXh0ID09IE5VTEwiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgLy9pZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCl7CisgICAgLy8gaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpewogICAgIC8vICBBTE9HVigiXHRFZmZlY3RfcHJvY2VzczogRWZmZWN0IHR5cGUgaXMgQkFTU19CT09TVCIpOwogICAgIC8vfWVsc2UgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUil7CiAgICAgLy8gIEFMT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBFZmZlY3QgdHlwZSBpcyBMVk1fRVFVQUxJWkVSIik7CkBAIC0zMTI2LDE1ICsyOTA0LDE0IEBACiAgICAgLy8gIEFMT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBFZmZlY3QgdHlwZSBpcyBMVk1fVklSVFVBTElaRVIiKTsKICAgICAvL30KIAotICAgIGlmIChpbkJ1ZmZlciA9PSBOVUxMICB8fCBpbkJ1ZmZlci0+cmF3ID09IE5VTEwgIHx8Ci0gICAgICAgICAgICBvdXRCdWZmZXIgPT0gTlVMTCB8fCBvdXRCdWZmZXItPnJhdyA9PSBOVUxMIHx8Ci0gICAgICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAhPSBvdXRCdWZmZXItPmZyYW1lQ291bnQpeworICAgIGlmIChpbkJ1ZmZlciA9PSBOVUxMIHx8IGluQnVmZmVyLT5yYXcgPT0gTlVMTCB8fCBvdXRCdWZmZXIgPT0gTlVMTCB8fCBvdXRCdWZmZXItPnJhdyA9PSBOVUxMIHx8CisgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50ICE9IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCkgewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RfcHJvY2VzcygpIEVSUk9SIE5VTEwgSU5QVVQgUE9JTlRFUiBPUiBGUkFNRSBDT1VOVCBJUyBXUk9ORyIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICBpbnQgJmVmZmVjdFByb2Nlc3NDYWxsZWQgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5lZmZlY3RQcm9jZXNzQ2FsbGVkOwotICAgIGludCAmZWZmZWN0SW5EcmFpbiA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmVmZmVjdEluRHJhaW47CisgICAgaW50JiBlZmZlY3RQcm9jZXNzQ2FsbGVkID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZWZmZWN0UHJvY2Vzc0NhbGxlZDsKKyAgICBpbnQmIGVmZmVjdEluRHJhaW4gPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5lZmZlY3RJbkRyYWluOwogICAgIGlmICgoZWZmZWN0UHJvY2Vzc0NhbGxlZCAmIDEgPDwgcENvbnRleHQtPkVmZmVjdFR5cGUpICE9IDApIHsKICAgICAgICAgQUxPR1coIkVmZmVjdCAlZCBhbHJlYWR5IGNhbGxlZCIsIHBDb250ZXh0LT5FZmZlY3RUeXBlKTsKICAgICAgICAgY29uc3QgaW50IHVuZHJhaW5lZEVmZmVjdHMgPSBlZmZlY3RJbkRyYWluICYgfmVmZmVjdFByb2Nlc3NDYWxsZWQ7CkBAIC0zMTY0LDEyICsyOTQxLDEyIEBACiAgICAgfQogICAgIGVmZmVjdFByb2Nlc3NDYWxsZWQgfD0gMSA8PCBwQ29udGV4dC0+RWZmZWN0VHlwZTsKIAotICAgIGlmICgocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NFbmFibGVkID09IExWTV9GQUxTRSkmJgotICAgICAgICAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpKXsKLSAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIExWTV9CQVNTX0JPT1NUIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOwotICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA+IDApeworICAgIGlmICgocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NFbmFibGVkID09IExWTV9GQUxTRSkgJiYKKyAgICAgICAgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKSkgeworICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIExWTV9CQVNTX0JPT1NUIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOworICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPiAwKSB7CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBOckNoYW5uZWxzOwotICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzczogV2FpdGluZyB0byB0dXJuIG9mZiBCQVNTX0JPT1NULCAlZCBzYW1wbGVzIGxlZnQiLAorICAgICAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3M6IFdhaXRpbmcgdG8gdHVybiBvZmYgQkFTU19CT09TVCwgJWQgc2FtcGxlcyBsZWZ0IiwKICAgICAgICAgICAgIC8vICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiKTsKICAgICAgICAgfQogICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPD0gMCkgewpAQCAtMzE4MSwyMSArMjk1OCwyMSBAQAogICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSB0aGlzIGlzIHRoZSBsYXN0IGZyYW1lIGZvciBMVk1fQkFTU19CT09TVCIpOwogICAgICAgICB9CiAgICAgfQotICAgIGlmICgocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgPT0gTFZNX0ZBTFNFKSYmCi0gICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKSl7Ci0gICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBMVk1fVk9MVU1FIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOworICAgIGlmICgocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgPT0gTFZNX0ZBTFNFKSAmJgorICAgICAgICAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZPTFVNRSkpIHsKKyAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBMVk1fVk9MVU1FIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOwogICAgICAgICBzdGF0dXMgPSAtRU5PREFUQTsKICAgICAgICAgaWYgKChlZmZlY3RJbkRyYWluICYgMSA8PCBMVk1fVk9MVU1FKSAhPSAwKSB7CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZC0tOwogICAgICAgICAgICAgZWZmZWN0SW5EcmFpbiAmPSB+KDEgPDwgTFZNX1ZPTFVNRSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iRXF1YWxpemVyRW5hYmxlZCA9PSBMVk1fRkFMU0UpJiYKLSAgICAgICAgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpKXsKLSAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIExWTV9FUVVBTElaRVIgRWZmZWN0IGlzIG5vdCBlbmFibGVkIik7Ci0gICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxID4gMCl7CisgICAgaWYgKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iRXF1YWxpemVyRW5hYmxlZCA9PSBMVk1fRkFMU0UpICYmCisgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSkgeworICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIExWTV9FUVVBTElaRVIgRWZmZWN0IGlzIG5vdCBlbmFibGVkIik7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA+IDApIHsKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxIC09IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHM7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBXYWl0aW5nIHRvIHR1cm4gb2ZmIEVRVUFMSVpFUiwgJWQgc2FtcGxlcyBsZWZ0IiwKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBXYWl0aW5nIHRvIHR1cm4gb2ZmIEVRVUFMSVpFUiwgJWQgc2FtcGxlcyBsZWZ0IiwKICAgICAgICAgICAgIC8vICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxKTsKICAgICAgICAgfQogICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPD0gMCkgewpAQCAtMzIwNywxMyArMjk4NCwxMiBAQAogICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSB0aGlzIGlzIHRoZSBsYXN0IGZyYW1lIGZvciBMVk1fRVFVQUxJWkVSIik7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9GQUxTRSkmJgotICAgICAgICAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSl7Ci0gICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBMVk1fVklSVFVBTElaRVIgRWZmZWN0IGlzIG5vdCBlbmFibGVkIik7Ci0gICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPiAwKXsKLSAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgLT0KLSAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBOckNoYW5uZWxzOwotICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzczogV2FpdGluZyBmb3IgdG8gdHVybiBvZmYgVklSVFVBTElaRVIsICVkIHNhbXBsZXMgbGVmdCIsCisgICAgaWYgKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9GQUxTRSkgJiYKKyAgICAgICAgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUikpIHsKKyAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBMVk1fVklSVFVBTElaRVIgRWZmZWN0IGlzIG5vdCBlbmFibGVkIik7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ID4gMCkgeworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBOckNoYW5uZWxzOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3M6IFdhaXRpbmcgZm9yIHRvIHR1cm4gb2ZmIFZJUlRVQUxJWkVSLCAlZCBzYW1wbGVzIGxlZnQiLAogICAgICAgICAgICAgLy8gICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPD0gMCkgewpAQCAtMzIyNiwzNyArMzAwMiwzNCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYoc3RhdHVzICE9IC1FTk9EQVRBKXsKKyAgICBpZiAoc3RhdHVzICE9IC1FTk9EQVRBKSB7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQrKzsKICAgICB9CiAKICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCA+PQotICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQpIHsKLQorICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCkgewogICAgICAgICAvLyBXZSBleHBlY3QgdGhlICMgZWZmZWN0cyBjYWxsZWQgdG8gYmUgZXF1YWwgdG8gIyBlZmZlY3RzIGVuYWJsZWQgaW4gc2VxdWVuY2UgKGluY2x1ZGluZwogICAgICAgICAvLyBkcmFpbmluZyBlZmZlY3RzKS4gIFdhcm4gaWYgdGhpcyBpcyBub3QgdGhlIGNhc2UgZHVlIHRvIGluY29uc2lzdGVudCBjYWxscy4KICAgICAgICAgQUxPR1dfSUYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCA+Ci0gICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQsCi0gICAgICAgICAgICAgICAgIiVzIE51bWJlciBvZiBlZmZlY3RzIGNhbGxlZCAlZCBpcyBncmVhdGVyIHRoYW4gbnVtYmVyIG9mIGVmZmVjdHMgZW5hYmxlZCAlZCIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQsCi0gICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQpOwotICAgICAgICBlZmZlY3RQcm9jZXNzQ2FsbGVkID0gMDsgLy8gcmVzZXQgb3VyIGNvbnNpc3RlbmN5IGNoZWNrLgorICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLAorICAgICAgICAgICAgICAgICAiJXMgTnVtYmVyIG9mIGVmZmVjdHMgY2FsbGVkICVkIGlzIGdyZWF0ZXIgdGhhbiBudW1iZXIgb2YgZWZmZWN0cyBlbmFibGVkICVkIiwKKyAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQsCisgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkKTsKKyAgICAgICAgZWZmZWN0UHJvY2Vzc0NhbGxlZCA9IDA7ICAvLyByZXNldCBvdXIgY29uc2lzdGVuY3kgY2hlY2suCiAKLSAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzcyAgICAgQ2FsbGluZyBwcm9jZXNzIHdpdGggJWQgZWZmZWN0cyBlbmFibGVkLCAlZCBjYWxsZWQ6IEVmZmVjdCAlZCIsCi0gICAgICAgIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQsCi0gICAgICAgIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwgcENvbnRleHQtPkVmZmVjdFR5cGUpOworICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfcHJvY2VzcyAgICAgQ2FsbGluZyBwcm9jZXNzIHdpdGggJWQgZWZmZWN0cyBlbmFibGVkLCAlZCBjYWxsZWQ6IEVmZmVjdAorICAgICAgICAvLyAlZCIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLAorICAgICAgICAvLyBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkLCBwQ29udGV4dC0+RWZmZWN0VHlwZSk7CiAKLSAgICAgICAgaWYgKHN0YXR1cyA9PSAtRU5PREFUQSl7CisgICAgICAgIGlmIChzdGF0dXMgPT0gLUVOT0RBVEEpIHsKICAgICAgICAgICAgIEFMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgcHJvY2Vzc2luZyBsYXN0IGZyYW1lIik7CiAgICAgICAgIH0KICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCA9IDA7CiAgICAgICAgIC8qIFByb2Nlc3MgYWxsIHRoZSBhdmFpbGFibGUgZnJhbWVzLCBibG9jayBwcm9jZXNzaW5nIGlzCiAgICAgICAgICAgIGhhbmRsZWQgaW50ZXJuYWxMWSBieSB0aGUgTFZNIGJ1bmRsZSAqLwotICAgICAgICBwcm9jZXNzU3RhdHVzID0gYW5kcm9pZDo6THZtQnVuZGxlX3Byb2Nlc3MoaW5CdWZmZXItPmYzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZjMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQpOwotICAgICAgICBpZiAocHJvY2Vzc1N0YXR1cyAhPSAwKXsKKyAgICAgICAgcHJvY2Vzc1N0YXR1cyA9IGFuZHJvaWQ6Okx2bUJ1bmRsZV9wcm9jZXNzKGluQnVmZmVyLT5mMzIsIG91dEJ1ZmZlci0+ZjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mcmFtZUNvdW50LCBwQ29udGV4dCk7CisgICAgICAgIGlmIChwcm9jZXNzU3RhdHVzICE9IDApIHsKICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEx2bUJ1bmRsZV9wcm9jZXNzIHJldHVybmVkIGVycm9yICVkIiwgcHJvY2Vzc1N0YXR1cyk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IDApIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBwcm9jZXNzU3RhdHVzOwpAQCAtMzI2NCwxMzMgKzMwMzcsMTI2IEBACiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzcyBOb3QgQ2FsbGluZyBwcm9jZXNzIHdpdGggJWQgZWZmZWN0cyBlbmFibGVkLCAlZCBjYWxsZWQ6IEVmZmVjdCAlZCIsCi0gICAgICAgIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQsCi0gICAgICAgIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwgcENvbnRleHQtPkVmZmVjdFR5cGUpOworICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfcHJvY2VzcyBOb3QgQ2FsbGluZyBwcm9jZXNzIHdpdGggJWQgZWZmZWN0cyBlbmFibGVkLCAlZCBjYWxsZWQ6IEVmZmVjdAorICAgICAgICAvLyAlZCIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLAorICAgICAgICAvLyBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkLCBwQ29udGV4dC0+RWZmZWN0VHlwZSk7CiAKICAgICAgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgewogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBOckNoYW5uZWxzOyArK2kpIHsKICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmYzMltpXSArPSBpbkJ1ZmZlci0+ZjMyW2ldOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG91dEJ1ZmZlci0+cmF3ICE9IGluQnVmZmVyLT5yYXcpIHsKLSAgICAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnJhdywKLSAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXItPnJhdywKLSAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCkgKiBGQ0NfMik7CisgICAgICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5yYXcsIGluQnVmZmVyLT5yYXcsCisgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCkgKiBGQ0NfMik7CiAgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gc3RhdHVzOwotfSAgIC8qIGVuZCBFZmZlY3RfcHJvY2VzcyAqLworfSAvKiBlbmQgRWZmZWN0X3Byb2Nlc3MgKi8KIAogLy8gVGhlIHZhbHVlIG9mZnNldCBvZiBhbiBlZmZlY3QgcGFyYW1ldGVyIGlzIGNvbXB1dGVkIGJ5IHJvdW5kaW5nIHVwCiAvLyB0aGUgcGFyYW1ldGVyIHNpemUgdG8gdGhlIG5leHQgMzIgYml0IGFsaWdubWVudC4KLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgY29tcHV0ZVBhcmFtVk9mZnNldChjb25zdCBlZmZlY3RfcGFyYW1fdCAqcCkgewotICAgIHJldHVybiAoKHAtPnBzaXplICsgc2l6ZW9mKGludDMyX3QpIC0gMSkgLyBzaXplb2YoaW50MzJfdCkpICoKLSAgICAgICAgICAgIHNpemVvZihpbnQzMl90KTsKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgY29tcHV0ZVBhcmFtVk9mZnNldChjb25zdCBlZmZlY3RfcGFyYW1fdCogcCkgeworICAgIHJldHVybiAoKHAtPnBzaXplICsgc2l6ZW9mKGludDMyX3QpIC0gMSkgLyBzaXplb2YoaW50MzJfdCkpICogc2l6ZW9mKGludDMyX3QpOwogfQogCiAvKiBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb246IENvbW1hbmQgKi8KLWludCBFZmZlY3RfY29tbWFuZChlZmZlY3RfaGFuZGxlX3QgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIGNtZENvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIGNtZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICpwQ21kRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgKnJlcGx5U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgKnBSZXBseURhdGEpewotICAgIEVmZmVjdENvbnRleHQgKiBwQ29udGV4dCA9IChFZmZlY3RDb250ZXh0ICopIHNlbGY7CitpbnQgRWZmZWN0X2NvbW1hbmQoZWZmZWN0X2hhbmRsZV90IHNlbGYsIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQqIHBDbWREYXRhLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiByZXBseVNpemUsIHZvaWQqIHBSZXBseURhdGEpIHsKKyAgICBFZmZlY3RDb250ZXh0KiBwQ29udGV4dCA9IChFZmZlY3RDb250ZXh0KilzZWxmOwogCi0gICAgLy9BTE9HVigiXHRcbkVmZmVjdF9jb21tYW5kIHN0YXJ0Iik7CisgICAgLy8gQUxPR1YoIlx0XG5FZmZlY3RfY29tbWFuZCBzdGFydCIpOwogCi0gICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpewotICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIHNldHRpbmcgY29tbWFuZCBmb3IgTFZNX0JBU1NfQk9PU1QiKTsKKyAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpIHsKKyAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgc2V0dGluZyBjb21tYW5kIGZvciBMVk1fQkFTU19CT09TVCIpOwogICAgIH0KLSAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpewotICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIHNldHRpbmcgY29tbWFuZCBmb3IgTFZNX1ZJUlRVQUxJWkVSIik7CisgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUikgeworICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBzZXR0aW5nIGNvbW1hbmQgZm9yIExWTV9WSVJUVUFMSVpFUiIpOwogICAgIH0KLSAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKXsKLSAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBzZXR0aW5nIGNvbW1hbmQgZm9yIExWTV9FUVVBTElaRVIiKTsKKyAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUikgeworICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBzZXR0aW5nIGNvbW1hbmQgZm9yIExWTV9FUVVBTElaRVIiKTsKICAgICB9Ci0gICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZPTFVNRSl7Ci0gICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgc2V0dGluZyBjb21tYW5kIGZvciBMVk1fVk9MVU1FIik7CisgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpIHsKKyAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgc2V0dGluZyBjb21tYW5kIGZvciBMVk1fVk9MVU1FIik7CiAgICAgfQogCi0gICAgaWYgKHBDb250ZXh0ID09IE5VTEwpeworICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdF9jb21tYW5kIEVSUk9SIHBDb250ZXh0ID09IE5VTEwiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBJTlBVVFMgYXJlOiBjb21tYW5kICVkIGNtZFNpemUgJWQiLGNtZENvZGUsIGNtZFNpemUpOworICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIElOUFVUUyBhcmU6IGNvbW1hbmQgJWQgY21kU2l6ZSAlZCIsY21kQ29kZSwgY21kU2l6ZSk7CiAKICAgICAvLyBJbmNhc2Ugd2UgZGlzYWJsZSBhbiBlZmZlY3QsIG5leHQgdGltZSBwcm9jZXNzIGlzCiAgICAgLy8gY2FsbGVkIHRoZSBudW1iZXIgb2YgZWZmZWN0IGNhbGxlZCBjb3VsZCBiZSBncmVhdGVyCiAgICAgLy8gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCA9IDA7CiAKLSAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIE51bWJlckVmZmVjdHNDYWxsZWQgPSAlZCwgTnVtYmVyRWZmZWN0c0VuYWJsZWQgPSAlZCIsCisgICAgLy8gQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgTnVtYmVyRWZmZWN0c0NhbGxlZCA9ICVkLCBOdW1iZXJFZmZlY3RzRW5hYmxlZCA9ICVkIiwKICAgICAvLyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwKICAgICAvLyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQpOwogCi0gICAgc3dpdGNoIChjbWRDb2RlKXsKKyAgICBzd2l0Y2ggKGNtZENvZGUpIHsKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0lOSVQ6Ci0gICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpeworICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SLCBFRkZFQ1RfQ01EX0lOSVQ6IEVSUk9SIGZvciBlZmZlY3QgdHlwZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+RWZmZWN0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPkVmZmVjdFR5cGUpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgKihpbnQgKikgcFJlcGx5RGF0YSA9IDA7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9JTklUIHN0YXJ0Iik7Ci0gICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCl7Ci0gICAgICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfSU5JVCBmb3IgTFZNX0JBU1NfQk9PU1QiKTsKKyAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9JTklUIHN0YXJ0Iik7CisgICAgICAgICAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpIHsKKyAgICAgICAgICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfSU5JVCBmb3IgTFZNX0JBU1NfQk9PU1QiKTsKICAgICAgICAgICAgICAgICBhbmRyb2lkOjpCYXNzU2V0U3RyZW5ndGgocENvbnRleHQsIDApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKXsKLSAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9JTklUIGZvciBMVk1fVklSVFVBTElaRVIiKTsKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpIHsKKyAgICAgICAgICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfSU5JVCBmb3IgTFZNX1ZJUlRVQUxJWkVSIik7CiAgICAgICAgICAgICAgICAgYW5kcm9pZDo6VmlydHVhbGl6ZXJTZXRTdHJlbmd0aChwQ29udGV4dCwgMCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKXsKLSAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9JTklUIGZvciBMVk1fRVFVQUxJWkVSIik7CisgICAgICAgICAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUikgeworICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9JTklUIGZvciBMVk1fRVFVQUxJWkVSIik7CiAgICAgICAgICAgICAgICAgYW5kcm9pZDo6RXF1YWxpemVyU2V0UHJlc2V0KHBDb250ZXh0LCAwKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpewotICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0lOSVQgZm9yIExWTV9WT0xVTUUiKTsKLSAgICAgICAgICAgICAgICAqKGludCAqKSBwUmVwbHlEYXRhID0gYW5kcm9pZDo6Vm9sdW1lU2V0Vm9sdW1lTGV2ZWwocENvbnRleHQsIDApOworICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpIHsKKyAgICAgICAgICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfSU5JVCBmb3IgTFZNX1ZPTFVNRSIpOworICAgICAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0gYW5kcm9pZDo6Vm9sdW1lU2V0Vm9sdW1lTGV2ZWwocENvbnRleHQsIDApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9DT05GSUc6Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfQ09ORklHIHN0YXJ0Iik7Ci0gICAgICAgICAgICBpZiAocENtZERhdGEgICAgPT0gTlVMTCB8fCBjbWRTaXplICAgICAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fAotICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhICA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgICE9IHNpemVvZihpbnQpKSB7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfU0VUX0NPTkZJRyBzdGFydCIpOworICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfQ09ORklHOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9DT05GSUc6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAqKGludCAqKSBwUmVwbHlEYXRhID0gYW5kcm9pZDo6RWZmZWN0X3NldENvbmZpZyhwQ29udGV4dCwgKGVmZmVjdF9jb25maWdfdCAqKSBwQ21kRGF0YSk7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfQ09ORklHIGVuZCIpOworICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpFZmZlY3Rfc2V0Q29uZmlnKHBDb250ZXh0LCAoZWZmZWN0X2NvbmZpZ190KilwQ21kRGF0YSk7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfU0VUX0NPTkZJRyBlbmQiKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9HRVRfQ09ORklHOgogICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9HRVRfQ09ORklHOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9DT05GSUc6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGFuZHJvaWQ6OkVmZmVjdF9nZXRDb25maWcocENvbnRleHQsIChlZmZlY3RfY29uZmlnX3QgKilwUmVwbHlEYXRhKTsKKyAgICAgICAgICAgIGFuZHJvaWQ6OkVmZmVjdF9nZXRDb25maWcocENvbnRleHQsIChlZmZlY3RfY29uZmlnX3QqKXBSZXBseURhdGEpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1JFU0VUOgotICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfUkVTRVQgc3RhcnQiKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9SRVNFVCBzdGFydCIpOwogICAgICAgICAgICAgYW5kcm9pZDo6RWZmZWN0X3NldENvbmZpZyhwQ29udGV4dCwgJnBDb250ZXh0LT5jb25maWcpOwotICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfUkVTRVQgZW5kIik7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfUkVTRVQgZW5kIik7CiAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIEVGRkVDVF9DTURfR0VUX1BBUkFNOnsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBzdGFydCIpOworICAgICAgICBjYXNlIEVGRkVDVF9DTURfR0VUX1BBUkFNOiB7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfR0VUX1BBUkFNIHN0YXJ0Iik7CiAKLSAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopcENtZERhdGE7CisgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCogcCA9IChlZmZlY3RfcGFyYW1fdCopcENtZERhdGE7CiAgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplIDwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSB8fAotICAgICAgICAgICAgICAgICAgICBjbWRTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgICAgICpyZXBseVNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKSkgeworICAgICAgICAgICAgICAgIGNtZFNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKSB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTTogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KQEAgLTM0MDEsNzUgKzMxNjcsNjIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHBhZGRlZFBhcmFtU2l6ZSA9IGNvbXB1dGVQYXJhbVZPZmZzZXQocCk7CiAgICAgICAgICAgICBpZiAoKEVGRkVDVF9QQVJBTV9TSVpFX01BWCAtIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgPCBwYWRkZWRQYXJhbVNpemUpIHx8Ci0gICAgICAgICAgICAgICAgKEVGRkVDVF9QQVJBTV9TSVpFX01BWCAtIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgLSBwYWRkZWRQYXJhbVNpemUgPAotICAgICAgICAgICAgICAgICAgICBwLT52c2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAoRUZGRUNUX1BBUkFNX1NJWkVfTUFYIC0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSAtIHBhZGRlZFBhcmFtU2l6ZSA8IHAtPnZzaXplKSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVGRkVDVF9DTURfR0VUX1BBUkFNOiBwYWRkZWRfcHNpemUgb3IgdnNpemUgdG9vIGJpZyIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdWludDMyX3QgZXhwZWN0ZWRSZXBseVNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcGFkZGVkUGFyYW1TaXplICsgcC0+dnNpemU7CiAgICAgICAgICAgICBpZiAoKnJlcGx5U2l6ZSA8IGV4cGVjdGVkUmVwbHlTaXplKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRUZGRUNUX0NNRF9HRVRfUEFSQU06IG1pbi4gcmVwbHlTaXplICV1LCBnb3QgJXUgYnl0ZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRSZXBseVNpemUsICpyZXBseVNpemUpOworICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkUmVwbHlTaXplLCAqcmVwbHlTaXplKTsKICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjMyNzA1NDM4Iik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCBwQ21kRGF0YSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKTsKIAotICAgICAgICAgICAgcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBSZXBseURhdGE7CisgICAgICAgICAgICBwID0gKGVmZmVjdF9wYXJhbV90KilwUmVwbHlEYXRhOwogCiAgICAgICAgICAgICB1aW50MzJfdCB2b2Zmc2V0ID0gcGFkZGVkUGFyYW1TaXplOwotICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpewotICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OkJhc3NCb29zdF9nZXRQYXJhbWV0ZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5wc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+dnNpemUsCisgICAgICAgICAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpIHsKKyAgICAgICAgICAgICAgICBwLT5zdGF0dXMgPSBhbmRyb2lkOjpCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LCBwLT5wc2l6ZSwgcC0+ZGF0YSwgJnAtPnZzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOwotICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0QmFzc0Jvb3N0X2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gIgorICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJcdEJhc3NCb29zdF9jb21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNICIKICAgICAgICAgICAgICAgICAvLyAgICAgICAgIipwQ21kRGF0YSAlZCwgKnJlcGx5U2l6ZSAlZCwgKnBSZXBseURhdGEgJWQgIiwKICAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKICAgICAgICAgICAgICAgICAvLyAgICAgICAgKnJlcGx5U2l6ZSwKICAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopKChjaGFyICopcFJlcGx5RGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0KSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUil7Ci0gICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6VmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5wc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+dnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpIHsKKyAgICAgICAgICAgICAgICBwLT5zdGF0dXMgPSBhbmRyb2lkOjpWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIocENvbnRleHQsIHAtPnBzaXplLCAodm9pZCopcC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnZzaXplLCBwLT5kYXRhICsgdm9mZnNldCk7CiAKLSAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdFZpcnR1YWxpemVyX2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gIgorICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJcdFZpcnR1YWxpemVyX2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gIgogICAgICAgICAgICAgICAgIC8vICAgICAgICAiKnBDbWREYXRhICVkLCAqcmVwbHlTaXplICVkLCAqcFJlcGx5RGF0YSAlZCAiLAogICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLAogICAgICAgICAgICAgICAgIC8vICAgICAgICAqcmVwbHlTaXplLAogICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKikoKGNoYXIgKilwUmVwbHlEYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHZvZmZzZXQpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpewotICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0RXF1YWxpemVyX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUikgeworICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVxdWFsaXplcl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgogICAgICAgICAgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9HRVRfUEFSQU0gc3RhcnQiKTsKLSAgICAgICAgICAgICAgICBwLT5zdGF0dXMgPSBhbmRyb2lkOjpFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+cHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnZzaXplLAorICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIocENvbnRleHQsIHAtPnBzaXplLCBwLT5kYXRhLCAmcC0+dnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CiAKLSAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdEVxdWFsaXplcl9jb21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNICpwQ21kRGF0YSAlZCwgKnJlcGx5U2l6ZSAlZCwgIgorICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVxdWFsaXplcl9jb21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNICpwQ21kRGF0YSAlZCwgKnJlcGx5U2l6ZSAlZCwgIgogICAgICAgICAgICAgICAgIC8vICAgICAgICIqcFJlcGx5RGF0YSAlMDh4ICUwOHgiLAogICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLCAqcmVwbHlTaXplLAogICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwUmVwbHlEYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHZvZmZzZXQpLAogICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwUmVwbHlEYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHZvZmZzZXQgKwogICAgICAgICAgICAgICAgIC8vICAgICAgICBzaXplb2YoaW50MzJfdCkpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpewotICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lX2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBzdGFydCIpOwotICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OlZvbHVtZV9nZXRQYXJhbWV0ZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5wc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKSB7CisgICAgICAgICAgICAgICAgLy8gQUxPR1YoIlx0Vm9sdW1lX2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBzdGFydCIpOworICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OlZvbHVtZV9nZXRQYXJhbWV0ZXIocENvbnRleHQsIHAtPnBzaXplLCAodm9pZCopcC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwgcC0+ZGF0YSArIHZvZmZzZXQpOwogCi0gICAgICAgICAgICAgICAgLy9BTE9HVigiXHRWb2x1bWVfY29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAiCisgICAgICAgICAgICAgICAgLy8gQUxPR1YoIlx0Vm9sdW1lX2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gIgogICAgICAgICAgICAgICAgIC8vICAgICAgICAiKnBDbWREYXRhICVkLCAqcmVwbHlTaXplICVkLCAqcFJlcGx5RGF0YSAlZCAiLAogICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLAogICAgICAgICAgICAgICAgIC8vICAgICAgICAqcmVwbHlTaXplLApAQCAtMzQ3NywxMjMgKzMyMzAsMTE0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqcmVwbHlTaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHZvZmZzZXQgKyBwLT52c2l6ZTsKIAotICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfR0VUX1BBUkFNIGVuZCIpOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBlbmQiKTsKICAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9QQVJBTTp7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfUEFSQU0gc3RhcnQiKTsKLSAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKXsKLSAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdEJhc3NCb29zdF9jb21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIHBhcmFtICVkLCAqcmVwbHlTaXplICVkLCB2YWx1ZSAlZCIsCisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfUEFSQU06IHsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfUEFSQU0gc3RhcnQiKTsKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgeworICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJcdEJhc3NCb29zdF9jb21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIHBhcmFtICVkLCAqcmVwbHlTaXplICVkLCB2YWx1ZQorICAgICAgICAgICAgICAgIC8vICVkIiwKICAgICAgICAgICAgICAgICAvLyAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLAogICAgICAgICAgICAgICAgIC8vICAgICAgICpyZXBseVNpemUsCiAgICAgICAgICAgICAgICAgLy8gICAgICAgKihpbnQxNl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSk7CiAKLSAgICAgICAgICAgICAgICBpZiAocENtZERhdGEgICA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbWRTaXplICAgICE9IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpICtzaXplb2YoaW50MTZfdCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICBjbWRTaXplICE9IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpICsgc2l6ZW9mKGludDE2X3QpKSB8fAorICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogQmFzc0Jvb3N0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICogY29uc3QgcCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwQ21kRGF0YTsKKyAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCogY29uc3QgcCA9IChlZmZlY3RfcGFyYW1fdCopcENtZERhdGE7CiAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgdm9mZnNldCA9IGNvbXB1dGVQYXJhbVZPZmZzZXQocCk7CiAKLSAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdG5CYXNzQm9vc3RfY29tbWFuZCBjbWRTaXplIGlzICVkXG4iCisgICAgICAgICAgICAgICAgLy8gQUxPR1YoIlx0bkJhc3NCb29zdF9jb21tYW5kIGNtZFNpemUgaXMgJWRcbiIKICAgICAgICAgICAgICAgICAvLyAgICAgICAgIlx0c2l6ZW9mKGVmZmVjdF9wYXJhbV90KSBpcyAgJWRcbiIKICAgICAgICAgICAgICAgICAvLyAgICAgICAgIlx0cC0+cHNpemUgaXMgJWRcbiIKICAgICAgICAgICAgICAgICAvLyAgICAgICAgIlx0cC0+dnNpemUgaXMgJWQiCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICJcbiIsCiAgICAgICAgICAgICAgICAgLy8gICAgICAgIGNtZFNpemUsIHNpemVvZihlZmZlY3RfcGFyYW1fdCksIHAtPnBzaXplLCBwLT52c2l6ZSApOwogCi0gICAgICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gYW5kcm9pZDo6QmFzc0Jvb3N0X3NldFBhcmFtZXRlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+dnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CisgICAgICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQsIHAtPnBzaXplLCAodm9pZCopcC0+ZGF0YSwgcC0+dnNpemUsIHAtPmRhdGEgKyB2b2Zmc2V0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUil7Ci0gICAgICAgICAgICAgIC8vIFdhcm5pbmcgdGhpcyBsb2cgd2lsbCBmYWlsIHRvIHByb3Blcmx5IHJlYWQgYW4gaW50MzJfdCB2YWx1ZSwgYXNzdW1lcyBpbnQxNl90Ci0gICAgICAgICAgICAgIC8vQUxPR1YoIlx0VmlydHVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBwYXJhbSAlZCwgKnJlcGx5U2l6ZSAlZCwgdmFsdWUgJWQiLAotICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKLSAgICAgICAgICAgICAgLy8gICAgICAgICpyZXBseVNpemUsCi0gICAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpKTsKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpIHsKKyAgICAgICAgICAgICAgICAvLyBXYXJuaW5nIHRoaXMgbG9nIHdpbGwgZmFpbCB0byBwcm9wZXJseSByZWFkIGFuIGludDMyX3QgdmFsdWUsIGFzc3VtZXMgaW50MTZfdAorICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJcdFZpcnR1YWxpemVyX2NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU0gcGFyYW0gJWQsICpyZXBseVNpemUgJWQsIHZhbHVlCisgICAgICAgICAgICAgICAgLy8gJWQiLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKworICAgICAgICAgICAgICAgIC8vICAgICAgICBzaXplb2YoaW50MzJfdCkpKTsKIAotICAgICAgICAgICAgICAgIGlmIChwQ21kRGF0YSAgID09IE5VTEwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FsIHBhcmFtZXRlcnMgYXJlIGludDE2X3Qgb3IgaW50MzJfdAotICAgICAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSAgICA+IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpICtzaXplb2YoaW50MzJfdCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbWRTaXplICAgIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkgK3NpemVvZihpbnQxNl90KSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FsIHBhcmFtZXRlcnMgYXJlIGludDE2X3Qgb3IgaW50MzJfdAorICAgICAgICAgICAgICAgICAgICBjbWRTaXplID4gKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgICAgICAgICAgICAgIGNtZFNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSArIHNpemVvZihpbnQxNl90KSkgfHwKKyAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICogY29uc3QgcCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwQ21kRGF0YTsKKyAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCogY29uc3QgcCA9IChlZmZlY3RfcGFyYW1fdCopcENtZERhdGE7CiAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgdm9mZnNldCA9IGNvbXB1dGVQYXJhbVZPZmZzZXQocCk7CiAKLSAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdG5WaXJ0dWFsaXplcl9jb21tYW5kIGNtZFNpemUgaXMgJWRcbiIKKyAgICAgICAgICAgICAgICAvLyBBTE9HVigiXHRuVmlydHVhbGl6ZXJfY29tbWFuZCBjbWRTaXplIGlzICVkXG4iCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICJcdHNpemVvZihlZmZlY3RfcGFyYW1fdCkgaXMgICVkXG4iCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICJcdHAtPnBzaXplIGlzICVkXG4iCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICJcdHAtPnZzaXplIGlzICVkIgogICAgICAgICAgICAgICAgIC8vICAgICAgICAiXG4iLAogICAgICAgICAgICAgICAgIC8vICAgICAgICBjbWRTaXplLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpLCBwLT5wc2l6ZSwgcC0+dnNpemUgKTsKIAotICAgICAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OlZpcnR1YWxpemVyX3NldFBhcmFtZXRlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+cHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+dnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OlZpcnR1YWxpemVyX3NldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LCBwLT5wc2l6ZSwgKHZvaWQqKXAtPmRhdGEsIHAtPnZzaXplLCBwLT5kYXRhICsgdm9mZnNldCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKXsKLSAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0RXF1YWxpemVyX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNIHN0YXJ0Iik7Ci0gICAgICAgICAgICAgICAvL0FMT0dWKCJcdEVxdWFsaXplcl9jb21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIHBhcmFtICVkLCAqcmVwbHlTaXplICVkLCB2YWx1ZSAlZCAiLAotICAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSksCi0gICAgICAgICAgICAgICAvLyAgICAgICAgKnJlcGx5U2l6ZSwKLSAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpKTsKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSB7CisgICAgICAgICAgICAgICAgLy8gQUxPR1YoIlx0RXF1YWxpemVyX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgLy8gICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTSBzdGFydCIpOworICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVxdWFsaXplcl9jb21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIHBhcmFtICVkLCAqcmVwbHlTaXplICVkLCB2YWx1ZSAlZAorICAgICAgICAgICAgICAgIC8vICIsCisgICAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSksCisgICAgICAgICAgICAgICAgLy8gICAgICAgICpyZXBseVNpemUsCisgICAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArCisgICAgICAgICAgICAgICAgLy8gICAgICAgIHNpemVvZihpbnQzMl90KSkpOwogCiAgICAgICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBFcXVhbGl6ZXJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKiBjb25zdCBwID0gKGVmZmVjdF9wYXJhbV90ICopIHBDbWREYXRhOworICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90KiBjb25zdCBwID0gKGVmZmVjdF9wYXJhbV90KilwQ21kRGF0YTsKICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCB2b2Zmc2V0ID0gY29tcHV0ZVBhcmFtVk9mZnNldChwKTsKIAotICAgICAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OkVxdWFsaXplcl9zZXRQYXJhbWV0ZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5wc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOworICAgICAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0gYW5kcm9pZDo6RXF1YWxpemVyX3NldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LCBwLT5wc2l6ZSwgKHZvaWQqKXAtPmRhdGEsIHAtPnZzaXplLCBwLT5kYXRhICsgdm9mZnNldCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKXsKLSAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdFZvbHVtZV9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfUEFSQU0gc3RhcnQiKTsKLSAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdFZvbHVtZV9jb21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIHBhcmFtICVkLCAqcmVwbHlTaXplICVkLCB2YWx1ZSAlZCAiLAorICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpIHsKKyAgICAgICAgICAgICAgICAvLyBBTE9HVigiXHRWb2x1bWVfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfU0VUX1BBUkFNIHN0YXJ0Iik7CisgICAgICAgICAgICAgICAgLy8gQUxPR1YoIlx0Vm9sdW1lX2NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU0gcGFyYW0gJWQsICpyZXBseVNpemUgJWQsIHZhbHVlICVkICIsCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSksCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICpyZXBseVNpemUsCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArc2l6ZW9mKGludDMyX3QpKSk7CiAKLSAgICAgICAgICAgICAgICBpZiAocENtZERhdGEgICA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbWRTaXplICAgIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSB8fAorICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogVm9sdW1lX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICogY29uc3QgcCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwQ21kRGF0YTsKKyAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCogY29uc3QgcCA9IChlZmZlY3RfcGFyYW1fdCopcENtZERhdGE7CiAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgdm9mZnNldCA9IGNvbXB1dGVQYXJhbVZPZmZzZXQocCk7CiAKLSAgICAgICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpWb2x1bWVfc2V0UGFyYW1ldGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+cHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT52c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OlZvbHVtZV9zZXRQYXJhbWV0ZXIocENvbnRleHQsIHAtPnBzaXplLCAodm9pZCopcC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+dnNpemUsIHAtPmRhdGEgKyB2b2Zmc2V0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBlbmQiKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfUEFSQU0gZW5kIik7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0VOQUJMRToKQEAgLTM2MDMsNTcgKzMzNDcsNTYgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gYW5kcm9pZDo6RWZmZWN0X3NldEVuYWJsZWQocENvbnRleHQsIExWTV9UUlVFKTsKKyAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0gYW5kcm9pZDo6RWZmZWN0X3NldEVuYWJsZWQocENvbnRleHQsIExWTV9UUlVFKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9ESVNBQkxFOgotICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfRElTQUJMRSBzdGFydCIpOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0RJU0FCTEUgc3RhcnQiKTsKICAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9ESVNBQkxFOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gYW5kcm9pZDo6RWZmZWN0X3NldEVuYWJsZWQocENvbnRleHQsIExWTV9GQUxTRSk7CisgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OkVmZmVjdF9zZXRFbmFibGVkKHBDb250ZXh0LCBMVk1fRkFMU0UpOwogICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0U6Ci0gICAgICAgIHsKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0U6IHsKICAgICAgICAgICAgIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfREVWSUNFIHN0YXJ0Iik7Ci0gICAgICAgICAgICBpZiAocENtZERhdGEgICA9PSBOVUxMKXsKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0U6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQzMl90IGRldmljZSA9ICoodWludDMyX3QgKilwQ21kRGF0YTsKLSAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5PdXRwdXREZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KSBkZXZpY2U7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gKihhdWRpb19kZXZpY2VzX3QgKilwQ21kRGF0YTsKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5PdXRwdXREZXZpY2UgPSBkZXZpY2U7CiAKICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgewotICAgICAgICAgICAgICAgIGlmKChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIpKXsKKyAgICAgICAgICAgICAgICBpZiAoKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpIHx8CisgICAgICAgICAgICAgICAgICAgIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkZXZpY2UgaXMgaW52YWxpZCBmb3IgTFZNX0JBU1NfQk9PU1QgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCopcENtZERhdGEpOwogICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgdGVtcG9yYXJ5IGRpc2FibGUgTFZNX0JBU19CT09TVCIpOwogCi0gICAgICAgICAgICAgICAgICAgIC8vIElmIGEgZGV2aWNlIGRvZXNudCBzdXBwb3J0IGJhc3Nib29zdCB0aGUgZWZmZWN0IG11c3QgYmUgdGVtcG9yYXJpbHkgZGlzYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IGJhc3Nib29zdCB0aGUgZWZmZWN0IG11c3QgYmUgdGVtcG9yYXJpbHkgZGlzYWJsZWQKICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGVmZmVjdCBtdXN0IHN0aWxsIHJlcG9ydCBpdHMgb3JpZ2luYWwgc3RhdGUgYXMgdGhpcyBjYW4gb25seSBiZSBjaGFuZ2VkCiAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBFTkFCTEUvRElTQUJMRSBjb21tYW5kCiAKICAgICAgICAgICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzRW5hYmxlZCA9PSBMVk1fVFJVRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIGRpc2FibGUgTFZNX0JBU1NfQk9PU1QgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QqKXBDbWREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Okx2bUVmZmVjdF9kaXNhYmxlKHBDb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc1RlbXBEaXNhYmxlZCA9IExWTV9UUlVFOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkZXZpY2UgaXMgdmFsaWQgZm9yIExWTV9CQVNTX0JPT1NUICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCopcENtZERhdGEpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgZGV2aWNlIHN1cHBvcnRzIGJhc3Nib29zdCBhbmQgdGhlIGVmZmVjdCBoYXMgYmVlbiB0ZW1wb3JhcmlseSBkaXNhYmxlZAogICAgICAgICAgICAgICAgICAgICAvLyBwcmV2aW91c2x5IHRoZW4gcmUtZW5hYmxlIGl0CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzRW5hYmxlZCA9PSBMVk1fVFJVRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIHJlLWVuYWJsZSBMVk1fQkFTU19CT09TVCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCopcENtZERhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6THZtRWZmZWN0X2VuYWJsZShwQ29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7CkBAIC0zNjY0LDEyOSArMzQwNywxMjggQEAKICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBjYXNlIHVubGVzcyBjb25maWd1cmF0aW9uIGlzIGZvcmNlZAogICAgICAgICAgICAgICAgICAgICBpZiAoYW5kcm9pZDo6VmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZChkZXZpY2UpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkZXZpY2UgaXMgaW52YWxpZCBmb3IgTFZNX1ZJUlRVQUxJWkVSICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90KilwQ21kRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgdGVtcG9yYXJ5IGRpc2FibGUgTFZNX1ZJUlRVQUxJWkVSIik7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgYSBkZXZpY2UgZG9lc250IHN1cHBvcnQgdmlydHVhbGl6ZXIgdGhlIGVmZmVjdCBtdXN0IGJlIHRlbXBvcmFyaWx5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgdmlydHVhbGl6ZXIgdGhlIGVmZmVjdCBtdXN0IGJlIHRlbXBvcmFyaWx5CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZCB0aGUgZWZmZWN0IG11c3Qgc3RpbGwgcmVwb3J0IGl0cyBvcmlnaW5hbCBzdGF0ZSBhcyB0aGlzIGNhbgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBiZSBjaGFuZ2VkIGJ5IHRoZSBFTkFCTEUvRElTQUJMRSBjb21tYW5kCiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIGRpc2FibGUgTFZNX1ZJUlRVQUxJWkVSICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QqKXBDbWREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZGlzYWJsZShwQ29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fVFJVRTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkZXZpY2UgaXMgdmFsaWQgZm9yIExWTV9WSVJUVUFMSVpFUiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCopcENtZERhdGEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIGRldmljZSBzdXBwb3J0cyB2aXJ0dWFsaXplciBhbmQgdGhlIGVmZmVjdCBoYXMgYmVlbiB0ZW1wb3JhcmlseQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZWQgcHJldmlvdXNseSB0aGVuIHJlLWVuYWJsZSBpdAogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIHJlLWVuYWJsZSBMVk1fVklSVFVBTElaRVIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCopcENtZERhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Okx2bUVmZmVjdF9lbmFibGUocENvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSAvLyBlbHNlIHZpcnR1YWxpemF0aW9uIG1vZGUgaXMgZm9yY2VkIHRvIGEgY2VydGFpbiBkZXZpY2UsIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgICAgICAgICB9ICAvLyBlbHNlIHZpcnR1YWxpemF0aW9uIG1vZGUgaXMgZm9yY2VkIHRvIGEgY2VydGFpbiBkZXZpY2UsIG5vdGhpbmcgdG8gZG8KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfREVWSUNFIGVuZCIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6Ci0gICAgICAgIHsKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6IHsKICAgICAgICAgICAgIHVpbnQzMl90IGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lOwotICAgICAgICAgICAgaW50MTZfdCAgbGVmdGRCLCByaWdodGRCOwotICAgICAgICAgICAgaW50MTZfdCAgbWF4ZEIsIHBhbmRCOwotICAgICAgICAgICAgaW50MzJfdCAgdm9sX3JldFsyXSA9IHsxPDwyNCwxPDwyNH07IC8vIEFwcGx5IG5vIHZvbHVtZQotICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVk1fU1VDQ0VTUzsgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgICAgICAgICBpbnQxNl90IGxlZnRkQiwgcmlnaHRkQjsKKyAgICAgICAgICAgIGludDE2X3QgbWF4ZEIsIHBhbmRCOworICAgICAgICAgICAgaW50MzJfdCB2b2xfcmV0WzJdID0gezEgPDwgMjQsIDEgPDwgMjR9OyAgICAgLy8gQXBwbHkgbm8gdm9sdW1lCisgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgICAgICAgICAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KIAogICAgICAgICAgICAgLy8gaWYgcFJlcGx5RGF0YSBpcyBOVUxMLCBWT0xfQ1RSTCBpcyBkZWxlZ2F0ZWQgdG8gYW5vdGhlciBlZmZlY3QKLSAgICAgICAgICAgIGlmKHBSZXBseURhdGEgPT0gTFZNX05VTEwpeworICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTFZNX05VTEwpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSAyICogc2l6ZW9mKHVpbnQzMl90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwKLSAgICAgICAgICAgICAgICAgICAgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSA8IDIqc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICAgICAgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSA8IDIgKiBzaXplb2YoaW50MzJfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1ZPTFVNRTogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbGVmdFZvbHVtZSAgPSAoKCoodWludDMyX3QgKilwQ21kRGF0YSkpOwotICAgICAgICAgICAgcmlnaHRWb2x1bWUgPSAoKCooKHVpbnQzMl90ICopcENtZERhdGEgKyAxKSkpOworICAgICAgICAgICAgbGVmdFZvbHVtZSA9ICgoKih1aW50MzJfdCopcENtZERhdGEpKTsKKyAgICAgICAgICAgIHJpZ2h0Vm9sdW1lID0gKCgqKCh1aW50MzJfdCopcENtZERhdGEgKyAxKSkpOwogCi0gICAgICAgICAgICBpZihsZWZ0Vm9sdW1lID09IDB4MTAwMDAwMCl7CisgICAgICAgICAgICBpZiAobGVmdFZvbHVtZSA9PSAweDEwMDAwMDApIHsKICAgICAgICAgICAgICAgICBsZWZ0Vm9sdW1lIC09IDE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihyaWdodFZvbHVtZSA9PSAweDEwMDAwMDApeworICAgICAgICAgICAgaWYgKHJpZ2h0Vm9sdW1lID09IDB4MTAwMDAwMCkgewogICAgICAgICAgICAgICAgIHJpZ2h0Vm9sdW1lIC09IDE7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIENvbnZlcnQgdm9sdW1lIHRvIGRCCi0gICAgICAgICAgICBsZWZ0ZEIgID0gYW5kcm9pZDo6TFZDX0NvbnZlcnRfVm9sVG9EYihsZWZ0Vm9sdW1lKTsKKyAgICAgICAgICAgIGxlZnRkQiA9IGFuZHJvaWQ6OkxWQ19Db252ZXJ0X1ZvbFRvRGIobGVmdFZvbHVtZSk7CiAgICAgICAgICAgICByaWdodGRCID0gYW5kcm9pZDo6TFZDX0NvbnZlcnRfVm9sVG9EYihyaWdodFZvbHVtZSk7CiAKICAgICAgICAgICAgIHBhbmRCID0gcmlnaHRkQiAtIGxlZnRkQjsKIAogICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIG1heCB2b2x1bWUgaW4gZEIKICAgICAgICAgICAgIG1heGRCID0gbGVmdGRCOwotICAgICAgICAgICAgaWYocmlnaHRkQiA+IG1heGRCKXsKKyAgICAgICAgICAgIGlmIChyaWdodGRCID4gbWF4ZEIpIHsKICAgICAgICAgICAgICAgICBtYXhkQiA9IHJpZ2h0ZEI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdEVGRkVDVF9DTURfU0VUX1ZPTFVNRSBTZXNzaW9uOiAlZCwgU2Vzc2lvbklEOiAlZCBWT0xVTUUgaXMgJWQgZEIsICIKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX1ZPTFVNRSBTZXNzaW9uOiAlZCwgU2Vzc2lvbklEOiAlZCBWT0xVTUUgaXMgJWQgZEIsICIKICAgICAgICAgICAgIC8vICAgICAgImVmZmVjdCBpcyAlZCIsCi0gICAgICAgICAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25ObywgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbklkLAorICAgICAgICAgICAgLy8gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uSWQsCiAgICAgICAgICAgICAvLyhpbnQzMl90KW1heGRCLCBwQ29udGV4dC0+RWZmZWN0VHlwZSk7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdEVGRkVDVF9DTURfU0VUX1ZPTFVNRTogTGVmdCBpcyAlZCwgUmlnaHQgaXMgJWQiLCBsZWZ0Vm9sdW1lLCByaWdodFZvbHVtZSk7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdEVGRkVDVF9DTURfU0VUX1ZPTFVNRTogTGVmdCAlZGRCLCBSaWdodCAlZGRCLCBQb3NpdGlvbiAlZGRCIiwKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX1ZPTFVNRTogTGVmdCBpcyAlZCwgUmlnaHQgaXMgJWQiLCBsZWZ0Vm9sdW1lLCByaWdodFZvbHVtZSk7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6IExlZnQgJWRkQiwgUmlnaHQgJWRkQiwgUG9zaXRpb24gJWRkQiIsCiAgICAgICAgICAgICAvLyAgICAgICAgbGVmdGRCLCByaWdodGRCLCBwYW5kQik7CiAKLSAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCB2b2xfcmV0LCBzaXplb2YoaW50MzJfdCkqMik7Ci0gICAgICAgICAgICBhbmRyb2lkOjpWb2x1bWVTZXRWb2x1bWVMZXZlbChwQ29udGV4dCwgKGludDE2X3QpKG1heGRCKjEwMCkpOworICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsIHZvbF9yZXQsIHNpemVvZihpbnQzMl90KSAqIDIpOworICAgICAgICAgICAgYW5kcm9pZDo6Vm9sdW1lU2V0Vm9sdW1lTGV2ZWwocENvbnRleHQsIChpbnQxNl90KShtYXhkQiAqIDEwMCkpOwogCiAgICAgICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KLSAgICAgICAgICAgIEx2bVN0YXR1cyA9TFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwmQWN0aXZlUGFyYW1zKTsKKyAgICAgICAgICAgIEx2bVN0YXR1cyA9CisgICAgICAgICAgICAgICAgICAgIExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgICAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiIpCi0gICAgICAgICAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKICAgICAgICAgICAgIC8qIFZvbHVtZSBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSAgPSBwYW5kQjsKLSAgICAgICAgICAgIEFMT0dWKCJcdFx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24oKSAoLTk2ZEIgLT4gKzk2ZEIpLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlICk7CisgICAgICAgICAgICBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSA9IHBhbmRCOworICAgICAgICAgICAgQUxPR1YoIlx0XHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbigpICgtOTZkQiAtPiArOTZkQiktPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UpOwogCiAgICAgICAgICAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLwotICAgICAgICAgICAgTHZtU3RhdHVzID1MVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCZBY3RpdmVQYXJhbXMpOworICAgICAgICAgICAgTHZtU3RhdHVzID0KKyAgICAgICAgICAgICAgICAgICAgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgICAgICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIikKLSAgICAgICAgICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfQVVESU9fTU9ERToKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBlbmQuLi5cblxuIik7CisgICAgLy8gQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgZW5kLi4uXG5cbiIpOwogICAgIHJldHVybiAwOwotfSAgICAvKiBlbmQgRWZmZWN0X2NvbW1hbmQgKi8KK30gLyogZW5kIEVmZmVjdF9jb21tYW5kICovCiAKIC8qIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbjogZ2V0X2Rlc2NyaXB0b3IgKi8KLWludCBFZmZlY3RfZ2V0RGVzY3JpcHRvcihlZmZlY3RfaGFuZGxlX3QgICBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpCi17Ci0gICAgRWZmZWN0Q29udGV4dCAqIHBDb250ZXh0ID0gKEVmZmVjdENvbnRleHQgKikgc2VsZjsKLSAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjOworaW50IEVmZmVjdF9nZXREZXNjcmlwdG9yKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBwRGVzY3JpcHRvcikgeworICAgIEVmZmVjdENvbnRleHQqIHBDb250ZXh0ID0gKEVmZmVjdENvbnRleHQqKXNlbGY7CisgICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCogZGVzYzsKIAogICAgIGlmIChwQ29udGV4dCA9PSBOVUxMIHx8IHBEZXNjcmlwdG9yID09IE5VTEwpIHsKICAgICAgICAgQUxPR1YoIkVmZmVjdF9nZXREZXNjcmlwdG9yKCkgaW52YWxpZCBwYXJhbSIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICBzd2l0Y2gocENvbnRleHQtPkVmZmVjdFR5cGUpIHsKKyAgICBzd2l0Y2ggKHBDb250ZXh0LT5FZmZlY3RUeXBlKSB7CiAgICAgICAgIGNhc2UgTFZNX0JBU1NfQk9PU1Q6CiAgICAgICAgICAgICBkZXNjID0gJmFuZHJvaWQ6OmdCYXNzQm9vc3REZXNjcmlwdG9yOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0zODA2LDI2ICszNTQ4LDI0IEBACiAgICAgKnBEZXNjcmlwdG9yID0gKmRlc2M7CiAKICAgICByZXR1cm4gMDsKLX0gICAvKiBlbmQgRWZmZWN0X2dldERlc2NyaXB0b3IgKi8KK30gLyogZW5kIEVmZmVjdF9nZXREZXNjcmlwdG9yICovCiAKIC8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIGVmZmVjdAogY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnTHZtRWZmZWN0SW50ZXJmYWNlID0gewotICAgIEVmZmVjdF9wcm9jZXNzLAotICAgIEVmZmVjdF9jb21tYW5kLAotICAgIEVmZmVjdF9nZXREZXNjcmlwdG9yLAotICAgIE5VTEwsCi19OyAgICAvKiBlbmQgZ0x2bUVmZmVjdEludGVyZmFjZSAqLworICAgICAgICBFZmZlY3RfcHJvY2VzcywKKyAgICAgICAgRWZmZWN0X2NvbW1hbmQsCisgICAgICAgIEVmZmVjdF9nZXREZXNjcmlwdG9yLAorICAgICAgICBOVUxMLAorfTsgLyogZW5kIGdMdm1FZmZlY3RJbnRlcmZhY2UgKi8KIAogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAotX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTSA9IHsKLSAgICAudGFnID0gQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHLAotICAgIC52ZXJzaW9uID0gRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04sCi0gICAgLm5hbWUgPSAiRWZmZWN0IEJ1bmRsZSBMaWJyYXJ5IiwKLSAgICAuaW1wbGVtZW50b3IgPSAiTlhQIFNvZnR3YXJlIEx0ZC4iLAotICAgIC5jcmVhdGVfZWZmZWN0ID0gYW5kcm9pZDo6RWZmZWN0Q3JlYXRlLAotICAgIC5yZWxlYXNlX2VmZmVjdCA9IGFuZHJvaWQ6OkVmZmVjdFJlbGVhc2UsCi0gICAgLmdldF9kZXNjcmlwdG9yID0gYW5kcm9pZDo6RWZmZWN0R2V0RGVzY3JpcHRvciwKK19fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0gPSB7CisgICAgICAgIC50YWcgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcsCisgICAgICAgIC52ZXJzaW9uID0gRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04sCisgICAgICAgIC5uYW1lID0gIkVmZmVjdCBCdW5kbGUgTGlicmFyeSIsCisgICAgICAgIC5pbXBsZW1lbnRvciA9ICJOWFAgU29mdHdhcmUgTHRkLiIsCisgICAgICAgIC5jcmVhdGVfZWZmZWN0ID0gYW5kcm9pZDo6RWZmZWN0Q3JlYXRlLAorICAgICAgICAucmVsZWFzZV9lZmZlY3QgPSBhbmRyb2lkOjpFZmZlY3RSZWxlYXNlLAorICAgICAgICAuZ2V0X2Rlc2NyaXB0b3IgPSBhbmRyb2lkOjpFZmZlY3RHZXREZXNjcmlwdG9yLAogfTsKLQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaAppbmRleCA1MjRlMTAzLi5mM2U3ODg0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaApAQCAtMjMsMTc2ICsyMywxNDggQEAKICNpbmNsdWRlIDxMVk0uaD4KICNpbmNsdWRlIDxsaW1pdHMuaD4KIAotI2RlZmluZSBGSVZFQkFORF9OVU1CQU5EUyAgICAgICAgICA1Ci0jZGVmaW5lIE1BWF9OVU1fQkFORFMgICAgICAgICAgICAgIDUKLSNkZWZpbmUgTUFYX0NBTExfU0laRSAgICAgICAgICAgICAgMjU2Ci0jZGVmaW5lIExWTV9NQVhfU0VTU0lPTlMgICAgICAgICAgIDMyCi0jZGVmaW5lIExWTV9VTlVTRURfU0VTU0lPTiAgICAgICAgIElOVF9NQVgKLSNkZWZpbmUgQkFTU19CT09TVF9DVVBfTE9BRF9BUk05RSAgMTUwICAgIC8vIEV4cHJlc3NlZCBpbiAwLjEgTUlQUwotI2RlZmluZSBWSVJUVUFMSVpFUl9DVVBfTE9BRF9BUk05RSAxMjAgICAgLy8gRXhwcmVzc2VkIGluIDAuMSBNSVBTCi0jZGVmaW5lIEVRVUFMSVpFUl9DVVBfTE9BRF9BUk05RSAgIDIyMCAgICAvLyBFeHByZXNzZWQgaW4gMC4xIE1JUFMKLSNkZWZpbmUgVk9MVU1FX0NVUF9MT0FEX0FSTTlFICAgICAgMCAgICAgIC8vIEV4cHJlc3NlZCBpbiAwLjEgTUlQUwotI2RlZmluZSBCVU5ETEVfTUVNX1VTQUdFICAgICAgICAgICAyNSAgICAgLy8gRXhwcmVzc2VkIGluIGtCCisjZGVmaW5lIEZJVkVCQU5EX05VTUJBTkRTIDUKKyNkZWZpbmUgTUFYX05VTV9CQU5EUyA1CisjZGVmaW5lIE1BWF9DQUxMX1NJWkUgMjU2CisjZGVmaW5lIExWTV9NQVhfU0VTU0lPTlMgMzIKKyNkZWZpbmUgTFZNX1VOVVNFRF9TRVNTSU9OIElOVF9NQVgKKyNkZWZpbmUgQkFTU19CT09TVF9DVVBfTE9BRF9BUk05RSAxNTAgICAvLyBFeHByZXNzZWQgaW4gMC4xIE1JUFMKKyNkZWZpbmUgVklSVFVBTElaRVJfQ1VQX0xPQURfQVJNOUUgMTIwICAvLyBFeHByZXNzZWQgaW4gMC4xIE1JUFMKKyNkZWZpbmUgRVFVQUxJWkVSX0NVUF9MT0FEX0FSTTlFIDIyMCAgICAvLyBFeHByZXNzZWQgaW4gMC4xIE1JUFMKKyNkZWZpbmUgVk9MVU1FX0NVUF9MT0FEX0FSTTlFIDAgICAgICAgICAvLyBFeHByZXNzZWQgaW4gMC4xIE1JUFMKKyNkZWZpbmUgQlVORExFX01FTV9VU0FHRSAyNSAgICAgICAgICAgICAvLyBFeHByZXNzZWQgaW4ga0IKIAogI2lmbmRlZiBPUEVOU0xfRVNfSF8KLXN0YXRpYyBjb25zdCBlZmZlY3RfdXVpZF90IFNMX0lJRF9WT0xVTUVfID0geyAweDA5ZThlZGUwLCAweGRkZGUsIDB4MTFkYiwgMHhiNGY2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9OwotY29uc3QgZWZmZWN0X3V1aWRfdCAqIGNvbnN0IFNMX0lJRF9WT0xVTUUgPSAmU0xfSUlEX1ZPTFVNRV87Ci0jZW5kaWYgLy9PUEVOU0xfRVNfSF8KK3N0YXRpYyBjb25zdCBlZmZlY3RfdXVpZF90IFNMX0lJRF9WT0xVTUVfID0geworICAgICAgICAweDA5ZThlZGUwLCAweGRkZGUsIDB4MTFkYiwgMHhiNGY2LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19OworY29uc3QgZWZmZWN0X3V1aWRfdCogY29uc3QgU0xfSUlEX1ZPTFVNRSA9ICZTTF9JSURfVk9MVU1FXzsKKyNlbmRpZiAgLy8gT1BFTlNMX0VTX0hfCiAKLXR5cGVkZWYgZW51bQotewotICAgIExWTV9CQVNTX0JPT1NULAotICAgIExWTV9WSVJUVUFMSVpFUiwKLSAgICBMVk1fRVFVQUxJWkVSLAotICAgIExWTV9WT0xVTUUKLX0gbHZtX2VmZmVjdF9lbjsKK3R5cGVkZWYgZW51bSB7IExWTV9CQVNTX0JPT1NULCBMVk1fVklSVFVBTElaRVIsIExWTV9FUVVBTElaRVIsIExWTV9WT0xVTUUgfSBsdm1fZWZmZWN0X2VuOwogCiAvLyBQcmVzZXQgY29uZmlndXJhdGlvbi4KIHN0cnVjdCBQcmVzZXRDb25maWcgewogICAgIC8vIEh1bWFuLXJlYWRhYmxlIG5hbWUuCi0gICAgY29uc3QgY2hhciAqIG5hbWU7CisgICAgY29uc3QgY2hhciogbmFtZTsKICAgICAvLyBBbiBhcnJheSBvZiBzaXplIG5CYW5kcyB3aGVyZSBlYWNoIGVsZW1lbnQgaXMgYSBjb25maWd1cmF0aW9uIGZvciB0aGUKICAgICAvLyBjb3JyZXNwb25kaW5nIGJhbmQuCi0gICAgLy9jb25zdCBCYW5kQ29uZmlnICogYmFuZENvbmZpZ3M7CisgICAgLy8gY29uc3QgQmFuZENvbmZpZyAqIGJhbmRDb25maWdzOwogfTsKIAogLyogQnVuZGxlZEVmZmVjdENvbnRleHQgOiBPbmUgcGVyIHNlc3Npb24gKi8KLXN0cnVjdCBCdW5kbGVkRWZmZWN0Q29udGV4dHsKLSAgICBMVk1fSGFuZGxlX3QgICAgICAgICAgICAgICAgICAgIGhJbnN0YW5jZTsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uTm87ICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgc2Vzc2lvbiBudW1iZXIgKi8KLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25JZDsgICAgICAgICAgICAgICAgLyogQ3VycmVudCBzZXNzaW9uIGlkICovCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVm9sdW1lRW5hYmxlZDsgICAgICAgICAgIC8qIEZsYWcgZm9yIFZvbHVtZSAqLwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkVxdWFsaXplckVuYWJsZWQ7ICAgICAgICAvKiBGbGFnIGZvciBFUSAqLwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkJhc3NFbmFibGVkOyAgICAgICAgICAgICAvKiBGbGFnIGZvciBCYXNzICovCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQmFzc1RlbXBEaXNhYmxlZDsgICAgICAgIC8qIEZsYWcgZm9yIEJhc3MgdG8gYmUgcmUtZW5hYmxlZCAqLwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZpcnR1YWxpemVyRW5hYmxlZDsgICAgICAvKiBGbGFnIGZvciBWaXJ0dWFsaXplciAqLwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZpcnR1YWxpemVyVGVtcERpc2FibGVkOyAvKiBGbGFnIGZvciBlZmZlY3QgdG8gYmUgcmUtZW5hYmxlZCAqLwotICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgICAgICAgICAgbk91dHB1dERldmljZTsgICAgICAgICAgICAvKiBPdXRwdXQgZGV2aWNlIGZvciB0aGUgZWZmZWN0ICovCi0gICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgICAgICAgICBuVmlydHVhbGl6ZXJGb3JjZWREZXZpY2U7IC8qIEZvcmNlZCBkZXZpY2UgdmlydHVhbGl6YXRpb24gbW9kZSovCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJFZmZlY3RzRW5hYmxlZDsgICAgIC8qIEVmZmVjdHMgaW4gdGhpcyBzZXNzaW9uICovCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJFZmZlY3RzQ2FsbGVkOyAgICAgIC8qIEVmZmVjdHMgY2FsbGVkIHNvIGZhciAqLwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWb2x1bWU7ICAgICAgICAgICAgICAvKiBObyBzbW9vdGhpbmcgb24gZmlyc3QgVm9sIGNoYW5nZSAqLworc3RydWN0IEJ1bmRsZWRFZmZlY3RDb250ZXh0IHsKKyAgICBMVk1fSGFuZGxlX3QgaEluc3RhbmNlOyAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICBpbnQgU2Vzc2lvbk5vOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IHNlc3Npb24gbnVtYmVyICovCisgICAgaW50IFNlc3Npb25JZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBzZXNzaW9uIGlkICovCisgICAgYm9vbCBiVm9sdW1lRW5hYmxlZDsgICAgICAgICAgICAgICAgICAgICAgLyogRmxhZyBmb3IgVm9sdW1lICovCisgICAgYm9vbCBiRXF1YWxpemVyRW5hYmxlZDsgICAgICAgICAgICAgICAgICAgLyogRmxhZyBmb3IgRVEgKi8KKyAgICBib29sIGJCYXNzRW5hYmxlZDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnIGZvciBCYXNzICovCisgICAgYm9vbCBiQmFzc1RlbXBEaXNhYmxlZDsgICAgICAgICAgICAgICAgICAgLyogRmxhZyBmb3IgQmFzcyB0byBiZSByZS1lbmFibGVkICovCisgICAgYm9vbCBiVmlydHVhbGl6ZXJFbmFibGVkOyAgICAgICAgICAgICAgICAgLyogRmxhZyBmb3IgVmlydHVhbGl6ZXIgKi8KKyAgICBib29sIGJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZDsgICAgICAgICAgICAvKiBGbGFnIGZvciBlZmZlY3QgdG8gYmUgcmUtZW5hYmxlZCAqLworICAgIGF1ZGlvX2RldmljZXNfdCBuT3V0cHV0RGV2aWNlOyAgICAgICAgICAgIC8qIE91dHB1dCBkZXZpY2UgZm9yIHRoZSBlZmZlY3QgKi8KKyAgICBhdWRpb19kZXZpY2VzX3QgblZpcnR1YWxpemVyRm9yY2VkRGV2aWNlOyAvKiBGb3JjZWQgZGV2aWNlIHZpcnR1YWxpemF0aW9uIG1vZGUqLworICAgIGludCBOdW1iZXJFZmZlY3RzRW5hYmxlZDsgICAgICAgICAgICAgICAgIC8qIEVmZmVjdHMgaW4gdGhpcyBzZXNzaW9uICovCisgICAgaW50IE51bWJlckVmZmVjdHNDYWxsZWQ7ICAgICAgICAgICAgICAgICAgLyogRWZmZWN0cyBjYWxsZWQgc28gZmFyICovCisgICAgYm9vbCBmaXJzdFZvbHVtZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gc21vb3RoaW5nIG9uIGZpcnN0IFZvbCBjaGFuZ2UgKi8KICAgICAvLyBTYXZlZCBwYXJhbWV0ZXJzIGZvciBlYWNoIGVmZmVjdCAqLwogICAgIC8vIEJhc3MgQm9vc3QKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc3NTdHJlbmd0aFNhdmVkOyAgICAgICAgLyogQ29udmVyc2lvbiBiZXR3ZWVuIEdldC9TZXQgKi8KKyAgICBpbnQgQmFzc1N0cmVuZ3RoU2F2ZWQ7IC8qIENvbnZlcnNpb24gYmV0d2VlbiBHZXQvU2V0ICovCiAgICAgLy8gRXF1YWxpemVyCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJQcmVzZXQ7ICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgcHJlc2V0IGJlaW5nIHVzZWQgKi8KKyAgICBpbnQgQ3VyUHJlc2V0OyAvKiBDdXJyZW50IHByZXNldCBiZWluZyB1c2VkICovCiAgICAgLy8gVmlydHVhbHplcgotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlydFN0cmVuZ3RoU2F2ZWQ7ICAgICAgICAvKiBDb252ZXJzaW9uIGJldHdlZW4gR2V0L1NldCAqLworICAgIGludCBWaXJ0U3RyZW5ndGhTYXZlZDsgLyogQ29udmVyc2lvbiBiZXR3ZWVuIEdldC9TZXQgKi8KICAgICAvLyBWb2x1bWUKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsU2F2ZWQ7ICAgICAvKiBmb3Igd2hlbiBtdXRlIGlzIHNldCwgbGV2ZWwgbXVzdCBiZSBzYXZlZCAqLwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25TYXZlZDsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNdXRlRW5hYmxlZDsgICAvKiBNdXN0IHN0b3JlIGFzIG11dGUgPSAtOTZkQiBsZXZlbCAqLwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZDsKLSAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVzUGVyU2Vjb25kOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlc1RvRXhpdENvdW50RXE7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVzVG9FeGl0Q291bnRCYjsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZXNUb0V4aXRDb3VudFZpcnQ7Ci0gICAgZWZmZWN0X2J1ZmZlcl90ICAgICAgICAgICAgICAgICAqd29ya0J1ZmZlcjsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQ7Ci0gICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kR2FpbmRCW0ZJVkVCQU5EX05VTUJBTkRTXTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZTsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICBDaE1hc2s7Ci0jZW5kaWYKKyAgICBpbnQgbGV2ZWxTYXZlZDsgLyogZm9yIHdoZW4gbXV0ZSBpcyBzZXQsIGxldmVsIG11c3QgYmUgc2F2ZWQgKi8KKyAgICBpbnQgcG9zaXRpb25TYXZlZDsKKyAgICBib29sIGJNdXRlRW5hYmxlZDsgLyogTXVzdCBzdG9yZSBhcyBtdXRlID0gLTk2ZEIgbGV2ZWwgKi8KKyAgICBib29sIGJTdGVyZW9Qb3NpdGlvbkVuYWJsZWQ7CisgICAgTFZNX0ZzX2VuIFNhbXBsZVJhdGU7CisgICAgaW50IFNhbXBsZXNQZXJTZWNvbmQ7CisgICAgaW50IFNhbXBsZXNUb0V4aXRDb3VudEVxOworICAgIGludCBTYW1wbGVzVG9FeGl0Q291bnRCYjsKKyAgICBpbnQgU2FtcGxlc1RvRXhpdENvdW50VmlydDsKKyAgICBlZmZlY3RfYnVmZmVyX3QqIHdvcmtCdWZmZXI7CisgICAgaW50IGZyYW1lQ291bnQ7CisgICAgaW50MzJfdCBiYW5kR2FpbmRCW0ZJVkVCQU5EX05VTUJBTkRTXTsKKyAgICBpbnQgdm9sdW1lOworICAgIExWTV9JTlQzMiBDaE1hc2s7CiAKICAgICAvKiBCaXRtYXNrIHdoZXRoZXIgZHJhaW4gaXMgaW4gcHJvZ3Jlc3MgZHVlIHRvIGRpc2FibGluZyB0aGUgZWZmZWN0LgogICAgICAgIFRoZSBjb3JyZXNwb25kaW5nIGJpdCB0byBhbiBlZmZlY3QgaXMgc2V0IGJ5IDEgPDwgbHZtX2VmZmVjdF9lbi4gKi8KLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEluRHJhaW47CisgICAgaW50IGVmZmVjdEluRHJhaW47CiAKICAgICAvKiBCaXRtYXNrIHdoZXRoZXIgcHJvY2VzcygpIHdhcyBjYWxsZWQgZm9yIGEgcGFydGljdWxhciBlZmZlY3QuCiAgICAgICAgVGhlIGNvcnJlc3BvbmRpbmcgYml0IHRvIGFuIGVmZmVjdCBpcyBzZXQgYnkgMSA8PCBsdm1fZWZmZWN0X2VuLiAqLwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0UHJvY2Vzc0NhbGxlZDsKKyAgICBpbnQgZWZmZWN0UHJvY2Vzc0NhbGxlZDsKIH07CiAKIC8qIFNlc3Npb25Db250ZXh0IDogT25lIHNlc3Npb24gKi8KLXN0cnVjdCBTZXNzaW9uQ29udGV4dHsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCdW5kbGVkRWZmZWN0c0VuYWJsZWQ7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVm9sdW1lSW5zdGFudGlhdGVkOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkVxdWFsaXplckluc3RhbnRpYXRlZDsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCYXNzSW5zdGFudGlhdGVkOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZpcnR1YWxpemVySW5zdGFudGlhdGVkOwotICAgIEJ1bmRsZWRFZmZlY3RDb250ZXh0ICAgICAgICAgICAgKnBCdW5kbGVkQ29udGV4dDsKK3N0cnVjdCBTZXNzaW9uQ29udGV4dCB7CisgICAgYm9vbCBiQnVuZGxlZEVmZmVjdHNFbmFibGVkOworICAgIGJvb2wgYlZvbHVtZUluc3RhbnRpYXRlZDsKKyAgICBib29sIGJFcXVhbGl6ZXJJbnN0YW50aWF0ZWQ7CisgICAgYm9vbCBiQmFzc0luc3RhbnRpYXRlZDsKKyAgICBib29sIGJWaXJ0dWFsaXplckluc3RhbnRpYXRlZDsKKyAgICBCdW5kbGVkRWZmZWN0Q29udGV4dCogcEJ1bmRsZWRDb250ZXh0OwogfTsKIAotc3RydWN0IEVmZmVjdENvbnRleHR7Ci0gICAgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqaXRmZTsKLSAgICBlZmZlY3RfY29uZmlnX3QgICAgICAgICAgICAgICAgIGNvbmZpZzsKLSAgICBsdm1fZWZmZWN0X2VuICAgICAgICAgICAgICAgICAgIEVmZmVjdFR5cGU7Ci0gICAgQnVuZGxlZEVmZmVjdENvbnRleHQgICAgICAgICAgICAqcEJ1bmRsZWRDb250ZXh0Oworc3RydWN0IEVmZmVjdENvbnRleHQgeworICAgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MqIGl0ZmU7CisgICAgZWZmZWN0X2NvbmZpZ190IGNvbmZpZzsKKyAgICBsdm1fZWZmZWN0X2VuIEVmZmVjdFR5cGU7CisgICAgQnVuZGxlZEVmZmVjdENvbnRleHQqIHBCdW5kbGVkQ29udGV4dDsKIH07CiAKIC8qIGVudW1lcmF0ZWQgcGFyYW1ldGVyIHNldHRpbmdzIGZvciBWb2x1bWUgZWZmZWN0ICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBWT0xVTUVfUEFSQU1fTEVWRUwsICAgICAgICAgICAgICAgICAgICAgICAvLyB0eXBlIFNMbWlsbGliZWwgPSB0eXBlZGVmIFNMdWludDE2IChzZXQgJiBnZXQpCi0gICAgVk9MVU1FX1BBUkFNX01BWExFVkVMLCAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSBTTG1pbGxpYmVsID0gdHlwZWRlZiBTTHVpbnQxNiAoZ2V0KQotICAgIFZPTFVNRV9QQVJBTV9NVVRFLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgU0xib29sZWFuICA9IHR5cGVkZWYgU0x1aW50MzIgKHNldCAmIGdldCkKLSAgICBWT0xVTUVfUEFSQU1fRU5BQkxFU1RFUkVPUE9TSVRJT04sICAgICAgICAvLyB0eXBlIFNMYm9vbGVhbiAgPSB0eXBlZGVmIFNMdWludDMyIChzZXQgJiBnZXQpCi0gICAgVk9MVU1FX1BBUkFNX1NURVJFT1BPU0lUSU9OLCAgICAgICAgICAgICAgLy8gdHlwZSBTTHBlcm1pbGxlID0gdHlwZWRlZiBTTHVpbnQxNiAoc2V0ICYgZ2V0KQordHlwZWRlZiBlbnVtIHsKKyAgICBWT0xVTUVfUEFSQU1fTEVWRUwsICAgICAgICAgICAgICAgICAvLyB0eXBlIFNMbWlsbGliZWwgPSB0eXBlZGVmIFNMdWludDE2IChzZXQgJiBnZXQpCisgICAgVk9MVU1FX1BBUkFNX01BWExFVkVMLCAgICAgICAgICAgICAgLy8gdHlwZSBTTG1pbGxpYmVsID0gdHlwZWRlZiBTTHVpbnQxNiAoZ2V0KQorICAgIFZPTFVNRV9QQVJBTV9NVVRFLCAgICAgICAgICAgICAgICAgIC8vIHR5cGUgU0xib29sZWFuICA9IHR5cGVkZWYgU0x1aW50MzIgKHNldCAmIGdldCkKKyAgICBWT0xVTUVfUEFSQU1fRU5BQkxFU1RFUkVPUE9TSVRJT04sICAvLyB0eXBlIFNMYm9vbGVhbiAgPSB0eXBlZGVmIFNMdWludDMyIChzZXQgJiBnZXQpCisgICAgVk9MVU1FX1BBUkFNX1NURVJFT1BPU0lUSU9OLCAgICAgICAgLy8gdHlwZSBTTHBlcm1pbGxlID0gdHlwZWRlZiBTTHVpbnQxNiAoc2V0ICYgZ2V0KQogfSB0X3ZvbHVtZV9wYXJhbXM7CiAKIHN0YXRpYyBjb25zdCBpbnQgUFJFU0VUX0NVU1RPTSA9IC0xOwogCi1zdGF0aWMgY29uc3QgdWludDMyX3QgYmFuZEZyZXFSYW5nZVtGSVZFQkFORF9OVU1CQU5EU11bMl0gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MzAwMDAsIDEyMDAwMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTIwMDAxLCA0NjAwMDB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezQ2MDAwMSwgMTgwMDAwMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTgwMDAwMSwgNzAwMDAwMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NzAwMDAwMSwgMjAwMDAwMDB9fTsKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBiYW5kRnJlcVJhbmdlW0ZJVkVCQU5EX05VTUJBTkRTXVsyXSA9IHt7MzAwMDAsIDEyMDAwMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEyMDAwMSwgNDYwMDAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NDYwMDAxLCAxODAwMDAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTgwMDAwMSwgNzAwMDAwMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezcwMDAwMDEsIDIwMDAwMDAwfX07CiAKLS8vTm90ZTogSWYgdGhlc2UgZnJlcXVlbmNpZXMgY2hhbmdlLCBwbGVhc2UgdXBkYXRlIExpbWl0TGV2ZWwgdmFsdWVzIGFjY29yZGluZ2x5Lgotc3RhdGljIGNvbnN0IExWTV9VSU5UMTYgIEVRTkJfNUJhbmRQcmVzZXRzRnJlcXVlbmNpZXNbXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYwLCAgICAgICAgICAgLyogRnJlcXVlbmNpZXMgaW4gSHogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDAwMH07CisvLyBOb3RlOiBJZiB0aGVzZSBmcmVxdWVuY2llcyBjaGFuZ2UsIHBsZWFzZSB1cGRhdGUgTGltaXRMZXZlbCB2YWx1ZXMgYWNjb3JkaW5nbHkuCitzdGF0aWMgY29uc3QgTFZNX1VJTlQxNiBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW10gPSB7NjAsIC8qIEZyZXF1ZW5jaWVzIGluIEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjMwLCA5MTAsIDM2MDAsIDE0MDAwfTsKIAotc3RhdGljIGNvbnN0IExWTV9VSU5UMTYgRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tdID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYsICAgICAgICAgICAgICAgLyogUSBmYWN0b3IgbXVsdGlwbGllZCBieSAxMDAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2fTsKK3N0YXRpYyBjb25zdCBMVk1fVUlOVDE2IEVRTkJfNUJhbmRQcmVzZXRzUUZhY3RvcnNbXSA9IHs5NiwgLyogUSBmYWN0b3IgbXVsdGlwbGllZCBieSAxMDAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NiwgOTYsIDk2LCA5Nn07CiAKLXN0YXRpYyBjb25zdCBMVk1fSU5UMTYgRVFOQl81QmFuZE5vcm1hbFByZXNldHNbXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDAsIDAsIDAsIDMsICAgICAgIC8qIE5vcm1hbCBQcmVzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsIDUsIC0zLCA1LCA2LCAgICAgIC8qIENsYXNzaWNhbCBQcmVzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LCAtNiwgNywgMTMsIDEwLCAgIC8qIERhbmNlIFByZXNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAgLyogRmxhdCBQcmVzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIC0yLCAtMiwgNiwgLTMsICAgIC8qIEZvbGsgUHJlc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCAtOCwgMTMsIC0xLCAtNCwgICAvKiBIZWF2eSBNZXRhbCBQcmVzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCA2LCAtNCwgNSwgOCwgICAgIC8qIEhpcCBIb3AgUHJlc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCA1LCAtNCwgNSwgOSwgICAgICAvKiBKYXp6IFByZXNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNiwgNCwgOSwgNCwgLTUsICAgICAgLyogUG9wIFByZXNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsIDYsIC0xLCA4LCAxMH07ICAgLyogUm9jayBQcmVzZXQgKi8KK3N0YXRpYyBjb25zdCBMVk1fSU5UMTYgRVFOQl81QmFuZE5vcm1hbFByZXNldHNbXSA9IHszLCAgMCwgIDAsICAwLCAgMywgICAvKiBOb3JtYWwgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgIDUsICAtMywgNSwgIDYsICAgLyogQ2xhc3NpY2FsIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LCAtNiwgNywgIDEzLCAxMCwgIC8qIERhbmNlIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgIC8qIEZsYXQgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgIC0yLCAtMiwgNiwgIC0zLCAgLyogRm9sayBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCAgLTgsIDEzLCAtMSwgLTQsICAvKiBIZWF2eSBNZXRhbCBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgNiwgIC00LCA1LCAgOCwgICAvKiBIaXAgSG9wIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsICA1LCAgLTQsIDUsICA5LCAgIC8qIEphenogUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYsIDQsICA5LCAgNCwgIC01LCAgLyogUG9wIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCA2LCAgLTEsIDgsICAxMH07IC8qIFJvY2sgUHJlc2V0ICovCiAKLXN0YXRpYyBjb25zdCBMVk1fSU5UMTYgRVFOQl81QmFuZFNvZnRQcmVzZXRzW10gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMCwgMCwgMCwgMywgICAgICAvKiBOb3JtYWwgUHJlc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMywgLTIsIDQsIDQsICAgICAvKiBDbGFzc2ljYWwgUHJlc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgMCwgMiwgNCwgMSwgICAgICAvKiBEYW5jZSBQcmVzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAgICAgIC8qIEZsYXQgUHJlc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMCwgMCwgMiwgLTEsICAgICAvKiBGb2xrIFByZXNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDEsIDksIDMsIDAsICAgICAgLyogSGVhdnkgTWV0YWwgUHJlc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMywgMCwgMSwgMywgICAgICAvKiBIaXAgSG9wIFByZXNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDIsIC0yLCAyLCA1LCAgICAgLyogSmF6eiBQcmVzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAyLCA1LCAxLCAtMiwgICAgIC8qIFBvcCBQcmVzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAzLCAtMSwgMywgNX07ICAgIC8qIFJvY2sgUHJlc2V0ICovCitzdGF0aWMgY29uc3QgTFZNX0lOVDE2IEVRTkJfNUJhbmRTb2Z0UHJlc2V0c1tdID0gezMsICAwLCAwLCAgMCwgMywgIC8qIE5vcm1hbCBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgIDMsIC0yLCA0LCA0LCAgLyogQ2xhc3NpY2FsIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LCAgMCwgMiwgIDQsIDEsICAvKiBEYW5jZSBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIDAsIDAsICAwLCAwLCAgLyogRmxhdCBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgIDAsIDAsICAyLCAtMSwgLyogRm9sayBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgIDEsIDksICAzLCAwLCAgLyogSGVhdnkgTWV0YWwgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsICAzLCAwLCAgMSwgMywgIC8qIEhpcCBIb3AgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsICAyLCAtMiwgMiwgNSwgIC8qIEphenogUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAyLCA1LCAgMSwgLTIsIC8qIFBvcCBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgIDMsIC0xLCAzLCA1fTsgLyogUm9jayBQcmVzZXQgKi8KIAotc3RhdGljIGNvbnN0IFByZXNldENvbmZpZyBnRXF1YWxpemVyUHJlc2V0c1tdID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiTm9ybWFsIn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJDbGFzc2ljYWwifSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IkRhbmNlIn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJGbGF0In0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJGb2xrIn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJIZWF2eSBNZXRhbCJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiSGlwIEhvcCJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiSmF6eiJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiUG9wIn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJSb2NrIn19Oworc3RhdGljIGNvbnN0IFByZXNldENvbmZpZyBnRXF1YWxpemVyUHJlc2V0c1tdID0ge3siTm9ybWFsIn0sIHsiQ2xhc3NpY2FsIn0sICAgeyJEYW5jZSJ9LCAgIHsiRmxhdCJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiRm9sayJ9LCAgIHsiSGVhdnkgTWV0YWwifSwgeyJIaXAgSG9wIn0sIHsiSmF6eiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiUG9wIn0sICAgIHsiUm9jayJ9fTsKIAogLyogVGhlIGZvbGxvd2luZyB0YWJsZXMgaGF2ZSBiZWVuIGNvbXB1dGVkIHVzaW5nIHRoZSBhY3R1YWwgbGV2ZWxzIG1lYXN1cmVkIGJ5IHRoZSBvdXRwdXQgb2YKICAqIHdoaXRlIG5vaXNlIG9yIHBpbmsgbm9pc2UgKElFQzI2OC0xKSBmb3IgdGhlIEVRIGFuZCBCYXNzQm9vc3QgRWZmZWN0cy4gVGhlc2UgYXJlIGVzdGltYXRlcyBvZgpAQCAtMjAxLDE0ICsxNzMsMTQgQEAKICAqIHVwZGF0ZWQuCiAgKi8KIAotc3RhdGljIGNvbnN0IGZsb2F0IExpbWl0TGV2ZWxfYmFuZEVuZXJneUNvZWZmaWNpZW50W0ZJVkVCQU5EX05VTUJBTkRTXSA9IHsKLSAgICAgICAgNy41NiwgOS42OSwgOS41OSwgNy4zNywgMi44OH07CitzdGF0aWMgY29uc3QgZmxvYXQgTGltaXRMZXZlbF9iYW5kRW5lcmd5Q29lZmZpY2llbnRbRklWRUJBTkRfTlVNQkFORFNdID0gezcuNTYsIDkuNjksIDkuNTksIDcuMzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuODh9OwogCi1zdGF0aWMgY29uc3QgZmxvYXQgTGltaXRMZXZlbF9iYW5kRW5lcmd5Q3Jvc3NDb2VmZmljaWVudFtGSVZFQkFORF9OVU1CQU5EUy0xXSA9IHsKLSAgICAgICAgMTI2LjAsIDExNS4wLCAxMjUuMCwgMTA0LjAgfTsKK3N0YXRpYyBjb25zdCBmbG9hdCBMaW1pdExldmVsX2JhbmRFbmVyZ3lDcm9zc0NvZWZmaWNpZW50W0ZJVkVCQU5EX05VTUJBTkRTIC0gMV0gPSB7MTI2LjAsIDExNS4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjUuMCwgMTA0LjB9OwogCiBzdGF0aWMgY29uc3QgZmxvYXQgTGltaXRMZXZlbF9iYXNzQm9vc3RFbmVyZ3lDcm9zc0NvZWZmaWNpZW50W0ZJVkVCQU5EX05VTUJBTkRTXSA9IHsKLSAgICAgICAgMjIxLjIxLCAyMDguMTAsIDI4LjE2LCAwLjAsIDAuMCB9OworICAgICAgICAyMjEuMjEsIDIwOC4xMCwgMjguMTYsIDAuMCwgMC4wfTsKIAogc3RhdGljIGNvbnN0IGZsb2F0IExpbWl0TGV2ZWxfYmFzc0Jvb3N0RW5lcmd5Q29lZmZpY2llbnQgPSA5LjAwOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAppbmRleCAzOWY1YmI2Li4yOTBhN2IxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKQEAgLTE4LDcgKzE4LDcgQEAKIHR5cGVkZWYgZmxvYXQgTFZNX0ZMT0FUOwogI2VuZGlmCiAjZGVmaW5lIExPR19UQUcgIlJldmVyYiIKLSNkZWZpbmUgQVJSQVlfU0laRShhcnJheSkgKHNpemVvZiAoYXJyYXkpIC8gc2l6ZW9mIChhcnJheSlbMF0pCisjZGVmaW5lIEFSUkFZX1NJWkUoYXJyYXkpIChzaXplb2YoYXJyYXkpIC8gc2l6ZW9mKGFycmF5KVswXSkKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPGFzc2VydC5oPgpAQCAtMzMsMjMgKzMzLDI4IEBACiAjaW5jbHVkZSAiRWZmZWN0UmV2ZXJiLmgiCiAvLyBmcm9tIFJldmVyYi9saWIKICNpbmNsdWRlICJMVlJFVi5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKIAogLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgcmV2ZXJiCiBleHRlcm4gIkMiIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ1JldmVyYkludGVyZmFjZTsKIAotI2RlZmluZSBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyl7XAotICAgICAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZSRVZfTlVMTEFERFJFU1Mpe1wKLSAgICAgICAgICAgIEFMT0dWKCJcdExWUkVWX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIlwKLSAgICAgICAgICAgICAgICAgICAgIm51bGwgcG9pbnRlciByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpO1wKLSAgICAgICAgfVwKLSAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWUkVWX0lOVkFMSUROVU1TQU1QTEVTKXtcCi0gICAgICAgICAgICBBTE9HVigiXHRMVlJFVl9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICJcCi0gICAgICAgICAgICAgICAgICAgICJiYWQgbnVtYmVyIG9mIHNhbXBsZXMgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTtcCi0gICAgICAgIH1cCi0gICAgICAgIGlmICgoTHZtU3RhdHVzKSA9PSBMVlJFVl9PVVRPRlJBTkdFKXtcCi0gICAgICAgICAgICBBTE9HVigiXHRMVlJFVl9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICJcCi0gICAgICAgICAgICAgICAgICAgICJvdXQgb2YgcmFuZ2UgcmV0dXJuZWQgYnkgJXMgaW4gJXNcbiIsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTtcCi0gICAgICAgIH1cCisjZGVmaW5lIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKSAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoTHZtU3RhdHVzKSA9PSBMVlJFVl9OVUxMQUREUkVTUykgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HVigiXHRMVlJFVl9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAibnVsbCBwb2ludGVyIHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoTHZtU3RhdHVzKSA9PSBMVlJFVl9JTlZBTElETlVNU0FNUExFUykgeyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HVigiXHRMVlJFVl9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAiYmFkIG51bWJlciBvZiBzYW1wbGVzIHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCBcCisgICAgICAgICAgICAgICAgICBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoTHZtU3RhdHVzKSA9PSBMVlJFVl9PVVRPRlJBTkdFKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HVigiXHRMVlJFVl9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAib3V0IG9mIHJhbmdlIHJldHVybmVkIGJ5ICVzIGluICVzXG4iLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfQogCiAvLyBOYW1lc3BhY2VzCkBAIC04MSw4ICs4Niw4IEBACiAKIC8vIE5YUCBTVyBhdXhpbGlhcnkgZW52aXJvbm1lbnRhbCByZXZlcmIKIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0F1eEVudlJldmVyYkRlc2NyaXB0b3IgPSB7Ci0gICAgICAgIHsgMHhjMmU1ZDVmMCwgMHg5NGJkLCAweDQ3NjMsIDB4OWNhYywgeyAweDRlLCAweDIzLCAweDRkLCAweDA2LCAweDgzLCAweDllIH0gfSwKLSAgICAgICAgeyAweDRhMzg3ZmMwLCAweDhhYjMsIDB4MTFkZiwgMHg4YmFkLCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9LAorICAgICAgICB7MHhjMmU1ZDVmMCwgMHg5NGJkLCAweDQ3NjMsIDB4OWNhYywgezB4NGUsIDB4MjMsIDB4NGQsIDB4MDYsIDB4ODMsIDB4OWV9fSwKKyAgICAgICAgezB4NGEzODdmYzAsIDB4OGFiMywgMHgxMWRmLCAweDhiYWQsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCiAgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAogICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSwKICAgICAgICAgTFZSRVZfQ1VQX0xPQURfQVJNOUUsCkBAIC0xMjgsNDIgKzEzMywzOSBAQAogfTsKIAogLy8gZ0Rlc2NyaXB0b3JzIGNvbnRhaW5zIHBvaW50ZXJzIHRvIGFsbCBkZWZpbmVkIGVmZmVjdCBkZXNjcmlwdG9yIGluIHRoaXMgbGlicmFyeQotc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKiBjb25zdCBnRGVzY3JpcHRvcnNbXSA9IHsKLSAgICAgICAgJmdBdXhFbnZSZXZlcmJEZXNjcmlwdG9yLAotICAgICAgICAmZ0luc2VydEVudlJldmVyYkRlc2NyaXB0b3IsCi0gICAgICAgICZnQXV4UHJlc2V0UmV2ZXJiRGVzY3JpcHRvciwKLSAgICAgICAgJmdJbnNlcnRQcmVzZXRSZXZlcmJEZXNjcmlwdG9yCi19Oworc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QqIGNvbnN0IGdEZXNjcmlwdG9yc1tdID0geworICAgICAgICAmZ0F1eEVudlJldmVyYkRlc2NyaXB0b3IsICZnSW5zZXJ0RW52UmV2ZXJiRGVzY3JpcHRvciwgJmdBdXhQcmVzZXRSZXZlcmJEZXNjcmlwdG9yLAorICAgICAgICAmZ0luc2VydFByZXNldFJldmVyYkRlc2NyaXB0b3J9OwogCi10eXBlZGVmICAgICBmbG9hdCAgICAgICAgICAgICAgIHByb2Nlc3NfYnVmZmVyX3Q7IC8vIHByb2Nlc3MgaW4gZmxvYXQKK3R5cGVkZWYgZmxvYXQgcHJvY2Vzc19idWZmZXJfdDsgIC8vIHByb2Nlc3MgaW4gZmxvYXQKIAotc3RydWN0IFJldmVyYkNvbnRleHR7Ci0gICAgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqaXRmZTsKLSAgICBlZmZlY3RfY29uZmlnX3QgICAgICAgICAgICAgICAgIGNvbmZpZzsKLSAgICBMVlJFVl9IYW5kbGVfdCAgICAgICAgICAgICAgICAgIGhJbnN0YW5jZTsKLSAgICBpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVkUm9vbUxldmVsOwotICAgIGludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZWRIZkxldmVsOwotICAgIGludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZWREZWNheVRpbWU7Ci0gICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlZERlY2F5SGZSYXRpbzsKLSAgICBpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVkUmV2ZXJiTGV2ZWw7Ci0gICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlZERpZmZ1c2lvbjsKLSAgICBpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVkRGVuc2l0eTsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFbmFibGVkOwotICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlUmF0ZTsKLSAgICBwcm9jZXNzX2J1ZmZlcl90ICAgICAgICAgICAgICAgICpJbkZyYW1lczsKLSAgICBwcm9jZXNzX2J1ZmZlcl90ICAgICAgICAgICAgICAgICpPdXRGcmFtZXM7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplSW47Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplT3V0OwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV4aWxpYXJ5OwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2V0OwotICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgY3VyUHJlc2V0OwotICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFByZXNldDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZXNUb0V4aXRDb3VudDsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgIGxlZnRWb2x1bWU7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICByaWdodFZvbHVtZTsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgIHByZXZMZWZ0Vm9sdW1lOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgcHJldlJpZ2h0Vm9sdW1lOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lTW9kZTsKK3N0cnVjdCBSZXZlcmJDb250ZXh0IHsKKyAgICBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zKiBpdGZlOworICAgIGVmZmVjdF9jb25maWdfdCBjb25maWc7CisgICAgTFZSRVZfSGFuZGxlX3QgaEluc3RhbmNlOworICAgIGludDE2X3QgU2F2ZWRSb29tTGV2ZWw7CisgICAgaW50MTZfdCBTYXZlZEhmTGV2ZWw7CisgICAgaW50MTZfdCBTYXZlZERlY2F5VGltZTsKKyAgICBpbnQxNl90IFNhdmVkRGVjYXlIZlJhdGlvOworICAgIGludDE2X3QgU2F2ZWRSZXZlcmJMZXZlbDsKKyAgICBpbnQxNl90IFNhdmVkRGlmZnVzaW9uOworICAgIGludDE2X3QgU2F2ZWREZW5zaXR5OworICAgIGJvb2wgYkVuYWJsZWQ7CisgICAgTFZNX0ZzX2VuIFNhbXBsZVJhdGU7CisgICAgcHJvY2Vzc19idWZmZXJfdCogSW5GcmFtZXM7CisgICAgcHJvY2Vzc19idWZmZXJfdCogT3V0RnJhbWVzOworICAgIHNpemVfdCBidWZmZXJTaXplSW47CisgICAgc2l6ZV90IGJ1ZmZlclNpemVPdXQ7CisgICAgYm9vbCBhdXhpbGlhcnk7CisgICAgYm9vbCBwcmVzZXQ7CisgICAgdWludDE2X3QgY3VyUHJlc2V0OworICAgIHVpbnQxNl90IG5leHRQcmVzZXQ7CisgICAgaW50IFNhbXBsZXNUb0V4aXRDb3VudDsKKyAgICBMVk1fSU5UMTYgbGVmdFZvbHVtZTsKKyAgICBMVk1fSU5UMTYgcmlnaHRWb2x1bWU7CisgICAgTFZNX0lOVDE2IHByZXZMZWZ0Vm9sdW1lOworICAgIExWTV9JTlQxNiBwcmV2UmlnaHRWb2x1bWU7CisgICAgaW50IHZvbHVtZU1vZGU7CiB9OwogCiBlbnVtIHsKQEAgLTE3NCw0NCArMTc2LDM4IEBACiAKICNkZWZpbmUgUkVWRVJCX0RFRkFVTFRfUFJFU0VUIFJFVkVSQl9QUkVTRVRfTk9ORQogCi0jZGVmaW5lIFJFVkVSQl9TRU5EX0xFVkVMICAgMC43NWYgLy8gMC43NSBpbiA0LjEyIGZvcm1hdAotI2RlZmluZSBSRVZFUkJfVU5JVF9WT0xVTUUgICgweDEwMDApIC8vIDEuMCBpbiA0LjEyIGZvcm1hdAorI2RlZmluZSBSRVZFUkJfU0VORF9MRVZFTCAwLjc1ZiAgICAgIC8vIDAuNzUgaW4gNC4xMiBmb3JtYXQKKyNkZWZpbmUgUkVWRVJCX1VOSVRfVk9MVU1FICgweDEwMDApICAvLyAxLjAgaW4gNC4xMiBmb3JtYXQKIAogLy8tLS0gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotaW50ICBSZXZlcmJfaW5pdCAgICAgICAgICAgIChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCk7Ci12b2lkIFJldmVyYl9mcmVlICAgICAgICAgICAgKFJldmVyYkNvbnRleHQgKnBDb250ZXh0KTsKLWludCAgUmV2ZXJiX3NldENvbmZpZyAgICAgICAoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCAqcENvbmZpZyk7Ci12b2lkIFJldmVyYl9nZXRDb25maWcgICAgICAgKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpOwotaW50ICBSZXZlcmJfc2V0UGFyYW1ldGVyICAgIChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgdm9pZCAqcFBhcmFtLCB2b2lkICpwVmFsdWUsIGludCB2c2l6ZSk7Ci1pbnQgIFJldmVyYl9nZXRQYXJhbWV0ZXIgICAgKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgKnBWYWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSk7Ci1pbnQgUmV2ZXJiX0xvYWRQcmVzZXQgICAgICAgKFJldmVyYkNvbnRleHQgICAqcENvbnRleHQpOwotaW50IFJldmVyYl9wYXJhbVZhbHVlU2l6ZSAgIChpbnQzMl90IHBhcmFtKTsKK2ludCBSZXZlcmJfaW5pdChSZXZlcmJDb250ZXh0KiBwQ29udGV4dCk7Cit2b2lkIFJldmVyYl9mcmVlKFJldmVyYkNvbnRleHQqIHBDb250ZXh0KTsKK2ludCBSZXZlcmJfc2V0Q29uZmlnKFJldmVyYkNvbnRleHQqIHBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QqIHBDb25maWcpOwordm9pZCBSZXZlcmJfZ2V0Q29uZmlnKFJldmVyYkNvbnRleHQqIHBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QqIHBDb25maWcpOworaW50IFJldmVyYl9zZXRQYXJhbWV0ZXIoUmV2ZXJiQ29udGV4dCogcENvbnRleHQsIHZvaWQqIHBQYXJhbSwgdm9pZCogcFZhbHVlLCBpbnQgdnNpemUpOworaW50IFJldmVyYl9nZXRQYXJhbWV0ZXIoUmV2ZXJiQ29udGV4dCogcENvbnRleHQsIHZvaWQqIHBQYXJhbSwgdWludDMyX3QqIHBWYWx1ZVNpemUsIHZvaWQqIHBWYWx1ZSk7CitpbnQgUmV2ZXJiX0xvYWRQcmVzZXQoUmV2ZXJiQ29udGV4dCogcENvbnRleHQpOworaW50IFJldmVyYl9wYXJhbVZhbHVlU2l6ZShpbnQzMl90IHBhcmFtKTsKIAogLyogRWZmZWN0IExpYnJhcnkgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uICovCiAKLWV4dGVybiAiQyIgaW50IEVmZmVjdENyZWF0ZShjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgc2Vzc2lvbklkIF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgaW9JZCBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QgICpwSGFuZGxlKXsKK2V4dGVybiAiQyIgaW50IEVmZmVjdENyZWF0ZShjb25zdCBlZmZlY3RfdXVpZF90KiB1dWlkLCBpbnQzMl90IC8qIHNlc3Npb25JZCBfX3VudXNlZCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IC8qIGlvSWQgX191bnVzZWQgKi8sIGVmZmVjdF9oYW5kbGVfdCogcEhhbmRsZSkgewogICAgIGludCByZXQ7CiAgICAgaW50IGk7Ci0gICAgaW50IGxlbmd0aCA9IHNpemVvZihnRGVzY3JpcHRvcnMpIC8gc2l6ZW9mKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKik7Ci0gICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYzsKKyAgICBpbnQgbGVuZ3RoID0gc2l6ZW9mKGdEZXNjcmlwdG9ycykgLyBzaXplb2YoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCopOworICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QqIGRlc2M7CiAKICAgICBBTE9HVigiXHRcbkVmZmVjdENyZWF0ZSBzdGFydCIpOwogCi0gICAgaWYgKHBIYW5kbGUgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpeworICAgIGlmIChwSGFuZGxlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdENyZWF0ZSgpIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgZGVzYyA9IGdEZXNjcmlwdG9yc1tpXTsKLSAgICAgICAgaWYgKG1lbWNtcCh1dWlkLCAmZGVzYy0+dXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKQotICAgICAgICAgICAgICAgID09IDApIHsKKyAgICAgICAgaWYgKG1lbWNtcCh1dWlkLCAmZGVzYy0+dXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CiAgICAgICAgICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBVVUlEIG1hdGNoZWQgUmV2ZXJiIHR5cGUgJWQsIFVVSUQgPSAleCIsIGksIGRlc2MtPnV1aWQudGltZUxvdyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjIxLDE2ICsyMTcsMTYgQEAKICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CiAgICAgfQogCi0gICAgUmV2ZXJiQ29udGV4dCAqcENvbnRleHQgPSBuZXcgUmV2ZXJiQ29udGV4dDsKKyAgICBSZXZlcmJDb250ZXh0KiBwQ29udGV4dCA9IG5ldyBSZXZlcmJDb250ZXh0OwogCi0gICAgcENvbnRleHQtPml0ZmUgICAgICA9ICZnUmV2ZXJiSW50ZXJmYWNlOworICAgIHBDb250ZXh0LT5pdGZlID0gJmdSZXZlcmJJbnRlcmZhY2U7CiAgICAgcENvbnRleHQtPmhJbnN0YW5jZSA9IE5VTEw7CiAKICAgICBwQ29udGV4dC0+YXV4aWxpYXJ5ID0gZmFsc2U7Ci0gICAgaWYgKChkZXNjLT5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpeworICAgIGlmICgoZGVzYy0+ZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7CiAgICAgICAgIHBDb250ZXh0LT5hdXhpbGlhcnkgPSB0cnVlOwogICAgICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBBVVgiKTsKLSAgICB9ZWxzZXsKKyAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBJTlMiKTsKICAgICB9CiAKQEAgLTI0MSwxNCArMjM3LDE0IEBACiAgICAgICAgIHBDb250ZXh0LT5jdXJQcmVzZXQgPSBSRVZFUkJfUFJFU0VUX0xBU1QgKyAxOwogICAgICAgICBwQ29udGV4dC0+bmV4dFByZXNldCA9IFJFVkVSQl9ERUZBVUxUX1BSRVNFVDsKICAgICAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gUFJFU0VUIik7Ci0gICAgfWVsc2V7CisgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gRU5WSVJPTk1FTlRBTCIpOwogICAgIH0KIAogICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIENhbGxpbmcgUmV2ZXJiX2luaXQiKTsKICAgICByZXQgPSBSZXZlcmJfaW5pdChwQ29udGV4dCk7CiAKLSAgICBpZiAocmV0IDwgMCl7CisgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0Q3JlYXRlKCkgaW5pdCBmYWlsZWQiKTsKICAgICAgICAgZGVsZXRlIHBDb250ZXh0OwogICAgICAgICByZXR1cm4gcmV0OwpAQCAtMjU2LDI1ICsyNTIsMjUgQEAKIAogICAgICpwSGFuZGxlID0gKGVmZmVjdF9oYW5kbGVfdClwQ29udGV4dDsKIAotCiAgICAgaW50IGNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOwogCisgICAgY2hhbm5lbHMgPSAocENvbnRleHQtPmF1eGlsaWFyeSA9PSB0cnVlKSA/IGNoYW5uZWxzIDogRkNDXzI7CiAgICAgLy8gQWxsb2NhdGUgbWVtb3J5IGZvciByZXZlcmIgcHJvY2VzcyAoKjIgaXMgZm9yIFNURVJFTykKICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluID0gTFZSRVZfTUFYX0ZSQU1FX1NJWkUgKiBzaXplb2YocHJvY2Vzc19idWZmZXJfdCkgKiBjaGFubmVsczsKICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA9IExWUkVWX01BWF9GUkFNRV9TSVpFICogc2l6ZW9mKHByb2Nlc3NfYnVmZmVyX3QpICogRkNDXzI7Ci0gICAgcENvbnRleHQtPkluRnJhbWVzICA9IChwcm9jZXNzX2J1ZmZlcl90ICopY2FsbG9jKHBDb250ZXh0LT5idWZmZXJTaXplSW4sIDEgLyogc2l6ZSAqLyk7Ci0gICAgcENvbnRleHQtPk91dEZyYW1lcyA9IChwcm9jZXNzX2J1ZmZlcl90ICopY2FsbG9jKHBDb250ZXh0LT5idWZmZXJTaXplT3V0LCAxIC8qIHNpemUgKi8pOworICAgIHBDb250ZXh0LT5JbkZyYW1lcyA9IChwcm9jZXNzX2J1ZmZlcl90KiljYWxsb2MocENvbnRleHQtPmJ1ZmZlclNpemVJbiwgMSAvKiBzaXplICovKTsKKyAgICBwQ29udGV4dC0+T3V0RnJhbWVzID0gKHByb2Nlc3NfYnVmZmVyX3QqKWNhbGxvYyhwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCwgMSAvKiBzaXplICovKTsKIAogICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAlcCwgc2l6ZSAlenUiLCBwQ29udGV4dCwgc2l6ZW9mKFJldmVyYkNvbnRleHQpKTsKICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgZW5kXG4iKTsKICAgICByZXR1cm4gMDsKIH0gLyogZW5kIEVmZmVjdENyZWF0ZSAqLwogCi1leHRlcm4gIkMiIGludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9oYW5kbGVfdCBoYW5kbGUpewotICAgIFJldmVyYkNvbnRleHQgKiBwQ29udGV4dCA9IChSZXZlcmJDb250ZXh0ICopaGFuZGxlOworZXh0ZXJuICJDIiBpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgUmV2ZXJiQ29udGV4dCogcENvbnRleHQgPSAoUmV2ZXJiQ29udGV4dCopaGFuZGxlOwogCiAgICAgQUxPR1YoIlx0RWZmZWN0UmVsZWFzZSAlcCIsIGhhbmRsZSk7Ci0gICAgaWYgKHBDb250ZXh0ID09IE5VTEwpeworICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdFJlbGVhc2UgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KQEAgLTI4OCwxMiArMjg0LDExIEBACiAgICAgcmV0dXJuIDA7CiB9IC8qIGVuZCBFZmZlY3RSZWxlYXNlICovCiAKLWV4dGVybiAiQyIgaW50IEVmZmVjdEdldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKK2V4dGVybiAiQyIgaW50IEVmZmVjdEdldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCogdXVpZCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogcERlc2NyaXB0b3IpIHsKICAgICBpbnQgaTsKLSAgICBpbnQgbGVuZ3RoID0gc2l6ZW9mKGdEZXNjcmlwdG9ycykgLyBzaXplb2YoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKTsKKyAgICBpbnQgbGVuZ3RoID0gc2l6ZW9mKGdEZXNjcmlwdG9ycykgLyBzaXplb2YoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCopOwogCi0gICAgaWYgKHBEZXNjcmlwdG9yID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKXsKKyAgICBpZiAocERlc2NyaXB0b3IgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpIHsKICAgICAgICAgQUxPR1YoIkVmZmVjdEdldERlc2NyaXB0b3IoKSBjYWxsZWQgd2l0aCBOVUxMIHBvaW50ZXIiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtMzAxLDggKzI5Niw4IEBACiAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgIGlmIChtZW1jbXAodXVpZCwgJmdEZXNjcmlwdG9yc1tpXS0+dXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CiAgICAgICAgICAgICAqcERlc2NyaXB0b3IgPSAqZ0Rlc2NyaXB0b3JzW2ldOwotICAgICAgICAgICAgQUxPR1YoIkVmZmVjdEdldERlc2NyaXB0b3IgLSBVVUlEIG1hdGNoZWQgUmV2ZXJiIHR5cGUgJWQsIFVVSUQgPSAleCIsCi0gICAgICAgICAgICAgICAgIGksIGdEZXNjcmlwdG9yc1tpXS0+dXVpZC50aW1lTG93KTsKKyAgICAgICAgICAgIEFMT0dWKCJFZmZlY3RHZXREZXNjcmlwdG9yIC0gVVVJRCBtYXRjaGVkIFJldmVyYiB0eXBlICVkLCBVVUlEID0gJXgiLCBpLAorICAgICAgICAgICAgICAgICAgZ0Rlc2NyaXB0b3JzW2ldLT51dWlkLnRpbWVMb3cpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMTEsMTIgKzMwNiwxMyBAQAogfSAvKiBlbmQgRWZmZWN0R2V0RGVzY3JpcHRvciAqLwogCiAvKiBsb2NhbCBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgQ0hFQ0tfQVJHKGNvbmQpIHsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCEoY29uZCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBJbnZhbGlkIGFyZ3VtZW50OiAiI2NvbmQpOyAgICAgIFwKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQorI2RlZmluZSBDSEVDS19BUkcoY29uZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghKGNvbmQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogSW52YWxpZCBhcmd1bWVudDogIiAjY29uZCk7IFwKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBwcm9jZXNzKCkKQEAgLTMzNSw5MSArMzMxLDEwMSBAQAogLy8gIHBPdXQ6ICAgICAgIHBvaW50ZXIgdG8gdXBkYXRlZCBzdGVyZW8gMTYgYml0IG91dHB1dCBkYXRhCiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQgcHJvY2VzcyggZWZmZWN0X2J1ZmZlcl90ICAgKnBJbiwKLSAgICAgICAgICAgICBlZmZlY3RfYnVmZmVyX3QgICAqcE91dCwKLSAgICAgICAgICAgICBpbnQgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpewotCitpbnQgcHJvY2VzcyhlZmZlY3RfYnVmZmVyX3QqIHBJbiwgZWZmZWN0X2J1ZmZlcl90KiBwT3V0LCBpbnQgZnJhbWVDb3VudCwgUmV2ZXJiQ29udGV4dCogcENvbnRleHQpIHsKICAgICBpbnQgY2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyk7Ci0gICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgaW50IG91dENoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KIAotICAgIC8vIENoZWNrIHRoYXQgdGhlIGlucHV0IGlzIGVpdGhlciBtb25vIG9yIHN0ZXJlbwotICAgIGlmICghKGNoYW5uZWxzID09IDEgfHwgY2hhbm5lbHMgPT0gRkNDXzIpICkgewotICAgICAgICBBTE9HRSgiXHRMVlJFVl9FUlJPUiA6IHByb2Nlc3MgaW52YWxpZCBQQ00gZm9ybWF0Iik7CisgICAgLy8gUmV2ZXJiIG9ubHkgZWZmZWN0cyB0aGUgc3RlcmVvIGNoYW5uZWxzIGluIG11bHRpY2hhbm5lbCBzb3VyY2UuCisgICAgaWYgKGNoYW5uZWxzIDwgMSB8fCBjaGFubmVscyA+IExWTV9NQVhfQ0hBTk5FTFMpIHsKKyAgICAgICAgQUxPR0UoIlx0TFZSRVZfRVJST1IgOiBwcm9jZXNzIGludmFsaWQgUENNIGNoYW5uZWxzICVkIiwgY2hhbm5lbHMpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKICAgICBzaXplX3QgaW5TaXplID0gZnJhbWVDb3VudCAqIHNpemVvZihwcm9jZXNzX2J1ZmZlcl90KSAqIGNoYW5uZWxzOwogICAgIHNpemVfdCBvdXRTaXplID0gZnJhbWVDb3VudCAqIHNpemVvZihwcm9jZXNzX2J1ZmZlcl90KSAqIEZDQ18yOwotICAgIGlmIChwQ29udGV4dC0+SW5GcmFtZXMgPT0gTlVMTCB8fAotICAgICAgICAgICAgcENvbnRleHQtPmJ1ZmZlclNpemVJbiA8IGluU2l6ZSkgeworICAgIGlmIChwQ29udGV4dC0+SW5GcmFtZXMgPT0gTlVMTCB8fCBwQ29udGV4dC0+YnVmZmVyU2l6ZUluIDwgaW5TaXplKSB7CiAgICAgICAgIGZyZWUocENvbnRleHQtPkluRnJhbWVzKTsKICAgICAgICAgcENvbnRleHQtPmJ1ZmZlclNpemVJbiA9IGluU2l6ZTsKLSAgICAgICAgcENvbnRleHQtPkluRnJhbWVzID0gKHByb2Nlc3NfYnVmZmVyX3QgKiljYWxsb2MoMSwgcENvbnRleHQtPmJ1ZmZlclNpemVJbik7CisgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lcyA9IChwcm9jZXNzX2J1ZmZlcl90KiljYWxsb2MoMSwgcENvbnRleHQtPmJ1ZmZlclNpemVJbik7CiAgICAgfQotICAgIGlmIChwQ29udGV4dC0+T3V0RnJhbWVzID09IE5VTEwgfHwKLSAgICAgICAgICAgIHBDb250ZXh0LT5idWZmZXJTaXplT3V0IDwgb3V0U2l6ZSkgeworICAgIGlmIChwQ29udGV4dC0+T3V0RnJhbWVzID09IE5VTEwgfHwgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQgPCBvdXRTaXplKSB7CiAgICAgICAgIGZyZWUocENvbnRleHQtPk91dEZyYW1lcyk7CiAgICAgICAgIHBDb250ZXh0LT5idWZmZXJTaXplT3V0ID0gb3V0U2l6ZTsKLSAgICAgICAgcENvbnRleHQtPk91dEZyYW1lcyA9IChwcm9jZXNzX2J1ZmZlcl90ICopY2FsbG9jKDEsIHBDb250ZXh0LT5idWZmZXJTaXplT3V0KTsKKyAgICAgICAgcENvbnRleHQtPk91dEZyYW1lcyA9IChwcm9jZXNzX2J1ZmZlcl90KiljYWxsb2MoMSwgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQpOwogICAgIH0KIAotCiAgICAgLy8gQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMKICAgICBpZiAoKHBDb250ZXh0LT5JbkZyYW1lcyA9PSBOVUxMKSB8fCAocENvbnRleHQtPk91dEZyYW1lcyA9PSBOVUxMKSkgewogICAgICAgICBBTE9HRSgiXHRMVlJFVl9FUlJPUiA6IHByb2Nlc3MgZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGVtcG9yYXJ5IGJ1ZmZlcnMgIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotCiAgICAgaWYgKHBDb250ZXh0LT5wcmVzZXQgJiYgcENvbnRleHQtPm5leHRQcmVzZXQgIT0gcENvbnRleHQtPmN1clByZXNldCkgewogICAgICAgICBSZXZlcmJfTG9hZFByZXNldChwQ29udGV4dCk7CiAgICAgfQogCiAgICAgaWYgKHBDb250ZXh0LT5hdXhpbGlhcnkpIHsKICAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoKnBJbiksIGRlY2x0eXBlKCpwQ29udGV4dC0+SW5GcmFtZXMpPjo6dmFsdWUsCi0gICAgICAgICAgICAgICAgInBJbiBhbmQgSW5GcmFtZXMgbXVzdCBiZSBzYW1lIHR5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAicEluIGFuZCBJbkZyYW1lcyBtdXN0IGJlIHNhbWUgdHlwZSIpOwogICAgICAgICBtZW1jcHkocENvbnRleHQtPkluRnJhbWVzLCBwSW4sIGZyYW1lQ291bnQgKiBjaGFubmVscyAqIHNpemVvZigqcEluKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbW9ubyBpbnB1dCBpcyBkdXBsaWNhdGVkCisgICAgICAgIGlmIChjaGFubmVscyA+PSBGQ0NfMikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXNbRkNDXzIgKiBpXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAocHJvY2Vzc19idWZmZXJfdClwSW5bY2hhbm5lbHMgKiBpXSAqIFJFVkVSQl9TRU5EX0xFVkVMOworICAgICAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lc1tGQ0NfMiAqIGkgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAocHJvY2Vzc19idWZmZXJfdClwSW5bY2hhbm5lbHMgKiBpICsgMV0gKiBSRVZFUkJfU0VORF9MRVZFTDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gaW5zZXJ0IHJldmVyYiBpbnB1dCBpcyBhbHdheXMgc3RlcmVvCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXNbMiAqIGldID0gKHByb2Nlc3NfYnVmZmVyX3QpcEluWzIgKiBpXSAqIFJFVkVSQl9TRU5EX0xFVkVMOwotICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzWzIgKiBpICsgMV0gPSAocHJvY2Vzc19idWZmZXJfdClwSW5bMiAqIGkgKyAxXSAqIFJFVkVSQl9TRU5EX0xFVkVMOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXNbRkNDXzIgKiBpXSA9IHBDb250ZXh0LT5JbkZyYW1lc1tGQ0NfMiAqIGkgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAocHJvY2Vzc19idWZmZXJfdClwSW5baV0gKiBSRVZFUkJfU0VORF9MRVZFTDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChwQ29udGV4dC0+cHJlc2V0ICYmIHBDb250ZXh0LT5jdXJQcmVzZXQgPT0gUkVWRVJCX1BSRVNFVF9OT05FKSB7CiAgICAgICAgIG1lbXNldChwQ29udGV4dC0+T3V0RnJhbWVzLCAwLAotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgKiBzaXplb2YoKnBDb250ZXh0LT5PdXRGcmFtZXMpICogRkNDXzIpOyAvL2Fsd2F5cyBzdGVyZW8gaGVyZQorICAgICAgICAgICAgICAgZnJhbWVDb3VudCAqIHNpemVvZigqcENvbnRleHQtPk91dEZyYW1lcykgKiBGQ0NfMik7ICAvLyBhbHdheXMgc3RlcmVvIGhlcmUKICAgICB9IGVsc2UgewotICAgICAgICBpZihwQ29udGV4dC0+YkVuYWJsZWQgPT0gTFZNX0ZBTFNFICYmIHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQgPiAwKSB7Ci0gICAgICAgICAgICBtZW1zZXQocENvbnRleHQtPkluRnJhbWVzLCAwLAotICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50ICogc2l6ZW9mKCpwQ29udGV4dC0+T3V0RnJhbWVzKSAqIGNoYW5uZWxzKTsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5iRW5hYmxlZCA9PSBMVk1fRkFMU0UgJiYgcENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1lbXNldChwQ29udGV4dC0+SW5GcmFtZXMsIDAsIGZyYW1lQ291bnQgKiBzaXplb2YoKnBDb250ZXh0LT5PdXRGcmFtZXMpICogY2hhbm5lbHMpOwogICAgICAgICAgICAgQUxPR1YoIlx0WmVyb2luZyAlZCBzYW1wbGVzIHBlciBmcmFtZSBhdCB0aGUgZW5kIG9mIGNhbGwiLCBjaGFubmVscyk7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBQcm9jZXNzIHRoZSBzYW1wbGVzLCBwcm9kdWNpbmcgYSBzdGVyZW8gb3V0cHV0ICovCi0gICAgICAgIEx2bVN0YXR1cyA9IExWUkVWX1Byb2Nlc3MocENvbnRleHQtPmhJbnN0YW5jZSwgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMsICAgICAvKiBJbnB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+T3V0RnJhbWVzLCAgICAvKiBPdXRwdXQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7ICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkICovCisgICAgICAgIEx2bVN0YXR1cyA9IExWUkVWX1Byb2Nlc3MocENvbnRleHQtPmhJbnN0YW5jZSwgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzLCAgLyogSW5wdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPk91dEZyYW1lcywgLyogT3V0cHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQpOyAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQgKi8KICAgICB9CiAKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfUHJvY2VzcyIsICJwcm9jZXNzIikKLSAgICBpZihMdm1TdGF0dXMgIT0gTFZSRVZfU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKEx2bVN0YXR1cyAhPSBMVlJFVl9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKIAogICAgIC8vIENvbnZlcnQgdG8gMTYgYml0cwogICAgIGlmIChwQ29udGV4dC0+YXV4aWxpYXJ5KSB7CiAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIEZDQ18yOyBpKyspIHsgLy8gYWx3YXlzIHN0ZXJlbyBoZXJlCi0gICAgICAgICAgICAvLyBNaXggd2l0aCBkcnkgaW5wdXQKLSAgICAgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXNbaV0gKz0gcEluW2ldOworICAgICAgICBpZiAoY2hhbm5lbHMgPj0gRkNDXzIpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy8gTWl4IHdpdGggZHJ5IGlucHV0CisgICAgICAgICAgICAgICAgcENvbnRleHQtPk91dEZyYW1lc1tGQ0NfMiAqIGldICs9IHBJbltjaGFubmVscyAqIGldOworICAgICAgICAgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXNbRkNDXzIgKiBpICsgMV0gKz0gcEluW2NoYW5uZWxzICogaSArIDFdOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAvLyBNaXggd2l0aCBkcnkgaW5wdXQKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+T3V0RnJhbWVzW0ZDQ18yICogaV0gKz0gcEluW2ldOworICAgICAgICAgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXNbRkNDXzIgKiBpICsgMV0gKz0gcEluW2ldOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIGFwcGx5IHZvbHVtZSB3aXRoIHJhbXAgaWYgbmVlZGVkCiAgICAgICAgIGlmICgocENvbnRleHQtPmxlZnRWb2x1bWUgIT0gcENvbnRleHQtPnByZXZMZWZ0Vm9sdW1lIHx8Ci0gICAgICAgICAgICAgICAgcENvbnRleHQtPnJpZ2h0Vm9sdW1lICE9IHBDb250ZXh0LT5wcmV2UmlnaHRWb2x1bWUpICYmCi0gICAgICAgICAgICAgICAgcENvbnRleHQtPnZvbHVtZU1vZGUgPT0gUkVWRVJCX1ZPTFVNRV9SQU1QKSB7CisgICAgICAgICAgICAgcENvbnRleHQtPnJpZ2h0Vm9sdW1lICE9IHBDb250ZXh0LT5wcmV2UmlnaHRWb2x1bWUpICYmCisgICAgICAgICAgICBwQ29udGV4dC0+dm9sdW1lTW9kZSA9PSBSRVZFUkJfVk9MVU1FX1JBTVApIHsKICAgICAgICAgICAgIC8vIEZJWE1FOiBzdGlsbCB1c2luZyBpbnQxNiB2b2x1bWVzLgogICAgICAgICAgICAgLy8gRm9yIHJlZmVyZW5jZTogUkVWRVJCX1VOSVRfVk9MVU1FICAoMHgxMDAwKSAvLyAxLjAgaW4gNC4xMiBmb3JtYXQKICAgICAgICAgICAgIGZsb2F0IHZsID0gKGZsb2F0KXBDb250ZXh0LT5wcmV2TGVmdFZvbHVtZSAvIDQwOTY7CkBAIC00NTAsMjAgKzQ1Niw1MSBAQAogICAgICAgICB9CiAgICAgfQogCi0KLSAgICAvLyBBY2N1bXVsYXRlIGlmIHJlcXVpcmVkCi0gICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSl7Ci0gICAgICAgIC8vQUxPR1YoIlx0QnVmZmVyIGFjY2VzcyBpcyBBQ0NVTVVMQVRFIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIEZDQ18yOyBpKyspIHsgLy8gYWx3YXlzIHN0ZXJlbyBoZXJlCi0gICAgICAgICAgICBwT3V0W2ldICs9IHBDb250ZXh0LT5PdXRGcmFtZXNbaV07CisgICAgaWYgKG91dENoYW5uZWxzID4gMikgeworICAgICAgICAvLyBBY2N1bXVsYXRlIGlmIHJlcXVpcmVkCisgICAgICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcE91dFtvdXRDaGFubmVscyAqIGldICs9IHBDb250ZXh0LT5PdXRGcmFtZXNbRkNDXzIgKiBpXTsKKyAgICAgICAgICAgICAgICBwT3V0W291dENoYW5uZWxzICogaSArIDFdICs9IHBDb250ZXh0LT5PdXRGcmFtZXNbRkNDXzIgKiBpICsgMV07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHBPdXRbb3V0Q2hhbm5lbHMgKiBpXSA9IHBDb250ZXh0LT5PdXRGcmFtZXNbRkNDXzIgKiBpXTsKKyAgICAgICAgICAgICAgICBwT3V0W291dENoYW5uZWxzICogaSArIDFdID0gcENvbnRleHQtPk91dEZyYW1lc1tGQ0NfMiAqIGkgKyAxXTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH1lbHNlewotICAgICAgICAvL0FMT0dWKCJcdEJ1ZmZlciBhY2Nlc3MgaXMgV1JJVEUiKTsKLSAgICAgICAgbWVtY3B5KHBPdXQsIHBDb250ZXh0LT5PdXRGcmFtZXMsIGZyYW1lQ291bnQgKiBzaXplb2YoKnBPdXQpICogRkNDXzIpOworICAgICAgICBpZiAoIXBDb250ZXh0LT5hdXhpbGlhcnkpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy8gY2hhbm5lbHMgYW5kIG91dENoYW5uZWxzIGFyZSBleHBlY3RlZCB0byBiZSBzYW1lLgorICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBGQ0NfMjsgaiA8IG91dENoYW5uZWxzOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcE91dFtvdXRDaGFubmVscyAqIGkgKyBqXSA9IHBJbltvdXRDaGFubmVscyAqIGkgKyBqXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CisgICAgICAgICAgICBpZiAob3V0Q2hhbm5lbHMgPT0gRkNDXzEpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBwT3V0W2ldICs9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwQ29udGV4dC0+T3V0RnJhbWVzW2kgKiBGQ0NfMl0gKyBwQ29udGV4dC0+T3V0RnJhbWVzW2kgKiBGQ0NfMiArIDFdKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50ICogRkNDXzI7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBwT3V0W2ldICs9IHBDb250ZXh0LT5PdXRGcmFtZXNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG91dENoYW5uZWxzID09IEZDQ18xKSB7CisgICAgICAgICAgICAgICAgRnJvbTJpVG9Nb25vX0Zsb2F0KChjb25zdCBwcm9jZXNzX2J1ZmZlcl90KilwQ29udGV4dC0+T3V0RnJhbWVzLCBwT3V0LCBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHBPdXQsIHBDb250ZXh0LT5PdXRGcmFtZXMsIGZyYW1lQ291bnQgKiBzaXplb2YoKnBPdXQpICogRkNDXzIpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIDA7Ci19ICAgIC8qIGVuZCBwcm9jZXNzICovCit9IC8qIGVuZCBwcm9jZXNzICovCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gUmV2ZXJiX2ZyZWUoKQpAQCAtNDc3LDMwICs1MTQsMTIgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotdm9pZCBSZXZlcmJfZnJlZShSZXZlcmJDb250ZXh0ICpwQ29udGV4dCl7Cit2b2lkIFJldmVyYl9mcmVlKFJldmVyYkNvbnRleHQqIHBDb250ZXh0KSB7CisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKLSAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCi0gICAgTFZSRVZfTWVtb3J5VGFibGVfc3QgICAgICBNZW1UYWI7Ci0KLSAgICAvKiBGcmVlIHRoZSBhbGdvcml0aG0gbWVtb3J5ICovCi0gICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0TWVtb3J5VGFibGUocENvbnRleHQtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lbVRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOwotCi0gICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRNZW1vcnlUYWJsZSIsICJSZXZlcmJfZnJlZSIpCi0KLSAgICBmb3IgKGludCBpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspewotICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5TaXplICE9IDApewotICAgICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzICE9IE5VTEwpewotICAgICAgICAgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogZnJlZSgpIC0gdHJ5aW5nIHRvIGZyZWUgd2l0aCBOVUxMIHBvaW50ZXIgJSIgUFJJdTMyICIgYnl0ZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgImZvciByZWdpb24gJXUgYXQgJXAgRVJST1JcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0gICAgLyogZW5kIFJldmVyYl9mcmVlICovCisgICAgTHZtU3RhdHVzID0gTFZSRVZfRnJlZUluc3RhbmNlKHBDb250ZXh0LT5oSW5zdGFuY2UpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9GcmVlSW5zdGFuY2UiLCAiUmV2ZXJiX2ZyZWUiKQorfSAvKiBlbmQgUmV2ZXJiX2ZyZWUgKi8KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBSZXZlcmJfc2V0Q29uZmlnKCkKQEAgLTUxNiw4OSArNTM1LDU5IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBSZXZlcmJfc2V0Q29uZmlnKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpewotICAgIExWTV9Gc19lbiAgIFNhbXBsZVJhdGU7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0Q29uZmlnIHN0YXJ0Iik7CitpbnQgUmV2ZXJiX3NldENvbmZpZyhSZXZlcmJDb250ZXh0KiBwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190KiBwQ29uZmlnKSB7CisgICAgTFZNX0ZzX2VuIFNhbXBsZVJhdGU7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldENvbmZpZyBzdGFydCIpOwogCiAgICAgQ0hFQ0tfQVJHKHBDb250ZXh0ICE9IE5VTEwpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnICE9IE5VTEwpOwogCiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQpOworICAgIGludCBpbnB1dENoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKICAgICBDSEVDS19BUkcoKHBDb250ZXh0LT5hdXhpbGlhcnkgJiYgcENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTykgfHwKLSAgICAgICAgICAgICAgKCghcENvbnRleHQtPmF1eGlsaWFyeSkgJiYgcENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSk7Ci0gICAgQ0hFQ0tfQVJHKHBDb25maWctPm91dHB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOwotICAgIENIRUNLX0FSRyhwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURQotICAgICAgICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKTsKKyAgICAgICAgICAgICAgKCghcENvbnRleHQtPmF1eGlsaWFyeSkgJiYgKGlucHV0Q2hhbm5lbHMgPD0gTFZNX01BWF9DSEFOTkVMUykpKTsKKyAgICBpbnQgb3V0cHV0Q2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICBDSEVDS19BUkcob3V0cHV0Q2hhbm5lbHMgPD0gTFZNX01BWF9DSEFOTkVMUyk7CisgICAgQ0hFQ0tfQVJHKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFIHx8CisgICAgICAgICAgICAgIHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gRUZGRUNUX0JVRkZFUl9GT1JNQVQpOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldENvbmZpZyBjYWxsaW5nIG1lbWNweSIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRDb25maWcgY2FsbGluZyBtZW1jcHkiKTsKICAgICBwQ29udGV4dC0+Y29uZmlnID0gKnBDb25maWc7CiAKLSAgICBzd2l0Y2ggKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgewotICAgIGNhc2UgODAwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184MDAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDE2MDAwOgotICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE2MDAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDIyMDUwOgotICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzIyMDUwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDMyMDAwOgotICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzMyMDAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDQ0MTAwOgotICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDQ4MDAwOgotICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzQ4MDAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDg4MjAwOgotICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzg4MjAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDk2MDAwOgotICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzk2MDAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDE3NjQwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xNzY0MDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTkyMDAwOgotICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE5MjAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1YoIlxyUmV2ZXJiX3NldENvbmZpZyBpbnZhbGlkIHNhbXBsaW5nIHJhdGUgJWQiLCBwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpOworICAgIFNhbXBsZVJhdGUgPSBsdm1Gc0ZvclNhbXBsZVJhdGUocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlKTsKKyAgICBpZiAoU2FtcGxlUmF0ZSA9PSBMVk1fRlNfSU5WQUxJRCkgeworICAgICAgICBBTE9HRSgiUmV2ZXJiX3NldENvbmZpZyBpbnZhbGlkIHNhbXBsaW5nIHJhdGUgJWQiLCBwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKICAgICBpZiAocENvbnRleHQtPlNhbXBsZVJhdGUgIT0gU2FtcGxlUmF0ZSkgeworICAgICAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IEFjdGl2ZVBhcmFtczsKKyAgICAgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7CiAKLSAgICAgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7Ci0gICAgICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsKLQotICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRDb25maWcgY2hhbmdlIHNhbXBsaW5nIHJhdGUgdG8gJWQiLCBTYW1wbGVSYXRlKTsKKyAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldENvbmZpZyBjaGFuZ2Ugc2FtcGxpbmcgcmF0ZSB0byAlZCIsIFNhbXBsZVJhdGUpOwogCiAgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwotICAgICAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWN0aXZlUGFyYW1zKTsKKyAgICAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAKICAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYl9zZXRDb25maWciKQotICAgICAgICBpZihMdm1TdGF0dXMgIT0gTFZSRVZfU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIGlmIChMdm1TdGF0dXMgIT0gTFZSRVZfU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKICAgICAgICAgQWN0aXZlUGFyYW1zLlNhbXBsZVJhdGUgPSBTYW1wbGVSYXRlOwogCiAgICAgICAgIEx2bVN0YXR1cyA9IExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogCiAgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJfc2V0Q29uZmlnIikKLSAgICAgICAgaWYoTHZtU3RhdHVzICE9IExWUkVWX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwotICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRDb25maWcgU3VjY2VzZnVsbHkgY2FsbGVkIExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAgICAgaWYgKEx2bVN0YXR1cyAhPSBMVlJFVl9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldENvbmZpZyBTdWNjZXNzZnVsbHkgY2FsbGVkIExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKICAgICAgICAgcENvbnRleHQtPlNhbXBsZVJhdGUgPSBTYW1wbGVSYXRlOwotICAgIH1lbHNlewotICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRDb25maWcga2VlcCBzYW1wbGluZyByYXRlIGF0ICVkIiwgU2FtcGxlUmF0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldENvbmZpZyBrZWVwIHNhbXBsaW5nIHJhdGUgYXQgJWQiLCBTYW1wbGVSYXRlKTsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRDb25maWcgRW5kIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldENvbmZpZyBFbmQiKTsKICAgICByZXR1cm4gMDsKLX0gICAvKiBlbmQgUmV2ZXJiX3NldENvbmZpZyAqLworfSAvKiBlbmQgUmV2ZXJiX3NldENvbmZpZyAqLwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFJldmVyYl9nZXRDb25maWcoKQpAQCAtNjE0LDEwICs2MDMsOSBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi12b2lkIFJldmVyYl9nZXRDb25maWcoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCAqcENvbmZpZykKLXsKK3ZvaWQgUmV2ZXJiX2dldENvbmZpZyhSZXZlcmJDb250ZXh0KiBwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190KiBwQ29uZmlnKSB7CiAgICAgKnBDb25maWcgPSBwQ29udGV4dC0+Y29uZmlnOwotfSAgIC8qIGVuZCBSZXZlcmJfZ2V0Q29uZmlnICovCit9IC8qIGVuZCBSZXZlcmJfZ2V0Q29uZmlnICovCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gUmV2ZXJiX2luaXQoKQpAQCAtNjMxLDM1ICs2MTksMzUgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IFJldmVyYl9pbml0KFJldmVyYkNvbnRleHQgKnBDb250ZXh0KXsKK2ludCBSZXZlcmJfaW5pdChSZXZlcmJDb250ZXh0KiBwQ29udGV4dCkgewogICAgIEFMT0dWKCJcdFJldmVyYl9pbml0IHN0YXJ0Iik7CiAKICAgICBDSEVDS19BUkcocENvbnRleHQgIT0gTlVMTCk7CiAKLSAgICBpZiAocENvbnRleHQtPmhJbnN0YW5jZSAhPSBOVUxMKXsKKyAgICBpZiAocENvbnRleHQtPmhJbnN0YW5jZSAhPSBOVUxMKSB7CiAgICAgICAgIFJldmVyYl9mcmVlKHBDb250ZXh0KTsKICAgICB9CiAKLSAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOwogICAgIGlmIChwQ29udGV4dC0+YXV4aWxpYXJ5KSB7Ci0gICAgICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgICAgICAgICAgICAgICAgICA9IEFVRElPX0NIQU5ORUxfT1VUX01PTk87CisgICAgICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9NT05POwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgICAgICAgICAgICAgICAgICA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKICAgICB9Ci0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOwotICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlICAgICAgICAgICAgICAgICAgPSA0NDEwMDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAgICAgID0gTlVMTDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgID0gTlVMTDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSAgICAgICAgID0gTlVMTDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLm1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0NPTkZJR19BTEw7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlICAgICAgICAgICAgICAgICA9IDQ0MTAwOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAgICAgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgICAgICAgID0gTlVMTDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5tYXNrICAgICAgICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0NPTkZJR19BTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CiAKICAgICBwQ29udGV4dC0+bGVmdFZvbHVtZSA9IFJFVkVSQl9VTklUX1ZPTFVNRTsKICAgICBwQ29udGV4dC0+cmlnaHRWb2x1bWUgPSBSRVZFUkJfVU5JVF9WT0xVTUU7CkBAIC02NjcsMTIzICs2NTUsNzUgQEAKICAgICBwQ29udGV4dC0+cHJldlJpZ2h0Vm9sdW1lID0gUkVWRVJCX1VOSVRfVk9MVU1FOwogICAgIHBDb250ZXh0LT52b2x1bWVNb2RlID0gUkVWRVJCX1ZPTFVNRV9GTEFUOwogCi0gICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCi0gICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBwYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWUkVWX0luc3RhbmNlUGFyYW1zX3N0ICAgSW5zdFBhcmFtczsgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwYXJhbWV0ZXJzICovCi0gICAgTFZSRVZfTWVtb3J5VGFibGVfc3QgICAgICBNZW1UYWI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICBiTWFsbG9jRmFpbHVyZSA9IExWTV9GQUxTRTsKKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IHBhcmFtczsgICAgICAgICAgICAgICAgICAgLyogQ29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3QgSW5zdFBhcmFtczsgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KIAogICAgIC8qIFNldCB0aGUgY2FwYWJpbGl0aWVzICovCi0gICAgSW5zdFBhcmFtcy5NYXhCbG9ja1NpemUgID0gTUFYX0NBTExfU0laRTsKLSAgICBJbnN0UGFyYW1zLlNvdXJjZUZvcm1hdCAgPSBMVk1fU1RFUkVPOyAgICAgICAgICAvLyBNYXggZm9ybWF0LCBjb3VsZCBiZSBtb25vIGR1cmluZyBwcm9jZXNzCi0gICAgSW5zdFBhcmFtcy5OdW1EZWxheXMgICAgID0gTFZSRVZfREVMQVlMSU5FU180OwotCi0gICAgLyogQWxsb2NhdGUgbWVtb3J5LCBmb3JjaW5nIGFsaWdubWVudCAqLwotICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldE1lbW9yeVRhYmxlKExWTV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNZW1UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkluc3RQYXJhbXMpOwotCi0gICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldE1lbW9yeVRhYmxlIiwgIlJldmVyYl9pbml0IikKLSAgICBpZihMdm1TdGF0dXMgIT0gTFZSRVZfU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7Ci0KLSAgICBBTE9HVigiXHRDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX0dldE1lbW9yeVRhYmxlXG4iKTsKLQotICAgIC8qIEFsbG9jYXRlIG1lbW9yeSAqLwotICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7Ci0gICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCl7Ci0gICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9IG1hbGxvYyhNZW1UYWIuUmVnaW9uW2ldLlNpemUpOwotCi0gICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWUkVWX0VSUk9SIDpSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgJSIgUFJJdTMyCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXVcbiIsIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSApOwotICAgICAgICAgICAgICAgIGJNYWxsb2NGYWlsdXJlID0gTFZNX1RSVUU7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBhbGxvY2F0ZSAlIiBQUkl1MzIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogSWYgb25lIG9yIG1vcmUgb2YgdGhlIG1lbW9yeSByZWdpb25zIGZhaWxlZCB0byBhbGxvY2F0ZSwgZnJlZSB0aGUgcmVnaW9ucyB0aGF0IHdlcmUKLSAgICAgKiBzdWNjZXNmdWxseSBhbGxvY2F0ZWQgYW5kIHJldHVybiB3aXRoIGFuIGVycm9yCi0gICAgICovCi0gICAgaWYoYk1hbGxvY0ZhaWx1cmUgPT0gTFZNX1RSVUUpewotICAgICAgICBmb3IgKGludCBpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspewotICAgICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID09IExWTV9OVUxMKXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOlJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlIiBQUkl1MzIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSAtIE5vdCBmcmVlaW5nXG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkOiBidXQgYWxsb2NhdGVkICUiIFBSSXUzMgotICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwLSBmcmVlXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIEFMT0dWKCJcdFJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IG1hbGxvYydkIG1lbW9yeVxuIik7CisgICAgSW5zdFBhcmFtcy5NYXhCbG9ja1NpemUgPSBNQVhfQ0FMTF9TSVpFOworICAgIEluc3RQYXJhbXMuU291cmNlRm9ybWF0ID0gTFZNX1NURVJFTzsgIC8vIE1heCBmb3JtYXQsIGNvdWxkIGJlIG1vbm8gZHVyaW5nIHByb2Nlc3MKKyAgICBJbnN0UGFyYW1zLk51bURlbGF5cyA9IExWUkVWX0RFTEFZTElORVNfNDsKIAogICAgIC8qIEluaXRpYWxpc2UgKi8KICAgICBwQ29udGV4dC0+aEluc3RhbmNlID0gTFZNX05VTEw7CiAKICAgICAvKiBJbml0IHNldHMgdGhlIGluc3RhbmNlIGhhbmRsZSAqLwotICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldEluc3RhbmNlSGFuZGxlKCZwQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNZW1UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkluc3RQYXJhbXMpOworICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldEluc3RhbmNlSGFuZGxlKCZwQ29udGV4dC0+aEluc3RhbmNlLCAmSW5zdFBhcmFtcyk7CiAKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldEluc3RhbmNlSGFuZGxlIiwgIlJldmVyYl9pbml0IikKLSAgICBpZihMdm1TdGF0dXMgIT0gTFZSRVZfU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKEx2bVN0YXR1cyAhPSBMVlJFVl9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKIAotICAgIEFMT0dWKCJcdFJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fR2V0SW5zdGFuY2VIYW5kbGVcbiIpOworICAgIEFMT0dWKCJcdFJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc3NmdWxseSBjYWxsZWQgTFZNX0dldEluc3RhbmNlSGFuZGxlXG4iKTsKIAogICAgIC8qIFNldCB0aGUgaW5pdGlhbCBwcm9jZXNzIHBhcmFtZXRlcnMgKi8KICAgICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KLSAgICBwYXJhbXMuT3BlcmF0aW5nTW9kZSAgPSBMVk1fTU9ERV9PTjsKLSAgICBwYXJhbXMuU2FtcGxlUmF0ZSAgICAgPSBMVk1fRlNfNDQxMDA7Ci0gICAgcENvbnRleHQtPlNhbXBsZVJhdGUgID0gTFZNX0ZTXzQ0MTAwOworICAgIHBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT047CisgICAgcGFyYW1zLlNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7CisgICAgcENvbnRleHQtPlNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7CiAKLSAgICBpZihwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8pewotICAgICAgICBwYXJhbXMuU291cmNlRm9ybWF0ICAgPSBMVk1fTU9OTzsKKyAgICBpZiAocENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PKSB7CisgICAgICAgIHBhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVk1fTU9OTzsKICAgICB9IGVsc2UgewotICAgICAgICBwYXJhbXMuU291cmNlRm9ybWF0ICAgPSBMVk1fU1RFUkVPOworICAgICAgICBwYXJhbXMuU291cmNlRm9ybWF0ID0gTFZNX1NURVJFTzsKICAgICB9CiAKKyAgICBpZiAoKHBDb250ZXh0LT5hdXhpbGlhcnkgPT0gZmFsc2UpICYmIChwYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKSkgeworICAgICAgICBwYXJhbXMuU291cmNlRm9ybWF0ID0gTFZNX1NURVJFTzsKKyAgICB9CiAgICAgLyogUmV2ZXJiIHBhcmFtZXRlcnMgKi8KLSAgICBwYXJhbXMuTGV2ZWwgICAgICAgICAgPSAwOwotICAgIHBhcmFtcy5MUEYgICAgICAgICAgICA9IDIzOTk5OwotICAgIHBhcmFtcy5IUEYgICAgICAgICAgICA9IDUwOwotICAgIHBhcmFtcy5UNjAgICAgICAgICAgICA9IDE0OTA7Ci0gICAgcGFyYW1zLkRlbnNpdHkgICAgICAgID0gMTAwOwotICAgIHBhcmFtcy5EYW1waW5nICAgICAgICA9IDIxOwotICAgIHBhcmFtcy5Sb29tU2l6ZSAgICAgICA9IDEwMDsKKyAgICBwYXJhbXMuTGV2ZWwgPSAwOworICAgIHBhcmFtcy5MUEYgPSAyMzk5OTsKKyAgICBwYXJhbXMuSFBGID0gNTA7CisgICAgcGFyYW1zLlQ2MCA9IDE0OTA7CisgICAgcGFyYW1zLkRlbnNpdHkgPSAxMDA7CisgICAgcGFyYW1zLkRhbXBpbmcgPSAyMTsKKyAgICBwYXJhbXMuUm9vbVNpemUgPSAxMDA7CiAKLSAgICBwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50ID0gKHBhcmFtcy5UNjAgKiBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSkvMTAwMDsKKyAgICBwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50ID0gKHBhcmFtcy5UNjAgKiBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgLyAxMDAwOwogCiAgICAgLyogU2F2ZWQgc3RyZW5ndGggaXMgdXNlZCB0byByZXR1cm4gdGhlIGV4YWN0IHN0cmVuZ3RoIHRoYXQgd2FzIHVzZWQgaW4gdGhlIHNldCB0byB0aGUgZ2V0CiAgICAgICogYmVjYXVzZSB3ZSBtYXAgdGhlIG9yaWdpbmFsIHN0cmVuZ3RoIHJhbmdlIG9mIDA6MTAwMCB0byAxOjE1LCBhbmQgdGhpcyB3aWxsIGF2b2lkCiAgICAgICogcXVhbnRpc2F0aW9uIGxpa2UgZWZmZWN0IHdoZW4gcmV0dXJuaW5nCiAgICAgICovCi0gICAgcENvbnRleHQtPlNhdmVkUm9vbUxldmVsICAgID0gLTYwMDA7Ci0gICAgcENvbnRleHQtPlNhdmVkSGZMZXZlbCAgICAgID0gMDsKLSAgICBwQ29udGV4dC0+YkVuYWJsZWQgICAgICAgICAgPSBMVk1fRkFMU0U7Ci0gICAgcENvbnRleHQtPlNhdmVkRGVjYXlUaW1lICAgID0gcGFyYW1zLlQ2MDsKLSAgICBwQ29udGV4dC0+U2F2ZWREZWNheUhmUmF0aW8gPSBwYXJhbXMuRGFtcGluZyoyMDsKLSAgICBwQ29udGV4dC0+U2F2ZWREZW5zaXR5ICAgICAgPSBwYXJhbXMuUm9vbVNpemUqMTA7Ci0gICAgcENvbnRleHQtPlNhdmVkRGlmZnVzaW9uICAgID0gcGFyYW1zLkRlbnNpdHkqMTA7Ci0gICAgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwgID0gLTYwMDA7CisgICAgcENvbnRleHQtPlNhdmVkUm9vbUxldmVsID0gLTYwMDA7CisgICAgcENvbnRleHQtPlNhdmVkSGZMZXZlbCA9IDA7CisgICAgcENvbnRleHQtPmJFbmFibGVkID0gTFZNX0ZBTFNFOworICAgIHBDb250ZXh0LT5TYXZlZERlY2F5VGltZSA9IHBhcmFtcy5UNjA7CisgICAgcENvbnRleHQtPlNhdmVkRGVjYXlIZlJhdGlvID0gcGFyYW1zLkRhbXBpbmcgKiAyMDsKKyAgICBwQ29udGV4dC0+U2F2ZWREZW5zaXR5ID0gcGFyYW1zLlJvb21TaXplICogMTA7CisgICAgcENvbnRleHQtPlNhdmVkRGlmZnVzaW9uID0gcGFyYW1zLkRlbnNpdHkgKiAxMDsKKyAgICBwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCA9IC02MDAwOwogCiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KLSAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmcGFyYW1zKTsKIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJfaW5pdCIpCi0gICAgaWYoTHZtU3RhdHVzICE9IExWUkVWX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZSRVZfU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBBTE9HVigiXHRSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIEFMT0dWKCJcdFJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc3NmdWxseSBjYWxsZWQgTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwogICAgIEFMT0dWKCJcdFJldmVyYl9pbml0IEVuZCIpOwogICAgIHJldHVybiAwOwotfSAgIC8qIGVuZCBSZXZlcmJfaW5pdCAqLworfSAvKiBlbmQgUmV2ZXJiX2luaXQgKi8KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBSZXZlcmJDb252ZXJ0TGV2ZWwoKQpAQCAtNzk2LDI3ICs3MzYsMjEgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50MTZfdCBSZXZlcmJDb252ZXJ0TGV2ZWwoaW50MTZfdCBsZXZlbCl7Ci0gICAgc3RhdGljIGludDE2X3QgTGV2ZWxBcnJheVsxMDFdID0KLSAgICB7Ci0gICAgICAgLTEyMDAwLCAtNDAwMCwgIC0zMzk4LCAgLTMwNDYsICAtMjc5NiwgIC0yNjAzLCAgLTI0NDQsICAtMjMxMCwgIC0yMTk0LCAgLTIwOTIsCi0gICAgICAgLTIwMDAsICAtMTkxOCwgIC0xODQyLCAgLTE3NzMsICAtMTcwOCwgIC0xNjQ4LCAgLTE1OTIsICAtMTU0MCwgIC0xNDkwLCAgLTE0NDMsCi0gICAgICAgLTEzOTgsICAtMTM1NiwgIC0xMzE2LCAgLTEyNzcsICAtMTI0MCwgIC0xMjA1LCAgLTExNzEsICAtMTEzOCwgIC0xMTA2LCAgLTEwNzYsCi0gICAgICAgLTEwNDYsICAtMTAxOCwgIC05OTAsICAgLTk2MywgICAtOTM4LCAgIC05MTIsICAgLTg4OCwgICAtODY0LCAgIC04NDEsICAgLTgxOCwKLSAgICAgICAtNzk2LCAgIC03NzUsICAgLTc1NCwgICAtNzM0LCAgIC03MTQsICAgLTY5NCwgICAtNjc1LCAgIC02NTYsICAgLTYzOCwgICAtNjIwLAotICAgICAgIC02MDMsICAgLTU4NSwgICAtNTY4LCAgIC01NTIsICAgLTUzNiwgICAtNTIwLCAgIC01MDQsICAgLTQ4OSwgICAtNDc0LCAgIC00NTksCi0gICAgICAgLTQ0NCwgICAtNDMwLCAgIC00MTYsICAgLTQwMiwgICAtMzg4LCAgIC0zNzUsICAgLTM2MSwgICAtMzQ4LCAgIC0zMzUsICAgLTMyMywKLSAgICAgICAtMzEwLCAgIC0yOTgsICAgLTI4NiwgICAtMjc0LCAgIC0yNjIsICAgLTI1MCwgICAtMjM5LCAgIC0yMjgsICAgLTIxNiwgICAtMjA1LAotICAgICAgIC0xOTQsICAgLTE4NCwgICAtMTczLCAgIC0xNjIsICAgLTE1MiwgICAtMTQyLCAgIC0xMzIsICAgLTEyMSwgICAtMTEyLCAgIC0xMDIsCi0gICAgICAgLTkyLCAgICAtODIsICAgIC03MywgICAgLTY0LCAgICAtNTQsICAgIC00NSwgICAgLTM2LCAgICAtMjcsICAgIC0xOCwgICAgLTksCi0gICAgICAgMAotICAgIH07CitpbnQxNl90IFJldmVyYkNvbnZlcnRMZXZlbChpbnQxNl90IGxldmVsKSB7CisgICAgc3RhdGljIGludDE2X3QgTGV2ZWxBcnJheVsxMDFdID0geworICAgICAgICAgICAgLTEyMDAwLCAtNDAwMCwgLTMzOTgsIC0zMDQ2LCAtMjc5NiwgLTI2MDMsIC0yNDQ0LCAtMjMxMCwgLTIxOTQsIC0yMDkyLCAtMjAwMCwgLTE5MTgsCisgICAgICAgICAgICAtMTg0MiwgIC0xNzczLCAtMTcwOCwgLTE2NDgsIC0xNTkyLCAtMTU0MCwgLTE0OTAsIC0xNDQzLCAtMTM5OCwgLTEzNTYsIC0xMzE2LCAtMTI3NywKKyAgICAgICAgICAgIC0xMjQwLCAgLTEyMDUsIC0xMTcxLCAtMTEzOCwgLTExMDYsIC0xMDc2LCAtMTA0NiwgLTEwMTgsIC05OTAsICAtOTYzLCAgLTkzOCwgIC05MTIsCisgICAgICAgICAgICAtODg4LCAgIC04NjQsICAtODQxLCAgLTgxOCwgIC03OTYsICAtNzc1LCAgLTc1NCwgIC03MzQsICAtNzE0LCAgLTY5NCwgIC02NzUsICAtNjU2LAorICAgICAgICAgICAgLTYzOCwgICAtNjIwLCAgLTYwMywgIC01ODUsICAtNTY4LCAgLTU1MiwgIC01MzYsICAtNTIwLCAgLTUwNCwgIC00ODksICAtNDc0LCAgLTQ1OSwKKyAgICAgICAgICAgIC00NDQsICAgLTQzMCwgIC00MTYsICAtNDAyLCAgLTM4OCwgIC0zNzUsICAtMzYxLCAgLTM0OCwgIC0zMzUsICAtMzIzLCAgLTMxMCwgIC0yOTgsCisgICAgICAgICAgICAtMjg2LCAgIC0yNzQsICAtMjYyLCAgLTI1MCwgIC0yMzksICAtMjI4LCAgLTIxNiwgIC0yMDUsICAtMTk0LCAgLTE4NCwgIC0xNzMsICAtMTYyLAorICAgICAgICAgICAgLTE1MiwgICAtMTQyLCAgLTEzMiwgIC0xMjEsICAtMTEyLCAgLTEwMiwgIC05MiwgICAtODIsICAgLTczLCAgIC02NCwgICAtNTQsICAgLTQ1LAorICAgICAgICAgICAgLTM2LCAgICAtMjcsICAgLTE4LCAgIC05LCAgICAwfTsKICAgICBpbnQxNl90IGk7CiAKLSAgICBmb3IoaSA9IDA7IGkgPCAxMDE7IGkrKykKLSAgICB7Ci0gICAgICAgaWYobGV2ZWwgPD0gTGV2ZWxBcnJheVtpXSkKLSAgICAgICAgICAgYnJlYWs7CisgICAgZm9yIChpID0gMDsgaSA8IDEwMTsgaSsrKSB7CisgICAgICAgIGlmIChsZXZlbCA8PSBMZXZlbEFycmF5W2ldKSBicmVhazsKICAgICB9CiAgICAgcmV0dXJuIGk7CiB9CkBAIC04MzIsMzcgKzc2NiwzMSBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQxNl90IFJldmVyYkNvbnZlcnRIZkxldmVsKGludDE2X3QgSGZsZXZlbCl7CitpbnQxNl90IFJldmVyYkNvbnZlcnRIZkxldmVsKGludDE2X3QgSGZsZXZlbCkgewogICAgIGludDE2X3QgaTsKIAotICAgIHN0YXRpYyBMUEZQYWlyX3QgTFBGQXJyYXlbOTddID0KLSAgICB7ICAgLy8gTGltaXQgcmFuZ2UgdG8gNTAgZm9yIExWUkVWIHBhcmFtZXRlciByYW5nZQotICAgICAgICB7LTEwMDAwLCA1MH0sIHsgLTUwMDAsIDUwIH0sIHsgLTQwMDAsIDUwfSwgIHsgLTMwMDAsIDE1OH0sIHsgLTIwMDAsIDUwMn0sCi0gICAgICAgIHstMTAwMCwgMTY2Nn0seyAtOTAwLCAxODk3fSwgeyAtODAwLCAyMTY5fSwgeyAtNzAwLCAyNDk2fSwgeyAtNjAwLCAyODk1fSwKLSAgICAgICAgey01MDAsIDM0MDB9LCB7IC00MDAsIDQwNjZ9LCB7IC0zMDAsIDUwMTF9LCB7IC0yMDAsIDY1Mzd9LCB7IC0xMDAsICA5ODI2fSwKLSAgICAgICAgey05OSwgOTg4MSB9LCB7IC05OCwgOTkzNyB9LCB7IC05NywgOTk5NCB9LCB7IC05NiwgMTAwNTJ9LCB7IC05NSwgMTAxMTF9LAotICAgICAgICB7LTk0LCAxMDE3MX0sIHsgLTkzLCAxMDIzMX0sIHsgLTkyLCAxMDI5M30sIHsgLTkxLCAxMDM1Nn0sIHsgLTkwLCAxMDQxOX0sCi0gICAgICAgIHstODksIDEwNDg0fSwgeyAtODgsIDEwNTQ5fSwgeyAtODcsIDEwNjE2fSwgeyAtODYsIDEwNjg0fSwgeyAtODUsIDEwNzUzfSwKLSAgICAgICAgey04NCwgMTA4MjN9LCB7IC04MywgMTA4OTV9LCB7IC04MiwgMTA5Njh9LCB7IC04MSwgMTEwNDJ9LCB7IC04MCwgMTExMTd9LAotICAgICAgICB7LTc5LCAxMTE5NH0sIHsgLTc4LCAxMTI3Mn0sIHsgLTc3LCAxMTM1Mn0sIHsgLTc2LCAxMTQzM30sIHsgLTc1LCAxMTUxNn0sCi0gICAgICAgIHstNzQsIDExNjAwfSwgeyAtNzMsIDExNjg2fSwgeyAtNzIsIDExNzc0fSwgeyAtNzEsIDExODY0fSwgeyAtNzAsIDExOTU1fSwKLSAgICAgICAgey02OSwgMTIwNDl9LCB7IC02OCwgMTIxNDR9LCB7IC02NywgMTIyNDJ9LCB7IC02NiwgMTIzNDF9LCB7IC02NSwgMTI0NDN9LAotICAgICAgICB7LTY0LCAxMjU0OH0sIHsgLTYzLCAxMjY1NH0sIHsgLTYyLCAxMjc2M30sIHsgLTYxLCAxMjg3NX0sIHsgLTYwLCAxMjk5MH0sCi0gICAgICAgIHstNTksIDEzMTA3fSwgeyAtNTgsIDEzMjI3fSwgeyAtNTcsIDEzMzUxfSwgeyAtNTYsIDEzNDc3fSwgeyAtNTUsIDEzNjA3fSwKLSAgICAgICAgey01NCwgMTM3NDF9LCB7IC01MywgMTM4Nzh9LCB7IC01MiwgMTQwMTl9LCB7IC01MSwgMTQxNjR9LCB7IC01MCwgMTQzMTN9LAotICAgICAgICB7LTQ5LCAxNDQ2N30sIHsgLTQ4LCAxNDYyNn0sIHsgLTQ3LCAxNDc4OX0sIHsgLTQ2LCAxNDk1OH0sIHsgLTQ1LCAxNTEzMn0sCi0gICAgICAgIHstNDQsIDE1MzEyfSwgeyAtNDMsIDE1NDk4fSwgeyAtNDIsIDE1NjkxfSwgeyAtNDEsIDE1ODkwfSwgeyAtNDAsIDE2MDk3fSwKLSAgICAgICAgey0zOSwgMTYzMTF9LCB7IC0zOCwgMTY1MzR9LCB7IC0zNywgMTY3NjZ9LCB7IC0zNiwgMTcwMDd9LCB7IC0zNSwgMTcyNTl9LAotICAgICAgICB7LTM0LCAxNzUyMX0sIHsgLTMzLCAxNzc5NX0sIHsgLTMyLCAxODA4MX0sIHsgLTMxLCAxODM4MX0sIHsgLTMwLCAxODY5Nn0sCi0gICAgICAgIHstMjksIDE5MDI3fSwgeyAtMjgsIDE5Mzc1fSwgeyAtMjcsIDE5NzQyfSwgeyAtMjYsIDIwMTI5fSwgeyAtMjUsIDIwNTQwfSwKLSAgICAgICAgey0yNCwgMjA5NzZ9LCB7IC0yMywgMjE0Mzl9LCB7IC0yMiwgMjE5MzR9LCB7IC0yMSwgMjI0NjN9LCB7IC0yMCwgMjMwMzF9LAotICAgICAgICB7LTE5LCAyMzY0M30sIHsgLTE4LCAyMzk5OX0KLSAgICB9OworICAgIHN0YXRpYyBMUEZQYWlyX3QgTFBGQXJyYXlbOTddID0geworICAgICAgICAgICAgLy8gTGltaXQgcmFuZ2UgdG8gNTAgZm9yIExWUkVWIHBhcmFtZXRlciByYW5nZQorICAgICAgICAgICAgey0xMDAwMCwgNTB9LCB7LTUwMDAsIDUwfSwgIHstNDAwMCwgNTB9LCAgey0zMDAwLCAxNTh9LCB7LTIwMDAsIDUwMn0sIHstMTAwMCwgMTY2Nn0sCisgICAgICAgICAgICB7LTkwMCwgMTg5N30sIHstODAwLCAyMTY5fSwgey03MDAsIDI0OTZ9LCB7LTYwMCwgMjg5NX0sIHstNTAwLCAzNDAwfSwgey00MDAsIDQwNjZ9LAorICAgICAgICAgICAgey0zMDAsIDUwMTF9LCB7LTIwMCwgNjUzN30sIHstMTAwLCA5ODI2fSwgey05OSwgOTg4MX0sICB7LTk4LCA5OTM3fSwgIHstOTcsIDk5OTR9LAorICAgICAgICAgICAgey05NiwgMTAwNTJ9LCB7LTk1LCAxMDExMX0sIHstOTQsIDEwMTcxfSwgey05MywgMTAyMzF9LCB7LTkyLCAxMDI5M30sIHstOTEsIDEwMzU2fSwKKyAgICAgICAgICAgIHstOTAsIDEwNDE5fSwgey04OSwgMTA0ODR9LCB7LTg4LCAxMDU0OX0sIHstODcsIDEwNjE2fSwgey04NiwgMTA2ODR9LCB7LTg1LCAxMDc1M30sCisgICAgICAgICAgICB7LTg0LCAxMDgyM30sIHstODMsIDEwODk1fSwgey04MiwgMTA5Njh9LCB7LTgxLCAxMTA0Mn0sIHstODAsIDExMTE3fSwgey03OSwgMTExOTR9LAorICAgICAgICAgICAgey03OCwgMTEyNzJ9LCB7LTc3LCAxMTM1Mn0sIHstNzYsIDExNDMzfSwgey03NSwgMTE1MTZ9LCB7LTc0LCAxMTYwMH0sIHstNzMsIDExNjg2fSwKKyAgICAgICAgICAgIHstNzIsIDExNzc0fSwgey03MSwgMTE4NjR9LCB7LTcwLCAxMTk1NX0sIHstNjksIDEyMDQ5fSwgey02OCwgMTIxNDR9LCB7LTY3LCAxMjI0Mn0sCisgICAgICAgICAgICB7LTY2LCAxMjM0MX0sIHstNjUsIDEyNDQzfSwgey02NCwgMTI1NDh9LCB7LTYzLCAxMjY1NH0sIHstNjIsIDEyNzYzfSwgey02MSwgMTI4NzV9LAorICAgICAgICAgICAgey02MCwgMTI5OTB9LCB7LTU5LCAxMzEwN30sIHstNTgsIDEzMjI3fSwgey01NywgMTMzNTF9LCB7LTU2LCAxMzQ3N30sIHstNTUsIDEzNjA3fSwKKyAgICAgICAgICAgIHstNTQsIDEzNzQxfSwgey01MywgMTM4Nzh9LCB7LTUyLCAxNDAxOX0sIHstNTEsIDE0MTY0fSwgey01MCwgMTQzMTN9LCB7LTQ5LCAxNDQ2N30sCisgICAgICAgICAgICB7LTQ4LCAxNDYyNn0sIHstNDcsIDE0Nzg5fSwgey00NiwgMTQ5NTh9LCB7LTQ1LCAxNTEzMn0sIHstNDQsIDE1MzEyfSwgey00MywgMTU0OTh9LAorICAgICAgICAgICAgey00MiwgMTU2OTF9LCB7LTQxLCAxNTg5MH0sIHstNDAsIDE2MDk3fSwgey0zOSwgMTYzMTF9LCB7LTM4LCAxNjUzNH0sIHstMzcsIDE2NzY2fSwKKyAgICAgICAgICAgIHstMzYsIDE3MDA3fSwgey0zNSwgMTcyNTl9LCB7LTM0LCAxNzUyMX0sIHstMzMsIDE3Nzk1fSwgey0zMiwgMTgwODF9LCB7LTMxLCAxODM4MX0sCisgICAgICAgICAgICB7LTMwLCAxODY5Nn0sIHstMjksIDE5MDI3fSwgey0yOCwgMTkzNzV9LCB7LTI3LCAxOTc0Mn0sIHstMjYsIDIwMTI5fSwgey0yNSwgMjA1NDB9LAorICAgICAgICAgICAgey0yNCwgMjA5NzZ9LCB7LTIzLCAyMTQzOX0sIHstMjIsIDIxOTM0fSwgey0yMSwgMjI0NjN9LCB7LTIwLCAyMzAzMX0sIHstMTksIDIzNjQzfSwKKyAgICAgICAgICAgIHstMTgsIDIzOTk5fX07CiAKLSAgICBmb3IoaSA9IDA7IGkgPCA5NjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYoSGZsZXZlbCA8PSBMUEZBcnJheVtpXS5Sb29tX0hGKQotICAgICAgICAgICAgYnJlYWs7CisgICAgZm9yIChpID0gMDsgaSA8IDk2OyBpKyspIHsKKyAgICAgICAgaWYgKEhmbGV2ZWwgPD0gTFBGQXJyYXlbaV0uUm9vbV9IRikgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBMUEZBcnJheVtpXS5MUEY7CiB9CkBAIC04NzksMjYgKzgwNywyNiBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi12b2lkIFJldmVyYlNldFJvb21IZkxldmVsKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LCBpbnQxNl90IGxldmVsKXsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldFJvb21IZkxldmVsIHN0YXJ0ICglZCkiLCBsZXZlbCk7Cit2b2lkIFJldmVyYlNldFJvb21IZkxldmVsKFJldmVyYkNvbnRleHQqIHBDb250ZXh0LCBpbnQxNl90IGxldmVsKSB7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0Um9vbUhmTGV2ZWwgc3RhcnQgKCVkKSIsIGxldmVsKTsKIAotICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KIAogICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJTZXRSb29tSGZMZXZlbCIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXRSb29tSGZMZXZlbCBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXRSb29tSGZMZXZlbCgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTFBGKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXRSb29tSGZMZXZlbCBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldFJvb21IZkxldmVsKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MUEYpOwogCiAgICAgQWN0aXZlUGFyYW1zLkxQRiA9IFJldmVyYkNvbnZlcnRIZkxldmVsKGxldmVsKTsKIAogICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYlNldFJvb21IZkxldmVsIikKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldFJvb21oZkxldmVsKCkganVzdCBTZXQgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MUEYpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldFJvb21oZkxldmVsKCkganVzdCBTZXQgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MUEYpOwogICAgIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWwgPSBsZXZlbDsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldEhmUm9vbUxldmVsIGVuZC4uIHNhdmluZyAlZCIsIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWwpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldEhmUm9vbUxldmVsIGVuZC4uIHNhdmluZyAlZCIsIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWwpOwogICAgIHJldHVybjsKIH0KIApAQCAtOTEzLDMwICs4NDEsMzEgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50MTZfdCBSZXZlcmJHZXRSb29tSGZMZXZlbChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCl7CitpbnQxNl90IFJldmVyYkdldFJvb21IZkxldmVsKFJldmVyYkNvbnRleHQqIHBDb250ZXh0KSB7CiAgICAgaW50MTZfdCBsZXZlbDsKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldFJvb21IZkxldmVsIHN0YXJ0LCBzYXZlZCBsZXZlbCBpcyAlZCIsIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWwpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldFJvb21IZkxldmVsIHN0YXJ0LCBzYXZlZCBsZXZlbCBpcyAlZCIsIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWwpOwogCi0gICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVlJFVl9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYkdldFJvb21IZkxldmVsIikKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldFJvb21IZkxldmVsIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldFJvb21IZkxldmVsKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MUEYpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldFJvb21IZkxldmVsIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0Um9vbUhmTGV2ZWwoKSBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkxQRik7CiAKICAgICBsZXZlbCA9IFJldmVyYkNvbnZlcnRIZkxldmVsKHBDb250ZXh0LT5TYXZlZEhmTGV2ZWwpOwogCi0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXRSb29tSGZMZXZlbCgpIEFjdGl2ZVBhcmFtcy5MUEZMICVkLCBwQ29udGV4dC0+U2F2ZWRIZkxldmVsOiAlZCwgIgorICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldFJvb21IZkxldmVsKCkgQWN0aXZlUGFyYW1zLkxQRkwgJWQsIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWw6ICVkLCAiCiAgICAgLy8gICAgICJjb252ZXJ0ZWQgbGV2ZWw6ICVkXG4iLCBBY3RpdmVQYXJhbXMuTFBGLCBwQ29udGV4dC0+U2F2ZWRIZkxldmVsLCBsZXZlbCk7CiAKLSAgICBpZigoaW50MTZfdClBY3RpdmVQYXJhbXMuTFBGICE9IGxldmVsKXsKLSAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogKGlnbm9yZSBhdCBzdGFydCB1cCkgUmV2ZXJiR2V0Um9vbUhmTGV2ZWwoKSBoYXMgd3JvbmcgbGV2ZWwgLT4gJWQgJWRcbiIsCi0gICAgICAgICAgICAgICBBY3RpdmVQYXJhbXMuTGV2ZWwsIGxldmVsKTsKKyAgICBpZiAoKGludDE2X3QpQWN0aXZlUGFyYW1zLkxQRiAhPSBsZXZlbCkgeworICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiAoaWdub3JlIGF0IHN0YXJ0IHVwKSBSZXZlcmJHZXRSb29tSGZMZXZlbCgpIGhhcyB3cm9uZyBsZXZlbCAtPiAlZCAiCisgICAgICAgICAgICAgICIlZFxuIiwKKyAgICAgICAgICAgICAgQWN0aXZlUGFyYW1zLkxldmVsLCBsZXZlbCk7CiAgICAgfQogCi0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXRSb29tSGZMZXZlbCBlbmQiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXRSb29tSGZMZXZlbCBlbmQiKTsKICAgICByZXR1cm4gcENvbnRleHQtPlNhdmVkSGZMZXZlbDsKIH0KIApAQCAtOTUyLDM1ICs4ODEsMzUgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotdm9pZCBSZXZlcmJTZXRSZXZlcmJMZXZlbChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgaW50MTZfdCBsZXZlbCl7Ci0gICAgLy9BTE9HVigiXG5cdFJldmVyYlNldFJldmVyYkxldmVsIHN0YXJ0ICglZCkiLCBsZXZlbCk7Cit2b2lkIFJldmVyYlNldFJldmVyYkxldmVsKFJldmVyYkNvbnRleHQqIHBDb250ZXh0LCBpbnQxNl90IGxldmVsKSB7CisgICAgLy8gQUxPR1YoIlxuXHRSZXZlcmJTZXRSZXZlcmJMZXZlbCBzdGFydCAoJWQpIiwgbGV2ZWwpOwogCi0gICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgQ29tYmluZWRMZXZlbDsgICAgICAgICAgICAgLy8gU3VtIG9mIHJvb20gYW5kIHJldmVyYiBsZXZlbCBjb250cm9scworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVlJFVl9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9JTlQzMiBDb21iaW5lZExldmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdW0gb2Ygcm9vbSBhbmQgcmV2ZXJiIGxldmVsIGNvbnRyb2xzCiAKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0UmV2ZXJiTGV2ZWwiKQotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwgU3VjY2Vzc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXRSZXZlcmJMZXZlbCBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkxldmVsKTsKIAogICAgIC8vIG5lZWRzIHRvIHN1YnRyYWN0IG1heCBsZXZlbHMgZm9yIGJvdGggUm9vbUxldmVsIGFuZCBSZXZlcmJMZXZlbAotICAgIENvbWJpbmVkTGV2ZWwgPSAobGV2ZWwgKyBwQ29udGV4dC0+U2F2ZWRSb29tTGV2ZWwpLUxWUkVWX01BWF9SRVZFUkJfTEVWRUw7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXRSZXZlcmJMZXZlbCgpIENvbWJpbmVkTGV2ZWwgaXMgJWQgPSAlZCArICVkXG4iLAorICAgIENvbWJpbmVkTGV2ZWwgPSAobGV2ZWwgKyBwQ29udGV4dC0+U2F2ZWRSb29tTGV2ZWwpIC0gTFZSRVZfTUFYX1JFVkVSQl9MRVZFTDsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXRSZXZlcmJMZXZlbCgpIENvbWJpbmVkTGV2ZWwgaXMgJWQgPSAlZCArICVkXG4iLAogICAgIC8vICAgICAgQ29tYmluZWRMZXZlbCwgbGV2ZWwsIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCk7CiAKICAgICBBY3RpdmVQYXJhbXMuTGV2ZWwgPSBSZXZlcmJDb252ZXJ0TGV2ZWwoQ29tYmluZWRMZXZlbCk7CiAKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldFJldmVyYkxldmVsKCkgVHJ5aW5nIHRvIHNldCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkxldmVsKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXRSZXZlcmJMZXZlbCgpIFRyeWluZyB0byBzZXQgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CiAKICAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJTZXRSZXZlcmJMZXZlbCIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXRSZXZlcmJMZXZlbCgpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldFJldmVyYkxldmVsKCkganVzdCBTZXQgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CiAKICAgICBwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCA9IGxldmVsOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwgZW5kIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsIGlzICVkXG5cbiIsCisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwgZW5kIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsIGlzICVkXG5cbiIsCiAgICAgLy8gICAgIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsKTsKICAgICByZXR1cm47CiB9CkBAIC05OTYsMzcgKzkyNSw0MCBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQxNl90IFJldmVyYkdldFJldmVyYkxldmVsKFJldmVyYkNvbnRleHQgKnBDb250ZXh0KXsKK2ludDE2X3QgUmV2ZXJiR2V0UmV2ZXJiTGV2ZWwoUmV2ZXJiQ29udGV4dCogcENvbnRleHQpIHsKICAgICBpbnQxNl90IGxldmVsOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0UmV2ZXJiTGV2ZWwgc3RhcnQiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXRSZXZlcmJMZXZlbCBzdGFydCIpOwogCi0gICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgQ29tYmluZWRMZXZlbDsgICAgICAgICAgICAgLy8gU3VtIG9mIHJvb20gYW5kIHJldmVyYiBsZXZlbCBjb250cm9scworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVlJFVl9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9JTlQzMiBDb21iaW5lZExldmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdW0gb2Ygcm9vbSBhbmQgcmV2ZXJiIGxldmVsIGNvbnRyb2xzCiAKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiR2V0UmV2ZXJiTGV2ZWwiKQotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0UmV2ZXJiTGV2ZWwgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0UmV2ZXJiTGV2ZWwoKSBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkxldmVsKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXRSZXZlcmJMZXZlbCBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldFJldmVyYkxldmVsKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CiAKICAgICAvLyBuZWVkcyB0byBzdWJ0cmFjdCBtYXggbGV2ZWxzIGZvciBib3RoIFJvb21MZXZlbCBhbmQgUmV2ZXJiTGV2ZWwKLSAgICBDb21iaW5lZExldmVsID0gKHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsICsgcENvbnRleHQtPlNhdmVkUm9vbUxldmVsKS1MVlJFVl9NQVhfUkVWRVJCX0xFVkVMOworICAgIENvbWJpbmVkTGV2ZWwgPQorICAgICAgICAgICAgKHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsICsgcENvbnRleHQtPlNhdmVkUm9vbUxldmVsKSAtIExWUkVWX01BWF9SRVZFUkJfTEVWRUw7CiAKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldFJldmVyYkxldmVsKCkgQ29tYmluZWRMZXZlbCBpcyAlZCA9ICVkICsgJWRcbiIsCi0gICAgLy9Db21iaW5lZExldmVsLCBwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCwgcENvbnRleHQtPlNhdmVkUm9vbUxldmVsKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXRSZXZlcmJMZXZlbCgpIENvbWJpbmVkTGV2ZWwgaXMgJWQgPSAlZCArICVkXG4iLAorICAgIC8vIENvbWJpbmVkTGV2ZWwsIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsLCBwQ29udGV4dC0+U2F2ZWRSb29tTGV2ZWwpOwogICAgIGxldmVsID0gUmV2ZXJiQ29udmVydExldmVsKENvbWJpbmVkTGV2ZWwpOwogCi0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXRSZXZlcmJMZXZlbCgpOiBBY3RpdmVQYXJhbXMuTGV2ZWw6ICVkLCBwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbDogJWQsICIKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXRSZXZlcmJMZXZlbCgpOiBBY3RpdmVQYXJhbXMuTGV2ZWw6ICVkLCBwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbDogJWQsICIKICAgICAvLyJwQ29udGV4dC0+U2F2ZWRSb29tTGV2ZWw6ICVkLCBDb21iaW5lZExldmVsOiAlZCwgY29udmVydGVkIGxldmVsOiAlZFxuIiwKLSAgICAvL0FjdGl2ZVBhcmFtcy5MZXZlbCwgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwscENvbnRleHQtPlNhdmVkUm9vbUxldmVsLCBDb21iaW5lZExldmVsLGxldmVsKTsKKyAgICAvLyBBY3RpdmVQYXJhbXMuTGV2ZWwsIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsLHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCwKKyAgICAvLyBDb21iaW5lZExldmVsLGxldmVsKTsKIAotICAgIGlmKEFjdGl2ZVBhcmFtcy5MZXZlbCAhPSBsZXZlbCl7Ci0gICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IChpZ25vcmUgYXQgc3RhcnQgdXApIFJldmVyYkdldFJldmVyYkxldmVsKCkgaGFzIHdyb25nIGxldmVsIC0+ICVkICVkXG4iLAotICAgICAgICAgICAgICAgIEFjdGl2ZVBhcmFtcy5MZXZlbCwgbGV2ZWwpOworICAgIGlmIChBY3RpdmVQYXJhbXMuTGV2ZWwgIT0gbGV2ZWwpIHsKKyAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogKGlnbm9yZSBhdCBzdGFydCB1cCkgUmV2ZXJiR2V0UmV2ZXJiTGV2ZWwoKSBoYXMgd3JvbmcgbGV2ZWwgLT4gJWQgIgorICAgICAgICAgICAgICAiJWRcbiIsCisgICAgICAgICAgICAgIEFjdGl2ZVBhcmFtcy5MZXZlbCwgbGV2ZWwpOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0UmV2ZXJiTGV2ZWwgZW5kXG4iKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXRSZXZlcmJMZXZlbCBlbmRcbiIpOwogCiAgICAgcmV0dXJuIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsOwogfQpAQCAtMTA0MywzMCArOTc1LDMwIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgUmV2ZXJiU2V0Um9vbUxldmVsKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LCBpbnQxNl90IGxldmVsKXsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldFJvb21MZXZlbCBzdGFydCAoJWQpIiwgbGV2ZWwpOwordm9pZCBSZXZlcmJTZXRSb29tTGV2ZWwoUmV2ZXJiQ29udGV4dCogcENvbnRleHQsIGludDE2X3QgbGV2ZWwpIHsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXRSb29tTGV2ZWwgc3RhcnQgKCVkKSIsIGxldmVsKTsKIAotICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgIENvbWJpbmVkTGV2ZWw7ICAgICAgICAgICAgIC8vIFN1bSBvZiByb29tIGFuZCByZXZlcmIgbGV2ZWwgY29udHJvbHMKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fSU5UMzIgQ29tYmluZWRMZXZlbDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VtIG9mIHJvb20gYW5kIHJldmVyYiBsZXZlbCBjb250cm9scwogCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYlNldFJvb21MZXZlbCIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXRSb29tTGV2ZWwgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0Um9vbUxldmVsKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0Um9vbUxldmVsIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0Um9vbUxldmVsKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CiAKICAgICAvLyBuZWVkcyB0byBzdWJ0cmFjdCBtYXggbGV2ZWxzIGZvciBib3RoIFJvb21MZXZlbCBhbmQgUmV2ZXJiTGV2ZWwKLSAgICBDb21iaW5lZExldmVsID0gKGxldmVsICsgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwpLUxWUkVWX01BWF9SRVZFUkJfTEVWRUw7CisgICAgQ29tYmluZWRMZXZlbCA9IChsZXZlbCArIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsKSAtIExWUkVWX01BWF9SRVZFUkJfTEVWRUw7CiAgICAgQWN0aXZlUGFyYW1zLkxldmVsID0gUmV2ZXJiQ29udmVydExldmVsKENvbWJpbmVkTGV2ZWwpOwogCiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0Um9vbUxldmVsIikKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldFJvb21MZXZlbCgpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldFJvb21MZXZlbCgpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOwogCiAgICAgcENvbnRleHQtPlNhdmVkUm9vbUxldmVsID0gbGV2ZWw7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXRSb29tTGV2ZWwgZW5kIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0Um9vbUxldmVsIGVuZCIpOwogICAgIHJldHVybjsKIH0KIApAQCAtMTA4MSwzNSArMTAxMywzNiBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQxNl90IFJldmVyYkdldFJvb21MZXZlbChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCl7CitpbnQxNl90IFJldmVyYkdldFJvb21MZXZlbChSZXZlcmJDb250ZXh0KiBwQ29udGV4dCkgewogICAgIGludDE2X3QgbGV2ZWw7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXRSb29tTGV2ZWwgc3RhcnQiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXRSb29tTGV2ZWwgc3RhcnQiKTsKIAotICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgIENvbWJpbmVkTGV2ZWw7ICAgICAgICAgICAgIC8vIFN1bSBvZiByb29tIGFuZCByZXZlcmIgbGV2ZWwgY29udHJvbHMKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fSU5UMzIgQ29tYmluZWRMZXZlbDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VtIG9mIHJvb20gYW5kIHJldmVyYiBsZXZlbCBjb250cm9scwogCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYkdldFJvb21MZXZlbCIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXRSb29tTGV2ZWwgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0Um9vbUxldmVsKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0Um9vbUxldmVsIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0Um9vbUxldmVsKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CiAKICAgICAvLyBuZWVkcyB0byBzdWJ0cmFjdCBtYXggbGV2ZWxzIGZvciBib3RoIFJvb21MZXZlbCBhbmQgUmV2ZXJiTGV2ZWwKLSAgICBDb21iaW5lZExldmVsID0gKHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCArIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsLUxWUkVWX01BWF9SRVZFUkJfTEVWRUwpOworICAgIENvbWJpbmVkTGV2ZWwgPQorICAgICAgICAgICAgKHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCArIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsIC0gTFZSRVZfTUFYX1JFVkVSQl9MRVZFTCk7CiAgICAgbGV2ZWwgPSBSZXZlcmJDb252ZXJ0TGV2ZWwoQ29tYmluZWRMZXZlbCk7CiAKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldFJvb21MZXZlbCwgTGV2ZWwgPSAlZCwgcENvbnRleHQtPlNhdmVkUm9vbUxldmVsID0gJWQsICIKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXRSb29tTGV2ZWwsIExldmVsID0gJWQsIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCA9ICVkLCAiCiAgICAgLy8gICAgICJwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCA9ICVkLCBDb21iaW5lZExldmVsID0gJWQsIGxldmVsID0gJWQiLAogICAgIC8vICAgICBBY3RpdmVQYXJhbXMuTGV2ZWwsIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCwKICAgICAvLyAgICAgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwsIENvbWJpbmVkTGV2ZWwsIGxldmVsKTsKIAotICAgIGlmKEFjdGl2ZVBhcmFtcy5MZXZlbCAhPSBsZXZlbCl7CisgICAgaWYgKEFjdGl2ZVBhcmFtcy5MZXZlbCAhPSBsZXZlbCkgewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiAoaWdub3JlIGF0IHN0YXJ0IHVwKSBSZXZlcmJHZXRSb29tTGV2ZWwoKSBoYXMgd3JvbmcgbGV2ZWwgLT4gJWQgJWRcbiIsCiAgICAgICAgICAgICAgIEFjdGl2ZVBhcmFtcy5MZXZlbCwgbGV2ZWwpOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0Um9vbUxldmVsIGVuZCIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldFJvb21MZXZlbCBlbmQiKTsKICAgICByZXR1cm4gcENvbnRleHQtPlNhdmVkUm9vbUxldmVsOwogfQogCkBAIC0xMTI1LDM0ICsxMDU4LDM1IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgUmV2ZXJiU2V0RGVjYXlUaW1lKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LCB1aW50MzJfdCB0aW1lKXsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERlY2F5VGltZSBzdGFydCAoJWQpIiwgdGltZSk7Cit2b2lkIFJldmVyYlNldERlY2F5VGltZShSZXZlcmJDb250ZXh0KiBwQ29udGV4dCwgdWludDMyX3QgdGltZSkgeworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldERlY2F5VGltZSBzdGFydCAoJWQpIiwgdGltZSk7CiAKLSAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0RGVjYXlUaW1lIikKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERlY2F5VGltZSBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREZWNheVRpbWUoKSBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlQ2MCk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGVjYXlUaW1lIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGVjYXlUaW1lKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5UNjApOwogCiAgICAgaWYgKHRpbWUgPD0gTFZSRVZfTUFYX1Q2MCkgewogICAgICAgICBBY3RpdmVQYXJhbXMuVDYwID0gKExWTV9VSU5UMTYpdGltZTsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgICAgQWN0aXZlUGFyYW1zLlQ2MCA9IExWUkVWX01BWF9UNjA7CiAgICAgfQogCiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0RGVjYXlUaW1lIikKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERlY2F5VGltZSgpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVDYwKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXREZWNheVRpbWUoKSBqdXN0IFNldCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlQ2MCk7CiAKLSAgICBwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50ID0gKEFjdGl2ZVBhcmFtcy5UNjAgKiBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSkvMTAwMDsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERlY2F5VGltZSgpIGp1c3QgU2V0IFNhbXBsZXNUb0V4aXRDb3VudC0+ICVkXG4iLHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQpOworICAgIHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQgPQorICAgICAgICAgICAgKEFjdGl2ZVBhcmFtcy5UNjAgKiBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgLyAxMDAwOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldERlY2F5VGltZSgpIGp1c3QgU2V0IFNhbXBsZXNUb0V4aXRDb3VudC0+CisgICAgLy8gJWRcbiIscENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudCk7CiAgICAgcENvbnRleHQtPlNhdmVkRGVjYXlUaW1lID0gKGludDE2X3QpdGltZTsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERlY2F5VGltZSBlbmQiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXREZWNheVRpbWUgZW5kIik7CiAgICAgcmV0dXJuOwogfQogCkBAIC0xMTY3LDI1ICsxMTAxLDI1IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXVpbnQzMl90IFJldmVyYkdldERlY2F5VGltZShSZXZlcmJDb250ZXh0ICpwQ29udGV4dCl7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXREZWNheVRpbWUgc3RhcnQiKTsKK3VpbnQzMl90IFJldmVyYkdldERlY2F5VGltZShSZXZlcmJDb250ZXh0KiBwQ29udGV4dCkgeworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldERlY2F5VGltZSBzdGFydCIpOwogCi0gICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVlJFVl9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYkdldERlY2F5VGltZSIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXREZWNheVRpbWUgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0RGVjYXlUaW1lKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5UNjApOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldERlY2F5VGltZSBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldERlY2F5VGltZSgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVDYwKTsKIAotICAgIGlmKEFjdGl2ZVBhcmFtcy5UNjAgIT0gcENvbnRleHQtPlNhdmVkRGVjYXlUaW1lKXsKKyAgICBpZiAoQWN0aXZlUGFyYW1zLlQ2MCAhPSBwQ29udGV4dC0+U2F2ZWREZWNheVRpbWUpIHsKICAgICAgICAgLy8gVGhpcyB3aWxsIGZhaWwgaWYgdGhlIGRlY2F5IHRpbWUgaXMgc2V0IHRvIG1vcmUgdGhhbiA3MDAwCi0gICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYkdldERlY2F5VGltZSgpIGhhcyB3cm9uZyBsZXZlbCAtPiAlZCAlZFxuIiwKLSAgICAgICAgIEFjdGl2ZVBhcmFtcy5UNjAsIHBDb250ZXh0LT5TYXZlZERlY2F5VGltZSk7CisgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYkdldERlY2F5VGltZSgpIGhhcyB3cm9uZyBsZXZlbCAtPiAlZCAlZFxuIiwgQWN0aXZlUGFyYW1zLlQ2MCwKKyAgICAgICAgICAgICAgcENvbnRleHQtPlNhdmVkRGVjYXlUaW1lKTsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldERlY2F5VGltZSBlbmQiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXREZWNheVRpbWUgZW5kIik7CiAgICAgcmV0dXJuICh1aW50MzJfdClBY3RpdmVQYXJhbXMuVDYwOwogfQogCkBAIC0xMjAxLDI3ICsxMTM1LDI3IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgUmV2ZXJiU2V0RGVjYXlIZlJhdGlvKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LCBpbnQxNl90IHJhdGlvKXsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERlY2F5SGZSYXRpb2Ugc3RhcnQgKCVkKSIsIHJhdGlvKTsKK3ZvaWQgUmV2ZXJiU2V0RGVjYXlIZlJhdGlvKFJldmVyYkNvbnRleHQqIHBDb250ZXh0LCBpbnQxNl90IHJhdGlvKSB7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGVjYXlIZlJhdGlvZSBzdGFydCAoJWQpIiwgcmF0aW8pOwogCi0gICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KIAogICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJTZXREZWNheUhmUmF0aW8iKQotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0RGVjYXlIZlJhdGlvIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERlY2F5SGZSYXRpbygpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuRGFtcGluZyk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGVjYXlIZlJhdGlvIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGVjYXlIZlJhdGlvKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5EYW1waW5nKTsKIAotICAgIEFjdGl2ZVBhcmFtcy5EYW1waW5nID0gKExWTV9JTlQxNikocmF0aW8vMjApOworICAgIEFjdGl2ZVBhcmFtcy5EYW1waW5nID0gKExWTV9JTlQxNikocmF0aW8gLyAyMCk7CiAKICAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJTZXREZWNheUhmUmF0aW8iKQotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0RGVjYXlIZlJhdGlvKCkganVzdCBTZXQgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5EYW1waW5nKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXREZWNheUhmUmF0aW8oKSBqdXN0IFNldCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkRhbXBpbmcpOwogCiAgICAgcENvbnRleHQtPlNhdmVkRGVjYXlIZlJhdGlvID0gcmF0aW87Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREZWNheUhmUmF0aW8gZW5kIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGVjYXlIZlJhdGlvIGVuZCIpOwogICAgIHJldHVybjsKIH0KIApAQCAtMTIzNiwyNCArMTE3MCwyNCBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQzMl90IFJldmVyYkdldERlY2F5SGZSYXRpbyhSZXZlcmJDb250ZXh0ICpwQ29udGV4dCl7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXREZWNheUhmUmF0aW8gc3RhcnQiKTsKK2ludDMyX3QgUmV2ZXJiR2V0RGVjYXlIZlJhdGlvKFJldmVyYkNvbnRleHQqIHBDb250ZXh0KSB7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0RGVjYXlIZlJhdGlvIHN0YXJ0Iik7CiAKLSAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVlJFVl9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYkdldERlY2F5SGZSYXRpbyIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXREZWNheUhmUmF0aW8gU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0RGVjYXlIZlJhdGlvKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5EYW1waW5nKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXREZWNheUhmUmF0aW8gU3VjY2Vzc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXREZWNheUhmUmF0aW8oKSBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkRhbXBpbmcpOwogCi0gICAgaWYoQWN0aXZlUGFyYW1zLkRhbXBpbmcgIT0gKExWTV9JTlQxNikocENvbnRleHQtPlNhdmVkRGVjYXlIZlJhdGlvIC8gMjApKXsKKyAgICBpZiAoQWN0aXZlUGFyYW1zLkRhbXBpbmcgIT0gKExWTV9JTlQxNikocENvbnRleHQtPlNhdmVkRGVjYXlIZlJhdGlvIC8gMjApKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYkdldERlY2F5SGZSYXRpbygpIGhhcyB3cm9uZyBsZXZlbCAtPiAlZCAlZFxuIiwKLSAgICAgICAgIEFjdGl2ZVBhcmFtcy5EYW1waW5nLCBwQ29udGV4dC0+U2F2ZWREZWNheUhmUmF0aW8pOworICAgICAgICAgICAgICBBY3RpdmVQYXJhbXMuRGFtcGluZywgcENvbnRleHQtPlNhdmVkRGVjYXlIZlJhdGlvKTsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldERlY2F5SGZSYXRpbyBlbmQiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXREZWNheUhmUmF0aW8gZW5kIik7CiAgICAgcmV0dXJuIHBDb250ZXh0LT5TYXZlZERlY2F5SGZSYXRpbzsKIH0KIApAQCAtMTI2OSwyNyArMTIwMywyNyBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi12b2lkIFJldmVyYlNldERpZmZ1c2lvbihSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgaW50MTZfdCBsZXZlbCl7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREaWZmdXNpb24gc3RhcnQgKCVkKSIsIGxldmVsKTsKK3ZvaWQgUmV2ZXJiU2V0RGlmZnVzaW9uKFJldmVyYkNvbnRleHQqIHBDb250ZXh0LCBpbnQxNl90IGxldmVsKSB7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGlmZnVzaW9uIHN0YXJ0ICglZCkiLCBsZXZlbCk7CiAKLSAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0RGlmZnVzaW9uIikKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERpZmZ1c2lvbiBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREaWZmdXNpb24oKSBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkRlbnNpdHkpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldERpZmZ1c2lvbiBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldERpZmZ1c2lvbigpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuRGVuc2l0eSk7CiAKLSAgICBBY3RpdmVQYXJhbXMuRGVuc2l0eSA9IChMVk1fSU5UMTYpKGxldmVsLzEwKTsKKyAgICBBY3RpdmVQYXJhbXMuRGVuc2l0eSA9IChMVk1fSU5UMTYpKGxldmVsIC8gMTApOwogCiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0RGlmZnVzaW9uIikKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERpZmZ1c2lvbigpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuRGVuc2l0eSk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGlmZnVzaW9uKCkganVzdCBTZXQgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5EZW5zaXR5KTsKIAogICAgIHBDb250ZXh0LT5TYXZlZERpZmZ1c2lvbiA9IGxldmVsOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0RGlmZnVzaW9uIGVuZCIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldERpZmZ1c2lvbiBlbmQiKTsKICAgICByZXR1cm47CiB9CiAKQEAgLTEzMDQsMjYgKzEyMzgsMjYgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50MzJfdCBSZXZlcmJHZXREaWZmdXNpb24oUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpewotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0RGlmZnVzaW9uIHN0YXJ0Iik7CitpbnQzMl90IFJldmVyYkdldERpZmZ1c2lvbihSZXZlcmJDb250ZXh0KiBwQ29udGV4dCkgeworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldERpZmZ1c2lvbiBzdGFydCIpOwogCi0gICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgVGVtcDsKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fSU5UMTYgVGVtcDsKIAogICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJHZXREaWZmdXNpb24iKQotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0RGlmZnVzaW9uIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldERpZmZ1c2lvbiBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkRlbnNpdHkpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldERpZmZ1c2lvbiBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldERpZmZ1c2lvbiBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkRlbnNpdHkpOwogCi0gICAgVGVtcCA9IChMVk1fSU5UMTYpKHBDb250ZXh0LT5TYXZlZERpZmZ1c2lvbi8xMCk7CisgICAgVGVtcCA9IChMVk1fSU5UMTYpKHBDb250ZXh0LT5TYXZlZERpZmZ1c2lvbiAvIDEwKTsKIAotICAgIGlmKEFjdGl2ZVBhcmFtcy5EZW5zaXR5ICE9IFRlbXApeworICAgIGlmIChBY3RpdmVQYXJhbXMuRGVuc2l0eSAhPSBUZW1wKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYkdldERpZmZ1c2lvbiBpbnZhbGlkIHZhbHVlICVkICVkIiwgVGVtcCwgQWN0aXZlUGFyYW1zLkRlbnNpdHkpOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0RGlmZnVzaW9uIGVuZCIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldERpZmZ1c2lvbiBlbmQiKTsKICAgICByZXR1cm4gcENvbnRleHQtPlNhdmVkRGlmZnVzaW9uOwogfQogCkBAIC0xMzM5LDI3ICsxMjczLDI3IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgUmV2ZXJiU2V0RGVuc2l0eShSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgaW50MTZfdCBsZXZlbCl7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREZW5zaXR5IHN0YXJ0ICglZCkiLCBsZXZlbCk7Cit2b2lkIFJldmVyYlNldERlbnNpdHkoUmV2ZXJiQ29udGV4dCogcENvbnRleHQsIGludDE2X3QgbGV2ZWwpIHsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXREZW5zaXR5IHN0YXJ0ICglZCkiLCBsZXZlbCk7CiAKLSAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0RGVuc2l0eSIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREZW5zaXR5IFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERlbnNpdHkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5Sb29tU2l6ZSk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGVuc2l0eSBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldERlbnNpdHkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5Sb29tU2l6ZSk7CiAKICAgICBBY3RpdmVQYXJhbXMuUm9vbVNpemUgPSAoTFZNX0lOVDE2KSgoKGxldmVsICogOTkpIC8gMTAwMCkgKyAxKTsKIAogICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYlNldERlbnNpdHkiKQotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0RGVuc2l0eSBqdXN0IFNldCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlJvb21TaXplKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXREZW5zaXR5IGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuUm9vbVNpemUpOwogCiAgICAgcENvbnRleHQtPlNhdmVkRGVuc2l0eSA9IGxldmVsOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0RGVuc2l0eSBlbmQiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXREZW5zaXR5IGVuZCIpOwogICAgIHJldHVybjsKIH0KIApAQCAtMTM3NCwyNSArMTMwOCwyNSBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQzMl90IFJldmVyYkdldERlbnNpdHkoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpewotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0RGVuc2l0eSBzdGFydCIpOworaW50MzJfdCBSZXZlcmJHZXREZW5zaXR5KFJldmVyYkNvbnRleHQqIHBDb250ZXh0KSB7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0RGVuc2l0eSBzdGFydCIpOwogCi0gICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgVGVtcDsKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fSU5UMTYgVGVtcDsKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiR2V0RGVuc2l0eSIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXREZW5zaXR5IFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldERlbnNpdHkoKSBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlJvb21TaXplKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXREZW5zaXR5IFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0RGVuc2l0eSgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuUm9vbVNpemUpOwogCiAgICAgVGVtcCA9IChMVk1fSU5UMTYpKCgocENvbnRleHQtPlNhdmVkRGVuc2l0eSAqIDk5KSAvIDEwMDApICsgMSk7CiAKLSAgICBpZihUZW1wICE9IEFjdGl2ZVBhcmFtcy5Sb29tU2l6ZSl7CisgICAgaWYgKFRlbXAgIT0gQWN0aXZlUGFyYW1zLlJvb21TaXplKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYkdldERlbnNpdHkgaW52YWxpZCB2YWx1ZSAlZCAlZCIsIFRlbXAsIEFjdGl2ZVBhcmFtcy5Sb29tU2l6ZSk7CiAgICAgfQogCi0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXREZW5zaXR5IGVuZCIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldERlbnNpdHkgZW5kIik7CiAgICAgcmV0dXJuIHBDb250ZXh0LT5TYXZlZERlbnNpdHk7CiB9CiAKQEAgLTE0MTAsMjAgKzEzNDQsMTkgQEAKIC8vIFNpZGUgRWZmZWN0czoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBSZXZlcmJfTG9hZFByZXNldChSZXZlcmJDb250ZXh0ICAgKnBDb250ZXh0KQotewotICAgIC8vVE9ETzogYWRkIHJlZmxlY3Rpb25zIGRlbGF5LCBsZXZlbCBhbmQgcmV2ZXJiIGRlbGF5IHdoZW4gZWFybHkgcmVmbGVjdGlvbnMgYXJlCitpbnQgUmV2ZXJiX0xvYWRQcmVzZXQoUmV2ZXJiQ29udGV4dCogcENvbnRleHQpIHsKKyAgICAvLyBUT0RPOiBhZGQgcmVmbGVjdGlvbnMgZGVsYXksIGxldmVsIGFuZCByZXZlcmIgZGVsYXkgd2hlbiBlYXJseSByZWZsZWN0aW9ucyBhcmUKICAgICAvLyBpbXBsZW1lbnRlZAogICAgIHBDb250ZXh0LT5jdXJQcmVzZXQgPSBwQ29udGV4dC0+bmV4dFByZXNldDsKIAogICAgIGlmIChwQ29udGV4dC0+Y3VyUHJlc2V0ICE9IFJFVkVSQl9QUkVTRVRfTk9ORSkgewotICAgICAgICBjb25zdCB0X3JldmVyYl9zZXR0aW5ncyAqcHJlc2V0ID0gJnNSZXZlcmJQcmVzZXRzW3BDb250ZXh0LT5jdXJQcmVzZXRdOworICAgICAgICBjb25zdCB0X3JldmVyYl9zZXR0aW5ncyogcHJlc2V0ID0gJnNSZXZlcmJQcmVzZXRzW3BDb250ZXh0LT5jdXJQcmVzZXRdOwogICAgICAgICBSZXZlcmJTZXRSb29tTGV2ZWwocENvbnRleHQsIHByZXNldC0+cm9vbUxldmVsKTsKICAgICAgICAgUmV2ZXJiU2V0Um9vbUhmTGV2ZWwocENvbnRleHQsIHByZXNldC0+cm9vbUhGTGV2ZWwpOwogICAgICAgICBSZXZlcmJTZXREZWNheVRpbWUocENvbnRleHQsIHByZXNldC0+ZGVjYXlUaW1lKTsKICAgICAgICAgUmV2ZXJiU2V0RGVjYXlIZlJhdGlvKHBDb250ZXh0LCBwcmVzZXQtPmRlY2F5SEZSYXRpbyk7Ci0gICAgICAgIC8vcmVmbGVjdGlvbnNMZXZlbAotICAgICAgICAvL3JlZmxlY3Rpb25zRGVsYXkKKyAgICAgICAgLy8gcmVmbGVjdGlvbnNMZXZlbAorICAgICAgICAvLyByZWZsZWN0aW9uc0RlbGF5CiAgICAgICAgIFJldmVyYlNldFJldmVyYkxldmVsKHBDb250ZXh0LCBwcmVzZXQtPnJldmVyYkxldmVsKTsKICAgICAgICAgLy8gcmV2ZXJiRGVsYXkKICAgICAgICAgUmV2ZXJiU2V0RGlmZnVzaW9uKHBDb250ZXh0LCBwcmVzZXQtPmRpZmZ1c2lvbik7CkBAIC0xNDU0LDk5ICsxMzg3LDk2IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBSZXZlcmJfZ2V0UGFyYW1ldGVyKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAqcFZhbHVlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSl7CitpbnQgUmV2ZXJiX2dldFBhcmFtZXRlcihSZXZlcmJDb250ZXh0KiBwQ29udGV4dCwgdm9pZCogcFBhcmFtLCB1aW50MzJfdCogcFZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKSB7CiAgICAgaW50IHN0YXR1cyA9IDA7Ci0gICAgaW50MzJfdCAqcFBhcmFtVGVtcCA9IChpbnQzMl90ICopcFBhcmFtOworICAgIGludDMyX3QqIHBQYXJhbVRlbXAgPSAoaW50MzJfdCopcFBhcmFtOwogICAgIGludDMyX3QgcGFyYW0gPSAqcFBhcmFtVGVtcCsrOwotICAgIHRfcmV2ZXJiX3NldHRpbmdzICpwUHJvcGVydGllczsKKyAgICB0X3JldmVyYl9zZXR0aW5ncyogcFByb3BlcnRpZXM7CiAKLSAgICAvL0FMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIgc3RhcnQiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyIHN0YXJ0Iik7CiAgICAgaWYgKHBDb250ZXh0LT5wcmVzZXQpIHsKICAgICAgICAgaWYgKHBhcmFtICE9IFJFVkVSQl9QQVJBTV9QUkVTRVQgfHwgKnBWYWx1ZVNpemUgPCBzaXplb2YodWludDE2X3QpKSB7CiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQogCi0gICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSBwQ29udGV4dC0+bmV4dFByZXNldDsKKyAgICAgICAgKih1aW50MTZfdCopcFZhbHVlID0gcENvbnRleHQtPm5leHRQcmVzZXQ7CiAgICAgICAgIEFMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX1BSRVNFVCwgcHJlc2V0ICVkIiwgcENvbnRleHQtPm5leHRQcmVzZXQpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBzd2l0Y2ggKHBhcmFtKXsKKyAgICBzd2l0Y2ggKHBhcmFtKSB7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUw6Ci0gICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKXsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplMSAlZCIsICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDE2X3QpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUw6Ci0gICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKXsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplMTIgJWQiLCAqcFZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FOgotICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZih1aW50MzJfdCkpeworICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZih1aW50MzJfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplMyAlZCIsICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTzoKLSAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpeworICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemU0ICVkIiwgKnBWYWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfTEVWRUw6Ci0gICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKXsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplNSAlZCIsICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDE2X3QpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0RFTEFZOgotICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZih1aW50MzJfdCkpeworICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZih1aW50MzJfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplNiAlZCIsICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUw6Ci0gICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKXsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplNyAlZCIsICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDE2X3QpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9ERUxBWToKLSAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKXsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTggJWQiLCAqcFZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fRElGRlVTSU9OOgotICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSl7CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTkgJWQiLCAqcFZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERU5TSVRZOgotICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSl7CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTEwICVkIiwgKnBWYWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUzoKLSAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodF9yZXZlcmJfc2V0dGluZ3MpKXsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodF9yZXZlcmJfc2V0dGluZ3MpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTExICVkIiwgKnBWYWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQpAQCAtMTU1OCw5ICsxNDg4LDkgQEAKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIHBQcm9wZXJ0aWVzID0gKHRfcmV2ZXJiX3NldHRpbmdzICopIHBWYWx1ZTsKKyAgICBwUHJvcGVydGllcyA9ICh0X3JldmVyYl9zZXR0aW5ncyopcFZhbHVlOwogCi0gICAgc3dpdGNoIChwYXJhbSl7CisgICAgc3dpdGNoIChwYXJhbSkgewogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTOgogICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJvb21MZXZlbCA9IFJldmVyYkdldFJvb21MZXZlbChwQ29udGV4dCk7CiAgICAgICAgICAgICBwUHJvcGVydGllcy0+cm9vbUhGTGV2ZWwgPSBSZXZlcmJHZXRSb29tSGZMZXZlbChwQ29udGV4dCk7CkBAIC0xNTc0LDc0ICsxNTA0LDc0IEBACiAgICAgICAgICAgICBwUHJvcGVydGllcy0+ZGVuc2l0eSA9IFJldmVyYkdldERlbnNpdHkocENvbnRleHQpOwogCiAgICAgICAgICAgICBBTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMgVmFsdWUgaXMgcm9vbUxldmVsICAgICAgICAlZCIsCi0gICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJvb21MZXZlbCk7CisgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+cm9vbUxldmVsKTsKICAgICAgICAgICAgIEFMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUyBWYWx1ZSBpcyByb29tSEZMZXZlbCAgICAgICVkIiwKLSAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+cm9vbUhGTGV2ZWwpOworICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJvb21IRkxldmVsKTsKICAgICAgICAgICAgIEFMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUyBWYWx1ZSBpcyBkZWNheVRpbWUgICAgICAgICVkIiwKLSAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+ZGVjYXlUaW1lKTsKKyAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5kZWNheVRpbWUpOwogICAgICAgICAgICAgQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTIFZhbHVlIGlzIGRlY2F5SEZSYXRpbyAgICAgJWQiLAotICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5kZWNheUhGUmF0aW8pOworICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPmRlY2F5SEZSYXRpbyk7CiAgICAgICAgICAgICBBTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMgVmFsdWUgaXMgcmVmbGVjdGlvbnNMZXZlbCAlZCIsCi0gICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJlZmxlY3Rpb25zTGV2ZWwpOworICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJlZmxlY3Rpb25zTGV2ZWwpOwogICAgICAgICAgICAgQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTIFZhbHVlIGlzIHJlZmxlY3Rpb25zRGVsYXkgJWQiLAotICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5yZWZsZWN0aW9uc0RlbGF5KTsKKyAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5yZWZsZWN0aW9uc0RlbGF5KTsKICAgICAgICAgICAgIEFMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUyBWYWx1ZSBpcyByZXZlcmJEZWxheSAgICAgICVkIiwKLSAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+cmV2ZXJiRGVsYXkpOworICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJldmVyYkRlbGF5KTsKICAgICAgICAgICAgIEFMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUyBWYWx1ZSBpcyByZXZlcmJMZXZlbCAgICAgICVkIiwKLSAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+cmV2ZXJiTGV2ZWwpOworICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJldmVyYkxldmVsKTsKICAgICAgICAgICAgIEFMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUyBWYWx1ZSBpcyBkaWZmdXNpb24gICAgICAgICVkIiwKLSAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+ZGlmZnVzaW9uKTsKKyAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5kaWZmdXNpb24pOwogICAgICAgICAgICAgQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTIFZhbHVlIGlzIGRlbnNpdHkgICAgICAgICAgJWQiLAotICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5kZW5zaXR5KTsKKyAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5kZW5zaXR5KTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUw6Ci0gICAgICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSBSZXZlcmJHZXRSb29tTGV2ZWwocENvbnRleHQpOworICAgICAgICAgICAgKihpbnQxNl90KilwVmFsdWUgPSBSZXZlcmJHZXRSb29tTGV2ZWwocENvbnRleHQpOwogCi0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTCBWYWx1ZSBpcyAlZCIsCisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUwgVmFsdWUgaXMgJWQiLAogICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTDoKLSAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IFJldmVyYkdldFJvb21IZkxldmVsKHBDb250ZXh0KTsKKyAgICAgICAgICAgICooaW50MTZfdCopcFZhbHVlID0gUmV2ZXJiR2V0Um9vbUhmTGV2ZWwocENvbnRleHQpOwogCi0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCBWYWx1ZSBpcyAlZCIsCisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwgVmFsdWUgaXMgJWQiLAogICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfVElNRToKLSAgICAgICAgICAgICoodWludDMyX3QgKilwVmFsdWUgPSBSZXZlcmJHZXREZWNheVRpbWUocENvbnRleHQpOworICAgICAgICAgICAgKih1aW50MzJfdCopcFZhbHVlID0gUmV2ZXJiR2V0RGVjYXlUaW1lKHBDb250ZXh0KTsKIAotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUUgVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FIFZhbHVlIGlzICVkIiwKICAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKilwVmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPOgotICAgICAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gUmV2ZXJiR2V0RGVjYXlIZlJhdGlvKHBDb250ZXh0KTsKKyAgICAgICAgICAgICooaW50MTZfdCopcFZhbHVlID0gUmV2ZXJiR2V0RGVjYXlIZlJhdGlvKHBDb250ZXh0KTsKIAotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPTiBWYWx1ZSBpcyAlZCIsCisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPTiBWYWx1ZSBpcyAlZCIsCiAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopcFZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUw6Ci0gICAgICAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gUmV2ZXJiR2V0UmV2ZXJiTGV2ZWwocENvbnRleHQpOworICAgICAgICAgICAgKihpbnQxNl90KilwVmFsdWUgPSBSZXZlcmJHZXRSZXZlcmJMZXZlbChwQ29udGV4dCk7CiAKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUwgVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUwgVmFsdWUgaXMgJWQiLAogICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fRElGRlVTSU9OOgotICAgICAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gUmV2ZXJiR2V0RGlmZnVzaW9uKHBDb250ZXh0KTsKKyAgICAgICAgICAgICooaW50MTZfdCopcFZhbHVlID0gUmV2ZXJiR2V0RGlmZnVzaW9uKHBDb250ZXh0KTsKIAotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX0RJRkZVU0lPTiBWYWx1ZSBpcyAlZCIsCisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX0RJRkZVU0lPTiBWYWx1ZSBpcyAlZCIsCiAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopcFZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERU5TSVRZOgotICAgICAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gUmV2ZXJiR2V0RGVuc2l0eShwQ29udGV4dCk7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fREVOU0lUWSBWYWx1ZSBpcyAlZCIsCisgICAgICAgICAgICAqKGludDE2X3QqKXBWYWx1ZSA9IFJldmVyYkdldERlbnNpdHkocENvbnRleHQpOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERU5TSVRZIFZhbHVlIGlzICVkIiwKICAgICAgICAgICAgIC8vICAgICAgICAqKHVpbnQzMl90ICopcFZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19MRVZFTDoKLSAgICAgICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSAwOworICAgICAgICAgICAgKih1aW50MTZfdCopcFZhbHVlID0gMDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19ERUxBWToKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZOgotICAgICAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSA9IDA7CisgICAgICAgICAgICAqKHVpbnQzMl90KilwVmFsdWUgPSAwOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTE2NTAsNyArMTU4MCw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIgZW5kIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlciBlbmQiKTsKICAgICByZXR1cm4gc3RhdHVzOwogfSAvKiBlbmQgUmV2ZXJiX2dldFBhcmFtZXRlciAqLwogCkBAIC0xNjcwLDE2ICsxNjAwLDE2IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBSZXZlcmJfc2V0UGFyYW1ldGVyIChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgdm9pZCAqcFBhcmFtLCB2b2lkICpwVmFsdWUsIGludCB2c2l6ZSl7CitpbnQgUmV2ZXJiX3NldFBhcmFtZXRlcihSZXZlcmJDb250ZXh0KiBwQ29udGV4dCwgdm9pZCogcFBhcmFtLCB2b2lkKiBwVmFsdWUsIGludCB2c2l6ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwogICAgIGludDE2X3QgbGV2ZWw7CiAgICAgaW50MTZfdCByYXRpbzsKICAgICB1aW50MzJfdCB0aW1lOwotICAgIHRfcmV2ZXJiX3NldHRpbmdzICpwUHJvcGVydGllczsKLSAgICBpbnQzMl90ICpwUGFyYW1UZW1wID0gKGludDMyX3QgKilwUGFyYW07CisgICAgdF9yZXZlcmJfc2V0dGluZ3MqIHBQcm9wZXJ0aWVzOworICAgIGludDMyX3QqIHBQYXJhbVRlbXAgPSAoaW50MzJfdCopcFBhcmFtOwogICAgIGludDMyX3QgcGFyYW0gPSAqcFBhcmFtVGVtcCsrOwogCi0gICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyIHN0YXJ0Iik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlciBzdGFydCIpOwogICAgIGlmIChwQ29udGV4dC0+cHJlc2V0KSB7CiAgICAgICAgIGlmIChwYXJhbSAhPSBSRVZFUkJfUEFSQU1fUFJFU0VUKSB7CiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTE2ODksNyArMTYxOSw3IEBACiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQogCi0gICAgICAgIHVpbnQxNl90IHByZXNldCA9ICoodWludDE2X3QgKilwVmFsdWU7CisgICAgICAgIHVpbnQxNl90IHByZXNldCA9ICoodWludDE2X3QqKXBWYWx1ZTsKICAgICAgICAgQUxPR1YoInNldCBSRVZFUkJfUEFSQU1fUFJFU0VULCBwcmVzZXQgJWQiLCBwcmVzZXQpOwogICAgICAgICBpZiAocHJlc2V0ID4gUkVWRVJCX1BSRVNFVF9MQVNUKSB7CiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTE3MDMsMTAgKzE2MzMsMTAgQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgc3dpdGNoIChwYXJhbSl7CisgICAgc3dpdGNoIChwYXJhbSkgewogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTOgogICAgICAgICAgICAgQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTIik7Ci0gICAgICAgICAgICBwUHJvcGVydGllcyA9ICh0X3JldmVyYl9zZXR0aW5ncyAqKSBwVmFsdWU7CisgICAgICAgICAgICBwUHJvcGVydGllcyA9ICh0X3JldmVyYl9zZXR0aW5ncyopcFZhbHVlOwogICAgICAgICAgICAgUmV2ZXJiU2V0Um9vbUxldmVsKHBDb250ZXh0LCBwUHJvcGVydGllcy0+cm9vbUxldmVsKTsKICAgICAgICAgICAgIFJldmVyYlNldFJvb21IZkxldmVsKHBDb250ZXh0LCBwUHJvcGVydGllcy0+cm9vbUhGTGV2ZWwpOwogICAgICAgICAgICAgUmV2ZXJiU2V0RGVjYXlUaW1lKHBDb250ZXh0LCBwUHJvcGVydGllcy0+ZGVjYXlUaW1lKTsKQEAgLTE3MTYsNTUgKzE2NDYsNTUgQEAKICAgICAgICAgICAgIFJldmVyYlNldERlbnNpdHkocENvbnRleHQsIHBQcm9wZXJ0aWVzLT5kZW5zaXR5KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0xFVkVMOgotICAgICAgICAgICAgbGV2ZWwgPSAqKGludDE2X3QgKilwVmFsdWU7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTCB2YWx1ZSBpcyAlZCIsIGxldmVsKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0Um9vbUxldmVsIik7CisgICAgICAgICAgICBsZXZlbCA9ICooaW50MTZfdCopcFZhbHVlOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ST09NX0xFVkVMIHZhbHVlIGlzICVkIiwgbGV2ZWwpOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0Um9vbUxldmVsIik7CiAgICAgICAgICAgICBSZXZlcmJTZXRSb29tTGV2ZWwocENvbnRleHQsIGxldmVsKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxlZCBSZXZlcmJTZXRSb29tTGV2ZWwiKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUw6Ci0gICAgICAgICAgICBsZXZlbCA9ICooaW50MTZfdCAqKXBWYWx1ZTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMIHZhbHVlIGlzICVkIiwgbGV2ZWwpOwotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBSZXZlcmJTZXRSb29tSGZMZXZlbCIpOwotICAgICAgICAgICAgUmV2ZXJiU2V0Um9vbUhmTGV2ZWwocENvbnRleHQsIGxldmVsKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxlZCBSZXZlcmJTZXRSb29tSGZMZXZlbCIpOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfVElNRToKLSAgICAgICAgICAgIHRpbWUgPSAqKHVpbnQzMl90ICopcFZhbHVlOwotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUUgdmFsdWUgaXMgJWQiLCB0aW1lKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0RGVjYXlUaW1lIik7Ci0gICAgICAgICAgICBSZXZlcmJTZXREZWNheVRpbWUocENvbnRleHQsIHRpbWUpOwotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldERlY2F5VGltZSIpOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU86Ci0gICAgICAgICAgICByYXRpbyA9ICooaW50MTZfdCAqKXBWYWx1ZTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTyB2YWx1ZSBpcyAlZCIsIHJhdGlvKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0RGVjYXlIZlJhdGlvIik7Ci0gICAgICAgICAgICBSZXZlcmJTZXREZWNheUhmUmF0aW8ocENvbnRleHQsIHJhdGlvKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxlZCBSZXZlcmJTZXREZWNheUhmUmF0aW8iKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgUmV2ZXJiU2V0Um9vbUxldmVsIik7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9MRVZFTDoKLSAgICAgICAgICAgIGxldmVsID0gKihpbnQxNl90ICopcFZhbHVlOwotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1JFVkVSQl9MRVZFTCB2YWx1ZSBpcyAlZCIsIGxldmVsKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0UmV2ZXJiTGV2ZWwiKTsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTDoKKyAgICAgICAgICAgIGxldmVsID0gKihpbnQxNl90KilwVmFsdWU7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwgdmFsdWUgaXMgJWQiLCBsZXZlbCk7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBSZXZlcmJTZXRSb29tSGZMZXZlbCIpOworICAgICAgICAgICAgUmV2ZXJiU2V0Um9vbUhmTGV2ZWwocENvbnRleHQsIGxldmVsKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgUmV2ZXJiU2V0Um9vbUhmTGV2ZWwiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FOgorICAgICAgICAgICAgdGltZSA9ICoodWludDMyX3QqKXBWYWx1ZTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fREVDQVlfVElNRSB2YWx1ZSBpcyAlZCIsIHRpbWUpOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0RGVjYXlUaW1lIik7CisgICAgICAgICAgICBSZXZlcmJTZXREZWNheVRpbWUocENvbnRleHQsIHRpbWUpOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxlZCBSZXZlcmJTZXREZWNheVRpbWUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTzoKKyAgICAgICAgICAgIHJhdGlvID0gKihpbnQxNl90KilwVmFsdWU7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPIHZhbHVlIGlzICVkIiwgcmF0aW8pOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0RGVjYXlIZlJhdGlvIik7CisgICAgICAgICAgICBSZXZlcmJTZXREZWNheUhmUmF0aW8ocENvbnRleHQsIHJhdGlvKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgUmV2ZXJiU2V0RGVjYXlIZlJhdGlvIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMOgorICAgICAgICAgICAgbGV2ZWwgPSAqKGludDE2X3QqKXBWYWx1ZTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMIHZhbHVlIGlzICVkIiwgbGV2ZWwpOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0UmV2ZXJiTGV2ZWwiKTsKICAgICAgICAgICAgIFJldmVyYlNldFJldmVyYkxldmVsKHBDb250ZXh0LCBsZXZlbCk7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgUmV2ZXJiU2V0UmV2ZXJiTGV2ZWwiKTsKLSAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldFJldmVyYkxldmVsIik7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fRElGRlVTSU9OOgotICAgICAgICAgICAgcmF0aW8gPSAqKGludDE2X3QgKilwVmFsdWU7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fREVDQVlfRElGRlVTSU9OIHZhbHVlIGlzICVkIiwgcmF0aW8pOwotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBSZXZlcmJTZXREaWZmdXNpb24iKTsKKyAgICAgICAgICAgIHJhdGlvID0gKihpbnQxNl90KilwVmFsdWU7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX0RJRkZVU0lPTiB2YWx1ZSBpcyAlZCIsIHJhdGlvKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsaW5nIFJldmVyYlNldERpZmZ1c2lvbiIpOwogICAgICAgICAgICAgUmV2ZXJiU2V0RGlmZnVzaW9uKHBDb250ZXh0LCByYXRpbyk7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgUmV2ZXJiU2V0RGlmZnVzaW9uIik7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldERpZmZ1c2lvbiIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFTlNJVFk6Ci0gICAgICAgICAgICByYXRpbyA9ICooaW50MTZfdCAqKXBWYWx1ZTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERUNBWV9ERU5TSVRZIHZhbHVlIGlzICVkIiwgcmF0aW8pOwotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBSZXZlcmJTZXREZW5zaXR5Iik7CisgICAgICAgICAgICByYXRpbyA9ICooaW50MTZfdCopcFZhbHVlOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERUNBWV9ERU5TSVRZIHZhbHVlIGlzICVkIiwgcmF0aW8pOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0RGVuc2l0eSIpOwogICAgICAgICAgICAgUmV2ZXJiU2V0RGVuc2l0eShwQ29udGV4dCwgcmF0aW8pOwotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldERlbnNpdHkiKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgUmV2ZXJiU2V0RGVuc2l0eSIpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMOgogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19ERUxBWToKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZOgpAQCAtMTc3NCw3ICsxNzA0LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlciBlbmQiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyIGVuZCIpOwogICAgIHJldHVybiBzdGF0dXM7CiB9IC8qIGVuZCBSZXZlcmJfc2V0UGFyYW1ldGVyICovCiAKQEAgLTE3ODMsNTIgKzE3MTMsNDYgQEAKICAqLwogaW50IFJldmVyYl9wYXJhbVZhbHVlU2l6ZShpbnQzMl90IHBhcmFtKSB7CiAgICAgc3dpdGNoIChwYXJhbSkgewotICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUw6Ci0gICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTDoKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19MRVZFTDoKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUw6Ci0gICAgICAgIHJldHVybiBzaXplb2YoaW50MTZfdCk7IC8vIG1pbGxpYmVsCi0gICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfVElNRToKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19ERUxBWToKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfREVMQVk6Ci0gICAgICAgIHJldHVybiBzaXplb2YodWludDMyX3QpOyAvLyBtaWxsaXNlY29uZHMKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTzoKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9ESUZGVVNJT046Ci0gICAgY2FzZSBSRVZFUkJfUEFSQU1fREVOU0lUWToKLSAgICAgICAgcmV0dXJuIHNpemVvZihpbnQxNl90KTsgLy8gcGVybWlsbGUKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTOgotICAgICAgICByZXR1cm4gc2l6ZW9mKHNfcmV2ZXJiX3NldHRpbmdzKTsgLy8gc3RydWN0IG9mIGFsbCByZXZlcmIgcHJvcGVydGllcworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0xFVkVMOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19MRVZFTDoKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMOgorICAgICAgICAgICAgcmV0dXJuIHNpemVvZihpbnQxNl90KTsgIC8vIG1pbGxpYmVsCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUU6CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0RFTEFZOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfREVMQVk6CisgICAgICAgICAgICByZXR1cm4gc2l6ZW9mKHVpbnQzMl90KTsgIC8vIG1pbGxpc2Vjb25kcworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTzoKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fRElGRlVTSU9OOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERU5TSVRZOgorICAgICAgICAgICAgcmV0dXJuIHNpemVvZihpbnQxNl90KTsgIC8vIHBlcm1pbGxlCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVM6CisgICAgICAgICAgICByZXR1cm4gc2l6ZW9mKHNfcmV2ZXJiX3NldHRpbmdzKTsgIC8vIHN0cnVjdCBvZiBhbGwgcmV2ZXJiIHByb3BlcnRpZXMKICAgICB9CiAgICAgcmV0dXJuIHNpemVvZihpbnQzMl90KTsKIH0KIAotfSAvLyBuYW1lc3BhY2UKLX0gLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKIGV4dGVybiAiQyIgewogLyogRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uOiBQcm9jZXNzICovCi1pbnQgUmV2ZXJiX3Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90ICAgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICAgICAgICAgKmluQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgICAgICAgICAqb3V0QnVmZmVyKXsKLSAgICBhbmRyb2lkOjpSZXZlcmJDb250ZXh0ICogcENvbnRleHQgPSAoYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCAqKSBzZWxmOwotICAgIGludCAgICBzdGF0dXMgPSAwOworaW50IFJldmVyYl9wcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCBhdWRpb19idWZmZXJfdCogaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90KiBvdXRCdWZmZXIpIHsKKyAgICBhbmRyb2lkOjpSZXZlcmJDb250ZXh0KiBwQ29udGV4dCA9IChhbmRyb2lkOjpSZXZlcmJDb250ZXh0KilzZWxmOworICAgIGludCBzdGF0dXMgPSAwOwogCi0gICAgaWYgKHBDb250ZXh0ID09IE5VTEwpeworICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9wcm9jZXNzKCkgRVJST1IgcENvbnRleHQgPT0gTlVMTCIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9Ci0gICAgaWYgKGluQnVmZmVyID09IE5VTEwgIHx8IGluQnVmZmVyLT5yYXcgPT0gTlVMTCAgfHwKLSAgICAgICAgICAgIG91dEJ1ZmZlciA9PSBOVUxMIHx8IG91dEJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKLSAgICAgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50ICE9IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCl7CisgICAgaWYgKGluQnVmZmVyID09IE5VTEwgfHwgaW5CdWZmZXItPnJhdyA9PSBOVUxMIHx8IG91dEJ1ZmZlciA9PSBOVUxMIHx8IG91dEJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKKyAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgIT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50KSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9wcm9jZXNzKCkgRVJST1IgTlVMTCBJTlBVVCBQT0lOVEVSIE9SIEZSQU1FIENPVU5UIElTIFdST05HIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KLSAgICAvL0FMT0dWKCJcdFJldmVyYl9wcm9jZXNzKCkgQ2FsbGluZyBwcm9jZXNzIHdpdGggJWQgZnJhbWVzIiwgb3V0QnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJfcHJvY2VzcygpIENhbGxpbmcgcHJvY2VzcyB3aXRoICVkIGZyYW1lcyIsIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCk7CiAgICAgLyogUHJvY2VzcyBhbGwgdGhlIGF2YWlsYWJsZSBmcmFtZXMsIGJsb2NrIHByb2Nlc3NpbmcgaXMgaGFuZGxlZCBpbnRlcm5hbExZIGJ5IHRoZSBMVk0gYnVuZGxlICovCi0gICAgc3RhdHVzID0gcHJvY2VzcyggICAgaW5CdWZmZXItPmYzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmYzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQpOworICAgIHN0YXR1cyA9IHByb2Nlc3MoaW5CdWZmZXItPmYzMiwgb3V0QnVmZmVyLT5mMzIsIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCwgcENvbnRleHQpOwogCiAgICAgaWYgKHBDb250ZXh0LT5iRW5hYmxlZCA9PSBMVk1fRkFMU0UpIHsKICAgICAgICAgaWYgKHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQgPiAwKSB7CkBAIC0xODQwLDcyICsxNzY0LDY3IEBACiAgICAgfQogCiAgICAgcmV0dXJuIHN0YXR1czsKLX0gICAvKiBlbmQgUmV2ZXJiX3Byb2Nlc3MgKi8KK30gLyogZW5kIFJldmVyYl9wcm9jZXNzICovCiAKIC8qIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbjogQ29tbWFuZCAqLwotaW50IFJldmVyYl9jb21tYW5kKGVmZmVjdF9oYW5kbGVfdCAgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgY21kQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgY21kU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgKnBDbWREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAqcmVwbHlTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAqcFJlcGx5RGF0YSl7Ci0gICAgYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCAqIHBDb250ZXh0ID0gKGFuZHJvaWQ6OlJldmVyYkNvbnRleHQgKikgc2VsZjsKLSAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCitpbnQgUmV2ZXJiX2NvbW1hbmQoZWZmZWN0X2hhbmRsZV90IHNlbGYsIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQqIHBDbWREYXRhLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiByZXBseVNpemUsIHZvaWQqIHBSZXBseURhdGEpIHsKKyAgICBhbmRyb2lkOjpSZXZlcmJDb250ZXh0KiBwQ29udGV4dCA9IChhbmRyb2lkOjpSZXZlcmJDb250ZXh0KilzZWxmOworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVlJFVl9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCi0gICAgaWYgKHBDb250ZXh0ID09IE5VTEwpeworICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9jb21tYW5kIEVSUk9SIHBDb250ZXh0ID09IE5VTEwiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgLy9BTE9HVigiXHRSZXZlcmJfY29tbWFuZCBJTlBVVFMgYXJlOiBjb21tYW5kICVkIGNtZFNpemUgJWQiLGNtZENvZGUsIGNtZFNpemUpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYl9jb21tYW5kIElOUFVUUyBhcmU6IGNvbW1hbmQgJWQgY21kU2l6ZSAlZCIsY21kQ29kZSwgY21kU2l6ZSk7CiAKLSAgICBzd2l0Y2ggKGNtZENvZGUpeworICAgIHN3aXRjaCAoY21kQ29kZSkgewogICAgICAgICBjYXNlIEVGRkVDVF9DTURfSU5JVDoKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKICAgICAgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9JTklUIHN0YXJ0Iik7CiAKLSAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSl7CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0lOSVQ6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfSU5JVDogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICooaW50ICopIHBSZXBseURhdGEgPSAwOworICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSAwOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9DT05GSUc6Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCiAgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfU0VUX0NPTkZJRyBzdGFydCIpOwotICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fAotICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgeworICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfQ09ORklHOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9DT05GSUc6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAqKGludCAqKSBwUmVwbHlEYXRhID0gYW5kcm9pZDo6UmV2ZXJiX3NldENvbmZpZyhwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlZmZlY3RfY29uZmlnX3QgKikgcENtZERhdGEpOworICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpSZXZlcmJfc2V0Q29uZmlnKHBDb250ZXh0LCAoZWZmZWN0X2NvbmZpZ190KilwQ21kRGF0YSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEVGRkVDVF9DTURfR0VUX0NPTkZJRzoKICAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX0NPTkZJRzogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9HRVRfQ09ORklHOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBhbmRyb2lkOjpSZXZlcmJfZ2V0Q29uZmlnKHBDb250ZXh0LCAoZWZmZWN0X2NvbmZpZ190ICopcFJlcGx5RGF0YSk7CisgICAgICAgICAgICBhbmRyb2lkOjpSZXZlcmJfZ2V0Q29uZmlnKHBDb250ZXh0LCAoZWZmZWN0X2NvbmZpZ190KilwUmVwbHlEYXRhKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9SRVNFVDoKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKICAgICAgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9SRVNFVCBzdGFydCIpOwogICAgICAgICAgICAgUmV2ZXJiX3NldENvbmZpZyhwQ29udGV4dCwgJnBDb250ZXh0LT5jb25maWcpOwogICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0dFVF9QQVJBTTp7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICBjYXNlIEVGRkVDVF9DTURfR0VUX1BBUkFNOiB7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKICAgICAgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9HRVRfUEFSQU0gc3RhcnQiKTsKLSAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopcENtZERhdGE7CisgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCogcCA9IChlZmZlY3RfcGFyYW1fdCopcENtZERhdGE7CiAgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dXKCJcdExWTV9FUlJPUiA6IHBDbWREYXRhIGlzIE5VTEwiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTE5MTQsMTYzICsxODMzLDE1NiBAQAogICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjYzNDc1MDkiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjbWRTaXplIDwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSB8fAotICAgICAgICAgICAgICAgICAgICBjbWRTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgICAgICpyZXBseVNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKSkgeworICAgICAgICAgICAgaWYgKGNtZFNpemUgPCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpIHx8IGNtZFNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKSB8fAorICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICpyZXBseVNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9QQVJBTTogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsIHBDbWREYXRhLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpOwogCi0gICAgICAgICAgICBwID0gKGVmZmVjdF9wYXJhbV90ICopcFJlcGx5RGF0YTsKKyAgICAgICAgICAgIHAgPSAoZWZmZWN0X3BhcmFtX3QqKXBSZXBseURhdGE7CiAKICAgICAgICAgICAgIGludCB2b2Zmc2V0ID0gKChwLT5wc2l6ZSAtIDEpIC8gc2l6ZW9mKGludDMyX3QpICsgMSkgKiBzaXplb2YoaW50MzJfdCk7CiAKLSAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OlJldmVyYl9nZXRQYXJhbWV0ZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKKyAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OlJldmVyYl9nZXRQYXJhbWV0ZXIocENvbnRleHQsICh2b2lkKilwLT5kYXRhLCAmcC0+dnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKIAogICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0ICsgcC0+dnNpemU7CiAKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gIgorICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gIgogICAgICAgICAgICAgLy8gICAgICAgICIqcENtZERhdGEgJWQsICpyZXBseVNpemUgJWQsICpwUmVwbHlEYXRhICVkICIsCiAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKICAgICAgICAgICAgIC8vICAgICAgICAqcmVwbHlTaXplLAogICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKSgoY2hhciAqKXBSZXBseURhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCkpOwogCiAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfUEFSQU06ewotCi0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1BBUkFNOiB7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKICAgICAgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU0gc3RhcnQiKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU0gcGFyYW0gJWQsICpyZXBseVNpemUgJWQsIHZhbHVlICVkICIsCisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBwYXJhbSAlZCwgKnJlcGx5U2l6ZSAlZCwgdmFsdWUgJWQgIiwKICAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLAogICAgICAgICAgICAgLy8gICAgICAgICpyZXBseVNpemUsCiAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSk7CiAKICAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IChjbWRTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpKSB8fAotICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgIHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwQ21kRGF0YTsKKyAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90KiBwID0gKGVmZmVjdF9wYXJhbV90KilwQ21kRGF0YTsKIAotICAgICAgICAgICAgaWYgKHAtPnBzaXplICE9IHNpemVvZihpbnQzMl90KSl7CisgICAgICAgICAgICBpZiAocC0+cHNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0NExWTV9FUlJPUiA6IFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiwgcHNpemUgaXMgbm90IHNpemVvZihpbnQzMl90KSIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IsIHBzaXplIGlzIG5vdCBzaXplb2YoaW50MzJfdCkiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy9BTE9HVigiXHRuNVJldmVyYl9jb21tYW5kIGNtZFNpemUgaXMgJWRcbiIKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdG41UmV2ZXJiX2NvbW1hbmQgY21kU2l6ZSBpcyAlZFxuIgogICAgICAgICAgICAgLy8gICAgICAgICJcdHNpemVvZihlZmZlY3RfcGFyYW1fdCkgaXMgICVkXG4iCiAgICAgICAgICAgICAvLyAgICAgICAgIlx0cC0+cHNpemUgaXMgJWRcbiIKICAgICAgICAgICAgIC8vICAgICAgICAiXHRwLT52c2l6ZSBpcyAlZCIKICAgICAgICAgICAgIC8vICAgICAgICAiXG4iLAogICAgICAgICAgICAgLy8gICAgICAgIGNtZFNpemUsIHNpemVvZihlZmZlY3RfcGFyYW1fdCksIHAtPnBzaXplLCBwLT52c2l6ZSApOwogCi0gICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpSZXZlcmJfc2V0UGFyYW1ldGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHAtPnBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT52c2l6ZSk7CisgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OlJldmVyYl9zZXRQYXJhbWV0ZXIocENvbnRleHQsICh2b2lkKilwLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyBwLT5wc2l6ZSwgcC0+dnNpemUpOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9FTkFCTEU6Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCiAgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfRU5BQkxFIHN0YXJ0Iik7CiAKLSAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSl7CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0VOQUJMRTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9FTkFCTEU6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwQ29udGV4dC0+YkVuYWJsZWQgPT0gTFZNX1RSVUUpewotICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9FTkFCTEU6IEVSUk9SLUVmZmVjdCBpcyBhbHJlYWR5IGVuYWJsZWQiKTsKLSAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+YkVuYWJsZWQgPT0gTFZNX1RSVUUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9FTkFCTEU6IEVSUk9SLUVmZmVjdCBpcyBhbHJlYWR5IGVuYWJsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0gMDsKICAgICAgICAgICAgIHBDb250ZXh0LT5iRW5hYmxlZCA9IExWTV9UUlVFOwogICAgICAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgICAgICAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICAgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyIsICJFRkZFQ1RfQ01EX0VOQUJMRSIpCiAgICAgICAgICAgICBwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50ID0KLSAgICAgICAgICAgICAgICAgICAgKEFjdGl2ZVBhcmFtcy5UNjAgKiBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSkvMTAwMDsKKyAgICAgICAgICAgICAgICAgICAgKEFjdGl2ZVBhcmFtcy5UNjAgKiBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgLyAxMDAwOwogICAgICAgICAgICAgLy8gZm9yY2Ugbm8gdm9sdW1lIHJhbXAgZm9yIGZpcnN0IGJ1ZmZlciBwcm9jZXNzZWQgYWZ0ZXIgZW5hYmxpbmcgdGhlIGVmZmVjdAogICAgICAgICAgICAgcENvbnRleHQtPnZvbHVtZU1vZGUgPSBhbmRyb2lkOjpSRVZFUkJfVk9MVU1FX0ZMQVQ7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdEVGRkVDVF9DTURfRU5BQkxFIFNhbXBsZXNUb0V4aXRDb3VudCA9ICVkIiwgcENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudCk7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRFRkZFQ1RfQ01EX0VOQUJMRSBTYW1wbGVzVG9FeGl0Q291bnQgPSAlZCIsIHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9ESVNBQkxFOgotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgogICAgICAgICAgICAgLy8gICAgICAgICJFRkZFQ1RfQ01EX0RJU0FCTEUgc3RhcnQiKTsKIAotICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKXsKKyAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfRElTQUJMRTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9ESVNBQkxFOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocENvbnRleHQtPmJFbmFibGVkID09IExWTV9GQUxTRSl7Ci0gICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0RJU0FCTEU6IEVSUk9SLUVmZmVjdCBpcyBub3QgeWV0IGVuYWJsZWQiKTsKLSAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+YkVuYWJsZWQgPT0gTFZNX0ZBTFNFKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfRElTQUJMRTogRVJST1ItRWZmZWN0IGlzIG5vdCB5ZXQgZW5hYmxlZCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSAwOwogICAgICAgICAgICAgcENvbnRleHQtPmJFbmFibGVkID0gTFZNX0ZBTFNFOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6Ci0gICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgIGNtZFNpemUgIT0gMiAqIHNpemVvZih1aW50MzJfdCkpIHsKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gMiAqIHNpemVvZih1aW50MzJfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1ZPTFVNRTogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgIT0gTlVMTCkgeyAvLyB3ZSBoYXZlIHZvbHVtZSBjb250cm9sCi0gICAgICAgICAgICAgICAgcENvbnRleHQtPmxlZnRWb2x1bWUgPSAoTFZNX0lOVDE2KSgoKih1aW50MzJfdCAqKXBDbWREYXRhICsgKDEgPDwgMTEpKSA+PiAxMik7Ci0gICAgICAgICAgICAgICAgcENvbnRleHQtPnJpZ2h0Vm9sdW1lID0gKExWTV9JTlQxNikoKCooKHVpbnQzMl90ICopcENtZERhdGEgKyAxKSArICgxIDw8IDExKSkgPj4gMTIpOwotICAgICAgICAgICAgICAgICoodWludDMyX3QgKilwUmVwbHlEYXRhID0gKDEgPDwgMjQpOwotICAgICAgICAgICAgICAgICooKHVpbnQzMl90ICopcFJlcGx5RGF0YSArIDEpID0gKDEgPDwgMjQpOworICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgIT0gTlVMTCkgeyAgLy8gd2UgaGF2ZSB2b2x1bWUgY29udHJvbAorICAgICAgICAgICAgICAgIHBDb250ZXh0LT5sZWZ0Vm9sdW1lID0gKExWTV9JTlQxNikoKCoodWludDMyX3QqKXBDbWREYXRhICsgKDEgPDwgMTEpKSA+PiAxMik7CisgICAgICAgICAgICAgICAgcENvbnRleHQtPnJpZ2h0Vm9sdW1lID0gKExWTV9JTlQxNikoKCooKHVpbnQzMl90KilwQ21kRGF0YSArIDEpICsgKDEgPDwgMTEpKSA+PiAxMik7CisgICAgICAgICAgICAgICAgKih1aW50MzJfdCopcFJlcGx5RGF0YSA9ICgxIDw8IDI0KTsKKyAgICAgICAgICAgICAgICAqKCh1aW50MzJfdCopcFJlcGx5RGF0YSArIDEpID0gKDEgPDwgMjQpOwogICAgICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+dm9sdW1lTW9kZSA9PSBhbmRyb2lkOjpSRVZFUkJfVk9MVU1FX09GRikgewogICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZSBubyB2b2x1bWUgcmFtcCBmb3IgZmlyc3QgYnVmZmVyIHByb2Nlc3NlZCBhZnRlciBnZXR0aW5nIHZvbHVtZSBjb250cm9sCiAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT52b2x1bWVNb2RlID0gYW5kcm9pZDo6UkVWRVJCX1ZPTFVNRV9GTEFUOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7IC8vIHdlIGRvbid0IGhhdmUgdm9sdW1lIGNvbnRyb2wKKyAgICAgICAgICAgIH0gZWxzZSB7ICAvLyB3ZSBkb24ndCBoYXZlIHZvbHVtZSBjb250cm9sCiAgICAgICAgICAgICAgICAgcENvbnRleHQtPmxlZnRWb2x1bWUgPSBSRVZFUkJfVU5JVF9WT0xVTUU7CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPnJpZ2h0Vm9sdW1lID0gUkVWRVJCX1VOSVRfVk9MVU1FOwogICAgICAgICAgICAgICAgIHBDb250ZXh0LT52b2x1bWVNb2RlID0gYW5kcm9pZDo6UkVWRVJCX1ZPTFVNRV9PRkY7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiRUZGRUNUX0NNRF9TRVRfVk9MVU1FIGxlZnQgJWQsIHJpZ2h0ICVkIG1vZGUgJWQiLAotICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+bGVmdFZvbHVtZSwgcENvbnRleHQtPnJpZ2h0Vm9sdW1lLCAgcENvbnRleHQtPnZvbHVtZU1vZGUpOworICAgICAgICAgICAgQUxPR1YoIkVGRkVDVF9DTURfU0VUX1ZPTFVNRSBsZWZ0ICVkLCByaWdodCAlZCBtb2RlICVkIiwgcENvbnRleHQtPmxlZnRWb2x1bWUsCisgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cmlnaHRWb2x1bWUsIHBDb250ZXh0LT52b2x1bWVNb2RlKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfREVWSUNFOgogICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0FVRElPX01PREU6Ci0gICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9TRVRfREVWSUNFL0VGRkVDVF9DTURfU0VUX1ZPTFVNRS9FRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFIHN0YXJ0Iik7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9TRVRfREVWSUNFL0VGRkVDVF9DTURfU0VUX1ZPTFVNRS9FRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFCisgICAgICAgICAgICAvLyAgICAgICAgc3RhcnQiKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgIkRFRkFVTFQgc3RhcnQgJWQgRVJST1IiLGNtZENvZGUpOworICAgICAgICAgICAgICAgICAgIkRFRkFVTFQgc3RhcnQgJWQgRVJST1IiLAorICAgICAgICAgICAgICAgICAgY21kQ29kZSk7CiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdFJldmVyYl9jb21tYW5kIGVuZFxuXG4iKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJfY29tbWFuZCBlbmRcblxuIik7CiAgICAgcmV0dXJuIDA7Ci19ICAgIC8qIGVuZCBSZXZlcmJfY29tbWFuZCAqLworfSAvKiBlbmQgUmV2ZXJiX2NvbW1hbmQgKi8KIAogLyogRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uOiBnZXRfZGVzY3JpcHRvciAqLwotaW50IFJldmVyYl9nZXREZXNjcmlwdG9yKGVmZmVjdF9oYW5kbGVfdCAgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikKLXsKLSAgICBhbmRyb2lkOjpSZXZlcmJDb250ZXh0ICogcENvbnRleHQgPSAoYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCAqKXNlbGY7Ci0gICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYzsKK2ludCBSZXZlcmJfZ2V0RGVzY3JpcHRvcihlZmZlY3RfaGFuZGxlX3Qgc2VsZiwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogcERlc2NyaXB0b3IpIHsKKyAgICBhbmRyb2lkOjpSZXZlcmJDb250ZXh0KiBwQ29udGV4dCA9IChhbmRyb2lkOjpSZXZlcmJDb250ZXh0KilzZWxmOworICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QqIGRlc2M7CiAKICAgICBpZiAocENvbnRleHQgPT0gTlVMTCB8fCBwRGVzY3JpcHRvciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJSZXZlcmJfZ2V0RGVzY3JpcHRvcigpIGludmFsaWQgcGFyYW0iKTsKQEAgLTIwOTQsMjYgKzIwMDYsMjQgQEAKICAgICAqcERlc2NyaXB0b3IgPSAqZGVzYzsKIAogICAgIHJldHVybiAwOwotfSAgIC8qIGVuZCBSZXZlcmJfZ2V0RGVzY3JpcHRvciAqLworfSAvKiBlbmQgUmV2ZXJiX2dldERlc2NyaXB0b3IgKi8KIAogLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgUmV2ZXJiIGVmZmVjdAogY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnUmV2ZXJiSW50ZXJmYWNlID0gewotICAgIFJldmVyYl9wcm9jZXNzLAotICAgIFJldmVyYl9jb21tYW5kLAotICAgIFJldmVyYl9nZXREZXNjcmlwdG9yLAotICAgIE5VTEwsCi19OyAgICAvKiBlbmQgZ1JldmVyYkludGVyZmFjZSAqLworICAgICAgICBSZXZlcmJfcHJvY2VzcywKKyAgICAgICAgUmV2ZXJiX2NvbW1hbmQsCisgICAgICAgIFJldmVyYl9nZXREZXNjcmlwdG9yLAorICAgICAgICBOVUxMLAorfTsgLyogZW5kIGdSZXZlcmJJbnRlcmZhY2UgKi8KIAogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAotX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTSA9IHsKLSAgICAudGFnID0gQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHLAotICAgIC52ZXJzaW9uID0gRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04sCi0gICAgLm5hbWUgPSAiUmV2ZXJiIExpYnJhcnkiLAotICAgIC5pbXBsZW1lbnRvciA9ICJOWFAgU29mdHdhcmUgTHRkLiIsCi0gICAgLmNyZWF0ZV9lZmZlY3QgPSBhbmRyb2lkOjpFZmZlY3RDcmVhdGUsCi0gICAgLnJlbGVhc2VfZWZmZWN0ID0gYW5kcm9pZDo6RWZmZWN0UmVsZWFzZSwKLSAgICAuZ2V0X2Rlc2NyaXB0b3IgPSBhbmRyb2lkOjpFZmZlY3RHZXREZXNjcmlwdG9yLAorX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkgYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTSA9IHsKKyAgICAgICAgLnRhZyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRywKKyAgICAgICAgLnZlcnNpb24gPSBFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTiwKKyAgICAgICAgLm5hbWUgPSAiUmV2ZXJiIExpYnJhcnkiLAorICAgICAgICAuaW1wbGVtZW50b3IgPSAiTlhQIFNvZnR3YXJlIEx0ZC4iLAorICAgICAgICAuY3JlYXRlX2VmZmVjdCA9IGFuZHJvaWQ6OkVmZmVjdENyZWF0ZSwKKyAgICAgICAgLnJlbGVhc2VfZWZmZWN0ID0gYW5kcm9pZDo6RWZmZWN0UmVsZWFzZSwKKyAgICAgICAgLmdldF9kZXNjcmlwdG9yID0gYW5kcm9pZDo6RWZmZWN0R2V0RGVzY3JpcHRvciwKIH07Ci0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmgKaW5kZXggOTYyMjNhOC4uMjI3ZDk1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmgKQEAgLTIwLDE2ICsyMCwxNSBAQAogI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X2Vudmlyb25tZW50YWxyZXZlcmIuaD4KICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9wcmVzZXRyZXZlcmIuaD4KIAotI2RlZmluZSBNQVhfTlVNX0JBTkRTICAgICAgICAgICA1Ci0jZGVmaW5lIE1BWF9DQUxMX1NJWkUgICAgICAgICAgIDI1NgotI2RlZmluZSBMVlJFVl9NQVhfVDYwICAgICAgICAgICA3MDAwCi0jZGVmaW5lIExWUkVWX01BWF9SRVZFUkJfTEVWRUwgIDIwMDAKLSNkZWZpbmUgTFZSRVZfTUFYX0ZSQU1FX1NJWkUgICAgMjU2MAotI2RlZmluZSBMVlJFVl9DVVBfTE9BRF9BUk05RSAgICA0NzAgICAgLy8gRXhwcmVzc2VkIGluIDAuMSBNSVBTCi0jZGVmaW5lIExWUkVWX01FTV9VU0FHRSAgICAgICAgICg3MSsoTFZSRVZfTUFYX0ZSQU1FX1NJWkU+PjcpKSAgICAgLy8gRXhwcmVzc2VkIGluIGtCCisjZGVmaW5lIE1BWF9OVU1fQkFORFMgNQorI2RlZmluZSBNQVhfQ0FMTF9TSVpFIDI1NgorI2RlZmluZSBMVlJFVl9NQVhfVDYwIDcwMDAKKyNkZWZpbmUgTFZSRVZfTUFYX1JFVkVSQl9MRVZFTCAyMDAwCisjZGVmaW5lIExWUkVWX01BWF9GUkFNRV9TSVpFIDI1NjAKKyNkZWZpbmUgTFZSRVZfQ1VQX0xPQURfQVJNOUUgNDcwICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4cHJlc3NlZCBpbiAwLjEgTUlQUworI2RlZmluZSBMVlJFVl9NRU1fVVNBR0UgKDcxICsgKExWUkVWX01BWF9GUkFNRV9TSVpFID4+IDcpKSAgLy8gRXhwcmVzc2VkIGluIGtCCiAKLXR5cGVkZWYgc3RydWN0IF9MUEZQYWlyX3QKLXsKK3R5cGVkZWYgc3RydWN0IF9MUEZQYWlyX3QgewogICAgIGludDE2X3QgUm9vbV9IRjsKICAgICBpbnQxNl90IExQRjsKIH0gTFBGUGFpcl90OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nLy5jbGFuZy1mb3JtYXQgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvLmNsYW5nLWZvcm1hdApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5mMWI0ZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nLy5jbGFuZy1mb3JtYXQKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vLi4vLi4vYnVpbGQvc29vbmcvc2NyaXB0cy9zeXN0ZW0tY2xhbmctZm9ybWF0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5icAppbmRleCBjODc2MzVmLi5jNmUwMzZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5icApAQCAtMSwzNSArMSw2MCBAQAogLy8gYXVkaW8gcHJlcHJvY2Vzc2luZyB3cmFwcGVyCi1jY19saWJyYXJ5X3NoYXJlZCB7Ci0gICAgbmFtZTogImxpYmF1ZGlvcHJlcHJvY2Vzc2luZyIsCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGliZWZmZWN0c19wcmVwcm9jZXNzaW5nX2xpY2Vuc2UiLAorICAgIF0sCit9CiAKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYmVmZmVjdHNfcHJlcHJvY2Vzc2luZ19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmF1ZGlvcHJlcHJvY2Vzc2luZy1kZWZhdWx0cyIsCiAgICAgdmVuZG9yOiB0cnVlLAotCi0gICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic291bmRmeCIsCi0KLSAgICBzcmNzOiBbIlByZVByb2Nlc3NpbmcuY3BwIl0sCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImV4dGVybmFsL3dlYnJ0YyIsCi0gICAgICAgICJleHRlcm5hbC93ZWJydGMvd2VicnRjL21vZHVsZXMvaW5jbHVkZSIsCi0gICAgICAgICJleHRlcm5hbC93ZWJydGMvd2VicnRjL21vZHVsZXMvYXVkaW9fcHJvY2Vzc2luZy9pbmNsdWRlIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlid2VicnRjX2F1ZGlvX3ByZXByb2Nlc3NpbmciLAotICAgICAgICAibGlic3BlZXhyZXNhbXBsZXIiLAotICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItRFdFQlJUQ19QT1NJWCIsCi0gICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKLSAgICAgICAgIi1XYWxsIiwKLSAgICAgICAgIi1XZXJyb3IiLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJ3ZWJydGNfYXVkaW9fcHJvY2Vzc2luZyIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAogICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCiAgICAgXSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliYXVkaW9wcmVwcm9jZXNzaW5nIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb3ByZXByb2Nlc3NpbmctZGVmYXVsdHMiXSwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzb3VuZGZ4IiwKKyAgICBzcmNzOiBbIlByZVByb2Nlc3NpbmcuY3BwIl0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYndlYnJ0Y19hYnNsX2hlYWRlcnMiLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAKaW5kZXggNWZhYjViZS4uMTlhOGIyZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1ByZVByb2Nlc3NpbmcuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcApAQCAtMTgsMTUgKzE4LDE1IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjZGVmaW5lIExPR19UQUcgIlByZVByb2Nlc3NpbmciCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CiAjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYWVjLmg+CiAjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYWdjLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYWdjMi5oPgogI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X25zLmg+Ci0jaW5jbHVkZSA8bW9kdWxlX2NvbW1vbl90eXBlcy5oPgogI2luY2x1ZGUgPGF1ZGlvX3Byb2Nlc3NpbmcuaD4KLSNpbmNsdWRlICJzcGVleC9zcGVleF9yZXNhbXBsZXIuaCIKKyNpbmNsdWRlIDxtb2R1bGVfY29tbW9uX3R5cGVzLmg+CiAKIC8vIHVuZGVmaW5lIHRvIHBlcmZvcm0gbXVsdGkgY2hhbm5lbHMgQVBJIGZ1bmN0aW9uYWwgdGVzdHMKIC8vI2RlZmluZSBEVUFMX01JQ19URVNUCkBAIC0zOSwyNiArMzksMjYgQEAKICNkZWZpbmUgUFJFUFJPQ19OVU1fU0VTU0lPTlMgOAogCiAvLyB0eXBlcyBvZiBwcmUgcHJvY2Vzc2luZyBtb2R1bGVzCi1lbnVtIHByZXByb2NfaWQKLXsKLSAgICBQUkVQUk9DX0FHQywgICAgICAgIC8vIEF1dG9tYXRpYyBHYWluIENvbnRyb2wKLSAgICBQUkVQUk9DX0FFQywgICAgICAgIC8vIEFjb3VzdGljIEVjaG8gQ2FuY2VsZXIKLSAgICBQUkVQUk9DX05TLCAgICAgICAgIC8vIE5vaXNlIFN1cHByZXNzb3IKK2VudW0gcHJlcHJvY19pZCB7CisgICAgUFJFUFJPQ19BR0MsICAvLyBBdXRvbWF0aWMgR2FpbiBDb250cm9sCisgICAgUFJFUFJPQ19BR0MyLCAgLy8gQXV0b21hdGljIEdhaW4gQ29udHJvbCAyCisgICAgUFJFUFJPQ19BRUMsICAvLyBBY291c3RpYyBFY2hvIENhbmNlbGVyCisgICAgUFJFUFJPQ19OUywgICAvLyBOb2lzZSBTdXBwcmVzc29yCiAgICAgUFJFUFJPQ19OVU1fRUZGRUNUUwogfTsKIAogLy8gU2Vzc2lvbiBzdGF0ZQogZW51bSBwcmVwcm9jX3Nlc3Npb25fc3RhdGUgewotICAgIFBSRVBST0NfU0VTU0lPTl9TVEFURV9JTklULCAgICAgICAgLy8gaW5pdGlhbGl6ZWQKLSAgICBQUkVQUk9DX1NFU1NJT05fU1RBVEVfQ09ORklHICAgICAgIC8vIGNvbmZpZ3VyYXRpb24gcmVjZWl2ZWQKKyAgICBQUkVQUk9DX1NFU1NJT05fU1RBVEVfSU5JVCwgICAvLyBpbml0aWFsaXplZAorICAgIFBSRVBST0NfU0VTU0lPTl9TVEFURV9DT05GSUcgIC8vIGNvbmZpZ3VyYXRpb24gcmVjZWl2ZWQKIH07CiAKIC8vIEVmZmVjdC9QcmVwcm9jZXNzb3Igc3RhdGUKIGVudW0gcHJlcHJvY19lZmZlY3Rfc3RhdGUgewotICAgIFBSRVBST0NfRUZGRUNUX1NUQVRFX0lOSVQsICAgICAgICAgLy8gaW5pdGlhbGl6ZWQKLSAgICBQUkVQUk9DX0VGRkVDVF9TVEFURV9DUkVBVEVELCAgICAgIC8vIHdlYlJUQyBlbmdpbmUgY3JlYXRlZAotICAgIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NPTkZJRywgICAgICAgLy8gY29uZmlndXJhdGlvbiByZWNlaXZlZC9kaXNhYmxlZAotICAgIFBSRVBST0NfRUZGRUNUX1NUQVRFX0FDVElWRSAgICAgICAgLy8gYWN0aXZlL2VuYWJsZWQKKyAgICBQUkVQUk9DX0VGRkVDVF9TVEFURV9JTklULCAgICAgLy8gaW5pdGlhbGl6ZWQKKyAgICBQUkVQUk9DX0VGRkVDVF9TVEFURV9DUkVBVEVELCAgLy8gd2ViUlRDIGVuZ2luZSBjcmVhdGVkCisgICAgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ09ORklHLCAgIC8vIGNvbmZpZ3VyYXRpb24gcmVjZWl2ZWQvZGlzYWJsZWQKKyAgICBQUkVQUk9DX0VGRkVDVF9TVEFURV9BQ1RJVkUgICAgLy8gYWN0aXZlL2VuYWJsZWQKIH07CiAKIC8vIGhhbmRsZSBvbiB3ZWJSVEMgZW5naW5lCkBAIC03MSw3NCArNzEsNjYgQEAKIC8vIEVmZmVjdCBvcGVyYXRpb24gdGFibGUuIEZ1bmN0aW9ucyBmb3IgYWxsIHByZSBwcm9jZXNzb3JzIGFyZSBkZWNsYXJlZCBpbiBzUHJlUHJvY09wc1tdIHRhYmxlLgogLy8gRnVuY3Rpb24gcG9pbnRlciBjYW4gYmUgbnVsbCBpZiBubyBhY3Rpb24gcmVxdWlyZWQuCiBzdHJ1Y3QgcHJlcHJvY19vcHNfcyB7Ci0gICAgaW50ICgqIGNyZWF0ZSkocHJlcHJvY19lZmZlY3RfdCAqZngpOwotICAgIGludCAoKiBpbml0KShwcmVwcm9jX2VmZmVjdF90ICpmeCk7Ci0gICAgaW50ICgqIHJlc2V0KShwcmVwcm9jX2VmZmVjdF90ICpmeCk7Ci0gICAgdm9pZCAoKiBlbmFibGUpKHByZXByb2NfZWZmZWN0X3QgKmZ4KTsKLSAgICB2b2lkICgqIGRpc2FibGUpKHByZXByb2NfZWZmZWN0X3QgKmZ4KTsKLSAgICBpbnQgKCogc2V0X3BhcmFtZXRlcikocHJlcHJvY19lZmZlY3RfdCAqZngsIHZvaWQgKnBhcmFtLCB2b2lkICp2YWx1ZSk7Ci0gICAgaW50ICgqIGdldF9wYXJhbWV0ZXIpKHByZXByb2NfZWZmZWN0X3QgKmZ4LCB2b2lkICpwYXJhbSwgdWludDMyX3QgKnNpemUsIHZvaWQgKnZhbHVlKTsKLSAgICBpbnQgKCogc2V0X2RldmljZSkocHJlcHJvY19lZmZlY3RfdCAqZngsIHVpbnQzMl90IGRldmljZSk7CisgICAgaW50ICgqY3JlYXRlKShwcmVwcm9jX2VmZmVjdF90KiBmeCk7CisgICAgaW50ICgqaW5pdCkocHJlcHJvY19lZmZlY3RfdCogZngpOworICAgIGludCAoKnJlc2V0KShwcmVwcm9jX2VmZmVjdF90KiBmeCk7CisgICAgdm9pZCAoKmVuYWJsZSkocHJlcHJvY19lZmZlY3RfdCogZngpOworICAgIHZvaWQgKCpkaXNhYmxlKShwcmVwcm9jX2VmZmVjdF90KiBmeCk7CisgICAgaW50ICgqc2V0X3BhcmFtZXRlcikocHJlcHJvY19lZmZlY3RfdCogZngsIHZvaWQqIHBhcmFtLCB2b2lkKiB2YWx1ZSk7CisgICAgaW50ICgqZ2V0X3BhcmFtZXRlcikocHJlcHJvY19lZmZlY3RfdCogZngsIHZvaWQqIHBhcmFtLCB1aW50MzJfdCogc2l6ZSwgdm9pZCogdmFsdWUpOworICAgIGludCAoKnNldF9kZXZpY2UpKHByZXByb2NfZWZmZWN0X3QqIGZ4LCB1aW50MzJfdCBkZXZpY2UpOwogfTsKIAogLy8gRWZmZWN0IGNvbnRleHQKIHN0cnVjdCBwcmVwcm9jX2VmZmVjdF9zIHsKLSAgICBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICppdGZlOwotICAgIHVpbnQzMl90IHByb2NJZDsgICAgICAgICAgICAgICAgLy8gdHlwZSBvZiBwcmUgcHJvY2Vzc29yIChlbnVtIHByZXByb2NfaWQpCi0gICAgdWludDMyX3Qgc3RhdGU7ICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHN0YXRlIChlbnVtIHByZXByb2NfZWZmZWN0X3N0YXRlKQotICAgIHByZXByb2Nfc2Vzc2lvbl90ICpzZXNzaW9uOyAgICAgLy8gc2Vzc2lvbiB0aGUgZWZmZWN0IGlzIG9uCi0gICAgY29uc3QgcHJlcHJvY19vcHNfdCAqb3BzOyAgICAgICAvLyBlZmZlY3Qgb3BzIHRhYmxlCi0gICAgcHJlcHJvY19meF9oYW5kbGVfdCBlbmdpbmU7ICAgICAvLyBoYW5kbGUgb24gd2ViUlRDIGVuZ2luZQotICAgIHVpbnQzMl90IHR5cGU7ICAgICAgICAgICAgICAgICAgLy8gc3VidHlwZSBvZiBlZmZlY3QKKyAgICBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zKiBpdGZlOworICAgIHVpbnQzMl90IHByb2NJZDsgICAgICAgICAgICAgLy8gdHlwZSBvZiBwcmUgcHJvY2Vzc29yIChlbnVtIHByZXByb2NfaWQpCisgICAgdWludDMyX3Qgc3RhdGU7ICAgICAgICAgICAgICAvLyBjdXJyZW50IHN0YXRlIChlbnVtIHByZXByb2NfZWZmZWN0X3N0YXRlKQorICAgIHByZXByb2Nfc2Vzc2lvbl90KiBzZXNzaW9uOyAgLy8gc2Vzc2lvbiB0aGUgZWZmZWN0IGlzIG9uCisgICAgY29uc3QgcHJlcHJvY19vcHNfdCogb3BzOyAgICAvLyBlZmZlY3Qgb3BzIHRhYmxlCisgICAgcHJlcHJvY19meF9oYW5kbGVfdCBlbmdpbmU7ICAvLyBoYW5kbGUgb24gd2ViUlRDIGVuZ2luZQorICAgIHVpbnQzMl90IHR5cGU7ICAgICAgICAgICAgICAgLy8gc3VidHlwZSBvZiBlZmZlY3QKICNpZmRlZiBEVUFMX01JQ19URVNUCi0gICAgYm9vbCBhdXhfY2hhbm5lbHNfb247ICAgICAgICAgICAvLyBzdXBwb3J0IGF1eGlsaWFyeSBjaGFubmVscwotICAgIHNpemVfdCBjdXJfY2hhbm5lbF9jb25maWc7ICAgICAgLy8gY3VycmVudCBhdWNpbGlhcnkgY2hhbm5lbCBjb25maWd1cmF0aW9uCisgICAgYm9vbCBhdXhfY2hhbm5lbHNfb247ICAgICAgIC8vIHN1cHBvcnQgYXV4aWxpYXJ5IGNoYW5uZWxzCisgICAgc2l6ZV90IGN1cl9jaGFubmVsX2NvbmZpZzsgIC8vIGN1cnJlbnQgYXVjaWxpYXJ5IGNoYW5uZWwgY29uZmlndXJhdGlvbgogI2VuZGlmCiB9OwogCiAvLyBTZXNzaW9uIGNvbnRleHQKIHN0cnVjdCBwcmVwcm9jX3Nlc3Npb25fcyB7Ci0gICAgc3RydWN0IHByZXByb2NfZWZmZWN0X3MgZWZmZWN0c1tQUkVQUk9DX05VTV9FRkZFQ1RTXTsgLy8gZWZmZWN0cyBpbiB0aGlzIHNlc3Npb24KLSAgICB1aW50MzJfdCBzdGF0ZTsgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHN0YXRlIChlbnVtIHByZXByb2Nfc2Vzc2lvbl9zdGF0ZSkKLSAgICBpbnQgaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdWRpbyBzZXNzaW9uIElECi0gICAgaW50IGlvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIG9mIGlucHV0IHN0cmVhbSB0aGlzIHNlc3Npb24gaXMgb24KLSAgICB3ZWJydGM6OkF1ZGlvUHJvY2Vzc2luZyogYXBtOyAgICAgICAvLyBoYW5kbGUgb24gd2ViUlRDIGF1ZGlvIHByb2Nlc3NpbmcgbW9kdWxlIChBUE0pCi0gICAgc2l6ZV90IGFwbUZyYW1lQ291bnQ7ICAgICAgICAgICAgICAgLy8gYnVmZmVyIHNpemUgZm9yIHdlYlJUQyBwcm9jZXNzICgxMCBtcykKLSAgICB1aW50MzJfdCBhcG1TYW1wbGluZ1JhdGU7ICAgICAgICAgICAvLyB3ZWJSVEMgQVBNIHNhbXBsaW5nIHJhdGUgKDgvMTYgb3IgMzIga0h6KQotICAgIHNpemVfdCBmcmFtZUNvdW50OyAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlciBzaXplIGJlZm9yZSBpbnB1dCByZXNhbXBsZXIgKCA8PT4gYXBtRnJhbWVDb3VudCkKLSAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGU7ICAgICAgICAgICAgICAvLyBzYW1wbGluZyByYXRlIGF0IGVmZmVjdCBwcm9jZXNzIGludGVyZmFjZQotICAgIHVpbnQzMl90IGluQ2hhbm5lbENvdW50OyAgICAgICAgICAgIC8vIGlucHV0IGNoYW5uZWwgY291bnQKLSAgICB1aW50MzJfdCBvdXRDaGFubmVsQ291bnQ7ICAgICAgICAgICAvLyBvdXRwdXQgY2hhbm5lbCBjb3VudAotICAgIHVpbnQzMl90IGNyZWF0ZWRNc2s7ICAgICAgICAgICAgICAgIC8vIGJpdCBmaWVsZCBjb250YWluaW5nIElEcyBvZiBjcmVzdGVkIHByZSBwcm9jZXNzb3JzCi0gICAgdWludDMyX3QgZW5hYmxlZE1zazsgICAgICAgICAgICAgICAgLy8gYml0IGZpZWxkIGNvbnRhaW5pbmcgSURzIG9mIGVuYWJsZWQgcHJlIHByb2Nlc3NvcnMKLSAgICB1aW50MzJfdCBwcm9jZXNzZWRNc2s7ICAgICAgICAgICAgICAvLyBiaXQgZmllbGQgY29udGFpbmluZyBJRHMgb2YgcHJlIHByb2Nlc3NvcnMgYWxyZWFkeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NlZCBpbiBjdXJyZW50IHJvdW5kCi0gICAgd2VicnRjOjpBdWRpb0ZyYW1lICpwcm9jRnJhbWU7ICAgICAgLy8gYXVkaW8gZnJhbWUgcGFzc2VkIHRvIHdlYlJUQyBBTVAgUHJvY2Vzc1N0cmVhbSgpCi0gICAgaW50MTZfdCAqaW5CdWY7ICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgYnVmZmVyIHVzZWQgd2hlbiByZXNhbXBsaW5nCi0gICAgc2l6ZV90IGluQnVmU2l6ZTsgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgYnVmZmVyIHNpemUgaW4gZnJhbWVzCi0gICAgc2l6ZV90IGZyYW1lc0luOyAgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBpbiBpbnB1dCBidWZmZXIKLSAgICBTcGVleFJlc2FtcGxlclN0YXRlICppblJlc2FtcGxlcjsgICAvLyBoYW5kbGUgb24gaW5wdXQgc3BlZXggcmVzYW1wbGVyCi0gICAgaW50MTZfdCAqb3V0QnVmOyAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0IGJ1ZmZlciB1c2VkIHdoZW4gcmVzYW1wbGluZwotICAgIHNpemVfdCBvdXRCdWZTaXplOyAgICAgICAgICAgICAgICAgIC8vIG91dHB1dCBidWZmZXIgc2l6ZSBpbiBmcmFtZXMKLSAgICBzaXplX3QgZnJhbWVzT3V0OyAgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIGluIG91dHB1dCBidWZmZXIKLSAgICBTcGVleFJlc2FtcGxlclN0YXRlICpvdXRSZXNhbXBsZXI7ICAvLyBoYW5kbGUgb24gb3V0cHV0IHNwZWV4IHJlc2FtcGxlcgotICAgIHVpbnQzMl90IHJldkNoYW5uZWxDb3VudDsgICAgICAgICAgIC8vIG51bWJlciBvZiBjaGFubmVscyBvbiByZXZlcnNlIHN0cmVhbQotICAgIHVpbnQzMl90IHJldkVuYWJsZWRNc2s7ICAgICAgICAgICAgIC8vIGJpdCBmaWVsZCBjb250YWluaW5nIElEcyBvZiBlbmFibGVkIHByZSBwcm9jZXNzb3JzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCByZXZlcnNlIGNoYW5uZWwKLSAgICB1aW50MzJfdCByZXZQcm9jZXNzZWRNc2s7ICAgICAgICAgICAvLyBiaXQgZmllbGQgY29udGFpbmluZyBJRHMgb2YgcHJlIHByb2Nlc3NvcnMgd2l0aCByZXZlcnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbm5lbCBhbHJlYWR5IHByb2Nlc3NlZCBpbiBjdXJyZW50IHJvdW5kCi0gICAgd2VicnRjOjpBdWRpb0ZyYW1lICpyZXZGcmFtZTsgICAgICAgLy8gYXVkaW8gZnJhbWUgcGFzc2VkIHRvIHdlYlJUQyBBTVAgQW5hbHl6ZVJldmVyc2VTdHJlYW0oKQotICAgIGludDE2X3QgKnJldkJ1ZjsgICAgICAgICAgICAgICAgICAgIC8vIHJldmVyc2UgY2hhbm5lbCBpbnB1dCBidWZmZXIKLSAgICBzaXplX3QgcmV2QnVmU2l6ZTsgICAgICAgICAgICAgICAgICAvLyByZXZlcnNlIGNoYW5uZWwgaW5wdXQgYnVmZmVyIHNpemUKLSAgICBzaXplX3QgZnJhbWVzUmV2OyAgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIGluIHJldmVyc2UgY2hhbm5lbCBpbnB1dCBidWZmZXIKLSAgICBTcGVleFJlc2FtcGxlclN0YXRlICpyZXZSZXNhbXBsZXI7ICAvLyBoYW5kbGUgb24gcmV2ZXJzZSBjaGFubmVsIGlucHV0IHNwZWV4IHJlc2FtcGxlcgorICAgIHN0cnVjdCBwcmVwcm9jX2VmZmVjdF9zIGVmZmVjdHNbUFJFUFJPQ19OVU1fRUZGRUNUU107ICAvLyBlZmZlY3RzIGluIHRoaXMgc2Vzc2lvbgorICAgIHVpbnQzMl90IHN0YXRlOyAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHN0YXRlIChlbnVtIHByZXByb2Nfc2Vzc2lvbl9zdGF0ZSkKKyAgICBpbnQgaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiBJRAorICAgIGludCBpbzsgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgb2YgaW5wdXQgc3RyZWFtIHRoaXMgc2Vzc2lvbiBpcyBvbgorICAgIHdlYnJ0Yzo6QXVkaW9Qcm9jZXNzaW5nKiBhcG07ICAvLyBoYW5kbGUgb24gd2ViUlRDIGF1ZGlvIHByb2Nlc3NpbmcgbW9kdWxlIChBUE0pCisgICAgLy8gQXVkaW8gUHJvY2Vzc2luZyBtb2R1bGUgYnVpbGRlcgorICAgIHdlYnJ0Yzo6QXVkaW9Qcm9jZXNzaW5nQnVpbGRlciBhcF9idWlsZGVyOworICAgIC8vIGZyYW1lQ291bnQgcmVwcmVzZW50cyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVycyB1c2VkIGZvciBwcm9jZXNzaW5nLCBhbmQgbXVzdCByZXByZXNlbnQgMTBtcy4KKyAgICBzaXplX3QgZnJhbWVDb3VudDsKKyAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGU7ICAgICAvLyBzYW1wbGluZyByYXRlIGF0IGVmZmVjdCBwcm9jZXNzIGludGVyZmFjZQorICAgIHVpbnQzMl90IGluQ2hhbm5lbENvdW50OyAgIC8vIGlucHV0IGNoYW5uZWwgY291bnQKKyAgICB1aW50MzJfdCBvdXRDaGFubmVsQ291bnQ7ICAvLyBvdXRwdXQgY2hhbm5lbCBjb3VudAorICAgIHVpbnQzMl90IGNyZWF0ZWRNc2s7ICAgICAgIC8vIGJpdCBmaWVsZCBjb250YWluaW5nIElEcyBvZiBjcmVzdGVkIHByZSBwcm9jZXNzb3JzCisgICAgdWludDMyX3QgZW5hYmxlZE1zazsgICAgICAgLy8gYml0IGZpZWxkIGNvbnRhaW5pbmcgSURzIG9mIGVuYWJsZWQgcHJlIHByb2Nlc3NvcnMKKyAgICB1aW50MzJfdCBwcm9jZXNzZWRNc2s7ICAgICAvLyBiaXQgZmllbGQgY29udGFpbmluZyBJRHMgb2YgcHJlIHByb2Nlc3NvcnMgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NlZCBpbiBjdXJyZW50IHJvdW5kCisgICAgLy8gYXVkaW8gY29uZmlnIHN0cnVjdXRyZQorICAgIHdlYnJ0Yzo6QXVkaW9Qcm9jZXNzaW5nOjpDb25maWcgY29uZmlnOworICAgIHdlYnJ0Yzo6U3RyZWFtQ29uZmlnIGlucHV0Q29uZmlnOyAgIC8vIGlucHV0IHN0cmVhbSBjb25maWd1cmF0aW9uCisgICAgd2VicnRjOjpTdHJlYW1Db25maWcgb3V0cHV0Q29uZmlnOyAgLy8gb3V0cHV0IHN0cmVhbSBjb25maWd1cmF0aW9uCisgICAgdWludDMyX3QgcmV2Q2hhbm5lbENvdW50OyAgLy8gbnVtYmVyIG9mIGNoYW5uZWxzIG9uIHJldmVyc2Ugc3RyZWFtCisgICAgdWludDMyX3QgcmV2RW5hYmxlZE1zazsgICAgLy8gYml0IGZpZWxkIGNvbnRhaW5pbmcgSURzIG9mIGVuYWJsZWQgcHJlIHByb2Nlc3NvcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIHJldmVyc2UgY2hhbm5lbAorICAgIHVpbnQzMl90IHJldlByb2Nlc3NlZE1zazsgIC8vIGJpdCBmaWVsZCBjb250YWluaW5nIElEcyBvZiBwcmUgcHJvY2Vzc29ycyB3aXRoIHJldmVyc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFubmVsIGFscmVhZHkgcHJvY2Vzc2VkIGluIGN1cnJlbnQgcm91bmQKKyAgICB3ZWJydGM6OlN0cmVhbUNvbmZpZyByZXZDb25maWc7ICAgICAvLyByZXZlcnNlIHN0cmVhbSBjb25maWd1cmF0aW9uLgogfTsKIAogI2lmZGVmIERVQUxfTUlDX1RFU1QKIGVudW0gewotICAgIFBSRVBST0NfQ01EX0RVQUxfTUlDX0VOQUJMRSA9IEVGRkVDVF9DTURfRklSU1RfUFJPUFJJRVRBUlksIC8vIGVuYWJsZSBkdWFsIG1pYyBtb2RlCi0gICAgUFJFUFJPQ19DTURfRFVBTF9NSUNfUENNX0RVTVBfU1RBUlQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnQgcGNtIGNhcHR1cmUKLSAgICBQUkVQUk9DX0NNRF9EVUFMX01JQ19QQ01fRFVNUF9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9wIHBjbSBjYXB0dXJlCisgICAgUFJFUFJPQ19DTURfRFVBTF9NSUNfRU5BQkxFID0gRUZGRUNUX0NNRF9GSVJTVF9QUk9QUklFVEFSWSwgIC8vIGVuYWJsZSBkdWFsIG1pYyBtb2RlCisgICAgUFJFUFJPQ19DTURfRFVBTF9NSUNfUENNX0RVTVBfU1RBUlQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IHBjbSBjYXB0dXJlCisgICAgUFJFUFJPQ19DTURfRFVBTF9NSUNfUENNX0RVTVBfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3AgcGNtIGNhcHR1cmUKIH07CiAKIGVudW0gewpAQCAtMTUxLDI0ICsxNDMsMjIgQEAKIH07CiAKIGNvbnN0IGNoYW5uZWxfY29uZmlnX3Qgc0R1YWxNaWNDb25maWdzW0NIQU5ORUxfQ0ZHX0NOVF0gPSB7Ci0gICAgICAgIHtBVURJT19DSEFOTkVMX0lOX01PTk8gLCAwfSwKLSAgICAgICAge0FVRElPX0NIQU5ORUxfSU5fU1RFUkVPICwgMH0sCi0gICAgICAgIHtBVURJT19DSEFOTkVMX0lOX0ZST05UICwgQVVESU9fQ0hBTk5FTF9JTl9CQUNLfSwKLSAgICAgICAge0FVRElPX0NIQU5ORUxfSU5fU1RFUkVPICwgQVVESU9fQ0hBTk5FTF9JTl9SSUdIVH0KLX07CisgICAgICAgIHtBVURJT19DSEFOTkVMX0lOX01PTk8sIDB9LAorICAgICAgICB7QVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8sIDB9LAorICAgICAgICB7QVVESU9fQ0hBTk5FTF9JTl9GUk9OVCwgQVVESU9fQ0hBTk5FTF9JTl9CQUNLfSwKKyAgICAgICAge0FVRElPX0NIQU5ORUxfSU5fU1RFUkVPLCBBVURJT19DSEFOTkVMX0lOX1JJR0hUfX07CiAKIGJvb2wgc0hhc0F1eENoYW5uZWxzW1BSRVBST0NfTlVNX0VGRkVDVFNdID0gewotICAgICAgICBmYWxzZSwgICAvLyBQUkVQUk9DX0FHQworICAgICAgICBmYWxzZSwgIC8vIFBSRVBST0NfQUdDCiAgICAgICAgIHRydWUsICAgLy8gUFJFUFJPQ19BRUMKICAgICAgICAgdHJ1ZSwgICAvLyBQUkVQUk9DX05TCiB9OwogCiBib29sIGdEdWFsTWljRW5hYmxlZDsKLUZJTEUgKmdQY21EdW1wRmg7CitGSUxFKiBnUGNtRHVtcEZoOwogc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBnUGNtRHVtcExvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwogI2VuZGlmCiAKLQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEVmZmVjdCBkZXNjcmlwdG9ycwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE3OCw2OCArMTY4LDY5IEBACiAKIC8vIEF1dG9tYXRpYyBHYWluIENvbnRyb2wKIHN0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IHNBZ2NEZXNjcmlwdG9yID0gewotICAgICAgICB7IDB4MGE4YWJmZTAsIDB4NjU0YywgMHgxMWUwLCAweGJhMjYsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH0sIC8vIHR5cGUKLSAgICAgICAgeyAweGFhODEzMGUwLCAweDY2ZmMsIDB4MTFlMCwgMHhiYWQwLCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9LCAvLyB1dWlkCisgICAgICAgIHsweDBhOGFiZmUwLCAweDY1NGMsIDB4MTFlMCwgMHhiYTI2LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gdHlwZQorICAgICAgICB7MHhhYTgxMzBlMCwgMHg2NmZjLCAweDExZTAsIDB4YmFkMCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgIC8vIHV1aWQKICAgICAgICAgRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04sCi0gICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DfEVGRkVDVF9GTEFHX0RFVklDRV9JTkQpLAotICAgICAgICAwLCAvL0ZJWE1FIGluZGljYXRlIENQVSBsb2FkCi0gICAgICAgIDAsIC8vRklYTUUgaW5kaWNhdGUgbWVtb3J5IHVzYWdlCisgICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DIHwgRUZGRUNUX0ZMQUdfREVWSUNFX0lORCksCisgICAgICAgIDAsICAvLyBGSVhNRSBpbmRpY2F0ZSBDUFUgbG9hZAorICAgICAgICAwLCAgLy8gRklYTUUgaW5kaWNhdGUgbWVtb3J5IHVzYWdlCiAgICAgICAgICJBdXRvbWF0aWMgR2FpbiBDb250cm9sIiwKLSAgICAgICAgIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiCi19OworICAgICAgICAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCJ9OworCisvLyBBdXRvbWF0aWMgR2FpbiBDb250cm9sIDIKK3N0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IHNBZ2MyRGVzY3JpcHRvciA9IHsKKyAgICAgICAgezB4YWUzYzY1M2IsIDB4YmUxOCwgMHg0YWI4LCAweDg5MzgsIHsweDQxLCAweDhmLCAweDBhLCAweDdmLCAweDA2LCAweGFjfX0sICAvLyB0eXBlCisgICAgICAgIHsweDg5ZjM4ZTY1LCAweGQ0ZDIsIDB4NGQ2NCwgMHhhZDBlLCB7MHgyYiwgMHgzZSwgMHg3OSwgMHg5ZSwgMHhhOCwgMHg4Nn19LCAgLy8gdXVpZAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKKyAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0MgfCBFRkZFQ1RfRkxBR19ERVZJQ0VfSU5EKSwKKyAgICAgICAgMCwgIC8vIEZJWE1FIGluZGljYXRlIENQVSBsb2FkCisgICAgICAgIDAsICAvLyBGSVhNRSBpbmRpY2F0ZSBtZW1vcnkgdXNhZ2UKKyAgICAgICAgIkF1dG9tYXRpYyBHYWluIENvbnRyb2wgMiIsCisgICAgICAgICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0In07CiAKIC8vIEFjb3VzdGljIEVjaG8gQ2FuY2VsbGF0aW9uCiBzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBzQWVjRGVzY3JpcHRvciA9IHsKLSAgICAgICAgeyAweDdiNDkxNDYwLCAweDhkNGQsIDB4MTFlMCwgMHhiZDYxLCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9LCAvLyB0eXBlCi0gICAgICAgIHsgMHhiYjM5MmVjMCwgMHg4ZDRkLCAweDExZTAsIDB4YTg5NiwgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH0gfSwgLy8gdXVpZAorICAgICAgICB7MHg3YjQ5MTQ2MCwgMHg4ZDRkLCAweDExZTAsIDB4YmQ2MSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgIC8vIHR5cGUKKyAgICAgICAgezB4YmIzOTJlYzAsIDB4OGQ0ZCwgMHgxMWUwLCAweGE4OTYsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyB1dWlkCiAgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAotICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQ3xFRkZFQ1RfRkxBR19ERVZJQ0VfSU5EKSwKLSAgICAgICAgMCwgLy9GSVhNRSBpbmRpY2F0ZSBDUFUgbG9hZAotICAgICAgICAwLCAvL0ZJWE1FIGluZGljYXRlIG1lbW9yeSB1c2FnZQorICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQyB8IEVGRkVDVF9GTEFHX0RFVklDRV9JTkQpLAorICAgICAgICAwLCAgLy8gRklYTUUgaW5kaWNhdGUgQ1BVIGxvYWQKKyAgICAgICAgMCwgIC8vIEZJWE1FIGluZGljYXRlIG1lbW9yeSB1c2FnZQogICAgICAgICAiQWNvdXN0aWMgRWNobyBDYW5jZWxlciIsCi0gICAgICAgICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IgotfTsKKyAgICAgICAgIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QifTsKIAogLy8gTm9pc2Ugc3VwcHJlc3Npb24KIHN0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IHNOc0Rlc2NyaXB0b3IgPSB7Ci0gICAgICAgIHsgMHg1OGI0YjI2MCwgMHg4ZTA2LCAweDExZTAsIDB4YWE4ZSwgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH0gfSwgLy8gdHlwZQotICAgICAgICB7IDB4YzA2Yzg0MDAsIDB4OGUwNiwgMHgxMWUwLCAweDljYjYsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH0sIC8vIHV1aWQKKyAgICAgICAgezB4NThiNGIyNjAsIDB4OGUwNiwgMHgxMWUwLCAweGFhOGUsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyB0eXBlCisgICAgICAgIHsweGMwNmM4NDAwLCAweDhlMDYsIDB4MTFlMCwgMHg5Y2I2LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gdXVpZAogICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKLSAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0N8RUZGRUNUX0ZMQUdfREVWSUNFX0lORCksCi0gICAgICAgIDAsIC8vRklYTUUgaW5kaWNhdGUgQ1BVIGxvYWQKLSAgICAgICAgMCwgLy9GSVhNRSBpbmRpY2F0ZSBtZW1vcnkgdXNhZ2UKKyAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0MgfCBFRkZFQ1RfRkxBR19ERVZJQ0VfSU5EKSwKKyAgICAgICAgMCwgIC8vIEZJWE1FIGluZGljYXRlIENQVSBsb2FkCisgICAgICAgIDAsICAvLyBGSVhNRSBpbmRpY2F0ZSBtZW1vcnkgdXNhZ2UKICAgICAgICAgIk5vaXNlIFN1cHByZXNzaW9uIiwKLSAgICAgICAgIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiCi19OworICAgICAgICAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCJ9OwogCi0KLXN0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpzRGVzY3JpcHRvcnNbUFJFUFJPQ19OVU1fRUZGRUNUU10gPSB7Ci0gICAgICAgICZzQWdjRGVzY3JpcHRvciwKLSAgICAgICAgJnNBZWNEZXNjcmlwdG9yLAotICAgICAgICAmc05zRGVzY3JpcHRvcgotfTsKK3N0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90KiBzRGVzY3JpcHRvcnNbUFJFUFJPQ19OVU1fRUZGRUNUU10gPSB7JnNBZ2NEZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc0FnYzJEZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc0FlY0Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzTnNEZXNjcmlwdG9yfTsKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEhlbHBlciBmdW5jdGlvbnMKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNvbnN0IGVmZmVjdF91dWlkX3QgKiBjb25zdCBzVXVpZFRvUHJlUHJvY1RhYmxlW1BSRVBST0NfTlVNX0VGRkVDVFNdID0gewotICAgICAgICBGWF9JSURfQUdDLAotICAgICAgICBGWF9JSURfQUVDLAotICAgICAgICBGWF9JSURfTlMKLX07Citjb25zdCBlZmZlY3RfdXVpZF90KiBjb25zdCBzVXVpZFRvUHJlUHJvY1RhYmxlW1BSRVBST0NfTlVNX0VGRkVDVFNdID0ge0ZYX0lJRF9BR0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lJRF9BR0MyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JSURfQUVDLCBGWF9JSURfTlN9OwogCi0KLWNvbnN0IGVmZmVjdF91dWlkX3QgKiBQcm9jSWRUb1V1aWQoaW50IHByb2NJZCkKLXsKK2NvbnN0IGVmZmVjdF91dWlkX3QqIFByb2NJZFRvVXVpZChpbnQgcHJvY0lkKSB7CiAgICAgaWYgKHByb2NJZCA+PSBQUkVQUk9DX05VTV9FRkZFQ1RTKSB7CiAgICAgICAgIHJldHVybiBFRkZFQ1RfVVVJRF9OVUxMOwogICAgIH0KICAgICByZXR1cm4gc1V1aWRUb1ByZVByb2NUYWJsZVtwcm9jSWRdOwogfQogCi11aW50MzJfdCBVdWlkVG9Qcm9jSWQoY29uc3QgZWZmZWN0X3V1aWRfdCAqIHV1aWQpCi17Cit1aW50MzJfdCBVdWlkVG9Qcm9jSWQoY29uc3QgZWZmZWN0X3V1aWRfdCogdXVpZCkgewogICAgIHNpemVfdCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCBQUkVQUk9DX05VTV9FRkZFQ1RTOyBpKyspIHsKICAgICAgICAgaWYgKG1lbWNtcCh1dWlkLCBzVXVpZFRvUHJlUHJvY1RhYmxlW2ldLCBzaXplb2YoKnV1aWQpKSA9PSAwKSB7CkBAIC0yNDksMTUgKzI0MCwxMyBAQAogICAgIHJldHVybiBpOwogfQogCi1ib29sIEhhc1JldmVyc2VTdHJlYW0odWludDMyX3QgcHJvY0lkKQoteworYm9vbCBIYXNSZXZlcnNlU3RyZWFtKHVpbnQzMl90IHByb2NJZCkgewogICAgIGlmIChwcm9jSWQgPT0gUFJFUFJPQ19BRUMpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQXV0b21hdGljIEdhaW4gQ29udHJvbCAoQUdDKQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI2Niw0OTkgKzI1NSw1MzggQEAKIHN0YXRpYyBjb25zdCBpbnQga0FnY0RlZmF1bHRDb21wR2FpbiA9IDk7CiBzdGF0aWMgY29uc3QgYm9vbCBrQWdjRGVmYXVsdExpbWl0ZXIgPSB0cnVlOwogCi1pbnQgIEFnY0luaXQgKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCkKLXsKLSAgICBBTE9HVigiQWdjSW5pdCIpOwotICAgIHdlYnJ0Yzo6R2FpbkNvbnRyb2wgKmFnYyA9IHN0YXRpY19jYXN0PHdlYnJ0Yzo6R2FpbkNvbnRyb2wgKj4oZWZmZWN0LT5lbmdpbmUpOwotICAgIGFnYy0+c2V0X21vZGUod2VicnRjOjpHYWluQ29udHJvbDo6a0ZpeGVkRGlnaXRhbCk7Ci0gICAgYWdjLT5zZXRfdGFyZ2V0X2xldmVsX2RiZnMoa0FnY0RlZmF1bHRUYXJnZXRMZXZlbCk7Ci0gICAgYWdjLT5zZXRfY29tcHJlc3Npb25fZ2Fpbl9kYihrQWdjRGVmYXVsdENvbXBHYWluKTsKLSAgICBhZ2MtPmVuYWJsZV9saW1pdGVyKGtBZ2NEZWZhdWx0TGltaXRlcik7CitpbnQgQWdjMkluaXQocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0KSB7CisgICAgQUxPR1YoIkFnYzJJbml0Iik7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMi5maXhlZF9kaWdpdGFsLmdhaW5fZGIgPSAwLmY7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMi5hZGFwdGl2ZV9kaWdpdGFsLmxldmVsX2VzdGltYXRvciA9CisgICAgICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIyLmtSbXM7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMi5hZGFwdGl2ZV9kaWdpdGFsLmV4dHJhX3NhdHVyYXRpb25fbWFyZ2luX2RiID0gMi5mOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5BcHBseUNvbmZpZyhlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyk7CiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCAgQWdjQ3JlYXRlKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCkKLXsKLSAgICB3ZWJydGM6OkdhaW5Db250cm9sICphZ2MgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+Z2Fpbl9jb250cm9sKCk7Ci0gICAgQUxPR1YoIkFnY0NyZWF0ZSBnb3QgYWdjICVwIiwgYWdjKTsKLSAgICBpZiAoYWdjID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coIkFnY0NyZWF0ZSBFcnJvciIpOwotICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICB9Ci0gICAgZWZmZWN0LT5lbmdpbmUgPSBzdGF0aWNfY2FzdDxwcmVwcm9jX2Z4X2hhbmRsZV90PihhZ2MpOworaW50IEFnY0luaXQocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0KSB7CisgICAgQUxPR1YoIkFnY0luaXQiKTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5HZXRDb25maWcoKTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIxLnRhcmdldF9sZXZlbF9kYmZzID0ga0FnY0RlZmF1bHRUYXJnZXRMZXZlbDsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIxLmNvbXByZXNzaW9uX2dhaW5fZGIgPSBrQWdjRGVmYXVsdENvbXBHYWluOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjEuZW5hYmxlX2xpbWl0ZXIgPSBrQWdjRGVmYXVsdExpbWl0ZXI7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkFwcGx5Q29uZmlnKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IEFnYzJDcmVhdGUocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0KSB7CisgICAgQWdjMkluaXQoZWZmZWN0KTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IEFnY0NyZWF0ZShwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QpIHsKICAgICBBZ2NJbml0KGVmZmVjdCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBBZ2NHZXRQYXJhbWV0ZXIocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0LAotICAgICAgICAgICAgICAgICAgICB2b2lkICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwVmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICB2b2lkICpwVmFsdWUpCi17CitpbnQgQWdjMkdldFBhcmFtZXRlcihwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QsIHZvaWQqIHBQYXJhbSwgdWludDMyX3QqIHBWYWx1ZVNpemUsIHZvaWQqIHBWYWx1ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwotICAgIHVpbnQzMl90IHBhcmFtID0gKih1aW50MzJfdCAqKXBQYXJhbTsKLSAgICB0X2FnY19zZXR0aW5ncyAqcFByb3BlcnRpZXMgPSAodF9hZ2Nfc2V0dGluZ3MgKilwVmFsdWU7Ci0gICAgd2VicnRjOjpHYWluQ29udHJvbCAqYWdjID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpHYWluQ29udHJvbCAqPihlZmZlY3QtPmVuZ2luZSk7CisgICAgdWludDMyX3QgcGFyYW0gPSAqKHVpbnQzMl90KilwUGFyYW07CisgICAgYWdjMl9zZXR0aW5nc190KiBwUHJvcGVydGllcyA9IChhZ2MyX3NldHRpbmdzX3QqKXBWYWx1ZTsKIAogICAgIHN3aXRjaCAocGFyYW0pIHsKLSAgICBjYXNlIEFHQ19QQVJBTV9UQVJHRVRfTEVWRUw6Ci0gICAgY2FzZSBBR0NfUEFSQU1fQ09NUF9HQUlOOgotICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YoaW50MTZfdCkpIHsKLSAgICAgICAgICAgICpwVmFsdWVTaXplID0gMDsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUdDX1BBUkFNX0xJTUlURVJfRU5BOgotICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YoYm9vbCkpIHsKLSAgICAgICAgICAgICpwVmFsdWVTaXplID0gMDsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUdDX1BBUkFNX1BST1BFUlRJRVM6Ci0gICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZih0X2FnY19zZXR0aW5ncykpIHsKLSAgICAgICAgICAgICpwVmFsdWVTaXplID0gMDsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQzJfUEFSQU1fRklYRURfRElHSVRBTF9HQUlOOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKGZsb2F0KSkgeworICAgICAgICAgICAgICAgICpwVmFsdWVTaXplID0gMC5mOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDMl9QQVJBTV9BREFQVF9ESUdJX0xFVkVMX0VTVElNQVRPUjoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgICAgICpwVmFsdWVTaXplID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQzJfUEFSQU1fQURBUFRfRElHSV9FWFRSQV9TQVRVUkFUSU9OX01BUkdJTjoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZihmbG9hdCkpIHsKKyAgICAgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IDAuZjsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQzJfUEFSQU1fUFJPUEVSVElFUzoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZihhZ2MyX3NldHRpbmdzX3QpKSB7CisgICAgICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSAwOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVygiQWdjR2V0UGFyYW1ldGVyKCkgdW5rbm93biBwYXJhbSAlMDh4IiwgcGFyYW0pOwotICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJBZ2MyR2V0UGFyYW1ldGVyKCkgdW5rbm93biBwYXJhbSAlMDh4IiwgcGFyYW0pOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAorICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkdldENvbmZpZygpOwogICAgIHN3aXRjaCAocGFyYW0pIHsKLSAgICBjYXNlIEFHQ19QQVJBTV9UQVJHRVRfTEVWRUw6Ci0gICAgICAgICooaW50MTZfdCAqKSBwVmFsdWUgPSAoaW50MTZfdCkoYWdjLT50YXJnZXRfbGV2ZWxfZGJmcygpICogLTEwMCk7Ci0gICAgICAgIEFMT0dWKCJBZ2NHZXRQYXJhbWV0ZXIoKSB0YXJnZXQgbGV2ZWwgJWQgbWlsbGlCZWxzIiwgKihpbnQxNl90ICopIHBWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUdDX1BBUkFNX0NPTVBfR0FJTjoKLSAgICAgICAgKihpbnQxNl90ICopIHBWYWx1ZSA9IChpbnQxNl90KShhZ2MtPmNvbXByZXNzaW9uX2dhaW5fZGIoKSAqIDEwMCk7Ci0gICAgICAgIEFMT0dWKCJBZ2NHZXRQYXJhbWV0ZXIoKSBjb21wIGdhaW4gJWQgbWlsbGlCZWxzIiwgKihpbnQxNl90ICopIHBWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUdDX1BBUkFNX0xJTUlURVJfRU5BOgotICAgICAgICAqKGJvb2wgKikgcFZhbHVlID0gKGJvb2wpYWdjLT5pc19saW1pdGVyX2VuYWJsZWQoKTsKLSAgICAgICAgQUxPR1YoIkFnY0dldFBhcmFtZXRlcigpIGxpbWl0ZXIgZW5hYmxlZCAlcyIsCi0gICAgICAgICAgICAgKCooaW50MTZfdCAqKSBwVmFsdWUgIT0gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBR0NfUEFSQU1fUFJPUEVSVElFUzoKLSAgICAgICAgcFByb3BlcnRpZXMtPnRhcmdldExldmVsID0gKGludDE2X3QpKGFnYy0+dGFyZ2V0X2xldmVsX2RiZnMoKSAqIC0xMDApOwotICAgICAgICBwUHJvcGVydGllcy0+Y29tcEdhaW4gPSAoaW50MTZfdCkoYWdjLT5jb21wcmVzc2lvbl9nYWluX2RiKCkgKiAxMDApOwotICAgICAgICBwUHJvcGVydGllcy0+bGltaXRlckVuYWJsZWQgPSAoYm9vbClhZ2MtPmlzX2xpbWl0ZXJfZW5hYmxlZCgpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVygiQWdjR2V0UGFyYW1ldGVyKCkgdW5rbm93biBwYXJhbSAlZCIsIHBhcmFtKTsKLSAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDMl9QQVJBTV9GSVhFRF9ESUdJVEFMX0dBSU46CisgICAgICAgICAgICAqKGZsb2F0KilwVmFsdWUgPQorICAgICAgICAgICAgICAgICAgICAoZmxvYXQpKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjIuZml4ZWRfZGlnaXRhbC5nYWluX2RiKTsKKyAgICAgICAgICAgIEFMT0dWKCJBZ2MyR2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGxldmVsICVmIGRCIiwgKihmbG9hdCopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQzJfUEFSQU1fQURBUFRfRElHSV9MRVZFTF9FU1RJTUFUT1I6CisgICAgICAgICAgICAqKHVpbnQzMl90KilwVmFsdWUgPSAodWludDMyX3QpKAorICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIyLmFkYXB0aXZlX2RpZ2l0YWwubGV2ZWxfZXN0aW1hdG9yKTsKKyAgICAgICAgICAgIEFMT0dWKCJBZ2MyR2V0UGFyYW1ldGVyKCkgbGV2ZWwgZXN0aW1hdG9yICVkIiwKKyAgICAgICAgICAgICAgICAgICood2VicnRjOjpBdWRpb1Byb2Nlc3Npbmc6OkNvbmZpZzo6R2FpbkNvbnRyb2xsZXIyOjpMZXZlbEVzdGltYXRvciopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQzJfUEFSQU1fQURBUFRfRElHSV9FWFRSQV9TQVRVUkFUSU9OX01BUkdJTjoKKyAgICAgICAgICAgICooZmxvYXQqKXBWYWx1ZSA9IChmbG9hdCkoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMi5hZGFwdGl2ZV9kaWdpdGFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4dHJhX3NhdHVyYXRpb25fbWFyZ2luX2RiKTsKKyAgICAgICAgICAgIEFMT0dWKCJBZ2MyR2V0UGFyYW1ldGVyKCkgZXh0cmEgc2F0dXJhdGlvbiBtYXJnaW4gJWYgZEIiLCAqKGZsb2F0KilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDMl9QQVJBTV9QUk9QRVJUSUVTOgorICAgICAgICAgICAgcFByb3BlcnRpZXMtPmZpeGVkRGlnaXRhbEdhaW4gPQorICAgICAgICAgICAgICAgICAgICAoZmxvYXQpKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjIuZml4ZWRfZGlnaXRhbC5nYWluX2RiKTsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5sZXZlbF9lc3RpbWF0b3IgPSAodWludDMyX3QpKAorICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIyLmFkYXB0aXZlX2RpZ2l0YWwubGV2ZWxfZXN0aW1hdG9yKTsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5leHRyYVNhdHVyYXRpb25NYXJnaW4gPQorICAgICAgICAgICAgICAgICAgICAoZmxvYXQpKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjIuYWRhcHRpdmVfZGlnaXRhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4dHJhX3NhdHVyYXRpb25fbWFyZ2luX2RiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIkFnYzJHZXRQYXJhbWV0ZXIoKSB1bmtub3duIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2ludCBBZ2NHZXRQYXJhbWV0ZXIocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0LCB2b2lkKiBwUGFyYW0sIHVpbnQzMl90KiBwVmFsdWVTaXplLCB2b2lkKiBwVmFsdWUpIHsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICB1aW50MzJfdCBwYXJhbSA9ICoodWludDMyX3QqKXBQYXJhbTsKKyAgICB0X2FnY19zZXR0aW5ncyogcFByb3BlcnRpZXMgPSAodF9hZ2Nfc2V0dGluZ3MqKXBWYWx1ZTsKKworICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICAgICAgY2FzZSBBR0NfUEFSQU1fVEFSR0VUX0xFVkVMOgorICAgICAgICBjYXNlIEFHQ19QQVJBTV9DT01QX0dBSU46CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YoaW50MTZfdCkpIHsKKyAgICAgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBR0NfUEFSQU1fTElNSVRFUl9FTkE6CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YoYm9vbCkpIHsKKyAgICAgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBR0NfUEFSQU1fUFJPUEVSVElFUzoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZih0X2FnY19zZXR0aW5ncykpIHsKKyAgICAgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIkFnY0dldFBhcmFtZXRlcigpIHVua25vd24gcGFyYW0gJTA4eCIsIHBhcmFtKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5HZXRDb25maWcoKTsKKyAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgICAgIGNhc2UgQUdDX1BBUkFNX1RBUkdFVF9MRVZFTDoKKyAgICAgICAgICAgICooaW50MTZfdCopcFZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgKGludDE2X3QpKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjEudGFyZ2V0X2xldmVsX2RiZnMgKiAtMTAwKTsKKyAgICAgICAgICAgIEFMT0dWKCJBZ2NHZXRQYXJhbWV0ZXIoKSB0YXJnZXQgbGV2ZWwgJWQgbWlsbGlCZWxzIiwgKihpbnQxNl90KilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDX1BBUkFNX0NPTVBfR0FJTjoKKyAgICAgICAgICAgICooaW50MTZfdCopcFZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgKGludDE2X3QpKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjEuY29tcHJlc3Npb25fZ2Fpbl9kYiAqIC0xMDApOworICAgICAgICAgICAgQUxPR1YoIkFnY0dldFBhcmFtZXRlcigpIGNvbXAgZ2FpbiAlZCBtaWxsaUJlbHMiLCAqKGludDE2X3QqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBR0NfUEFSQU1fTElNSVRFUl9FTkE6CisgICAgICAgICAgICAqKGJvb2wqKXBWYWx1ZSA9IChib29sKShlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIxLmVuYWJsZV9saW1pdGVyKTsKKyAgICAgICAgICAgIEFMT0dWKCJBZ2NHZXRQYXJhbWV0ZXIoKSBsaW1pdGVyIGVuYWJsZWQgJXMiLAorICAgICAgICAgICAgICAgICAgKCooaW50MTZfdCopcFZhbHVlICE9IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBR0NfUEFSQU1fUFJPUEVSVElFUzoKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT50YXJnZXRMZXZlbCA9CisgICAgICAgICAgICAgICAgICAgIChpbnQxNl90KShlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIxLnRhcmdldF9sZXZlbF9kYmZzICogLTEwMCk7CisgICAgICAgICAgICBwUHJvcGVydGllcy0+Y29tcEdhaW4gPQorICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCkoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMS5jb21wcmVzc2lvbl9nYWluX2RiICogLTEwMCk7CisgICAgICAgICAgICBwUHJvcGVydGllcy0+bGltaXRlckVuYWJsZWQgPQorICAgICAgICAgICAgICAgICAgICAoYm9vbCkoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMS5lbmFibGVfbGltaXRlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJBZ2NHZXRQYXJhbWV0ZXIoKSB1bmtub3duIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1pbnQgQWdjU2V0UGFyYW1ldGVyIChwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKQoteworaW50IEFnYzJTZXRQYXJhbWV0ZXIocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0LCB2b2lkKiBwUGFyYW0sIHZvaWQqIHBWYWx1ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwotICAgIHVpbnQzMl90IHBhcmFtID0gKih1aW50MzJfdCAqKXBQYXJhbTsKLSAgICB0X2FnY19zZXR0aW5ncyAqcFByb3BlcnRpZXMgPSAodF9hZ2Nfc2V0dGluZ3MgKilwVmFsdWU7Ci0gICAgd2VicnRjOjpHYWluQ29udHJvbCAqYWdjID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpHYWluQ29udHJvbCAqPihlZmZlY3QtPmVuZ2luZSk7Ci0KKyAgICB1aW50MzJfdCBwYXJhbSA9ICoodWludDMyX3QqKXBQYXJhbTsKKyAgICBmbG9hdCB2YWx1ZUZsb2F0ID0gMC5mOworICAgIGFnYzJfc2V0dGluZ3NfdCogcFByb3BlcnRpZXMgPSAoYWdjMl9zZXR0aW5nc190KilwVmFsdWU7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CiAgICAgc3dpdGNoIChwYXJhbSkgewotICAgIGNhc2UgQUdDX1BBUkFNX1RBUkdFVF9MRVZFTDoKLSAgICAgICAgQUxPR1YoIkFnY1NldFBhcmFtZXRlcigpIHRhcmdldCBsZXZlbCAlZCBtaWxsaUJlbHMiLCAqKGludDE2X3QgKilwVmFsdWUpOwotICAgICAgICBzdGF0dXMgPSBhZ2MtPnNldF90YXJnZXRfbGV2ZWxfZGJmcygtKCooaW50MTZfdCAqKXBWYWx1ZSAvIDEwMCkpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFHQ19QQVJBTV9DT01QX0dBSU46Ci0gICAgICAgIEFMT0dWKCJBZ2NTZXRQYXJhbWV0ZXIoKSBjb21wIGdhaW4gJWQgbWlsbGlCZWxzIiwgKihpbnQxNl90ICopcFZhbHVlKTsKLSAgICAgICAgc3RhdHVzID0gYWdjLT5zZXRfY29tcHJlc3Npb25fZ2Fpbl9kYigqKGludDE2X3QgKilwVmFsdWUgLyAxMDApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFHQ19QQVJBTV9MSU1JVEVSX0VOQToKLSAgICAgICAgQUxPR1YoIkFnY1NldFBhcmFtZXRlcigpIGxpbWl0ZXIgZW5hYmxlZCAlcyIsICooYm9vbCAqKXBWYWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgICBzdGF0dXMgPSBhZ2MtPmVuYWJsZV9saW1pdGVyKCooYm9vbCAqKXBWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUdDX1BBUkFNX1BST1BFUlRJRVM6Ci0gICAgICAgIEFMT0dWKCJBZ2NTZXRQYXJhbWV0ZXIoKSBwcm9wZXJ0aWVzIGxldmVsICVkLCBnYWluICVkIGxpbWl0ZXIgJWQiLAotICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT50YXJnZXRMZXZlbCwKLSAgICAgICAgICAgICBwUHJvcGVydGllcy0+Y29tcEdhaW4sCi0gICAgICAgICAgICAgcFByb3BlcnRpZXMtPmxpbWl0ZXJFbmFibGVkKTsKLSAgICAgICAgc3RhdHVzID0gYWdjLT5zZXRfdGFyZ2V0X2xldmVsX2RiZnMoLShwUHJvcGVydGllcy0+dGFyZ2V0TGV2ZWwgLyAxMDApKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSAwKSBicmVhazsKLSAgICAgICAgc3RhdHVzID0gYWdjLT5zZXRfY29tcHJlc3Npb25fZ2Fpbl9kYihwUHJvcGVydGllcy0+Y29tcEdhaW4gLyAxMDApOwotICAgICAgICBpZiAoc3RhdHVzICE9IDApIGJyZWFrOwotICAgICAgICBzdGF0dXMgPSBhZ2MtPmVuYWJsZV9saW1pdGVyKHBQcm9wZXJ0aWVzLT5saW1pdGVyRW5hYmxlZCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dXKCJBZ2NTZXRQYXJhbWV0ZXIoKSB1bmtub3duIHBhcmFtICUwOHggdmFsdWUgJTA4eCIsIHBhcmFtLCAqKHVpbnQzMl90ICopcFZhbHVlKTsKLSAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDMl9QQVJBTV9GSVhFRF9ESUdJVEFMX0dBSU46CisgICAgICAgICAgICB2YWx1ZUZsb2F0ID0gKGZsb2F0KSgqKGludDMyX3QqKXBWYWx1ZSk7CisgICAgICAgICAgICBBTE9HVigiQWdjMlNldFBhcmFtZXRlcigpIGZpeGVkIGRpZ2l0YWwgZ2FpbiAlZiBkQiIsIHZhbHVlRmxvYXQpOworICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMi5maXhlZF9kaWdpdGFsLmdhaW5fZGIgPSB2YWx1ZUZsb2F0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDMl9QQVJBTV9BREFQVF9ESUdJX0xFVkVMX0VTVElNQVRPUjoKKyAgICAgICAgICAgIEFMT0dWKCJBZ2MyU2V0UGFyYW1ldGVyKCkgbGV2ZWwgZXN0aW1hdG9yICVkIiwKKyAgICAgICAgICAgICAgICAgICood2VicnRjOjpBdWRpb1Byb2Nlc3Npbmc6OkNvbmZpZzo6R2FpbkNvbnRyb2xsZXIyOjpMZXZlbEVzdGltYXRvciopcFZhbHVlKTsKKyAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjIuYWRhcHRpdmVfZGlnaXRhbC5sZXZlbF9lc3RpbWF0b3IgPQorICAgICAgICAgICAgICAgICAgICAoKih3ZWJydGM6OkF1ZGlvUHJvY2Vzc2luZzo6Q29uZmlnOjpHYWluQ29udHJvbGxlcjI6OkxldmVsRXN0aW1hdG9yKilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDMl9QQVJBTV9BREFQVF9ESUdJX0VYVFJBX1NBVFVSQVRJT05fTUFSR0lOOgorICAgICAgICAgICAgdmFsdWVGbG9hdCA9IChmbG9hdCkoKihpbnQzMl90KilwVmFsdWUpOworICAgICAgICAgICAgQUxPR1YoIkFnYzJTZXRQYXJhbWV0ZXIoKSBleHRyYSBzYXR1cmF0aW9uIG1hcmdpbiAlZiBkQiIsIHZhbHVlRmxvYXQpOworICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMi5hZGFwdGl2ZV9kaWdpdGFsLmV4dHJhX3NhdHVyYXRpb25fbWFyZ2luX2RiID0KKyAgICAgICAgICAgICAgICAgICAgdmFsdWVGbG9hdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQzJfUEFSQU1fUFJPUEVSVElFUzoKKyAgICAgICAgICAgIEFMT0dWKCJBZ2MyU2V0UGFyYW1ldGVyKCkgcHJvcGVydGllcyBnYWluICVmLCBsZXZlbCAlZCBtYXJnaW4gJWYiLAorICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPmZpeGVkRGlnaXRhbEdhaW4sIHBQcm9wZXJ0aWVzLT5sZXZlbF9lc3RpbWF0b3IsCisgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+ZXh0cmFTYXR1cmF0aW9uTWFyZ2luKTsKKyAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjIuZml4ZWRfZGlnaXRhbC5nYWluX2RiID0KKyAgICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPmZpeGVkRGlnaXRhbEdhaW47CisgICAgICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIyLmFkYXB0aXZlX2RpZ2l0YWwubGV2ZWxfZXN0aW1hdG9yID0KKyAgICAgICAgICAgICAgICAgICAgKHdlYnJ0Yzo6QXVkaW9Qcm9jZXNzaW5nOjpDb25maWc6OkdhaW5Db250cm9sbGVyMjo6TGV2ZWxFc3RpbWF0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPmxldmVsX2VzdGltYXRvcjsKKyAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjIuYWRhcHRpdmVfZGlnaXRhbC5leHRyYV9zYXR1cmF0aW9uX21hcmdpbl9kYiA9CisgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5leHRyYVNhdHVyYXRpb25NYXJnaW47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJBZ2MyU2V0UGFyYW1ldGVyKCkgdW5rbm93biBwYXJhbSAlMDh4IHZhbHVlICUwOHgiLCBwYXJhbSwgKih1aW50MzJfdCopcFZhbHVlKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKICAgICB9CisgICAgZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkFwcGx5Q29uZmlnKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnKTsKKworICAgIEFMT0dWKCJBZ2MyU2V0UGFyYW1ldGVyKCkgZG9uZSBzdGF0dXMgJWQiLCBzdGF0dXMpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworaW50IEFnY1NldFBhcmFtZXRlcihwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QsIHZvaWQqIHBQYXJhbSwgdm9pZCogcFZhbHVlKSB7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgdWludDMyX3QgcGFyYW0gPSAqKHVpbnQzMl90KilwUGFyYW07CisgICAgdF9hZ2Nfc2V0dGluZ3MqIHBQcm9wZXJ0aWVzID0gKHRfYWdjX3NldHRpbmdzKilwVmFsdWU7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CisgICAgc3dpdGNoIChwYXJhbSkgeworICAgICAgICBjYXNlIEFHQ19QQVJBTV9UQVJHRVRfTEVWRUw6CisgICAgICAgICAgICBBTE9HVigiQWdjU2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGxldmVsICVkIG1pbGxpQmVscyIsICooaW50MTZfdCopcFZhbHVlKTsKKyAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjEudGFyZ2V0X2xldmVsX2RiZnMgPQorICAgICAgICAgICAgICAgICAgICAoLSgqKGludDE2X3QqKXBWYWx1ZSAvIDEwMCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDX1BBUkFNX0NPTVBfR0FJTjoKKyAgICAgICAgICAgIEFMT0dWKCJBZ2NTZXRQYXJhbWV0ZXIoKSBjb21wIGdhaW4gJWQgbWlsbGlCZWxzIiwgKihpbnQxNl90KilwVmFsdWUpOworICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMS5jb21wcmVzc2lvbl9nYWluX2RiID0KKyAgICAgICAgICAgICAgICAgICAgKCooaW50MTZfdCopcFZhbHVlIC8gMTAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQ19QQVJBTV9MSU1JVEVSX0VOQToKKyAgICAgICAgICAgIEFMT0dWKCJBZ2NTZXRQYXJhbWV0ZXIoKSBsaW1pdGVyIGVuYWJsZWQgJXMiLCAqKGJvb2wqKXBWYWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMS5lbmFibGVfbGltaXRlciA9ICgqKGJvb2wqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBR0NfUEFSQU1fUFJPUEVSVElFUzoKKyAgICAgICAgICAgIEFMT0dWKCJBZ2NTZXRQYXJhbWV0ZXIoKSBwcm9wZXJ0aWVzIGxldmVsICVkLCBnYWluICVkIGxpbWl0ZXIgJWQiLAorICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPnRhcmdldExldmVsLCBwUHJvcGVydGllcy0+Y29tcEdhaW4sIHBQcm9wZXJ0aWVzLT5saW1pdGVyRW5hYmxlZCk7CisgICAgICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIxLnRhcmdldF9sZXZlbF9kYmZzID0KKyAgICAgICAgICAgICAgICAgICAgLShwUHJvcGVydGllcy0+dGFyZ2V0TGV2ZWwgLyAxMDApOworICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMS5jb21wcmVzc2lvbl9nYWluX2RiID0KKyAgICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPmNvbXBHYWluIC8gMTAwOworICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMS5lbmFibGVfbGltaXRlciA9IHBQcm9wZXJ0aWVzLT5saW1pdGVyRW5hYmxlZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIkFnY1NldFBhcmFtZXRlcigpIHVua25vd24gcGFyYW0gJTA4eCB2YWx1ZSAlMDh4IiwgcGFyYW0sICoodWludDMyX3QqKXBWYWx1ZSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5BcHBseUNvbmZpZyhlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyk7CiAKICAgICBBTE9HVigiQWdjU2V0UGFyYW1ldGVyKCkgZG9uZSBzdGF0dXMgJWQiLCBzdGF0dXMpOwogCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBZ2NFbmFibGUocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0KQotewotICAgIHdlYnJ0Yzo6R2FpbkNvbnRyb2wgKmFnYyA9IHN0YXRpY19jYXN0PHdlYnJ0Yzo6R2FpbkNvbnRyb2wgKj4oZWZmZWN0LT5lbmdpbmUpOwotICAgIEFMT0dWKCJBZ2NFbmFibGUgYWdjICVwIiwgYWdjKTsKLSAgICBhZ2MtPkVuYWJsZSh0cnVlKTsKK3ZvaWQgQWdjMkVuYWJsZShwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QpIHsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5HZXRDb25maWcoKTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIyLmVuYWJsZWQgPSB0cnVlOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5BcHBseUNvbmZpZyhlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyk7CiB9CiAKLXZvaWQgQWdjRGlzYWJsZShwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QpCi17Ci0gICAgQUxPR1YoIkFnY0Rpc2FibGUiKTsKLSAgICB3ZWJydGM6OkdhaW5Db250cm9sICphZ2MgPSBzdGF0aWNfY2FzdDx3ZWJydGM6OkdhaW5Db250cm9sICo+KGVmZmVjdC0+ZW5naW5lKTsKLSAgICBhZ2MtPkVuYWJsZShmYWxzZSk7Cit2b2lkIEFnY0VuYWJsZShwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QpIHsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5HZXRDb25maWcoKTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIxLmVuYWJsZWQgPSB0cnVlOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5BcHBseUNvbmZpZyhlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyk7CiB9CiAKK3ZvaWQgQWdjMkRpc2FibGUocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0KSB7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMi5lbmFibGVkID0gZmFsc2U7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkFwcGx5Q29uZmlnKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnKTsKK30KIAotc3RhdGljIGNvbnN0IHByZXByb2Nfb3BzX3Qgc0FnY09wcyA9IHsKLSAgICAgICAgQWdjQ3JlYXRlLAotICAgICAgICBBZ2NJbml0LAotICAgICAgICBOVUxMLAotICAgICAgICBBZ2NFbmFibGUsCi0gICAgICAgIEFnY0Rpc2FibGUsCi0gICAgICAgIEFnY1NldFBhcmFtZXRlciwKLSAgICAgICAgQWdjR2V0UGFyYW1ldGVyLAotICAgICAgICBOVUxMCi19Owordm9pZCBBZ2NEaXNhYmxlKHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCkgeworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkdldENvbmZpZygpOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjEuZW5hYmxlZCA9IGZhbHNlOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5BcHBseUNvbmZpZyhlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyk7Cit9CiAKK3N0YXRpYyBjb25zdCBwcmVwcm9jX29wc190IHNBZ2NPcHMgPSB7QWdjQ3JlYXRlLCAgICAgICBBZ2NJbml0LCAgICAgICAgIE5VTEwsIEFnY0VuYWJsZSwgQWdjRGlzYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdjU2V0UGFyYW1ldGVyLCBBZ2NHZXRQYXJhbWV0ZXIsIE5VTEx9OworCitzdGF0aWMgY29uc3QgcHJlcHJvY19vcHNfdCBzQWdjMk9wcyA9IHtBZ2MyQ3JlYXRlLCAgICAgICBBZ2MySW5pdCwgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnYzJFbmFibGUsICAgICAgIEFnYzJEaXNhYmxlLCBBZ2MyU2V0UGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdjMkdldFBhcmFtZXRlciwgTlVMTH07CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBBY291c3RpYyBFY2hvIENhbmNlbGVyIChBRUMpCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zdGF0aWMgY29uc3Qgd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZTo6Um91dGluZ01vZGUga0FlY0RlZmF1bHRNb2RlID0KLSAgICAgICAgd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZTo6a0VhcnBpZWNlOwotc3RhdGljIGNvbnN0IGJvb2wga0FlY0RlZmF1bHRDb21mb3J0Tm9pc2UgPSB0cnVlOwogCi1pbnQgIEFlY0luaXQgKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCkKLXsKK2ludCBBZWNJbml0KHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCkgewogICAgIEFMT0dWKCJBZWNJbml0Iik7Ci0gICAgd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZSAqYWVjID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZSAqPihlZmZlY3QtPmVuZ2luZSk7Ci0gICAgYWVjLT5zZXRfcm91dGluZ19tb2RlKGtBZWNEZWZhdWx0TW9kZSk7Ci0gICAgYWVjLT5lbmFibGVfY29tZm9ydF9ub2lzZShrQWVjRGVmYXVsdENvbWZvcnROb2lzZSk7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZWNob19jYW5jZWxsZXIubW9iaWxlX21vZGUgPSB0cnVlOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5BcHBseUNvbmZpZyhlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyk7CiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCAgQWVjQ3JlYXRlKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCkKLXsKLSAgICB3ZWJydGM6OkVjaG9Db250cm9sTW9iaWxlICphZWMgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+ZWNob19jb250cm9sX21vYmlsZSgpOwotICAgIEFMT0dWKCJBZWNDcmVhdGUgZ290IGFlYyAlcCIsIGFlYyk7Ci0gICAgaWYgKGFlYyA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJBZ2NDcmVhdGUgRXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgfQotICAgIGVmZmVjdC0+ZW5naW5lID0gc3RhdGljX2Nhc3Q8cHJlcHJvY19meF9oYW5kbGVfdD4oYWVjKTsKLSAgICBBZWNJbml0IChlZmZlY3QpOworaW50IEFlY0NyZWF0ZShwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QpIHsKKyAgICBBZWNJbml0KGVmZmVjdCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBBZWNHZXRQYXJhbWV0ZXIocHJlcHJvY19lZmZlY3RfdCAgKmVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgKnBWYWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwVmFsdWUpCi17CitpbnQgQWVjR2V0UGFyYW1ldGVyKHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCwgdm9pZCogcFBhcmFtLCB1aW50MzJfdCogcFZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKSB7CiAgICAgaW50IHN0YXR1cyA9IDA7Ci0gICAgdWludDMyX3QgcGFyYW0gPSAqKHVpbnQzMl90ICopcFBhcmFtOworICAgIHVpbnQzMl90IHBhcmFtID0gKih1aW50MzJfdCopcFBhcmFtOwogCiAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKHVpbnQzMl90KSkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAgICAgc3dpdGNoIChwYXJhbSkgewotICAgIGNhc2UgQUVDX1BBUkFNX0VDSE9fREVMQVk6Ci0gICAgY2FzZSBBRUNfUEFSQU1fUFJPUEVSVElFUzoKLSAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSA9IDEwMDAgKiBlZmZlY3QtPnNlc3Npb24tPmFwbS0+c3RyZWFtX2RlbGF5X21zKCk7Ci0gICAgICAgIEFMT0dWKCJBZWNHZXRQYXJhbWV0ZXIoKSBlY2hvIGRlbGF5ICVkIHVzIiwgKih1aW50MzJfdCAqKXBWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dXKCJBZWNHZXRQYXJhbWV0ZXIoKSB1bmtub3duIHBhcmFtICUwOHggdmFsdWUgJTA4eCIsIHBhcmFtLCAqKHVpbnQzMl90ICopcFZhbHVlKTsKLSAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUVDX1BBUkFNX0VDSE9fREVMQVk6CisgICAgICAgIGNhc2UgQUVDX1BBUkFNX1BST1BFUlRJRVM6CisgICAgICAgICAgICAqKHVpbnQzMl90KilwVmFsdWUgPSAxMDAwICogZWZmZWN0LT5zZXNzaW9uLT5hcG0tPnN0cmVhbV9kZWxheV9tcygpOworICAgICAgICAgICAgQUxPR1YoIkFlY0dldFBhcmFtZXRlcigpIGVjaG8gZGVsYXkgJWQgdXMiLCAqKHVpbnQzMl90KilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUVDX1BBUkFNX01PQklMRV9NT0RFOgorICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CisgICAgICAgICAgICAqKHVpbnQzMl90KilwVmFsdWUgPSBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5lY2hvX2NhbmNlbGxlci5tb2JpbGVfbW9kZTsKKyAgICAgICAgICAgIEFMT0dWKCJBZWNHZXRQYXJhbWV0ZXIoKSBtb2JpbGUgbW9kZSAlZCB1cyIsICoodWludDMyX3QqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJBZWNHZXRQYXJhbWV0ZXIoKSB1bmtub3duIHBhcmFtICUwOHggdmFsdWUgJTA4eCIsIHBhcmFtLCAqKHVpbnQzMl90KilwVmFsdWUpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1pbnQgQWVjU2V0UGFyYW1ldGVyIChwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKQoteworaW50IEFlY1NldFBhcmFtZXRlcihwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QsIHZvaWQqIHBQYXJhbSwgdm9pZCogcFZhbHVlKSB7CiAgICAgaW50IHN0YXR1cyA9IDA7Ci0gICAgdWludDMyX3QgcGFyYW0gPSAqKHVpbnQzMl90ICopcFBhcmFtOwotICAgIHVpbnQzMl90IHZhbHVlID0gKih1aW50MzJfdCAqKXBWYWx1ZTsKKyAgICB1aW50MzJfdCBwYXJhbSA9ICoodWludDMyX3QqKXBQYXJhbTsKKyAgICB1aW50MzJfdCB2YWx1ZSA9ICoodWludDMyX3QqKXBWYWx1ZTsKIAogICAgIHN3aXRjaCAocGFyYW0pIHsKLSAgICBjYXNlIEFFQ19QQVJBTV9FQ0hPX0RFTEFZOgotICAgIGNhc2UgQUVDX1BBUkFNX1BST1BFUlRJRVM6Ci0gICAgICAgIHN0YXR1cyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5zZXRfc3RyZWFtX2RlbGF5X21zKHZhbHVlLzEwMDApOwotICAgICAgICBBTE9HVigiQWVjU2V0UGFyYW1ldGVyKCkgZWNobyBkZWxheSAlZCB1cywgc3RhdHVzICVkIiwgdmFsdWUsIHN0YXR1cyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dXKCJBZWNTZXRQYXJhbWV0ZXIoKSB1bmtub3duIHBhcmFtICUwOHggdmFsdWUgJTA4eCIsIHBhcmFtLCAqKHVpbnQzMl90ICopcFZhbHVlKTsKLSAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUVDX1BBUkFNX0VDSE9fREVMQVk6CisgICAgICAgIGNhc2UgQUVDX1BBUkFNX1BST1BFUlRJRVM6CisgICAgICAgICAgICBzdGF0dXMgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+c2V0X3N0cmVhbV9kZWxheV9tcyh2YWx1ZSAvIDEwMDApOworICAgICAgICAgICAgQUxPR1YoIkFlY1NldFBhcmFtZXRlcigpIGVjaG8gZGVsYXkgJWQgdXMsIHN0YXR1cyAlZCIsIHZhbHVlLCBzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUVDX1BBUkFNX01PQklMRV9NT0RFOgorICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CisgICAgICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5lY2hvX2NhbmNlbGxlci5tb2JpbGVfbW9kZSA9IHZhbHVlOworICAgICAgICAgICAgQUxPR1YoIkFlY1NldFBhcmFtZXRlcigpIG1vYmlsZSBtb2RlICVkIHVzIiwgdmFsdWUpOworICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkFwcGx5Q29uZmlnKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIkFlY1NldFBhcmFtZXRlcigpIHVua25vd24gcGFyYW0gJTA4eCB2YWx1ZSAlMDh4IiwgcGFyYW0sICoodWludDMyX3QqKXBWYWx1ZSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQWVjRW5hYmxlKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCkKLXsKLSAgICB3ZWJydGM6OkVjaG9Db250cm9sTW9iaWxlICphZWMgPSBzdGF0aWNfY2FzdDx3ZWJydGM6OkVjaG9Db250cm9sTW9iaWxlICo+KGVmZmVjdC0+ZW5naW5lKTsKLSAgICBBTE9HVigiQWVjRW5hYmxlIGFlYyAlcCIsIGFlYyk7Ci0gICAgYWVjLT5FbmFibGUodHJ1ZSk7Cit2b2lkIEFlY0VuYWJsZShwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QpIHsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5HZXRDb25maWcoKTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5lY2hvX2NhbmNlbGxlci5lbmFibGVkID0gdHJ1ZTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+QXBwbHlDb25maWcoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcpOwogfQogCi12b2lkIEFlY0Rpc2FibGUocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0KQotewotICAgIEFMT0dWKCJBZWNEaXNhYmxlIik7Ci0gICAgd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZSAqYWVjID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZSAqPihlZmZlY3QtPmVuZ2luZSk7Ci0gICAgYWVjLT5FbmFibGUoZmFsc2UpOwordm9pZCBBZWNEaXNhYmxlKHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCkgeworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkdldENvbmZpZygpOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmVjaG9fY2FuY2VsbGVyLmVuYWJsZWQgPSBmYWxzZTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+QXBwbHlDb25maWcoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcpOwogfQogCi1pbnQgQWVjU2V0RGV2aWNlKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCwgdWludDMyX3QgZGV2aWNlKQoteworaW50IEFlY1NldERldmljZShwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QsIHVpbnQzMl90IGRldmljZSkgewogICAgIEFMT0dWKCJBZWNTZXREZXZpY2UgJTA4eCIsIGRldmljZSk7Ci0gICAgd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZSAqYWVjID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZSAqPihlZmZlY3QtPmVuZ2luZSk7Ci0gICAgd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZTo6Um91dGluZ01vZGUgbW9kZSA9IHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGU6OmtRdWlldEVhcnBpZWNlT3JIZWFkc2V0OwogCiAgICAgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIHN3aXRjaChkZXZpY2UpIHsKLSAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0U6Ci0gICAgICAgIG1vZGUgPSB3ZWJydGM6OkVjaG9Db250cm9sTW9iaWxlOjprRWFycGllY2U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOgotICAgICAgICBtb2RlID0gd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZTo6a1NwZWFrZXJwaG9uZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ6Ci0gICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORToKLSAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQ6Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGFlYy0+c2V0X3JvdXRpbmdfbW9kZShtb2RlKTsKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHByZXByb2Nfb3BzX3Qgc0FlY09wcyA9IHsKLSAgICAgICAgQWVjQ3JlYXRlLAotICAgICAgICBBZWNJbml0LAotICAgICAgICBOVUxMLAotICAgICAgICBBZWNFbmFibGUsCi0gICAgICAgIEFlY0Rpc2FibGUsCi0gICAgICAgIEFlY1NldFBhcmFtZXRlciwKLSAgICAgICAgQWVjR2V0UGFyYW1ldGVyLAotICAgICAgICBBZWNTZXREZXZpY2UKLX07CitzdGF0aWMgY29uc3QgcHJlcHJvY19vcHNfdCBzQWVjT3BzID0ge0FlY0NyZWF0ZSwgICAgICAgQWVjSW5pdCwgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFlY0VuYWJsZSwgICAgICAgQWVjRGlzYWJsZSwgIEFlY1NldFBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWVjR2V0UGFyYW1ldGVyLCBBZWNTZXREZXZpY2V9OwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gTm9pc2UgU3VwcHJlc3Npb24gKE5TKQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3RhdGljIGNvbnN0IHdlYnJ0Yzo6Tm9pc2VTdXBwcmVzc2lvbjo6TGV2ZWwga05zRGVmYXVsdExldmVsID0gd2VicnRjOjpOb2lzZVN1cHByZXNzaW9uOjprTW9kZXJhdGU7CitzdGF0aWMgY29uc3Qgd2VicnRjOjpBdWRpb1Byb2Nlc3Npbmc6OkNvbmZpZzo6Tm9pc2VTdXBwcmVzc2lvbjo6TGV2ZWwga05zRGVmYXVsdExldmVsID0KKyAgICAgICAgd2VicnRjOjpBdWRpb1Byb2Nlc3Npbmc6OkNvbmZpZzo6Tm9pc2VTdXBwcmVzc2lvbjo6a01vZGVyYXRlOwogCi1pbnQgIE5zSW5pdCAocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0KQoteworaW50IE5zSW5pdChwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QpIHsKICAgICBBTE9HVigiTnNJbml0Iik7Ci0gICAgd2VicnRjOjpOb2lzZVN1cHByZXNzaW9uICpucyA9IHN0YXRpY19jYXN0PHdlYnJ0Yzo6Tm9pc2VTdXBwcmVzc2lvbiAqPihlZmZlY3QtPmVuZ2luZSk7Ci0gICAgbnMtPnNldF9sZXZlbChrTnNEZWZhdWx0TGV2ZWwpOwotICAgIHdlYnJ0Yzo6Q29uZmlnIGNvbmZpZzsKLSAgICBzdGQ6OnZlY3Rvcjx3ZWJydGM6OlBvaW50PiBnZW9tZXRyeTsKLSAgICAvLyBUT0RPKGFsdWVicyk6IE1ha2UgdGhlIGdlb21ldHJ5IHNldHRhYmxlLgotICAgIGdlb21ldHJ5LnB1c2hfYmFjayh3ZWJydGM6OlBvaW50KC0wLjAzZiwgMC5mLCAwLmYpKTsKLSAgICBnZW9tZXRyeS5wdXNoX2JhY2sod2VicnRjOjpQb2ludCgtMC4wMWYsIDAuZiwgMC5mKSk7Ci0gICAgZ2VvbWV0cnkucHVzaF9iYWNrKHdlYnJ0Yzo6UG9pbnQoMC4wMWYsIDAuZiwgMC5mKSk7Ci0gICAgZ2VvbWV0cnkucHVzaF9iYWNrKHdlYnJ0Yzo6UG9pbnQoMC4wM2YsIDAuZiwgMC5mKSk7Ci0gICAgLy8gVGhlIGdlb21ldHJ5IG5lZWRzIHRvIGJlIHNldCB3aXRoIEJlYW1mb3JtaW5nIGVuYWJsZWQuCi0gICAgY29uZmlnLlNldDx3ZWJydGM6OkJlYW1mb3JtaW5nPigKLSAgICAgICAgICAgIG5ldyB3ZWJydGM6OkJlYW1mb3JtaW5nKHRydWUsIGdlb21ldHJ5KSk7Ci0gICAgZWZmZWN0LT5zZXNzaW9uLT5hcG0tPlNldEV4dHJhT3B0aW9ucyhjb25maWcpOwotICAgIGNvbmZpZy5TZXQ8d2VicnRjOjpCZWFtZm9ybWluZz4oCi0gICAgICAgICAgICBuZXcgd2VicnRjOjpCZWFtZm9ybWluZyhmYWxzZSwgZ2VvbWV0cnkpKTsKLSAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+U2V0RXh0cmFPcHRpb25zKGNvbmZpZyk7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcubm9pc2Vfc3VwcHJlc3Npb24ubGV2ZWwgPSBrTnNEZWZhdWx0TGV2ZWw7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkFwcGx5Q29uZmlnKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnKTsKICAgICBlZmZlY3QtPnR5cGUgPSBOU19UWVBFX1NJTkdMRV9DSEFOTkVMOwogICAgIHJldHVybiAwOwogfQogCi1pbnQgIE5zQ3JlYXRlKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCkKLXsKLSAgICB3ZWJydGM6Ok5vaXNlU3VwcHJlc3Npb24gKm5zID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPm5vaXNlX3N1cHByZXNzaW9uKCk7Ci0gICAgQUxPR1YoIk5zQ3JlYXRlIGdvdCBucyAlcCIsIG5zKTsKLSAgICBpZiAobnMgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiQWdjQ3JlYXRlIEVycm9yIik7Ci0gICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgIH0KLSAgICBlZmZlY3QtPmVuZ2luZSA9IHN0YXRpY19jYXN0PHByZXByb2NfZnhfaGFuZGxlX3Q+KG5zKTsKLSAgICBOc0luaXQgKGVmZmVjdCk7CitpbnQgTnNDcmVhdGUocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0KSB7CisgICAgTnNJbml0KGVmZmVjdCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBOc0dldFBhcmFtZXRlcihwcmVwcm9jX2VmZmVjdF90ICAqZWZmZWN0IF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwUGFyYW0gX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgKnBWYWx1ZVNpemUgX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBWYWx1ZSBfX3VudXNlZCkKLXsKK2ludCBOc0dldFBhcmFtZXRlcihwcmVwcm9jX2VmZmVjdF90KiAvKmVmZmVjdCBfX3VudXNlZCovLCB2b2lkKiAvKnBQYXJhbSBfX3VudXNlZCovLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiAvKnBWYWx1ZVNpemUgX191bnVzZWQqLywgdm9pZCogLypwVmFsdWUgX191bnVzZWQqLykgewogICAgIGludCBzdGF0dXMgPSAwOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLWludCBOc1NldFBhcmFtZXRlciAocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0LCB2b2lkICpwUGFyYW0sIHZvaWQgKnBWYWx1ZSkKLXsKK2ludCBOc1NldFBhcmFtZXRlcihwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QsIHZvaWQqIHBQYXJhbSwgdm9pZCogcFZhbHVlKSB7CiAgICAgaW50IHN0YXR1cyA9IDA7Ci0gICAgd2VicnRjOjpOb2lzZVN1cHByZXNzaW9uICpucyA9IHN0YXRpY19jYXN0PHdlYnJ0Yzo6Tm9pc2VTdXBwcmVzc2lvbiAqPihlZmZlY3QtPmVuZ2luZSk7Ci0gICAgdWludDMyX3QgcGFyYW0gPSAqKHVpbnQzMl90ICopcFBhcmFtOwotICAgIHVpbnQzMl90IHZhbHVlID0gKih1aW50MzJfdCAqKXBWYWx1ZTsKLSAgICBzd2l0Y2gocGFyYW0pIHsKKyAgICB1aW50MzJfdCBwYXJhbSA9ICoodWludDMyX3QqKXBQYXJhbTsKKyAgICB1aW50MzJfdCB2YWx1ZSA9ICoodWludDMyX3QqKXBWYWx1ZTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5HZXRDb25maWcoKTsKKyAgICBzd2l0Y2ggKHBhcmFtKSB7CiAgICAgICAgIGNhc2UgTlNfUEFSQU1fTEVWRUw6Ci0gICAgICAgICAgICBucy0+c2V0X2xldmVsKCh3ZWJydGM6Ok5vaXNlU3VwcHJlc3Npb246OkxldmVsKXZhbHVlKTsKKyAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLm5vaXNlX3N1cHByZXNzaW9uLmxldmVsID0KKyAgICAgICAgICAgICAgICAgICAgKHdlYnJ0Yzo6QXVkaW9Qcm9jZXNzaW5nOjpDb25maWc6Ok5vaXNlU3VwcHJlc3Npb246OkxldmVsKXZhbHVlOwogICAgICAgICAgICAgQUxPR1YoIk5zU2V0UGFyYW1ldGVyKCkgbGV2ZWwgJWQiLCB2YWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBOU19QQVJBTV9UWVBFOgotICAgICAgICB7Ci0gICAgICAgICAgICB3ZWJydGM6OkNvbmZpZyBjb25maWc7Ci0gICAgICAgICAgICBzdGQ6OnZlY3Rvcjx3ZWJydGM6OlBvaW50PiBnZW9tZXRyeTsKLSAgICAgICAgICAgIGJvb2wgaXNfYmVhbWZvcm1pbmdfZW5hYmxlZCA9Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID09IE5TX1RZUEVfTVVMVElfQ0hBTk5FTCAmJiBucy0+aXNfZW5hYmxlZCgpOwotICAgICAgICAgICAgY29uZmlnLlNldDx3ZWJydGM6OkJlYW1mb3JtaW5nPigKLSAgICAgICAgICAgICAgICAgICAgbmV3IHdlYnJ0Yzo6QmVhbWZvcm1pbmcoaXNfYmVhbWZvcm1pbmdfZW5hYmxlZCwgZ2VvbWV0cnkpKTsKLSAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5TZXRFeHRyYU9wdGlvbnMoY29uZmlnKTsKLSAgICAgICAgICAgIGVmZmVjdC0+dHlwZSA9IHZhbHVlOwotICAgICAgICAgICAgQUxPR1YoIk5zU2V0UGFyYW1ldGVyKCkgdHlwZSAlZCIsIHZhbHVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HVygiTnNTZXRQYXJhbWV0ZXIoKSB1bmtub3duIHBhcmFtICUwOHggdmFsdWUgJTA4eCIsIHBhcmFtLCB2YWx1ZSk7CiAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwogICAgIH0KKyAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+QXBwbHlDb25maWcoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcpOwogCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBOc0VuYWJsZShwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QpCi17Ci0gICAgd2VicnRjOjpOb2lzZVN1cHByZXNzaW9uICpucyA9IHN0YXRpY19jYXN0PHdlYnJ0Yzo6Tm9pc2VTdXBwcmVzc2lvbiAqPihlZmZlY3QtPmVuZ2luZSk7Ci0gICAgQUxPR1YoIk5zRW5hYmxlIG5zICVwIiwgbnMpOwotICAgIG5zLT5FbmFibGUodHJ1ZSk7Ci0gICAgaWYgKGVmZmVjdC0+dHlwZSA9PSBOU19UWVBFX01VTFRJX0NIQU5ORUwpIHsKLSAgICAgICAgd2VicnRjOjpDb25maWcgY29uZmlnOwotICAgICAgICBzdGQ6OnZlY3Rvcjx3ZWJydGM6OlBvaW50PiBnZW9tZXRyeTsKLSAgICAgICAgY29uZmlnLlNldDx3ZWJydGM6OkJlYW1mb3JtaW5nPihuZXcgd2VicnRjOjpCZWFtZm9ybWluZyh0cnVlLCBnZW9tZXRyeSkpOwotICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+U2V0RXh0cmFPcHRpb25zKGNvbmZpZyk7Ci0gICAgfQordm9pZCBOc0VuYWJsZShwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QpIHsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5HZXRDb25maWcoKTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5ub2lzZV9zdXBwcmVzc2lvbi5lbmFibGVkID0gdHJ1ZTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+QXBwbHlDb25maWcoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcpOwogfQogCi12b2lkIE5zRGlzYWJsZShwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QpCi17Cit2b2lkIE5zRGlzYWJsZShwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QpIHsKICAgICBBTE9HVigiTnNEaXNhYmxlIik7Ci0gICAgd2VicnRjOjpOb2lzZVN1cHByZXNzaW9uICpucyA9IHN0YXRpY19jYXN0PHdlYnJ0Yzo6Tm9pc2VTdXBwcmVzc2lvbiAqPihlZmZlY3QtPmVuZ2luZSk7Ci0gICAgbnMtPkVuYWJsZShmYWxzZSk7Ci0gICAgd2VicnRjOjpDb25maWcgY29uZmlnOwotICAgIHN0ZDo6dmVjdG9yPHdlYnJ0Yzo6UG9pbnQ+IGdlb21ldHJ5OwotICAgIGNvbmZpZy5TZXQ8d2VicnRjOjpCZWFtZm9ybWluZz4obmV3IHdlYnJ0Yzo6QmVhbWZvcm1pbmcoZmFsc2UsIGdlb21ldHJ5KSk7Ci0gICAgZWZmZWN0LT5zZXNzaW9uLT5hcG0tPlNldEV4dHJhT3B0aW9ucyhjb25maWcpOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkdldENvbmZpZygpOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLm5vaXNlX3N1cHByZXNzaW9uLmVuYWJsZWQgPSBmYWxzZTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+QXBwbHlDb25maWcoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcpOwogfQogCi1zdGF0aWMgY29uc3QgcHJlcHJvY19vcHNfdCBzTnNPcHMgPSB7Ci0gICAgICAgIE5zQ3JlYXRlLAotICAgICAgICBOc0luaXQsCi0gICAgICAgIE5VTEwsCi0gICAgICAgIE5zRW5hYmxlLAotICAgICAgICBOc0Rpc2FibGUsCi0gICAgICAgIE5zU2V0UGFyYW1ldGVyLAotICAgICAgICBOc0dldFBhcmFtZXRlciwKLSAgICAgICAgTlVMTAotfTsKK3N0YXRpYyBjb25zdCBwcmVwcm9jX29wc190IHNOc09wcyA9IHtOc0NyZWF0ZSwgIE5zSW5pdCwgICAgICAgICBOVUxMLCAgICAgICAgICAgTnNFbmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnNEaXNhYmxlLCBOc1NldFBhcmFtZXRlciwgTnNHZXRQYXJhbWV0ZXIsIE5VTEx9OwogCi0KLXN0YXRpYyBjb25zdCBwcmVwcm9jX29wc190ICpzUHJlUHJvY09wc1tQUkVQUk9DX05VTV9FRkZFQ1RTXSA9IHsKLSAgICAgICAgJnNBZ2NPcHMsCi0gICAgICAgICZzQWVjT3BzLAotICAgICAgICAmc05zT3BzCi19OwotCitzdGF0aWMgY29uc3QgcHJlcHJvY19vcHNfdCogc1ByZVByb2NPcHNbUFJFUFJPQ19OVU1fRUZGRUNUU10gPSB7JnNBZ2NPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNBZ2MyT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzQWVjT3BzLCAmc05zT3BzfTsKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEVmZmVjdCBmdW5jdGlvbnMKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgU2Vzc2lvbl9TZXRQcm9jRW5hYmxlZChwcmVwcm9jX3Nlc3Npb25fdCAqc2Vzc2lvbiwgdWludDMyX3QgcHJvY0lkLCBib29sIGVuYWJsZWQpOwordm9pZCBTZXNzaW9uX1NldFByb2NFbmFibGVkKHByZXByb2Nfc2Vzc2lvbl90KiBzZXNzaW9uLCB1aW50MzJfdCBwcm9jSWQsIGJvb2wgZW5hYmxlZCk7CiAKIGV4dGVybiAiQyIgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBzRWZmZWN0SW50ZXJmYWNlOwogZXh0ZXJuICJDIiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIHNFZmZlY3RJbnRlcmZhY2VSZXZlcnNlOwogCi0jZGVmaW5lIEJBRF9TVEFURV9BQk9SVChmcm9tLCB0bykgXAotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJCYWQgc3RhdGUgdHJhbnNpdGlvbiBmcm9tICVkIHRvICVkIiwgZnJvbSwgdG8pOworI2RlZmluZSBCQURfU1RBVEVfQUJPUlQoZnJvbSwgdG8pIExPR19BTFdBWVNfRkFUQUwoIkJhZCBzdGF0ZSB0cmFuc2l0aW9uIGZyb20gJWQgdG8gJWQiLCBmcm9tLCB0byk7CiAKLWludCBFZmZlY3RfU2V0U3RhdGUocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0LCB1aW50MzJfdCBzdGF0ZSkKLXsKK2ludCBFZmZlY3RfU2V0U3RhdGUocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0LCB1aW50MzJfdCBzdGF0ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwogICAgIEFMT0dWKCJFZmZlY3RfU2V0U3RhdGUgcHJvYyAlZCwgbmV3ICVkIG9sZCAlZCIsIGVmZmVjdC0+cHJvY0lkLCBzdGF0ZSwgZWZmZWN0LT5zdGF0ZSk7Ci0gICAgc3dpdGNoKHN0YXRlKSB7Ci0gICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9JTklUOgotICAgICAgICBzd2l0Y2goZWZmZWN0LT5zdGF0ZSkgewotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0FDVElWRToKLSAgICAgICAgICAgIGVmZmVjdC0+b3BzLT5kaXNhYmxlKGVmZmVjdCk7Ci0gICAgICAgICAgICBTZXNzaW9uX1NldFByb2NFbmFibGVkKGVmZmVjdC0+c2Vzc2lvbiwgZWZmZWN0LT5wcm9jSWQsIGZhbHNlKTsKKyAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfSU5JVDoKKyAgICAgICAgICAgIHN3aXRjaCAoZWZmZWN0LT5zdGF0ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPm9wcy0+ZGlzYWJsZShlZmZlY3QpOworICAgICAgICAgICAgICAgICAgICBTZXNzaW9uX1NldFByb2NFbmFibGVkKGVmZmVjdC0+c2Vzc2lvbiwgZWZmZWN0LT5wcm9jSWQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DT05GSUc6CisgICAgICAgICAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DUkVBVEVEOgorICAgICAgICAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfSU5JVDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQkFEX1NUQVRFX0FCT1JUKGVmZmVjdC0+c3RhdGUsIHN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NSRUFURUQ6CisgICAgICAgICAgICBzd2l0Y2ggKGVmZmVjdC0+c3RhdGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0lOSVQ6CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVmZmVjdC0+b3BzLT5jcmVhdGUoZWZmZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DUkVBVEVEOgorICAgICAgICAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ09ORklHOgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRWZmZWN0X1NldFN0YXRlIGludmFsaWQgdHJhbnNpdGlvbiIpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRU5PU1lTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBCQURfU1RBVEVfQUJPUlQoZWZmZWN0LT5zdGF0ZSwgc3RhdGUpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ09ORklHOgotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NSRUFURUQ6Ci0gICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfSU5JVDoKKyAgICAgICAgICAgIHN3aXRjaCAoZWZmZWN0LT5zdGF0ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfSU5JVDoKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkVmZmVjdF9TZXRTdGF0ZSBpbnZhbGlkIHRyYW5zaXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVOT1NZUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAgICAgICAgIGVmZmVjdC0+b3BzLT5kaXNhYmxlKGVmZmVjdCk7CisgICAgICAgICAgICAgICAgICAgIFNlc3Npb25fU2V0UHJvY0VuYWJsZWQoZWZmZWN0LT5zZXNzaW9uLCBlZmZlY3QtPnByb2NJZCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NSRUFURUQ6CisgICAgICAgICAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DT05GSUc6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEJBRF9TVEFURV9BQk9SVChlZmZlY3QtPnN0YXRlLCBzdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICBzd2l0Y2ggKGVmZmVjdC0+c3RhdGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0lOSVQ6CisgICAgICAgICAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DUkVBVEVEOgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRWZmZWN0X1NldFN0YXRlIGludmFsaWQgdHJhbnNpdGlvbiIpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRU5PU1lTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgICAgICAgICAgLy8gZW5hYmxpbmcgYW4gYWxyZWFkeSBlbmFibGVkIGVmZmVjdCBpcyBqdXN0IGlnbm9yZWQKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DT05GSUc6CisgICAgICAgICAgICAgICAgICAgIGVmZmVjdC0+b3BzLT5lbmFibGUoZWZmZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbl9TZXRQcm9jRW5hYmxlZChlZmZlY3QtPnNlc3Npb24sIGVmZmVjdC0+cHJvY0lkLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQkFEX1NUQVRFX0FCT1JUKGVmZmVjdC0+c3RhdGUsIHN0YXRlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQkFEX1NUQVRFX0FCT1JUKGVmZmVjdC0+c3RhdGUsIHN0YXRlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NSRUFURUQ6Ci0gICAgICAgIHN3aXRjaChlZmZlY3QtPnN0YXRlKSB7Ci0gICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfSU5JVDoKLSAgICAgICAgICAgIHN0YXR1cyA9IGVmZmVjdC0+b3BzLT5jcmVhdGUoZWZmZWN0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NSRUFURUQ6Ci0gICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQUNUSVZFOgotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NPTkZJRzoKLSAgICAgICAgICAgIEFMT0dFKCJFZmZlY3RfU2V0U3RhdGUgaW52YWxpZCB0cmFuc2l0aW9uIik7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRU5PU1lTOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBCQURfU1RBVEVfQUJPUlQoZWZmZWN0LT5zdGF0ZSwgc3RhdGUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ09ORklHOgotICAgICAgICBzd2l0Y2goZWZmZWN0LT5zdGF0ZSkgewotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0lOSVQ6Ci0gICAgICAgICAgICBBTE9HRSgiRWZmZWN0X1NldFN0YXRlIGludmFsaWQgdHJhbnNpdGlvbiIpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVOT1NZUzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0FDVElWRToKLSAgICAgICAgICAgIGVmZmVjdC0+b3BzLT5kaXNhYmxlKGVmZmVjdCk7Ci0gICAgICAgICAgICBTZXNzaW9uX1NldFByb2NFbmFibGVkKGVmZmVjdC0+c2Vzc2lvbiwgZWZmZWN0LT5wcm9jSWQsIGZhbHNlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NSRUFURUQ6Ci0gICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ09ORklHOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBCQURfU1RBVEVfQUJPUlQoZWZmZWN0LT5zdGF0ZSwgc3RhdGUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQUNUSVZFOgotICAgICAgICBzd2l0Y2goZWZmZWN0LT5zdGF0ZSkgewotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0lOSVQ6Ci0gICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ1JFQVRFRDoKLSAgICAgICAgICAgIEFMT0dFKCJFZmZlY3RfU2V0U3RhdGUgaW52YWxpZCB0cmFuc2l0aW9uIik7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRU5PU1lTOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQUNUSVZFOgotICAgICAgICAgICAgLy8gZW5hYmxpbmcgYW4gYWxyZWFkeSBlbmFibGVkIGVmZmVjdCBpcyBqdXN0IGlnbm9yZWQKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NPTkZJRzoKLSAgICAgICAgICAgIGVmZmVjdC0+b3BzLT5lbmFibGUoZWZmZWN0KTsKLSAgICAgICAgICAgIFNlc3Npb25fU2V0UHJvY0VuYWJsZWQoZWZmZWN0LT5zZXNzaW9uLCBlZmZlY3QtPnByb2NJZCwgdHJ1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEJBRF9TVEFURV9BQk9SVChlZmZlY3QtPnN0YXRlLCBzdGF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQkFEX1NUQVRFX0FCT1JUKGVmZmVjdC0+c3RhdGUsIHN0YXRlKTsKICAgICB9CiAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CiAgICAgICAgIGVmZmVjdC0+c3RhdGUgPSBzdGF0ZTsKQEAgLTc2Niw4ICs3OTQsNyBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLWludCBFZmZlY3RfSW5pdChwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QsIHVpbnQzMl90IHByb2NJZCkKLXsKK2ludCBFZmZlY3RfSW5pdChwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QsIHVpbnQzMl90IHByb2NJZCkgewogICAgIGlmIChIYXNSZXZlcnNlU3RyZWFtKHByb2NJZCkpIHsKICAgICAgICAgZWZmZWN0LT5pdGZlID0gJnNFZmZlY3RJbnRlcmZhY2VSZXZlcnNlOwogICAgIH0gZWxzZSB7CkBAIC03NzksMjEgKzgwNiwxNyBAQAogICAgIHJldHVybiAwOwogfQogCi1pbnQgRWZmZWN0X0NyZWF0ZShwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QsCi0gICAgICAgICAgICAgICBwcmVwcm9jX3Nlc3Npb25fdCAqc2Vzc2lvbiwKLSAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAgKmludGVyZmFjZSkKLXsKK2ludCBFZmZlY3RfQ3JlYXRlKHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCwgcHJlcHJvY19zZXNzaW9uX3QqIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QqIGludGVyZmFjZSkgewogICAgIGVmZmVjdC0+c2Vzc2lvbiA9IHNlc3Npb247CiAgICAgKmludGVyZmFjZSA9IChlZmZlY3RfaGFuZGxlX3QpJmVmZmVjdC0+aXRmZTsKICAgICByZXR1cm4gRWZmZWN0X1NldFN0YXRlKGVmZmVjdCwgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ1JFQVRFRCk7CiB9CiAKLWludCBFZmZlY3RfUmVsZWFzZShwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QpCi17CitpbnQgRWZmZWN0X1JlbGVhc2UocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0KSB7CiAgICAgcmV0dXJuIEVmZmVjdF9TZXRTdGF0ZShlZmZlY3QsIFBSRVBST0NfRUZGRUNUX1NUQVRFX0lOSVQpOwogfQogCi0KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBTZXNzaW9uIGZ1bmN0aW9ucwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTgwMyw4ICs4MjYsNyBAQAogc3RhdGljIGNvbnN0IGludCBrUHJlcHJvY0RlZmF1bHRTciA9IDE2MDAwOwogc3RhdGljIGNvbnN0IGludCBrUHJlUHJvY0RlZmF1bHRDbmwgPSAxOwogCi1pbnQgU2Vzc2lvbl9Jbml0KHByZXByb2Nfc2Vzc2lvbl90ICpzZXNzaW9uKQoteworaW50IFNlc3Npb25fSW5pdChwcmVwcm9jX3Nlc3Npb25fdCogc2Vzc2lvbikgewogICAgIHNpemVfdCBpOwogICAgIGludCBzdGF0dXMgPSAwOwogCkBAIC04MTIsMTI5ICs4MzQsNjkgQEAKICAgICBzZXNzaW9uLT5pZCA9IDA7CiAgICAgc2Vzc2lvbi0+aW8gPSAwOwogICAgIHNlc3Npb24tPmNyZWF0ZWRNc2sgPSAwOwotICAgIHNlc3Npb24tPmFwbSA9IE5VTEw7CiAgICAgZm9yIChpID0gMDsgaSA8IFBSRVBST0NfTlVNX0VGRkVDVFMgJiYgc3RhdHVzID09IDA7IGkrKykgewogICAgICAgICBzdGF0dXMgPSBFZmZlY3RfSW5pdCgmc2Vzc2lvbi0+ZWZmZWN0c1tpXSwgaSk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLQotZXh0ZXJuICJDIiBpbnQgU2Vzc2lvbl9DcmVhdGVFZmZlY3QocHJlcHJvY19zZXNzaW9uX3QgKnNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByb2NJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAgKmludGVyZmFjZSkKLXsKK2V4dGVybiAiQyIgaW50IFNlc3Npb25fQ3JlYXRlRWZmZWN0KHByZXByb2Nfc2Vzc2lvbl90KiBzZXNzaW9uLCBpbnQzMl90IHByb2NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCogaW50ZXJmYWNlKSB7CiAgICAgaW50IHN0YXR1cyA9IC1FTk9NRU07CiAKICAgICBBTE9HVigiU2Vzc2lvbl9DcmVhdGVFZmZlY3QgcHJvY0lkICVkLCBjcmVhdGVkTXNrICUwOHgiLCBwcm9jSWQsIHNlc3Npb24tPmNyZWF0ZWRNc2spOwogCiAgICAgaWYgKHNlc3Npb24tPmNyZWF0ZWRNc2sgPT0gMCkgewotICAgICAgICBzZXNzaW9uLT5hcG0gPSB3ZWJydGM6OkF1ZGlvUHJvY2Vzc2luZzo6Q3JlYXRlKCk7CisgICAgICAgIHNlc3Npb24tPmFwbSA9IHNlc3Npb24tPmFwX2J1aWxkZXIuQ3JlYXRlKCk7CiAgICAgICAgIGlmIChzZXNzaW9uLT5hcG0gPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR1coIlNlc3Npb25fQ3JlYXRlRWZmZWN0IGNvdWxkIG5vdCBnZXQgYXBtIGVuZ2luZSIpOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQotICAgICAgICBjb25zdCB3ZWJydGM6OlByb2Nlc3NpbmdDb25maWcgcHJvY2Vzc2luZ19jb25maWcgPSB7Ci0gICAgICAgICAgICB7e2tQcmVwcm9jRGVmYXVsdFNyLCBrUHJlUHJvY0RlZmF1bHRDbmx9LAotICAgICAgICAgICAgIHtrUHJlcHJvY0RlZmF1bHRTciwga1ByZVByb2NEZWZhdWx0Q25sfSwKLSAgICAgICAgICAgICB7a1ByZXByb2NEZWZhdWx0U3IsIGtQcmVQcm9jRGVmYXVsdENubH0sCi0gICAgICAgICAgICAge2tQcmVwcm9jRGVmYXVsdFNyLCBrUHJlUHJvY0RlZmF1bHRDbmx9fX07Ci0gICAgICAgIHNlc3Npb24tPmFwbS0+SW5pdGlhbGl6ZShwcm9jZXNzaW5nX2NvbmZpZyk7Ci0gICAgICAgIHNlc3Npb24tPnByb2NGcmFtZSA9IG5ldyB3ZWJydGM6OkF1ZGlvRnJhbWUoKTsKLSAgICAgICAgaWYgKHNlc3Npb24tPnByb2NGcmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HVygiU2Vzc2lvbl9DcmVhdGVFZmZlY3QgY291bGQgbm90IGFsbG9jYXRlIGF1ZGlvIGZyYW1lIik7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0gICAgICAgIHNlc3Npb24tPnJldkZyYW1lID0gbmV3IHdlYnJ0Yzo6QXVkaW9GcmFtZSgpOwotICAgICAgICBpZiAoc2Vzc2lvbi0+cmV2RnJhbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1coIlNlc3Npb25fQ3JlYXRlRWZmZWN0IGNvdWxkIG5vdCBhbGxvY2F0ZSByZXZlcnNlIGF1ZGlvIGZyYW1lIik7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0gICAgICAgIHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSA9IGtQcmVwcm9jRGVmYXVsdFNyOwotICAgICAgICBzZXNzaW9uLT5hcG1GcmFtZUNvdW50ID0gKGtQcmVwcm9jRGVmYXVsdFNyKSAvIDEwMDsKLSAgICAgICAgc2Vzc2lvbi0+ZnJhbWVDb3VudCA9IHNlc3Npb24tPmFwbUZyYW1lQ291bnQ7CisgICAgICAgIHNlc3Npb24tPmZyYW1lQ291bnQgPSBrUHJlcHJvY0RlZmF1bHRTciAvIDEwMDsKICAgICAgICAgc2Vzc2lvbi0+c2FtcGxpbmdSYXRlID0ga1ByZXByb2NEZWZhdWx0U3I7CiAgICAgICAgIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ID0ga1ByZVByb2NEZWZhdWx0Q25sOwogICAgICAgICBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQgPSBrUHJlUHJvY0RlZmF1bHRDbmw7Ci0gICAgICAgIHNlc3Npb24tPnByb2NGcmFtZS0+c2FtcGxlX3JhdGVfaHpfID0ga1ByZXByb2NEZWZhdWx0U3I7Ci0gICAgICAgIHNlc3Npb24tPnByb2NGcmFtZS0+bnVtX2NoYW5uZWxzXyA9IGtQcmVQcm9jRGVmYXVsdENubDsKKyAgICAgICAgc2Vzc2lvbi0+aW5wdXRDb25maWcuc2V0X3NhbXBsZV9yYXRlX2h6KGtQcmVwcm9jRGVmYXVsdFNyKTsKKyAgICAgICAgc2Vzc2lvbi0+aW5wdXRDb25maWcuc2V0X251bV9jaGFubmVscyhrUHJlUHJvY0RlZmF1bHRDbmwpOworICAgICAgICBzZXNzaW9uLT5vdXRwdXRDb25maWcuc2V0X3NhbXBsZV9yYXRlX2h6KGtQcmVwcm9jRGVmYXVsdFNyKTsKKyAgICAgICAgc2Vzc2lvbi0+b3V0cHV0Q29uZmlnLnNldF9udW1fY2hhbm5lbHMoa1ByZVByb2NEZWZhdWx0Q25sKTsKICAgICAgICAgc2Vzc2lvbi0+cmV2Q2hhbm5lbENvdW50ID0ga1ByZVByb2NEZWZhdWx0Q25sOwotICAgICAgICBzZXNzaW9uLT5yZXZGcmFtZS0+c2FtcGxlX3JhdGVfaHpfID0ga1ByZXByb2NEZWZhdWx0U3I7Ci0gICAgICAgIHNlc3Npb24tPnJldkZyYW1lLT5udW1fY2hhbm5lbHNfID0ga1ByZVByb2NEZWZhdWx0Q25sOworICAgICAgICBzZXNzaW9uLT5yZXZDb25maWcuc2V0X3NhbXBsZV9yYXRlX2h6KGtQcmVwcm9jRGVmYXVsdFNyKTsKKyAgICAgICAgc2Vzc2lvbi0+cmV2Q29uZmlnLnNldF9udW1fY2hhbm5lbHMoa1ByZVByb2NEZWZhdWx0Q25sKTsKICAgICAgICAgc2Vzc2lvbi0+ZW5hYmxlZE1zayA9IDA7CiAgICAgICAgIHNlc3Npb24tPnByb2Nlc3NlZE1zayA9IDA7CiAgICAgICAgIHNlc3Npb24tPnJldkVuYWJsZWRNc2sgPSAwOwogICAgICAgICBzZXNzaW9uLT5yZXZQcm9jZXNzZWRNc2sgPSAwOwotICAgICAgICBzZXNzaW9uLT5pblJlc2FtcGxlciA9IE5VTEw7Ci0gICAgICAgIHNlc3Npb24tPmluQnVmID0gTlVMTDsKLSAgICAgICAgc2Vzc2lvbi0+aW5CdWZTaXplID0gMDsKLSAgICAgICAgc2Vzc2lvbi0+b3V0UmVzYW1wbGVyID0gTlVMTDsKLSAgICAgICAgc2Vzc2lvbi0+b3V0QnVmID0gTlVMTDsKLSAgICAgICAgc2Vzc2lvbi0+b3V0QnVmU2l6ZSA9IDA7Ci0gICAgICAgIHNlc3Npb24tPnJldlJlc2FtcGxlciA9IE5VTEw7Ci0gICAgICAgIHNlc3Npb24tPnJldkJ1ZiA9IE5VTEw7Ci0gICAgICAgIHNlc3Npb24tPnJldkJ1ZlNpemUgPSAwOwogICAgIH0KICAgICBzdGF0dXMgPSBFZmZlY3RfQ3JlYXRlKCZzZXNzaW9uLT5lZmZlY3RzW3Byb2NJZF0sIHNlc3Npb24sIGludGVyZmFjZSk7CiAgICAgaWYgKHN0YXR1cyA8IDApIHsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAgICAgQUxPR1YoIlNlc3Npb25fQ3JlYXRlRWZmZWN0IE9LIik7Ci0gICAgc2Vzc2lvbi0+Y3JlYXRlZE1zayB8PSAoMTw8cHJvY0lkKTsKKyAgICBzZXNzaW9uLT5jcmVhdGVkTXNrIHw9ICgxIDw8IHByb2NJZCk7CiAgICAgcmV0dXJuIHN0YXR1czsKIAogZXJyb3I6CiAgICAgaWYgKHNlc3Npb24tPmNyZWF0ZWRNc2sgPT0gMCkgewotICAgICAgICBkZWxldGUgc2Vzc2lvbi0+cmV2RnJhbWU7Ci0gICAgICAgIHNlc3Npb24tPnJldkZyYW1lID0gTlVMTDsKLSAgICAgICAgZGVsZXRlIHNlc3Npb24tPnByb2NGcmFtZTsKLSAgICAgICAgc2Vzc2lvbi0+cHJvY0ZyYW1lID0gTlVMTDsKICAgICAgICAgZGVsZXRlIHNlc3Npb24tPmFwbTsKLSAgICAgICAgc2Vzc2lvbi0+YXBtID0gTlVMTDsgLy8gTk9MSU5UKGNsYW5nLWFuYWx5emVyLWNwbHVzcGx1cy5OZXdEZWxldGUpCisgICAgICAgIHNlc3Npb24tPmFwbSA9IE5VTEw7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLWludCBTZXNzaW9uX1JlbGVhc2VFZmZlY3QocHJlcHJvY19zZXNzaW9uX3QgKnNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHByZXByb2NfZWZmZWN0X3QgKmZ4KQoteworaW50IFNlc3Npb25fUmVsZWFzZUVmZmVjdChwcmVwcm9jX3Nlc3Npb25fdCogc2Vzc2lvbiwgcHJlcHJvY19lZmZlY3RfdCogZngpIHsKICAgICBBTE9HV19JRihFZmZlY3RfUmVsZWFzZShmeCkgIT0gMCwgIiBFZmZlY3RfUmVsZWFzZSgpIGZhaWxlZCBmb3IgcHJvYyBJRCAlZCIsIGZ4LT5wcm9jSWQpOwotICAgIHNlc3Npb24tPmNyZWF0ZWRNc2sgJj0gfigxPDxmeC0+cHJvY0lkKTsKKyAgICBzZXNzaW9uLT5jcmVhdGVkTXNrICY9IH4oMSA8PCBmeC0+cHJvY0lkKTsKICAgICBpZiAoc2Vzc2lvbi0+Y3JlYXRlZE1zayA9PSAwKSB7CiAgICAgICAgIGRlbGV0ZSBzZXNzaW9uLT5hcG07CiAgICAgICAgIHNlc3Npb24tPmFwbSA9IE5VTEw7Ci0gICAgICAgIGRlbGV0ZSBzZXNzaW9uLT5wcm9jRnJhbWU7Ci0gICAgICAgIHNlc3Npb24tPnByb2NGcmFtZSA9IE5VTEw7Ci0gICAgICAgIGRlbGV0ZSBzZXNzaW9uLT5yZXZGcmFtZTsKLSAgICAgICAgc2Vzc2lvbi0+cmV2RnJhbWUgPSBOVUxMOwotICAgICAgICBpZiAoc2Vzc2lvbi0+aW5SZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX2Rlc3Ryb3koc2Vzc2lvbi0+aW5SZXNhbXBsZXIpOwotICAgICAgICAgICAgc2Vzc2lvbi0+aW5SZXNhbXBsZXIgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZXNzaW9uLT5vdXRSZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX2Rlc3Ryb3koc2Vzc2lvbi0+b3V0UmVzYW1wbGVyKTsKLSAgICAgICAgICAgIHNlc3Npb24tPm91dFJlc2FtcGxlciA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlc3Npb24tPnJldlJlc2FtcGxlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfZGVzdHJveShzZXNzaW9uLT5yZXZSZXNhbXBsZXIpOwotICAgICAgICAgICAgc2Vzc2lvbi0+cmV2UmVzYW1wbGVyID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBkZWxldGUgc2Vzc2lvbi0+aW5CdWY7Ci0gICAgICAgIHNlc3Npb24tPmluQnVmID0gTlVMTDsKLSAgICAgICAgZGVsZXRlIHNlc3Npb24tPm91dEJ1ZjsKLSAgICAgICAgc2Vzc2lvbi0+b3V0QnVmID0gTlVMTDsKLSAgICAgICAgZGVsZXRlIHNlc3Npb24tPnJldkJ1ZjsKLSAgICAgICAgc2Vzc2lvbi0+cmV2QnVmID0gTlVMTDsKLQogICAgICAgICBzZXNzaW9uLT5pZCA9IDA7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAKLQotaW50IFNlc3Npb25fU2V0Q29uZmlnKHByZXByb2Nfc2Vzc2lvbl90ICpzZXNzaW9uLCBlZmZlY3RfY29uZmlnX3QgKmNvbmZpZykKLXsKK2ludCBTZXNzaW9uX1NldENvbmZpZyhwcmVwcm9jX3Nlc3Npb25fdCogc2Vzc2lvbiwgZWZmZWN0X2NvbmZpZ190KiBjb25maWcpIHsKICAgICB1aW50MzJfdCBpbkNubCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOwogICAgIHVpbnQzMl90IG91dENubCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzKTsKIApAQCAtOTQ0LDExMiArOTA2LDI3IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIEFMT0dWKCJTZXNzaW9uX1NldENvbmZpZyBzciAlZCBjbmwgJTA4eCIsCi0gICAgICAgICBjb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSwgY29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7Ci0gICAgaW50IHN0YXR1czsKLQotICAgIC8vIEFFQyBpbXBsZW1lbnRhdGlvbiBpcyBsaW1pdGVkIHRvIDE2a0h6Ci0gICAgaWYgKGNvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlID49IDMyMDAwICYmICEoc2Vzc2lvbi0+Y3JlYXRlZE1zayAmICgxIDw8IFBSRVBST0NfQUVDKSkpIHsKLSAgICAgICAgc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlID0gMzIwMDA7Ci0gICAgfSBlbHNlCi0gICAgaWYgKGNvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlID49IDE2MDAwKSB7Ci0gICAgICAgIHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSA9IDE2MDAwOwotICAgIH0gZWxzZSBpZiAoY29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPj0gODAwMCkgewotICAgICAgICBzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUgPSA4MDAwOwotICAgIH0KLQotICAgIGNvbnN0IHdlYnJ0Yzo6UHJvY2Vzc2luZ0NvbmZpZyBwcm9jZXNzaW5nX2NvbmZpZyA9IHsKLSAgICAgIHt7c3RhdGljX2Nhc3Q8aW50PihzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUpLCBpbkNubH0sCi0gICAgICAge3N0YXRpY19jYXN0PGludD4oc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlKSwgb3V0Q25sfSwKLSAgICAgICB7c3RhdGljX2Nhc3Q8aW50PihzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUpLCBpbkNubH0sCi0gICAgICAge3N0YXRpY19jYXN0PGludD4oc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlKSwgaW5Dbmx9fX07Ci0gICAgc3RhdHVzID0gc2Vzc2lvbi0+YXBtLT5Jbml0aWFsaXplKHByb2Nlc3NpbmdfY29uZmlnKTsKLSAgICBpZiAoc3RhdHVzIDwgMCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9CisgICAgQUxPR1YoIlNlc3Npb25fU2V0Q29uZmlnIHNyICVkIGNubCAlMDh4IiwgY29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUsCisgICAgICAgICAgY29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7CiAKICAgICBzZXNzaW9uLT5zYW1wbGluZ1JhdGUgPSBjb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZTsKLSAgICBzZXNzaW9uLT5hcG1GcmFtZUNvdW50ID0gc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlIC8gMTAwOwotICAgIGlmIChzZXNzaW9uLT5zYW1wbGluZ1JhdGUgPT0gc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlKSB7Ci0gICAgICAgIHNlc3Npb24tPmZyYW1lQ291bnQgPSBzZXNzaW9uLT5hcG1GcmFtZUNvdW50OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlc3Npb24tPmZyYW1lQ291bnQgPSAoc2Vzc2lvbi0+YXBtRnJhbWVDb3VudCAqIHNlc3Npb24tPnNhbXBsaW5nUmF0ZSkgLwotICAgICAgICAgICAgICAgIHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSAgKyAxOwotICAgIH0KKyAgICBzZXNzaW9uLT5mcmFtZUNvdW50ID0gc2Vzc2lvbi0+c2FtcGxpbmdSYXRlIC8gMTAwOwogICAgIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ID0gaW5Dbmw7CiAgICAgc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50ID0gb3V0Q25sOwotICAgIHNlc3Npb24tPnByb2NGcmFtZS0+bnVtX2NoYW5uZWxzXyA9IGluQ25sOwotICAgIHNlc3Npb24tPnByb2NGcmFtZS0+c2FtcGxlX3JhdGVfaHpfID0gc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlOworICAgIHNlc3Npb24tPmlucHV0Q29uZmlnLnNldF9zYW1wbGVfcmF0ZV9oeihzZXNzaW9uLT5zYW1wbGluZ1JhdGUpOworICAgIHNlc3Npb24tPmlucHV0Q29uZmlnLnNldF9udW1fY2hhbm5lbHMoaW5DbmwpOworICAgIHNlc3Npb24tPm91dHB1dENvbmZpZy5zZXRfc2FtcGxlX3JhdGVfaHooc2Vzc2lvbi0+c2FtcGxpbmdSYXRlKTsKKyAgICBzZXNzaW9uLT5vdXRwdXRDb25maWcuc2V0X251bV9jaGFubmVscyhpbkNubCk7CiAKICAgICBzZXNzaW9uLT5yZXZDaGFubmVsQ291bnQgPSBpbkNubDsKLSAgICBzZXNzaW9uLT5yZXZGcmFtZS0+bnVtX2NoYW5uZWxzXyA9IGluQ25sOwotICAgIHNlc3Npb24tPnJldkZyYW1lLT5zYW1wbGVfcmF0ZV9oel8gPSBzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGU7Ci0KLSAgICAvLyBmb3JjZSBwcm9jZXNzIGJ1ZmZlciByZWFsbG9jYXRpb24KLSAgICBzZXNzaW9uLT5pbkJ1ZlNpemUgPSAwOwotICAgIHNlc3Npb24tPm91dEJ1ZlNpemUgPSAwOwotICAgIHNlc3Npb24tPmZyYW1lc0luID0gMDsKLSAgICBzZXNzaW9uLT5mcmFtZXNPdXQgPSAwOwotCi0KLSAgICBpZiAoc2Vzc2lvbi0+aW5SZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICBzcGVleF9yZXNhbXBsZXJfZGVzdHJveShzZXNzaW9uLT5pblJlc2FtcGxlcik7Ci0gICAgICAgIHNlc3Npb24tPmluUmVzYW1wbGVyID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHNlc3Npb24tPm91dFJlc2FtcGxlciAhPSBOVUxMKSB7Ci0gICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9kZXN0cm95KHNlc3Npb24tPm91dFJlc2FtcGxlcik7Ci0gICAgICAgIHNlc3Npb24tPm91dFJlc2FtcGxlciA9IE5VTEw7Ci0gICAgfQotICAgIGlmIChzZXNzaW9uLT5yZXZSZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICBzcGVleF9yZXNhbXBsZXJfZGVzdHJveShzZXNzaW9uLT5yZXZSZXNhbXBsZXIpOwotICAgICAgICBzZXNzaW9uLT5yZXZSZXNhbXBsZXIgPSBOVUxMOwotICAgIH0KLSAgICBpZiAoc2Vzc2lvbi0+c2FtcGxpbmdSYXRlICE9IHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSkgewotICAgICAgICBpbnQgZXJyb3I7Ci0gICAgICAgIHNlc3Npb24tPmluUmVzYW1wbGVyID0gc3BlZXhfcmVzYW1wbGVyX2luaXQoc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+c2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNBTVBMRVJfUVVBTElUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOwotICAgICAgICBpZiAoc2Vzc2lvbi0+aW5SZXNhbXBsZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1coIlNlc3Npb25fU2V0Q29uZmlnIENhbm5vdCBjcmVhdGUgc3BlZXggcmVzYW1wbGVyOiAlcyIsCi0gICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9zdHJlcnJvcihlcnJvcikpOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi0+b3V0UmVzYW1wbGVyID0gc3BlZXhfcmVzYW1wbGVyX2luaXQoc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5zYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVTQU1QTEVSX1FVQUxJVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKLSAgICAgICAgaWYgKHNlc3Npb24tPm91dFJlc2FtcGxlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HVygiU2Vzc2lvbl9TZXRDb25maWcgQ2Fubm90IGNyZWF0ZSBzcGVleCByZXNhbXBsZXI6ICVzIiwKLSAgICAgICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX3N0cmVycm9yKGVycm9yKSk7Ci0gICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfZGVzdHJveShzZXNzaW9uLT5pblJlc2FtcGxlcik7Ci0gICAgICAgICAgICBzZXNzaW9uLT5pblJlc2FtcGxlciA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICBzZXNzaW9uLT5yZXZSZXNhbXBsZXIgPSBzcGVleF9yZXNhbXBsZXJfaW5pdChzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5zYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFU0FNUExFUl9RVUFMSVRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7Ci0gICAgICAgIGlmIChzZXNzaW9uLT5yZXZSZXNhbXBsZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1coIlNlc3Npb25fU2V0Q29uZmlnIENhbm5vdCBjcmVhdGUgc3BlZXggcmVzYW1wbGVyOiAlcyIsCi0gICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9zdHJlcnJvcihlcnJvcikpOwotICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX2Rlc3Ryb3koc2Vzc2lvbi0+aW5SZXNhbXBsZXIpOwotICAgICAgICAgICAgc2Vzc2lvbi0+aW5SZXNhbXBsZXIgPSBOVUxMOwotICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX2Rlc3Ryb3koc2Vzc2lvbi0+b3V0UmVzYW1wbGVyKTsKLSAgICAgICAgICAgIHNlc3Npb24tPm91dFJlc2FtcGxlciA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgIH0KKyAgICBzZXNzaW9uLT5yZXZDb25maWcuc2V0X3NhbXBsZV9yYXRlX2h6KHNlc3Npb24tPnNhbXBsaW5nUmF0ZSk7CisgICAgc2Vzc2lvbi0+cmV2Q29uZmlnLnNldF9udW1fY2hhbm5lbHMoaW5DbmwpOwogCiAgICAgc2Vzc2lvbi0+c3RhdGUgPSBQUkVQUk9DX1NFU1NJT05fU1RBVEVfQ09ORklHOwogICAgIHJldHVybiAwOwogfQogCi12b2lkIFNlc3Npb25fR2V0Q29uZmlnKHByZXByb2Nfc2Vzc2lvbl90ICpzZXNzaW9uLCBlZmZlY3RfY29uZmlnX3QgKmNvbmZpZykKLXsKK3ZvaWQgU2Vzc2lvbl9HZXRDb25maWcocHJlcHJvY19zZXNzaW9uX3QqIHNlc3Npb24sIGVmZmVjdF9jb25maWdfdCogY29uZmlnKSB7CiAgICAgbWVtc2V0KGNvbmZpZywgMCwgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkpOwogICAgIGNvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gY29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gc2Vzc2lvbi0+c2FtcGxpbmdSYXRlOwogICAgIGNvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID0gY29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CkBAIC0xMDYwLDQ2ICs5MzcsMzAgQEAKICAgICAgICAgICAgIChFRkZFQ1RfQ09ORklHX1NNUF9SQVRFIHwgRUZGRUNUX0NPTkZJR19DSEFOTkVMUyB8IEVGRkVDVF9DT05GSUdfRk9STUFUKTsKIH0KIAotaW50IFNlc3Npb25fU2V0UmV2ZXJzZUNvbmZpZyhwcmVwcm9jX3Nlc3Npb25fdCAqc2Vzc2lvbiwgZWZmZWN0X2NvbmZpZ190ICpjb25maWcpCi17CitpbnQgU2Vzc2lvbl9TZXRSZXZlcnNlQ29uZmlnKHByZXByb2Nfc2Vzc2lvbl90KiBzZXNzaW9uLCBlZmZlY3RfY29uZmlnX3QqIGNvbmZpZykgewogICAgIGlmIChjb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSAhPSBjb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUgfHwKLSAgICAgICAgICAgIGNvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IGNvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCB8fAotICAgICAgICAgICAgY29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKKyAgICAgICAgY29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gY29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0IHx8CisgICAgICAgIGNvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIEFMT0dWKCJTZXNzaW9uX1NldFJldmVyc2VDb25maWcgc3IgJWQgY25sICUwOHgiLAotICAgICAgICAgY29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUsIGNvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOworICAgIEFMT0dWKCJTZXNzaW9uX1NldFJldmVyc2VDb25maWcgc3IgJWQgY25sICUwOHgiLCBjb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICBjb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKIAogICAgIGlmIChzZXNzaW9uLT5zdGF0ZSA8IFBSRVBST0NfU0VTU0lPTl9TVEFURV9DT05GSUcpIHsKICAgICAgICAgcmV0dXJuIC1FTk9TWVM7CiAgICAgfQogICAgIGlmIChjb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSAhPSBzZXNzaW9uLT5zYW1wbGluZ1JhdGUgfHwKLSAgICAgICAgICAgIGNvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CisgICAgICAgIGNvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KICAgICB1aW50MzJfdCBpbkNubCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKLSAgICBjb25zdCB3ZWJydGM6OlByb2Nlc3NpbmdDb25maWcgcHJvY2Vzc2luZ19jb25maWcgPSB7Ci0gICAgICAge3tzdGF0aWNfY2FzdDxpbnQ+KHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSksIHNlc3Npb24tPmluQ2hhbm5lbENvdW50fSwKLSAgICAgICAge3N0YXRpY19jYXN0PGludD4oc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlKSwgc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50fSwKLSAgICAgICAge3N0YXRpY19jYXN0PGludD4oc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlKSwgaW5Dbmx9LAotICAgICAgICB7c3RhdGljX2Nhc3Q8aW50PihzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUpLCBpbkNubH19fTsKLSAgICBpbnQgc3RhdHVzID0gc2Vzc2lvbi0+YXBtLT5Jbml0aWFsaXplKHByb2Nlc3NpbmdfY29uZmlnKTsKLSAgICBpZiAoc3RhdHVzIDwgMCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9CiAgICAgc2Vzc2lvbi0+cmV2Q2hhbm5lbENvdW50ID0gaW5Dbmw7Ci0gICAgc2Vzc2lvbi0+cmV2RnJhbWUtPm51bV9jaGFubmVsc18gPSBpbkNubDsKLSAgICBzZXNzaW9uLT5yZXZGcmFtZS0+c2FtcGxlX3JhdGVfaHpfID0gc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlOwotICAgIC8vIGZvcmNlIHByb2Nlc3MgYnVmZmVyIHJlYWxsb2NhdGlvbgotICAgIHNlc3Npb24tPnJldkJ1ZlNpemUgPSAwOwotICAgIHNlc3Npb24tPmZyYW1lc1JldiA9IDA7CiAKICAgICByZXR1cm4gMDsKIH0KIAotdm9pZCBTZXNzaW9uX0dldFJldmVyc2VDb25maWcocHJlcHJvY19zZXNzaW9uX3QgKnNlc3Npb24sIGVmZmVjdF9jb25maWdfdCAqY29uZmlnKQotewordm9pZCBTZXNzaW9uX0dldFJldmVyc2VDb25maWcocHJlcHJvY19zZXNzaW9uX3QqIHNlc3Npb24sIGVmZmVjdF9jb25maWdfdCogY29uZmlnKSB7CiAgICAgbWVtc2V0KGNvbmZpZywgMCwgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkpOwogICAgIGNvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gY29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gc2Vzc2lvbi0+c2FtcGxpbmdSYXRlOwogICAgIGNvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID0gY29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CkBAIC0xMTA5LDI1ICs5NzAsMTAgQEAKICAgICAgICAgICAgIChFRkZFQ1RfQ09ORklHX1NNUF9SQVRFIHwgRUZGRUNUX0NPTkZJR19DSEFOTkVMUyB8IEVGRkVDVF9DT05GSUdfRk9STUFUKTsKIH0KIAotdm9pZCBTZXNzaW9uX1NldFByb2NFbmFibGVkKHByZXByb2Nfc2Vzc2lvbl90ICpzZXNzaW9uLCB1aW50MzJfdCBwcm9jSWQsIGJvb2wgZW5hYmxlZCkKLXsKK3ZvaWQgU2Vzc2lvbl9TZXRQcm9jRW5hYmxlZChwcmVwcm9jX3Nlc3Npb25fdCogc2Vzc2lvbiwgdWludDMyX3QgcHJvY0lkLCBib29sIGVuYWJsZWQpIHsKICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICBpZihzZXNzaW9uLT5lbmFibGVkTXNrID09IDApIHsKLSAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc0luID0gMDsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uLT5pblJlc2FtcGxlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX3Jlc2V0X21lbShzZXNzaW9uLT5pblJlc2FtcGxlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNPdXQgPSAwOwotICAgICAgICAgICAgaWYgKHNlc3Npb24tPm91dFJlc2FtcGxlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX3Jlc2V0X21lbShzZXNzaW9uLT5vdXRSZXNhbXBsZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9CiAgICAgICAgIHNlc3Npb24tPmVuYWJsZWRNc2sgfD0gKDEgPDwgcHJvY0lkKTsKICAgICAgICAgaWYgKEhhc1JldmVyc2VTdHJlYW0ocHJvY0lkKSkgewotICAgICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzUmV2ID0gMDsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uLT5yZXZSZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9yZXNldF9tZW0oc2Vzc2lvbi0+cmV2UmVzYW1wbGVyKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNlc3Npb24tPnJldkVuYWJsZWRNc2sgfD0gKDEgPDwgcHJvY0lkKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC0xMTM2LDggKzk4Miw4IEBACiAgICAgICAgICAgICBzZXNzaW9uLT5yZXZFbmFibGVkTXNrICY9IH4oMSA8PCBwcm9jSWQpOwogICAgICAgICB9CiAgICAgfQotICAgIEFMT0dWKCJTZXNzaW9uX1NldFByb2NFbmFibGVkIHByb2MgJWQsIGVuYWJsZWQgJWQgZW5hYmxlZE1zayAlMDh4IHJldkVuYWJsZWRNc2sgJTA4eCIsCi0gICAgICAgICBwcm9jSWQsIGVuYWJsZWQsIHNlc3Npb24tPmVuYWJsZWRNc2ssIHNlc3Npb24tPnJldkVuYWJsZWRNc2spOworICAgIEFMT0dWKCJTZXNzaW9uX1NldFByb2NFbmFibGVkIHByb2MgJWQsIGVuYWJsZWQgJWQgZW5hYmxlZE1zayAlMDh4IHJldkVuYWJsZWRNc2sgJTA4eCIsIHByb2NJZCwKKyAgICAgICAgICBlbmFibGVkLCBzZXNzaW9uLT5lbmFibGVkTXNrLCBzZXNzaW9uLT5yZXZFbmFibGVkTXNrKTsKICAgICBzZXNzaW9uLT5wcm9jZXNzZWRNc2sgPSAwOwogICAgIGlmIChIYXNSZXZlcnNlU3RyZWFtKHByb2NJZCkpIHsKICAgICAgICAgc2Vzc2lvbi0+cmV2UHJvY2Vzc2VkTXNrID0gMDsKQEAgLTExNTEsOCArOTk3LDcgQEAKIHN0YXRpYyBpbnQgc0luaXRTdGF0dXMgPSAxOwogc3RhdGljIHByZXByb2Nfc2Vzc2lvbl90IHNTZXNzaW9uc1tQUkVQUk9DX05VTV9TRVNTSU9OU107CiAKLXByZXByb2Nfc2Vzc2lvbl90ICpQcmVQcm9jX0dldFNlc3Npb24oaW50MzJfdCBwcm9jSWQsIGludDMyX3QgIHNlc3Npb25JZCwgaW50MzJfdCAgaW9JZCkKLXsKK3ByZXByb2Nfc2Vzc2lvbl90KiBQcmVQcm9jX0dldFNlc3Npb24oaW50MzJfdCBwcm9jSWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQpIHsKICAgICBzaXplX3QgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgUFJFUFJPQ19OVU1fU0VTU0lPTlM7IGkrKykgewogICAgICAgICBpZiAoc1Nlc3Npb25zW2ldLmlkID09IHNlc3Npb25JZCkgewpAQCAtMTE3Miw3ICsxMDE3LDYgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotCiBpbnQgUHJlUHJvY19Jbml0KCkgewogICAgIHNpemVfdCBpOwogICAgIGludCBzdGF0dXMgPSAwOwpAQCAtMTE4Nyw4ICsxMDMxLDcgQEAKICAgICByZXR1cm4gc0luaXRTdGF0dXM7CiB9CiAKLWNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKlByZVByb2NfR2V0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkKQoteworY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCogUHJlUHJvY19HZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QqIHV1aWQpIHsKICAgICBzaXplX3QgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgUFJFUFJPQ19OVU1fRUZGRUNUUzsgaSsrKSB7CiAgICAgICAgIGlmIChtZW1jbXAoJnNEZXNjcmlwdG9yc1tpXS0+dXVpZCwgdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CkBAIC0xMTk4LDIzNCArMTA0MSw4NiBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi0KIGV4dGVybiAiQyIgewogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgUHJlUHJvY2Vzc2luZ0Z4X1Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90ICAgICBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICAgICppbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAgICAqb3V0QnVmZmVyKQotewotICAgIHByZXByb2NfZWZmZWN0X3QgKiBlZmZlY3QgPSAocHJlcHJvY19lZmZlY3RfdCAqKXNlbGY7CitpbnQgUHJlUHJvY2Vzc2luZ0Z4X1Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90IHNlbGYsIGF1ZGlvX2J1ZmZlcl90KiBpbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCogb3V0QnVmZmVyKSB7CisgICAgcHJlcHJvY19lZmZlY3RfdCogZWZmZWN0ID0gKHByZXByb2NfZWZmZWN0X3QqKXNlbGY7CiAKLSAgICBpZiAoZWZmZWN0ID09IE5VTEwpeworICAgIGlmIChlZmZlY3QgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X1Byb2Nlc3MoKSBFUlJPUiBlZmZlY3QgPT0gTlVMTCIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9Ci0gICAgcHJlcHJvY19zZXNzaW9uX3QgKiBzZXNzaW9uID0gKHByZXByb2Nfc2Vzc2lvbl90ICopZWZmZWN0LT5zZXNzaW9uOworICAgIHByZXByb2Nfc2Vzc2lvbl90KiBzZXNzaW9uID0gKHByZXByb2Nfc2Vzc2lvbl90KillZmZlY3QtPnNlc3Npb247CiAKLSAgICBpZiAoaW5CdWZmZXIgPT0gTlVMTCAgfHwgaW5CdWZmZXItPnJhdyA9PSBOVUxMICB8fAotICAgICAgICAgICAgb3V0QnVmZmVyID09IE5VTEwgfHwgb3V0QnVmZmVyLT5yYXcgPT0gTlVMTCl7CisgICAgaWYgKGluQnVmZmVyID09IE5VTEwgfHwgaW5CdWZmZXItPnJhdyA9PSBOVUxMIHx8IG91dEJ1ZmZlciA9PSBOVUxMIHx8IG91dEJ1ZmZlci0+cmF3ID09IE5VTEwpIHsKICAgICAgICAgQUxPR1coIlByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzKCkgRVJST1IgYmFkIHBvaW50ZXIiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgc2Vzc2lvbi0+cHJvY2Vzc2VkTXNrIHw9ICgxPDxlZmZlY3QtPnByb2NJZCk7CisgICAgaWYgKGluQnVmZmVyLT5mcmFtZUNvdW50ICE9IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCkgeworICAgICAgICBBTE9HVygiaW5CdWZmZXItPmZyYW1lQ291bnQgJXp1IGlzIG5vdCBlcXVhbCB0byBvdXRCdWZmZXItPmZyYW1lQ291bnQgJXp1IiwKKyAgICAgICAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQsIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KIAotLy8gICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzIEluICVkIGZyYW1lcyBlbmFibGVkTXNrICUwOHggcHJvY2Vzc2VkTXNrICUwOHgiLAotLy8gICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCwgc2Vzc2lvbi0+ZW5hYmxlZE1zaywgc2Vzc2lvbi0+cHJvY2Vzc2VkTXNrKTsKKyAgICBpZiAoaW5CdWZmZXItPmZyYW1lQ291bnQgIT0gc2Vzc2lvbi0+ZnJhbWVDb3VudCkgeworICAgICAgICBBTE9HVygiaW5CdWZmZXItPmZyYW1lQ291bnQgJXp1ICE9ICV6dSByZXByZXNlbnRpbmcgMTBtcyBhdCBzYW1wbGluZyByYXRlICVkIiwKKyAgICAgICAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQsIHNlc3Npb24tPmZyYW1lQ291bnQsIHNlc3Npb24tPnNhbXBsaW5nUmF0ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KIAorICAgIHNlc3Npb24tPnByb2Nlc3NlZE1zayB8PSAoMSA8PCBlZmZlY3QtPnByb2NJZCk7CisKKyAgICAvLyAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X1Byb2Nlc3MgSW4gJWQgZnJhbWVzIGVuYWJsZWRNc2sgJTA4eCBwcm9jZXNzZWRNc2sgJTA4eCIsCisgICAgLy8gICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCwgc2Vzc2lvbi0+ZW5hYmxlZE1zaywgc2Vzc2lvbi0+cHJvY2Vzc2VkTXNrKTsKICAgICBpZiAoKHNlc3Npb24tPnByb2Nlc3NlZE1zayAmIHNlc3Npb24tPmVuYWJsZWRNc2spID09IHNlc3Npb24tPmVuYWJsZWRNc2spIHsKICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5wcm9jZXNzZWRNc2sgPSAwOwotICAgICAgICBzaXplX3QgZnJhbWVzUnEgPSBvdXRCdWZmZXItPmZyYW1lQ291bnQ7Ci0gICAgICAgIHNpemVfdCBmcmFtZXNXciA9IDA7Ci0gICAgICAgIGlmIChzZXNzaW9uLT5mcmFtZXNPdXQpIHsKLSAgICAgICAgICAgIHNpemVfdCBmciA9IHNlc3Npb24tPmZyYW1lc091dDsKLSAgICAgICAgICAgIGlmIChvdXRCdWZmZXItPmZyYW1lQ291bnQgPCBmcikgewotICAgICAgICAgICAgICAgIGZyID0gb3V0QnVmZmVyLT5mcmFtZUNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+czE2LAotICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+b3V0QnVmLAotICAgICAgICAgICAgICAgICAgZnIgKiBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOwotICAgICAgICAgICAgbWVtY3B5KHNlc3Npb24tPm91dEJ1ZiwKLSAgICAgICAgICAgICAgICAgIHNlc3Npb24tPm91dEJ1ZiArIGZyICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgKHNlc3Npb24tPmZyYW1lc091dCAtIGZyKSAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNPdXQgLT0gZnI7Ci0gICAgICAgICAgICBmcmFtZXNXciArPSBmcjsKKyAgICAgICAgaWYgKGludCBzdGF0dXMgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+UHJvY2Vzc1N0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QqIGNvbnN0KWluQnVmZmVyLT5zMTYsCisgICAgICAgICAgICAgICAgICAgIChjb25zdCB3ZWJydGM6OlN0cmVhbUNvbmZpZyllZmZlY3QtPnNlc3Npb24tPmlucHV0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAoY29uc3Qgd2VicnRjOjpTdHJlYW1Db25maWcpZWZmZWN0LT5zZXNzaW9uLT5vdXRwdXRDb25maWcsCisgICAgICAgICAgICAgICAgICAgIChpbnQxNl90KiBjb25zdClvdXRCdWZmZXItPnMxNik7CisgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIlByb2Nlc3MgU3RyZWFtIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQotICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQgPSBmcmFtZXNXcjsKLSAgICAgICAgaWYgKGZyYW1lc1dyID09IGZyYW1lc1JxKSB7Ci0gICAgICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZXNzaW9uLT5pblJlc2FtcGxlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzaXplX3QgZnIgPSBzZXNzaW9uLT5mcmFtZUNvdW50IC0gc2Vzc2lvbi0+ZnJhbWVzSW47Ci0gICAgICAgICAgICBpZiAoaW5CdWZmZXItPmZyYW1lQ291bnQgPCBmcikgewotICAgICAgICAgICAgICAgIGZyID0gaW5CdWZmZXItPmZyYW1lQ291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbi0+aW5CdWZTaXplIDwgc2Vzc2lvbi0+ZnJhbWVzSW4gKyBmcikgewotICAgICAgICAgICAgICAgIGludDE2X3QgKmJ1ZjsKLSAgICAgICAgICAgICAgICBzZXNzaW9uLT5pbkJ1ZlNpemUgPSBzZXNzaW9uLT5mcmFtZXNJbiArIGZyOwotICAgICAgICAgICAgICAgIGJ1ZiA9IChpbnQxNl90ICopcmVhbGxvYyhzZXNzaW9uLT5pbkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmluQnVmU2l6ZSAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICAgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzSW4gPSAwOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHNlc3Npb24tPmluQnVmKTsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+aW5CdWYgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi0+aW5CdWYgPSBidWY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZW1jcHkoc2Vzc2lvbi0+aW5CdWYgKyBzZXNzaW9uLT5mcmFtZXNJbiAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLT5zMTYsCi0gICAgICAgICAgICAgICAgICAgZnIgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7Ci0jaWZkZWYgRFVBTF9NSUNfVEVTVAotICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnUGNtRHVtcExvY2spOwotICAgICAgICAgICAgaWYgKGdQY21EdW1wRmggIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZ3cml0ZShpbkJ1ZmZlci0+cmF3LAotICAgICAgICAgICAgICAgICAgICAgICBmciAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpLCAxLCBnUGNtRHVtcEZoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnUGNtRHVtcExvY2spOwotI2VuZGlmCi0KLSAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc0luICs9IGZyOwotICAgICAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgPSBmcjsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uLT5mcmFtZXNJbiA8IHNlc3Npb24tPmZyYW1lQ291bnQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNweF91aW50MzJfdCBmckluID0gc2Vzc2lvbi0+ZnJhbWVzSW47Ci0gICAgICAgICAgICBzcHhfdWludDMyX3QgZnJPdXQgPSBzZXNzaW9uLT5hcG1GcmFtZUNvdW50OwotICAgICAgICAgICAgaWYgKHNlc3Npb24tPmluQ2hhbm5lbENvdW50ID09IDEpIHsKLSAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfcHJvY2Vzc19pbnQoc2Vzc2lvbi0+aW5SZXNhbXBsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmluQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cHJvY0ZyYW1lLT5kYXRhXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyT3V0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX3Byb2Nlc3NfaW50ZXJsZWF2ZWRfaW50KHNlc3Npb24tPmluUmVzYW1wbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5pbkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnByb2NGcmFtZS0+ZGF0YV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmck91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZW1jcHkoc2Vzc2lvbi0+aW5CdWYsCi0gICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+aW5CdWYgKyBmckluICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgKHNlc3Npb24tPmZyYW1lc0luIC0gZnJJbikgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNJbiAtPSBmckluOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2l6ZV90IGZyID0gc2Vzc2lvbi0+ZnJhbWVDb3VudCAtIHNlc3Npb24tPmZyYW1lc0luOwotICAgICAgICAgICAgaWYgKGluQnVmZmVyLT5mcmFtZUNvdW50IDwgZnIpIHsKLSAgICAgICAgICAgICAgICBmciA9IGluQnVmZmVyLT5mcmFtZUNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KHNlc3Npb24tPnByb2NGcmFtZS0+ZGF0YV8gKyBzZXNzaW9uLT5mcmFtZXNJbiAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLT5zMTYsCi0gICAgICAgICAgICAgICAgICAgZnIgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7Ci0KLSNpZmRlZiBEVUFMX01JQ19URVNUCi0gICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmdQY21EdW1wTG9jayk7Ci0gICAgICAgICAgICBpZiAoZ1BjbUR1bXBGaCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZndyaXRlKGluQnVmZmVyLT5yYXcsCi0gICAgICAgICAgICAgICAgICAgICAgIGZyICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCksIDEsIGdQY21EdW1wRmgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdQY21EdW1wTG9jayk7Ci0jZW5kaWYKLQotICAgICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzSW4gKz0gZnI7Ci0gICAgICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCA9IGZyOwotICAgICAgICAgICAgaWYgKHNlc3Npb24tPmZyYW1lc0luIDwgc2Vzc2lvbi0+ZnJhbWVDb3VudCkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzSW4gPSAwOwotICAgICAgICB9Ci0gICAgICAgIHNlc3Npb24tPnByb2NGcmFtZS0+c2FtcGxlc19wZXJfY2hhbm5lbF8gPSBzZXNzaW9uLT5hcG1GcmFtZUNvdW50OwotCi0gICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5Qcm9jZXNzU3RyZWFtKHNlc3Npb24tPnByb2NGcmFtZSk7Ci0KLSAgICAgICAgaWYgKHNlc3Npb24tPm91dEJ1ZlNpemUgPCBzZXNzaW9uLT5mcmFtZXNPdXQgKyBzZXNzaW9uLT5mcmFtZUNvdW50KSB7Ci0gICAgICAgICAgICBpbnQxNl90ICpidWY7Ci0gICAgICAgICAgICBzZXNzaW9uLT5vdXRCdWZTaXplID0gc2Vzc2lvbi0+ZnJhbWVzT3V0ICsgc2Vzc2lvbi0+ZnJhbWVDb3VudDsKLSAgICAgICAgICAgIGJ1ZiA9IChpbnQxNl90ICopcmVhbGxvYyhzZXNzaW9uLT5vdXRCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPm91dEJ1ZlNpemUgKiBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOwotICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzT3V0ID0gMDsKLSAgICAgICAgICAgICAgICBmcmVlKHNlc3Npb24tPm91dEJ1Zik7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi0+b3V0QnVmID0gTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24tPm91dEJ1ZiA9IGJ1ZjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZXNzaW9uLT5vdXRSZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgc3B4X3VpbnQzMl90IGZySW4gPSBzZXNzaW9uLT5hcG1GcmFtZUNvdW50OwotICAgICAgICAgICAgc3B4X3VpbnQzMl90IGZyT3V0ID0gc2Vzc2lvbi0+ZnJhbWVDb3VudDsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX3Byb2Nlc3NfaW50KHNlc3Npb24tPm91dFJlc2FtcGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5wcm9jRnJhbWUtPmRhdGFfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5vdXRCdWYgKyBzZXNzaW9uLT5mcmFtZXNPdXQgKiBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJPdXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfcHJvY2Vzc19pbnRlcmxlYXZlZF9pbnQoc2Vzc2lvbi0+b3V0UmVzYW1wbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cHJvY0ZyYW1lLT5kYXRhXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+b3V0QnVmICsgc2Vzc2lvbi0+ZnJhbWVzT3V0ICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyT3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc091dCArPSBmck91dDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1lbWNweShzZXNzaW9uLT5vdXRCdWYgKyBzZXNzaW9uLT5mcmFtZXNPdXQgKiBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cHJvY0ZyYW1lLT5kYXRhXywKLSAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5mcmFtZUNvdW50ICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc091dCArPSBzZXNzaW9uLT5mcmFtZUNvdW50OwotICAgICAgICB9Ci0gICAgICAgIHNpemVfdCBmciA9IHNlc3Npb24tPmZyYW1lc091dDsKLSAgICAgICAgaWYgKGZyYW1lc1JxIC0gZnJhbWVzV3IgPCBmcikgewotICAgICAgICAgICAgZnIgPSBmcmFtZXNScSAtIGZyYW1lc1dyOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweShvdXRCdWZmZXItPnMxNiArIGZyYW1lc1dyICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50LAotICAgICAgICAgICAgICBzZXNzaW9uLT5vdXRCdWYsCi0gICAgICAgICAgICAgIGZyICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICAgICAgbWVtY3B5KHNlc3Npb24tPm91dEJ1ZiwKLSAgICAgICAgICAgICAgc2Vzc2lvbi0+b3V0QnVmICsgZnIgKiBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgIChzZXNzaW9uLT5mcmFtZXNPdXQgLSBmcikgKiBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOwotICAgICAgICBzZXNzaW9uLT5mcmFtZXNPdXQgLT0gZnI7Ci0gICAgICAgIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCArPSBmcjsKLQogICAgICAgICByZXR1cm4gMDsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gLUVOT0RBVEE7CiAgICAgfQogfQogCi1pbnQgUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQoZWZmZWN0X2hhbmRsZV90ICBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgY21kQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIGNtZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAqcENtZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAqcmVwbHlTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgKnBSZXBseURhdGEpCi17Ci0gICAgcHJlcHJvY19lZmZlY3RfdCAqIGVmZmVjdCA9IChwcmVwcm9jX2VmZmVjdF90ICopIHNlbGY7CitpbnQgUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQoZWZmZWN0X2hhbmRsZV90IHNlbGYsIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcENtZERhdGEsIHVpbnQzMl90KiByZXBseVNpemUsIHZvaWQqIHBSZXBseURhdGEpIHsKKyAgICBwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QgPSAocHJlcHJvY19lZmZlY3RfdCopc2VsZjsKIAotICAgIGlmIChlZmZlY3QgPT0gTlVMTCl7CisgICAgaWYgKGVmZmVjdCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kOiBjb21tYW5kICVkIGNtZFNpemUgJWQiLGNtZENvZGUsIGNtZFNpemUpOworICAgIC8vIEFMT0dWKCJQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZDogY29tbWFuZCAlZCBjbWRTaXplICVkIixjbWRDb2RlLCBjbWRTaXplKTsKIAotICAgIHN3aXRjaCAoY21kQ29kZSl7CisgICAgc3dpdGNoIChjbWRDb2RlKSB7CiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9JTklUOgotICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKXsKKyAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgewogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGVmZmVjdC0+b3BzLT5pbml0KSB7CiAgICAgICAgICAgICAgICAgZWZmZWN0LT5vcHMtPmluaXQoZWZmZWN0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IDA7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0NPTkZJRzogewotICAgICAgICAgICAgaWYgKHBDbWREYXRhICAgID09IE5VTEx8fAotICAgICAgICAgICAgICAgIGNtZFNpemUgICAgICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpfHwKLSAgICAgICAgICAgICAgICBwUmVwbHlEYXRhICA9PSBOVUxMfHwKLSAgICAgICAgICAgICAgICAqcmVwbHlTaXplICAhPSBzaXplb2YoaW50KSl7CisgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfQ09ORklHOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9DT05GSUc6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAjaWZkZWYgRFVBTF9NSUNfVEVTVApAQCAtMTQzNiw1NSArMTEzMSw1MSBAQAogICAgICAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+ZW5hYmxlZE1zayA9IDA7CiAgICAgICAgICAgICB9CiAjZW5kaWYKLSAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IFNlc3Npb25fU2V0Q29uZmlnKGVmZmVjdC0+c2Vzc2lvbiwgKGVmZmVjdF9jb25maWdfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0gU2Vzc2lvbl9TZXRDb25maWcoZWZmZWN0LT5zZXNzaW9uLCAoZWZmZWN0X2NvbmZpZ190KilwQ21kRGF0YSk7CiAjaWZkZWYgRFVBTF9NSUNfVEVTVAogICAgICAgICAgICAgaWYgKGdEdWFsTWljRW5hYmxlZCkgewogICAgICAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+ZW5hYmxlZE1zayA9IGVuYWJsZWRNc2s7CiAgICAgICAgICAgICB9CiAjZW5kaWYKLSAgICAgICAgICAgIGlmICgqKGludCAqKXBSZXBseURhdGEgIT0gMCkgeworICAgICAgICAgICAgaWYgKCooaW50KilwUmVwbHlEYXRhICE9IDApIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChlZmZlY3QtPnN0YXRlICE9IFBSRVBST0NfRUZGRUNUX1NUQVRFX0FDVElWRSkgewotICAgICAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IEVmZmVjdF9TZXRTdGF0ZShlZmZlY3QsIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NPTkZJRyk7CisgICAgICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSBFZmZlY3RfU2V0U3RhdGUoZWZmZWN0LCBQUkVQUk9DX0VGRkVDVF9TVEFURV9DT05GSUcpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIEVGRkVDVF9DTURfR0VUX0NPTkZJRzoKLSAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwKLSAgICAgICAgICAgICAgICAqcmVwbHlTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpKSB7CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9DT05GSUc6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX0NPTkZJRzogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgU2Vzc2lvbl9HZXRDb25maWcoZWZmZWN0LT5zZXNzaW9uLCAoZWZmZWN0X2NvbmZpZ190ICopcFJlcGx5RGF0YSk7CisgICAgICAgICAgICBTZXNzaW9uX0dldENvbmZpZyhlZmZlY3QtPnNlc3Npb24sIChlZmZlY3RfY29uZmlnX3QqKXBSZXBseURhdGEpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRToKLSAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fAotICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwKICAgICAgICAgICAgICAgICAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX0NPTkZJR19SRVZFUlNFOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRTogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IFNlc3Npb25fU2V0UmV2ZXJzZUNvbmZpZyhlZmZlY3QtPnNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVmZmVjdF9jb25maWdfdCAqKXBDbWREYXRhKTsKLSAgICAgICAgICAgIGlmICgqKGludCAqKXBSZXBseURhdGEgIT0gMCkgeworICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPQorICAgICAgICAgICAgICAgICAgICBTZXNzaW9uX1NldFJldmVyc2VDb25maWcoZWZmZWN0LT5zZXNzaW9uLCAoZWZmZWN0X2NvbmZpZ190KilwQ21kRGF0YSk7CisgICAgICAgICAgICBpZiAoKihpbnQqKXBSZXBseURhdGEgIT0gMCkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0dFVF9DT05GSUdfUkVWRVJTRToKLSAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwKLSAgICAgICAgICAgICAgICAqcmVwbHlTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpKXsKKyAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9DT05GSUdfUkVWRVJTRTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0U6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXNzaW9uX0dldFJldmVyc2VDb25maWcoZWZmZWN0LT5zZXNzaW9uLCAoZWZmZWN0X2NvbmZpZ190ICopcENtZERhdGEpOworICAgICAgICAgICAgU2Vzc2lvbl9HZXRSZXZlcnNlQ29uZmlnKGVmZmVjdC0+c2Vzc2lvbiwgKGVmZmVjdF9jb25maWdfdCopcENtZERhdGEpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1JFU0VUOgpAQCAtMTQ5NCw4MCArMTE4NSw3NCBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0dFVF9QQVJBTTogewotICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YTsKKyAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90KiBwID0gKGVmZmVjdF9wYXJhbV90KilwQ21kRGF0YTsKIAogICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSkpeworICAgICAgICAgICAgICAgIGNtZFNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKSB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9HRVRfUEFSQU06IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgcENtZERhdGEsIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSk7CiAKLSAgICAgICAgICAgIHAgPSAoZWZmZWN0X3BhcmFtX3QgKilwUmVwbHlEYXRhOworICAgICAgICAgICAgcCA9IChlZmZlY3RfcGFyYW1fdCopcFJlcGx5RGF0YTsKIAogICAgICAgICAgICAgaW50IHZvZmZzZXQgPSAoKHAtPnBzaXplIC0gMSkgLyBzaXplb2YoaW50MzJfdCkgKyAxKSAqIHNpemVvZihpbnQzMl90KTsKIAogICAgICAgICAgICAgaWYgKGVmZmVjdC0+b3BzLT5nZXRfcGFyYW1ldGVyKSB7Ci0gICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gZWZmZWN0LT5vcHMtPmdldF9wYXJhbWV0ZXIoZWZmZWN0LCBwLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CisgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdC0+b3BzLT5nZXRfcGFyYW1ldGVyKGVmZmVjdCwgcC0+ZGF0YSwgJnAtPnZzaXplLCBwLT5kYXRhICsgdm9mZnNldCk7CiAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0ICsgcC0+dnNpemU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gYnJlYWs7CiAKLSAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9QQVJBTTp7Ci0gICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTHx8Ci0gICAgICAgICAgICAgICAgICAgIGNtZFNpemUgPCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSl7CisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfUEFSQU06IHsKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgIHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopIHBDbWREYXRhOworICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QqIHAgPSAoZWZmZWN0X3BhcmFtX3QqKXBDbWREYXRhOwogCi0gICAgICAgICAgICBpZiAocC0+cHNpemUgIT0gc2l6ZW9mKGludDMyX3QpKXsKKyAgICAgICAgICAgIGlmIChwLT5wc2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SLCBwc2l6ZSBpcyBub3Qgc2l6ZW9mKGludDMyX3QpIik7CisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiwgcHNpemUgaXMgbm90IHNpemVvZihpbnQzMl90KSIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGVmZmVjdC0+b3BzLT5zZXRfcGFyYW1ldGVyKSB7Ci0gICAgICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gZWZmZWN0LT5vcHMtPnNldF9wYXJhbWV0ZXIoZWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgcC0+cHNpemUpOworICAgICAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdC0+b3BzLT5zZXRfcGFyYW1ldGVyKGVmZmVjdCwgKHZvaWQqKXAtPmRhdGEsIHAtPmRhdGEgKyBwLT5wc2l6ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0VOQUJMRToKLSAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSl7CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0VOQUJMRTogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IEVmZmVjdF9TZXRTdGF0ZShlZmZlY3QsIFBSRVBST0NfRUZGRUNUX1NUQVRFX0FDVElWRSk7CisgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IEVmZmVjdF9TZXRTdGF0ZShlZmZlY3QsIFBSRVBST0NfRUZGRUNUX1NUQVRFX0FDVElWRSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEVGRkVDVF9DTURfRElTQUJMRToKLSAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSl7CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0RJU0FCTEU6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgID0gRWZmZWN0X1NldFN0YXRlKGVmZmVjdCwgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ09ORklHKTsKKyAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0gRWZmZWN0X1NldFN0YXRlKGVmZmVjdCwgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ09ORklHKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfREVWSUNFOgogICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0lOUFVUX0RFVklDRToKLSAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgY21kU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKSB7CisgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZih1aW50MzJfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0U6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChlZmZlY3QtPm9wcy0+c2V0X2RldmljZSkgewotICAgICAgICAgICAgICAgIGVmZmVjdC0+b3BzLT5zZXRfZGV2aWNlKGVmZmVjdCwgKih1aW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICBlZmZlY3QtPm9wcy0+c2V0X2RldmljZShlZmZlY3QsICoodWludDMyX3QqKXBDbWREYXRhKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogCkBAIC0xNTc4LDMwICsxMjYzLDMwIEBACiAjaWZkZWYgRFVBTF9NSUNfVEVTVAogICAgICAgICAvLy8vLyB0ZXN0IGNvbW1hbmRzIHN0YXJ0CiAgICAgICAgIGNhc2UgUFJFUFJPQ19DTURfRFVBTF9NSUNfRU5BQkxFOiB7Ci0gICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTHx8IGNtZFNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSB8fAotICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJQUkVQUk9DX0NNRF9EVUFMX01JQ19FTkFCTEU6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgIlBSRVBST0NfQ01EX0RVQUxfTUlDX0VOQUJMRTogRVJST1IiKTsKICAgICAgICAgICAgICAgICAqcmVwbHlTaXplID0gMDsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdEdWFsTWljRW5hYmxlZCA9ICooYm9vbCAqKXBDbWREYXRhOworICAgICAgICAgICAgZ0R1YWxNaWNFbmFibGVkID0gKihib29sKilwQ21kRGF0YTsKICAgICAgICAgICAgIGlmIChnRHVhbE1pY0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICBlZmZlY3QtPmF1eF9jaGFubmVsc19vbiA9IHNIYXNBdXhDaGFubmVsc1tlZmZlY3QtPnByb2NJZF07CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGVmZmVjdC0+YXV4X2NoYW5uZWxzX29uID0gZmFsc2U7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlZmZlY3QtPmN1cl9jaGFubmVsX2NvbmZpZyA9IChlZmZlY3QtPnNlc3Npb24tPmluQ2hhbm5lbENvdW50ID09IDEpID8KLSAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9DRkdfTU9OTyA6IENIQU5ORUxfQ0ZHX1NURVJFTzsKKyAgICAgICAgICAgIGVmZmVjdC0+Y3VyX2NoYW5uZWxfY29uZmlnID0KKyAgICAgICAgICAgICAgICAgICAgKGVmZmVjdC0+c2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgPT0gMSkgPyBDSEFOTkVMX0NGR19NT05PIDogQ0hBTk5FTF9DRkdfU1RFUkVPOwogCiAgICAgICAgICAgICBBTE9HVigiUFJFUFJPQ19DTURfRFVBTF9NSUNfRU5BQkxFOiAlcyIsIGdEdWFsTWljRW5hYmxlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwogICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihpbnQpOwotICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKLSAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgUFJFUFJPQ19DTURfRFVBTF9NSUNfUENNX0RVTVBfU1RBUlQ6IHsKLSAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiUFJFUFJPQ19DTURfRFVBTF9NSUNfUENNX0RVTVBfU1RBUlQ6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgIlBSRVBST0NfQ01EX0RVQUxfTUlDX1BDTV9EVU1QX1NUQVJUOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgICpyZXBseVNpemUgPSAwOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQpAQCAtMTYxMCwyMCArMTI5NSwxOSBAQAogICAgICAgICAgICAgICAgIGZjbG9zZShnUGNtRHVtcEZoKTsKICAgICAgICAgICAgICAgICBnUGNtRHVtcEZoID0gTlVMTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoYXIgKnBhdGggPSBzdHJuZHVwKChjaGFyICopcENtZERhdGEsIGNtZFNpemUpOwotICAgICAgICAgICAgZ1BjbUR1bXBGaCA9IGZvcGVuKChjaGFyICopcGF0aCwgIndiIik7CisgICAgICAgICAgICBjaGFyKiBwYXRoID0gc3RybmR1cCgoY2hhciopcENtZERhdGEsIGNtZFNpemUpOworICAgICAgICAgICAgZ1BjbUR1bXBGaCA9IGZvcGVuKChjaGFyKilwYXRoLCAid2IiKTsKICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnUGNtRHVtcExvY2spOwotICAgICAgICAgICAgQUxPR1YoIlBSRVBST0NfQ01EX0RVQUxfTUlDX1BDTV9EVU1QX1NUQVJUOiBwYXRoICVzIGdQY21EdW1wRmggJXAiLAotICAgICAgICAgICAgICAgICAgcGF0aCwgZ1BjbUR1bXBGaCk7CisgICAgICAgICAgICBBTE9HVigiUFJFUFJPQ19DTURfRFVBTF9NSUNfUENNX0RVTVBfU1RBUlQ6IHBhdGggJXMgZ1BjbUR1bXBGaCAlcCIsIHBhdGgsIGdQY21EdW1wRmgpOwogICAgICAgICAgICAgQUxPR0VfSUYoZ1BjbUR1bXBGaCA8PSAwLCAiZ1BjbUR1bXBGaCBvcGVuIGVycm9yICVkICVzIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgICAgICBmcmVlKHBhdGgpOwogICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihpbnQpOwotICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKLSAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgUFJFUFJPQ19DTURfRFVBTF9NSUNfUENNX0RVTVBfU1RPUDogewogICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJQUkVQUk9DX0NNRF9EVUFMX01JQ19QQ01fRFVNUF9TVE9QOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJQUkVQUk9DX0NNRF9EVUFMX01JQ19QQ01fRFVNUF9TVE9QOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgICpyZXBseVNpemUgPSAwOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQpAQCAtMTYzNSwxMTggKzEzMTksMTE2IEBACiAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ1BjbUR1bXBMb2NrKTsKICAgICAgICAgICAgIEFMT0dWKCJQUkVQUk9DX0NNRF9EVUFMX01JQ19QQ01fRFVNUF9TVE9QIik7CiAgICAgICAgICAgICAqcmVwbHlTaXplID0gc2l6ZW9mKGludCk7Ci0gICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSAwOwotICAgICAgICAgICAgfSBicmVhazsKLSAgICAgICAgLy8vLy8gdGVzdCBjb21tYW5kcyBlbmQKKyAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIC8vLy8vIHRlc3QgY29tbWFuZHMgZW5kCiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0dFVF9GRUFUVVJFX1NVUFBPUlRFRF9DT05GSUdTOiB7Ci0gICAgICAgICAgICBpZighZ0R1YWxNaWNFbmFibGVkKSB7CisgICAgICAgICAgICBpZiAoIWdEdWFsTWljRW5hYmxlZCkgewogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEx8fCBjbWRTaXplICE9IDIgKiBzaXplb2YodWludDMyX3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSAyICogc2l6ZW9mKHVpbnQzMl90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9GRUFUVVJFX1NVUFBPUlRFRF9DT05GSUdTOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9GRUFUVVJFX1NVUFBPUlRFRF9DT05GSUdTOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgICpyZXBseVNpemUgPSAwOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCoodWludDMyX3QgKilwQ21kRGF0YSAhPSBFRkZFQ1RfRkVBVFVSRV9BVVhfQ0hBTk5FTFMgfHwKLSAgICAgICAgICAgICAgICAgICFlZmZlY3QtPmF1eF9jaGFubmVsc19vbikgeworICAgICAgICAgICAgaWYgKCoodWludDMyX3QqKXBDbWREYXRhICE9IEVGRkVDVF9GRUFUVVJFX0FVWF9DSEFOTkVMUyB8fCAhZWZmZWN0LT5hdXhfY2hhbm5lbHNfb24pIHsKICAgICAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgZmVhdHVyZSBFRkZFQ1RfRkVBVFVSRV9BVVhfQ0hBTk5FTFMgbm90IHN1cHBvcnRlZCBieSIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgZnggJWQiLCBlZmZlY3QtPnByb2NJZCk7Ci0gICAgICAgICAgICAgICAgKih1aW50MzJfdCAqKXBSZXBseURhdGEgPSAtRU5PU1lTOworICAgICAgICAgICAgICAgICAgICAgICIgZnggJWQiLAorICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdC0+cHJvY0lkKTsKKyAgICAgICAgICAgICAgICAqKHVpbnQzMl90KilwUmVwbHlEYXRhID0gLUVOT1NZUzsKICAgICAgICAgICAgICAgICAqcmVwbHlTaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNpemVfdCBudW1fY29uZmlncyA9ICooKHVpbnQzMl90ICopcENtZERhdGEgKyAxKTsKLSAgICAgICAgICAgIGlmICgqcmVwbHlTaXplIDwgKDIgKiBzaXplb2YodWludDMyX3QpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jb25maWdzICogc2l6ZW9mKGNoYW5uZWxfY29uZmlnX3QpKSkgeworICAgICAgICAgICAgc2l6ZV90IG51bV9jb25maWdzID0gKigodWludDMyX3QqKXBDbWREYXRhICsgMSk7CisgICAgICAgICAgICBpZiAoKnJlcGx5U2l6ZSA8ICgyICogc2l6ZW9mKHVpbnQzMl90KSArIG51bV9jb25maWdzICogc2l6ZW9mKGNoYW5uZWxfY29uZmlnX3QpKSkgewogICAgICAgICAgICAgICAgICpyZXBseVNpemUgPSAwOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqKCh1aW50MzJfdCAqKXBSZXBseURhdGEgKyAxKSA9IENIQU5ORUxfQ0ZHX0NOVDsKKyAgICAgICAgICAgICooKHVpbnQzMl90KilwUmVwbHlEYXRhICsgMSkgPSBDSEFOTkVMX0NGR19DTlQ7CiAgICAgICAgICAgICBpZiAobnVtX2NvbmZpZ3MgPCBDSEFOTkVMX0NGR19DTlQgfHwKLSAgICAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA8ICgyICogc2l6ZW9mKHVpbnQzMl90KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9DRkdfQ05UICogc2l6ZW9mKGNoYW5uZWxfY29uZmlnX3QpKSkgewotICAgICAgICAgICAgICAgICoodWludDMyX3QgKilwUmVwbHlEYXRhID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAqcmVwbHlTaXplIDwgKDIgKiBzaXplb2YodWludDMyX3QpICsgQ0hBTk5FTF9DRkdfQ05UICogc2l6ZW9mKGNoYW5uZWxfY29uZmlnX3QpKSkgeworICAgICAgICAgICAgICAgICoodWludDMyX3QqKXBSZXBseURhdGEgPSAtRU5PTUVNOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBudW1fY29uZmlncyA9IENIQU5ORUxfQ0ZHX0NOVDsKLSAgICAgICAgICAgICAgICAqKHVpbnQzMl90ICopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgICAgICAgICAgKih1aW50MzJfdCopcFJlcGx5RGF0YSA9IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfRkVBVFVSRV9TVVBQT1JURURfQ09ORklHUyBudW0gY29uZmlnICVkIiwKICAgICAgICAgICAgICAgICAgIG51bV9jb25maWdzKTsKIAogICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IDIgKiBzaXplb2YodWludDMyX3QpICsgbnVtX2NvbmZpZ3MgKiBzaXplb2YoY2hhbm5lbF9jb25maWdfdCk7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCAqKXBSZXBseURhdGEgKyAxKSA9IG51bV9jb25maWdzOwotICAgICAgICAgICAgbWVtY3B5KCh1aW50MzJfdCAqKXBSZXBseURhdGEgKyAyLCAmc0R1YWxNaWNDb25maWdzLCBudW1fY29uZmlncyAqIHNpemVvZihjaGFubmVsX2NvbmZpZ190KSk7Ci0gICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgKigodWludDMyX3QqKXBSZXBseURhdGEgKyAxKSA9IG51bV9jb25maWdzOworICAgICAgICAgICAgbWVtY3B5KCh1aW50MzJfdCopcFJlcGx5RGF0YSArIDIsICZzRHVhbE1pY0NvbmZpZ3MsCisgICAgICAgICAgICAgICAgICAgbnVtX2NvbmZpZ3MgKiBzaXplb2YoY2hhbm5lbF9jb25maWdfdCkpOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEVGRkVDVF9DTURfR0VUX0ZFQVRVUkVfQ09ORklHOgotICAgICAgICAgICAgaWYoIWdEdWFsTWljRW5hYmxlZCkgeworICAgICAgICAgICAgaWYgKCFnRHVhbE1pY0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMfHwgY21kU2l6ZSAhPSBzaXplb2YodWludDMyX3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplIDwgc2l6ZW9mKHVpbnQzMl90KSArIHNpemVvZihjaGFubmVsX2NvbmZpZ190KSkgeworICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YodWludDMyX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgIHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgPCBzaXplb2YodWludDMyX3QpICsgc2l6ZW9mKGNoYW5uZWxfY29uZmlnX3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX0ZFQVRVUkVfQ09ORklHOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9GRUFUVVJFX0NPTkZJRzogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgqKHVpbnQzMl90ICopcENtZERhdGEgIT0gRUZGRUNUX0ZFQVRVUkVfQVVYX0NIQU5ORUxTIHx8ICFlZmZlY3QtPmF1eF9jaGFubmVsc19vbikgewotICAgICAgICAgICAgICAgICoodWludDMyX3QgKilwUmVwbHlEYXRhID0gLUVOT1NZUzsKKyAgICAgICAgICAgIGlmICgqKHVpbnQzMl90KilwQ21kRGF0YSAhPSBFRkZFQ1RfRkVBVFVSRV9BVVhfQ0hBTk5FTFMgfHwgIWVmZmVjdC0+YXV4X2NoYW5uZWxzX29uKSB7CisgICAgICAgICAgICAgICAgKih1aW50MzJfdCopcFJlcGx5RGF0YSA9IC1FTk9TWVM7CiAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfRkVBVFVSRV9DT05GSUciKTsKLSAgICAgICAgICAgICoodWludDMyX3QgKilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgICAgICoodWludDMyX3QqKXBSZXBseURhdGEgPSAwOwogICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZih1aW50MzJfdCkgKyBzaXplb2YoY2hhbm5lbF9jb25maWdfdCk7Ci0gICAgICAgICAgICBtZW1jcHkoKHVpbnQzMl90ICopcFJlcGx5RGF0YSArIDEsCi0gICAgICAgICAgICAgICAgICAgJnNEdWFsTWljQ29uZmlnc1tlZmZlY3QtPmN1cl9jaGFubmVsX2NvbmZpZ10sCisgICAgICAgICAgICBtZW1jcHkoKHVpbnQzMl90KilwUmVwbHlEYXRhICsgMSwgJnNEdWFsTWljQ29uZmlnc1tlZmZlY3QtPmN1cl9jaGFubmVsX2NvbmZpZ10sCiAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNoYW5uZWxfY29uZmlnX3QpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0ZFQVRVUkVfQ09ORklHOiB7CiAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfRkVBVFVSRV9DT05GSUc6ICIKLSAgICAgICAgICAgICAgICAgICAgImdEdWFsTWljRW5hYmxlZCAlZCBlZmZlY3QtPmF1eF9jaGFubmVsc19vbiAlZCIsCisgICAgICAgICAgICAgICAgICAiZ0R1YWxNaWNFbmFibGVkICVkIGVmZmVjdC0+YXV4X2NoYW5uZWxzX29uICVkIiwKICAgICAgICAgICAgICAgICAgIGdEdWFsTWljRW5hYmxlZCwgZWZmZWN0LT5hdXhfY2hhbm5lbHNfb24pOwotICAgICAgICAgICAgaWYoIWdEdWFsTWljRW5hYmxlZCkgeworICAgICAgICAgICAgaWYgKCFnRHVhbE1pY0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMfHwgY21kU2l6ZSAhPSAoc2l6ZW9mKHVpbnQzMl90KSArIHNpemVvZihjaGFubmVsX2NvbmZpZ190KSkgfHwKLSAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgICAgICpyZXBseVNpemUgPCBzaXplb2YodWludDMyX3QpKSB7CisgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IChzaXplb2YodWludDMyX3QpICsgc2l6ZW9mKGNoYW5uZWxfY29uZmlnX3QpKSB8fAorICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplIDwgc2l6ZW9mKHVpbnQzMl90KSkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9GRUFUVVJFX0NPTkZJRzogRVJST1JcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICJwQ21kRGF0YSAlcCBjbWRTaXplICVkIHBSZXBseURhdGEgJXAgcmVwbHlTaXplICVwICpyZXBseVNpemUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcENtZERhdGEsIGNtZFNpemUsIHBSZXBseURhdGEsIHJlcGx5U2l6ZSwgcmVwbHlTaXplID8gKnJlcGx5U2l6ZSA6IC0xKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfRkVBVFVSRV9DT05GSUc6IEVSUk9SXG4iCisgICAgICAgICAgICAgICAgICAgICAgInBDbWREYXRhICVwIGNtZFNpemUgJWQgcFJlcGx5RGF0YSAlcCByZXBseVNpemUgJXAgKnJlcGx5U2l6ZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgcENtZERhdGEsIGNtZFNpemUsIHBSZXBseURhdGEsIHJlcGx5U2l6ZSwgcmVwbHlTaXplID8gKnJlcGx5U2l6ZSA6IC0xKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YodWludDMyX3QpOwotICAgICAgICAgICAgaWYgKCoodWludDMyX3QgKilwQ21kRGF0YSAhPSBFRkZFQ1RfRkVBVFVSRV9BVVhfQ0hBTk5FTFMgfHwgIWVmZmVjdC0+YXV4X2NoYW5uZWxzX29uKSB7Ci0gICAgICAgICAgICAgICAgKih1aW50MzJfdCAqKXBSZXBseURhdGEgPSAtRU5PU1lTOworICAgICAgICAgICAgaWYgKCoodWludDMyX3QqKXBDbWREYXRhICE9IEVGRkVDVF9GRUFUVVJFX0FVWF9DSEFOTkVMUyB8fCAhZWZmZWN0LT5hdXhfY2hhbm5lbHNfb24pIHsKKyAgICAgICAgICAgICAgICAqKHVpbnQzMl90KilwUmVwbHlEYXRhID0gLUVOT1NZUzsKICAgICAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX0ZFQVRVUkVfQ09ORklHOiBFUlJPUlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbWREYXRhICVkIGVmZmVjdC0+YXV4X2NoYW5uZWxzX29uICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHVpbnQzMl90ICopcENtZERhdGEsIGVmZmVjdC0+YXV4X2NoYW5uZWxzX29uKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfRkVBVFVSRV9DT05GSUc6IEVSUk9SXG4iCisgICAgICAgICAgICAgICAgICAgICAgIkNtZERhdGEgJWQgZWZmZWN0LT5hdXhfY2hhbm5lbHNfb24gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICoodWludDMyX3QqKXBDbWREYXRhLCBlZmZlY3QtPmF1eF9jaGFubmVsc19vbik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzaXplX3QgaTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBDSEFOTkVMX0NGR19DTlQ7aSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1lbWNtcCgodWludDMyX3QgKilwQ21kRGF0YSArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmc0R1YWxNaWNDb25maWdzW2ldLCBzaXplb2YoY2hhbm5lbF9jb25maWdfdCkpID09IDApIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBDSEFOTkVMX0NGR19DTlQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtZW1jbXAoKHVpbnQzMl90KilwQ21kRGF0YSArIDEsICZzRHVhbE1pY0NvbmZpZ3NbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2hhbm5lbF9jb25maWdfdCkpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGkgPT0gQ0hBTk5FTF9DRkdfQ05UKSB7Ci0gICAgICAgICAgICAgICAgKih1aW50MzJfdCAqKXBSZXBseURhdGEgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICoodWludDMyX3QqKXBSZXBseURhdGEgPSAtRUlOVkFMOwogICAgICAgICAgICAgICAgIEFMT0dXKCJQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9GRUFUVVJFX0NPTkZJRyBpbnZhbGlkIGNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICJbJTA4eF0uWyUwOHhdIiwgKigodWludDMyX3QgKilwQ21kRGF0YSArIDEpLCAqKCh1aW50MzJfdCAqKXBDbWREYXRhICsgMikpOworICAgICAgICAgICAgICAgICAgICAgICJbJTA4eF0uWyUwOHhdIiwKKyAgICAgICAgICAgICAgICAgICAgICAqKCh1aW50MzJfdCopcENtZERhdGEgKyAxKSwgKigodWludDMyX3QqKXBDbWREYXRhICsgMikpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBlZmZlY3QtPmN1cl9jaGFubmVsX2NvbmZpZyA9IGk7Ci0gICAgICAgICAgICAgICAgKih1aW50MzJfdCAqKXBSZXBseURhdGEgPSAwOworICAgICAgICAgICAgICAgICoodWludDMyX3QqKXBSZXBseURhdGEgPSAwOwogICAgICAgICAgICAgICAgIEFMT0dWKCJQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9GRUFUVVJFX0NPTkZJRyBOZXcgY29uZmlnIgotICAgICAgICAgICAgICAgICAgICAgICAgIlslMDh4XS5bJTA4eF0iLCBzRHVhbE1pY0NvbmZpZ3NbaV0ubWFpbl9jaGFubmVscywgc0R1YWxNaWNDb25maWdzW2ldLmF1eF9jaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgICAgIlslMDh4XS5bJTA4eF0iLAorICAgICAgICAgICAgICAgICAgICAgIHNEdWFsTWljQ29uZmlnc1tpXS5tYWluX2NoYW5uZWxzLCBzRHVhbE1pY0NvbmZpZ3NbaV0uYXV4X2NoYW5uZWxzKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIH0gYnJlYWs7CiAjZW5kaWYKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtMTc1NCwxMSArMTQzNiw4IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLQotaW50IFByZVByb2Nlc3NpbmdGeF9HZXREZXNjcmlwdG9yKGVmZmVjdF9oYW5kbGVfdCAgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpCi17Ci0gICAgcHJlcHJvY19lZmZlY3RfdCAqIGVmZmVjdCA9IChwcmVwcm9jX2VmZmVjdF90ICopIHNlbGY7CitpbnQgUHJlUHJvY2Vzc2luZ0Z4X0dldERlc2NyaXB0b3IoZWZmZWN0X2hhbmRsZV90IHNlbGYsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIHBEZXNjcmlwdG9yKSB7CisgICAgcHJlcHJvY19lZmZlY3RfdCogZWZmZWN0ID0gKHByZXByb2NfZWZmZWN0X3QqKXNlbGY7CiAKICAgICBpZiAoZWZmZWN0ID09IE5VTEwgfHwgcERlc2NyaXB0b3IgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTE3NjksMTM3ICsxNDQ4LDgxIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBQcmVQcm9jZXNzaW5nRnhfUHJvY2Vzc1JldmVyc2UoZWZmZWN0X2hhbmRsZV90ICAgICBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAgICAqaW5CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICAgICpvdXRCdWZmZXIgX191bnVzZWQpCi17Ci0gICAgcHJlcHJvY19lZmZlY3RfdCAqIGVmZmVjdCA9IChwcmVwcm9jX2VmZmVjdF90ICopc2VsZjsKK2ludCBQcmVQcm9jZXNzaW5nRnhfUHJvY2Vzc1JldmVyc2UoZWZmZWN0X2hhbmRsZV90IHNlbGYsIGF1ZGlvX2J1ZmZlcl90KiBpbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QqIG91dEJ1ZmZlcikgeworICAgIHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCA9IChwcmVwcm9jX2VmZmVjdF90KilzZWxmOwogCi0gICAgaWYgKGVmZmVjdCA9PSBOVUxMKXsKKyAgICBpZiAoZWZmZWN0ID09IE5VTEwpIHsKICAgICAgICAgQUxPR1coIlByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzUmV2ZXJzZSgpIEVSUk9SIGVmZmVjdCA9PSBOVUxMIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KLSAgICBwcmVwcm9jX3Nlc3Npb25fdCAqIHNlc3Npb24gPSAocHJlcHJvY19zZXNzaW9uX3QgKillZmZlY3QtPnNlc3Npb247CisgICAgcHJlcHJvY19zZXNzaW9uX3QqIHNlc3Npb24gPSAocHJlcHJvY19zZXNzaW9uX3QqKWVmZmVjdC0+c2Vzc2lvbjsKIAotICAgIGlmIChpbkJ1ZmZlciA9PSBOVUxMICB8fCBpbkJ1ZmZlci0+cmF3ID09IE5VTEwpeworICAgIGlmIChpbkJ1ZmZlciA9PSBOVUxMIHx8IGluQnVmZmVyLT5yYXcgPT0gTlVMTCkgewogICAgICAgICBBTE9HVygiUHJlUHJvY2Vzc2luZ0Z4X1Byb2Nlc3NSZXZlcnNlKCkgRVJST1IgYmFkIHBvaW50ZXIiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgc2Vzc2lvbi0+cmV2UHJvY2Vzc2VkTXNrIHw9ICgxPDxlZmZlY3QtPnByb2NJZCk7CisgICAgaWYgKGluQnVmZmVyLT5mcmFtZUNvdW50ICE9IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCkgeworICAgICAgICBBTE9HVygiaW5CdWZmZXItPmZyYW1lQ291bnQgJXp1IGlzIG5vdCBlcXVhbCB0byBvdXRCdWZmZXItPmZyYW1lQ291bnQgJXp1IiwKKyAgICAgICAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQsIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KIAotLy8gICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzUmV2ZXJzZSBJbiAlZCBmcmFtZXMgcmV2RW5hYmxlZE1zayAlMDh4IHJldlByb2Nlc3NlZE1zayAlMDh4IiwKLS8vICAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQsIHNlc3Npb24tPnJldkVuYWJsZWRNc2ssIHNlc3Npb24tPnJldlByb2Nlc3NlZE1zayk7CisgICAgaWYgKGluQnVmZmVyLT5mcmFtZUNvdW50ICE9IHNlc3Npb24tPmZyYW1lQ291bnQpIHsKKyAgICAgICAgQUxPR1coImluQnVmZmVyLT5mcmFtZUNvdW50ICV6dSAhPSAlenUgcmVwcmVzZW50aW5nIDEwbXMgYXQgc2FtcGxpbmcgcmF0ZSAlZCIsCisgICAgICAgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50LCBzZXNzaW9uLT5mcmFtZUNvdW50LCBzZXNzaW9uLT5zYW1wbGluZ1JhdGUpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CiAKKyAgICBzZXNzaW9uLT5yZXZQcm9jZXNzZWRNc2sgfD0gKDEgPDwgZWZmZWN0LT5wcm9jSWQpOworCisgICAgLy8gICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzUmV2ZXJzZSBJbiAlZCBmcmFtZXMgcmV2RW5hYmxlZE1zayAlMDh4IHJldlByb2Nlc3NlZE1zaworICAgIC8vICAgICUwOHgiLAorICAgIC8vICAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQsIHNlc3Npb24tPnJldkVuYWJsZWRNc2ssIHNlc3Npb24tPnJldlByb2Nlc3NlZE1zayk7CiAKICAgICBpZiAoKHNlc3Npb24tPnJldlByb2Nlc3NlZE1zayAmIHNlc3Npb24tPnJldkVuYWJsZWRNc2spID09IHNlc3Npb24tPnJldkVuYWJsZWRNc2spIHsKICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5yZXZQcm9jZXNzZWRNc2sgPSAwOwotICAgICAgICBpZiAoc2Vzc2lvbi0+cmV2UmVzYW1wbGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHNpemVfdCBmciA9IHNlc3Npb24tPmZyYW1lQ291bnQgLSBzZXNzaW9uLT5mcmFtZXNSZXY7Ci0gICAgICAgICAgICBpZiAoaW5CdWZmZXItPmZyYW1lQ291bnQgPCBmcikgewotICAgICAgICAgICAgICAgIGZyID0gaW5CdWZmZXItPmZyYW1lQ291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbi0+cmV2QnVmU2l6ZSA8IHNlc3Npb24tPmZyYW1lc1JldiArIGZyKSB7Ci0gICAgICAgICAgICAgICAgaW50MTZfdCAqYnVmOwotICAgICAgICAgICAgICAgIHNlc3Npb24tPnJldkJ1ZlNpemUgPSBzZXNzaW9uLT5mcmFtZXNSZXYgKyBmcjsKLSAgICAgICAgICAgICAgICBidWYgPSAoaW50MTZfdCAqKXJlYWxsb2Moc2Vzc2lvbi0+cmV2QnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cmV2QnVmU2l6ZSAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICAgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzUmV2ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShzZXNzaW9uLT5yZXZCdWYpOwotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5yZXZCdWYgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi0+cmV2QnVmID0gYnVmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KHNlc3Npb24tPnJldkJ1ZiArIHNlc3Npb24tPmZyYW1lc1JldiAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLT5zMTYsCi0gICAgICAgICAgICAgICAgICAgZnIgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7Ci0KLSAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc1JldiArPSBmcjsKLSAgICAgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50ID0gZnI7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbi0+ZnJhbWVzUmV2IDwgc2Vzc2lvbi0+ZnJhbWVDb3VudCkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3B4X3VpbnQzMl90IGZySW4gPSBzZXNzaW9uLT5mcmFtZXNSZXY7Ci0gICAgICAgICAgICBzcHhfdWludDMyX3QgZnJPdXQgPSBzZXNzaW9uLT5hcG1GcmFtZUNvdW50OwotICAgICAgICAgICAgaWYgKHNlc3Npb24tPmluQ2hhbm5lbENvdW50ID09IDEpIHsKLSAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfcHJvY2Vzc19pbnQoc2Vzc2lvbi0+cmV2UmVzYW1wbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5yZXZCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5yZXZGcmFtZS0+ZGF0YV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmck91dCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9wcm9jZXNzX2ludGVybGVhdmVkX2ludChzZXNzaW9uLT5yZXZSZXNhbXBsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnJldkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnJldkZyYW1lLT5kYXRhXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyT3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweShzZXNzaW9uLT5yZXZCdWYsCi0gICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cmV2QnVmICsgZnJJbiAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgIChzZXNzaW9uLT5mcmFtZXNSZXYgLSBmckluKSAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc1JldiAtPSBmckluOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2l6ZV90IGZyID0gc2Vzc2lvbi0+ZnJhbWVDb3VudCAtIHNlc3Npb24tPmZyYW1lc1JldjsKLSAgICAgICAgICAgIGlmIChpbkJ1ZmZlci0+ZnJhbWVDb3VudCA8IGZyKSB7Ci0gICAgICAgICAgICAgICAgZnIgPSBpbkJ1ZmZlci0+ZnJhbWVDb3VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweShzZXNzaW9uLT5yZXZGcmFtZS0+ZGF0YV8gKyBzZXNzaW9uLT5mcmFtZXNSZXYgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlci0+czE2LAotICAgICAgICAgICAgICAgICAgIGZyICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOwotICAgICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzUmV2ICs9IGZyOwotICAgICAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgPSBmcjsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uLT5mcmFtZXNSZXYgPCBzZXNzaW9uLT5mcmFtZUNvdW50KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNSZXYgPSAwOworICAgICAgICBpZiAoaW50IHN0YXR1cyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5Qcm9jZXNzUmV2ZXJzZVN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QqIGNvbnN0KWluQnVmZmVyLT5zMTYsCisgICAgICAgICAgICAgICAgICAgIChjb25zdCB3ZWJydGM6OlN0cmVhbUNvbmZpZyllZmZlY3QtPnNlc3Npb24tPnJldkNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHdlYnJ0Yzo6U3RyZWFtQ29uZmlnKWVmZmVjdC0+c2Vzc2lvbi0+cmV2Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCogY29uc3Qpb3V0QnVmZmVyLT5zMTYpOworICAgICAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJQcm9jZXNzIFJldmVyc2UgU3RyZWFtIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQotICAgICAgICBzZXNzaW9uLT5yZXZGcmFtZS0+c2FtcGxlc19wZXJfY2hhbm5lbF8gPSBzZXNzaW9uLT5hcG1GcmFtZUNvdW50OwotICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+QW5hbHl6ZVJldmVyc2VTdHJlYW0oc2Vzc2lvbi0+cmV2RnJhbWUpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gLUVOT0RBVEE7CiAgICAgfQogfQogCi0KIC8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIGVmZmVjdAogY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBzRWZmZWN0SW50ZXJmYWNlID0gewotICAgIFByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzLAotICAgIFByZVByb2Nlc3NpbmdGeF9Db21tYW5kLAotICAgIFByZVByb2Nlc3NpbmdGeF9HZXREZXNjcmlwdG9yLAotICAgIE5VTEwKLX07CisgICAgICAgIFByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzLCBQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCwgUHJlUHJvY2Vzc2luZ0Z4X0dldERlc2NyaXB0b3IsIE5VTEx9OwogCiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIHNFZmZlY3RJbnRlcmZhY2VSZXZlcnNlID0gewotICAgIFByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzLAotICAgIFByZVByb2Nlc3NpbmdGeF9Db21tYW5kLAotICAgIFByZVByb2Nlc3NpbmdGeF9HZXREZXNjcmlwdG9yLAotICAgIFByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzUmV2ZXJzZQotfTsKKyAgICAgICAgUHJlUHJvY2Vzc2luZ0Z4X1Byb2Nlc3MsIFByZVByb2Nlc3NpbmdGeF9Db21tYW5kLCBQcmVQcm9jZXNzaW5nRnhfR2V0RGVzY3JpcHRvciwKKyAgICAgICAgUHJlUHJvY2Vzc2luZ0Z4X1Byb2Nlc3NSZXZlcnNlfTsKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEVmZmVjdCBMaWJyYXJ5IEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbgogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IFByZVByb2Nlc3NpbmdMaWJfQ3JlYXRlKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBpb0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAgKnBJbnRlcmZhY2UpCi17CitpbnQgUHJlUHJvY2Vzc2luZ0xpYl9DcmVhdGUoY29uc3QgZWZmZWN0X3V1aWRfdCogdXVpZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QqIHBJbnRlcmZhY2UpIHsKICAgICBBTE9HVigiRWZmZWN0Q3JlYXRlOiB1dWlkOiAlMDh4IHNlc3Npb24gJWQgSU86ICVkIiwgdXVpZC0+dGltZUxvdywgc2Vzc2lvbklkLCBpb0lkKTsKIAogICAgIGludCBzdGF0dXM7Ci0gICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYzsKLSAgICBwcmVwcm9jX3Nlc3Npb25fdCAqc2Vzc2lvbjsKKyAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90KiBkZXNjOworICAgIHByZXByb2Nfc2Vzc2lvbl90KiBzZXNzaW9uOwogICAgIHVpbnQzMl90IHByb2NJZDsKIAogICAgIGlmIChQcmVQcm9jX0luaXQoKSAhPSAwKSB7CiAgICAgICAgIHJldHVybiBzSW5pdFN0YXR1czsKICAgICB9Ci0gICAgZGVzYyA9ICBQcmVQcm9jX0dldERlc2NyaXB0b3IodXVpZCk7CisgICAgZGVzYyA9IFByZVByb2NfR2V0RGVzY3JpcHRvcih1dWlkKTsKICAgICBpZiAoZGVzYyA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dXKCJFZmZlY3RDcmVhdGU6IGZ4IG5vdCBmb3VuZCB1dWlkOiAlMDh4IiwgdXVpZC0+dGltZUxvdyk7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtMTkyMCwxNCArMTU0MywxMyBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLWludCBQcmVQcm9jZXNzaW5nTGliX1JlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSkKLXsKK2ludCBQcmVQcm9jZXNzaW5nTGliX1JlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSkgewogICAgIEFMT0dWKCJFZmZlY3RSZWxlYXNlIHN0YXJ0ICVwIiwgaW50ZXJmYWNlKTsKICAgICBpZiAoUHJlUHJvY19Jbml0KCkgIT0gMCkgewogICAgICAgICByZXR1cm4gc0luaXRTdGF0dXM7CiAgICAgfQogCi0gICAgcHJlcHJvY19lZmZlY3RfdCAqZnggPSAocHJlcHJvY19lZmZlY3RfdCAqKWludGVyZmFjZTsKKyAgICBwcmVwcm9jX2VmZmVjdF90KiBmeCA9IChwcmVwcm9jX2VmZmVjdF90KilpbnRlcmZhY2U7CiAKICAgICBpZiAoZngtPnNlc3Npb24tPmlkID09IDApIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC0xOTM1LDE3ICsxNTU3LDE1IEBACiAgICAgcmV0dXJuIFNlc3Npb25fUmVsZWFzZUVmZmVjdChmeC0+c2Vzc2lvbiwgZngpOwogfQogCi1pbnQgUHJlUHJvY2Vzc2luZ0xpYl9HZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0KLSAgICBpZiAocERlc2NyaXB0b3IgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpeworaW50IFByZVByb2Nlc3NpbmdMaWJfR2V0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90KiB1dWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBwRGVzY3JpcHRvcikgeworICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjID0gUHJlUHJvY19HZXREZXNjcmlwdG9yKHV1aWQpOworICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QqIGRlc2MgPSBQcmVQcm9jX0dldERlc2NyaXB0b3IodXVpZCk7CiAgICAgaWYgKGRlc2MgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0xpYl9HZXREZXNjcmlwdG9yKCkgbm90IGZvdW5kIik7Ci0gICAgICAgIHJldHVybiAgLUVJTlZBTDsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCiAgICAgQUxPR1YoIlByZVByb2Nlc3NpbmdMaWJfR2V0RGVzY3JpcHRvcigpIGdvdCBmeCAlcyIsIGRlc2MtPm5hbWUpOwpAQCAtMTk1NSwxNSArMTU3NSwxMyBAQAogfQogCiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCi1fX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1hdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNID0gewotICAgIC50YWcgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcsCi0gICAgLnZlcnNpb24gPSBFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTiwKLSAgICAubmFtZSA9ICJBdWRpbyBQcmVwcm9jZXNzaW5nIExpYnJhcnkiLAotICAgIC5pbXBsZW1lbnRvciA9ICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKLSAgICAuY3JlYXRlX2VmZmVjdCA9IFByZVByb2Nlc3NpbmdMaWJfQ3JlYXRlLAotICAgIC5yZWxlYXNlX2VmZmVjdCA9IFByZVByb2Nlc3NpbmdMaWJfUmVsZWFzZSwKLSAgICAuZ2V0X2Rlc2NyaXB0b3IgPSBQcmVQcm9jZXNzaW5nTGliX0dldERlc2NyaXB0b3IKLX07CitfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKSBhdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNID0geworICAgICAgICAudGFnID0gQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHLAorICAgICAgICAudmVyc2lvbiA9IEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OLAorICAgICAgICAubmFtZSA9ICJBdWRpbyBQcmVwcm9jZXNzaW5nIExpYnJhcnkiLAorICAgICAgICAuaW1wbGVtZW50b3IgPSAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCisgICAgICAgIC5jcmVhdGVfZWZmZWN0ID0gUHJlUHJvY2Vzc2luZ0xpYl9DcmVhdGUsCisgICAgICAgIC5yZWxlYXNlX2VmZmVjdCA9IFByZVByb2Nlc3NpbmdMaWJfUmVsZWFzZSwKKyAgICAgICAgLmdldF9kZXNjcmlwdG9yID0gUHJlUHJvY2Vzc2luZ0xpYl9HZXREZXNjcmlwdG9yfTsKIAotfTsgLy8gZXh0ZXJuICJDIgorfTsgIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9SRUFETUUubWQgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNDYzNzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNyBAQAorIyBQcmVwcm9jZXNzaW5nIGVmZmVjdHMKKworIyMgTGltaXRhdGlvbnMKKy0gUHJlcHJvY2Vzc2luZyBlZmZlY3RzIGN1cnJlbnRseSB3b3JrIG9uIDEwbXMgd29ydGggb2YgZGF0YSBhbmQgZG8gbm90IHN1cHBvcnQKKyAgYXJiaXRyYXJ5IGZyYW1lIGNvdW50cy4gVGhpcyBsaW1pYXRpb24gY29tZXMgZnJvbSB0aGUgdW5kZXJseWluZyBlZmZlY3RzIGluCisgIHdlYnJ0YyBtb2R1bGVzCistIFRoZXJlIGlzIGN1cnJlbnRseSBubyBhcGkgdG8gY29tbXVuaWNhdGUgdGhpcyByZXF1aXJlbWVudApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL2JlbmNobWFya3MvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9iZW5jaG1hcmtzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJiY2FiNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9iZW5jaG1hcmtzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGliZWZmZWN0c19wcmVwcm9jZXNzaW5nX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJlZmZlY3RzX3ByZXByb2Nlc3NpbmdfbGljZW5zZSIsCisgICAgXSwKK30KKworY2NfYmVuY2htYXJrIHsKKyAgICBuYW1lOiAicHJlcHJvY2Vzc2luZ19iZW5jaG1hcmsiLAorICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvcHJlcHJvY2Vzc2luZy1kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsicHJlcHJvY2Vzc2luZ19iZW5jaG1hcmsuY3BwIl0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvcHJlcHJvY2Vzc2luZyIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL2JlbmNobWFya3MvcHJlcHJvY2Vzc2luZ19iZW5jaG1hcmsuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL2JlbmNobWFya3MvcHJlcHJvY2Vzc2luZ19iZW5jaG1hcmsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MDFkNGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvYmVuY2htYXJrcy9wcmVwcm9jZXNzaW5nX2JlbmNobWFyay5jcHAKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBIHRlc3QgcmVzdWx0IHJ1bm5pbmcgb24gUGl4ZWwgMyBmb3IgY29tcGFyaXNvbi4KKyAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBjaGFubmVsIG1hc2sgaW5kZXguCisgKiBUaGUgc2Vjb25kIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIGVmZmVjdCBpbmRleC4KKyAqIDA6IEF1dG9tYXRpYyBHYWluIENvbnRyb2wsCisgKiAxOiBBY291c3RpYyBFY2hvIENhbmNlbGVyLAorICogMjogTm9pc2UgU3VwcHJlc3NvciwKKyAqIDM6IEF1dG9tYXRpYyBHYWluIENvbnRyb2wgMgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCZW5jaG1hcmsgICAgICAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgICAgIENQVSAgIEl0ZXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQk1fUFJFUFJPQ0VTU0lORy8xLzAgICAgICAgNDgxNzkgbnMgICAgICAgIDQ4MDQxIG5zICAgICAgICAxMjM0OQorICogQk1fUFJFUFJPQ0VTU0lORy8xLzEgICAgICAgNTc1NTkgbnMgICAgICAgIDU3NDAzIG5zICAgICAgICAxMjI3MAorICogQk1fUFJFUFJPQ0VTU0lORy8xLzIgICAgICAgMTc1MjQgbnMgICAgICAgIDE3NDY2IG5zICAgICAgICAzOTk4MgorICogQk1fUFJFUFJPQ0VTU0lORy8xLzMgICAgICAgIDI2MDggbnMgICAgICAgICAyNTk5IG5zICAgICAgIDI2ODM5OQorICogQk1fUFJFUFJPQ0VTU0lORy8yLzAgICAgICAgOTQxOTggbnMgICAgICAgIDkzOTI2IG5zICAgICAgICAgNzQ3MAorICogQk1fUFJFUFJPQ0VTU0lORy8yLzEgICAgICAxMDkxOTYgbnMgICAgICAgMTA4ODk5IG5zICAgICAgICAgNjQ1OQorICogQk1fUFJFUFJPQ0VTU0lORy8yLzIgICAgICAgMzQwOTggbnMgICAgICAgIDMzOTg2IG5zICAgICAgICAyMDU3NgorICogQk1fUFJFUFJPQ0VTU0lORy8yLzMgICAgICAgIDMyMzEgbnMgICAgICAgICAzMjIxIG5zICAgICAgIDIxNjYwNgorICogQk1fUFJFUFJPQ0VTU0lORy8zLzAgICAgICAxNDE1MzIgbnMgICAgICAgMTQxMTMyIG5zICAgICAgICAgNTAzMAorICogQk1fUFJFUFJPQ0VTU0lORy8zLzEgICAgICAxNjExOTkgbnMgICAgICAgMTYwNzQ1IG5zICAgICAgICAgNDM4NworICogQk1fUFJFUFJPQ0VTU0lORy8zLzIgICAgICAgNTA2NjMgbnMgICAgICAgIDUwNTM1IG5zICAgICAgICAxMzYxOQorICogQk1fUFJFUFJPQ0VTU0lORy8zLzMgICAgICAgIDM5NjcgbnMgICAgICAgICAzOTU1IG5zICAgICAgIDE3NzAwNQorICogQk1fUFJFUFJPQ0VTU0lORy80LzAgICAgICAxODcwMzIgbnMgICAgICAgMTg2NDg2IG5zICAgICAgICAgMzcwNgorICogQk1fUFJFUFJPQ0VTU0lORy80LzEgICAgICAyMTI4NzIgbnMgICAgICAgMjEyMjY0IG5zICAgICAgICAgMzMwNAorICogQk1fUFJFUFJPQ0VTU0lORy80LzIgICAgICAgNjc2NDkgbnMgICAgICAgIDY3NDc2IG5zICAgICAgICAxMDEyOAorICogQk1fUFJFUFJPQ0VTU0lORy80LzMgICAgICAgIDQ3MjggbnMgICAgICAgICA0NzEzIG5zICAgICAgIDE0ODU0NworICogQk1fUFJFUFJPQ0VTU0lORy81LzAgICAgICAyMzM4NzQgbnMgICAgICAgMjMzMTg4IG5zICAgICAgICAgMjk1NAorICogQk1fUFJFUFJPQ0VTU0lORy81LzEgICAgICAyNjI3OTggbnMgICAgICAgMjYyMDUyIG5zICAgICAgICAgMjY4MAorICogQk1fUFJFUFJPQ0VTU0lORy81LzIgICAgICAgODQ1OTIgbnMgICAgICAgIDg0MzY4IG5zICAgICAgICAgODIwMworICogQk1fUFJFUFJPQ0VTU0lORy81LzMgICAgICAgIDU0NzIgbnMgICAgICAgICA1NDU1IG5zICAgICAgIDEyNzc4NAorICogQk1fUFJFUFJPQ0VTU0lORy82LzAgICAgICAyODQ3NzcgbnMgICAgICAgMjgzOTExIG5zICAgICAgICAgMjQ2OAorICogQk1fUFJFUFJPQ0VTU0lORy82LzEgICAgICAzMTU2MzEgbnMgICAgICAgMzE0NzI2IG5zICAgICAgICAgMjIzMworICogQk1fUFJFUFJPQ0VTU0lORy82LzIgICAgICAxMDEyMDAgbnMgICAgICAgMTAwOTMxIG5zICAgICAgICAgNjgwMgorICogQk1fUFJFUFJPQ0VTU0lORy82LzMgICAgICAgIDYxNTIgbnMgICAgICAgICA2MTMzIG5zICAgICAgIDExMzk1MQorICogQk1fUFJFUFJPQ0VTU0lORy83LzAgICAgICAzMjcyMDcgbnMgICAgICAgMzI2MTUzIG5zICAgICAgICAgMjExMgorICogQk1fUFJFUFJPQ0VTU0lORy83LzEgICAgICAzNjc1MTAgbnMgICAgICAgMzY2NDEwIG5zICAgICAgICAgMTkxNQorICogQk1fUFJFUFJPQ0VTU0lORy83LzIgICAgICAxMTg1NzQgbnMgICAgICAgMTE4MjUwIG5zICAgICAgICAgNTc5NQorICogQk1fUFJFUFJPQ0VTU0lORy83LzMgICAgICAgIDY5NTYgbnMgICAgICAgICA2OTM1IG5zICAgICAgIDEwMDc4MworICogQk1fUFJFUFJPQ0VTU0lORy84LzAgICAgICAzNzI2MDMgbnMgICAgICAgMzcxNDcwIG5zICAgICAgICAgMTg4MAorICogQk1fUFJFUFJPQ0VTU0lORy84LzEgICAgICA0MTg4ODIgbnMgICAgICAgNDE3NjI1IG5zICAgICAgICAgMTY4NQorICogQk1fUFJFUFJPQ0VTU0lORy84LzIgICAgICAxMzYxNTUgbnMgICAgICAgMTM1Nzc3IG5zICAgICAgICAgNDk4NgorICogQk1fUFJFUFJPQ0VTU0lORy84LzMgICAgICAgIDc3MzQgbnMgICAgICAgICA3NzExIG5zICAgICAgICA5MTU4MQorICogQk1fUFJFUFJPQ0VTU0lORy85LzAgICAgICA0MjQ3OTUgbnMgICAgICAgNDIzNDY0IG5zICAgICAgICAgMTY1NworICogQk1fUFJFUFJPQ0VTU0lORy85LzEgICAgICA0NjkwNzMgbnMgICAgICAgNDY3Njg3IG5zICAgICAgICAgMTUwNgorICogQk1fUFJFUFJPQ0VTU0lORy85LzIgICAgICAxNTMxNzAgbnMgICAgICAgMTUyNzM3IG5zICAgICAgICAgNDUxOQorICogQk1fUFJFUFJPQ0VTU0lORy85LzMgICAgICAgIDgzOTMgbnMgICAgICAgICA4MzYzIG5zICAgICAgICA4MzYwMworICogQk1fUFJFUFJPQ0VTU0lORy8xMC8wICAgICA0NzI0NDAgbnMgICAgICAgNDcwOTI2IG5zICAgICAgICAgMTQ4OQorICogQk1fUFJFUFJPQ0VTU0lORy8xMC8xICAgICA1MTY5ODQgbnMgICAgICAgNTE1NDgwIG5zICAgICAgICAgMTAwMAorICogQk1fUFJFUFJPQ0VTU0lORy8xMC8yICAgICAxNjg4MDIgbnMgICAgICAgMTY4MzQ4IG5zICAgICAgICAgNDA5NworICogQk1fUFJFUFJPQ0VTU0lORy8xMC8zICAgICAgIDkxMjcgbnMgICAgICAgICA5MTAwIG5zICAgICAgICA3NjkxMworICogQk1fUFJFUFJPQ0VTU0lORy8xMS8wICAgICA1MDk2OTAgbnMgICAgICAgNTA4MTEzIG5zICAgICAgICAgMTM2MAorICogQk1fUFJFUFJPQ0VTU0lORy8xMS8xICAgICA1NjkwNzYgbnMgICAgICAgNTY3MzkwIG5zICAgICAgICAgMTMxMAorICogQk1fUFJFUFJPQ0VTU0lORy8xMS8yICAgICAxODU2NzggbnMgICAgICAgMTg1MTY1IG5zICAgICAgICAgMzcyOQorICogQk1fUFJFUFJPQ0VTU0lORy8xMS8zICAgICAgIDk3ODkgbnMgICAgICAgICA5NzYwIG5zICAgICAgICA3MTM0MgorICogQk1fUFJFUFJPQ0VTU0lORy8xMi8wICAgICA1NjM4NTggbnMgICAgICAgNTYyMTA4IG5zICAgICAgICAgMTI3MAorICogQk1fUFJFUFJPQ0VTU0lORy8xMi8xICAgICA2MTk2NTYgbnMgICAgICAgNjE3NzkxIG5zICAgICAgICAgMTE5OAorICogQk1fUFJFUFJPQ0VTU0lORy8xMi8yICAgICAyMDI4ODIgbnMgICAgICAgMjAyMzE2IG5zICAgICAgICAgMzQwNgorICogQk1fUFJFUFJPQ0VTU0lORy8xMi8zICAgICAgMTA2MTAgbnMgICAgICAgIDEwNTc5IG5zICAgICAgICA2NjI4NworICogQk1fUFJFUFJPQ0VTU0lORy8xMy8wICAgICA2MDI5NDQgbnMgICAgICAgNjAxMDk0IG5zICAgICAgICAgMTE2NworICogQk1fUFJFUFJPQ0VTU0lORy8xMy8xICAgICA2NzU0MDEgbnMgICAgICAgNjczMjkzIG5zICAgICAgICAgMTEwNworICogQk1fUFJFUFJPQ0VTU0lORy8xMy8yICAgICAyMjA2NzcgbnMgICAgICAgMjIwMDUxIG5zICAgICAgICAgMzEzMQorICogQk1fUFJFUFJPQ0VTU0lORy8xMy8zICAgICAgMTEzMDEgbnMgICAgICAgIDExMjY1IG5zICAgICAgICA2MjAyMgorICogQk1fUFJFUFJPQ0VTU0lORy8xNC8wICAgICA2NTk0OTUgbnMgICAgICAgNjU3Mzc1IG5zICAgICAgICAgMTA3MQorICogQk1fUFJFUFJPQ0VTU0lORy8xNC8xICAgICA3MjY1NTEgbnMgICAgICAgNzI0Mjk1IG5zICAgICAgICAgMTAyNAorICogQk1fUFJFUFJPQ0VTU0lORy8xNC8yICAgICAyMzg1OTUgbnMgICAgICAgMjM3OTIyIG5zICAgICAgICAgMjkwMQorICogQk1fUFJFUFJPQ0VTU0lORy8xNC8zICAgICAgMTE5NDEgbnMgICAgICAgIDExOTA2IG5zICAgICAgICA1ODc4OAorICogQk1fUFJFUFJPQ0VTU0lORy8xNS8wICAgICA2OTgzNzcgbnMgICAgICAgNjk2MTM0IG5zICAgICAgICAgMTAxNAorICogQk1fUFJFUFJPQ0VTU0lORy8xNS8xICAgICA3NzI1MzIgbnMgICAgICAgNzcwMjE3IG5zICAgICAgICAgIDk2MAorICogQk1fUFJFUFJPQ0VTU0lORy8xNS8yICAgICAyNTMyMTkgbnMgICAgICAgMjUyNTA1IG5zICAgICAgICAgMjczNgorICogQk1fUFJFUFJPQ0VTU0lORy8xNS8zICAgICAgMTI2NjkgbnMgICAgICAgIDEyNjMyIG5zICAgICAgICA1NTQ1MgorICogQk1fUFJFUFJPQ0VTU0lORy8xNi8wICAgICA3NDIwNTQgbnMgICAgICAgNzM5NzA4IG5zICAgICAgICAgIDkzNgorICogQk1fUFJFUFJPQ0VTU0lORy8xNi8xICAgICA4MjgwMjkgbnMgICAgICAgODI1NDg0IG5zICAgICAgICAgIDkwMgorICogQk1fUFJFUFJPQ0VTU0lORy8xNi8yICAgICAyNzI0MTkgbnMgICAgICAgMjcxNjU4IG5zICAgICAgICAgMjU0NQorICogQk1fUFJFUFJPQ0VTU0lORy8xNi8zICAgICAgMTM0NzMgbnMgICAgICAgIDEzNDMxIG5zICAgICAgICA1MjA4OAorICogQk1fUFJFUFJPQ0VTU0lORy8xNy8wICAgICA3OTQ0NDQgbnMgICAgICAgNzkxOTE2IG5zICAgICAgICAgIDg5MQorICogQk1fUFJFUFJPQ0VTU0lORy8xNy8xICAgICA4Nzk0MjkgbnMgICAgICAgODc2NzA0IG5zICAgICAgICAgIDg0MQorICogQk1fUFJFUFJPQ0VTU0lORy8xNy8yICAgICAyOTAwNTkgbnMgICAgICAgMjg5MjE2IG5zICAgICAgICAgMjM5MQorICogQk1fUFJFUFJPQ0VTU0lORy8xNy8zICAgICAgMTQyNTcgbnMgICAgICAgIDE0MjEwIG5zICAgICAgICA0OTQyNQorICogQk1fUFJFUFJPQ0VTU0lORy8xOC8wICAgICA4NTIyMjEgbnMgICAgICAgODQ5NDMwIG5zICAgICAgICAgIDgzOQorICogQk1fUFJFUFJPQ0VTU0lORy8xOC8xICAgICA5MzExMjEgbnMgICAgICAgOTI4MzA4IG5zICAgICAgICAgIDc5OQorICogQk1fUFJFUFJPQ0VTU0lORy8xOC8yICAgICAzMDc5OTUgbnMgICAgICAgMzA3MTA0IG5zICAgICAgICAgMjI1MworICogQk1fUFJFUFJPQ0VTU0lORy8xOC8zICAgICAgMTQ5NDcgbnMgICAgICAgIDE0OTAwIG5zICAgICAgICA0Njg3MgorICogQk1fUFJFUFJPQ0VTU0lORy8xOS8wICAgICA4ODg3NTIgbnMgICAgICAgODg1ODkzIG5zICAgICAgICAgIDc4MQorICogQk1fUFJFUFJPQ0VTU0lORy8xOS8xICAgICA5ODMzOTggbnMgICAgICAgOTgwMjg1IG5zICAgICAgICAgIDc1NgorICogQk1fUFJFUFJPQ0VTU0lORy8xOS8yICAgICAzMjU2NjkgbnMgICAgICAgMzI0NzA1IG5zICAgICAgICAgMjEzMgorICogQk1fUFJFUFJPQ0VTU0lORy8xOS8zICAgICAgMTU2NzcgbnMgICAgICAgIDE1NjI5IG5zICAgICAgICA0NDY5MworICogQk1fUFJFUFJPQ0VTU0lORy8yMC8wICAgICA5MzM2NTEgbnMgICAgICAgOTMwNjk3IG5zICAgICAgICAgIDc0NgorICogQk1fUFJFUFJPQ0VTU0lORy8yMC8xICAgIDEwMzMzOTYgbnMgICAgICAxMDMwMjM1IG5zICAgICAgICAgIDcxMworICogQk1fUFJFUFJPQ0VTU0lORy8yMC8yICAgICAzNDIwODEgbnMgICAgICAgMzQxMDc3IG5zICAgICAgICAgMjAzMQorICogQk1fUFJFUFJPQ0VTU0lORy8yMC8zICAgICAgMTY0MjIgbnMgICAgICAgIDE2MzcwIG5zICAgICAgICA0MjYyMgorICogQk1fUFJFUFJPQ0VTU0lORy8yMS8wICAgICA5ODI1MjEgbnMgICAgICAgOTc5Mzg4IG5zICAgICAgICAgIDcwNgorICogQk1fUFJFUFJPQ0VTU0lORy8yMS8xICAgIDEwODUzNDAgbnMgICAgICAxMDgxOTI2IG5zICAgICAgICAgIDY4MgorICogQk1fUFJFUFJPQ0VTU0lORy8yMS8yICAgICAzNjA4NjIgbnMgICAgICAgMzU5ODEwIG5zICAgICAgICAgMTkyNgorICogQk1fUFJFUFJPQ0VTU0lORy8yMS8zICAgICAgMTcxNjEgbnMgICAgICAgIDE3MTA3IG5zICAgICAgICA0MDg4NQorICogQk1fUFJFUFJPQ0VTU0lORy8yMi8wICAgIDEwNDM1NjAgbnMgICAgICAxMDQwMjE5IG5zICAgICAgICAgIDY3OAorICogQk1fUFJFUFJPQ0VTU0lORy8yMi8xICAgIDExMzcyMDMgbnMgICAgICAxMTMzNjg3IG5zICAgICAgICAgIDY1MworICogQk1fUFJFUFJPQ0VTU0lORy8yMi8yICAgICAzNzc0MjEgbnMgICAgICAgMzc2MzE1IG5zICAgICAgICAgMTg0MQorICogQk1fUFJFUFJPQ0VTU0lORy8yMi8zICAgICAgMTc5MDMgbnMgICAgICAgIDE3ODQ3IG5zICAgICAgICAzODk4NAorICogQk1fUFJFUFJPQ0VTU0lORy8yMy8wICAgIDEwOTAwOTcgbnMgICAgICAxMDg2NTIzIG5zICAgICAgICAgIDY1MAorICogQk1fUFJFUFJPQ0VTU0lORy8yMy8xICAgIDExOTkyNjcgbnMgICAgICAxMTk0MjMxIG5zICAgICAgICAgIDYxOQorICogQk1fUFJFUFJPQ0VTU0lORy8yMy8yICAgICAzOTU0MjkgbnMgICAgICAgMzk0MjYzIG5zICAgICAgICAgMTc1OQorICogQk1fUFJFUFJPQ0VTU0lORy8yMy8zICAgICAgMTg4NzkgbnMgICAgICAgIDE4ODE4IG5zICAgICAgICAzNzI0MgorICogQk1fUFJFUFJPQ0VTU0lORy8yNC8wICAgIDExMjg2MzggbnMgICAgICAxMTI1MDc2IG5zICAgICAgICAgIDYyOQorICogQk1fUFJFUFJPQ0VTU0lORy8yNC8xICAgIDEyMzk5MDkgbnMgICAgICAxMjM2MDE5IG5zICAgICAgICAgIDU5OAorICogQk1fUFJFUFJPQ0VTU0lORy8yNC8yICAgICA0MTQyOTQgbnMgICAgICAgNDEzMDU1IG5zICAgICAgICAgMTY4MAorICogQk1fUFJFUFJPQ0VTU0lORy8yNC8zICAgICAgMTk1ODMgbnMgICAgICAgIDE5NTIxIG5zICAgICAgICAzNTc3MQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9hZ2MuaD4KKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8cmFuZG9tPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9hZ2MyLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfbnMuaD4KKyNpbmNsdWRlIDxiZW5jaG1hcmsvYmVuY2htYXJrLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKK2V4dGVybiBhdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNOworCitjb25zdGV4cHIgaW50IGtTYW1wbGVSYXRlID0gMTYwMDA7Citjb25zdGV4cHIgZmxvYXQga1Rlbk1pbGxpU2VjVmFsID0gMC4wMTsKK2NvbnN0ZXhwciB1bnNpZ25lZCBpbnQga1N0cmVhbURlbGF5TXMgPSAwOworY29uc3RleHByIGVmZmVjdF91dWlkX3Qga0VmZmVjdFV1aWRzW10gPSB7CisgICAgICAgIC8vIGFnYyB1dWlkCisgICAgICAgIHsweGFhODEzMGUwLCAweDY2ZmMsIDB4MTFlMCwgMHhiYWQwLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICAvLyBhZWMgdXVpZAorICAgICAgICB7MHhiYjM5MmVjMCwgMHg4ZDRkLCAweDExZTAsIDB4YTg5NiwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgLy8gbnMgIHV1aWQKKyAgICAgICAgezB4YzA2Yzg0MDAsIDB4OGUwNiwgMHgxMWUwLCAweDljYjYsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCisgICAgICAgIC8vIGFnYzIgdXVpZAorICAgICAgICB7MHg4OWYzOGU2NSwgMHhkNGQyLCAweDRkNjQsIDB4YWQwZSwgezB4MmIsIDB4M2UsIDB4NzksIDB4OWUsIDB4YTgsIDB4ODZ9fSwKK307Citjb25zdGV4cHIgc2l6ZV90IGtOdW1FZmZlY3RVdWlkcyA9IHN0ZDo6c2l6ZShrRWZmZWN0VXVpZHMpOworY29uc3RleHByIGF1ZGlvX2NoYW5uZWxfbWFza190IGtDaE1hc2tzW10gPSB7CisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xLCAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIsICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzQsICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNSwgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS182LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNywgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS184LCAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzksCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMCwgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzExLCBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTIsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMywgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE0LCBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTUsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNiwgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE3LCBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTgsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xOSwgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIwLCBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjEsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMiwgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIzLCBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjQsCit9OworY29uc3RleHByIHNpemVfdCBrTnVtQ2hNYXNrcyA9IHN0ZDo6c2l6ZShrQ2hNYXNrcyk7CisKKy8vIHR5cGVzIG9mIHByZSBwcm9jZXNzaW5nIG1vZHVsZXMKK2VudW0gUHJlUHJvY0lkIHsKKyAgICBQUkVQUk9DX0FHQywgIC8vIEF1dG9tYXRpYyBHYWluIENvbnRyb2wKKyAgICBQUkVQUk9DX0FFQywgIC8vIEFjb3VzdGljIEVjaG8gQ2FuY2VsZXIKKyAgICBQUkVQUk9DX05TLCAgIC8vIE5vaXNlIFN1cHByZXNzb3IKKyAgICBQUkVQUk9DX0FHQzIsICAvLyBBdXRvbWF0aWMgR2FpbiBDb250cm9sIDIKKyAgICBQUkVQUk9DX05VTV9FRkZFQ1RTCit9OworCitpbnQgcHJlUHJvY0NyZWF0ZUVmZmVjdChlZmZlY3RfaGFuZGxlX3QqIHBFZmZlY3RIYW5kbGUsIHVpbnQzMl90IGVmZmVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfY29uZmlnX3QqIHBDb25maWcsIGludCBzZXNzaW9uSWQsIGludCBpb0lkKSB7CisgICAgaWYgKGludCBzdGF0dXMgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTS5jcmVhdGVfZWZmZWN0KCZrRWZmZWN0VXVpZHNbZWZmZWN0VHlwZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgaW9JZCwgcEVmZmVjdEhhbmRsZSk7CisgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJBdWRpbyBQcmVwcm9jZXNzaW5nIGNyZWF0ZSByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICBpbnQgcmVwbHkgPSAwOworICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihyZXBseSk7CisgICAgaWYgKGVmZmVjdFR5cGUgPT0gUFJFUFJPQ19BRUMpIHsKKyAgICAgICAgaWYgKGludCBzdGF0dXMgPSAoKipwRWZmZWN0SGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5jb21tYW5kKCpwRWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwgcENvbmZpZywgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiU2V0IGNvbmZpZyByZXZlcnNlIGNvbW1hbmQgcmV0dXJuZWQgYW4gZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGludCBzdGF0dXMgPSAoKipwRWZmZWN0SGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmNvbW1hbmQoKnBFZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX0NPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfY29uZmlnX3QpLCBwQ29uZmlnLCAmcmVwbHlTaXplLCAmcmVwbHkpOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiU2V0IGNvbmZpZyBjb21tYW5kIHJldHVybmVkIGFuIGVycm9yID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorICAgIHJldHVybiByZXBseTsKK30KKworaW50IHByZVByb2NTZXRDb25maWdQYXJhbShlZmZlY3RfaGFuZGxlX3QgZWZmZWN0SGFuZGxlLCB1aW50MzJfdCBwYXJhbVR5cGUsIHVpbnQzMl90IHBhcmFtVmFsdWUpIHsKKyAgICBpbnQgcmVwbHkgPSAwOworICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihyZXBseSk7CisgICAgdWludDMyX3QgcGFyYW1EYXRhWzJdID0ge3BhcmFtVHlwZSwgcGFyYW1WYWx1ZX07CisgICAgZWZmZWN0X3BhcmFtX3QqIGVmZmVjdFBhcmFtID0gKGVmZmVjdF9wYXJhbV90KiltYWxsb2Moc2l6ZW9mKCplZmZlY3RQYXJhbSkgKyBzaXplb2YocGFyYW1EYXRhKSk7CisgICAgbWVtY3B5KCZlZmZlY3RQYXJhbS0+ZGF0YVswXSwgJnBhcmFtRGF0YVswXSwgc2l6ZW9mKHBhcmFtRGF0YSkpOworICAgIGVmZmVjdFBhcmFtLT5wc2l6ZSA9IHNpemVvZihwYXJhbURhdGFbMF0pOworICAgICgqZWZmZWN0SGFuZGxlKQorICAgICAgICAgICAgLT5jb21tYW5kKGVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfUEFSQU0sIHNpemVvZihlZmZlY3RfcGFyYW1fdCksIGVmZmVjdFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICZyZXBseVNpemUsICZyZXBseSk7CisgICAgZnJlZShlZmZlY3RQYXJhbSk7CisgICAgcmV0dXJuIHJlcGx5OworfQorCitzaG9ydCBwcmVQcm9jR2V0U2hvcnRWYWwoZmxvYXQgcGFyYW1WYWx1ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxzaG9ydD4ocGFyYW1WYWx1ZSAqIHN0ZDo6bnVtZXJpY19saW1pdHM8c2hvcnQ+OjptYXgoKSk7Cit9CisKK3N0YXRpYyB2b2lkIEJNX1BSRVBST0NFU1NJTkcoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBjb25zdCBzaXplX3QgY2hNYXNrID0ga0NoTWFza3Nbc3RhdGUucmFuZ2UoMCkgLSAxXTsKKyAgICBjb25zdCBzaXplX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hNYXNrKTsKKworICAgIFByZVByb2NJZCBlZmZlY3RUeXBlID0gKFByZVByb2NJZClzdGF0ZS5yYW5nZSgxKTsKKworICAgIGludDMyX3Qgc2Vzc2lvbklkID0gMTsKKyAgICBpbnQzMl90IGlvSWQgPSAxOworICAgIGVmZmVjdF9oYW5kbGVfdCBlZmZlY3RIYW5kbGUgPSBudWxscHRyOworICAgIGVmZmVjdF9jb25maWdfdCBjb25maWd7fTsKKyAgICBjb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gY29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSBrU2FtcGxlUmF0ZTsKKyAgICBjb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBjb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gY2hNYXNrOworICAgIGNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBjb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworCisgICAgaWYgKGludCBzdGF0dXMgPSBwcmVQcm9jQ3JlYXRlRWZmZWN0KCZlZmZlY3RIYW5kbGUsIHN0YXRlLnJhbmdlKDEpLCAmY29uZmlnLCBzZXNzaW9uSWQsIGlvSWQpOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiQ3JlYXRlIGVmZmVjdCBjYWxsIHJldHVybmVkIGVycm9yICVpIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCByZXBseSA9IDA7CisgICAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKHJlcGx5KTsKKyAgICBpZiAoaW50IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgKCplZmZlY3RIYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAtPmNvbW1hbmQoZWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX0VOQUJMRSwgMCwgbnVsbHB0ciwgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIkNvbW1hbmQgZW5hYmxlIGNhbGwgcmV0dXJuZWQgZXJyb3IgJWRcbiIsIHJlcGx5KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEluaXRpYWxpemUgaW5wdXQgYnVmZmVyIHdpdGggZGV0ZXJtaW5pc3RpYyBwc2V1ZG8tcmFuZG9tIHZhbHVlcworICAgIGNvbnN0IGludCBmcmFtZUxlbmd0aCA9IChpbnQpKGtTYW1wbGVSYXRlICoga1Rlbk1pbGxpU2VjVmFsKTsKKyAgICBzdGQ6Om1pbnN0ZF9yYW5kIGdlbihjaE1hc2spOworICAgIHN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjw+IGRpcygtMS4wZiwgMS4wZik7CisgICAgc3RkOjp2ZWN0b3I8c2hvcnQ+IGluKGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKKyAgICBmb3IgKGF1dG8mIGkgOiBpbikgeworICAgICAgICBpID0gcHJlUHJvY0dldFNob3J0VmFsKGRpcyhnZW4pKTsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c2hvcnQ+IGZhckluKGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKKyAgICBmb3IgKGF1dG8mIGkgOiBmYXJJbikgeworICAgICAgICBpID0gcHJlUHJvY0dldFNob3J0VmFsKGRpcyhnZW4pKTsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c2hvcnQ+IG91dChmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7CisKKyAgICAvLyBSdW4gdGhlIHRlc3QKKyAgICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShpbi5kYXRhKCkpOworICAgICAgICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUob3V0LmRhdGEoKSk7CisgICAgICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShmYXJJbi5kYXRhKCkpOworCisgICAgICAgIGF1ZGlvX2J1ZmZlcl90IGluQnVmZmVyID0gey5mcmFtZUNvdW50ID0gKHNpemVfdClmcmFtZUxlbmd0aCwgLnMxNiA9IGluLmRhdGEoKX07CisgICAgICAgIGF1ZGlvX2J1ZmZlcl90IG91dEJ1ZmZlciA9IHsuZnJhbWVDb3VudCA9IChzaXplX3QpZnJhbWVMZW5ndGgsIC5zMTYgPSBvdXQuZGF0YSgpfTsKKyAgICAgICAgYXVkaW9fYnVmZmVyX3QgZmFySW5CdWZmZXIgPSB7LmZyYW1lQ291bnQgPSAoc2l6ZV90KWZyYW1lTGVuZ3RoLCAuczE2ID0gZmFySW4uZGF0YSgpfTsKKworICAgICAgICBpZiAoUFJFUFJPQ19BRUMgPT0gZWZmZWN0VHlwZSkgeworICAgICAgICAgICAgaWYgKGludCBzdGF0dXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgcHJlUHJvY1NldENvbmZpZ1BhcmFtKGVmZmVjdEhhbmRsZSwgQUVDX1BBUkFNX0VDSE9fREVMQVksIGtTdHJlYW1EZWxheU1zKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJwcmVQcm9jU2V0Q29uZmlnUGFyYW0gcmV0dXJuZWQgRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpbnQgc3RhdHVzID0gKCplZmZlY3RIYW5kbGUpLT5wcm9jZXNzKGVmZmVjdEhhbmRsZSwgJmluQnVmZmVyLCAmb3V0QnVmZmVyKTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiXG5FcnJvcjogUHJvY2VzcyBpID0gJWQgcmV0dXJuZWQgd2l0aCBlcnJvciAlZFxuIiwgKGludClzdGF0ZS5yYW5nZSgxKSwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoUFJFUFJPQ19BRUMgPT0gZWZmZWN0VHlwZSkgeworICAgICAgICAgICAgaWYgKGludCBzdGF0dXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgKCplZmZlY3RIYW5kbGUpLT5wcm9jZXNzX3JldmVyc2UoZWZmZWN0SGFuZGxlLCAmZmFySW5CdWZmZXIsICZvdXRCdWZmZXIpOworICAgICAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlxuRXJyb3I6IFByb2Nlc3MgcmV2ZXJzZSBpID0gJWQgcmV0dXJuZWQgd2l0aCBlcnJvciAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAoaW50KXN0YXRlLnJhbmdlKDEpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBiZW5jaG1hcms6OkNsb2JiZXJNZW1vcnkoKTsKKworICAgIHN0YXRlLlNldENvbXBsZXhpdHlOKHN0YXRlLnJhbmdlKDApKTsKKworICAgIGlmIChpbnQgc3RhdHVzID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0ucmVsZWFzZV9lZmZlY3QoZWZmZWN0SGFuZGxlKTsgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoInJlbGVhc2VfZWZmZWN0IHJldHVybmVkIGFuIGVycm9yID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHByZXByb2Nlc3NpbmdBcmdzKGJlbmNobWFyazo6aW50ZXJuYWw6OkJlbmNobWFyayogYikgeworICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IChpbnQpa051bUNoTWFza3M7IGkrKykgeworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IChpbnQpa051bUVmZmVjdFV1aWRzOyArK2opIHsKKyAgICAgICAgICAgIGItPkFyZ3Moe2ksIGp9KTsKKyAgICAgICAgfQorICAgIH0KK30KKworQkVOQ0hNQVJLKEJNX1BSRVBST0NFU1NJTkcpLT5BcHBseShwcmVwcm9jZXNzaW5nQXJncyk7CisKK0JFTkNITUFSS19NQUlOKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MGIxMzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ5IEBACisvLyBhdWRpbyBwcmVwcm9jZXNzaW5nIHVuaXQgdGVzdAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGliZWZmZWN0c19wcmVwcm9jZXNzaW5nX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJlZmZlY3RzX3ByZXByb2Nlc3NpbmdfbGljZW5zZSIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkVmZmVjdFByZXByb2Nlc3NpbmdUZXN0IiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb3ByZXByb2Nlc3NpbmctZGVmYXVsdHMiXSwKKyAgICBndGVzdDogdHJ1ZSwKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJFZmZlY3RQcmVwcm9jZXNzaW5nVGVzdC5jcHAiLAorICAgICAgICAiRWZmZWN0VGVzdEhlbHBlci5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvcHJlcHJvY2Vzc2luZyIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiQXVkaW9QcmVQcm9jZXNzaW5nVGVzdCIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9wcmVwcm9jZXNzaW5nLWRlZmF1bHRzIl0sCisgICAgZ3Rlc3Q6IGZhbHNlLAorICAgIHNyY3M6IFsiUHJlUHJvY2Vzc2luZ1Rlc3QuY3BwIl0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvcHJlcHJvY2Vzc2luZyIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiY29ycmVsYXRpb24iLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHNyY3M6IFsiY29ycmVsYXRpb24uY3BwIl0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCisgICAgZ3Rlc3Q6IGZhbHNlLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL0VmZmVjdFByZXByb2Nlc3NpbmdUZXN0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9FZmZlY3RQcmVwcm9jZXNzaW5nVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcwMDZhMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9FZmZlY3RQcmVwcm9jZXNzaW5nVGVzdC5jcHAKQEAgLTAsMCArMSwzMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJFZmZlY3RUZXN0SGVscGVyLmgiCisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9hZ2MuaD4KKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9hZ2MyLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfbnMuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKK2NvbnN0ZXhwciBlZmZlY3RfdXVpZF90IGtBR0NVdWlkID0geworICAgICAgICAweGFhODEzMGUwLCAweDY2ZmMsIDB4MTFlMCwgMHhiYWQwLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19OworY29uc3RleHByIGVmZmVjdF91dWlkX3Qga0FHQzJVdWlkID0geworICAgICAgICAweDg5ZjM4ZTY1LCAweGQ0ZDIsIDB4NGQ2NCwgMHhhZDBlLCB7MHgyYiwgMHgzZSwgMHg3OSwgMHg5ZSwgMHhhOCwgMHg4Nn19OworY29uc3RleHByIGVmZmVjdF91dWlkX3Qga0FFQ1V1aWQgPSB7CisgICAgICAgIDB4YmIzOTJlYzAsIDB4OGQ0ZCwgMHgxMWUwLCAweGE4OTYsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX07Citjb25zdGV4cHIgZWZmZWN0X3V1aWRfdCBrTlNVdWlkID0geworICAgICAgICAweGMwNmM4NDAwLCAweDhlMDYsIDB4MTFlMCwgMHg5Y2I2LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19OworCitzdGF0aWMgYm9vbCBpc0FHQ0VmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90KiB1dWlkKSB7CisgICAgcmV0dXJuIHV1aWQgPT0gJmtBR0NVdWlkOworfQorc3RhdGljIGJvb2wgaXNBR0MyRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QqIHV1aWQpIHsKKyAgICByZXR1cm4gdXVpZCA9PSAma0FHQzJVdWlkOworfQorc3RhdGljIGJvb2wgaXNBRUNFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCogdXVpZCkgeworICAgIHJldHVybiB1dWlkID09ICZrQUVDVXVpZDsKK30KK3N0YXRpYyBib29sIGlzTlNFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCogdXVpZCkgeworICAgIHJldHVybiB1dWlkID09ICZrTlNVdWlkOworfQorCitjb25zdGV4cHIgaW50IGtBR0NUYXJnZXRMZXZlbHNbXSA9IHswLCAtMzAwLCAtNTAwLCAtMTAwMCwgLTMxMDB9OworCitjb25zdGV4cHIgaW50IGtBR0NDb21wTGV2ZWxzW10gPSB7MCwgLTMwMCwgLTUwMCwgLTEwMDAsIC05MDAwfTsKKworY29uc3RleHByIHNpemVfdCBrQUdDMkZpeGVkRGlnaXRhbEdhaW5zW10gPSB7MCwgMywgMTAsIDIwLCA0OX07CisKK2NvbnN0ZXhwciBzaXplX3Qga0FHQzJBZGFwdEdpZ2l0YWxMZXZlbEVzdGltYXRvcnNbXSA9IHswLCAxfTsKKworY29uc3RleHByIHNpemVfdCBrQUdDMkV4dHJhU2F0dXJhdGlvbk1hcmdpbnNbXSA9IHswLCAzLCAxMCwgMjAsIDEwMH07CisKK2NvbnN0ZXhwciBzaXplX3Qga0FFQ0VjaG9EZWxheXNbXSA9IHswLCAyNTAsIDUwMH07CisKK2NvbnN0ZXhwciBzaXplX3Qga05TTGV2ZWxzW10gPSB7MCwgMSwgMiwgM307CisKK3N0cnVjdCBBR0NQYXJhbXMgeworICAgIGludCB0YXJnZXRMZXZlbDsKKyAgICBpbnQgY29tcExldmVsOworfTsKKworc3RydWN0IEFHQzJQYXJhbXMgeworICAgIHNpemVfdCBmaXhlZERpZ2l0YWxHYWluOworICAgIHNpemVfdCBhZGFwdERpZ2lMZXZlbEVzdGltYXRvcjsKKyAgICBzaXplX3QgZXh0cmFTYXR1cmF0aW9uTWFyZ2luOworfTsKKworc3RydWN0IEFFQ1BhcmFtcyB7CisgICAgc2l6ZV90IGVjaG9EZWxheTsKK307CisKK3N0cnVjdCBOU1BhcmFtcyB7CisgICAgc2l6ZV90IGxldmVsOworfTsKKworc3RydWN0IFByZVByb2NQYXJhbXMgeworICAgIGNvbnN0IGVmZmVjdF91dWlkX3QqIHV1aWQ7CisgICAgdW5pb24geworICAgICAgICBBR0NQYXJhbXMgYWdjUGFyYW1zOworICAgICAgICBBR0MyUGFyYW1zIGFnYzJQYXJhbXM7CisgICAgICAgIEFFQ1BhcmFtcyBhZWNQYXJhbXM7CisgICAgICAgIE5TUGFyYW1zIG5zUGFyYW1zOworICAgIH07Cit9OworCisvLyBDcmVhdGUgYSBsaXN0IG9mIHByZS1wcm9jZXNzaW5nIHBhcmFtZXRlcnMgdG8gYmUgdXNlZCBmb3IgdGVzdGluZworc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPFByZVByb2NQYXJhbXM+IGtQcmVQcm9jUGFyYW1zID0gW10geworICAgIHN0ZDo6dmVjdG9yPFByZVByb2NQYXJhbXM+IHJlc3VsdDsKKworICAgIGZvciAoY29uc3QgYXV0byB0YXJnZXRMZXZlbCA6IGtBR0NUYXJnZXRMZXZlbHMpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIGNvbXBMZXZlbCA6IGtBR0NDb21wTGV2ZWxzKSB7CisgICAgICAgICAgICBBR0NQYXJhbXMgYWdjUGFyYW1zID0gey50YXJnZXRMZXZlbCA9IHRhcmdldExldmVsLCAuY29tcExldmVsID0gY29tcExldmVsfTsKKyAgICAgICAgICAgIFByZVByb2NQYXJhbXMgcGFyYW1zID0gey51dWlkID0gJmtBR0NVdWlkLCAuYWdjUGFyYW1zID0gYWdjUGFyYW1zfTsKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2socGFyYW1zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byBmaXhlZERpZ2l0YWxHYWluIDoga0FHQzJGaXhlZERpZ2l0YWxHYWlucykgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gYWRhcHREaWdpTGV2ZWxFc3RpbWF0b3IgOiBrQUdDMkFkYXB0R2lnaXRhbExldmVsRXN0aW1hdG9ycykgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvIGV4dHJhU2F0dXJhdGlvbk1hcmdpbiA6IGtBR0MyRXh0cmFTYXR1cmF0aW9uTWFyZ2lucykgeworICAgICAgICAgICAgICAgIEFHQzJQYXJhbXMgYWdjMlBhcmFtcyA9IHsuZml4ZWREaWdpdGFsR2FpbiA9IGZpeGVkRGlnaXRhbEdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGFwdERpZ2lMZXZlbEVzdGltYXRvciA9IGFkYXB0RGlnaUxldmVsRXN0aW1hdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXh0cmFTYXR1cmF0aW9uTWFyZ2luID0gZXh0cmFTYXR1cmF0aW9uTWFyZ2lufTsKKyAgICAgICAgICAgICAgICBQcmVQcm9jUGFyYW1zIHBhcmFtcyA9IHsudXVpZCA9ICZrQUdDMlV1aWQsIC5hZ2MyUGFyYW1zID0gYWdjMlBhcmFtc307CisgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhwYXJhbXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvIGVjaG9EZWxheSA6IGtBRUNFY2hvRGVsYXlzKSB7CisgICAgICAgIEFFQ1BhcmFtcyBhZWNQYXJhbXMgPSB7LmVjaG9EZWxheSA9IGVjaG9EZWxheX07CisgICAgICAgIFByZVByb2NQYXJhbXMgcGFyYW1zID0gey51dWlkID0gJmtBRUNVdWlkLCAuYWVjUGFyYW1zID0gYWVjUGFyYW1zfTsKKyAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhwYXJhbXMpOworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byBsZXZlbCA6IGtOU0xldmVscykgeworICAgICAgICBOU1BhcmFtcyBuc1BhcmFtcyA9IHsubGV2ZWwgPSBsZXZlbH07CisgICAgICAgIFByZVByb2NQYXJhbXMgcGFyYW1zID0gey51dWlkID0gJmtOU1V1aWQsIC5uc1BhcmFtcyA9IG5zUGFyYW1zfTsKKyAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhwYXJhbXMpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfSgpOworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1QcmVQcm9jUGFyYW1zID0gc3RkOjpzaXplKGtQcmVQcm9jUGFyYW1zKTsKKwordm9pZCBzZXRQcmVQcm9jUGFyYW1zKGNvbnN0IGVmZmVjdF91dWlkX3QqIHV1aWQsIEVmZmVjdFRlc3RIZWxwZXImIGVmZmVjdCwgc2l6ZV90IHBhcmFtSWR4KSB7CisgICAgY29uc3QgUHJlUHJvY1BhcmFtcyogcGFyYW1zID0gJmtQcmVQcm9jUGFyYW1zW3BhcmFtSWR4XTsKKyAgICBpZiAoaXNBR0NFZmZlY3QodXVpZCkpIHsKKyAgICAgICAgY29uc3QgQUdDUGFyYW1zKiBhZ2NQYXJhbXMgPSAmcGFyYW1zLT5hZ2NQYXJhbXM7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGVmZmVjdC5zZXRQYXJhbShBR0NfUEFSQU1fVEFSR0VUX0xFVkVMLCBhZ2NQYXJhbXMtPnRhcmdldExldmVsKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGVmZmVjdC5zZXRQYXJhbShBR0NfUEFSQU1fQ09NUF9HQUlOLCBhZ2NQYXJhbXMtPmNvbXBMZXZlbCkpOworICAgIH0gZWxzZSBpZiAoaXNBR0MyRWZmZWN0KHV1aWQpKSB7CisgICAgICAgIGNvbnN0IEFHQzJQYXJhbXMqIGFnYzJQYXJhbXMgPSAmcGFyYW1zLT5hZ2MyUGFyYW1zOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgICAgICBlZmZlY3Quc2V0UGFyYW0oQUdDMl9QQVJBTV9GSVhFRF9ESUdJVEFMX0dBSU4sIGFnYzJQYXJhbXMtPmZpeGVkRGlnaXRhbEdhaW4pKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZWZmZWN0LnNldFBhcmFtKEFHQzJfUEFSQU1fQURBUFRfRElHSV9MRVZFTF9FU1RJTUFUT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2MyUGFyYW1zLT5hZGFwdERpZ2lMZXZlbEVzdGltYXRvcikpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShlZmZlY3Quc2V0UGFyYW0oQUdDMl9QQVJBTV9BREFQVF9ESUdJX0VYVFJBX1NBVFVSQVRJT05fTUFSR0lOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdjMlBhcmFtcy0+ZXh0cmFTYXR1cmF0aW9uTWFyZ2luKSk7CisgICAgfSBlbHNlIGlmIChpc0FFQ0VmZmVjdCh1dWlkKSkgeworICAgICAgICBjb25zdCBBRUNQYXJhbXMqIGFlY1BhcmFtcyA9ICZwYXJhbXMtPmFlY1BhcmFtczsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZWZmZWN0LnNldFBhcmFtKEFFQ19QQVJBTV9FQ0hPX0RFTEFZLCBhZWNQYXJhbXMtPmVjaG9EZWxheSkpOworICAgIH0gZWxzZSBpZiAoaXNOU0VmZmVjdCh1dWlkKSkgeworICAgICAgICBjb25zdCBOU1BhcmFtcyogbnNQYXJhbXMgPSAmcGFyYW1zLT5uc1BhcmFtczsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZWZmZWN0LnNldFBhcmFtKE5TX1BBUkFNX0xFVkVMLCBuc1BhcmFtcy0+bGV2ZWwpKTsKKyAgICB9Cit9CisKK3R5cGVkZWYgc3RkOjp0dXBsZTxpbnQsIGludCwgaW50LCBpbnQ+IFNpbmdsZUVmZmVjdFRlc3RQYXJhbTsKK2NsYXNzIFNpbmdsZUVmZmVjdFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPFNpbmdsZUVmZmVjdFRlc3RQYXJhbT4geworICBwdWJsaWM6CisgICAgU2luZ2xlRWZmZWN0VGVzdCgpCisgICAgICAgIDogbVNhbXBsZVJhdGUoRWZmZWN0VGVzdEhlbHBlcjo6a1NhbXBsZVJhdGVzW3N0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpXSksCisgICAgICAgICAgbUZyYW1lQ291bnQobVNhbXBsZVJhdGUgKiBFZmZlY3RUZXN0SGVscGVyOjprVGVuTWlsbGlTZWNWYWwpLAorICAgICAgICAgIG1Mb29wQ291bnQoRWZmZWN0VGVzdEhlbHBlcjo6a0xvb3BDb3VudHNbc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSldKSwKKyAgICAgICAgICBtVG90YWxGcmFtZUNvdW50KG1GcmFtZUNvdW50ICogbUxvb3BDb3VudCksCisgICAgICAgICAgbUNoTWFzayhFZmZlY3RUZXN0SGVscGVyOjprQ2hNYXNrc1tzdGQ6OmdldDwwPihHZXRQYXJhbSgpKV0pLAorICAgICAgICAgIG1DaGFubmVsQ291bnQoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUNoTWFzaykpLAorICAgICAgICAgIG1QYXJhbUlkeChzdGQ6OmdldDwzPihHZXRQYXJhbSgpKSksCisgICAgICAgICAgbVV1aWQoa1ByZVByb2NQYXJhbXNbbVBhcmFtSWR4XS51dWlkKXt9OworCisgICAgY29uc3Qgc2l6ZV90IG1TYW1wbGVSYXRlOworICAgIGNvbnN0IHNpemVfdCBtRnJhbWVDb3VudDsKKyAgICBjb25zdCBzaXplX3QgbUxvb3BDb3VudDsKKyAgICBjb25zdCBzaXplX3QgbVRvdGFsRnJhbWVDb3VudDsKKyAgICBjb25zdCBzaXplX3QgbUNoTWFzazsKKyAgICBjb25zdCBzaXplX3QgbUNoYW5uZWxDb3VudDsKKyAgICBjb25zdCBzaXplX3QgbVBhcmFtSWR4OworICAgIGNvbnN0IGVmZmVjdF91dWlkX3QqIG1VdWlkOworfTsKKworLy8gVGVzdHMgYXBwbHlpbmcgYSBzaW5nbGUgZWZmZWN0CitURVNUX1AoU2luZ2xlRWZmZWN0VGVzdCwgU2ltcGxlUHJvY2VzcykgeworICAgIFNDT1BFRF9UUkFDRSh0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgIiBjaE1hc2s6ICIgPDwgbUNoTWFzayA8PCAiIHNhbXBsZVJhdGU6ICIgPDwgbVNhbXBsZVJhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgbG9vcENvdW50OiAiIDw8IG1Mb29wQ291bnQgPDwgIiBwYXJhbUlkeCAiIDw8IG1QYXJhbUlkeCk7CisKKyAgICBFZmZlY3RUZXN0SGVscGVyIGVmZmVjdChtVXVpZCwgbUNoTWFzaywgbVNhbXBsZVJhdGUsIG1Mb29wQ291bnQpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZWZmZWN0LmNyZWF0ZUVmZmVjdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShlZmZlY3Quc2V0Q29uZmlnKGlzQUVDRWZmZWN0KG1VdWlkKSkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHNldFByZVByb2NQYXJhbXMobVV1aWQsIGVmZmVjdCwgbVBhcmFtSWR4KSk7CisKKyAgICAvLyBJbml0aWFsaXplIGlucHV0IGJ1ZmZlciB3aXRoIGRldGVybWluaXN0aWMgcHNldWRvLXJhbmRvbSB2YWx1ZXMKKyAgICBzdGQ6OnZlY3RvcjxpbnQxNl90PiBpbnB1dChtVG90YWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8aW50MTZfdD4gb3V0cHV0KG1Ub3RhbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50KTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQxNl90PiBmYXJJbnB1dChtVG90YWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CisgICAgc3RkOjptaW5zdGRfcmFuZCBnZW4obUNoTWFzayk7CisgICAgc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248aW50MTZfdD4gZGlzKElOVDE2X01JTiwgSU5UMTZfTUFYKTsKKyAgICBmb3IgKGF1dG8mIGluIDogaW5wdXQpIHsKKyAgICAgICAgaW4gPSBkaXMoZ2VuKTsKKyAgICB9CisgICAgaWYgKGlzQUVDRWZmZWN0KG1VdWlkKSkgeworICAgICAgICBmb3IgKGF1dG8mIGZhckluIDogZmFySW5wdXQpIHsKKyAgICAgICAgICAgIGZhckluID0gZGlzKGdlbik7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZWZmZWN0LnByb2Nlc3MoaW5wdXQuZGF0YSgpLCBvdXRwdXQuZGF0YSgpLCBpc0FFQ0VmZmVjdChtVXVpZCkpKTsKKyAgICBpZiAoaXNBRUNFZmZlY3QobVV1aWQpKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGVmZmVjdC5wcm9jZXNzX3JldmVyc2UoZmFySW5wdXQuZGF0YSgpLCBvdXRwdXQuZGF0YSgpKSk7CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGVmZmVjdC5yZWxlYXNlRWZmZWN0KCkpOworfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIFByZVByb2NUZXN0QWxsLCBTaW5nbGVFZmZlY3RUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OkNvbWJpbmUoOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KUVmZmVjdFRlc3RIZWxwZXI6OmtOdW1DaE1hc2tzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClFZmZlY3RUZXN0SGVscGVyOjprTnVtU2FtcGxlUmF0ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KUVmZmVjdFRlc3RIZWxwZXI6OmtOdW1Mb29wQ291bnRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClrTnVtUHJlUHJvY1BhcmFtcykpKTsKKwordHlwZWRlZiBzdGQ6OnR1cGxlPGludCwgaW50LCBpbnQ+IFNpbmdsZUVmZmVjdENvbXBhcmlzb25UZXN0UGFyYW07CitjbGFzcyBTaW5nbGVFZmZlY3RDb21wYXJpc29uVGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxTaW5nbGVFZmZlY3RDb21wYXJpc29uVGVzdFBhcmFtPiB7CisgIHB1YmxpYzoKKyAgICBTaW5nbGVFZmZlY3RDb21wYXJpc29uVGVzdCgpCisgICAgICAgIDogbVNhbXBsZVJhdGUoRWZmZWN0VGVzdEhlbHBlcjo6a1NhbXBsZVJhdGVzW3N0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpXSksCisgICAgICAgICAgbUZyYW1lQ291bnQobVNhbXBsZVJhdGUgKiBFZmZlY3RUZXN0SGVscGVyOjprVGVuTWlsbGlTZWNWYWwpLAorICAgICAgICAgIG1Mb29wQ291bnQoRWZmZWN0VGVzdEhlbHBlcjo6a0xvb3BDb3VudHNbc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSldKSwKKyAgICAgICAgICBtVG90YWxGcmFtZUNvdW50KG1GcmFtZUNvdW50ICogbUxvb3BDb3VudCksCisgICAgICAgICAgbVBhcmFtSWR4KHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpKSwKKyAgICAgICAgICBtVXVpZChrUHJlUHJvY1BhcmFtc1ttUGFyYW1JZHhdLnV1aWQpe307CisKKyAgICBjb25zdCBzaXplX3QgbVNhbXBsZVJhdGU7CisgICAgY29uc3Qgc2l6ZV90IG1GcmFtZUNvdW50OworICAgIGNvbnN0IHNpemVfdCBtTG9vcENvdW50OworICAgIGNvbnN0IHNpemVfdCBtVG90YWxGcmFtZUNvdW50OworICAgIGNvbnN0IHNpemVfdCBtUGFyYW1JZHg7CisgICAgY29uc3QgZWZmZWN0X3V1aWRfdCogbVV1aWQ7Cit9OworCisvLyBDb21wYXJlcyBmaXJzdCBjaGFubmVsIGluIG11bHRpLWNoYW5uZWwgb3V0cHV0IHRvIG1vbm8gb3V0cHV0IHdoZW4gc2FtZSBlZmZlY3QgaXMgYXBwbGllZAorVEVTVF9QKFNpbmdsZUVmZmVjdENvbXBhcmlzb25UZXN0LCBTaW1wbGVQcm9jZXNzKSB7CisgICAgU0NPUEVEX1RSQUNFKHRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiIHNhbXBsZVJhdGU6ICIgPDwgbVNhbXBsZVJhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgbG9vcENvdW50OiAiIDw8IG1Mb29wQ291bnQgPDwgIiBwYXJhbUlkeCAiIDw8IG1QYXJhbUlkeCk7CisKKyAgICAvLyBJbml0aWFsaXplIG1vbm8gaW5wdXQgYnVmZmVyIHdpdGggZGV0ZXJtaW5pc3RpYyBwc2V1ZG8tcmFuZG9tIHZhbHVlcworICAgIHN0ZDo6dmVjdG9yPGludDE2X3Q+IG1vbm9JbnB1dChtVG90YWxGcmFtZUNvdW50KTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQxNl90PiBtb25vRmFySW5wdXQobVRvdGFsRnJhbWVDb3VudCk7CisKKyAgICBzdGQ6Om1pbnN0ZF9yYW5kIGdlbihtU2FtcGxlUmF0ZSk7CisgICAgc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248aW50MTZfdD4gZGlzKElOVDE2X01JTiwgSU5UMTZfTUFYKTsKKyAgICBmb3IgKGF1dG8mIGluIDogbW9ub0lucHV0KSB7CisgICAgICAgIGluID0gZGlzKGdlbik7CisgICAgfQorICAgIGlmIChpc0FFQ0VmZmVjdChtVXVpZCkpIHsKKyAgICAgICAgZm9yIChhdXRvJiBmYXJJbiA6IG1vbm9GYXJJbnB1dCkgeworICAgICAgICAgICAgZmFySW4gPSBkaXMoZ2VuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFwcGx5IGVmZmVjdCBvbiBtb25vIGNoYW5uZWwKKyAgICBFZmZlY3RUZXN0SGVscGVyIG1vbm9FZmZlY3QobVV1aWQsIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xLCBtU2FtcGxlUmF0ZSwgbUxvb3BDb3VudCk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShtb25vRWZmZWN0LmNyZWF0ZUVmZmVjdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShtb25vRWZmZWN0LnNldENvbmZpZyhpc0FFQ0VmZmVjdChtVXVpZCkpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzZXRQcmVQcm9jUGFyYW1zKG1VdWlkLCBtb25vRWZmZWN0LCBtUGFyYW1JZHgpKTsKKworICAgIHN0ZDo6dmVjdG9yPGludDE2X3Q+IG1vbm9PdXRwdXQobVRvdGFsRnJhbWVDb3VudCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBtb25vRWZmZWN0LnByb2Nlc3MobW9ub0lucHV0LmRhdGEoKSwgbW9ub091dHB1dC5kYXRhKCksIGlzQUVDRWZmZWN0KG1VdWlkKSkpOworICAgIGlmIChpc0FFQ0VmZmVjdChtVXVpZCkpIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUobW9ub0VmZmVjdC5wcm9jZXNzX3JldmVyc2UobW9ub0ZhcklucHV0LmRhdGEoKSwgbW9ub091dHB1dC5kYXRhKCkpKTsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUobW9ub0VmZmVjdC5yZWxlYXNlRWZmZWN0KCkpOworCisgICAgZm9yIChzaXplX3QgY2hNYXNrIDogRWZmZWN0VGVzdEhlbHBlcjo6a0NoTWFza3MpIHsKKyAgICAgICAgc2l6ZV90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoTWFzayk7CisKKyAgICAgICAgRWZmZWN0VGVzdEhlbHBlciB0ZXN0RWZmZWN0KG1VdWlkLCBjaE1hc2ssIG1TYW1wbGVSYXRlLCBtTG9vcENvdW50KTsKKworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh0ZXN0RWZmZWN0LmNyZWF0ZUVmZmVjdCgpKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodGVzdEVmZmVjdC5zZXRDb25maWcoaXNBRUNFZmZlY3QobVV1aWQpKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHNldFByZVByb2NQYXJhbXMobVV1aWQsIHRlc3RFZmZlY3QsIG1QYXJhbUlkeCkpOworCisgICAgICAgIHN0ZDo6dmVjdG9yPGludDE2X3Q+IHRlc3RJbnB1dChtVG90YWxGcmFtZUNvdW50ICogY2hhbm5lbENvdW50KTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MTZfdD4gdGVzdEZhcklucHV0KG1Ub3RhbEZyYW1lQ291bnQgKiBjaGFubmVsQ291bnQpOworCisgICAgICAgIC8vIFJlcGVhdCBtb25vIGNoYW5uZWwgZGF0YSB0byBhbGwgdGhlIGNoYW5uZWxzCisgICAgICAgIC8vIGFkanVzdF9jaGFubmVscygpIHplcm8gZmlsbHMgY2hhbm5lbHMgPiAyLCBoZW5jZSBjYW4ndCBiZSB1c2VkIGhlcmUKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVG90YWxGcmFtZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGF1dG8qIGZwSW5wdXQgPSAmdGVzdElucHV0W2kgKiBjaGFubmVsQ291bnRdOworICAgICAgICAgICAgc3RkOjpmaWxsKGZwSW5wdXQsIGZwSW5wdXQgKyBjaGFubmVsQ291bnQsIG1vbm9JbnB1dFtpXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzQUVDRWZmZWN0KG1VdWlkKSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVG90YWxGcmFtZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBhdXRvKiBmcEZhcklucHV0ID0gJnRlc3RGYXJJbnB1dFtpICogY2hhbm5lbENvdW50XTsKKyAgICAgICAgICAgICAgICBzdGQ6OmZpbGwoZnBGYXJJbnB1dCwgZnBGYXJJbnB1dCArIGNoYW5uZWxDb3VudCwgbW9ub0ZhcklucHV0W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPGludDE2X3Q+IHRlc3RPdXRwdXQobVRvdGFsRnJhbWVDb3VudCAqIGNoYW5uZWxDb3VudCk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgICAgIHRlc3RFZmZlY3QucHJvY2Vzcyh0ZXN0SW5wdXQuZGF0YSgpLCB0ZXN0T3V0cHV0LmRhdGEoKSwgaXNBRUNFZmZlY3QobVV1aWQpKSk7CisgICAgICAgIGlmIChpc0FFQ0VmZmVjdChtVXVpZCkpIHsKKyAgICAgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgICAgICAgICB0ZXN0RWZmZWN0LnByb2Nlc3NfcmV2ZXJzZSh0ZXN0RmFySW5wdXQuZGF0YSgpLCB0ZXN0T3V0cHV0LmRhdGEoKSkpOworICAgICAgICB9CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHRlc3RFZmZlY3QucmVsZWFzZUVmZmVjdCgpKTsKKworICAgICAgICAvLyBBZGp1c3QgdGhlIHRlc3Qgb3V0cHV0IHRvIG1vbm8gY2hhbm5lbAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQxNl90PiBtb25vVGVzdE91dHB1dChtVG90YWxGcmFtZUNvdW50KTsKKyAgICAgICAgYWRqdXN0X2NoYW5uZWxzKHRlc3RPdXRwdXQuZGF0YSgpLCBjaGFubmVsQ291bnQsIG1vbm9UZXN0T3V0cHV0LmRhdGEoKSwgRkNDXzEsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50MTZfdCksIG1Ub3RhbEZyYW1lQ291bnQgKiBzaXplb2YoaW50MTZfdCkgKiBjaGFubmVsQ291bnQpOworCisgICAgICAgIEFTU0VSVF9FUSgwLCBtZW1jbXAobW9ub091dHB1dC5kYXRhKCksIG1vbm9UZXN0T3V0cHV0LmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG90YWxGcmFtZUNvdW50ICogc2l6ZW9mKGludDE2X3QpKSkKKyAgICAgICAgICAgICAgICA8PCAiTW9ubyBjaGFubmVsIG91dHB1dCBkb2VzIG5vdCBtYXRjaCB3aXRoIHJlZmVyZW5jZSBvdXRwdXQgXG4iOworICAgIH0KK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBQcmVQcm9jVGVzdEFsbCwgU2luZ2xlRWZmZWN0Q29tcGFyaXNvblRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6Q29tYmluZSg6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpRWZmZWN0VGVzdEhlbHBlcjo6a051bVNhbXBsZVJhdGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClFZmZlY3RUZXN0SGVscGVyOjprTnVtTG9vcENvdW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpa051bVByZVByb2NQYXJhbXMpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgQUxPR1YoIlRlc3QgcmVzdWx0ID0gJWQiLCBzdGF0dXMpOworICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvdGVzdHMvRWZmZWN0VGVzdEhlbHBlci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvdGVzdHMvRWZmZWN0VGVzdEhlbHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyMDBiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9FZmZlY3RUZXN0SGVscGVyLmNwcApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiRWZmZWN0VGVzdEhlbHBlci5oIgorZXh0ZXJuIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU07CisKK3ZvaWQgRWZmZWN0VGVzdEhlbHBlcjo6Y3JlYXRlRWZmZWN0KCkgeworICAgIGludCBzdGF0dXMgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTS5jcmVhdGVfZWZmZWN0KG1VdWlkLCAxLCAxLCAmbUVmZmVjdEhhbmRsZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgImNyZWF0ZV9lZmZlY3QgcmV0dXJuZWQgYW4gZXJyb3IgIiA8PCBzdGF0dXM7Cit9CisKK3ZvaWQgRWZmZWN0VGVzdEhlbHBlcjo6cmVsZWFzZUVmZmVjdCgpIHsKKyAgICBpbnQgc3RhdHVzID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0ucmVsZWFzZV9lZmZlY3QobUVmZmVjdEhhbmRsZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgInJlbGVhc2VfZWZmZWN0IHJldHVybmVkIGFuIGVycm9yICIgPDwgc3RhdHVzOworfQorCit2b2lkIEVmZmVjdFRlc3RIZWxwZXI6OnNldENvbmZpZyhib29sIGNvbmZpZ1JldmVyc2UpIHsKKyAgICBlZmZlY3RfY29uZmlnX3QgY29uZmlne307CisgICAgY29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gbVNhbXBsZVJhdGU7CisgICAgY29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IG1DaE1hc2s7CisgICAgY29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisKKyAgICBpbnQgcmVwbHkgPSAwOworICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihyZXBseSk7CisKKyAgICBpbnQgc3RhdHVzID0gKCptRWZmZWN0SGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgIC0+Y29tbWFuZChtRWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUcsIHNpemVvZihlZmZlY3RfY29uZmlnX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLCAmcmVwbHlTaXplLCAmcmVwbHkpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJzZXRfY29uZmlnIHJldHVybmVkIGFuIGVycm9yICIgPDwgc3RhdHVzOworICAgIEFTU0VSVF9FUShyZXBseSwgMCkgPDwgInNldF9jb25maWcgcmVwbHkgbm9uIHplcm8gIiA8PCByZXBseTsKKworICAgIGlmIChjb25maWdSZXZlcnNlKSB7CisgICAgICAgIGludCBzdGF0dXMgPSAoKm1FZmZlY3RIYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Y29tbWFuZChtRWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfY29uZmlnX3QpLCAmY29uZmlnLCAmcmVwbHlTaXplLCAmcmVwbHkpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAic2V0X2NvbmZpZ19yZXZlcnNlIHJldHVybmVkIGFuIGVycm9yICIgPDwgc3RhdHVzOworICAgICAgICBBU1NFUlRfRVEocmVwbHksIDApIDw8ICJzZXRfY29uZmlnX3JldmVyc2UgcmVwbHkgbm9uIHplcm8gIiA8PCByZXBseTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSAoKm1FZmZlY3RIYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAtPmNvbW1hbmQobUVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9FTkFCTEUsIDAsIG51bGxwdHIsICZyZXBseVNpemUsICZyZXBseSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgImNtZF9lbmFibGUgcmV0dXJuZWQgYW4gZXJyb3IgIiA8PCBzdGF0dXM7CisgICAgQVNTRVJUX0VRKHJlcGx5LCAwKSA8PCAiY21kX2VuYWJsZSByZXBseSBub24gemVybyAiIDw8IHJlcGx5OworfQorCit2b2lkIEVmZmVjdFRlc3RIZWxwZXI6OnNldFBhcmFtKHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IHZhbHVlKSB7CisgICAgaW50IHJlcGx5ID0gMDsKKyAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAgIHVpbnQzMl90IHBhcmFtRGF0YVsyXSA9IHt0eXBlLCB2YWx1ZX07CisgICAgYXV0byBlZmZlY3RQYXJhbSA9IChlZmZlY3RfcGFyYW1fdCopbWFsbG9jKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YocGFyYW1EYXRhKSk7CisgICAgbWVtY3B5KCZlZmZlY3RQYXJhbS0+ZGF0YVswXSwgJnBhcmFtRGF0YVswXSwgc2l6ZW9mKHBhcmFtRGF0YSkpOworICAgIGVmZmVjdFBhcmFtLT5wc2l6ZSA9IHNpemVvZihwYXJhbURhdGFbMF0pOworICAgIGVmZmVjdFBhcmFtLT52c2l6ZSA9IHNpemVvZihwYXJhbURhdGFbMV0pOworICAgIGludCBzdGF0dXMgPSAoKm1FZmZlY3RIYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgLT5jb21tYW5kKG1FZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKHBhcmFtRGF0YSksIGVmZmVjdFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHlTaXplLCAmcmVwbHkpOworICAgIGZyZWUoZWZmZWN0UGFyYW0pOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJzZXRfcGFyYW0gcmV0dXJuZWQgYW4gZXJyb3IgIiA8PCBzdGF0dXM7CisgICAgQVNTRVJUX0VRKHJlcGx5LCAwKSA8PCAic2V0X3BhcmFtIHJlcGx5IG5vbiB6ZXJvICIgPDwgcmVwbHk7Cit9CisKK3ZvaWQgRWZmZWN0VGVzdEhlbHBlcjo6cHJvY2VzcyhpbnQxNl90KiBpbnB1dCwgaW50MTZfdCogb3V0cHV0LCBib29sIHNldEFlY0VjaG9EZWxheSkgeworICAgIGF1ZGlvX2J1ZmZlcl90IGluQnVmZmVyID0gey5mcmFtZUNvdW50ID0gbUZyYW1lQ291bnQsIC5zMTYgPSBpbnB1dH07CisgICAgYXVkaW9fYnVmZmVyX3Qgb3V0QnVmZmVyID0gey5mcmFtZUNvdW50ID0gbUZyYW1lQ291bnQsIC5zMTYgPSBvdXRwdXR9OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUxvb3BDb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChzZXRBZWNFY2hvRGVsYXkpIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHNldFBhcmFtKEFFQ19QQVJBTV9FQ0hPX0RFTEFZLCBrQUVDRGVsYXkpKTsKKyAgICAgICAgaW50IHN0YXR1cyA9ICgqbUVmZmVjdEhhbmRsZSktPnByb2Nlc3MobUVmZmVjdEhhbmRsZSwgJmluQnVmZmVyLCAmb3V0QnVmZmVyKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgInByb2Nlc3MgcmV0dXJuZWQgYW4gZXJyb3IgIiA8PCBzdGF0dXM7CisKKyAgICAgICAgaW5CdWZmZXIuczE2ICs9IG1GcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudDsKKyAgICAgICAgb3V0QnVmZmVyLnMxNiArPSBtRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQ7CisgICAgfQorfQorCit2b2lkIEVmZmVjdFRlc3RIZWxwZXI6OnByb2Nlc3NfcmV2ZXJzZShpbnQxNl90KiBmYXJJbnB1dCwgaW50MTZfdCogb3V0cHV0KSB7CisgICAgYXVkaW9fYnVmZmVyX3QgZmFySW5CdWZmZXIgPSB7LmZyYW1lQ291bnQgPSBtRnJhbWVDb3VudCwgLnMxNiA9IGZhcklucHV0fTsKKyAgICBhdWRpb19idWZmZXJfdCBvdXRCdWZmZXIgPSB7LmZyYW1lQ291bnQgPSBtRnJhbWVDb3VudCwgLnMxNiA9IG91dHB1dH07CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTG9vcENvdW50OyBpKyspIHsKKyAgICAgICAgaW50IHN0YXR1cyA9ICgqbUVmZmVjdEhhbmRsZSktPnByb2Nlc3NfcmV2ZXJzZShtRWZmZWN0SGFuZGxlLCAmZmFySW5CdWZmZXIsICZvdXRCdWZmZXIpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAicHJvY2VzcyByZXR1cm5lZCBhbiBlcnJvciAiIDw8IHN0YXR1czsKKworICAgICAgICBmYXJJbkJ1ZmZlci5zMTYgKz0gbUZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50OworICAgICAgICBvdXRCdWZmZXIuczE2ICs9IG1GcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvdGVzdHMvRWZmZWN0VGVzdEhlbHBlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL0VmZmVjdFRlc3RIZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTdjZjdiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL0VmZmVjdFRlc3RIZWxwZXIuaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8cmFuZG9tPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgZmxvYXQgY29tcHV0ZVNucihjb25zdCBUKiByZWYsIGNvbnN0IFQqIHRzdCwgc2l6ZV90IGNvdW50KSB7CisgICAgZG91YmxlIHNpZ25hbHt9OworICAgIGRvdWJsZSBub2lzZXt9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgIGNvbnN0IGRvdWJsZSB2YWx1ZShyZWZbaV0pOworICAgICAgICBjb25zdCBkb3VibGUgZGlmZih0c3RbaV0gLSB2YWx1ZSk7CisgICAgICAgIHNpZ25hbCArPSB2YWx1ZSAqIHZhbHVlOworICAgICAgICBub2lzZSArPSBkaWZmICogZGlmZjsKKyAgICB9CisgICAgLy8gSW5pdGlhbGl6ZWQgdG8gbGFyZ2UgdmFsdWUgdG8gaGFuZGxlCisgICAgLy8gY2FzZXMgd2hlcmUgcmVmIGFuZCB0c3QgbWF0Y2ggZXhhY3RseQorICAgIGZsb2F0IHNuciA9IEZMVF9NQVg7CisgICAgaWYgKHNpZ25hbCA+IDAuMGYgJiYgbm9pc2UgPiAwLjBmKSB7CisgICAgICAgIHNuciA9IDEwLmYgKiBsb2coc2lnbmFsIC8gbm9pc2UpOworICAgIH0KKyAgICByZXR1cm4gc25yOworfQorCitjbGFzcyBFZmZlY3RUZXN0SGVscGVyIHsKKyAgcHVibGljOgorICAgIEVmZmVjdFRlc3RIZWxwZXIoY29uc3QgZWZmZWN0X3V1aWRfdCogdXVpZCwgc2l6ZV90IGNoTWFzaywgc2l6ZV90IHNhbXBsZVJhdGUsIHNpemVfdCBsb29wQ291bnQpCisgICAgICAgIDogbVV1aWQodXVpZCksCisgICAgICAgICAgbUNoTWFzayhjaE1hc2spLAorICAgICAgICAgIG1DaGFubmVsQ291bnQoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUNoTWFzaykpLAorICAgICAgICAgIG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpLAorICAgICAgICAgIG1GcmFtZUNvdW50KG1TYW1wbGVSYXRlICoga1Rlbk1pbGxpU2VjVmFsKSwKKyAgICAgICAgICBtTG9vcENvdW50KGxvb3BDb3VudCkge30KKyAgICB2b2lkIGNyZWF0ZUVmZmVjdCgpOworICAgIHZvaWQgcmVsZWFzZUVmZmVjdCgpOworICAgIHZvaWQgc2V0Q29uZmlnKGJvb2wgY29uZmlnUmV2ZXJzZSk7CisgICAgdm9pZCBzZXRQYXJhbSh1aW50MzJfdCB0eXBlLCB1aW50MzJfdCB2YWwpOworICAgIHZvaWQgcHJvY2VzcyhpbnQxNl90KiBpbnB1dCwgaW50MTZfdCogb3V0cHV0LCBib29sIHNldEFlY0VjaG9EZWxheSk7CisgICAgdm9pZCBwcm9jZXNzX3JldmVyc2UoaW50MTZfdCogZmFySW5wdXQsIGludDE2X3QqIG91dHB1dCk7CisKKyAgICAvLyBDb3JyZXNwb25kcyB0byBTTlIgZm9yIDEgYml0IGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gaW50MTZfdCBzaWduYWxzCisgICAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBrU05SVGhyZXNob2xkID0gOTAuMzA4OTk4OworCisgICAgc3RhdGljIGNvbnN0ZXhwciBhdWRpb19jaGFubmVsX21hc2tfdCBrQ2hNYXNrc1tdID0geworICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9NT05PLAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8sCisgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0ssCisgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOXzYsCisgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOXzJQT0lOVDBQT0lOVDIsCisgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOXzJQT0lOVDFQT0lOVDIsCisgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOXzNQT0lOVDBQT0lOVDIsCisgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOXzNQT0lOVDFQT0lOVDIsCisgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOXzVQT0lOVDEsCisgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOS19NT05PLAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTktfTU9OTywKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfQ0FMTF9NT05PLAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IGtUZW5NaWxsaVNlY1ZhbCA9IDAuMDE7CisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTnVtQ2hNYXNrcyA9IHN0ZDo6c2l6ZShrQ2hNYXNrcyk7CisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrU2FtcGxlUmF0ZXNbXSA9IHs4MDAwLCAgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDB9OworCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga051bVNhbXBsZVJhdGVzID0gc3RkOjpzaXplKGtTYW1wbGVSYXRlcyk7CisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTG9vcENvdW50c1tdID0gezEsIDR9OworCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga051bUxvb3BDb3VudHMgPSBzdGQ6OnNpemUoa0xvb3BDb3VudHMpOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0FFQ0RlbGF5ID0gMDsKKworICBwcml2YXRlOgorICAgIGNvbnN0IGVmZmVjdF91dWlkX3QqIG1VdWlkOworICAgIGNvbnN0IHNpemVfdCBtQ2hNYXNrOworICAgIGNvbnN0IHNpemVfdCBtQ2hhbm5lbENvdW50OworICAgIGNvbnN0IHNpemVfdCBtU2FtcGxlUmF0ZTsKKyAgICBjb25zdCBzaXplX3QgbUZyYW1lQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90IG1Mb29wQ291bnQ7CisgICAgZWZmZWN0X2hhbmRsZV90IG1FZmZlY3RIYW5kbGV7fTsKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvdGVzdHMvUHJlUHJvY2Vzc2luZ1Rlc3QuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL1ByZVByb2Nlc3NpbmdUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmQ5M2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL1ByZVByb2Nlc3NpbmdUZXN0LmNwcApAQCAtMCwwICsxLDUzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X2FlYy5oPgorI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X2FnYy5oPgorI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X2FnYzIuaD4KKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9ucy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGltcG9ydGVkCitleHRlcm4gYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGRlZmluaXRpb25zCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyB0eXBlcyBvZiBwcmUgcHJvY2Vzc2luZyBtb2R1bGVzCitlbnVtIFByZVByb2NJZCB7CisgICAgUFJFUFJPQ19BR0MsICAvLyBBdXRvbWF0aWMgR2FpbiBDb250cm9sCisgICAgUFJFUFJPQ19BR0MyLCAgLy8gQXV0b21hdGljIEdhaW4gQ29udHJvbCAyCisgICAgUFJFUFJPQ19BRUMsICAvLyBBY291c3RpYyBFY2hvIENhbmNlbGVyCisgICAgUFJFUFJPQ19OUywgICAvLyBOb2lzZSBTdXBwcmVzc29yCisgICAgUFJFUFJPQ19OVU1fRUZGRUNUUworfTsKKworZW51bSBQcmVQcm9jUGFyYW1zIHsKKyAgICBBUkdfSEVMUCA9IDEsCisgICAgQVJHX0lOUFVULAorICAgIEFSR19PVVRQVVQsCisgICAgQVJHX0ZBUiwKKyAgICBBUkdfRlMsCisgICAgQVJHX0NIX01BU0ssCisgICAgQVJHX0FHQ19UR1RfTFZMLAorICAgIEFSR19BR0NfQ09NUF9MVkwsCisgICAgQVJHX0FFQ19ERUxBWSwKKyAgICBBUkdfTlNfTFZMLAorICAgIEFSR19BR0MyX0dBSU4sCisgICAgQVJHX0FHQzJfTFZMLAorICAgIEFSR19BR0MyX1NBVF9NR04sCisgICAgQVJHX0ZJTEVfQ0hBTk5FTFMsCisgICAgQVJHX01PTk9fTU9ERQorfTsKKworc3RydWN0IHByZVByb2NDb25maWdQYXJhbXNfdCB7CisgICAgaW50IHNhbXBsaW5nRnJlcSA9IDE2MDAwOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fTU9OTzsKKyAgICBpbnQgbnNMZXZlbCA9IDA7ICAgICAgICAgLy8gYSB2YWx1ZSBiZXR3ZWVuIDAtMworICAgIGludCBhZ2NUYXJnZXRMZXZlbCA9IDM7ICAvLyBpbiBkQgorICAgIGludCBhZ2NDb21wTGV2ZWwgPSA5OyAgICAvLyBpbiBkQgorICAgIGZsb2F0IGFnYzJHYWluID0gMC5mOyAgICAgICAgICAgICAgLy8gaW4gZEIKKyAgICBmbG9hdCBhZ2MyU2F0dXJhdGlvbk1hcmdpbiA9IDIuZjsgIC8vIGluIGRCCisgICAgaW50IGFnYzJMZXZlbCA9IDA7ICAgICAgICAgICAgICAgICAvLyBlaXRoZXIga1JtcygwKSBvciBrUGVhaygxKQorICAgIGludCBhZWNEZWxheSA9IDA7ICAvLyBpbiBtcworICAgIGludCBmaWxlQ2hhbm5lbHMgPSAxOworICAgIGludCBtb25vTW9kZSA9IDA7Cit9OworCitjb25zdCBlZmZlY3RfdXVpZF90IGtQcmVQcm9jVXVpZHNbUFJFUFJPQ19OVU1fRUZGRUNUU10gPSB7CisgICAgICAgIHsweGFhODEzMGUwLCAweDY2ZmMsIDB4MTFlMCwgMHhiYWQwLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gYWdjIHV1aWQKKyAgICAgICAgezB4ODlmMzhlNjUsIDB4ZDRkMiwgMHg0ZDY0LCAweGFkMGUsIHsweDJiLCAweDNlLCAweDc5LCAweDllLCAweGE4LCAweDg2fX0sICAvLyBhZ2MyIHV1aWQKKyAgICAgICAgezB4YmIzOTJlYzAsIDB4OGQ0ZCwgMHgxMWUwLCAweGE4OTYsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyBhZWMgdXVpZAorICAgICAgICB7MHhjMDZjODQwMCwgMHg4ZTA2LCAweDExZTAsIDB4OWNiNiwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgIC8vIG5zICB1dWlkCit9OworCitjb25zdGV4cHIgYXVkaW9fY2hhbm5lbF9tYXNrX3Qga1ByZVByb2NDb25maWdDaE1hc2tbXSA9IHsKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9NT05PLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOX1NURVJFTywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOXzYsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fMlBPSU5UMFBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl8yUE9JTlQxUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOXzNQT0lOVDBQT0lOVDIsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fM1BPSU5UMVBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl81UE9JTlQxLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOS19NT05PLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOS19NT05PLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0NBTExfTU9OTywKK307CisKK2NvbnN0ZXhwciBpbnQga1ByZVByb2NDb25maWdDaE1hc2tDb3VudCA9IHN0ZDo6c2l6ZShrUHJlUHJvY0NvbmZpZ0NoTWFzayk7CisKK3ZvaWQgcHJpbnRVc2FnZSgpIHsKKyAgICBwcmludGYoIlxuVXNhZ2U6ICIpOworICAgIHByaW50ZigiXG4gICAgIDxleGVjdXRhYmxlPiBbb3B0aW9uc11cbiIpOworICAgIHByaW50ZigiXG53aGVyZSBvcHRpb25zIGFyZSwgIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1pbnB1dCA8aW5wdXRmaWxlPiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIHBhdGggdG8gdGhlIGlucHV0IGZpbGUiKTsKKyAgICBwcmludGYoIlxuICAgICAtLW91dHB1dCA8b3V0cHV0ZmlsZT4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBwYXRoIHRvIHRoZSBvdXRwdXQgZmlsZSIpOworICAgIHByaW50ZigiXG4gICAgIC0taGVscCIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIFByaW50cyB0aGlzIHVzYWdlIGluZm9ybWF0aW9uIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1mcyA8c2FtcGxpbmdfZnJlcT4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBTYW1wbGluZyBmcmVxdWVuY3kgaW4gSHosIGRlZmF1bHQgMTYwMDAuIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1jaF9tYXNrIDxjaGFubmVsX21hc2s+XG4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMCAgLSBBVURJT19DSEFOTkVMX0lOX01PTk8iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMSAgLSBBVURJT19DSEFOTkVMX0lOX1NURVJFTyIpOworICAgIHByaW50ZigiXG4gICAgICAgICAyICAtIEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyIpOworICAgIHByaW50ZigiXG4gICAgICAgICAzICAtIEFVRElPX0NIQU5ORUxfSU5fNiIpOworICAgIHByaW50ZigiXG4gICAgICAgICA0ICAtIEFVRElPX0NIQU5ORUxfSU5fMlBPSU5UMFBPSU5UMiIpOworICAgIHByaW50ZigiXG4gICAgICAgICA1ICAtIEFVRElPX0NIQU5ORUxfSU5fMlBPSU5UMVBPSU5UMiIpOworICAgIHByaW50ZigiXG4gICAgICAgICA2ICAtIEFVRElPX0NIQU5ORUxfSU5fM1BPSU5UMFBPSU5UMiIpOworICAgIHByaW50ZigiXG4gICAgICAgICA3ICAtIEFVRElPX0NIQU5ORUxfSU5fM1BPSU5UMVBPSU5UMiIpOworICAgIHByaW50ZigiXG4gICAgICAgICA4ICAtIEFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICA5ICAtIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LX01PTk8iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMTAgLSBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOS19NT05PICIpOworICAgIHByaW50ZigiXG4gICAgICAgICAxMSAtIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfQ0FMTF9NT05PICIpOworICAgIHByaW50ZigiXG4gICAgICAgICBkZWZhdWx0IDAiKTsKKyAgICBwcmludGYoIlxuICAgICAtLWZhciA8ZmFyZW5kX2ZpbGU+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgUGF0aCB0byBmYXItZW5kIGZpbGUgbmVlZGVkIGZvciBlY2hvIGNhbmNlbGxhdGlvbiIpOworICAgIHByaW50ZigiXG4gICAgIC0tYWVjIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIEVjaG8gQ2FuY2VsbGF0aW9uLCBkZWZhdWx0IGRpc2FibGVkIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1ucyIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBOb2lzZSBTdXBwcmVzc2lvbiwgZGVmYXVsdCBkaXNhYmxlZCIpOworICAgIHByaW50ZigiXG4gICAgIC0tYWdjIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIEdhaW4gQ29udHJvbCwgZGVmYXVsdCBkaXNhYmxlZCIpOworICAgIHByaW50ZigiXG4gICAgIC0tYWdjMiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBHYWluIENvbnRyb2xsZXIgMiwgZGVmYXVsdCBkaXNhYmxlZCIpOworICAgIHByaW50ZigiXG4gICAgIC0tbnNfbHZsIDxuc19sZXZlbD4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBOb2lzZSBTdXBwcmVzc2lvbiBsZXZlbCBpbiBkQiwgZGVmYXVsdCB2YWx1ZSAwZEIiKTsKKyAgICBwcmludGYoIlxuICAgICAtLWFnY190Z3RfbHZsIDx0YXJnZXRfbGV2ZWw+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgQUdDIFRhcmdldCBMZXZlbCBpbiBkQiwgZGVmYXVsdCB2YWx1ZSAzZEIiKTsKKyAgICBwcmludGYoIlxuICAgICAtLWFnY19jb21wX2x2bCA8Y29tcF9sZXZlbD4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBBR0MgQ29tcCBMZXZlbCBpbiBkQiwgZGVmYXVsdCB2YWx1ZSA5ZEIiKTsKKyAgICBwcmludGYoIlxuICAgICAtLWFnYzJfZ2FpbiA8Zml4ZWRfZGlnaXRhbF9nYWluPiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEFHQyBGaXhlZCBEaWdpdGFsIEdhaW4gaW4gZEIsIGRlZmF1bHQgdmFsdWUgMGRCIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1hZ2MyX2x2bCA8bGV2ZWxfZXN0aW1hdG9yPiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEFHQyBBZGFwdGl2ZSBEaWdpdGFsIExldmVsIEVzdGltYXRvciwgZGVmYXVsdCB2YWx1ZSBrUm1zIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1hZ2MyX3NhdF9tZ24gPHNhdHVyYXRpb25fbWFyZ2luPiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEFHQyBBZGFwdGl2ZSBEaWdpdGFsIFNhdHVyYXRpb24gTWFyZ2luIGluIGRCLCBkZWZhdWx0IHZhbHVlIDJkQiIpOworICAgIHByaW50ZigiXG4gICAgIC0tYWVjX2RlbGF5IDxkZWxheT4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBBRUMgZGVsYXkgdmFsdWUgaW4gbXMsIGRlZmF1bHQgdmFsdWUgMG1zIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1mY2ggPGZpbGVDaGFubmVscz4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBudW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGlucHV0IGZpbGUiKTsKKyAgICBwcmludGYoIlxuICAgICAtLW1vbm8gPE1vbm8gTW9kZT4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBNb2RlIHRvIG1ha2UgZGF0YSBvZiBhbGwgY2hhbm5lbHMgdGhlIHNhbWUgYXMgZmlyc3QgY2hhbm5lbCIpOworICAgIHByaW50ZigiXG4iKTsKK30KKworY29uc3RleHByIGZsb2F0IGtUZW5NaWxsaVNlY1ZhbCA9IDAuMDE7CisKK2ludCBwcmVQcm9jQ3JlYXRlRWZmZWN0KGVmZmVjdF9oYW5kbGVfdCogcEVmZmVjdEhhbmRsZSwgdWludDMyX3QgZWZmZWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jb25maWdfdCogcENvbmZpZywgaW50IHNlc3Npb25JZCwgaW50IGlvSWQpIHsKKyAgICBpZiAoaW50IHN0YXR1cyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLmNyZWF0ZV9lZmZlY3QoJmtQcmVQcm9jVXVpZHNbZWZmZWN0VHlwZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgaW9JZCwgcEVmZmVjdEhhbmRsZSk7CisgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJBdWRpbyBQcmVwcm9jZXNzaW5nIGNyZWF0ZSByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICBpbnQgcmVwbHkgPSAwOworICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihyZXBseSk7CisgICAgaWYgKGVmZmVjdFR5cGUgPT0gUFJFUFJPQ19BRUMpIHsKKyAgICAgICAgKCoqcEVmZmVjdEhhbmRsZSkKKyAgICAgICAgICAgICAgICAtPmNvbW1hbmQoKnBFZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX0NPTkZJR19SRVZFUlNFLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbmZpZywgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICB9CisgICAgKCoqcEVmZmVjdEhhbmRsZSkKKyAgICAgICAgICAgIC0+Y29tbWFuZCgqcEVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfQ09ORklHLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwgcENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAmcmVwbHlTaXplLCAmcmVwbHkpOworICAgIHJldHVybiByZXBseTsKK30KKworaW50IHByZVByb2NTZXRDb25maWdQYXJhbSh1aW50MzJfdCBwYXJhbVR5cGUsIHVpbnQzMl90IHBhcmFtVmFsdWUsIGVmZmVjdF9oYW5kbGVfdCBlZmZlY3RIYW5kbGUpIHsKKyAgICBpbnQgcmVwbHkgPSAwOworICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihyZXBseSk7CisgICAgdWludDMyX3QgcGFyYW1EYXRhWzJdID0ge3BhcmFtVHlwZSwgcGFyYW1WYWx1ZX07CisgICAgZWZmZWN0X3BhcmFtX3QqIGVmZmVjdFBhcmFtID0gKGVmZmVjdF9wYXJhbV90KiltYWxsb2Moc2l6ZW9mKCplZmZlY3RQYXJhbSkgKyBzaXplb2YocGFyYW1EYXRhKSk7CisgICAgbWVtY3B5KCZlZmZlY3RQYXJhbS0+ZGF0YVswXSwgJnBhcmFtRGF0YVswXSwgc2l6ZW9mKHBhcmFtRGF0YSkpOworICAgIGVmZmVjdFBhcmFtLT5wc2l6ZSA9IHNpemVvZihwYXJhbURhdGFbMF0pOworICAgICgqZWZmZWN0SGFuZGxlKQorICAgICAgICAgICAgLT5jb21tYW5kKGVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfUEFSQU0sIHNpemVvZihlZmZlY3RfcGFyYW1fdCksIGVmZmVjdFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICZyZXBseVNpemUsICZyZXBseSk7CisgICAgZnJlZShlZmZlY3RQYXJhbSk7CisgICAgcmV0dXJuIHJlcGx5OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciogYXJndltdKSB7CisgICAgaWYgKGFyZ2MgPT0gMSkgeworICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgLy8gUHJpbnQgdGhlIGFyZ3VtZW50cyBwYXNzZWQKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICBwcmludGYoIiVzICIsIGFyZ3ZbaV0pOworICAgIH0KKworICAgIGNvbnN0IGNoYXIqIGlucHV0RmlsZSA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciogb3V0cHV0RmlsZSA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciogZmFyRmlsZSA9IG51bGxwdHI7CisgICAgaW50IGVmZmVjdEVuW1BSRVBST0NfTlVNX0VGRkVDVFNdID0gezB9OworICAgIHN0cnVjdCBwcmVQcm9jQ29uZmlnUGFyYW1zX3QgcHJlUHJvY0NmZ1BhcmFtcyB7fTsKKworICAgIGNvbnN0IG9wdGlvbiBsb25nX29wdHNbXSA9IHsKKyAgICAgICAgICAgIHsiaGVscCIsIG5vX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfSEVMUH0sCisgICAgICAgICAgICB7ImlucHV0IiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19JTlBVVH0sCisgICAgICAgICAgICB7Im91dHB1dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfT1VUUFVUfSwKKyAgICAgICAgICAgIHsiZmFyIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19GQVJ9LAorICAgICAgICAgICAgeyJmcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfRlN9LAorICAgICAgICAgICAgeyJjaF9tYXNrIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19DSF9NQVNLfSwKKyAgICAgICAgICAgIHsiYWdjX3RndF9sdmwiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0FHQ19UR1RfTFZMfSwKKyAgICAgICAgICAgIHsiYWdjX2NvbXBfbHZsIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19BR0NfQ09NUF9MVkx9LAorICAgICAgICAgICAgeyJhZ2MyX2dhaW4iLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0FHQzJfR0FJTn0sCisgICAgICAgICAgICB7ImFnYzJfbHZsIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19BR0MyX0xWTH0sCisgICAgICAgICAgICB7ImFnYzJfc2F0X21nbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfQUdDMl9TQVRfTUdOfSwKKyAgICAgICAgICAgIHsiYWVjX2RlbGF5IiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19BRUNfREVMQVl9LAorICAgICAgICAgICAgeyJuc19sdmwiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX05TX0xWTH0sCisgICAgICAgICAgICB7ImFlYyIsIG5vX2FyZ3VtZW50LCAmZWZmZWN0RW5bUFJFUFJPQ19BRUNdLCAxfSwKKyAgICAgICAgICAgIHsiYWdjIiwgbm9fYXJndW1lbnQsICZlZmZlY3RFbltQUkVQUk9DX0FHQ10sIDF9LAorICAgICAgICAgICAgeyJhZ2MyIiwgbm9fYXJndW1lbnQsICZlZmZlY3RFbltQUkVQUk9DX0FHQzJdLCAxfSwKKyAgICAgICAgICAgIHsibnMiLCBub19hcmd1bWVudCwgJmVmZmVjdEVuW1BSRVBST0NfTlNdLCAxfSwKKyAgICAgICAgICAgIHsiZmNoIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19GSUxFX0NIQU5ORUxTfSwKKyAgICAgICAgICAgIHsibW9ubyIsIG5vX2FyZ3VtZW50LCAmcHJlUHJvY0NmZ1BhcmFtcy5tb25vTW9kZSwgMX0sCisgICAgICAgICAgICB7bnVsbHB0ciwgMCwgbnVsbHB0ciwgMH0sCisgICAgfTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGNvbnN0IGludCBvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCAoY2hhciogY29uc3QqKWFyZ3YsICJpOm86IiwgbG9uZ19vcHRzLCBudWxscHRyKTsKKyAgICAgICAgaWYgKG9wdCA9PSAtMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChvcHQpIHsKKyAgICAgICAgICAgIGNhc2UgQVJHX0hFTFA6CisgICAgICAgICAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgY2FzZSBBUkdfSU5QVVQ6IHsKKyAgICAgICAgICAgICAgICBpbnB1dEZpbGUgPSAoY2hhciopb3B0YXJnOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBUkdfT1VUUFVUOiB7CisgICAgICAgICAgICAgICAgb3V0cHV0RmlsZSA9IChjaGFyKilvcHRhcmc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFSR19GQVI6IHsKKyAgICAgICAgICAgICAgICBmYXJGaWxlID0gKGNoYXIqKW9wdGFyZzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQVJHX0ZTOiB7CisgICAgICAgICAgICAgICAgcHJlUHJvY0NmZ1BhcmFtcy5zYW1wbGluZ0ZyZXEgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFSR19DSF9NQVNLOiB7CisgICAgICAgICAgICAgICAgaW50IGNoTWFza0lkeCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hNYXNrSWR4IDwgMCBvciBjaE1hc2tJZHggPiBrUHJlUHJvY0NvbmZpZ0NoTWFza0NvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDaGFubmVsIE1hc2sgaW5kZXggbm90IGluIGNvcnJlY3QgcmFuZ2VcbiIpOworICAgICAgICAgICAgICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByZVByb2NDZmdQYXJhbXMuY2hNYXNrID0ga1ByZVByb2NDb25maWdDaE1hc2tbY2hNYXNrSWR4XTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQVJHX0FHQ19UR1RfTFZMOiB7CisgICAgICAgICAgICAgICAgcHJlUHJvY0NmZ1BhcmFtcy5hZ2NUYXJnZXRMZXZlbCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQVJHX0FHQ19DT01QX0xWTDogeworICAgICAgICAgICAgICAgIHByZVByb2NDZmdQYXJhbXMuYWdjQ29tcExldmVsID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBUkdfQUdDMl9HQUlOOiB7CisgICAgICAgICAgICAgICAgcHJlUHJvY0NmZ1BhcmFtcy5hZ2MyR2FpbiA9IGF0b2Yob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQVJHX0FHQzJfTFZMOiB7CisgICAgICAgICAgICAgICAgcHJlUHJvY0NmZ1BhcmFtcy5hZ2MyTGV2ZWwgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFSR19BR0MyX1NBVF9NR046IHsKKyAgICAgICAgICAgICAgICBwcmVQcm9jQ2ZnUGFyYW1zLmFnYzJTYXR1cmF0aW9uTWFyZ2luID0gYXRvZihvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBUkdfQUVDX0RFTEFZOiB7CisgICAgICAgICAgICAgICAgcHJlUHJvY0NmZ1BhcmFtcy5hZWNEZWxheSA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQVJHX05TX0xWTDogeworICAgICAgICAgICAgICAgIHByZVByb2NDZmdQYXJhbXMubnNMZXZlbCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQVJHX0ZJTEVfQ0hBTk5FTFM6IHsKKyAgICAgICAgICAgICAgICBwcmVQcm9jQ2ZnUGFyYW1zLmZpbGVDaGFubmVscyA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQVJHX01PTk9fTU9ERTogeworICAgICAgICAgICAgICAgIHByZVByb2NDZmdQYXJhbXMubW9ub01vZGUgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbnB1dEZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRXJyb3I6IG1pc3NpbmcgaW5wdXQgZmlsZVxuIik7CisgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RklMRSwgZGVjbHR5cGUoJmZjbG9zZSk+IGlucHV0RnAoZm9wZW4oaW5wdXRGaWxlLCAicmIiKSwgJmZjbG9zZSk7CisgICAgaWYgKGlucHV0RnAgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlc1xuIiwgaW5wdXRGaWxlKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RklMRSwgZGVjbHR5cGUoJmZjbG9zZSk+IGZhckZwKGZvcGVuKGZhckZpbGUsICJyYiIpLCAmZmNsb3NlKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RklMRSwgZGVjbHR5cGUoJmZjbG9zZSk+IG91dHB1dEZwKGZvcGVuKG91dHB1dEZpbGUsICJ3YiIpLCAmZmNsb3NlKTsKKyAgICBpZiAoZWZmZWN0RW5bUFJFUFJPQ19BRUNdKSB7CisgICAgICAgIGlmIChmYXJGaWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYXIgZW5kIHNpZ25hbCBmaWxlIHJlcXVpcmVkIGZvciBlY2hvIGNhbmNlbGxhdGlvbiBcbiIpOworICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmFyRnAgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBvcGVuIGZhciBlbmQgc3RyZWFtIGZpbGUgJXNcbiIsIGZhckZpbGUpOworICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0SW5wdXQsIHN0YXRGYXI7CisgICAgICAgICh2b2lkKWZzdGF0KGZpbGVubyhpbnB1dEZwLmdldCgpKSwgJnN0YXRJbnB1dCk7CisgICAgICAgICh2b2lkKWZzdGF0KGZpbGVubyhmYXJGcC5nZXQoKSksICZzdGF0RmFyKTsKKyAgICAgICAgaWYgKHN0YXRJbnB1dC5zdF9zaXplICE9IHN0YXRGYXIuc3Rfc2l6ZSkgeworICAgICAgICAgICAgQUxPR0UoIk5lYXIgYW5kIGZhciBlbmQgc2lnbmFscyBhcmUgb2YgZGlmZmVyZW50IHNpemVzIik7CisgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisgICAgfQorICAgIGlmIChvdXRwdXRGaWxlICE9IG51bGxwdHIgJiYgb3V0cHV0RnAgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQ2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIsIG91dHB1dEZpbGUpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIGludDMyX3Qgc2Vzc2lvbklkID0gMTsKKyAgICBpbnQzMl90IGlvSWQgPSAxOworICAgIGVmZmVjdF9oYW5kbGVfdCBlZmZlY3RIYW5kbGVbUFJFUFJPQ19OVU1fRUZGRUNUU10gPSB7bnVsbHB0cn07CisgICAgZWZmZWN0X2NvbmZpZ190IGNvbmZpZzsKKyAgICBjb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gY29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSBwcmVQcm9jQ2ZnUGFyYW1zLnNhbXBsaW5nRnJlcTsKKyAgICBjb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBjb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gcHJlUHJvY0NmZ1BhcmFtcy5jaE1hc2s7CisgICAgY29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisKKyAgICAvLyBDcmVhdGUgYWxsIHRoZSBlZmZlY3QgaGFuZGxlcworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUFJFUFJPQ19OVU1fRUZGRUNUUzsgaSsrKSB7CisgICAgICAgIGlmIChpbnQgc3RhdHVzID0gcHJlUHJvY0NyZWF0ZUVmZmVjdCgmZWZmZWN0SGFuZGxlW2ldLCBpLCAmY29uZmlnLCBzZXNzaW9uSWQsIGlvSWQpOworICAgICAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJDcmVhdGUgZWZmZWN0IGNhbGwgcmV0dXJuZWQgZXJyb3IgJWkiLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUFJFUFJPQ19OVU1fRUZGRUNUUzsgaSsrKSB7CisgICAgICAgIGlmIChlZmZlY3RFbltpXSA9PSAxKSB7CisgICAgICAgICAgICBpbnQgcmVwbHkgPSAwOworICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKHJlcGx5KTsKKyAgICAgICAgICAgICgqZWZmZWN0SGFuZGxlW2ldKQorICAgICAgICAgICAgICAgICAgICAtPmNvbW1hbmQoZWZmZWN0SGFuZGxlW2ldLCBFRkZFQ1RfQ01EX0VOQUJMRSwgMCwgbnVsbHB0ciwgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICAgICAgICAgIGlmIChyZXBseSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNvbW1hbmQgZW5hYmxlIGNhbGwgcmV0dXJuZWQgZXJyb3IgJWRcbiIsIHJlcGx5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2V0IENvbmZpZyBQYXJhbXMgb2YgdGhlIGVmZmVjdHMKKyAgICBpZiAoZWZmZWN0RW5bUFJFUFJPQ19BR0NdKSB7CisgICAgICAgIGlmIChpbnQgc3RhdHVzID0gcHJlUHJvY1NldENvbmZpZ1BhcmFtKEFHQ19QQVJBTV9UQVJHRVRfTEVWRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClwcmVQcm9jQ2ZnUGFyYW1zLmFnY1RhcmdldExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RIYW5kbGVbUFJFUFJPQ19BR0NdKTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBBR0MgVGFyZ2V0IExldmVsLiBFcnJvciAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGludCBzdGF0dXMgPSBwcmVQcm9jU2V0Q29uZmlnUGFyYW0oQUdDX1BBUkFNX0NPTVBfR0FJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXByZVByb2NDZmdQYXJhbXMuYWdjQ29tcExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RIYW5kbGVbUFJFUFJPQ19BR0NdKTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBBR0MgQ29tcCBHYWluLiBFcnJvciAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVmZmVjdEVuW1BSRVBST0NfQUdDMl0pIHsKKyAgICAgICAgaWYgKGludCBzdGF0dXMgPSBwcmVQcm9jU2V0Q29uZmlnUGFyYW0oQUdDMl9QQVJBTV9GSVhFRF9ESUdJVEFMX0dBSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdClwcmVQcm9jQ2ZnUGFyYW1zLmFnYzJHYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RIYW5kbGVbUFJFUFJPQ19BR0MyXSk7CisgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgQUdDMiBGaXhlZCBEaWdpdGFsIEdhaW4uIEVycm9yICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW50IHN0YXR1cyA9IHByZVByb2NTZXRDb25maWdQYXJhbShBR0MyX1BBUkFNX0FEQVBUX0RJR0lfTEVWRUxfRVNUSU1BVE9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpcHJlUHJvY0NmZ1BhcmFtcy5hZ2MyTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEhhbmRsZVtQUkVQUk9DX0FHQzJdKTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBBR0MyIExldmVsIEVzdGltYXRvci4gRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIGlmIChpbnQgc3RhdHVzID0gcHJlUHJvY1NldENvbmZpZ1BhcmFtKEFHQzJfUEFSQU1fQURBUFRfRElHSV9FWFRSQV9TQVRVUkFUSU9OX01BUkdJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KXByZVByb2NDZmdQYXJhbXMuYWdjMlNhdHVyYXRpb25NYXJnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEhhbmRsZVtQUkVQUk9DX0FHQzJdKTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBBR0MyIFNhdHVyYXRpb24gTWFyZ2luLiBFcnJvciAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVmZmVjdEVuW1BSRVBST0NfTlNdKSB7CisgICAgICAgIGlmIChpbnQgc3RhdHVzID0gcHJlUHJvY1NldENvbmZpZ1BhcmFtKE5TX1BBUkFNX0xFVkVMLCAodWludDMyX3QpcHJlUHJvY0NmZ1BhcmFtcy5uc0xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RIYW5kbGVbUFJFUFJPQ19OU10pOworICAgICAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIE5vaXNlIFN1cHByZXNzaW9uIGxldmVsIEVycm9yICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFByb2Nlc3MgQ2FsbAorICAgIGNvbnN0IGludCBmcmFtZUxlbmd0aCA9IChpbnQpKHByZVByb2NDZmdQYXJhbXMuc2FtcGxpbmdGcmVxICoga1Rlbk1pbGxpU2VjVmFsKTsKKyAgICBjb25zdCBpbnQgaW9DaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhwcmVQcm9jQ2ZnUGFyYW1zLmNoTWFzayk7CisgICAgY29uc3QgaW50IGZpbGVDaGFubmVsQ291bnQgPSBwcmVQcm9jQ2ZnUGFyYW1zLmZpbGVDaGFubmVsczsKKyAgICBjb25zdCBpbnQgaW9GcmFtZVNpemUgPSBpb0NoYW5uZWxDb3VudCAqIHNpemVvZihzaG9ydCk7CisgICAgY29uc3QgaW50IGluRnJhbWVTaXplID0gZmlsZUNoYW5uZWxDb3VudCAqIHNpemVvZihzaG9ydCk7CisgICAgaW50IGZyYW1lQ291bnRlciA9IDA7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c2hvcnQ+IGluKGZyYW1lTGVuZ3RoICogaW9DaGFubmVsQ291bnQpOworICAgICAgICBzdGQ6OnZlY3RvcjxzaG9ydD4gb3V0KGZyYW1lTGVuZ3RoICogaW9DaGFubmVsQ291bnQpOworICAgICAgICBzdGQ6OnZlY3RvcjxzaG9ydD4gZmFySW4oZnJhbWVMZW5ndGggKiBpb0NoYW5uZWxDb3VudCk7CisgICAgICAgIHNpemVfdCBzYW1wbGVzUmVhZCA9IGZyZWFkKGluLmRhdGEoKSwgaW5GcmFtZVNpemUsIGZyYW1lTGVuZ3RoLCBpbnB1dEZwLmdldCgpKTsKKyAgICAgICAgaWYgKHNhbXBsZXNSZWFkID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChmaWxlQ2hhbm5lbENvdW50ICE9IGlvQ2hhbm5lbENvdW50KSB7CisgICAgICAgICAgICBhZGp1c3RfY2hhbm5lbHMoaW4uZGF0YSgpLCBmaWxlQ2hhbm5lbENvdW50LCBpbi5kYXRhKCksIGlvQ2hhbm5lbENvdW50LCBzaXplb2Yoc2hvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoICogaW5GcmFtZVNpemUpOworICAgICAgICAgICAgaWYgKHByZVByb2NDZmdQYXJhbXMubW9ub01vZGUgPT0gMSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVMZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBhdXRvKiBmcCA9ICZpbltpICogaW9DaGFubmVsQ291bnRdOworICAgICAgICAgICAgICAgICAgICBzdGQ6OmZpbGwoZnAgKyAxLCBmcCArIGlvQ2hhbm5lbENvdW50LCAqZnApOyAgLy8gcmVwbGljYXRlIGNoIDAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXVkaW9fYnVmZmVyX3QgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlcjsKKyAgICAgICAgYXVkaW9fYnVmZmVyX3QgZmFySW5CdWZmZXJ7fTsKKyAgICAgICAgaW5wdXRCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lTGVuZ3RoOworICAgICAgICBvdXRwdXRCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lTGVuZ3RoOworICAgICAgICBpbnB1dEJ1ZmZlci5zMTYgPSBpbi5kYXRhKCk7CisgICAgICAgIG91dHB1dEJ1ZmZlci5zMTYgPSBvdXQuZGF0YSgpOworCisgICAgICAgIGlmIChmYXJGcCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzYW1wbGVzUmVhZCA9IGZyZWFkKGZhckluLmRhdGEoKSwgaW5GcmFtZVNpemUsIGZyYW1lTGVuZ3RoLCBmYXJGcC5nZXQoKSk7CisgICAgICAgICAgICBpZiAoc2FtcGxlc1JlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZpbGVDaGFubmVsQ291bnQgIT0gaW9DaGFubmVsQ291bnQpIHsKKyAgICAgICAgICAgICAgICBhZGp1c3RfY2hhbm5lbHMoZmFySW4uZGF0YSgpLCBmaWxlQ2hhbm5lbENvdW50LCBmYXJJbi5kYXRhKCksIGlvQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2hvcnQpLCBmcmFtZUxlbmd0aCAqIGluRnJhbWVTaXplKTsKKyAgICAgICAgICAgICAgICBpZiAocHJlUHJvY0NmZ1BhcmFtcy5tb25vTW9kZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVMZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byogZnAgPSAmZmFySW5baSAqIGlvQ2hhbm5lbENvdW50XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZmlsbChmcCArIDEsIGZwICsgaW9DaGFubmVsQ291bnQsICpmcCk7ICAvLyByZXBsaWNhdGUgY2ggMAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmYXJJbkJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVMZW5ndGg7CisgICAgICAgICAgICBmYXJJbkJ1ZmZlci5zMTYgPSBmYXJJbi5kYXRhKCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFBSRVBST0NfTlVNX0VGRkVDVFM7IGkrKykgeworICAgICAgICAgICAgaWYgKGVmZmVjdEVuW2ldID09IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBQUkVQUk9DX0FFQykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW50IHN0YXR1cyA9IHByZVByb2NTZXRDb25maWdQYXJhbShBRUNfUEFSQU1fRUNIT19ERUxBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXByZVByb2NDZmdQYXJhbXMuYWVjRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEhhbmRsZVtQUkVQUk9DX0FFQ10pOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJwcmVQcm9jU2V0Q29uZmlnUGFyYW0gcmV0dXJuZWQgRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbnQgc3RhdHVzID0gKCplZmZlY3RIYW5kbGVbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cHJvY2VzcyhlZmZlY3RIYW5kbGVbaV0sICZpbnB1dEJ1ZmZlciwgJm91dHB1dEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJcbkVycm9yOiBQcm9jZXNzIGkgPSAlZCByZXR1cm5lZCB3aXRoIGVycm9yICVkXG4iLCBpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBQUkVQUk9DX0FFQykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW50IHN0YXR1cyA9ICgqZWZmZWN0SGFuZGxlW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5wcm9jZXNzX3JldmVyc2UoZWZmZWN0SGFuZGxlW2ldLCAmZmFySW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0QnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiXG5FcnJvcjogUHJvY2VzcyByZXZlcnNlIGkgPSAlZCByZXR1cm5lZCB3aXRoIGVycm9yICVkXG4iLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG91dHB1dEZwICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmIChmaWxlQ2hhbm5lbENvdW50ICE9IGlvQ2hhbm5lbENvdW50KSB7CisgICAgICAgICAgICAgICAgYWRqdXN0X2NoYW5uZWxzKG91dC5kYXRhKCksIGlvQ2hhbm5lbENvdW50LCBvdXQuZGF0YSgpLCBmaWxlQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2hvcnQpLCBmcmFtZUxlbmd0aCAqIGlvRnJhbWVTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemVfdCBzYW1wbGVzV3JpdHRlbiA9CisgICAgICAgICAgICAgICAgICAgIGZ3cml0ZShvdXQuZGF0YSgpLCBpbkZyYW1lU2l6ZSwgb3V0cHV0QnVmZmVyLmZyYW1lQ291bnQsIG91dHB1dEZwLmdldCgpKTsKKyAgICAgICAgICAgIGlmIChzYW1wbGVzV3JpdHRlbiAhPSBvdXRwdXRCdWZmZXIuZnJhbWVDb3VudCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJcbkVycm9yOiBPdXRwdXQgZmlsZSB3cml0aW5nIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZyYW1lQ291bnRlciArPSBmcmFtZUxlbmd0aDsKKyAgICB9CisgICAgcHJpbnRmKCJmcmFtZUNvdW50ZXI6IFslZF1cbiIsIGZyYW1lQ291bnRlcik7CisgICAgLy8gUmVsZWFzZSBhbGwgdGhlIGVmZmVjdCBoYW5kbGVzIGNyZWF0ZWQKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFBSRVBST0NfTlVNX0VGRkVDVFM7IGkrKykgeworICAgICAgICBpZiAoaW50IHN0YXR1cyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLnJlbGVhc2VfZWZmZWN0KGVmZmVjdEhhbmRsZVtpXSk7CisgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkF1ZGlvIFByZXByb2Nlc3NpbmcgcmVsZWFzZSByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2ggYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNWRhMTNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKQEAgLTAsMCArMSwxMTkgQEAKKyMhL2Jpbi9iYXNoCisjCisjIFJ1biB0ZXN0cyBpbiB0aGlzIGRpcmVjdG9yeS4KKyMKKworaWYgWyAteiAiJEFORFJPSURfQlVJTERfVE9QIiBdOyB0aGVuCisgICAgZWNobyAiQW5kcm9pZCBidWlsZCBlbnZpcm9ubWVudCBub3Qgc2V0IgorICAgIGV4aXQgLTEKK2ZpCisKKyMgZW5zdXJlIHdlIGhhdmUgbW0KKy4gJEFORFJPSURfQlVJTERfVE9QL2J1aWxkL2VudnNldHVwLnNoCisKK21tIC1qCisKK2VjaG8gIndhaXRpbmcgZm9yIGRldmljZSIKKworYWRiIHJvb3QgJiYgYWRiIHdhaXQtZm9yLWRldmljZSByZW1vdW50CisKKyMgbG9jYXRpb24gb2YgdGVzdCBmaWxlcwordGVzdGRpcj0iL2RhdGEvbG9jYWwvdG1wL0F1ZGlvUHJlUHJvY2Vzc2luZ1Rlc3QiCisKK2VjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCitlY2hvICJ0ZXN0aW5nIFByZVByb2Nlc3NpbmcgbW9kdWxlcyIKK2FkYiBzaGVsbCBta2RpciAtcCAkdGVzdGRpcgorYWRiIHB1c2ggJEFORFJPSURfQlVJTERfVE9QL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9yZXMvcmF3L3NpbmVzd2VlcHJhdy5yYXcgJHRlc3RkaXIKK2FkYiBwdXNoICRPVVQvdGVzdGNhc2VzL3Nuci9hcm02NC9zbnIgJHRlc3RkaXIKKworRV9WQUw9MQoraWYgWyAteiAiJDEiIF0KK3RoZW4KKyAgICBjbWRzPSgiYWRiIHB1c2ggJE9VVC90ZXN0Y2FzZXMvQXVkaW9QcmVQcm9jZXNzaW5nVGVzdC9hcm02NC9BdWRpb1ByZVByb2Nlc3NpbmdUZXN0ICR0ZXN0ZGlyIgorICAgICAgICAgICJhZGIgcHVzaCAkT1VUL3Rlc3RjYXNlcy9BdWRpb1ByZVByb2Nlc3NpbmdUZXN0L2FybS9BdWRpb1ByZVByb2Nlc3NpbmdUZXN0ICR0ZXN0ZGlyIgorKQorZWxpZiBbICIkMSIgPT0gIjMyIiBdCit0aGVuCisgICAgY21kcz0iYWRiIHB1c2ggJE9VVC90ZXN0Y2FzZXMvQXVkaW9QcmVQcm9jZXNzaW5nVGVzdC9hcm0vQXVkaW9QcmVQcm9jZXNzaW5nVGVzdCAkdGVzdGRpciIKK2VsaWYgWyAiJDEiID09ICI2NCIgXQordGhlbgorICAgIGNtZHM9ImFkYiBwdXNoICRPVVQvdGVzdGNhc2VzL0F1ZGlvUHJlUHJvY2Vzc2luZ1Rlc3QvYXJtNjQvQXVkaW9QcmVQcm9jZXNzaW5nVGVzdCAkdGVzdGRpciIKK2Vsc2UKKyAgICBlY2hvICIiCisgICAgZWNobyAiSW52YWxpZCBcInZhbFwiIgorICAgIGVjaG8gIlVzYWdlOiIKKyAgICBlY2hvICIgICAgICAiJDAiIFt2YWxdIgorICAgIGVjaG8gIiAgICAgIHdoZXJlLCB2YWwgY2FuIGJlIGVpdGhlciAzMiBvciA2NC4iCisgICAgZWNobyAiIgorICAgIGVjaG8gIiAgICAgIElmIHZhbCBpcyBub3Qgc3BlY2lmaWVkIHRoZW4gYm90aCAzMiBiaXQgYW5kIDY0IGJpdCBiaW5hcmllcyIKKyAgICBlY2hvICIgICAgICBhcmUgdGVzdGVkLiIKKyAgICBleGl0ICRFX1ZBTAorZmkKKworZmxhZ3NfYXJyPSgKKyAgICAiLS1hZ2MgLS1tb25vIgorICAgICItLW5zIC0tbW9ubyIKKyAgICAiLS1hZ2MyIC0tbW9ubyIKKyAgICAiLS1hZWMgLS1tb25vIgorKQorCitmc19hcnI9KAorICAgIDgwMDAKKyAgICAxMTAyNQorICAgIDEyMDAwCisgICAgMTYwMDAKKyAgICAyMjA1MAorICAgIDI0MDAwCisgICAgMzIwMDAKKyAgICA0NDEwMAorICAgIDQ4MDAwCispCisKKyMgcnVuIG11bHRpY2hhbm5lbCBlZmZlY3RzIGF0IGRpZmZlcmVudCBjb25maWdzLCBzYXZpbmcgb25seSB0aGUgbW9ubyBjaGFubmVsCitlcnJvcl9jb3VudD0wCit0ZXN0X2NvdW50PTAKK2ZvciBjbWQgaW4gIiR7Y21kc1tAXX0iCitkbworICAgICRjbWQKKyAgICBmb3IgZmxhZ3MgaW4gIiR7ZmxhZ3NfYXJyW0BdfSIKKyAgICBkbworICAgICAgICBmb3IgZnMgaW4gJHtmc19hcnJbKl19CisgICAgICAgIGRvCisgICAgICAgICAgICBmb3IgY2hNYXNrIGluIHswLi43fQorICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICBhZGIgc2hlbGwgJHRlc3RkaXIvQXVkaW9QcmVQcm9jZXNzaW5nVGVzdCAkZmxhZ3MgXAorICAgICAgICAgICAgICAgICAgICAtLWkgJHRlc3RkaXIvc2luZXN3ZWVwcmF3LnJhdyAtLWZhciAkdGVzdGRpci9zaW5lc3dlZXByYXcucmF3IFwKKyAgICAgICAgICAgICAgICAgICAgLS1vdXRwdXQgJHRlc3RkaXIvc2luZXN3ZWVwXyQoKGNoTWFzaykpXyQoKGZzKSkucmF3IC0tY2hfbWFzayAkY2hNYXNrIFwKKyAgICAgICAgICAgICAgICAgICAgLS1mcyAkZnMgLS1mY2ggMQorCisgICAgICAgICAgICAgICAgc2hlbGxfcmV0PSQ/CisgICAgICAgICAgICAgICAgaWYgWyAkc2hlbGxfcmV0IC1uZSAwIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgZWNobyAiZXJyb3Igc2hlbGxfcmV0IGhlcmUgaXMgemVybzogJHNoZWxsX3JldCIKKyAgICAgICAgICAgICAgICAgICAgKCgrK2Vycm9yX2NvdW50KSkKKyAgICAgICAgICAgICAgICBmaQorCisKKyAgICAgICAgICAgICAgICAjIHNpbmdsZSBjaGFubmVsIGZpbGVzIHNob3VsZCBiZSBpZGVudGljYWwgdG8gaGlnaGVyIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAjIGNvbXB1dGF0aW9uIChmaXJzdCBjaGFubmVsKS4KKyAgICAgICAgICAgICAgICBpZiAgW1sgIiRjaE1hc2siIC1ndCAxIF1dCisgICAgICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgICAgICBhZGIgc2hlbGwgY21wICR0ZXN0ZGlyL3NpbmVzd2VlcF8xXyQoKGZzKSkucmF3IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICR0ZXN0ZGlyL3NpbmVzd2VlcF8kKChjaE1hc2spKV8kKChmcykpLnJhdworICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAjIGNtcCByZXR1cm4gRVhJVF9GQUlMVVJFIG9uIG1pc21hdGNoLgorICAgICAgICAgICAgICAgIHNoZWxsX3JldD0kPworICAgICAgICAgICAgICAgIGlmIFsgJHNoZWxsX3JldCAtbmUgMCBdOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGVjaG8gImVycm9yOiAkc2hlbGxfcmV0IgorICAgICAgICAgICAgICAgICAgICAoKCsrZXJyb3JfY291bnQpKQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgKCgrK3Rlc3RfY291bnQpKQorICAgICAgICAgICAgZG9uZQorICAgICAgICBkb25lCisgICAgZG9uZQorZG9uZQorCithZGIgc2hlbGwgcm0gLXIgJHRlc3RkaXIKK2VjaG8gIiR0ZXN0X2NvdW50IHRlc3RzIHBlcmZvcm1lZCIKK2VjaG8gIiRlcnJvcl9jb3VudCBlcnJvcnMiCitleGl0ICRlcnJvcl9jb3VudApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL2NvcnJlbGF0aW9uLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9jb3JyZWxhdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI1NmZjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9jb3JyZWxhdGlvbi5jcHAKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCitjb25zdGV4cHIgaW50IGtNaW5Mb29wTGltaXRWYWx1ZSA9IDE7Citjb25zdGV4cHIgaW50IGtOdW1QZWFrcyA9IDM7CisKKy8qIQorICBcYnJpZWYgICAgICAgICAgIENvbXB1dGUgdGhlIGxlbmd0aCBub3JtYWxpemVkIGNvcnJlbGF0aW9uIG9mIHR3byBzaWduYWxzCisKKyAgXHNpZ1ggICAgICAgICAgICBQb2ludGVyIHRvIHNpZ25hbCAxCisgIFxzaWdZICAgICAgICAgICAgUG9pbnRlciB0byBzaWduYWwgMgorICBcbGVuICAgICAgICAgICAgIExlbmd0aCBvZiBzaWduYWxzCisgIFxlbmFibGVDcm9zc0NvcnIgRmxhZyB0byBiZSBzZXQgdG8gMSBpZiBjcm9zcy1jb3JyZWxhdGlvbiBpcyBuZWVkZWQKKworICBccmV0dXJuICAgICAgICAgIEZpcnN0IHZhbHVlIGlzIHZlY3RvciBvZiBjb3JyZWxhdGlvbiBwZWFrIGluZGljZXMKKyAgICAgICAgICAgICAgICAgICBTZWNvbmQgdmFsdWUgaXMgdmVjdG9yIG9mIGNvcnJlbGF0aW9uIHBlYWsgdmFsdWVzCisqLworCitzdGF0aWMgc3RkOjpwYWlyPHN0ZDo6dmVjdG9yPGludD4sIHN0ZDo6dmVjdG9yPGZsb2F0Pj4gY29ycmVsYXRpb24oY29uc3QgaW50MTZfdCogc2lnWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBzaWdZLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgZW5hYmxlQ3Jvc3NDb3JyKSB7CisgICAgZmxvYXQgbWF4Q29yclZhbCA9IDAuZiwgcHJldkNvcnJWYWwgPSAwLmY7CisgICAgaW50IGRlbGF5ID0gMCwgcGVha0luZGV4ID0gMCwgZmxhZyA9IDA7CisgICAgaW50IGxvb3BMaW0gPSAoMSA9PSBlbmFibGVDcm9zc0NvcnIpID8gbGVuIDoga01pbkxvb3BMaW1pdFZhbHVlOworICAgIHN0ZDo6dmVjdG9yPGludD4gcGVha0luZGV4VmVjdChrTnVtUGVha3MsIDApOworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBwZWFrVmFsdWVWZWN0KGtOdW1QZWFrcywgMC5mKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvb3BMaW07IGkrKykgeworICAgICAgICBmbG9hdCBjb3JyVmFsID0gMC5mOworICAgICAgICBmb3IgKGludCBqID0gaTsgaiA8IGxlbjsgaisrKSB7CisgICAgICAgICAgICBjb3JyVmFsICs9IChmbG9hdCkoc2lnWFtqXSAqIHNpZ1lbaiAtIGldKTsKKyAgICAgICAgfQorICAgICAgICBjb3JyVmFsIC89IGxlbiAtIGk7CisgICAgICAgIGlmIChjb3JyVmFsID4gbWF4Q29yclZhbCkgeworICAgICAgICAgICAgZGVsYXkgPSBpOworICAgICAgICAgICAgbWF4Q29yclZhbCA9IGNvcnJWYWw7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ29ycmVsYXRpb24gcGVha3MgYXJlIGV4cGVjdGVkIHRvIGJlIG9ic2VydmVkIGF0IGVxdWFsIGludGVydmFscy4gVGhlIGludGVydmFsIGxlbmd0aCBpcworICAgICAgICAvLyBleHBlY3RlZCB0byBtYXRjaCB3aXRoIHdhdmUgcGVyaW9kLgorICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGJsb2NrIG9mIGNvZGUgc2F2ZXMgdGhlIGZpcnN0IGtOdW1QZWFrcyBudW1iZXIgb2YgcGVha3MgYW5kIHRoZSBpbmRleCBhdAorICAgICAgICAvLyB3aGljaCB0aGV5IG9jY3VyLgorICAgICAgICBpZiAocGVha0luZGV4IDwga051bVBlYWtzKSB7CisgICAgICAgICAgICBpZiAoY29yclZhbCA+IHByZXZDb3JyVmFsKSB7CisgICAgICAgICAgICAgICAgcGVha0luZGV4VmVjdFtwZWFrSW5kZXhdID0gaTsKKyAgICAgICAgICAgICAgICBwZWFrVmFsdWVWZWN0W3BlYWtJbmRleF0gPSBjb3JyVmFsOworICAgICAgICAgICAgICAgIGZsYWcgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmICgwID09IGZsYWcpIHsKKyAgICAgICAgICAgICAgICBwZWFrSW5kZXgrKzsKKyAgICAgICAgICAgICAgICBmbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocGVha0luZGV4ID09IGtOdW1QZWFrcykgYnJlYWs7CisgICAgICAgIHByZXZDb3JyVmFsID0gY29yclZhbDsKKyAgICB9CisgICAgcmV0dXJuIHtwZWFrSW5kZXhWZWN0LCBwZWFrVmFsdWVWZWN0fTsKK30KKwordm9pZCBwcmludFVzYWdlKCkgeworICAgIHByaW50ZigiXG5Vc2FnZTogIik7CisgICAgcHJpbnRmKCJcbiAgICAgY29ycmVsYXRpb24gPGZpcnN0RmlsZT4gPHNlY29uZEZpbGU+IFtlbmFibGVDcm9zc0NvcnJdXG4iKTsKKyAgICBwcmludGYoIlxud2hlcmUsIFxuICAgICA8Zmlyc3RGaWxlPiAgICAgICBpcyB0aGUgZmlyc3QgZmlsZSBuYW1lIik7CisgICAgcHJpbnRmKCJcbiAgICAgPHNlY29uZEZpbGU+ICAgICAgaXMgdGhlIHNlY29uZCBmaWxlIG5hbWUiKTsKKyAgICBwcmludGYoIlxuICAgICBbZW5hYmxlQ3Jvc3NDb3JyXSBpcyBmbGFnIHRvIHNldCBmb3IgY3Jvc3MtY29ycmVsYXRpb24gKERlZmF1bHQgMSlcblxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiBhcmd2W10pIHsKKyAgICBpZiAoYXJnYyA8IDMpIHsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxGSUxFLCBkZWNsdHlwZSgmZmNsb3NlKT4gZklucHV0MShmb3Blbihhcmd2WzFdLCAicmIiKSwgJmZjbG9zZSk7CisgICAgaWYgKGZJbnB1dDEuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICBwcmludGYoIlxuRXJyb3I6IG1pc3NpbmcgZmlsZSAlc1xuIiwgYXJndlsxXSk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxGSUxFLCBkZWNsdHlwZSgmZmNsb3NlKT4gZklucHV0Mihmb3Blbihhcmd2WzJdLCAicmIiKSwgJmZjbG9zZSk7CisgICAgaWYgKGZJbnB1dDIuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICBwcmludGYoIlxuRXJyb3I6IG1pc3NpbmcgZmlsZSAlc1xuIiwgYXJndlsyXSk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorICAgIGludDE2X3QgZW5hYmxlQ3Jvc3NDb3JyID0gKDQgPT0gYXJnYykgPyBhdG9pKGFyZ3ZbM10pIDogMTsKKworICAgIGZzZWVrKGZJbnB1dDEuZ2V0KCksIDBMLCBTRUVLX0VORCk7CisgICAgdW5zaWduZWQgaW50IGZpbGVTaXplMSA9IGZ0ZWxsKGZJbnB1dDEuZ2V0KCkpOworICAgIHJld2luZChmSW5wdXQxLmdldCgpKTsKKyAgICBmc2VlayhmSW5wdXQyLmdldCgpLCAwTCwgU0VFS19FTkQpOworICAgIHVuc2lnbmVkIGludCBmaWxlU2l6ZTIgPSBmdGVsbChmSW5wdXQyLmdldCgpKTsKKyAgICByZXdpbmQoZklucHV0Mi5nZXQoKSk7CisgICAgaWYgKGZpbGVTaXplMSAhPSBmaWxlU2l6ZTIpIHsKKyAgICAgICAgcHJpbnRmKCJcbkVycm9yOiBGaWxlIHNpemVzIGRpZmZlcmVudFxuIik7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgc2l6ZV90IG51bUZyYW1lcyA9IGZpbGVTaXplMSAvIHNpemVvZihpbnQxNl90KTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50MTZfdFtdPiBpbkJ1ZmZlcjEobmV3IGludDE2X3RbbnVtRnJhbWVzXSgpKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50MTZfdFtdPiBpbkJ1ZmZlcjIobmV3IGludDE2X3RbbnVtRnJhbWVzXSgpKTsKKworICAgIGlmIChudW1GcmFtZXMgIT0gZnJlYWQoaW5CdWZmZXIxLmdldCgpLCBzaXplb2YoaW50MTZfdCksIG51bUZyYW1lcywgZklucHV0MS5nZXQoKSkpIHsKKyAgICAgICAgcHJpbnRmKCJcbkVycm9yOiBVbmFibGUgdG8gcmVhZCAlenUgc2FtcGxlcyBmcm9tIGZpbGUgJXNcbiIsIG51bUZyYW1lcywgYXJndlsxXSk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgaWYgKG51bUZyYW1lcyAhPSBmcmVhZChpbkJ1ZmZlcjIuZ2V0KCksIHNpemVvZihpbnQxNl90KSwgbnVtRnJhbWVzLCBmSW5wdXQyLmdldCgpKSkgeworICAgICAgICBwcmludGYoIlxuRXJyb3I6IFVuYWJsZSB0byByZWFkICV6dSBzYW1wbGVzIGZyb20gZmlsZSAlc1xuIiwgbnVtRnJhbWVzLCBhcmd2WzJdKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBhdXRvIHBhaXJBdXRvQ29ycjEgPSBjb3JyZWxhdGlvbihpbkJ1ZmZlcjEuZ2V0KCksIGluQnVmZmVyMS5nZXQoKSwgbnVtRnJhbWVzLCBlbmFibGVDcm9zc0NvcnIpOworICAgIGF1dG8gcGFpckF1dG9Db3JyMiA9IGNvcnJlbGF0aW9uKGluQnVmZmVyMi5nZXQoKSwgaW5CdWZmZXIyLmdldCgpLCBudW1GcmFtZXMsIGVuYWJsZUNyb3NzQ29ycik7CisKKyAgICAvLyBGb2xsb3dpbmcgY29kZSBibG9jayBjaGVja3MgcGl0Y2ggcGVyaW9kIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gaW5wdXQgc2lnbmFscy4gVGhleSBtdXN0CisgICAgLy8gbWF0Y2ggYXMgQUdDIGFwcGxpZXMgb25seSBnYWluLCBubyBmcmVxdWVuY3kgcmVsYXRlZCBjb21wdXRhdGlvbiBpcyBkb25lLgorICAgIGJvb2wgcGl0Y2hNYXRjaCA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBwYWlyQXV0b0NvcnIxLmZpcnN0LnNpemUoKSAtIDE7IGkrKykgeworICAgICAgICBpZiAocGFpckF1dG9Db3JyMS5maXJzdFtpICsgMV0gLSBwYWlyQXV0b0NvcnIxLmZpcnN0W2ldICE9CisgICAgICAgICAgICBwYWlyQXV0b0NvcnIyLmZpcnN0W2kgKyAxXSAtIHBhaXJBdXRvQ29ycjIuZmlyc3RbaV0pIHsKKyAgICAgICAgICAgIHBpdGNoTWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHBpdGNoTWF0Y2ggPSB0cnVlOworICAgIH0KKyAgICBpZiAocGl0Y2hNYXRjaCkgeworICAgICAgICBwcmludGYoIkF1dG8tY29ycmVsYXRpb24gIDogUGl0Y2ggbWF0Y2hlZFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJBdXRvLWNvcnJlbGF0aW9uICA6IFBpdGNoIG1pc21hdGNoXG4iKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZiAoZW5hYmxlQ3Jvc3NDb3JyKSB7CisgICAgICAgIGF1dG8gcGFpckNyb3NzQ29yciA9CisgICAgICAgICAgICAgICAgY29ycmVsYXRpb24oaW5CdWZmZXIxLmdldCgpLCBpbkJ1ZmZlcjIuZ2V0KCksIG51bUZyYW1lcywgZW5hYmxlQ3Jvc3NDb3JyKTsKKworICAgICAgICAvLyBTaW5jZSBBR0MgYXBwbGllcyBvbmx5IGdhaW4sIHRoZSBwaXRjaCBpbmZvcm1hdGlvbiBvYnRhaW5lZCBmcm9tIGNyb3NzIGNvcnJlbGF0aW9uIGRhdGEKKyAgICAgICAgLy8gb2YgaW5wdXQgYW5kIG91dHB1dCBpcyBleHBlY3RlZCB0byBiZSBzYW1lIGFzIHRoZSBpbnB1dCBzaWduYWwncyBwaXRjaCBpbmZvcm1hdGlvbi4KKyAgICAgICAgcGl0Y2hNYXRjaCA9IGZhbHNlOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcGFpckNyb3NzQ29yci5maXJzdC5zaXplKCkgLSAxOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwYWlyQXV0b0NvcnIxLmZpcnN0W2kgKyAxXSAtIHBhaXJBdXRvQ29ycjEuZmlyc3RbaV0gIT0KKyAgICAgICAgICAgICAgICBwYWlyQ3Jvc3NDb3JyLmZpcnN0W2kgKyAxXSAtIHBhaXJDcm9zc0NvcnIuZmlyc3RbaV0pIHsKKyAgICAgICAgICAgICAgICBwaXRjaE1hdGNoID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwaXRjaE1hdGNoID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGl0Y2hNYXRjaCkgeworICAgICAgICAgICAgcHJpbnRmKCJDcm9zcy1jb3JyZWxhdGlvbiA6IFBpdGNoIG1hdGNoZWQgZm9yIEFHQ1xuIik7CisgICAgICAgICAgICBpZiAocGFpckF1dG9Db3JyMS5zZWNvbmRbMF0pIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkV4cGVjdGVkIGdhaW4gICAgIDogKG1heENyb3NzQ29yciAvIG1heEF1dG9Db3JyMSkgPSAlZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFpckNyb3NzQ29yci5zZWNvbmRbMF0gLyBwYWlyQXV0b0NvcnIxLnNlY29uZFswXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIkNyb3NzLWNvcnJlbGF0aW9uIDogUGl0Y2ggbWlzbWF0Y2hcbiIpOworICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Byb3h5L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL3Byb3h5L0FuZHJvaWQuYnAKaW5kZXggYzZhYmI5ZS4uNjI1NmVkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9wcm94eS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJveHkvQW5kcm9pZC5icApAQCAtMTIsNiArMTIsMTUgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliZWZmZWN0cHJveHkiLAogICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogInNvdW5kZngiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcm94eS9FZmZlY3RQcm94eS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3Byb3h5L0VmZmVjdFByb3h5LmNwcAppbmRleCA0MmU0NGYwLi5iZTlmOGMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Byb3h5L0VmZmVjdFByb3h5LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Byb3h5L0VmZmVjdFByb3h5LmNwcApAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIFRoaXMgaXMgYSBkdW1teSBwcm94eSBkZXNjcmlwdG9yIGp1c3QgdG8gcmV0dXJuIHRvIEZhY3RvcnkgZHVyaW5nIHRoZSBpbml0aWFsCisvLyBUaGlzIGlzIGEgc3R1YiBwcm94eSBkZXNjcmlwdG9yIGp1c3QgdG8gcmV0dXJuIHRvIEZhY3RvcnkgZHVyaW5nIHRoZSBpbml0aWFsCiAvLyBHZXREZXNjcmlwdG9yIGNhbGwuIExhdGVyIGluIHRoZSBmYWN0b3J5LCBpdCBpcyByZXBsYWNlZCB3aXRoIHRoZQogLy8gU1cgc3ViIGVmZmVjdCBkZXNjcmlwdG9yCiAvLyBwcm94eSBVVUlEIGFmOGRhN2UwLTJjYTEtMTFlMy1iNzFkLTAwMDJhNWQ1YzUxYgpAQCAtMTE2LDYgKzExNiwxNiBAQAogICAgICAgICBwQ29udGV4dC0+c3ViZVtTVUJfRlhfT0ZGTE9BRF0gPSBzdWJlWzFdOwogICAgICAgICBwQ29udGV4dC0+ZGVzY1tTVUJfRlhfT0ZGTE9BRF0gPSBkZXNjWzFdOwogICAgICAgICBwQ29udGV4dC0+YWVsaVtTVUJfRlhfT0ZGTE9BRF0gPSBhZWxpWzFdOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJCb3RoIGVmZmVjdHMgaGF2ZSAob3IgZG9uJ3QgaGF2ZSkgRUZGRUNUX0ZMQUdfSFdfQUNDX1RVTk5FTCBmbGFnIik7CisgICAgICAgIGRlbGV0ZVtdIHN1YmU7CisgICAgICAgIGRlbGV0ZVtdIGRlc2M7CisgICAgICAgIGRlbGV0ZVtdIGFlbGk7CisgICAgICAgIGRlbGV0ZVtdIHBDb250ZXh0LT5zdWJlOworICAgICAgICBkZWxldGVbXSBwQ29udGV4dC0+ZGVzYzsKKyAgICAgICAgZGVsZXRlW10gcENvbnRleHQtPmFlbGk7CisgICAgICAgIGRlbGV0ZSBwQ29udGV4dDsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogICAgIGRlbGV0ZVtdIGRlc2M7CiAgICAgZGVsZXRlW10gYWVsaTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcmVzL3Jhdy9zaW5lc3dlZXByYXcucmF3IGIvbWVkaWEvbGliZWZmZWN0cy9yZXMvcmF3L3NpbmVzd2VlcHJhdy5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkNDhjZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcmVzL3Jhdy9zaW5lc3dlZXByYXcucmF3CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0c01hdGguaCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0c01hdGguaAppbmRleCAyYTQ0Mzk5Li5kZDQzYjQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdHNNYXRoLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RzTWF0aC5oCkBAIC0yNTEsMjIgKzI1MSw2IEBACiAqLwogCiAvKiB1c2UgTEZPX0dBSU5fVE9fQ0VOVFMgdG8gY29udmVydCB0aGUgTEZPIGdhaW4gdmFsdWUgdG8gY2VudHMgKi8KLSNpZiAwCi0jZGVmaW5lICAgIERPVUJMRV9MT0cyXzEwICAgIChkb3VibGUpICgzLjMyMTkyODA5NDg4NzM2KSAgICAvKiBsb2cyKDEwKSAqLwotCi0jZGVmaW5lICAgIERPVUJMRV9MRk9fR0FJTl9UT19DRU5UUyAgICAoZG91YmxlKSAgICAgICAgICAgICAgICBcCi0gICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIChET1VCTEVfTE9HMl8xMCkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgMTIwMC4wICAgIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgMjAuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKQotCi0jZGVmaW5lICAgIExGT19HQUlOX1RPX0NFTlRTICAgIChpbnQzMl90KSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgRE9VQkxFX0xGT19HQUlOX1RPX0NFTlRTICogICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAoMHgxTCA8PCBOVU1fRUcxX0ZSQUNfQklUUykgICAgICAgICAgICAgICAgICAgIFwKLSAgICApCi0jZW5kaWYKIAogI2RlZmluZSBMRk9fR0FJTl9UT19DRU5UUyAoaW50MzJfdCkgKDE2NzE5ODExNTZMID4+ICgyMyAtIE5VTV9FRzFfRlJBQ19CSVRTKSkKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawppbmRleCAzNWUyZjNkLi42OGM3Y2YyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawpAQCAtMTgsNiArMTgsOSBAQAogCiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBzb3VuZGZ4CiBMT0NBTF9NT0RVTEU6PSBsaWJ2aXN1YWxpemVyCitMT0NBTF9MSUNFTlNFX0tJTkRTOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorTE9DQUxfTElDRU5TRV9DT05ESVRJT05TOj0gbm90aWNlCitMT0NBTF9OT1RJQ0VfRklMRTo9ICQoTE9DQUxfUEFUSCkvTk9USUNFCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWlmL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJoZWlmL0FuZHJvaWQuYnAKaW5kZXggN2Q1YTRlYi4uNmEzNDI3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliaGVpZi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmhlaWYvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliaGVpZiIsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCmluZGV4IDNmZDNmYzMuLjYyMTRmNWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icApAQCAtMSwzICsxLDIwIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJtZWRpYV9saWNlbnNlIl0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCkBAIC0xNyw2ICszNCwyOCBAQAogICAgIF0sCiB9CiAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYm1lZGlhX2RhdGFzb3VyY2VfaGVhZGVycyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYmluZGVyX2hlYWRlcnMiLAorICAgIF0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGliYmluZGVyX2hlYWRlcnMiLAorICAgIF0sCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgIF0sCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorfQorCiBmaWxlZ3JvdXAgewogICAgIG5hbWU6ICJsaWJtZWRpYV9vbXhfYWlkbCIsCiAgICAgc3JjczogWwpAQCAtMjAzLDcgKzI0Miw3IEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2RhdGFzb3VyY2VfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKIApAQCAtMjIwLDYgKzI1OSwxNCBAQAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KIAogY2NfbGlicmFyeV9zaGFyZWQgewpAQCAtMzA5LDExICszNTYsMTMgQEAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgICAgICJqbmlfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgICAgICAiam5pX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtMzcyLDMgKzQyMSwzNiBAQAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKIH0KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJtZWRpYV9uZGtmb3JtYXRwcml2IiwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiTmRrTWVkaWFGb3JtYXRQcml2LmNwcCIsCisgICAgICAgICJOZGtNZWRpYUVycm9yUHJpdi5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ERVhQT1JUPV9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoXCJkZWZhdWx0XCIpKSkiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIGFwZXhfYXZhaWxhYmxlOiBbImNvbS5hbmRyb2lkLm1lZGlhIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcCBiL21lZGlhL2xpYm1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwCmluZGV4IDVjNmI5ODEuLjY0YmE5NzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwCkBAIC0yNjgsNyArMjY4LDcgQEAKIAogICAgICAgICAgICAgICAgIHVjbnZfY29udmVydEV4KG1VdGY4Q29udiwgY29udiwgJnRhcmdldCwgdGFyZ2V0ICsgdGFyZ2V0TGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZSwgc291cmNlICsgc3RybGVuKHNvdXJjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBUUlVFLCBUUlVFLCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIHRydWUsIHRydWUsICZzdGF0dXMpOwogCiAgICAgICAgICAgICAgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJ1Y252X2NvbnZlcnRFeCBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCmluZGV4IGVhYTJlNjMuLmM4OWMwMjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcApAQCAtMzUsNTMgKzM1LDYgQEAKIAogdXNpbmcgbWVkaWE6OlZvbHVtZVNoYXBlcjsKIAotZW51bSB7Ci0gICAgRElTQ09OTkVDVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgU0VUX0RBVEFfU09VUkNFX1VSTCwKLSAgICBTRVRfREFUQV9TT1VSQ0VfRkQsCi0gICAgU0VUX0RBVEFfU09VUkNFX1NUUkVBTSwKLSAgICBTRVRfREFUQV9TT1VSQ0VfQ0FMTEJBQ0ssCi0gICAgU0VUX0JVRkZFUklOR19TRVRUSU5HUywKLSAgICBHRVRfQlVGRkVSSU5HX1NFVFRJTkdTLAotICAgIFBSRVBBUkVfQVNZTkMsCi0gICAgU1RBUlQsCi0gICAgU1RPUCwKLSAgICBJU19QTEFZSU5HLAotICAgIFNFVF9QTEFZQkFDS19TRVRUSU5HUywKLSAgICBHRVRfUExBWUJBQ0tfU0VUVElOR1MsCi0gICAgU0VUX1NZTkNfU0VUVElOR1MsCi0gICAgR0VUX1NZTkNfU0VUVElOR1MsCi0gICAgUEFVU0UsCi0gICAgU0VFS19UTywKLSAgICBHRVRfQ1VSUkVOVF9QT1NJVElPTiwKLSAgICBHRVRfRFVSQVRJT04sCi0gICAgUkVTRVQsCi0gICAgTk9USUZZX0FULAotICAgIFNFVF9BVURJT19TVFJFQU1fVFlQRSwKLSAgICBTRVRfTE9PUElORywKLSAgICBTRVRfVk9MVU1FLAotICAgIElOVk9LRSwKLSAgICBTRVRfTUVUQURBVEFfRklMVEVSLAotICAgIEdFVF9NRVRBREFUQSwKLSAgICBTRVRfQVVYX0VGRkVDVF9TRU5EX0xFVkVMLAotICAgIEFUVEFDSF9BVVhfRUZGRUNULAotICAgIFNFVF9WSURFT19TVVJGQUNFVEVYVFVSRSwKLSAgICBTRVRfUEFSQU1FVEVSLAotICAgIEdFVF9QQVJBTUVURVIsCi0gICAgU0VUX1JFVFJBTlNNSVRfRU5EUE9JTlQsCi0gICAgR0VUX1JFVFJBTlNNSVRfRU5EUE9JTlQsCi0gICAgU0VUX05FWFRfUExBWUVSLAotICAgIEFQUExZX1ZPTFVNRV9TSEFQRVIsCi0gICAgR0VUX1ZPTFVNRV9TSEFQRVJfU1RBVEUsCi0gICAgLy8gTW9kdWxhciBEUk0KLSAgICBQUkVQQVJFX0RSTSwKLSAgICBSRUxFQVNFX0RSTSwKLSAgICAvLyBBdWRpb1JvdXRpbmcKLSAgICBTRVRfT1VUUFVUX0RFVklDRSwKLSAgICBHRVRfUk9VVEVEX0RFVklDRV9JRCwKLSAgICBFTkFCTEVfQVVESU9fREVWSUNFX0NBTExCQUNLLAotfTsKLQogLy8gTW9kRHJtIGhlbHBlcnMKIHN0YXRpYyBzdGF0dXNfdCByZWFkVmVjdG9yKGNvbnN0IFBhcmNlbCYgcmVwbHksIFZlY3Rvcjx1aW50OF90PiYgdmVjdG9yKSB7CiAgICAgdWludDMyX3Qgc2l6ZSA9IDA7CkBAIC0xODgsNiArMTQxLDE1IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IFN0cmluZzgmIHJ0cFBhcmFtcykgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KHJ0cFBhcmFtcyk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfREFUQV9TT1VSQ0VfUlRQLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKICAgICAvLyBwYXNzIHRoZSBidWZmZXJlZCBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIHRvIHRoZSBtZWRpYSBwbGF5ZXIgc2VydmljZQogICAgIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyKQogICAgIHsKQEAgLTcxMiw2ICs2NzQsMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQorICAgICAgICBjYXNlIFNFVF9EQVRBX1NPVVJDRV9SVFA6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIFN0cmluZzggcnRwUGFyYW1zID0gZGF0YS5yZWFkU3RyaW5nOCgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0RGF0YVNvdXJjZShydHBQYXJhbXMpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQogICAgICAgICBjYXNlIFNFVF9WSURFT19TVVJGQUNFVEVYVFVSRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gYnVmZmVyUHJvZHVjZXIgPQpAQCAtOTg1LDcgKzk1Myw3IEBACiAgICAgICAgIGNhc2UgUFJFUEFSRV9EUk06IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgdWludDhfdCB1dWlkWzE2XTsKKyAgICAgICAgICAgIHVpbnQ4X3QgdXVpZFsxNl0gPSB7fTsKICAgICAgICAgICAgIGRhdGEucmVhZCh1dWlkLCBzaXplb2YodXVpZCkpOwogICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGRybVNlc3Npb25JZDsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlYWRWZWN0b3IoZGF0YSwgZHJtU2Vzc2lvbklkKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcAppbmRleCBhYzg2ZjcyLi4xNTQ5ODhkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCkBAIC02Niw2ICs2Niw3IEBACiAgICAgRU5BQkxFX0FVRElPX0RFVklDRV9DQUxMQkFDSywKICAgICBHRVRfQUNUSVZFX01JQ1JPUEhPTkVTLAogICAgIEdFVF9QT1JUX0lELAorICAgIEdFVF9SVFBfREFUQV9VU0FHRSwKICAgICBTRVRfUFJFRkVSUkVEX01JQ1JPUEhPTkVfRElSRUNUSU9OLAogICAgIFNFVF9QUkVGRVJSRURfTUlDUk9QSE9ORV9GSUVMRF9ESU1FTlNJT04sCiAgICAgU0VUX1BSSVZBQ1lfU0VOU0lUSVZFLApAQCAtNDc2LDYgKzQ3NywyMyBAQAogICAgICAgICAqcG9ydElkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CisKKyAgICBzdGF0dXNfdCBnZXRSdHBEYXRhVXNhZ2UodWludDY0X3QgKmJ5dGVzKQorICAgIHsKKyAgICAgICAgQUxPR1YoImdldFJ0cERhdGFVc2FnZSIpOworICAgICAgICBpZiAoYnl0ZXMgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZWNvcmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9SVFBfREFUQV9VU0FHRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSworICAgICAgICAgICAgICAgIHx8IChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAqYnl0ZXMgPSAwOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVwbHkucmVhZFVpbnQ2NChieXRlcyk7CisgICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE1lZGlhUmVjb3JkZXIsICJhbmRyb2lkLm1lZGlhLklNZWRpYVJlY29yZGVyIik7CkBAIC03NTksNiArNzc3LDE3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KKyAgICAgICAgY2FzZSBHRVRfUlRQX0RBVEFfVVNBR0U6IHsKKyAgICAgICAgICAgIEFMT0dWKCJHRVRfUlRQX0RBVEFfVVNBR0UiKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgdWludDY0X3QgYnl0ZXM7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRSdHBEYXRhVXNhZ2UoJmJ5dGVzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlVWludDY0KGJ5dGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQogICAgICAgICBjYXNlIFNFVF9QUkVGRVJSRURfTUlDUk9QSE9ORV9ESVJFQ1RJT046IHsKICAgICAgICAgICAgIEFMT0dWKCJTRVRfUFJFRkVSUkVEX01JQ1JPUEhPTkVfRElSRUNUSU9OIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUmVjb3JkZXIsIGRhdGEsIHJlcGx5KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKaW5kZXggNjM3MzIyZi4uYmQxN2Y0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKQEAgLTE2OCw2ICsxNjgsNyBAQAogICAgIEFMT0dWKCJmcmFtZSB3aWR0aDogJWQiLCBjb2RlYy5tRnJhbWVXaWR0aCk7CiAgICAgQUxPR1YoImZyYW1lIGhlaWdodDogJWQiLCBjb2RlYy5tRnJhbWVIZWlnaHQpOwogICAgIEFMT0dWKCJmcmFtZSByYXRlOiAlZCIsIGNvZGVjLm1GcmFtZVJhdGUpOworICAgIEFMT0dWKCJwcm9maWxlOiAlZCIsIGNvZGVjLm1Qcm9maWxlKTsKIH0KIAogLypzdGF0aWMqLyB2b2lkCkBAIC0xNzgsNiArMTc5LDcgQEAKICAgICBBTE9HVigiYml0IHJhdGU6ICVkIiwgY29kZWMubUJpdFJhdGUpOwogICAgIEFMT0dWKCJzYW1wbGUgcmF0ZTogJWQiLCBjb2RlYy5tU2FtcGxlUmF0ZSk7CiAgICAgQUxPR1YoIm51bWJlciBvZiBjaGFubmVsczogJWQiLCBjb2RlYy5tQ2hhbm5lbHMpOworICAgIEFMT0dWKCJwcm9maWxlOiAlZCIsIGNvZGVjLm1Qcm9maWxlKTsKIH0KIAogLypzdGF0aWMqLyB2b2lkCkBAIC0yMjksMTAgKzIzMSwxMSBAQAogICAgIHJldHVybiB0YWc7CiB9CiAKLS8qc3RhdGljKi8gTWVkaWFQcm9maWxlczo6VmlkZW9Db2RlYyoKLU1lZGlhUHJvZmlsZXM6OmNyZWF0ZVZpZGVvQ29kZWMoY29uc3QgY2hhciAqKmF0dHMsIE1lZGlhUHJvZmlsZXMgKnByb2ZpbGVzKQorLypzdGF0aWMqLyB2b2lkCitNZWRpYVByb2ZpbGVzOjpjcmVhdGVWaWRlb0NvZGVjKGNvbnN0IGNoYXIgKiphdHRzLCBzaXplX3QgbmF0dHMsIE1lZGlhUHJvZmlsZXMgKnByb2ZpbGVzKQogewotICAgIENIRUNLKCFzdHJjbXAoImNvZGVjIiwgICAgIGF0dHNbMF0pICYmCisgICAgQ0hFQ0sobmF0dHMgPj0gMTAgJiYKKyAgICAgICAgICAhc3RyY21wKCJjb2RlYyIsICAgICBhdHRzWzBdKSAmJgogICAgICAgICAgICFzdHJjbXAoImJpdFJhdGUiLCAgIGF0dHNbMl0pICYmCiAgICAgICAgICAgIXN0cmNtcCgid2lkdGgiLCAgICAgYXR0c1s0XSkgJiYKICAgICAgICAgICAhc3RyY21wKCJoZWlnaHQiLCAgICBhdHRzWzZdKSAmJgpAQCAtMjQwLDQ5ICsyNDMsNjkgQEAKIAogICAgIGNvbnN0IHNpemVfdCBuTWFwcGluZ3MgPSBzaXplb2Yoc1ZpZGVvRW5jb2Rlck5hbWVNYXApL3NpemVvZihzVmlkZW9FbmNvZGVyTmFtZU1hcFswXSk7CiAgICAgY29uc3QgaW50IGNvZGVjID0gZmluZFRhZ0Zvck5hbWUoc1ZpZGVvRW5jb2Rlck5hbWVNYXAsIG5NYXBwaW5ncywgYXR0c1sxXSk7Ci0gICAgQ0hFQ0soY29kZWMgIT0gLTEpOworICAgIGlmIChjb2RlYyA9PSAtMSkgeworICAgICAgICBBTE9HRSgiTWVkaWFQcm9maWxlczo6Y3JlYXRlVmlkZW9Db2RlYyBmYWlsZWQgdG8gbG9jYXRlIGNvZGVjICVzIiwgYXR0c1sxXSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgICBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjICp2aWRlb0NvZGVjID0KLSAgICAgICAgbmV3IE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMoc3RhdGljX2Nhc3Q8dmlkZW9fZW5jb2Rlcj4oY29kZWMpLAotICAgICAgICAgICAgYXRvaShhdHRzWzNdKSwgYXRvaShhdHRzWzVdKSwgYXRvaShhdHRzWzddKSwgYXRvaShhdHRzWzldKSk7Ci0gICAgbG9nVmlkZW9Db2RlYygqdmlkZW9Db2RlYyk7CisgICAgaW50IHByb2ZpbGUgPSAtMTsKKyAgICBpZiAobmF0dHMgPj0gMTIgJiYgIXN0cmNtcCgicHJvZmlsZSIsIGF0dHNbMTBdKSkgeworICAgICAgICBwcm9maWxlID0gYXRvaShhdHRzWzExXSk7CisgICAgfQorCisgICAgVmlkZW9Db2RlYyB2aWRlb0NvZGVjIHsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHZpZGVvX2VuY29kZXI+KGNvZGVjKSwKKyAgICAgICAgICAgIGF0b2koYXR0c1szXSksIGF0b2koYXR0c1s1XSksIGF0b2koYXR0c1s3XSksIGF0b2koYXR0c1s5XSksIHByb2ZpbGUgfTsKKyAgICBsb2dWaWRlb0NvZGVjKHZpZGVvQ29kZWMpOwogCiAgICAgc2l6ZV90IG5DYW1jb3JkZXJQcm9maWxlczsKICAgICBDSEVDSygobkNhbWNvcmRlclByb2ZpbGVzID0gcHJvZmlsZXMtPm1DYW1jb3JkZXJQcm9maWxlcy5zaXplKCkpID49IDEpOwotICAgIHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXNbbkNhbWNvcmRlclByb2ZpbGVzIC0gMV0tPm1WaWRlb0NvZGVjID0gdmlkZW9Db2RlYzsKLSAgICByZXR1cm4gdmlkZW9Db2RlYzsKKyAgICBwcm9maWxlcy0+bUNhbWNvcmRlclByb2ZpbGVzW25DYW1jb3JkZXJQcm9maWxlcyAtIDFdLT5tVmlkZW9Db2RlY3MuZW1wbGFjZV9iYWNrKHZpZGVvQ29kZWMpOwogfQogCi0vKnN0YXRpYyovIE1lZGlhUHJvZmlsZXM6OkF1ZGlvQ29kZWMqCi1NZWRpYVByb2ZpbGVzOjpjcmVhdGVBdWRpb0NvZGVjKGNvbnN0IGNoYXIgKiphdHRzLCBNZWRpYVByb2ZpbGVzICpwcm9maWxlcykKKy8qc3RhdGljKi8gdm9pZAorTWVkaWFQcm9maWxlczo6Y3JlYXRlQXVkaW9Db2RlYyhjb25zdCBjaGFyICoqYXR0cywgc2l6ZV90IG5hdHRzLCBNZWRpYVByb2ZpbGVzICpwcm9maWxlcykKIHsKLSAgICBDSEVDSyghc3RyY21wKCJjb2RlYyIsICAgICAgYXR0c1swXSkgJiYKKyAgICBDSEVDSyhuYXR0cyA+PSA4ICYmCisgICAgICAgICAgIXN0cmNtcCgiY29kZWMiLCAgICAgIGF0dHNbMF0pICYmCiAgICAgICAgICAgIXN0cmNtcCgiYml0UmF0ZSIsICAgIGF0dHNbMl0pICYmCiAgICAgICAgICAgIXN0cmNtcCgic2FtcGxlUmF0ZSIsIGF0dHNbNF0pICYmCiAgICAgICAgICAgIXN0cmNtcCgiY2hhbm5lbHMiLCAgIGF0dHNbNl0pKTsKICAgICBjb25zdCBzaXplX3Qgbk1hcHBpbmdzID0gc2l6ZW9mKHNBdWRpb0VuY29kZXJOYW1lTWFwKS9zaXplb2Yoc0F1ZGlvRW5jb2Rlck5hbWVNYXBbMF0pOwogICAgIGNvbnN0IGludCBjb2RlYyA9IGZpbmRUYWdGb3JOYW1lKHNBdWRpb0VuY29kZXJOYW1lTWFwLCBuTWFwcGluZ3MsIGF0dHNbMV0pOwotICAgIENIRUNLKGNvZGVjICE9IC0xKTsKKyAgICBpZiAoY29kZWMgPT0gLTEpIHsKKyAgICAgICAgQUxPR0UoIk1lZGlhUHJvZmlsZXM6OmNyZWF0ZUF1ZGlvQ29kZWMgZmFpbGVkIHRvIGxvY2F0ZSBjb2RlYyAlcyIsIGF0dHNbMV0pOworICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAgTWVkaWFQcm9maWxlczo6QXVkaW9Db2RlYyAqYXVkaW9Db2RlYyA9Ci0gICAgICAgIG5ldyBNZWRpYVByb2ZpbGVzOjpBdWRpb0NvZGVjKHN0YXRpY19jYXN0PGF1ZGlvX2VuY29kZXI+KGNvZGVjKSwKLSAgICAgICAgICAgIGF0b2koYXR0c1szXSksIGF0b2koYXR0c1s1XSksIGF0b2koYXR0c1s3XSkpOwotICAgIGxvZ0F1ZGlvQ29kZWMoKmF1ZGlvQ29kZWMpOworICAgIGludCBwcm9maWxlID0gLTE7CisgICAgaWYgKG5hdHRzID49IDEwICYmICFzdHJjbXAoInByb2ZpbGUiLCBhdHRzWzhdKSkgeworICAgICAgICBwcm9maWxlID0gYXRvaShhdHRzWzldKTsKKyAgICB9CisKKyAgICBBdWRpb0NvZGVjIGF1ZGlvQ29kZWN7CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19lbmNvZGVyPihjb2RlYyksCisgICAgICAgICAgICBhdG9pKGF0dHNbM10pLCBhdG9pKGF0dHNbNV0pLCBhdG9pKGF0dHNbN10pLCBwcm9maWxlIH07CisgICAgbG9nQXVkaW9Db2RlYyhhdWRpb0NvZGVjKTsKIAogICAgIHNpemVfdCBuQ2FtY29yZGVyUHJvZmlsZXM7CiAgICAgQ0hFQ0soKG5DYW1jb3JkZXJQcm9maWxlcyA9IHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXMuc2l6ZSgpKSA+PSAxKTsKLSAgICBwcm9maWxlcy0+bUNhbWNvcmRlclByb2ZpbGVzW25DYW1jb3JkZXJQcm9maWxlcyAtIDFdLT5tQXVkaW9Db2RlYyA9IGF1ZGlvQ29kZWM7Ci0gICAgcmV0dXJuIGF1ZGlvQ29kZWM7CisgICAgcHJvZmlsZXMtPm1DYW1jb3JkZXJQcm9maWxlc1tuQ2FtY29yZGVyUHJvZmlsZXMgLSAxXS0+bUF1ZGlvQ29kZWNzLmVtcGxhY2VfYmFjayhhdWRpb0NvZGVjKTsKIH0KKwogLypzdGF0aWMqLyBNZWRpYVByb2ZpbGVzOjpBdWRpb0RlY29kZXJDYXAqCi1NZWRpYVByb2ZpbGVzOjpjcmVhdGVBdWRpb0RlY29kZXJDYXAoY29uc3QgY2hhciAqKmF0dHMpCitNZWRpYVByb2ZpbGVzOjpjcmVhdGVBdWRpb0RlY29kZXJDYXAoY29uc3QgY2hhciAqKmF0dHMsIHNpemVfdCBuYXR0cykKIHsKLSAgICBDSEVDSyghc3RyY21wKCJuYW1lIiwgICAgYXR0c1swXSkgJiYKKyAgICBDSEVDSyhuYXR0cyA+PSA0ICYmCisgICAgICAgICAgIXN0cmNtcCgibmFtZSIsICAgIGF0dHNbMF0pICYmCiAgICAgICAgICAgIXN0cmNtcCgiZW5hYmxlZCIsIGF0dHNbMl0pKTsKIAogICAgIGNvbnN0IHNpemVfdCBuTWFwcGluZ3MgPSBzaXplb2Yoc0F1ZGlvRGVjb2Rlck5hbWVNYXApL3NpemVvZihzQXVkaW9EZWNvZGVyTmFtZU1hcFswXSk7CiAgICAgY29uc3QgaW50IGNvZGVjID0gZmluZFRhZ0Zvck5hbWUoc0F1ZGlvRGVjb2Rlck5hbWVNYXAsIG5NYXBwaW5ncywgYXR0c1sxXSk7Ci0gICAgQ0hFQ0soY29kZWMgIT0gLTEpOworICAgIGlmIChjb2RlYyA9PSAtMSkgeworICAgICAgQUxPR0UoIk1lZGlhUHJvZmlsZXM6OmNyZWF0ZUF1ZGlvRGVjb2RlckNhcCBmYWlsZWQgdG8gbG9jYXRlIGNvZGVjICVzIiwgYXR0c1sxXSk7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CiAKICAgICBNZWRpYVByb2ZpbGVzOjpBdWRpb0RlY29kZXJDYXAgKmNhcCA9CiAgICAgICAgIG5ldyBNZWRpYVByb2ZpbGVzOjpBdWRpb0RlY29kZXJDYXAoc3RhdGljX2Nhc3Q8YXVkaW9fZGVjb2Rlcj4oY29kZWMpKTsKQEAgLTI5MSwxNCArMzE0LDE4IEBACiB9CiAKIC8qc3RhdGljKi8gTWVkaWFQcm9maWxlczo6VmlkZW9EZWNvZGVyQ2FwKgotTWVkaWFQcm9maWxlczo6Y3JlYXRlVmlkZW9EZWNvZGVyQ2FwKGNvbnN0IGNoYXIgKiphdHRzKQorTWVkaWFQcm9maWxlczo6Y3JlYXRlVmlkZW9EZWNvZGVyQ2FwKGNvbnN0IGNoYXIgKiphdHRzLCBzaXplX3QgbmF0dHMpCiB7Ci0gICAgQ0hFQ0soIXN0cmNtcCgibmFtZSIsICAgIGF0dHNbMF0pICYmCisgICAgQ0hFQ0sobmF0dHMgPj0gNCAmJgorICAgICAgICAgICFzdHJjbXAoIm5hbWUiLCAgICBhdHRzWzBdKSAmJgogICAgICAgICAgICFzdHJjbXAoImVuYWJsZWQiLCBhdHRzWzJdKSk7CiAKICAgICBjb25zdCBzaXplX3Qgbk1hcHBpbmdzID0gc2l6ZW9mKHNWaWRlb0RlY29kZXJOYW1lTWFwKS9zaXplb2Yoc1ZpZGVvRGVjb2Rlck5hbWVNYXBbMF0pOwogICAgIGNvbnN0IGludCBjb2RlYyA9IGZpbmRUYWdGb3JOYW1lKHNWaWRlb0RlY29kZXJOYW1lTWFwLCBuTWFwcGluZ3MsIGF0dHNbMV0pOwotICAgIENIRUNLKGNvZGVjICE9IC0xKTsKKyAgICBpZiAoY29kZWMgPT0gLTEpIHsKKyAgICAgIEFMT0dFKCJNZWRpYVByb2ZpbGVzOjpjcmVhdGVWaWRlb0RlY29kZXJDYXAgZmFpbGVkIHRvIGxvY2F0ZSBjb2RlYyAlcyIsIGF0dHNbMV0pOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQogCiAgICAgTWVkaWFQcm9maWxlczo6VmlkZW9EZWNvZGVyQ2FwICpjYXAgPQogICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6VmlkZW9EZWNvZGVyQ2FwKHN0YXRpY19jYXN0PHZpZGVvX2RlY29kZXI+KGNvZGVjKSk7CkBAIC0zMDcsOSArMzM0LDEwIEBACiB9CiAKIC8qc3RhdGljKi8gTWVkaWFQcm9maWxlczo6VmlkZW9FbmNvZGVyQ2FwKgotTWVkaWFQcm9maWxlczo6Y3JlYXRlVmlkZW9FbmNvZGVyQ2FwKGNvbnN0IGNoYXIgKiphdHRzKQorTWVkaWFQcm9maWxlczo6Y3JlYXRlVmlkZW9FbmNvZGVyQ2FwKGNvbnN0IGNoYXIgKiphdHRzLCBzaXplX3QgbmF0dHMpCiB7Ci0gICAgQ0hFQ0soIXN0cmNtcCgibmFtZSIsICAgICAgICAgICBhdHRzWzBdKSAgJiYKKyAgICBDSEVDSyhuYXR0cyA+PSAyMCAmJgorICAgICAgICAgICFzdHJjbXAoIm5hbWUiLCAgICAgICAgICAgYXR0c1swXSkgICYmCiAgICAgICAgICAgIXN0cmNtcCgiZW5hYmxlZCIsICAgICAgICBhdHRzWzJdKSAgJiYKICAgICAgICAgICAhc3RyY21wKCJtaW5CaXRSYXRlIiwgICAgIGF0dHNbNF0pICAmJgogICAgICAgICAgICFzdHJjbXAoIm1heEJpdFJhdGUiLCAgICAgYXR0c1s2XSkgICYmCkBAIC0zMjIsNyArMzUwLDEwIEBACiAKICAgICBjb25zdCBzaXplX3Qgbk1hcHBpbmdzID0gc2l6ZW9mKHNWaWRlb0VuY29kZXJOYW1lTWFwKS9zaXplb2Yoc1ZpZGVvRW5jb2Rlck5hbWVNYXBbMF0pOwogICAgIGNvbnN0IGludCBjb2RlYyA9IGZpbmRUYWdGb3JOYW1lKHNWaWRlb0VuY29kZXJOYW1lTWFwLCBuTWFwcGluZ3MsIGF0dHNbMV0pOwotICAgIENIRUNLKGNvZGVjICE9IC0xKTsKKyAgICBpZiAoY29kZWMgPT0gLTEpIHsKKyAgICAgIEFMT0dFKCJNZWRpYVByb2ZpbGVzOjpjcmVhdGVWaWRlb0VuY29kZXJDYXAgZmFpbGVkIHRvIGxvY2F0ZSBjb2RlYyAlcyIsIGF0dHNbMV0pOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQogCiAgICAgTWVkaWFQcm9maWxlczo6VmlkZW9FbmNvZGVyQ2FwICpjYXAgPQogICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6VmlkZW9FbmNvZGVyQ2FwKHN0YXRpY19jYXN0PHZpZGVvX2VuY29kZXI+KGNvZGVjKSwKQEAgLTMzMyw5ICszNjQsMTAgQEAKIH0KIAogLypzdGF0aWMqLyBNZWRpYVByb2ZpbGVzOjpBdWRpb0VuY29kZXJDYXAqCi1NZWRpYVByb2ZpbGVzOjpjcmVhdGVBdWRpb0VuY29kZXJDYXAoY29uc3QgY2hhciAqKmF0dHMpCitNZWRpYVByb2ZpbGVzOjpjcmVhdGVBdWRpb0VuY29kZXJDYXAoY29uc3QgY2hhciAqKmF0dHMsIHNpemVfdCBuYXR0cykKIHsKLSAgICBDSEVDSyghc3RyY21wKCJuYW1lIiwgICAgICAgICAgYXR0c1swXSkgICYmCisgICAgQ0hFQ0sobmF0dHMgPj0gMTYgJiYKKyAgICAgICAgICAhc3RyY21wKCJuYW1lIiwgICAgICAgICAgYXR0c1swXSkgICYmCiAgICAgICAgICAgIXN0cmNtcCgiZW5hYmxlZCIsICAgICAgIGF0dHNbMl0pICAmJgogICAgICAgICAgICFzdHJjbXAoIm1pbkJpdFJhdGUiLCAgICBhdHRzWzRdKSAgJiYKICAgICAgICAgICAhc3RyY21wKCJtYXhCaXRSYXRlIiwgICAgYXR0c1s2XSkgICYmCkBAIC0zNDYsNyArMzc4LDEwIEBACiAKICAgICBjb25zdCBzaXplX3Qgbk1hcHBpbmdzID0gc2l6ZW9mKHNBdWRpb0VuY29kZXJOYW1lTWFwKS9zaXplb2Yoc0F1ZGlvRW5jb2Rlck5hbWVNYXBbMF0pOwogICAgIGNvbnN0IGludCBjb2RlYyA9IGZpbmRUYWdGb3JOYW1lKHNBdWRpb0VuY29kZXJOYW1lTWFwLCBuTWFwcGluZ3MsIGF0dHNbMV0pOwotICAgIENIRUNLKGNvZGVjICE9IC0xKTsKKyAgICBpZiAoY29kZWMgPT0gLTEpIHsKKyAgICAgIEFMT0dFKCJNZWRpYVByb2ZpbGVzOjpjcmVhdGVBdWRpb0VuY29kZXJDYXAgZmFpbGVkIHRvIGxvY2F0ZSBjb2RlYyAlcyIsIGF0dHNbMV0pOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQogCiAgICAgTWVkaWFQcm9maWxlczo6QXVkaW9FbmNvZGVyQ2FwICpjYXAgPQogICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6QXVkaW9FbmNvZGVyQ2FwKHN0YXRpY19jYXN0PGF1ZGlvX2VuY29kZXI+KGNvZGVjKSwgYXRvaShhdHRzWzVdKSwKQEAgLTM1Niw5ICszOTEsMTAgQEAKIH0KIAogLypzdGF0aWMqLyBvdXRwdXRfZm9ybWF0Ci1NZWRpYVByb2ZpbGVzOjpjcmVhdGVFbmNvZGVyT3V0cHV0RmlsZUZvcm1hdChjb25zdCBjaGFyICoqYXR0cykKK01lZGlhUHJvZmlsZXM6OmNyZWF0ZUVuY29kZXJPdXRwdXRGaWxlRm9ybWF0KGNvbnN0IGNoYXIgKiphdHRzLCBzaXplX3QgbmF0dHMpCiB7Ci0gICAgQ0hFQ0soIXN0cmNtcCgibmFtZSIsIGF0dHNbMF0pKTsKKyAgICBDSEVDSyhuYXR0cyA+PSAyICYmCisgICAgICAgICAgIXN0cmNtcCgibmFtZSIsIGF0dHNbMF0pKTsKIAogICAgIGNvbnN0IHNpemVfdCBuTWFwcGluZ3MgPXNpemVvZihzRmlsZUZvcm1hdE1hcCkvc2l6ZW9mKHNGaWxlRm9ybWF0TWFwWzBdKTsKICAgICBjb25zdCBpbnQgZm9ybWF0ID0gZmluZFRhZ0Zvck5hbWUoc0ZpbGVGb3JtYXRNYXAsIG5NYXBwaW5ncywgYXR0c1sxXSk7CkBAIC0zNzcsMjAgKzQxMywyOCBAQAogfQogCiAvKnN0YXRpYyovIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUqCi1NZWRpYVByb2ZpbGVzOjpjcmVhdGVDYW1jb3JkZXJQcm9maWxlKGludCBjYW1lcmFJZCwgY29uc3QgY2hhciAqKmF0dHMsIFZlY3RvcjxpbnQ+JiBjYW1lcmFJZHMpCitNZWRpYVByb2ZpbGVzOjpjcmVhdGVDYW1jb3JkZXJQcm9maWxlKAorICAgICAgICBpbnQgY2FtZXJhSWQsIGNvbnN0IGNoYXIgKiphdHRzLCBzaXplX3QgbmF0dHMsIFZlY3RvcjxpbnQ+JiBjYW1lcmFJZHMpCiB7Ci0gICAgQ0hFQ0soIXN0cmNtcCgicXVhbGl0eSIsICAgIGF0dHNbMF0pICYmCisgICAgQ0hFQ0sobmF0dHMgPj0gNiAmJgorICAgICAgICAgICFzdHJjbXAoInF1YWxpdHkiLCAgICBhdHRzWzBdKSAmJgogICAgICAgICAgICFzdHJjbXAoImZpbGVGb3JtYXQiLCBhdHRzWzJdKSAmJgogICAgICAgICAgICFzdHJjbXAoImR1cmF0aW9uIiwgICBhdHRzWzRdKSk7CiAKICAgICBjb25zdCBzaXplX3QgblByb2ZpbGVNYXBwaW5ncyA9IHNpemVvZihzQ2FtY29yZGVyUXVhbGl0eU5hbWVNYXApLwogICAgICAgICAgICAgc2l6ZW9mKHNDYW1jb3JkZXJRdWFsaXR5TmFtZU1hcFswXSk7CiAgICAgY29uc3QgaW50IHF1YWxpdHkgPSBmaW5kVGFnRm9yTmFtZShzQ2FtY29yZGVyUXVhbGl0eU5hbWVNYXAsIG5Qcm9maWxlTWFwcGluZ3MsIGF0dHNbMV0pOwotICAgIENIRUNLKHF1YWxpdHkgIT0gLTEpOworICAgIGlmIChxdWFsaXR5ID09IC0xKSB7CisgICAgICBBTE9HRSgiTWVkaWFQcm9maWxlczo6Y3JlYXRlQ2FtY29yZGVyUHJvZmlsZSBmYWlsZWQgdG8gbG9jYXRlIHF1YWxpdHkgJXMiLCBhdHRzWzFdKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KIAogICAgIGNvbnN0IHNpemVfdCBuRm9ybWF0TWFwcGluZ3MgPSBzaXplb2Yoc0ZpbGVGb3JtYXRNYXApL3NpemVvZihzRmlsZUZvcm1hdE1hcFswXSk7CiAgICAgY29uc3QgaW50IGZpbGVGb3JtYXQgPSBmaW5kVGFnRm9yTmFtZShzRmlsZUZvcm1hdE1hcCwgbkZvcm1hdE1hcHBpbmdzLCBhdHRzWzNdKTsKLSAgICBDSEVDSyhmaWxlRm9ybWF0ICE9IC0xKTsKKyAgICBpZiAoZmlsZUZvcm1hdCA9PSAtMSkgeworICAgICAgQUxPR0UoIk1lZGlhUHJvZmlsZXM6OmNyZWF0ZUNhbWNvcmRlclByb2ZpbGUgZmFpbGVkIHRvIGxvY2F0ZSBmaWxlIGZvcm1hdCAlcyIsIGF0dHNbMV0pOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQogCiAgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqcHJvZmlsZSA9IG5ldyBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlOwogICAgIHByb2ZpbGUtPm1DYW1lcmFJZCA9IGNhbWVyYUlkOwpAQCAtNDE2LDkgKzQ2MCwxMCBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi12b2lkIE1lZGlhUHJvZmlsZXM6OmFkZEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWwoaW50IGNhbWVyYUlkLCBjb25zdCBjaGFyKiogYXR0cykKK3ZvaWQgTWVkaWFQcm9maWxlczo6YWRkSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbChpbnQgY2FtZXJhSWQsIGNvbnN0IGNoYXIqKiBhdHRzLCBzaXplX3QgbmF0dHMpCiB7Ci0gICAgQ0hFQ0soIXN0cmNtcCgicXVhbGl0eSIsIGF0dHNbMF0pKTsKKyAgICBDSEVDSyhuYXR0cyA+PSAyICYmCisgICAgICAgICAgIXN0cmNtcCgicXVhbGl0eSIsIGF0dHNbMF0pKTsKICAgICBpbnQgcXVhbGl0eSA9IGF0b2koYXR0c1sxXSk7CiAgICAgQUxPR1YoIiVzOiBjYW1lcmFJZD0lZCwgcXVhbGl0eT0lZCIsIF9fZnVuY19fLCBjYW1lcmFJZCwgcXVhbGl0eSk7CiAgICAgSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMgKmxldmVscyA9IGZpbmRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyhjYW1lcmFJZCk7CkBAIC00MzMsMTggKzQ3OCwxOSBAQAogfQogCiAvKnN0YXRpYyovIGludAotTWVkaWFQcm9maWxlczo6Z2V0Q2FtZXJhSWQoY29uc3QgY2hhcioqIGF0dHMpCitNZWRpYVByb2ZpbGVzOjpnZXRDYW1lcmFJZChjb25zdCBjaGFyKiogYXR0cywgc2l6ZV90IG5hdHRzKQogewogICAgIGlmICghYXR0c1swXSkgcmV0dXJuIDA7ICAvLyBkZWZhdWx0IGNhbWVyYUlkID0gMAotICAgIENIRUNLKCFzdHJjbXAoImNhbWVyYUlkIiwgYXR0c1swXSkpOworICAgIENIRUNLKG5hdHRzID49IDIgJiYKKyAgICAgICAgICAhc3RyY21wKCJjYW1lcmFJZCIsIGF0dHNbMF0pKTsKICAgICByZXR1cm4gYXRvaShhdHRzWzFdKTsKIH0KIAotdm9pZCBNZWRpYVByb2ZpbGVzOjphZGRTdGFydFRpbWVPZmZzZXQoaW50IGNhbWVyYUlkLCBjb25zdCBjaGFyKiogYXR0cykKK3ZvaWQgTWVkaWFQcm9maWxlczo6YWRkU3RhcnRUaW1lT2Zmc2V0KGludCBjYW1lcmFJZCwgY29uc3QgY2hhcioqIGF0dHMsIHNpemVfdCBuYXR0cykKIHsKICAgICBpbnQgb2Zmc2V0VGltZU1zID0gMTAwMDsKLSAgICBpZiAoYXR0c1syXSkgewotICAgICAgICBDSEVDSyghc3RyY21wKCJzdGFydE9mZnNldE1zIiwgYXR0c1syXSkpOworICAgIGlmIChuYXR0cyA+PSAzICYmIGF0dHNbMl0pIHsKKyAgICAgICAgQ0hFQ0sobmF0dHMgPj0gNCAmJiAhc3RyY21wKCJzdGFydE9mZnNldE1zIiwgYXR0c1syXSkpOwogICAgICAgICBvZmZzZXRUaW1lTXMgPSBhdG9pKGF0dHNbM10pOwogICAgIH0KIApAQCAtNDU1LDMzICs1MDEsNTggQEAKIC8qc3RhdGljKi8gdm9pZAogTWVkaWFQcm9maWxlczo6c3RhcnRFbGVtZW50SGFuZGxlcih2b2lkICp1c2VyRGF0YSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHMpCiB7Ci0gICAgTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMgPSAoTWVkaWFQcm9maWxlcyAqKSB1c2VyRGF0YTsKKyAgICAvLyBkZXRlcm1pbmUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMKKyAgICBzaXplX3QgbmF0dHMgPSAwOworICAgIHdoaWxlIChhdHRzW25hdHRzXSkgeworICAgICAgICArK25hdHRzOworICAgIH0KKworICAgIE1lZGlhUHJvZmlsZXMgKnByb2ZpbGVzID0gKE1lZGlhUHJvZmlsZXMgKil1c2VyRGF0YTsKICAgICBpZiAoc3RyY21wKCJWaWRlbyIsIG5hbWUpID09IDApIHsKLSAgICAgICAgY3JlYXRlVmlkZW9Db2RlYyhhdHRzLCBwcm9maWxlcyk7CisgICAgICAgIGNyZWF0ZVZpZGVvQ29kZWMoYXR0cywgbmF0dHMsIHByb2ZpbGVzKTsKICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiQXVkaW8iLCBuYW1lKSA9PSAwKSB7Ci0gICAgICAgIGNyZWF0ZUF1ZGlvQ29kZWMoYXR0cywgcHJvZmlsZXMpOworICAgICAgICBjcmVhdGVBdWRpb0NvZGVjKGF0dHMsIG5hdHRzLCBwcm9maWxlcyk7CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIlZpZGVvRW5jb2RlckNhcCIsIG5hbWUpID09IDAgJiYKKyAgICAgICAgICAgICAgIG5hdHRzID49IDQgJiYKICAgICAgICAgICAgICAgIHN0cmNtcCgidHJ1ZSIsIGF0dHNbM10pID09IDApIHsKLSAgICAgICAgcHJvZmlsZXMtPm1WaWRlb0VuY29kZXJzLmFkZChjcmVhdGVWaWRlb0VuY29kZXJDYXAoYXR0cykpOworICAgICAgICBNZWRpYVByb2ZpbGVzOjpWaWRlb0VuY29kZXJDYXAqIGNhcCA9IGNyZWF0ZVZpZGVvRW5jb2RlckNhcChhdHRzLCBuYXR0cyk7CisgICAgICAgIGlmIChjYXAgIT0gbnVsbHB0cikgeworICAgICAgICAgIHByb2ZpbGVzLT5tVmlkZW9FbmNvZGVycy5hZGQoY2FwKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoc3RyY21wKCJBdWRpb0VuY29kZXJDYXAiLCBuYW1lKSA9PSAwICYmCisgICAgICAgICAgICAgICBuYXR0cyA+PSA0ICYmCiAgICAgICAgICAgICAgICBzdHJjbXAoInRydWUiLCBhdHRzWzNdKSA9PSAwKSB7Ci0gICAgICAgIHByb2ZpbGVzLT5tQXVkaW9FbmNvZGVycy5hZGQoY3JlYXRlQXVkaW9FbmNvZGVyQ2FwKGF0dHMpKTsKKyAgICAgICAgTWVkaWFQcm9maWxlczo6QXVkaW9FbmNvZGVyQ2FwKiBjYXAgPSBjcmVhdGVBdWRpb0VuY29kZXJDYXAoYXR0cywgbmF0dHMpOworICAgICAgICBpZiAoY2FwICE9IG51bGxwdHIpIHsKKyAgICAgICAgICBwcm9maWxlcy0+bUF1ZGlvRW5jb2RlcnMuYWRkKGNhcCk7CisgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiVmlkZW9EZWNvZGVyQ2FwIiwgbmFtZSkgPT0gMCAmJgorICAgICAgICAgICAgICAgbmF0dHMgPj0gNCAmJgogICAgICAgICAgICAgICAgc3RyY21wKCJ0cnVlIiwgYXR0c1szXSkgPT0gMCkgewotICAgICAgICBwcm9maWxlcy0+bVZpZGVvRGVjb2RlcnMuYWRkKGNyZWF0ZVZpZGVvRGVjb2RlckNhcChhdHRzKSk7CisgICAgICAgIE1lZGlhUHJvZmlsZXM6OlZpZGVvRGVjb2RlckNhcCogY2FwID0gY3JlYXRlVmlkZW9EZWNvZGVyQ2FwKGF0dHMsIG5hdHRzKTsKKyAgICAgICAgaWYgKGNhcCAhPSBudWxscHRyKSB7CisgICAgICAgICAgcHJvZmlsZXMtPm1WaWRlb0RlY29kZXJzLmFkZChjYXApOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIkF1ZGlvRGVjb2RlckNhcCIsIG5hbWUpID09IDAgJiYKKyAgICAgICAgICAgICAgIG5hdHRzID49IDQgJiYKICAgICAgICAgICAgICAgIHN0cmNtcCgidHJ1ZSIsIGF0dHNbM10pID09IDApIHsKLSAgICAgICAgcHJvZmlsZXMtPm1BdWRpb0RlY29kZXJzLmFkZChjcmVhdGVBdWRpb0RlY29kZXJDYXAoYXR0cykpOworICAgICAgICBNZWRpYVByb2ZpbGVzOjpBdWRpb0RlY29kZXJDYXAqIGNhcCA9IGNyZWF0ZUF1ZGlvRGVjb2RlckNhcChhdHRzLCBuYXR0cyk7CisgICAgICAgIGlmIChjYXAgIT0gbnVsbHB0cikgeworICAgICAgICAgIHByb2ZpbGVzLT5tQXVkaW9EZWNvZGVycy5hZGQoY2FwKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoc3RyY21wKCJFbmNvZGVyT3V0cHV0RmlsZUZvcm1hdCIsIG5hbWUpID09IDApIHsKLSAgICAgICAgcHJvZmlsZXMtPm1FbmNvZGVyT3V0cHV0RmlsZUZvcm1hdHMuYWRkKGNyZWF0ZUVuY29kZXJPdXRwdXRGaWxlRm9ybWF0KGF0dHMpKTsKKyAgICAgICAgcHJvZmlsZXMtPm1FbmNvZGVyT3V0cHV0RmlsZUZvcm1hdHMuYWRkKGNyZWF0ZUVuY29kZXJPdXRwdXRGaWxlRm9ybWF0KGF0dHMsIG5hdHRzKSk7CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIkNhbWNvcmRlclByb2ZpbGVzIiwgbmFtZSkgPT0gMCkgewotICAgICAgICBwcm9maWxlcy0+bUN1cnJlbnRDYW1lcmFJZCA9IGdldENhbWVyYUlkKGF0dHMpOwotICAgICAgICBwcm9maWxlcy0+YWRkU3RhcnRUaW1lT2Zmc2V0KHByb2ZpbGVzLT5tQ3VycmVudENhbWVyYUlkLCBhdHRzKTsKKyAgICAgICAgcHJvZmlsZXMtPm1DdXJyZW50Q2FtZXJhSWQgPSBnZXRDYW1lcmFJZChhdHRzLCBuYXR0cyk7CisgICAgICAgIHByb2ZpbGVzLT5hZGRTdGFydFRpbWVPZmZzZXQocHJvZmlsZXMtPm1DdXJyZW50Q2FtZXJhSWQsIGF0dHMsIG5hdHRzKTsKICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiRW5jb2RlclByb2ZpbGUiLCBuYW1lKSA9PSAwKSB7Ci0gICAgICAgIHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXMuYWRkKAotICAgICAgICAgICAgY3JlYXRlQ2FtY29yZGVyUHJvZmlsZShwcm9maWxlcy0+bUN1cnJlbnRDYW1lcmFJZCwgYXR0cywgcHJvZmlsZXMtPm1DYW1lcmFJZHMpKTsKKyAgICAgIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUqIHByb2ZpbGUgPSBjcmVhdGVDYW1jb3JkZXJQcm9maWxlKAorICAgICAgICAgIHByb2ZpbGVzLT5tQ3VycmVudENhbWVyYUlkLCBhdHRzLCBuYXR0cywgcHJvZmlsZXMtPm1DYW1lcmFJZHMpOworICAgICAgaWYgKHByb2ZpbGUgIT0gbnVsbHB0cikgeworICAgICAgICBwcm9maWxlcy0+bUNhbWNvcmRlclByb2ZpbGVzLmFkZChwcm9maWxlKTsKKyAgICAgIH0KICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiSW1hZ2VFbmNvZGluZyIsIG5hbWUpID09IDApIHsKLSAgICAgICAgcHJvZmlsZXMtPmFkZEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWwocHJvZmlsZXMtPm1DdXJyZW50Q2FtZXJhSWQsIGF0dHMpOworICAgICAgICBwcm9maWxlcy0+YWRkSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbChwcm9maWxlcy0+bUN1cnJlbnRDYW1lcmFJZCwgYXR0cywgbmF0dHMpOwogICAgIH0KIH0KIApAQCAtNTM1LDggKzYwNiwyMCBAQAogICAgIGluaXRSZXF1aXJlZFByb2ZpbGVSZWZzKG1DYW1lcmFJZHMpOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDAsIG4gPSBtQ2FtY29yZGVyUHJvZmlsZXMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgIGludCBwcm9kdWN0ID0gbUNhbWNvcmRlclByb2ZpbGVzW2ldLT5tVmlkZW9Db2RlYy0+bUZyYW1lV2lkdGggKgotICAgICAgICAgICAgICAgICAgICAgIG1DYW1jb3JkZXJQcm9maWxlc1tpXS0+bVZpZGVvQ29kZWMtPm1GcmFtZUhlaWdodDsKKyAgICAgICAgLy8gZW5zdXJlIGF0IGxlYXN0IG9uZSB2aWRlbyBhbmQgYXVkaW8gcHJvZmlsZSBpcyBhZGRlZAorICAgICAgICBpZiAobUNhbWNvcmRlclByb2ZpbGVzW2ldLT5tVmlkZW9Db2RlY3MuZW1wdHkoKSkgeworICAgICAgICAgICAgbUNhbWNvcmRlclByb2ZpbGVzW2ldLT5tVmlkZW9Db2RlY3MuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgICAgICBWSURFT19FTkNPREVSX0gyNjMsIDE5MjAwMCAvKiBiaXRyYXRlICovLAorICAgICAgICAgICAgICAgICAgICAxNzYgLyogd2lkdGggKi8sIDE0NCAvKiBoZWlnaHQgKi8sIDIwIC8qIGZyYW1lUmF0ZSAqLyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DYW1jb3JkZXJQcm9maWxlc1tpXS0+bUF1ZGlvQ29kZWNzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1DYW1jb3JkZXJQcm9maWxlc1tpXS0+bUF1ZGlvQ29kZWNzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fRU5DT0RFUl9BTVJfTkIsIDEyMjAwIC8qIGJpdHJhdGUgKi8sCisgICAgICAgICAgICAgICAgICAgIDgwMDAgLyogc2FtcGxlUmF0ZSAqLywgMSAvKiBjaGFubmVscyAqLyk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcHJvZHVjdCA9IG1DYW1jb3JkZXJQcm9maWxlc1tpXS0+bVZpZGVvQ29kZWNzWzBdLm1GcmFtZVdpZHRoICoKKyAgICAgICAgICAgICAgICAgICAgICBtQ2FtY29yZGVyUHJvZmlsZXNbaV0tPm1WaWRlb0NvZGVjc1swXS5tRnJhbWVIZWlnaHQ7CiAKICAgICAgICAgY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSA9IG1DYW1jb3JkZXJQcm9maWxlc1tpXS0+bVF1YWxpdHk7CiAgICAgICAgIGludCBjYW1lcmFJZCA9IG1DYW1jb3JkZXJQcm9maWxlc1tpXS0+bUNhbWVyYUlkOwpAQCAtNzA1LDM0ICs3ODgsMzUgQEAKIC8qc3RhdGljKi8gTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSoKIE1lZGlhUHJvZmlsZXM6OmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2VRY2lmUHJvZmlsZShjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KQogewotICAgIE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMgKnZpZGVvQ29kZWMgPQotICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6VmlkZW9Db2RlYyhWSURFT19FTkNPREVSX0gyNjMsIDEwMDAwMDAsIDE3NiwgMTQ0LCAyMCk7Ci0KLSAgICBBdWRpb0NvZGVjICphdWRpb0NvZGVjID0gbmV3IEF1ZGlvQ29kZWMoQVVESU9fRU5DT0RFUl9BTVJfTkIsIDEyMjAwLCA4MDAwLCAxKTsKICAgICBDYW1jb3JkZXJQcm9maWxlICpwcm9maWxlID0gbmV3IE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGU7CiAgICAgcHJvZmlsZS0+bUNhbWVyYUlkID0gMDsKICAgICBwcm9maWxlLT5tRmlsZUZvcm1hdCA9IE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQOwogICAgIHByb2ZpbGUtPm1RdWFsaXR5ID0gcXVhbGl0eTsKICAgICBwcm9maWxlLT5tRHVyYXRpb24gPSA2MDsKLSAgICBwcm9maWxlLT5tVmlkZW9Db2RlYyA9IHZpZGVvQ29kZWM7Ci0gICAgcHJvZmlsZS0+bUF1ZGlvQ29kZWMgPSBhdWRpb0NvZGVjOworICAgIHByb2ZpbGUtPm1WaWRlb0NvZGVjcy5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICBWSURFT19FTkNPREVSX0gyNjMsIDEwMDAwMDAgLyogYml0cmF0ZSAqLywKKyAgICAgICAgICAgIDE3NiAvKiB3aWR0aCAqLywgMTQ0IC8qIGhlaWdodCAqLywgMjAgLyogZnJhbWVSYXRlICovKTsKKyAgICBwcm9maWxlLT5tQXVkaW9Db2RlY3MuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgQVVESU9fRU5DT0RFUl9BTVJfTkIsIDEyMjAwIC8qIGJpdHJhdGUgKi8sCisgICAgICAgICAgICA4MDAwIC8qIHNhbXBsZVJhdGUgKi8sIDEgLyogY2hhbm5lbHMgKi8pOworCiAgICAgcmV0dXJuIHByb2ZpbGU7CiB9CiAKIC8qc3RhdGljKi8gTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSoKIE1lZGlhUHJvZmlsZXM6OmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2U0ODBwUHJvZmlsZShjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KQogewotICAgIE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMgKnZpZGVvQ29kZWMgPQotICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6VmlkZW9Db2RlYyhWSURFT19FTkNPREVSX0gyNjMsIDIwMDAwMDAwLCA3MjAsIDQ4MCwgMjApOwotCi0gICAgQXVkaW9Db2RlYyAqYXVkaW9Db2RlYyA9IG5ldyBBdWRpb0NvZGVjKEFVRElPX0VOQ09ERVJfQU1SX05CLCAxMjIwMCwgODAwMCwgMSk7CiAgICAgQ2FtY29yZGVyUHJvZmlsZSAqcHJvZmlsZSA9IG5ldyBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlOwogICAgIHByb2ZpbGUtPm1DYW1lcmFJZCA9IDA7CiAgICAgcHJvZmlsZS0+bUZpbGVGb3JtYXQgPSBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUDsKICAgICBwcm9maWxlLT5tUXVhbGl0eSA9IHF1YWxpdHk7CiAgICAgcHJvZmlsZS0+bUR1cmF0aW9uID0gNjA7Ci0gICAgcHJvZmlsZS0+bVZpZGVvQ29kZWMgPSB2aWRlb0NvZGVjOwotICAgIHByb2ZpbGUtPm1BdWRpb0NvZGVjID0gYXVkaW9Db2RlYzsKKyAgICBwcm9maWxlLT5tVmlkZW9Db2RlY3MuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgVklERU9fRU5DT0RFUl9IMjYzLCAyMDAwMDAwMCAvKiBiaXRyYXRlICovLAorICAgICAgICAgICAgNzIwIC8qIHdpZHRoICovLCA0ODAgLyogaGVpZ2h0ICovLCAyMCAvKiBmcmFtZVJhdGUgKi8pOworICAgIHByb2ZpbGUtPm1BdWRpb0NvZGVjcy5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICBBVURJT19FTkNPREVSX0FNUl9OQiwgMTIyMDAgLyogYml0cmF0ZSAqLywKKyAgICAgICAgICAgIDgwMDAgLyogc2FtcGxlUmF0ZSAqLywgMSAvKiBjaGFubmVscyAqLyk7CiAgICAgcmV0dXJuIHByb2ZpbGU7CiB9CiAKQEAgLTc1OSwzNiArODQzLDM0IEBACiAvKnN0YXRpYyovIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUqCiBNZWRpYVByb2ZpbGVzOjpjcmVhdGVEZWZhdWx0Q2FtY29yZGVyUWNpZlByb2ZpbGUoY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkKIHsKLSAgICBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjICp2aWRlb0NvZGVjID0KLSAgICAgICAgbmV3IE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMoVklERU9fRU5DT0RFUl9IMjYzLCAxOTIwMDAsIDE3NiwgMTQ0LCAyMCk7Ci0KLSAgICBNZWRpYVByb2ZpbGVzOjpBdWRpb0NvZGVjICphdWRpb0NvZGVjID0KLSAgICAgICAgbmV3IE1lZGlhUHJvZmlsZXM6OkF1ZGlvQ29kZWMoQVVESU9fRU5DT0RFUl9BTVJfTkIsIDEyMjAwLCA4MDAwLCAxKTsKLQotICAgIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUgKnByb2ZpbGUgPSBuZXcgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZTsKKyAgICBDYW1jb3JkZXJQcm9maWxlICpwcm9maWxlID0gbmV3IE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGU7CiAgICAgcHJvZmlsZS0+bUNhbWVyYUlkID0gMDsKICAgICBwcm9maWxlLT5tRmlsZUZvcm1hdCA9IE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQOwogICAgIHByb2ZpbGUtPm1RdWFsaXR5ID0gcXVhbGl0eTsKICAgICBwcm9maWxlLT5tRHVyYXRpb24gPSAzMDsKLSAgICBwcm9maWxlLT5tVmlkZW9Db2RlYyA9IHZpZGVvQ29kZWM7Ci0gICAgcHJvZmlsZS0+bUF1ZGlvQ29kZWMgPSBhdWRpb0NvZGVjOworICAgIHByb2ZpbGUtPm1WaWRlb0NvZGVjcy5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICBWSURFT19FTkNPREVSX0gyNjMsIDE5MjAwMCAvKiBiaXRyYXRlICovLAorICAgICAgICAgICAgMTc2IC8qIHdpZHRoICovLCAxNDQgLyogaGVpZ2h0ICovLCAyMCAvKiBmcmFtZVJhdGUgKi8pOworICAgIHByb2ZpbGUtPm1BdWRpb0NvZGVjcy5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICBBVURJT19FTkNPREVSX0FNUl9OQiwgMTIyMDAgLyogYml0cmF0ZSAqLywKKyAgICAgICAgICAgIDgwMDAgLyogc2FtcGxlUmF0ZSAqLywgMSAvKiBjaGFubmVscyAqLyk7CiAgICAgcmV0dXJuIHByb2ZpbGU7CiB9CiAKIC8qc3RhdGljKi8gTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSoKIE1lZGlhUHJvZmlsZXM6OmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJDaWZQcm9maWxlKGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpCiB7Ci0gICAgTWVkaWFQcm9maWxlczo6VmlkZW9Db2RlYyAqdmlkZW9Db2RlYyA9Ci0gICAgICAgIG5ldyBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjKFZJREVPX0VOQ09ERVJfSDI2MywgMzYwMDAwLCAzNTIsIDI4OCwgMjApOwotCi0gICAgQXVkaW9Db2RlYyAqYXVkaW9Db2RlYyA9IG5ldyBBdWRpb0NvZGVjKEFVRElPX0VOQ09ERVJfQU1SX05CLCAxMjIwMCwgODAwMCwgMSk7CiAgICAgQ2FtY29yZGVyUHJvZmlsZSAqcHJvZmlsZSA9IG5ldyBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlOwogICAgIHByb2ZpbGUtPm1DYW1lcmFJZCA9IDA7CiAgICAgcHJvZmlsZS0+bUZpbGVGb3JtYXQgPSBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUDsKICAgICBwcm9maWxlLT5tUXVhbGl0eSA9IHF1YWxpdHk7CiAgICAgcHJvZmlsZS0+bUR1cmF0aW9uID0gNjA7Ci0gICAgcHJvZmlsZS0+bVZpZGVvQ29kZWMgPSB2aWRlb0NvZGVjOwotICAgIHByb2ZpbGUtPm1BdWRpb0NvZGVjID0gYXVkaW9Db2RlYzsKKyAgICBwcm9maWxlLT5tVmlkZW9Db2RlY3MuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgVklERU9fRU5DT0RFUl9IMjYzLCAzNjAwMDAgLyogYml0cmF0ZSAqLywKKyAgICAgICAgICAgIDM1MiAvKiB3aWR0aCAqLywgMjg4IC8qIGhlaWdodCAqLywgMjAgLyogZnJhbWVSYXRlICovKTsKKyAgICBwcm9maWxlLT5tQXVkaW9Db2RlY3MuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgQVVESU9fRU5DT0RFUl9BTVJfTkIsIDEyMjAwIC8qIGJpdHJhdGUgKi8sCisgICAgICAgICAgICA4MDAwIC8qIHNhbXBsZVJhdGUgKi8sIDEgLyogY2hhbm5lbHMgKi8pOwogICAgIHJldHVybiBwcm9maWxlOwogfQogCkBAIC0xMDcyLDYgKzExNTQsMzYgQEAKICAgICByZXR1cm4gaW5kZXg7CiB9CiAKK2NvbnN0IE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUgKk1lZGlhUHJvZmlsZXM6OmdldENhbWNvcmRlclByb2ZpbGUoCisgICAgICAgICAgICBpbnQgY2FtZXJhSWQsIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpIGNvbnN0IHsKKyAgICBpbnQgaW5kZXggPSBnZXRDYW1jb3JkZXJQcm9maWxlSW5kZXgoY2FtZXJhSWQsIHF1YWxpdHkpOworICAgIGlmIChpbmRleCA9PSAtMSkgeworICAgICAgICBBTE9HRSgiVGhlIGdpdmVuIGNhbWNvcmRlciBwcm9maWxlIGNhbWVyYSAlZCBxdWFsaXR5ICVkIGlzIG5vdCBmb3VuZCIsCisgICAgICAgICAgICBjYW1lcmFJZCwgcXVhbGl0eSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBtQ2FtY29yZGVyUHJvZmlsZXNbaW5kZXhdOworfQorCitzdGQ6OnZlY3Rvcjxjb25zdCBNZWRpYVByb2ZpbGVzOjpBdWRpb0NvZGVjICo+CitNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlOjpnZXRBdWRpb0NvZGVjcygpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBNZWRpYVByb2ZpbGVzOjpBdWRpb0NvZGVjICo+IHJlczsKKyAgICBmb3IgKGNvbnN0IE1lZGlhUHJvZmlsZXM6OkF1ZGlvQ29kZWMgJmFjIDogbUF1ZGlvQ29kZWNzKSB7CisgICAgICAgIHJlcy5wdXNoX2JhY2soJmFjKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworc3RkOjp2ZWN0b3I8Y29uc3QgTWVkaWFQcm9maWxlczo6VmlkZW9Db2RlYyAqPgorTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZTo6Z2V0VmlkZW9Db2RlY3MoKSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgTWVkaWFQcm9maWxlczo6VmlkZW9Db2RlYyAqPiByZXM7CisgICAgZm9yIChjb25zdCBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjICZ2YyA6IG1WaWRlb0NvZGVjcykgeworICAgICAgICByZXMucHVzaF9iYWNrKCZ2Yyk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKIGludCBNZWRpYVByb2ZpbGVzOjpnZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWUoY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KSBjb25zdApAQCAtMTA4OCwxNSArMTIwMCwxNSBAQAogCiAgICAgaWYgKCFzdHJjbXAoImR1cmF0aW9uIiwgbmFtZSkpIHJldHVybiBtQ2FtY29yZGVyUHJvZmlsZXNbaW5kZXhdLT5tRHVyYXRpb247CiAgICAgaWYgKCFzdHJjbXAoImZpbGUuZm9ybWF0IiwgbmFtZSkpIHJldHVybiBtQ2FtY29yZGVyUHJvZmlsZXNbaW5kZXhdLT5tRmlsZUZvcm1hdDsKLSAgICBpZiAoIXN0cmNtcCgidmlkLmNvZGVjIiwgbmFtZSkpIHJldHVybiBtQ2FtY29yZGVyUHJvZmlsZXNbaW5kZXhdLT5tVmlkZW9Db2RlYy0+bUNvZGVjOwotICAgIGlmICghc3RyY21wKCJ2aWQud2lkdGgiLCBuYW1lKSkgcmV0dXJuIG1DYW1jb3JkZXJQcm9maWxlc1tpbmRleF0tPm1WaWRlb0NvZGVjLT5tRnJhbWVXaWR0aDsKLSAgICBpZiAoIXN0cmNtcCgidmlkLmhlaWdodCIsIG5hbWUpKSByZXR1cm4gbUNhbWNvcmRlclByb2ZpbGVzW2luZGV4XS0+bVZpZGVvQ29kZWMtPm1GcmFtZUhlaWdodDsKLSAgICBpZiAoIXN0cmNtcCgidmlkLmJwcyIsIG5hbWUpKSByZXR1cm4gbUNhbWNvcmRlclByb2ZpbGVzW2luZGV4XS0+bVZpZGVvQ29kZWMtPm1CaXRSYXRlOwotICAgIGlmICghc3RyY21wKCJ2aWQuZnBzIiwgbmFtZSkpIHJldHVybiBtQ2FtY29yZGVyUHJvZmlsZXNbaW5kZXhdLT5tVmlkZW9Db2RlYy0+bUZyYW1lUmF0ZTsKLSAgICBpZiAoIXN0cmNtcCgiYXVkLmNvZGVjIiwgbmFtZSkpIHJldHVybiBtQ2FtY29yZGVyUHJvZmlsZXNbaW5kZXhdLT5tQXVkaW9Db2RlYy0+bUNvZGVjOwotICAgIGlmICghc3RyY21wKCJhdWQuYnBzIiwgbmFtZSkpIHJldHVybiBtQ2FtY29yZGVyUHJvZmlsZXNbaW5kZXhdLT5tQXVkaW9Db2RlYy0+bUJpdFJhdGU7Ci0gICAgaWYgKCFzdHJjbXAoImF1ZC5jaCIsIG5hbWUpKSByZXR1cm4gbUNhbWNvcmRlclByb2ZpbGVzW2luZGV4XS0+bUF1ZGlvQ29kZWMtPm1DaGFubmVsczsKLSAgICBpZiAoIXN0cmNtcCgiYXVkLmh6IiwgbmFtZSkpIHJldHVybiBtQ2FtY29yZGVyUHJvZmlsZXNbaW5kZXhdLT5tQXVkaW9Db2RlYy0+bVNhbXBsZVJhdGU7CisgICAgaWYgKCFzdHJjbXAoInZpZC5jb2RlYyIsIG5hbWUpKSByZXR1cm4gbUNhbWNvcmRlclByb2ZpbGVzW2luZGV4XS0+bVZpZGVvQ29kZWNzWzBdLm1Db2RlYzsKKyAgICBpZiAoIXN0cmNtcCgidmlkLndpZHRoIiwgbmFtZSkpIHJldHVybiBtQ2FtY29yZGVyUHJvZmlsZXNbaW5kZXhdLT5tVmlkZW9Db2RlY3NbMF0ubUZyYW1lV2lkdGg7CisgICAgaWYgKCFzdHJjbXAoInZpZC5oZWlnaHQiLCBuYW1lKSkgcmV0dXJuIG1DYW1jb3JkZXJQcm9maWxlc1tpbmRleF0tPm1WaWRlb0NvZGVjc1swXS5tRnJhbWVIZWlnaHQ7CisgICAgaWYgKCFzdHJjbXAoInZpZC5icHMiLCBuYW1lKSkgcmV0dXJuIG1DYW1jb3JkZXJQcm9maWxlc1tpbmRleF0tPm1WaWRlb0NvZGVjc1swXS5tQml0UmF0ZTsKKyAgICBpZiAoIXN0cmNtcCgidmlkLmZwcyIsIG5hbWUpKSByZXR1cm4gbUNhbWNvcmRlclByb2ZpbGVzW2luZGV4XS0+bVZpZGVvQ29kZWNzWzBdLm1GcmFtZVJhdGU7CisgICAgaWYgKCFzdHJjbXAoImF1ZC5jb2RlYyIsIG5hbWUpKSByZXR1cm4gbUNhbWNvcmRlclByb2ZpbGVzW2luZGV4XS0+bUF1ZGlvQ29kZWNzWzBdLm1Db2RlYzsKKyAgICBpZiAoIXN0cmNtcCgiYXVkLmJwcyIsIG5hbWUpKSByZXR1cm4gbUNhbWNvcmRlclByb2ZpbGVzW2luZGV4XS0+bUF1ZGlvQ29kZWNzWzBdLm1CaXRSYXRlOworICAgIGlmICghc3RyY21wKCJhdWQuY2giLCBuYW1lKSkgcmV0dXJuIG1DYW1jb3JkZXJQcm9maWxlc1tpbmRleF0tPm1BdWRpb0NvZGVjc1swXS5tQ2hhbm5lbHM7CisgICAgaWYgKCFzdHJjbXAoImF1ZC5oeiIsIG5hbWUpKSByZXR1cm4gbUNhbWNvcmRlclByb2ZpbGVzW2luZGV4XS0+bUF1ZGlvQ29kZWNzWzBdLm1TYW1wbGVSYXRlOwogCiAgICAgQUxPR0UoIlRoZSBnaXZlbiBjYW1jb3JkZXIgcHJvZmlsZSBwYXJhbSBpZCAlZCBuYW1lICVzIGlzIG5vdCBmb3VuZCIsIGNhbWVyYUlkLCBuYW1lKTsKICAgICByZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVJlc291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhUmVzb3VyY2UuY3BwCmluZGV4IDA5MzZhOTkuLmZlODZkMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhUmVzb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhUmVzb3VyY2UuY3BwCkBAIC0zNSw3ICszNSw3IEBACiAgICAgdGhpcy0+dmFsdWUgPSB2YWx1ZTsKIH0KIAotTWVkaWFSZXNvdXJjZTo6TWVkaWFSZXNvdXJjZShUeXBlIHR5cGUsIGNvbnN0IHN0ZDo6dmVjdG9yPGludDhfdD4gJmlkLCBpbnQ2NF90IHZhbHVlKSB7CitNZWRpYVJlc291cmNlOjpNZWRpYVJlc291cmNlKFR5cGUgdHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmlkLCBpbnQ2NF90IHZhbHVlKSB7CiAgICAgdGhpcy0+dHlwZSA9IHR5cGU7CiAgICAgdGhpcy0+c3ViVHlwZSA9IFN1YlR5cGU6OmtVbnNwZWNpZmllZFN1YlR5cGU7CiAgICAgdGhpcy0+aWQgPSBpZDsKQEAgLTY2LDExICs2NiwxMSBAQAogfQogCiAvL3N0YXRpYwotTWVkaWFSZXNvdXJjZSBNZWRpYVJlc291cmNlOjpEcm1TZXNzaW9uUmVzb3VyY2UoY29uc3Qgc3RkOjp2ZWN0b3I8aW50OF90PiAmaWQsIGludDY0X3QgdmFsdWUpIHsKK01lZGlhUmVzb3VyY2UgTWVkaWFSZXNvdXJjZTo6RHJtU2Vzc2lvblJlc291cmNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZpZCwgaW50NjRfdCB2YWx1ZSkgewogICAgIHJldHVybiBNZWRpYVJlc291cmNlKFR5cGU6OmtEcm1TZXNzaW9uLCBpZCwgdmFsdWUpOwogfQogCi1zdGF0aWMgU3RyaW5nOCBieXRlc1RvSGV4U3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPGludDhfdD4gJmJ5dGVzKSB7CitzdGF0aWMgU3RyaW5nOCBieXRlc1RvSGV4U3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZieXRlcykgewogICAgIFN0cmluZzggc3RyOwogICAgIGZvciAoYXV0byAmYiA6IGJ5dGVzKSB7CiAgICAgICAgIHN0ci5hcHBlbmRGb3JtYXQoIiUwMngiLCBiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKaW5kZXggZTcxZWEyYy4uZjY4MmI2ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKQEAgLTE4LDggKzE4LDEwIEBACiAjZGVmaW5lIExPR19UQUcgIk1pZGlJb1dyYXBwZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CiAKICNpbmNsdWRlIDxtZWRpYS9NaWRpSW9XcmFwcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KQEAgLTMyLDYgKzM0LDggQEAKIH0KIAogbmFtZXNwYWNlIGFuZHJvaWQgeworaW50IE1pZGlJb1dyYXBwZXI6OnNDYWNoZUJ1ZmZlclNpemUgPSAwOworTXV0ZXggTWlkaUlvV3JhcHBlcjo6bUNhY2hlTG9jazsKIAogTWlkaUlvV3JhcHBlcjo6TWlkaUlvV3JhcHBlcihjb25zdCBjaGFyICpwYXRoKSB7CiAgICAgQUxPR1YoIk1pZGlJb1dyYXBwZXIoJXMpIiwgcGF0aCk7CkBAIC0zOSw2ICs0Myw4IEBACiAgICAgbUJhc2UgPSAwOwogICAgIG1MZW5ndGggPSBsc2VlayhtRmQsIDAsIFNFRUtfRU5EKTsKICAgICBtRGF0YVNvdXJjZSA9IG51bGxwdHI7CisgICAgbUNhY2hlQnVmZmVyID0gTlVMTDsKKyAgICBtQ2FjaGVCdWZSYW5nZUxlbmd0aCA9IDA7CiB9CiAKIE1pZGlJb1dyYXBwZXI6Ok1pZGlJb1dyYXBwZXIoaW50IGZkLCBvZmY2NF90IG9mZnNldCwgaW50NjRfdCBzaXplKSB7CkBAIC00Nyw2ICs1Myw4IEBACiAgICAgbUJhc2UgPSBvZmZzZXQ7CiAgICAgbUxlbmd0aCA9IHNpemU7CiAgICAgbURhdGFTb3VyY2UgPSBudWxscHRyOworICAgIG1DYWNoZUJ1ZmZlciA9IE5VTEw7CisgICAgbUNhY2hlQnVmUmFuZ2VMZW5ndGggPSAwOwogfQogCiBjbGFzcyBNaWRpSW9XcmFwcGVyOjpEYXRhU291cmNlVW53cmFwcGVyIHsKQEAgLTk2LDYgKzEwNCw4IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbUxlbmd0aCA9IDA7CiAgICAgfQorICAgIG1DYWNoZUJ1ZmZlciA9IE5VTEw7CisgICAgbUNhY2hlQnVmUmFuZ2VMZW5ndGggPSAwOwogfQogCiBNaWRpSW9XcmFwcGVyOjp+TWlkaUlvV3JhcHBlcigpIHsKQEAgLTEwNCwxMSArMTE0LDgwIEBACiAgICAgICAgIGNsb3NlKG1GZCk7CiAgICAgfQogICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKKworICAgIGlmIChOVUxMICE9IG1DYWNoZUJ1ZmZlcikgeworICAgICAgICBkZWxldGUgW10gbUNhY2hlQnVmZmVyOworICAgICAgICBtQ2FjaGVCdWZmZXIgPSBOVUxMOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhY2hlTG9jayk7CisgICAgICAgICAgICBzQ2FjaGVCdWZmZXJTaXplIC09IG1MZW5ndGg7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIGludCBNaWRpSW9XcmFwcGVyOjpyZWFkQXQodm9pZCAqYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkgewogICAgIEFMT0dWKCJyZWFkQXQoJXAsICVkLCAlZCkiLCBidWZmZXIsIG9mZnNldCwgc2l6ZSk7CiAKKyAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ICsgc2l6ZSA+IG1MZW5ndGgpIHsKKyAgICAgICAgc2l6ZSA9IG1MZW5ndGggLSBvZmZzZXQ7CisgICAgfQorCisgICAgaWYgKG1DYWNoZUJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FjaGVMb2NrKTsKKyAgICAgICAgaWYgKHNDYWNoZUJ1ZmZlclNpemUgKyBtTGVuZ3RoIDw9IGtUb3RhbENhY2hlU2l6ZSkgeworICAgICAgICAgICAgbUNhY2hlQnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVuc2lnbmVkIGNoYXJbbUxlbmd0aF07CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBtQ2FjaGVCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBzQ2FjaGVCdWZmZXJTaXplICs9IG1MZW5ndGg7CisgICAgICAgICAgICAgICAgQUxPR1YoInNDYWNoZUJ1ZmZlclNpemUgOiAlZCIsIHNDYWNoZUJ1ZmZlclNpemUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbUNhY2hlQnVmZmVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigibm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgbUNhY2hlQnVmZmVyIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUNhY2hlQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG1DYWNoZUJ1ZlJhbmdlTGVuZ3RoID4gMCAmJiBtQ2FjaGVCdWZSYW5nZUxlbmd0aCA+PSAob2Zmc2V0ICsgc2l6ZSkpIHsKKyAgICAgICAgICAgIC8qIFVzZSBidWZmZXJlZCBkYXRhICovCisgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLCAodm9pZCopKG1DYWNoZUJ1ZmZlciArIG9mZnNldCksIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBCdWZmZXIgbmV3IGRhdGEgKi8KKyAgICAgICAgICAgIGludDY0X3QgYmV5b25kQ2FjaGVCdWZSYW5nZUxlbmd0aCA9IChvZmZzZXQgKyBzaXplKSAtIG1DYWNoZUJ1ZlJhbmdlTGVuZ3RoOworICAgICAgICAgICAgaW50NjRfdCBudW1SZXF1aXJlZEJ5dGVzVG9DYWNoZSA9CisgICAgICAgICAgICAgICAgICBzdGQ6Om1heCgoaW50NjRfdClrU2luZ2xlQ2FjaGVTaXplLCBiZXlvbmRDYWNoZUJ1ZlJhbmdlTGVuZ3RoKTsKKyAgICAgICAgICAgIGludDY0X3QgYXZhaWxhYmxlUmVhZExlbmd0aCA9IG1MZW5ndGggLSBtQ2FjaGVCdWZSYW5nZUxlbmd0aDsKKyAgICAgICAgICAgIGludDY0X3QgcmVhZFNpemUgPSBzdGQ6Om1pbihhdmFpbGFibGVSZWFkTGVuZ3RoLCBudW1SZXF1aXJlZEJ5dGVzVG9DYWNoZSk7CisgICAgICAgICAgICBpbnQgYWN0dWFsTnVtQnl0ZXNSZWFkID0KKyAgICAgICAgICAgICAgICB1bmJ1ZmZlcmVkUmVhZEF0KG1DYWNoZUJ1ZmZlciArIG1DYWNoZUJ1ZlJhbmdlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlQnVmUmFuZ2VMZW5ndGgsIHJlYWRTaXplKTsKKyAgICAgICAgICAgIGlmKGFjdHVhbE51bUJ5dGVzUmVhZCA+IDApIHsKKyAgICAgICAgICAgICAgICBtQ2FjaGVCdWZSYW5nZUxlbmd0aCArPSBhY3R1YWxOdW1CeXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBtQ2FjaGVCdWZSYW5nZUxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9mZnNldCArIHNpemUgPj0gbUNhY2hlQnVmUmFuZ2VMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlciwgKHZvaWQqKShtQ2FjaGVCdWZmZXIgKyBvZmZzZXQpLCBtQ2FjaGVCdWZSYW5nZUxlbmd0aCAtIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQ2FjaGVCdWZSYW5nZUxlbmd0aCAtIG9mZnNldDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLCAodm9pZCopKG1DYWNoZUJ1ZmZlciArIG9mZnNldCksIHNpemUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBhY3R1YWxOdW1CeXRlc1JlYWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdW5idWZmZXJlZFJlYWRBdChidWZmZXIsIG9mZnNldCwgc2l6ZSk7CisgICAgfQorfQorCitpbnQgTWlkaUlvV3JhcHBlcjo6dW5idWZmZXJlZFJlYWRBdCh2b2lkICpidWZmZXIsIGludCBvZmZzZXQsIGludCBzaXplKSB7CisgICAgQUxPR1YoInVuYnVmZmVyZWRSZWFkQXQoJXAsICVkLCAlZCkiLCBidWZmZXIsIG9mZnNldCwgc2l6ZSk7CiAgICAgaWYgKG1EYXRhU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWZmZXIsIHNpemUpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5jcHAgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuY3BwCmluZGV4IDNhOWZiOGIuLjc5ODMxODQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmNwcApAQCAtMjQsOCArMjQsNiBAQAogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KIAotI2luY2x1ZGUgPGpuaS5oPgotCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKaW5kZXggYTRjMGVjNi4uMjg2ODRkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCkBAIC01OSw2ICs1OSw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4mIHNvdXJjZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+JiBzb3VyY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IFN0cmluZzgmIHJ0cFBhcmFtcykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZVRleHR1cmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRCdWZmZXJpbmdTZXR0aW5ncygKQEAgLTEzNiw2ICsxMzcsNTYgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmRldmljZUlkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpID0gMDsKK3Byb3RlY3RlZDoKKworICAgIGZyaWVuZCBjbGFzcyBJTWVkaWFQbGF5ZXJUZXN0OworICAgIGVudW0geworICAgICAgICBESVNDT05ORUNUID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICAgICAgU0VUX0RBVEFfU09VUkNFX1VSTCwKKyAgICAgICAgU0VUX0RBVEFfU09VUkNFX0ZELAorICAgICAgICBTRVRfREFUQV9TT1VSQ0VfU1RSRUFNLAorICAgICAgICBTRVRfREFUQV9TT1VSQ0VfQ0FMTEJBQ0ssCisgICAgICAgIFNFVF9EQVRBX1NPVVJDRV9SVFAsCisgICAgICAgIFNFVF9CVUZGRVJJTkdfU0VUVElOR1MsCisgICAgICAgIEdFVF9CVUZGRVJJTkdfU0VUVElOR1MsCisgICAgICAgIFBSRVBBUkVfQVNZTkMsCisgICAgICAgIFNUQVJULAorICAgICAgICBTVE9QLAorICAgICAgICBJU19QTEFZSU5HLAorICAgICAgICBTRVRfUExBWUJBQ0tfU0VUVElOR1MsCisgICAgICAgIEdFVF9QTEFZQkFDS19TRVRUSU5HUywKKyAgICAgICAgU0VUX1NZTkNfU0VUVElOR1MsCisgICAgICAgIEdFVF9TWU5DX1NFVFRJTkdTLAorICAgICAgICBQQVVTRSwKKyAgICAgICAgU0VFS19UTywKKyAgICAgICAgR0VUX0NVUlJFTlRfUE9TSVRJT04sCisgICAgICAgIEdFVF9EVVJBVElPTiwKKyAgICAgICAgUkVTRVQsCisgICAgICAgIE5PVElGWV9BVCwKKyAgICAgICAgU0VUX0FVRElPX1NUUkVBTV9UWVBFLAorICAgICAgICBTRVRfTE9PUElORywKKyAgICAgICAgU0VUX1ZPTFVNRSwKKyAgICAgICAgSU5WT0tFLAorICAgICAgICBTRVRfTUVUQURBVEFfRklMVEVSLAorICAgICAgICBHRVRfTUVUQURBVEEsCisgICAgICAgIFNFVF9BVVhfRUZGRUNUX1NFTkRfTEVWRUwsCisgICAgICAgIEFUVEFDSF9BVVhfRUZGRUNULAorICAgICAgICBTRVRfVklERU9fU1VSRkFDRVRFWFRVUkUsCisgICAgICAgIFNFVF9QQVJBTUVURVIsCisgICAgICAgIEdFVF9QQVJBTUVURVIsCisgICAgICAgIFNFVF9SRVRSQU5TTUlUX0VORFBPSU5ULAorICAgICAgICBHRVRfUkVUUkFOU01JVF9FTkRQT0lOVCwKKyAgICAgICAgU0VUX05FWFRfUExBWUVSLAorICAgICAgICBBUFBMWV9WT0xVTUVfU0hBUEVSLAorICAgICAgICBHRVRfVk9MVU1FX1NIQVBFUl9TVEFURSwKKyAgICAgICAgLy8gTW9kdWxhciBEUk0KKyAgICAgICAgUFJFUEFSRV9EUk0sCisgICAgICAgIFJFTEVBU0VfRFJNLAorICAgICAgICAvLyBBdWRpb1JvdXRpbmcKKyAgICAgICAgU0VUX09VVFBVVF9ERVZJQ0UsCisgICAgICAgIEdFVF9ST1VURURfREVWSUNFX0lELAorICAgICAgICBFTkFCTEVfQVVESU9fREVWSUNFX0NBTExCQUNLLAorICAgIH07CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKaW5kZXggNjUxYmQ1ZS4uNmU2OTc4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaApAQCAtNzgsNiArNzgsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJ0cERhdGFVc2FnZSh1aW50NjRfdCAqYnl0ZXMpID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKaW5kZXggNGNjNWI5NS4uM2Y0ZmQxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgogCisjaW5jbHVkZSA8dmVjdG9yPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGVudW0gY2FtY29yZGVyX3F1YWxpdHkgewpAQCAtOTgsNiArMTAwLDE5MyBAQAogICAgIHN0YXRpYyBNZWRpYVByb2ZpbGVzKiBnZXRJbnN0YW5jZSgpOwogCiAgICAgLyoqCisgICAgICogQ29uZmlndXJhdGlvbiBmb3IgYSB2aWRlbyBlbmNvZGVyLgorICAgICAqLworICAgIHN0cnVjdCBWaWRlb0NvZGVjIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgdmlkZW8gZW5jb2RlciBjb25maWd1cmF0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29kZWMgY29kZWMgdHlwZQorICAgICAgICAgKiBAcGFyYW0gYml0cmF0ZSBiaXRyYXRlIGluIGJwcworICAgICAgICAgKiBAcGFyYW0gZnJhbWVXaWR0aCBmcmFtZSB3aWR0aCBpbiBwaXhlbHMKKyAgICAgICAgICogQHBhcmFtIGZyYW1lSGVpZ2h0IGZyYW1lIGhlaWdodCBpbiBwaXhlbHMKKyAgICAgICAgICogQHBhcmFtIGZyYW1lUmF0ZSBmcmFtZSByYXRlIGluIGZwcworICAgICAgICAgKiBAcGFyYW0gcHJvZmlsZSBjb2RlYyBwcm9maWxlIChmb3IgTWVkaWFDb2RlYykgb3IgLTEgZm9yIG5vbmUKKyAgICAgICAgICovCisgICAgICAgIFZpZGVvQ29kZWModmlkZW9fZW5jb2RlciBjb2RlYywgaW50IGJpdHJhdGUsIGludCBmcmFtZVdpZHRoLCBpbnQgZnJhbWVIZWlnaHQsIGludCBmcmFtZVJhdGUsCisgICAgICAgICAgICAgICAgICAgaW50IHByb2ZpbGUgPSAtMSkKKyAgICAgICAgICAgIDogbUNvZGVjKGNvZGVjKSwKKyAgICAgICAgICAgICAgbUJpdFJhdGUoYml0cmF0ZSksCisgICAgICAgICAgICAgIG1GcmFtZVdpZHRoKGZyYW1lV2lkdGgpLAorICAgICAgICAgICAgICBtRnJhbWVIZWlnaHQoZnJhbWVIZWlnaHQpLAorICAgICAgICAgICAgICBtRnJhbWVSYXRlKGZyYW1lUmF0ZSksCisgICAgICAgICAgICAgIG1Qcm9maWxlKHByb2ZpbGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIFZpZGVvQ29kZWMoY29uc3QgVmlkZW9Db2RlYyYpID0gZGVmYXVsdDsKKworICAgICAgICB+VmlkZW9Db2RlYygpIHt9CisKKyAgICAgICAgLyoqIFJldHVybnMgdGhlIGNvZGVjIHR5cGUuICovCisgICAgICAgIHZpZGVvX2VuY29kZXIgZ2V0Q29kZWMoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbUNvZGVjOworICAgICAgICB9CisKKyAgICAgICAgLyoqIFJldHVybnMgdGhlIGJpdHJhdGUgaW4gYnBzLiAqLworICAgICAgICBpbnQgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtQml0UmF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBSZXR1cm5zIHRoZSBmcmFtZSB3aWR0aCBpbiBwaXhlbHMuICovCisgICAgICAgIGludCBnZXRGcmFtZVdpZHRoKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1GcmFtZVdpZHRoOworICAgICAgICB9CisKKyAgICAgICAgLyoqIFJldHVybnMgdGhlIGZyYW1lIGhlaWdodCBpbiBwaXhlbHMuICovCisgICAgICAgIGludCBnZXRGcmFtZUhlaWdodCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtRnJhbWVIZWlnaHQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogUmV0dXJucyB0aGUgZnJhbWUgcmF0ZSBpbiBmcHMuICovCisgICAgICAgIGludCBnZXRGcmFtZVJhdGUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbUZyYW1lUmF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBSZXR1cm5zIHRoZSBjb2RlYyBwcm9maWxlIChvciAtMSBmb3Igbm8gcHJvZmlsZSkuICovCisgICAgICAgIGludCBnZXRQcm9maWxlKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1Qcm9maWxlOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB2aWRlb19lbmNvZGVyIG1Db2RlYzsKKyAgICAgICAgaW50IG1CaXRSYXRlOworICAgICAgICBpbnQgbUZyYW1lV2lkdGg7CisgICAgICAgIGludCBtRnJhbWVIZWlnaHQ7CisgICAgICAgIGludCBtRnJhbWVSYXRlOworICAgICAgICBpbnQgbVByb2ZpbGU7CisgICAgICAgIGZyaWVuZCBjbGFzcyBNZWRpYVByb2ZpbGVzOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmF0aW9uIGZvciBhbiBhdWRpbyBlbmNvZGVyLgorICAgICAqLworICAgIHN0cnVjdCBBdWRpb0NvZGVjIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGFuIGF1ZGlvIGVuY29kZXIgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvZGVjIGNvZGVjIHR5cGUKKyAgICAgICAgICogQHBhcmFtIGJpdHJhdGUgYml0cmF0ZSBpbiBicHMKKyAgICAgICAgICogQHBhcmFtIHNhbXBsZVJhdGUgc2FtcGxlIHJhdGUgaW4gSHoKKyAgICAgICAgICogQHBhcmFtIGNoYW5uZWxzIG51bWJlciBvZiBjaGFubmVscworICAgICAgICAgKiBAcGFyYW0gcHJvZmlsZSBjb2RlYyBwcm9maWxlIChmb3IgTWVkaWFDb2RlYykgb3IgLTEgZm9yIG5vbmUKKyAgICAgICAgICovCisgICAgICAgIEF1ZGlvQ29kZWMoYXVkaW9fZW5jb2RlciBjb2RlYywgaW50IGJpdHJhdGUsIGludCBzYW1wbGVSYXRlLCBpbnQgY2hhbm5lbHMsIGludCBwcm9maWxlID0gLTEpCisgICAgICAgICAgICA6IG1Db2RlYyhjb2RlYyksCisgICAgICAgICAgICAgIG1CaXRSYXRlKGJpdHJhdGUpLAorICAgICAgICAgICAgICBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKSwKKyAgICAgICAgICAgICAgbUNoYW5uZWxzKGNoYW5uZWxzKSwKKyAgICAgICAgICAgICAgbVByb2ZpbGUocHJvZmlsZSkgeworICAgICAgICB9CisKKyAgICAgICAgQXVkaW9Db2RlYyhjb25zdCBBdWRpb0NvZGVjJikgPSBkZWZhdWx0OworCisgICAgICAgIH5BdWRpb0NvZGVjKCkge30KKworICAgICAgICAvKiogUmV0dXJucyB0aGUgY29kZWMgdHlwZS4gKi8KKyAgICAgICAgYXVkaW9fZW5jb2RlciBnZXRDb2RlYygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtQ29kZWM7CisgICAgICAgIH0KKworICAgICAgICAvKiogUmV0dXJucyB0aGUgYml0cmF0ZSBpbiBicHMuICovCisgICAgICAgIGludCBnZXRCaXRyYXRlKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1CaXRSYXRlOworICAgICAgICB9CisKKyAgICAgICAgLyoqIFJldHVybnMgdGhlIHNhbXBsZSByYXRlIGluIEh6LiAqLworICAgICAgICBpbnQgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtU2FtcGxlUmF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMuICovCisgICAgICAgIGludCBnZXRDaGFubmVscygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtQ2hhbm5lbHM7CisgICAgICAgIH0KKworICAgICAgICAvKiogUmV0dXJucyB0aGUgY29kZWMgcHJvZmlsZSAob3IgLTEgZm9yIG5vIHByb2ZpbGUpLiAqLworICAgICAgICBpbnQgZ2V0UHJvZmlsZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtUHJvZmlsZTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgYXVkaW9fZW5jb2RlciBtQ29kZWM7CisgICAgICAgIGludCBtQml0UmF0ZTsKKyAgICAgICAgaW50IG1TYW1wbGVSYXRlOworICAgICAgICBpbnQgbUNoYW5uZWxzOworICAgICAgICBpbnQgbVByb2ZpbGU7CisgICAgICAgIGZyaWVuZCBjbGFzcyBNZWRpYVByb2ZpbGVzOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmF0aW9uIGZvciBhIGNhbWNvcmRlciBwcm9maWxlL2VuY29kZXIgcHJvZmlsZXMgb2JqZWN0LgorICAgICAqLworICAgIHN0cnVjdCBDYW1jb3JkZXJQcm9maWxlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqICBSZXR1cm5zIG9uIG9yZGVyZWQgbGlzdCBvZiB0aGUgdmlkZW8gY29kZWMgY29uZmlndXJhdGlvbnMgaW4KKyAgICAgICAgICogIGRlY3JlYXNpbmcgcHJlZmVyZW5jZS4gVGhlIHJldHVybmVkIG9iamVjdCBpcyBvbmx5IHZhbGlkCisgICAgICAgICAqICBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoaXMgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgVmlkZW9Db2RlYyAqPiBnZXRWaWRlb0NvZGVjcygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiAgUmV0dXJucyBvbiBvcmRlcmVkIGxpc3Qgb2YgdGhlIGF1ZGlvIGNvZGVjIGNvbmZpZ3VyYXRpb25zIGluCisgICAgICAgICAqICBkZWNyZWFzaW5nIHByZWZlcmVuY2UuIFRoZSByZXR1cm5lZCBvYmplY3QgaXMgb25seSB2YWxpZAorICAgICAgICAgKiAgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGlzIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEF1ZGlvQ29kZWMgKj4gZ2V0QXVkaW9Db2RlY3MoKSBjb25zdDsKKworICAgICAgICAvKiogUmV0dXJucyB0aGUgZGVmYXVsdCBkdXJhdGlvbiBpbiBzZWNvbmRzLiAqLworICAgICAgICBpbnQgZ2V0RHVyYXRpb24oKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbUR1cmF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLyoqIFJldHVybnMgdGhlIHByZWZlcnJlZCBmaWxlIGZvcm1hdC4gKi8KKyAgICAgICAgaW50IGdldEZpbGVGb3JtYXQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbUZpbGVGb3JtYXQ7CisgICAgICAgIH0KKworICAgICAgICBDYW1jb3JkZXJQcm9maWxlKGNvbnN0IENhbWNvcmRlclByb2ZpbGUmIGNvcHkpID0gZGVmYXVsdDsKKworICAgICAgICB+Q2FtY29yZGVyUHJvZmlsZSgpID0gZGVmYXVsdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IG9iamVjdCB3aXRoIG5vIGF1ZGlvL3ZpZGVvIHByb2ZpbGVzLgorICAgICAgICAgKi8KKyAgICAgICAgQ2FtY29yZGVyUHJvZmlsZSgpCisgICAgICAgICAgICA6IG1DYW1lcmFJZCgwKSwKKyAgICAgICAgICAgICAgbUZpbGVGb3JtYXQoT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFApLAorICAgICAgICAgICAgICBtUXVhbGl0eShDQU1DT1JERVJfUVVBTElUWV9ISUdIKSwKKyAgICAgICAgICAgICAgbUR1cmF0aW9uKDApIHt9CisKKyAgICAgICAgaW50IG1DYW1lcmFJZDsKKyAgICAgICAgb3V0cHV0X2Zvcm1hdCBtRmlsZUZvcm1hdDsKKyAgICAgICAgY2FtY29yZGVyX3F1YWxpdHkgbVF1YWxpdHk7CisgICAgICAgIGludCBtRHVyYXRpb247CisgICAgICAgIHN0ZDo6dmVjdG9yPFZpZGVvQ29kZWM+IG1WaWRlb0NvZGVjczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QXVkaW9Db2RlYz4gbUF1ZGlvQ29kZWNzOworICAgICAgICBmcmllbmQgY2xhc3MgTWVkaWFQcm9maWxlczsKKyAgICB9OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgQ2FtY29yZGVyUHJvZmlsZSBvYmplY3QgZm9yIHRoZSBnaXZlbiBjYW1lcmEgYXQKKyAgICAgKiB0aGUgZ2l2ZW4gcXVhbGl0eSBsZXZlbCwgb3IgbnVsbCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAgICAgKi8KKyAgICBjb25zdCBDYW1jb3JkZXJQcm9maWxlICpnZXRDYW1jb3JkZXJQcm9maWxlKAorICAgICAgICAgICAgaW50IGNhbWVyYUlkLCBjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KSBjb25zdDsKKworICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcGFyYW0gbmFtZSBmb3IgdGhlIGdpdmVuIGNhbWVyYSBhdAogICAgICAqIHRoZSBnaXZlbiBxdWFsaXR5IGxldmVsLCBvciAtMSBpZiBlcnJvci4KICAgICAgKgpAQCAtMjAwLDg0ICszODksNiBAQAogICAgIE1lZGlhUHJvZmlsZXMoKSB7fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEdW1teSBkZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgfk1lZGlhUHJvZmlsZXMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGRlbGV0ZSBtZQogCi0gICAgc3RydWN0IFZpZGVvQ29kZWMgewotICAgICAgICBWaWRlb0NvZGVjKHZpZGVvX2VuY29kZXIgY29kZWMsIGludCBiaXRSYXRlLCBpbnQgZnJhbWVXaWR0aCwgaW50IGZyYW1lSGVpZ2h0LCBpbnQgZnJhbWVSYXRlKQotICAgICAgICAgICAgOiBtQ29kZWMoY29kZWMpLAotICAgICAgICAgICAgICBtQml0UmF0ZShiaXRSYXRlKSwKLSAgICAgICAgICAgICAgbUZyYW1lV2lkdGgoZnJhbWVXaWR0aCksCi0gICAgICAgICAgICAgIG1GcmFtZUhlaWdodChmcmFtZUhlaWdodCksCi0gICAgICAgICAgICAgIG1GcmFtZVJhdGUoZnJhbWVSYXRlKSB7fQotCi0gICAgICAgIFZpZGVvQ29kZWMoY29uc3QgVmlkZW9Db2RlYyYgY29weSkgewotICAgICAgICAgICAgbUNvZGVjID0gY29weS5tQ29kZWM7Ci0gICAgICAgICAgICBtQml0UmF0ZSA9IGNvcHkubUJpdFJhdGU7Ci0gICAgICAgICAgICBtRnJhbWVXaWR0aCA9IGNvcHkubUZyYW1lV2lkdGg7Ci0gICAgICAgICAgICBtRnJhbWVIZWlnaHQgPSBjb3B5Lm1GcmFtZUhlaWdodDsKLSAgICAgICAgICAgIG1GcmFtZVJhdGUgPSBjb3B5Lm1GcmFtZVJhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICB+VmlkZW9Db2RlYygpIHt9Ci0KLSAgICAgICAgdmlkZW9fZW5jb2RlciBtQ29kZWM7Ci0gICAgICAgIGludCBtQml0UmF0ZTsKLSAgICAgICAgaW50IG1GcmFtZVdpZHRoOwotICAgICAgICBpbnQgbUZyYW1lSGVpZ2h0OwotICAgICAgICBpbnQgbUZyYW1lUmF0ZTsKLSAgICB9OwotCi0gICAgc3RydWN0IEF1ZGlvQ29kZWMgewotICAgICAgICBBdWRpb0NvZGVjKGF1ZGlvX2VuY29kZXIgY29kZWMsIGludCBiaXRSYXRlLCBpbnQgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxzKQotICAgICAgICAgICAgOiBtQ29kZWMoY29kZWMpLAotICAgICAgICAgICAgICBtQml0UmF0ZShiaXRSYXRlKSwKLSAgICAgICAgICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksCi0gICAgICAgICAgICAgIG1DaGFubmVscyhjaGFubmVscykge30KLQotICAgICAgICBBdWRpb0NvZGVjKGNvbnN0IEF1ZGlvQ29kZWMmIGNvcHkpIHsKLSAgICAgICAgICAgIG1Db2RlYyA9IGNvcHkubUNvZGVjOwotICAgICAgICAgICAgbUJpdFJhdGUgPSBjb3B5Lm1CaXRSYXRlOwotICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBjb3B5Lm1TYW1wbGVSYXRlOwotICAgICAgICAgICAgbUNoYW5uZWxzID0gY29weS5tQ2hhbm5lbHM7Ci0gICAgICAgIH0KLQotICAgICAgICB+QXVkaW9Db2RlYygpIHt9Ci0KLSAgICAgICAgYXVkaW9fZW5jb2RlciBtQ29kZWM7Ci0gICAgICAgIGludCBtQml0UmF0ZTsKLSAgICAgICAgaW50IG1TYW1wbGVSYXRlOwotICAgICAgICBpbnQgbUNoYW5uZWxzOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgQ2FtY29yZGVyUHJvZmlsZSB7Ci0gICAgICAgIENhbWNvcmRlclByb2ZpbGUoKQotICAgICAgICAgICAgOiBtQ2FtZXJhSWQoMCksCi0gICAgICAgICAgICAgIG1GaWxlRm9ybWF0KE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQKSwKLSAgICAgICAgICAgICAgbVF1YWxpdHkoQ0FNQ09SREVSX1FVQUxJVFlfSElHSCksCi0gICAgICAgICAgICAgIG1EdXJhdGlvbigwKSwKLSAgICAgICAgICAgICAgbVZpZGVvQ29kZWMoMCksCi0gICAgICAgICAgICAgIG1BdWRpb0NvZGVjKDApIHt9Ci0KLSAgICAgICAgQ2FtY29yZGVyUHJvZmlsZShjb25zdCBDYW1jb3JkZXJQcm9maWxlJiBjb3B5KSB7Ci0gICAgICAgICAgICBtQ2FtZXJhSWQgPSBjb3B5Lm1DYW1lcmFJZDsKLSAgICAgICAgICAgIG1GaWxlRm9ybWF0ID0gY29weS5tRmlsZUZvcm1hdDsKLSAgICAgICAgICAgIG1RdWFsaXR5ID0gY29weS5tUXVhbGl0eTsKLSAgICAgICAgICAgIG1EdXJhdGlvbiA9IGNvcHkubUR1cmF0aW9uOwotICAgICAgICAgICAgbVZpZGVvQ29kZWMgPSBuZXcgVmlkZW9Db2RlYygqY29weS5tVmlkZW9Db2RlYyk7Ci0gICAgICAgICAgICBtQXVkaW9Db2RlYyA9IG5ldyBBdWRpb0NvZGVjKCpjb3B5Lm1BdWRpb0NvZGVjKTsKLSAgICAgICAgfQotCi0gICAgICAgIH5DYW1jb3JkZXJQcm9maWxlKCkgewotICAgICAgICAgICAgZGVsZXRlIG1WaWRlb0NvZGVjOwotICAgICAgICAgICAgZGVsZXRlIG1BdWRpb0NvZGVjOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG1DYW1lcmFJZDsKLSAgICAgICAgb3V0cHV0X2Zvcm1hdCBtRmlsZUZvcm1hdDsKLSAgICAgICAgY2FtY29yZGVyX3F1YWxpdHkgbVF1YWxpdHk7Ci0gICAgICAgIGludCBtRHVyYXRpb247Ci0gICAgICAgIFZpZGVvQ29kZWMgKm1WaWRlb0NvZGVjOwotICAgICAgICBBdWRpb0NvZGVjICptQXVkaW9Db2RlYzsKLSAgICB9OwotCiAgICAgc3RydWN0IFZpZGVvRW5jb2RlckNhcCB7CiAgICAgICAgIC8vIFVnbHkgY29uc3RydWN0b3IKICAgICAgICAgVmlkZW9FbmNvZGVyQ2FwKHZpZGVvX2VuY29kZXIgY29kZWMsCkBAIC0zNjIsMjMgKzQ3MywyMyBAQAogICAgIC8vIElmIHRoZSB4bWwgY29uZmlndXJhdGlvbiBmaWxlIGRvZXMgZXhpc3QsIHVzZSB0aGUgc2V0dGluZ3MKICAgICAvLyBmcm9tIHRoZSB4bWwKICAgICBzdGF0aWMgTWVkaWFQcm9maWxlcyogY3JlYXRlSW5zdGFuY2VGcm9tWG1sRmlsZShjb25zdCBjaGFyICp4bWwpOwotICAgIHN0YXRpYyBvdXRwdXRfZm9ybWF0IGNyZWF0ZUVuY29kZXJPdXRwdXRGaWxlRm9ybWF0KGNvbnN0IGNoYXIgKiphdHRzKTsKLSAgICBzdGF0aWMgVmlkZW9Db2RlYyogY3JlYXRlVmlkZW9Db2RlYyhjb25zdCBjaGFyICoqYXR0cywgTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpOwotICAgIHN0YXRpYyBBdWRpb0NvZGVjKiBjcmVhdGVBdWRpb0NvZGVjKGNvbnN0IGNoYXIgKiphdHRzLCBNZWRpYVByb2ZpbGVzICpwcm9maWxlcyk7Ci0gICAgc3RhdGljIEF1ZGlvRGVjb2RlckNhcCogY3JlYXRlQXVkaW9EZWNvZGVyQ2FwKGNvbnN0IGNoYXIgKiphdHRzKTsKLSAgICBzdGF0aWMgVmlkZW9EZWNvZGVyQ2FwKiBjcmVhdGVWaWRlb0RlY29kZXJDYXAoY29uc3QgY2hhciAqKmF0dHMpOwotICAgIHN0YXRpYyBWaWRlb0VuY29kZXJDYXAqIGNyZWF0ZVZpZGVvRW5jb2RlckNhcChjb25zdCBjaGFyICoqYXR0cyk7Ci0gICAgc3RhdGljIEF1ZGlvRW5jb2RlckNhcCogY3JlYXRlQXVkaW9FbmNvZGVyQ2FwKGNvbnN0IGNoYXIgKiphdHRzKTsKKyAgICBzdGF0aWMgb3V0cHV0X2Zvcm1hdCBjcmVhdGVFbmNvZGVyT3V0cHV0RmlsZUZvcm1hdChjb25zdCBjaGFyICoqYXR0cywgc2l6ZV90IG5hdHRzKTsKKyAgICBzdGF0aWMgdm9pZCBjcmVhdGVWaWRlb0NvZGVjKGNvbnN0IGNoYXIgKiphdHRzLCBzaXplX3QgbmF0dHMsIE1lZGlhUHJvZmlsZXMgKnByb2ZpbGVzKTsKKyAgICBzdGF0aWMgdm9pZCBjcmVhdGVBdWRpb0NvZGVjKGNvbnN0IGNoYXIgKiphdHRzLCBzaXplX3QgbmF0dHMsIE1lZGlhUHJvZmlsZXMgKnByb2ZpbGVzKTsKKyAgICBzdGF0aWMgQXVkaW9EZWNvZGVyQ2FwKiBjcmVhdGVBdWRpb0RlY29kZXJDYXAoY29uc3QgY2hhciAqKmF0dHMsIHNpemVfdCBuYXR0cyk7CisgICAgc3RhdGljIFZpZGVvRGVjb2RlckNhcCogY3JlYXRlVmlkZW9EZWNvZGVyQ2FwKGNvbnN0IGNoYXIgKiphdHRzLCBzaXplX3QgbmF0dHMpOworICAgIHN0YXRpYyBWaWRlb0VuY29kZXJDYXAqIGNyZWF0ZVZpZGVvRW5jb2RlckNhcChjb25zdCBjaGFyICoqYXR0cywgc2l6ZV90IG5hdHRzKTsKKyAgICBzdGF0aWMgQXVkaW9FbmNvZGVyQ2FwKiBjcmVhdGVBdWRpb0VuY29kZXJDYXAoY29uc3QgY2hhciAqKmF0dHMsIHNpemVfdCBuYXR0cyk7CiAKICAgICBzdGF0aWMgQ2FtY29yZGVyUHJvZmlsZSogY3JlYXRlQ2FtY29yZGVyUHJvZmlsZSgKLSAgICAgICAgICAgICAgICBpbnQgY2FtZXJhSWQsIGNvbnN0IGNoYXIgKiphdHRzLCBWZWN0b3I8aW50PiYgY2FtZXJhSWRzKTsKKyAgICAgICAgICAgICAgICBpbnQgY2FtZXJhSWQsIGNvbnN0IGNoYXIgKiphdHRzLCBzaXplX3QgbmF0dHMsIFZlY3RvcjxpbnQ+JiBjYW1lcmFJZHMpOwogCi0gICAgc3RhdGljIGludCBnZXRDYW1lcmFJZChjb25zdCBjaGFyICoqYXR0cyk7CisgICAgc3RhdGljIGludCBnZXRDYW1lcmFJZChjb25zdCBjaGFyICoqYXR0cywgc2l6ZV90IG5hdHRzKTsKIAotICAgIHZvaWQgYWRkU3RhcnRUaW1lT2Zmc2V0KGludCBjYW1lcmFJZCwgY29uc3QgY2hhciAqKmF0dHMpOworICAgIHZvaWQgYWRkU3RhcnRUaW1lT2Zmc2V0KGludCBjYW1lcmFJZCwgY29uc3QgY2hhciAqKmF0dHMsIHNpemVfdCBuYXR0cyk7CiAKICAgICBJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyogZmluZEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzKGludCBjYW1lcmFJZCkgY29uc3Q7Ci0gICAgdm9pZCBhZGRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVsKGludCBjYW1lcmFJZCwgY29uc3QgY2hhcioqIGF0dHMpOworICAgIHZvaWQgYWRkSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbChpbnQgY2FtZXJhSWQsIGNvbnN0IGNoYXIqKiBhdHRzLCBzaXplX3QgbmF0dHMpOwogCiAgICAgLy8gQ3VzdG9taXplZCBlbGVtZW50IHRhZyBoYW5kbGVyIGZvciBwYXJzaW5nIHRoZSB4bWwgY29uZmlndXJhdGlvbiBmaWxlLgogICAgIHN0YXRpYyB2b2lkIHN0YXJ0RWxlbWVudEhhbmRsZXIodm9pZCAqdXNlckRhdGEsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaAppbmRleCA4NDkzZjY0Li5kOWE3ZWZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCkBAIC03Nyw2ICs3Nyw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UnRwRGF0YVVzYWdlKHVpbnQ2NF90ICpieXRlcykgPSAwOwogCiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVzb3VyY2UuaAppbmRleCBlNzM2MmMxLi40OTI3ZDI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVzb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVzb3VyY2UuaApAQCAtMzUsMTMgKzM1LDEzIEBACiAgICAgTWVkaWFSZXNvdXJjZSgpID0gZGVsZXRlOwogICAgIE1lZGlhUmVzb3VyY2UoVHlwZSB0eXBlLCBpbnQ2NF90IHZhbHVlKTsKICAgICBNZWRpYVJlc291cmNlKFR5cGUgdHlwZSwgU3ViVHlwZSBzdWJUeXBlLCBpbnQ2NF90IHZhbHVlKTsKLSAgICBNZWRpYVJlc291cmNlKFR5cGUgdHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8aW50OF90PiAmaWQsIGludDY0X3QgdmFsdWUpOworICAgIE1lZGlhUmVzb3VyY2UoVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmaWQsIGludDY0X3QgdmFsdWUpOwogCiAgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgQ29kZWNSZXNvdXJjZShib29sIHNlY3VyZSwgYm9vbCB2aWRlbyk7CiAgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgR3JhcGhpY01lbW9yeVJlc291cmNlKGludDY0X3QgdmFsdWUpOwogICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIENwdUJvb3N0UmVzb3VyY2UoKTsKICAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBWaWRlb0JhdHRlcnlSZXNvdXJjZSgpOwotICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIERybVNlc3Npb25SZXNvdXJjZShjb25zdCBzdGQ6OnZlY3RvcjxpbnQ4X3Q+ICZpZCwgaW50NjRfdCB2YWx1ZSk7CisgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgRHJtU2Vzc2lvblJlc291cmNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZpZCwgaW50NjRfdCB2YWx1ZSk7CiB9OwogCiBpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nKE1lZGlhUmVzb3VyY2U6OlR5cGUgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NaWRpSW9XcmFwcGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaAppbmRleCAwY2RkNGFkLi41ZmE3NDVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBNSURJX0lPX1dSQVBQRVJfSF8KIAogI2luY2x1ZGUgPGxpYnNvbml2b3gvZWFzX3R5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMiwxNyArMzMsMjcgQEAKICAgICB+TWlkaUlvV3JhcHBlcigpOwogCiAgICAgaW50IHJlYWRBdCh2b2lkICpidWZmZXIsIGludCBvZmZzZXQsIGludCBzaXplKTsKKyAgICBpbnQgdW5idWZmZXJlZFJlYWRBdCh2b2lkICpidWZmZXIsIGludCBvZmZzZXQsIGludCBzaXplKTsKICAgICBpbnQgc2l6ZSgpOwogCiAgICAgRUFTX0ZJTEVfTE9DQVRPUiBnZXRMb2NhdG9yKCk7CiAKIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtUb3RhbENhY2hlU2l6ZSAgICAgID0gMTAyNCAqIDEwMjQgKyA1MTIgKiAxMDI0LAorICAgICAgICBrU2luZ2xlQ2FjaGVTaXplICAgICA9IDY1NTM2LAorICAgIH07CisKICAgICBpbnQgbUZkOwogICAgIG9mZjY0X3QgbUJhc2U7CiAgICAgaW50NjRfdCAgbUxlbmd0aDsKICAgICBjbGFzcyBEYXRhU291cmNlVW53cmFwcGVyOwogICAgIERhdGFTb3VyY2VVbndyYXBwZXIgKm1EYXRhU291cmNlOwogICAgIEVBU19GSUxFIG1FYXNGaWxlOworICAgIHVuc2lnbmVkIGNoYXIgKm1DYWNoZUJ1ZmZlcjsKKyAgICBpbnQ2NF90IG1DYWNoZUJ1ZlJhbmdlTGVuZ3RoOworICAgIHN0YXRpYyBpbnQgc0NhY2hlQnVmZmVyU2l6ZTsKKyAgICBzdGF0aWMgTXV0ZXggbUNhY2hlTG9jazsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCmluZGV4IDdjMjllNTAuLjcxYzBiYzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKQEAgLTYyLDYgKzYyLDcgQEAKICAgICBNRURJQV9NRVRBX0RBVEEgICAgICAgICA9IDIwMiwKICAgICBNRURJQV9EUk1fSU5GTyAgICAgICAgICA9IDIxMCwKICAgICBNRURJQV9USU1FX0RJU0NPTlRJTlVJVFkgPSAyMTEsCisgICAgTUVESUFfSU1TX1JYX05PVElDRSAgICAgPSAzMDAsCiAgICAgTUVESUFfQVVESU9fUk9VVElOR19DSEFOR0VEID0gMTAwMDAsCiB9OwogCkBAIC0xNzksNyArMTgwLDEwIEBACiAgICAgS0VZX1BBUkFNRVRFUl9QTEFZQkFDS19SQVRFX1BFUk1JTExFID0gMTMwMCwgICAgICAgICAgICAgICAgLy8gc2V0IG9ubHkKIAogICAgIC8vIFNldCBhIFBhcmNlbCBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiBhIHBhcmNlbGxlZCBKYXZhIEF1ZGlvQXR0cmlidXRlIGluc3RhbmNlCi0gICAgS0VZX1BBUkFNRVRFUl9BVURJT19BVFRSSUJVVEVTID0gMTQwMCAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG9ubHkKKyAgICBLRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVMgPSAxNDAwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG9ubHkKKworICAgIC8vIFNldCBhIFBhcmNlbCBjb250YWluaW5nIHRoZSB2YWx1ZXMgb2YgUlRQIGF0dHJpYnV0ZQorICAgIEtFWV9QQVJBTUVURVJfUlRQX0FUVFJJQlVURVMgPSAyMDAwICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgb25seQogfTsKIAogLy8gS2VlcCBJTlZPS0VfSURfKiBpbiBzeW5jIHdpdGggTWVkaWFQbGF5ZXIuamF2YS4KQEAgLTIxOSw2ICsyMjMsNyBAQAogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4gJnNvdXJjZSk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBTdHJpbmc4JiBydHBQYXJhbXMpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZVRleHR1cmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldExpc3RlbmVyKGNvbnN0IHNwPE1lZGlhUGxheWVyTGlzdGVuZXI+JiBsaXN0ZW5lcik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCmluZGV4IDZlMmQ5NGQuLjg0YzkyZjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCkBAIC0yNzAsNiArMjcwLDcgQEAKICAgICBzdGF0dXNfdCAgICBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CiAKICAgICBzdGF0dXNfdCAgICBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBjb25zdDsKKyAgICBzdGF0dXNfdCAgICBnZXRSdHBEYXRhVXNhZ2UodWludDY0X3QgKmJ5dGVzKTsKIAogcHJpdmF0ZToKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBkb0NsZWFuVXAoKTsKQEAgLTI5MSw2ICsyOTIsOCBAQAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtSXNPdXRwdXRGaWxlU2V0OwogICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbU5vdGlmeUxvY2s7CisKKyAgICBvdXRwdXRfZm9ybWF0ICAgICAgICAgICAgICAgbU91dHB1dEZvcm1hdDsKIH07CiAKIH07ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCmluZGV4IDYwNzlhMmQuLjE1NTQ5MjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKQEAgLTE5NSw2ICsxOTUsMjIgQEAKICAgICByZXR1cm4gZXJyOwogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllcjo6c2V0RGF0YVNvdXJjZShjb25zdCBTdHJpbmc4JiBydHBQYXJhbXMpCit7CisgICAgQUxPR1YoInNldERhdGFTb3VyY2UocnRwUGFyYW1zKSIpOworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisgICAgY29uc3Qgc3A8SU1lZGlhUGxheWVyU2VydmljZT4gc2VydmljZShnZXRNZWRpYVBsYXllclNlcnZpY2UoKSk7CisgICAgaWYgKHNlcnZpY2UgIT0gMCkgeworICAgICAgICBzcDxJTWVkaWFQbGF5ZXI+IHBsYXllcihzZXJ2aWNlLT5jcmVhdGUodGhpcywgbUF1ZGlvU2Vzc2lvbklkKSk7CisgICAgICAgIGlmICgoTk9fRVJST1IgIT0gZG9TZXRSZXRyYW5zbWl0RW5kcG9pbnQocGxheWVyKSkgfHwKKyAgICAgICAgICAgIChOT19FUlJPUiAhPSBwbGF5ZXItPnNldERhdGFTb3VyY2UocnRwUGFyYW1zKSkpIHsKKyAgICAgICAgICAgIHBsYXllci5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGVyciA9IGF0dGFjaE5ld1BsYXllcihwbGF5ZXIpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCiBzdGF0dXNfdCBNZWRpYVBsYXllcjo6aW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtOTQzLDYgKzk1OSw5IEBACiAgICAgY2FzZSBNRURJQV9NRVRBX0RBVEE6CiAgICAgICAgIEFMT0dWKCJSZWNlaXZlZCB0aW1lZCBtZXRhZGF0YSBtZXNzYWdlIik7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUFfSU1TX1JYX05PVElDRToKKyAgICAgICAgQUxPR1YoIlJlY2VpdmVkIElNUyBSeCBub3RpY2UgbWVzc2FnZSIpOworICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBBTE9HVigidW5yZWNvZ25pemVkIG1lc3NhZ2U6ICglZCwgJWQsICVkKSIsIG1zZywgZXh0MSwgZXh0Mik7CiAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAppbmRleCA3MDY1NWQ1Li5lM2NkOWQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcApAQCAtMjQ0LDYgKzI0NCw3IEBACiAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9SRUNPUkRFUl9FUlJPUjsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CisgICAgbU91dHB1dEZvcm1hdCA9IChvdXRwdXRfZm9ybWF0KW9mOwogICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9SRUNPUkRFUl9EQVRBU09VUkNFX0NPTkZJR1VSRUQ7CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTQ3OSw2ICs0ODAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNRURJQV9SRUNPUkRFUl9QUkVQQVJFRCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfUkVDT1JERVJfUkVDT1JESU5HIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9SRUNPUkRFUl9FUlJPUikpOworCisgICAgLy8gRm9yIFJUUCB2aWRlbywgcGFyYW1ldGVyIHNob3VsZCBiZSBzZXQgZHluYW1pY2FsbHkuCisgICAgaWYgKGlzSW52YWxpZFN0YXRlKSB7CisgICAgICAgIGlmIChtQ3VycmVudFN0YXRlID09IE1FRElBX1JFQ09SREVSX1JFQ09SRElORyAmJgorICAgICAgICAgICAgbU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1JUUF9BVlApCisgICAgICAgICAgICBpc0ludmFsaWRTdGF0ZSA9IGZhbHNlOworICAgIH0KICAgICBpZiAoaXNJbnZhbGlkU3RhdGUpIHsKICAgICAgICAgQUxPR0UoInNldFBhcmFtZXRlcnMgaXMgY2FsbGVkIGluIGFuIGludmFsaWQgc3RhdGU6ICVkIiwgbUN1cnJlbnRTdGF0ZSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTczNyw2ICs3NDUsNyBAQAogICAgIG1Jc0F1ZGlvRW5jb2RlclNldCA9IGZhbHNlOwogICAgIG1Jc1ZpZGVvRW5jb2RlclNldCA9IGZhbHNlOwogICAgIG1Jc091dHB1dEZpbGVTZXQgICA9IGZhbHNlOworICAgIG1PdXRwdXRGb3JtYXQgICAgICA9IE9VVFBVVF9GT1JNQVRfREVGQVVMVDsKIH0KIAogLy8gUmVsZWFzZSBzaG91bGQgYmUgT0sgaW4gYW55IHN0YXRlCkBAIC05MDQsNCArOTEzLDE0IEBACiAgICAgcmV0dXJuIG1NZWRpYVJlY29yZGVyLT5nZXRQb3J0SWQocG9ydElkKTsKIH0KIAorc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6Z2V0UnRwRGF0YVVzYWdlKHVpbnQ2NF90ICpieXRlcykKK3sKKyAgICBBTE9HVigiZ2V0UnRwRGF0YVVzYWdlIik7CisKKyAgICBpZiAobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgibWVkaWEgcmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBtTWVkaWFSZWNvcmRlci0+Z2V0UnRwRGF0YVVzYWdlKGJ5dGVzKTsKK30KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWEvdGVzdHMvY29kZWNsaXN0L0FuZHJvaWQuYnAKc2ltaWxhcml0eSBpbmRleCA2MyUKY29weSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9BbmRyb2lkLmJwCmNvcHkgdG8gbWVkaWEvbGlibWVkaWEvdGVzdHMvY29kZWNsaXN0L0FuZHJvaWQuYnAKaW5kZXggNjU1NDkxYS4uODlkZGRjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWEvdGVzdHMvY29kZWNsaXN0L0FuZHJvaWQuYnAKQEAgLTE0LDIxICsxNCwzMSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlibWVkaWFfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbGlibWVkaWFfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKLSAgICBuYW1lOiAiTXBlZzRIMjYzRGVjb2RlclRlc3QiLAorICAgIG5hbWU6ICJDb2RlY0xpc3RUZXN0IiwKICAgICBndGVzdDogdHJ1ZSwKIAogICAgIHNyY3M6IFsKLSAgICAgICAgIk1wZWc0SDI2M0RlY29kZXJUZXN0LmNwcCIsCisgICAgICAgICJDb2RlY0xpc3RUZXN0LmNwcCIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGlibG9nIiwKLSAgICBdLAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMiLAorICAgICAgICAibGlibWVkaWFfY29kZWNsaXN0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKKyAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC0zNywxMCArNDcsMTAgQEAKICAgICBdLAogCiAgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKLSAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS90ZXN0cy9jb2RlY2xpc3QvQ29kZWNMaXN0VGVzdC5jcHAgYi9tZWRpYS9saWJtZWRpYS90ZXN0cy9jb2RlY2xpc3QvQ29kZWNMaXN0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQyYWRmNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL3Rlc3RzL2NvZGVjbGlzdC9Db2RlY0xpc3RUZXN0LmNwcApAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWNMaXN0VGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmg+CisKKyNkZWZpbmUga1N3Q29kZWNYbWxQYXRoICIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjL2V0Yy8iCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdHJ1Y3QgQ2RkUmVxIHsKKyAgICBDZGRSZXEoY29uc3QgY2hhciAqdHlwZSwgYm9vbCBlbmNvZGVyKSB7CisgICAgICAgIG1lZGlhVHlwZSA9IHR5cGU7CisgICAgICAgIGlzRW5jb2RlciA9IGVuY29kZXI7CisgICAgfQorCisgICAgY29uc3QgY2hhciAqbWVkaWFUeXBlOworICAgIGJvb2wgaXNFbmNvZGVyOworfTsKKworVEVTVChDb2RlY0xpc3RUZXN0LCBDb2RlY0xpc3RTYW5pdHlUZXN0KSB7CisgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBsaXN0ID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKGxpc3QsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gZ2V0IE1lZGlhQ29kZWNMaXN0IGluc3RhbmNlLiI7CisgICAgRVhQRUNUX0dUKGxpc3QtPmNvdW50Q29kZWNzKCksIDApIDw8ICJObyBjb2RlY3MgaW4gQ29kZWNMaXN0IjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3QtPmNvdW50Q29kZWNzKCk7ICsraSkgeworICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IGxpc3QtPmdldENvZGVjSW5mbyhpKTsKKyAgICAgICAgQVNTRVJUX05FKGluZm8sIG51bGxwdHIpIDw8ICJDb2RlY0luZm8gaXMgbnVsbCI7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBsaXN0LT5maW5kQ29kZWNCeU5hbWUoaW5mby0+Z2V0Q29kZWNOYW1lKCkpOworICAgICAgICBFWFBFQ1RfR0UoaW5kZXgsIDApIDw8ICJXYXNuJ3QgYWJsZSB0byBmaW5kIGV4aXN0aW5nIGNvZGVjOiAiIDw8IGluZm8tPmdldENvZGVjTmFtZSgpOworICAgIH0KK30KKworVEVTVChDb2RlY0xpc3RUZXN0LCBDb2RlY0xpc3RCeVR5cGVUZXN0KSB7CisgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBsaXN0ID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKGxpc3QsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gZ2V0IE1lZGlhQ29kZWNMaXN0IGluc3RhbmNlLiI7CisKKyAgICBzdGQ6OnZlY3RvcjxDZGRSZXE+IGNkZFJlcXsKKyAgICAgICAgICAgIC8vIG1lZGlhIHR5cGUsIGlzRW5jb2RlcgorICAgICAgICAgICAgQ2RkUmVxKE1JTUVUWVBFX0FVRElPX0FBQywgZmFsc2UpLAorICAgICAgICAgICAgQ2RkUmVxKE1JTUVUWVBFX0FVRElPX0FBQywgdHJ1ZSksCisKKyAgICAgICAgICAgIENkZFJlcShNSU1FVFlQRV9WSURFT19BVkMsIGZhbHNlKSwKKyAgICAgICAgICAgIENkZFJlcShNSU1FVFlQRV9WSURFT19IRVZDLCBmYWxzZSksCisgICAgICAgICAgICBDZGRSZXEoTUlNRVRZUEVfVklERU9fTVBFRzQsIGZhbHNlKSwKKyAgICAgICAgICAgIENkZFJlcShNSU1FVFlQRV9WSURFT19WUDgsIGZhbHNlKSwKKyAgICAgICAgICAgIENkZFJlcShNSU1FVFlQRV9WSURFT19WUDksIGZhbHNlKSwKKworICAgICAgICAgICAgQ2RkUmVxKE1JTUVUWVBFX1ZJREVPX0FWQywgdHJ1ZSksCisgICAgICAgICAgICBDZGRSZXEoTUlNRVRZUEVfVklERU9fVlA4LCB0cnVlKSwKKyAgICB9OworCisgICAgZm9yIChDZGRSZXEgY29kZWNSZXEgOiBjZGRSZXEpIHsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IGxpc3QtPmZpbmRDb2RlY0J5VHlwZShjb2RlY1JlcS5tZWRpYVR5cGUsIGNvZGVjUmVxLmlzRW5jb2Rlcik7CisgICAgICAgIEVYUEVDVF9HRShpbmRleCwgMCkgPDwgIldhc24ndCBhYmxlIHRvIGZpbmQgY29kZWMgZm9yIG1lZGlhIHR5cGU6ICIgPDwgY29kZWNSZXEubWVkaWFUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKGNvZGVjUmVxLmlzRW5jb2RlciA/ICIgZW5jb2RlciIgOiAiIGRlY29kZXIiKTsKKyAgICB9Cit9CisKK1RFU1QoQ29kZWNJbmZvVGVzdCwgTGlzdEluZm9UZXN0KSB7CisgICAgQUxPR1YoIkNvbXBhcmUgQ29kZWNJbmZvIHdpdGggaW5mbyBpbiBYTUwiKTsKKyAgICBNZWRpYUNvZGVjc1htbFBhcnNlciBwYXJzZXI7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyc2VyLnBhcnNlWG1sRmlsZXNJblNlYXJjaERpcnMoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIlhNTCBQYXJzaW5nIGZhaWxlZCBmb3IgZGVmYXVsdCBwYXRocyI7CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnhtbEZpbGVzID0gTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldERlZmF1bHRYbWxOYW1lcygpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmc2VhcmNoRGlyc0FwZXh7c3RkOjpzdHJpbmcoa1N3Q29kZWNYbWxQYXRoKX07CisgICAgc3RhdHVzID0gcGFyc2VyLnBhcnNlWG1sRmlsZXNJblNlYXJjaERpcnMoeG1sRmlsZXMsIHNlYXJjaERpcnNBcGV4KTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIlhNTCBQYXJzaW5nIG9mICIgPDwga1N3Q29kZWNYbWxQYXRoIDw8ICIgZmFpbGVkIjsKKworICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpDb2RlY01hcCBjb2RlY01hcCA9IHBhcnNlci5nZXRDb2RlY01hcCgpOworCisgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBsaXN0ID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKGxpc3QsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gZ2V0IE1lZGlhQ29kZWNMaXN0IGluc3RhbmNlIjsKKworICAgIC8vIENvbXBhcmUgQ29kZWNNYXAgZnJvbSBYTUwgdG8gQ29kZWNMaXN0CisgICAgZm9yIChhdXRvIG1hcEl0ZXIgOiBjb2RlY01hcCkgeworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbGlzdC0+ZmluZENvZGVjQnlOYW1lKG1hcEl0ZXIuZmlyc3QuY19zdHIoKSk7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdICIgPDwgbWFwSXRlci5maXJzdCA8PCAiIG5vdCBmb3VuZCBpbiBDb2RlY0xpc3QgXG4iOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IGxpc3QtPmdldENvZGVjSW5mbyhpbmRleCk7CisgICAgICAgIEFTU0VSVF9ORShpbmZvLCBudWxscHRyKSA8PCAiQ29kZWNJbmZvIGlzIG51bGwiOworCisgICAgICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpDb2RlY1Byb3BlcnRpZXMgY29kZWNQcm9wZXJ0aWVzID0gbWFwSXRlci5zZWNvbmQ7CisgICAgICAgIEFTU0VSVF9FUShjb2RlY1Byb3BlcnRpZXMuaXNFbmNvZGVyLCBpbmZvLT5pc0VuY29kZXIoKSkgPDwgIkVuY29kZXIgcHJvcGVydHkgbWlzbWF0Y2giOworCisgICAgICAgIEFMT0dWKCJjb2RlYyBuYW1lOiAlcyIsIGluZm8tPmdldENvZGVjTmFtZSgpKTsKKyAgICAgICAgQUxPR1YoImNvZGVjIHJhbms6ICVkIiwgaW5mby0+Z2V0UmFuaygpKTsKKyAgICAgICAgQUxPR1YoImNvZGVjIG93bmVybmFtZTogJXMiLCBpbmZvLT5nZXRPd25lck5hbWUoKSk7CisgICAgICAgIEFMT0dWKCJjb2RlYyBpc0VuY29kZXI6ICVkIiwgaW5mby0+aXNFbmNvZGVyKCkpOworCisgICAgICAgIEFMT0dWKCJhdHRyaWJ1dGVGbGFnczoga0ZsYWdJc0hhcmR3YXJlQWNjZWxlcmF0ZWQsIGtGbGFnSXNTb2Z0d2FyZU9ubHksIGtGbGFnSXNWZW5kb3IsICIKKyAgICAgICAgICAgICAgImtGbGFnSXNFbmNvZGVyIik7CisgICAgICAgIHN0ZDo6Yml0c2V0PDQ+IGF0dHIoaW5mby0+Z2V0QXR0cmlidXRlcygpKTsKKyAgICAgICAgQUxPR1YoImNvZGVjIGF0dHJpYnV0ZXM6ICVzIiwgYXR0ci50b19zdHJpbmcoKS5jX3N0cigpKTsKKworICAgICAgICBWZWN0b3I8QVN0cmluZz4gbWVkaWFUeXBlczsKKyAgICAgICAgaW5mby0+Z2V0U3VwcG9ydGVkTWVkaWFUeXBlcygmbWVkaWFUeXBlcyk7CisgICAgICAgIEFMT0dWKCJzdXBwb3J0ZWQgbWVkaWEgdHlwZXMgY291bnQ6ICV6dSIsIG1lZGlhVHlwZXMuc2l6ZSgpKTsKKyAgICAgICAgQVNTRVJUX0ZBTFNFKG1lZGlhVHlwZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIDw8ICJubyBtZWRpYSB0eXBlIHN1cHBvcnRlZCBieSBjb2RlYzogIiA8PCBpbmZvLT5nZXRDb2RlY05hbWUoKTsKKworICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6VHlwZU1hcCB0eXBlTWFwID0gY29kZWNQcm9wZXJ0aWVzLnR5cGVNYXA7CisgICAgICAgIGZvciAoYXV0byBtZWRpYVR5cGUgOiBtZWRpYVR5cGVzKSB7CisgICAgICAgICAgICBBTE9HVigiY29kZWMgbWVkaWFUeXBlczogJXMiLCBtZWRpYVR5cGUuY19zdHIoKSk7CisgICAgICAgICAgICBhdXRvIHNlYXJjaFR5cGVNYXAgPSB0eXBlTWFwLmZpbmQobWVkaWFUeXBlLmNfc3RyKCkpOworICAgICAgICAgICAgQVNTRVJUX05FKHNlYXJjaFR5cGVNYXAsIHR5cGVNYXAuZW5kKCkpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb2RlY0xpc3QgZG9lc24ndCBjb250YWluIGNvZGVjIG1lZGlhIHR5cGU6ICIgPDwgbWVkaWFUeXBlLmNfc3RyKCk7CisgICAgICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwIGF0dHJpYnV0ZU1hcCA9IHNlYXJjaFR5cGVNYXAtPnNlY29uZDsKKworICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gJmNhcGFiaWxpdGllcyA9CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmdldENhcGFiaWxpdGllc0ZvcihtZWRpYVR5cGUuY19zdHIoKSk7CisKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50MzJfdD4gY29sb3JGb3JtYXRzOworICAgICAgICAgICAgY2FwYWJpbGl0aWVzLT5nZXRTdXBwb3J0ZWRDb2xvckZvcm1hdHMoJmNvbG9yRm9ybWF0cyk7CisgICAgICAgICAgICBmb3IgKGF1dG8gY29sb3JGb3JtYXQgOiBjb2xvckZvcm1hdHMpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic3VwcG9ydGVkIGNvbG9yIGZvcm1hdHM6ICVkIiwgY29sb3JGb3JtYXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBWZWN0b3I8TWVkaWFDb2RlY0luZm86OlByb2ZpbGVMZXZlbD4gcHJvZmlsZUxldmVsczsKKyAgICAgICAgICAgIGNhcGFiaWxpdGllcy0+Z2V0U3VwcG9ydGVkUHJvZmlsZUxldmVscygmcHJvZmlsZUxldmVscyk7CisgICAgICAgICAgICBpZiAoIXByb2ZpbGVMZXZlbHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzdXBwb3J0ZWQgcHJvZmlsZWxldmVsIGZvciBtZWRpYSB0eXBlOiAlcyIsIG1lZGlhVHlwZS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoYXV0byBwcm9maWxlTGV2ZWwgOiBwcm9maWxlTGV2ZWxzKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInByb2ZpbGU6ICVkLCBsZXZlbDogJWQiLCBwcm9maWxlTGV2ZWwubVByb2ZpbGUsIHByb2ZpbGVMZXZlbC5tTGV2ZWwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZGV0YWlscyA9IGNhcGFiaWxpdGllcy0+Z2V0RGV0YWlscygpOworICAgICAgICAgICAgQVNTRVJUX05FKGRldGFpbHMsIG51bGxwdHIpIDw8ICJEZXRhaWxzIGluIGNvZGVjIGNhcGFiaWxpdGllcyBpcyBudWxsIjsKKyAgICAgICAgICAgIEFMT0dWKCJuby4gb2YgZW50cmllcyBpbiBkZXRhaWxzOiAlenUiLCBkZXRhaWxzLT5jb3VudEVudHJpZXMoKSk7CisKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGlkeERldGFpbCA9IDA7IGlkeERldGFpbCA8IGRldGFpbHMtPmNvdW50RW50cmllcygpOyBpZHhEZXRhaWwrKykgeworICAgICAgICAgICAgICAgIEFNZXNzYWdlOjpUeXBlIHR5cGU7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGRldGFpbHMtPmdldEVudHJ5TmFtZUF0KGlkeERldGFpbCwgJnR5cGUpOworICAgICAgICAgICAgICAgIEFMT0dWKCJkZXRhaWxzIGVudHJ5IG5hbWU6ICVzIiwgbmFtZSk7CisgICAgICAgICAgICAgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIGl0ZW1EYXRhID0gZGV0YWlscy0+Z2V0RW50cnlBdChpZHhEZXRhaWwpOworICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUludDMyOgorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWwzMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtRGF0YS5maW5kKCZ2YWwzMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZW50cnkgaW50IHZhbDogJWQiLCB2YWwzMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBzZWFyY2hBdHRyID0gYXR0cmlidXRlTWFwLmZpbmQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaEF0dHIgPT0gYXR0cmlidXRlTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJQYXJzZXIgZG9lc24ndCBoYXZlIGtleTogJXMiLCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0b2koc2VhcmNoQXR0ci0+c2Vjb25kKSAhPSB2YWwzMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiVmFsdWVzIGRpZG4ndCBtYXRjaCBmb3Iga2V5OiAlcyIsIG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiVmFsdWVzIGFjdC9leHA6ICVkIC8gJWQiLCB2YWwzMiwgc3RvaShzZWFyY2hBdHRyLT5zZWNvbmQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVTdHJpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQVN0cmluZyB2YWxTdHI7IGl0ZW1EYXRhLmZpbmQoJnZhbFN0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZW50cnkgc3RyIHZhbDogJXMiLCB2YWxTdHIuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBzZWFyY2hBdHRyID0gYXR0cmlidXRlTWFwLmZpbmQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaEF0dHIgPT0gYXR0cmlidXRlTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJQYXJzZXIgZG9lc24ndCBoYXZlIGtleTogJXMiLCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlYXJjaEF0dHItPnNlY29uZCAhPSB2YWxTdHIuY19zdHIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiVmFsdWVzIGRpZG4ndCBtYXRjaCBmb3Iga2V5OiAlcyIsIG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiVmFsdWVzIGFjdC9leHA6ICVzIC8gJXMiLCB2YWxTdHIuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoQXR0ci0+c2Vjb25kLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImRhdGEgdHlwZTogJWQgc2hvdWxkbid0IGJlIHByZXNlbnQgaW4gZGV0YWlscyIsIHR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgUGFyY2VsICpjb2RlY0luZm9QYXJjZWwgPSBuZXcgUGFyY2VsKCk7CisgICAgICAgIEFTU0VSVF9ORShjb2RlY0luZm9QYXJjZWwsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gY3JlYXRlIHBhcmNlbCI7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5mby0+d3JpdGVUb1BhcmNlbChjb2RlY0luZm9QYXJjZWwpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIldyaXRpbmcgdG8gcGFyY2VsIGZhaWxlZCI7CisKKyAgICAgICAgY29kZWNJbmZvUGFyY2VsLT5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgICAgIHNwPE1lZGlhQ29kZWNJbmZvPiBwYXJjZWxDb2RlY0luZm8gPSBpbmZvLT5Gcm9tUGFyY2VsKCpjb2RlY0luZm9QYXJjZWwpOworICAgICAgICBBU1NFUlRfTkUocGFyY2VsQ29kZWNJbmZvLCBudWxscHRyKSA8PCAiQ29kZWNJbmZvIGZyb20gcGFyY2VsIGlzIG51bGwiOworICAgICAgICBkZWxldGUgY29kZWNJbmZvUGFyY2VsOworCisgICAgICAgIEVYUEVDVF9TVFJFUShpbmZvLT5nZXRDb2RlY05hbWUoKSwgcGFyY2VsQ29kZWNJbmZvLT5nZXRDb2RlY05hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiUmV0dXJuZWQgY29kZWMgbmFtZSBpbiBpbmZvIGRvZXNuJ3QgbWF0Y2giOworICAgICAgICBFWFBFQ1RfRVEoaW5mby0+Z2V0UmFuaygpLCBwYXJjZWxDb2RlY0luZm8tPmdldFJhbmsoKSkKKyAgICAgICAgICAgICAgICA8PCAiUmV0dXJuZWQgY29tcG9uZW50IHJhbmsgaW4gaW5mbyBkb2Vzbid0IG1hdGNoIjsKKyAgICB9Cit9CisKK1RFU1QoQ29kZWNMaXN0VGVzdCwgQ29kZWNMaXN0R2xvYmFsU2V0dGluZ3NUZXN0KSB7CisgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBsaXN0ID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKGxpc3QsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gZ2V0IE1lZGlhQ29kZWNMaXN0IGluc3RhbmNlIjsKKworICAgIHNwPEFNZXNzYWdlPiBnbG9iYWxTZXR0aW5ncyA9IGxpc3QtPmdldEdsb2JhbFNldHRpbmdzKCk7CisgICAgQVNTRVJUX05FKGdsb2JhbFNldHRpbmdzLCBudWxscHRyKSA8PCAiR2xvYmFsU2V0dGluZ3MgQU1lc3NhZ2UgaXMgbnVsbCI7CisgICAgQUxPR1YoImdsb2JhbCBzZXR0aW5nczogJXMiLCBnbG9iYWxTZXR0aW5ncy0+ZGVidWdTdHJpbmcoMCkuY19zdHIoKSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS90ZXN0cy9mdXp6ZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhL3Rlc3RzL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwM2I1YjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS90ZXN0cy9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDE5IEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJtZWRpYV9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJtZWRpYV9saWNlbnNlIl0sCit9CisKK2NjX2Z1enogeworICBuYW1lOiAibGlibWVkaWFfbWV0YWRhdGFfZnV6emVyIiwKKyAgc3JjczogWworICAgICJsaWJtZWRpYV9tZXRhZGF0YV9mdXp6ZXIuY3BwIiwKKyAgXSwKKyAgc2hhcmVkX2xpYnM6IFsKKyAgICAibGlibWVkaWEiLAorICAgICJsaWJiaW5kZXIiLAorICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvdGVzdHMvZnV6emVyL2xpYm1lZGlhX21ldGFkYXRhX2Z1enplci5jcHAgYi9tZWRpYS9saWJtZWRpYS90ZXN0cy9mdXp6ZXIvbGlibWVkaWFfbWV0YWRhdGFfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNThlNGU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvdGVzdHMvZnV6emVyL2xpYm1lZGlhX21ldGFkYXRhX2Z1enplci5jcHAKQEAgLTAsMCArMSw1MiBAQAorLy9UaGlzIHByb2dyYW0gZnV6emVzIE1ldGFkYXRhLmNwcAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL01ldGFkYXRhLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBtZWRpYTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHdhbnRfcHJvYiA9IDAuNTsKKworYm9vbCBieXRlc1JlbWFpbihGdXp6ZWREYXRhUHJvdmlkZXIgKmZkcCk7CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgZmRwKGRhdGEsIHNpemUpOworICAgIFBhcmNlbCBwOworICAgIE1ldGFkYXRhIG1kID0gTWV0YWRhdGEoJnApOworCisgICAgbWQuYXBwZW5kSGVhZGVyKCk7CisgICAgd2hpbGUgKGJ5dGVzUmVtYWluKCZmZHApKSB7CisKKyAgICAgICAgZmxvYXQgZ290X3Byb2IgPSBmZHAuQ29uc3VtZVByb2JhYmlsaXR5PGZsb2F0PigpOworICAgICAgICBpZiAoIWJ5dGVzUmVtYWluKCZmZHApKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnb3RfcHJvYiA8IHdhbnRfcHJvYikgeworICAgICAgICAgICAgaW50MzJfdCBrZXlfYm9vbCA9IGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICAgICAgICAgIGlmICghYnl0ZXNSZW1haW4oJmZkcCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgdmFsX2Jvb2wgPSBmZHAuQ29uc3VtZUJvb2woKTsKKyAgICAgICAgICAgIG1kLmFwcGVuZEJvb2woa2V5X2Jvb2wsIHZhbF9ib29sKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludDMyX3Qga2V5X2ludDMyID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgICAgICAgICAgaWYgKCFieXRlc1JlbWFpbigmZmRwKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbCB2YWxfaW50MzIgPSBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgICAgICAgICBtZC5hcHBlbmRJbnQzMihrZXlfaW50MzIsIHZhbF9pbnQzMik7CisgICAgICAgIH0KKyAgICAgICAgbWQudXBkYXRlTGVuZ3RoKCk7CisgICAgfQorICAgIG1kLnJlc2V0UGFyY2VsKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgYnl0ZXNSZW1haW4oRnV6emVkRGF0YVByb3ZpZGVyICpmZHApeworICAgIHJldHVybiBmZHAgLT4gcmVtYWluaW5nX2J5dGVzKCkgPiAwOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL3Rlc3RzL21lZGlhcGxheWVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYS90ZXN0cy9tZWRpYXBsYXllci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZmY3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS90ZXN0cy9tZWRpYXBsYXllci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhX2xpY2Vuc2UiXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIklNZWRpYVBsYXllclRlc3QiLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyIsICJtdHMiXSwKKyAgICBndGVzdDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIklNZWRpYVBsYXllclRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiZmlyc3QiLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL3Rlc3RzL21lZGlhcGxheWVyL0lNZWRpYVBsYXllclRlc3QuY3BwIGIvbWVkaWEvbGlibWVkaWEvdGVzdHMvbWVkaWFwbGF5ZXIvSU1lZGlhUGxheWVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk3ZThlZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL3Rlc3RzL21lZGlhcGxheWVyL0lNZWRpYVBsYXllclRlc3QuY3BwCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIHVpbnQ4X3Qga01vY2tCeXRlQXJyYXlbMTZdID0ge307CisKKyBjbGFzcyBJTWVkaWFQbGF5ZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworICBwcm90ZWN0ZWQ6CisgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFBSRVBBUkVfRFJNID0gSU1lZGlhUGxheWVyOjpQUkVQQVJFX0RSTTsKKworICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBtZWRpYVBsYXllcl8gPSBuZXcgTWVkaWFQbGF5ZXIoKTsKKyAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNlcnZpY2VNYW5hZ2VyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgc3A8SUJpbmRlcj4gbWVkaWFQbGF5ZXJTZXJ2aWNlID0gc2VydmljZU1hbmFnZXItPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLnBsYXllciIpKTsKKyAgICBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBpTWVkaWFQbGF5ZXJTZXJ2aWNlID0KKyAgICAgICAgICAgIElNZWRpYVBsYXllclNlcnZpY2U6OmFzSW50ZXJmYWNlKG1lZGlhUGxheWVyU2VydmljZSk7CisgICAgaU1lZGlhUGxheWVyXyA9IGlNZWRpYVBsYXllclNlcnZpY2UtPmNyZWF0ZShtZWRpYVBsYXllcl8pOworICAgfQorCisgICBzcDxNZWRpYVBsYXllcj4gbWVkaWFQbGF5ZXJfOworICAgc3A8SU1lZGlhUGxheWVyPiBpTWVkaWFQbGF5ZXJfOworIH07CisKK1RFU1RfRihJTWVkaWFQbGF5ZXJUZXN0LCBQcmVwYXJlRHJtSW52YWxpZFRyYW5zYWN0aW9uKSB7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihpTWVkaWFQbGF5ZXJfLT5nZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGUoa01vY2tCeXRlQXJyYXksIDE2KTsKKworICAgIC8vIFdlIHdyaXRlIGEgbGVuZ3RoIGdyZWF0ZXIgdGhhbiB0aGUgZm9sbG93aW5nIHNlc3Npb24gaWQgYXJyYXkuIFNob3VsZCBiZSBkaXNjYXJkZWQuCisgICAgZGF0YS53cml0ZVVpbnQzMigyKTsKKyAgICBkYXRhLndyaXRlVW5wYWRkZWQoa01vY2tCeXRlQXJyYXksIDEpOworCisgICAgc3RhdHVzX3QgcmVzdWx0ID0gSU1lZGlhUGxheWVyOjphc0JpbmRlcihpTWVkaWFQbGF5ZXJfKQorICAgICAgICAgICAgLT50cmFuc2FjdChQUkVQQVJFX0RSTSwgZGF0YSwgJnJlcGx5KTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBCQURfVkFMVUUpOworfQorCitURVNUX0YoSU1lZGlhUGxheWVyVGVzdCwgUHJlcGFyZURybVZhbGlkVHJhbnNhY3Rpb24pIHsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGlNZWRpYVBsYXllcl8tPmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZShrTW9ja0J5dGVBcnJheSwgMTYpOworCisgICAgLy8gV2Ugd3JpdGUgYSBsZW5ndGggZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiB0aGUgZm9sbG93aW5nIGRhdGEuIFRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgdmFsaWQuCisgICAgZGF0YS53cml0ZVVpbnQzMigxKTsKKyAgICBkYXRhLndyaXRlKGtNb2NrQnl0ZUFycmF5LCAxKTsKKworICAgIHN0YXR1c190IHJlc3VsdCA9IElNZWRpYVBsYXllcjo6YXNCaW5kZXIoaU1lZGlhUGxheWVyXykKKyAgICAgICAgICAgIC0+dHJhbnNhY3QoUFJFUEFSRV9EUk0sIGRhdGEsICZyZXBseSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgT0spOworfQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL3hzZC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWEveHNkL0FuZHJvaWQuYnAKaW5kZXggMTYzNWY3MC4uMzZlMjgwOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEveHNkL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWEveHNkL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhX2xpY2Vuc2UiXSwKK30KKwogeHNkX2NvbmZpZyB7CiAgICAgbmFtZTogIm1lZGlhX3Byb2ZpbGVzIiwKICAgICBzcmNzOiBbIm1lZGlhX3Byb2ZpbGVzLnhzZCJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9BbmRyb2lkLmJwCmluZGV4IDU5OGU0MWIuLjgzYWI5NzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYS94c2QvdnRzL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhX2xpY2Vuc2UiXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogInZ0c19tZWRpYVByb2ZpbGVzX3ZhbGlkYXRlX3Rlc3QiLAogICAgIHNyY3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJjMzc3OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS94c2QvdnRzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gVnRzVmFsaWRhdGVNZWRpYVByb2ZpbGVzCi1pbmNsdWRlIHRlc3QvdnRzL3Rvb2xzL2J1aWxkL0FuZHJvaWQuaG9zdF9jb25maWcubWsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9BbmRyb2lkVGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ODcyMWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9BbmRyb2lkVGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgVlRTIFZ0c1ZhbGlkYXRlTWVkaWFQcm9maWxlcy4iPgotICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0icGxhbiIgdmFsdWU9InZ0cy10cmVibGUiIC8+Ci0gICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5WdHNGaWxlUHVzaGVyIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJhYm9ydC1vbi1wdXNoLWZhaWx1cmUiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZ3JvdXAiIHZhbHVlPSJIb3N0RHJpdmVuVGVzdC5wdXNoIi8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkRBVEEvZXRjL21lZGlhX3Byb2ZpbGVzLnhzZC0+L2RhdGEvbG9jYWwvdG1wL21lZGlhX3Byb2ZpbGVzLnhzZCIvPgotICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgotICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5WdHNNdWx0aURldmljZVRlc3QiPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtbW9kdWxlLW5hbWUiIHZhbHVlPSJWdHNWYWxpZGF0ZU1lZGlhUHJvZmlsZXMiLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJiaW5hcnktdGVzdC1zb3VyY2UiIHZhbHVlPSJfMzJiaXQ6OkRBVEEvbmF0aXZldGVzdC92dHNfbWVkaWFQcm9maWxlc192YWxpZGF0ZV90ZXN0L3Z0c19tZWRpYVByb2ZpbGVzX3ZhbGlkYXRlX3Rlc3QiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iYmluYXJ5LXRlc3Qtc291cmNlIiB2YWx1ZT0iXzY0Yml0OjpEQVRBL25hdGl2ZXRlc3Q2NC92dHNfbWVkaWFQcm9maWxlc192YWxpZGF0ZV90ZXN0L3Z0c19tZWRpYVByb2ZpbGVzX3ZhbGlkYXRlX3Rlc3QiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iYmluYXJ5LXRlc3QtdHlwZSIgdmFsdWU9Imd0ZXN0Ii8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC10aW1lb3V0IiB2YWx1ZT0iMzBzIi8+Ci0gICAgPC90ZXN0PgotPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhaGVscGVyL0FuZHJvaWQuYnAKaW5kZXggZmJlN2Y4Ny4uNjRlYzkxYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYWhlbHBlci9BbmRyb2lkLmJwCkBAIC0xLDggKzEsMjMgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9oZWFkZXJzIHsKICAgICBuYW1lOiAibGlibWVkaWFfaGVscGVyX2hlYWRlcnMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CiAKIGNjX2xpYnJhcnkgewpAQCAtMzAsNCArNDUsMTAgQEAKICAgICAgICAgImxpYm1lZGlhX2hlbHBlcl9oZWFkZXJzIiwKICAgICBdLAogICAgIGNsYW5nOiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWhlbHBlci9BdWRpb1BhcmFtZXRlci5jcHAgYi9tZWRpYS9saWJtZWRpYWhlbHBlci9BdWRpb1BhcmFtZXRlci5jcHAKaW5kZXggZmM4MzA2Yy4uNzNjMWU0MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvQXVkaW9QYXJhbWV0ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhaGVscGVyL0F1ZGlvUGFyYW1ldGVyLmNwcApAQCAtNTcsNiArNTcsMTAgQEAKIC8vICAgICAgICBBVURJT19QQVJBTUVURVJfREVWSUNFX1NVUF9FTkNBUFNVTEFUSU9OX01PREVTOwogLy8gY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlEZXZpY2VTdXBwb3J0ZWRFbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcyA9CiAvLyAgICAgICAgQVVESU9fUEFSQU1FVEVSX0RFVklDRV9TVVBfRU5DQVBTVUxBVElPTl9NRVRBREFUQV9UWVBFUzsKKy8vIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5QWRkaXRpb25hbE91dHB1dERldmljZURlbGF5ID0KKy8vICAgICAgICBBVURJT19QQVJBTUVURVJfREVWSUNFX0FERElUSU9OQUxfT1VUUFVUX0RFTEFZOworLy8gY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlNYXhBZGRpdGlvbmFsT3V0cHV0RGV2aWNlRGVsYXkgPQorLy8gICAgICAgIEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfTUFYX0FERElUSU9OQUxfT1VUUFVUX0RFTEFZOwogCiBBdWRpb1BhcmFtZXRlcjo6QXVkaW9QYXJhbWV0ZXIoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhaGVscGVyL1RFU1RfTUFQUElORyBiL21lZGlhL2xpYm1lZGlhaGVscGVyL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTU5NGJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsNyBAQAoreworICAicHJlc3VibWl0IjogWworICAgIHsKKyAgICAgICJuYW1lIjogImxpYm1lZGlhX2hlbHBlcl90ZXN0cyIKKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhaGVscGVyL1R5cGVDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvVHlwZUNvbnZlcnRlci5jcHAKaW5kZXggNjM4MmNlNC4uZDNhNTE3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvVHlwZUNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvVHlwZUNvbnZlcnRlci5jcHAKQEAgLTE4LDMwNyArMTgsOSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLSNkZWZpbmUgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKHN0cmluZykgeyAjc3RyaW5nLCBzdHJpbmcgfQorI2RlZmluZSBNQUtFX1NUUklOR19GUk9NX0VOVU0oZW51bXZhbCkgeyAjZW51bXZhbCwgZW51bXZhbCB9CiAjZGVmaW5lIFRFUk1JTkFUT1IgeyAubGl0ZXJhbCA9IG51bGxwdHIgfQogCi10ZW1wbGF0ZSA8PgotY29uc3QgT3V0cHV0RGV2aWNlQ29udmVydGVyOjpUYWJsZSBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6Om1UYWJsZVtdID0gewotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfTk9ORSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTExfU0NPKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9IRE1JKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlkpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0UpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfTElORSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1NQRElGKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9GTSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0lQKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9CVVMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1BST1hZKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0VDSE9fQ0FOQ0VMTEVSKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSwKLSAgICAvLyBTVFVCIG11c3QgYmUgYWZ0ZXIgREVGQVVMVCwgc28gdGhlIGxhdHRlciBpcyBwaWNrZWQgdXAgYnkgdG9TdHJpbmcgZmlyc3QuCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfU1RVQiksCi0gICAgVEVSTUlOQVRPUgotfTsKLQotdGVtcGxhdGUgPD4KLWNvbnN0IElucHV0RGV2aWNlQ29udmVydGVyOjpUYWJsZSBJbnB1dERldmljZUNvbnZlcnRlcjo6bVRhYmxlW10gPSB7Ci0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9OT05FKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0NPTU1VTklDQVRJT04pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQU1CSUVOVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQUxMX1NDTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0FVWF9ESUdJVEFMKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0hETUkpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fSERNSV9BUkMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9BTkxHX0RPQ0tfSEVBRFNFVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9ER1RMX0RPQ0tfSEVBRFNFVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9VU0JfQUNDRVNTT1JZKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQUxMX1VTQiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9UVl9UVU5FUiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9MSU5FKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1NQRElGKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0xPT1BCQUNLKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0lQKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0JVUyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9QUk9YWSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQkxFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0VDSE9fUkVGRVJFTkNFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0RFRkFVTFQpLAotICAgIC8vIFNUVUIgbXVzdCBiZSBhZnRlciBERUZBVUxULCBzbyB0aGUgbGF0dGVyIGlzIHBpY2tlZCB1cCBieSB0b1N0cmluZyBmaXJzdC4KLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1NUVUIpLAotICAgIFRFUk1JTkFUT1IKLX07Ci0KLQotdGVtcGxhdGUgPD4KLWNvbnN0IE91dHB1dEZsYWdDb252ZXJ0ZXI6OlRhYmxlIE91dHB1dEZsYWdDb252ZXJ0ZXI6Om1UYWJsZVtdID0gewotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19OT05FKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19OT05fQkxPQ0tJTkcpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfVFRTKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfUkFXKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfU1lOQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX0lFQzk1OF9OT05BVURJTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVF9QQ00pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX0lOQ0FMTF9NVVNJQyksCi0gICAgVEVSTUlOQVRPUgotfTsKLQotCi10ZW1wbGF0ZSA8PgotY29uc3QgSW5wdXRGbGFnQ29udmVydGVyOjpUYWJsZSBJbnB1dEZsYWdDb252ZXJ0ZXI6Om1UYWJsZVtdID0gewotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX05PTkUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX0ZBU1QpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX0hXX0hPVFdPUkQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX1JBVyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfU1lOQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfVk9JUF9UWCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUKSwKLSAgICBURVJNSU5BVE9SCi19OwotCi0KLXRlbXBsYXRlIDw+Ci1jb25zdCBGb3JtYXRDb252ZXJ0ZXI6OlRhYmxlIEZvcm1hdENvbnZlcnRlcjo6bVRhYmxlW10gPSB7Ci0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX1BDTV84X0JJVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTVAzKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FNUl9OQiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BTVJfV0IpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19NQUlOKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfU1NSKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MVFApLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0hFX1YxKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19TQ0FMQUJMRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfRVJMQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0hFX1YyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19FTEQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX1hIRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19NQUlOKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX0xDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX1NTUiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19MVFApLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfSEVfVjEpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfU0NBTEFCTEUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfRVJMQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19MRCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19IRV9WMiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19FTEQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfWEhFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX1ZPUkJJUyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9IRV9BQUNfVjEpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfSEVfQUFDX1YyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX09QVVMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUMzKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0VfQUMzKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0RUUyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9EVFNfSEQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfSUVDNjE5MzcpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRE9MQllfVFJVRUhEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0VWUkMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRVZSQ0IpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRVZSQ1dCKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0VWUkNOVyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURJRiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9XTUEpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfV01BX1BSTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BTVJfV0JfUExVUyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9NUDIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfUUNFTFApLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRFNEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0ZMQUMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUxBQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BUEUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfU0JDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FQVFgpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQVBUWF9IRCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQzQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTERBQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9NQVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRV9BQzNfSk9DKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX01BVF8xXzApLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTUFUXzJfMCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9NQVRfMl8xKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQVRNKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQVRNX0xDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQVRNX0hFX1YxKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQVRNX0hFX1YyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0NFTFQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQVBUWF9BREFQVElWRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9MSERDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0xIRENfTEwpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQVBUWF9UV1NQKSwKLSAgICBURVJNSU5BVE9SCi19OwotCi0KLXRlbXBsYXRlIDw+Ci1jb25zdCBPdXRwdXRDaGFubmVsQ29udmVydGVyOjpUYWJsZSBPdXRwdXRDaGFubmVsQ29udmVydGVyOjptVGFibGVbXSA9IHsKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDEpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF8yUE9JTlQwUE9JTlQyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMVBPSU5UMiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1RSSSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1RSSV9CQUNLKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDBQT0lOVDIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1FVQURfQkFDSyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1NVUlJPVU5EKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF81UE9JTlQxKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMVBPSU5UMiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFQT0lOVDQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF82UE9JTlQxKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDFQT0lOVDIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxUE9JTlQ0KSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfSEFQVElDX0EpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9NT05PX0hBUFRJQ19BKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPX0hBUFRJQ19BKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfSEFQVElDX0FCKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfTU9OT19IQVBUSUNfQUIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9TVEVSRU9fSEFQVElDX0FCKSwKLSAgICBURVJNSU5BVE9SCi19OwotCi0KLXRlbXBsYXRlIDw+Ci1jb25zdCBJbnB1dENoYW5uZWxDb252ZXJ0ZXI6OlRhYmxlIElucHV0Q2hhbm5lbENvbnZlcnRlcjo6bVRhYmxlW10gPSB7Ci0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fTU9OTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl82KSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl8yUE9JTlQwUE9JTlQyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl8yUE9JTlQxUE9JTlQyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl8zUE9JTlQwUE9JTlQyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl8zUE9JTlQxUE9JTlQyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl81UE9JTlQxKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTktfTU9OTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LX01PTk8pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0NBTExfTU9OTyksCi0gICAgVEVSTUlOQVRPUgotfTsKLQotdGVtcGxhdGUgPD4KLWNvbnN0IENoYW5uZWxJbmRleENvbnZlcnRlcjo6VGFibGUgQ2hhbm5lbEluZGV4Q29udmVydGVyOjptVGFibGVbXSA9IHsKLSAgICB7IkFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xIiwgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xKX0sCi0gICAgeyJBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMiIsIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMil9LAotICAgIHsiQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzMiLCBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzMpfSwKLSAgICB7IkFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS180Iiwgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS180KX0sCi0gICAgeyJBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNSIsIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNSl9LAotICAgIHsiQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzYiLCBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzYpfSwKLSAgICB7IkFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS183Iiwgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS183KX0sCi0gICAgeyJBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOCIsIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOCl9LAotICAgIFRFUk1JTkFUT1IKLX07Ci0KLQotdGVtcGxhdGUgPD4KLWNvbnN0IEdhaW5Nb2RlQ29udmVydGVyOjpUYWJsZSBHYWluTW9kZUNvbnZlcnRlcjo6bVRhYmxlW10gPSB7Ci0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0dBSU5fTU9ERV9KT0lOVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0dBSU5fTU9ERV9SQU1QKSwKLSAgICBURVJNSU5BVE9SCi19OwotCi0KLXRlbXBsYXRlIDw+Ci1jb25zdCBTdHJlYW1UeXBlQ29udmVydGVyOjpUYWJsZSBTdHJlYW1UeXBlQ29udmVydGVyOjptVGFibGVbXSA9IHsKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX0RFRkFVTFQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9TWVNURU0pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fUklORyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9NVVNJQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9BTEFSTSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyApLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9EVE1GKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX1RUUyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX0FTU0lTVEFOVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9SRVJPVVRJTkcpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fUEFUQ0gpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fQ0FMTF9BU1NJU1RBTlQpLAotICAgIFRFUk1JTkFUT1IKLX07Ci0KIHRlbXBsYXRlPD4KIGNvbnN0IEF1ZGlvTW9kZUNvbnZlcnRlcjo6VGFibGUgQXVkaW9Nb2RlQ29udmVydGVyOjptVGFibGVbXSA9IHsKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fTU9ERV9JTlZBTElEKSwKQEAgLTMzMSw2MiArMzMsNiBAQAogICAgIFRFUk1JTkFUT1IKIH07CiAKLXRlbXBsYXRlPD4KLWNvbnN0IEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdID0gewotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0gpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DT05URU5UX1RZUEVfTVVTSUMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DT05URU5UX1RZUEVfTU9WSUUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OKSwKLSAgICBURVJNSU5BVE9SCi19OwotCi10ZW1wbGF0ZSA8PgotY29uc3QgVXNhZ2VUeXBlQ29udmVydGVyOjpUYWJsZSBVc2FnZVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdID0gewotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9VTktOT1dOKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfTUVESUEpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfQUxBUk0pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9OT1RJRklDQVRJT04pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9HQU1FKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9BU1NJU1RBTlQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9DQUxMX0FTU0lTVEFOVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX0VNRVJHRU5DWSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX1NBRkVUWSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX1ZFSElDTEVfU1RBVFVTKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfQU5OT1VOQ0VNRU5UKSwKLSAgICBURVJNSU5BVE9SCi19OwotCi10ZW1wbGF0ZSA8PgotY29uc3QgU291cmNlVHlwZUNvbnZlcnRlcjo6VGFibGUgU291cmNlVHlwZUNvbnZlcnRlcjo6bVRhYmxlW10gPSB7Ci0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9ERUZBVUxUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX01JQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTkspLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTkspLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9DQU1DT1JERVIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX1ZPSUNFX1BFUkZPUk1BTkNFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX0ZNX1RVTkVSKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX0hPVFdPUkQpLAotICAgIFRFUk1JTkFUT1IKLX07Ci0KIHRlbXBsYXRlIDw+CiBjb25zdCBBdWRpb0ZsYWdDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvRmxhZ0NvbnZlcnRlcjo6bVRhYmxlW10gPSB7CiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfTk9ORSksCkBAIC00MDksNiArNTUsNyBAQAogCiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPE91dHB1dERldmljZVRyYWl0cz47CiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPElucHV0RGV2aWNlVHJhaXRzPjsKK3RlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8RGV2aWNlVHJhaXRzPjsKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8T3V0cHV0RmxhZ1RyYWl0cz47CiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPElucHV0RmxhZ1RyYWl0cz47CiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPEZvcm1hdFRyYWl0cz47CkBAIC00MjIsMTEgKzY5LDYgQEAKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8U291cmNlVHJhaXRzPjsKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8QXVkaW9GbGFnVHJhaXRzPjsKIAotYm9vbCBkZXZpY2VGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaXRlcmFsRGV2aWNlLCBhdWRpb19kZXZpY2VzX3QmIGRldmljZSkgewotICAgIHJldHVybiBJbnB1dERldmljZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhsaXRlcmFsRGV2aWNlLCBkZXZpY2UpIHx8Ci0gICAgICAgICAgICBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcobGl0ZXJhbERldmljZSwgZGV2aWNlKTsKLX0KLQogU2FtcGxlUmF0ZVRyYWl0czo6Q29sbGVjdGlvbiBzYW1wbGluZ1JhdGVzRnJvbVN0cmluZygKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNhbXBsaW5nUmF0ZXMsIGNvbnN0IGNoYXIgKmRlbCkKIHsKQEAgLTQ0NiwyMSArODgsMjAgQEAKIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdEZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJmxpdGVyYWxGb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IGRlZmF1bHRGb3JtYXQpCiB7CiAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0OwotICAgIGlmIChsaXRlcmFsRm9ybWF0LmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRGb3JtYXQ7CisgICAgaWYgKCFsaXRlcmFsRm9ybWF0LmVtcHR5KCkgJiYgRm9ybWF0Q29udmVydGVyOjpmcm9tU3RyaW5nKGxpdGVyYWxGb3JtYXQsIGZvcm1hdCkpIHsKKyAgICAgICAgcmV0dXJuIGZvcm1hdDsKICAgICB9Ci0gICAgRm9ybWF0Q29udmVydGVyOjpmcm9tU3RyaW5nKGxpdGVyYWxGb3JtYXQsIGZvcm1hdCk7Ci0gICAgcmV0dXJuIGZvcm1hdDsKKyAgICByZXR1cm4gZGVmYXVsdEZvcm1hdDsKIH0KIAogYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2tGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZsaXRlcmFsQ2hhbm5lbHMpCiB7CiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbHM7Ci0gICAgaWYgKCFPdXRwdXRDaGFubmVsQ29udmVydGVyOjpmcm9tU3RyaW5nKGxpdGVyYWxDaGFubmVscywgY2hhbm5lbHMpICYmCi0gICAgICAgICAgICAhSW5wdXRDaGFubmVsQ29udmVydGVyOjpmcm9tU3RyaW5nKGxpdGVyYWxDaGFubmVscywgY2hhbm5lbHMpKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX0lOVkFMSUQ7CisgICAgaWYgKCFsaXRlcmFsQ2hhbm5lbHMuZW1wdHkoKSAmJgorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2Zyb21fc3RyaW5nKGxpdGVyYWxDaGFubmVscy5jX3N0cigpLCAmY2hhbm5lbHMpKSB7CisgICAgICAgIHJldHVybiBjaGFubmVsczsKICAgICB9Ci0gICAgcmV0dXJuIGNoYW5uZWxzOworICAgIHJldHVybiBBVURJT19DSEFOTkVMX0lOVkFMSUQ7CiB9CiAKIENoYW5uZWxUcmFpdHM6OkNvbGxlY3Rpb24gY2hhbm5lbE1hc2tzRnJvbVN0cmluZygKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhaGVscGVyL2luY2x1ZGUvbWVkaWEvQXVkaW9QYXJhbWV0ZXIuaCBiL21lZGlhL2xpYm1lZGlhaGVscGVyL2luY2x1ZGUvbWVkaWEvQXVkaW9QYXJhbWV0ZXIuaAppbmRleCA2NmQ4ZGZiLi5iNzJkMGQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYWhlbHBlci9pbmNsdWRlL21lZGlhL0F1ZGlvUGFyYW1ldGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oCkBAIC0xMDQsNiArMTA0LDkgQEAKICAgICAvLyBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleURldmljZVN1cHBvcnRlZEVuY2Fwc3VsYXRpb25Nb2RlczsKICAgICAvLyBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleURldmljZVN1cHBvcnRlZEVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzOwogCisgICAgLy8gc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlBZGRpdGlvbmFsT3V0cHV0RGV2aWNlRGVsYXk7CisgICAgLy8gc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlNYXhBZGRpdGlvbmFsT3V0cHV0RGV2aWNlRGVsYXk7CisKICAgICBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gdG9TdHJpbmdJbXBsKHRydWUpOyB9CiAgICAgU3RyaW5nOCBrZXlzVG9TdHJpbmcoKSBjb25zdCB7IHJldHVybiB0b1N0cmluZ0ltcGwoZmFsc2UpOyB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhaGVscGVyL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvaW5jbHVkZS9tZWRpYS9UeXBlQ29udmVydGVyLmgKaW5kZXggMDExNDk4YS4uNDJjY2I1ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvaW5jbHVkZS9tZWRpYS9UeXBlQ29udmVydGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvaW5jbHVkZS9tZWRpYS9UeXBlQ29udmVydGVyLmgKQEAgLTI0LDggKzI0LDYgQEAKIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KICNpbmNsdWRlICJjb252ZXJ0LmgiCkBAIC00MywxNiArNDEsNiBAQAogICAgIH0KIH07CiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBTb3J0ZWRWZWN0b3JUcmFpdHMKLXsKLSAgICB0eXBlZGVmIFQgVHlwZTsKLSAgICB0eXBlZGVmIFNvcnRlZFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotICAgIHN0YXRpYyB2b2lkIGFkZChDb2xsZWN0aW9uICZjb2xsZWN0aW9uLCBUeXBlIHZhbHVlKQotICAgIHsKLSAgICAgICAgY29sbGVjdGlvbi5hZGQodmFsdWUpOwotICAgIH0KLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHN0cnVjdCBTZXRUcmFpdHMKIHsKICAgICB0eXBlZGVmIFQgVHlwZTsKQEAgLTEwOCwxMyArOTYsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBUcmFpdHM6OkNvbGxlY3Rpb24gJmNvbGxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVsID0gQXVkaW9QYXJhbWV0ZXI6OnZhbHVlTGlzdFNlcGFyYXRvcik7CiAKLSAgICBzdGF0aWMgdWludDMyX3QgbWFza0Zyb21TdHJpbmcoCisgICAgc3RhdGljIHR5cGVuYW1lIFRyYWl0czo6VHlwZSBtYXNrRnJvbVN0cmluZygKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGNvbnN0IGNoYXIgKmRlbCA9IEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IpOwogCiAgICAgc3RhdGljIHZvaWQgbWFza1RvU3RyaW5nKAotICAgICAgICAgICAgdWludDMyX3QgbWFzaywgc3RkOjpzdHJpbmcgJnN0ciwgY29uc3QgY2hhciAqZGVsID0gQXVkaW9QYXJhbWV0ZXI6OnZhbHVlTGlzdFNlcGFyYXRvcik7CisgICAgICAgICAgICB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgbWFzaywgc3RkOjpzdHJpbmcgJnN0ciwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlbCA9IEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IpOwogCiBwcm90ZWN0ZWQ6CisgICAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgdXNlIG1UYWJsZSBmb3IgdG8vZnJvbSBzdHJpbmcgY29udmVyc2lvbnMKKyAgICAvLyBvZiBlYWNoIGluZGl2aWR1YWwgZW51bSB2YWx1ZS4KKyAgICAvLyBUaGVzZSBmdW5jdGlvbnMgbWF5IGJlIHNwZWNpYWxpemVkIHRvIHVzZSBleHRlcm5hbCBjb252ZXJ0ZXJzIGluc3RlYWQuCisgICAgc3RhdGljIGJvb2wgdG9TdHJpbmdJbXBsKGNvbnN0IHR5cGVuYW1lIFRyYWl0czo6VHlwZSAmdmFsdWUsIHN0ZDo6c3RyaW5nICZzdHIpOworICAgIHN0YXRpYyBib29sIGZyb21TdHJpbmdJbXBsKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIHR5cGVuYW1lIFRyYWl0czo6VHlwZSAmcmVzdWx0KTsKKwogICAgIHN0cnVjdCBUYWJsZSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKmxpdGVyYWw7CiAgICAgICAgIHR5cGVuYW1lIFRyYWl0czo6VHlwZSB2YWx1ZTsKQEAgLTEyNCwyNiArMTE5LDIyIEBACiB9OwogCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXRzPgotaW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxUcmFpdHM+Ojp0b1N0cmluZyhjb25zdCB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgJnZhbHVlLCBzdGQ6OnN0cmluZyAmc3RyKQoteworaW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxUcmFpdHM+Ojp0b1N0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IHR5cGVuYW1lIFRyYWl0czo6VHlwZSAmdmFsdWUsIHN0ZDo6c3RyaW5nICZzdHIpIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgbVRhYmxlW2ldLmxpdGVyYWw7IGkrKykgewogICAgICAgICBpZiAobVRhYmxlW2ldLnZhbHVlID09IHZhbHVlKSB7CiAgICAgICAgICAgICBzdHIgPSBtVGFibGVbaV0ubGl0ZXJhbDsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIGNoYXIgcmVzdWx0WzY0XTsKLSAgICBzbnByaW50ZihyZXN1bHQsIHNpemVvZihyZXN1bHQpLCAiVW5rbm93biBlbnVtIHZhbHVlICVkIiwgdmFsdWUpOwotICAgIHN0ciA9IHJlc3VsdDsKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFpdHM+Ci1pbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPFRyYWl0cz46OmZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgdHlwZW5hbWUgVHJhaXRzOjpUeXBlICZyZXN1bHQpCi17CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPFRyYWl0cz46OmZyb21TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgJnJlc3VsdCkgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBtVGFibGVbaV0ubGl0ZXJhbDsgaSsrKSB7CiAgICAgICAgIGlmIChzdHJjbXAobVRhYmxlW2ldLmxpdGVyYWwsIHN0ci5jX3N0cigpKSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigic3RyaW5nVG9FbnVtKCkgZm91bmQgJXMiLCBtVGFibGVbaV0ubGl0ZXJhbCk7CiAgICAgICAgICAgICByZXN1bHQgPSBtVGFibGVbaV0udmFsdWU7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQpAQCAtMTUyLDYgKzE0MywyNiBAQAogfQogCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXRzPgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxUcmFpdHM+Ojp0b1N0cmluZyhjb25zdCB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgJnZhbHVlLCBzdGQ6OnN0cmluZyAmc3RyKQoreworICAgIGNvbnN0IGJvb2wgc3VjY2VzcyA9IHRvU3RyaW5nSW1wbCh2YWx1ZSwgc3RyKTsKKyAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgY2hhciByZXN1bHRbNjRdOworICAgICAgICBzbnByaW50ZihyZXN1bHQsIHNpemVvZihyZXN1bHQpLCAiVW5rbm93biBlbnVtIHZhbHVlICVkIiwgdmFsdWUpOworICAgICAgICBzdHIgPSByZXN1bHQ7CisgICAgfQorICAgIHJldHVybiBzdWNjZXNzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXRzPgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxUcmFpdHM+Ojpmcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIHR5cGVuYW1lIFRyYWl0czo6VHlwZSAmcmVzdWx0KQoreworICAgIGNvbnN0IGJvb2wgc3VjY2VzcyA9IGZyb21TdHJpbmdJbXBsKHN0ciwgcmVzdWx0KTsKKyAgICBBTE9HVl9JRihzdWNjZXNzLCAic3RyaW5nVG9FbnVtKCkgZm91bmQgJXMiLCBzdHIuY19zdHIoKSk7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFpdHM+CiBpbmxpbmUgdm9pZCBUeXBlQ29udmVydGVyPFRyYWl0cz46OmNvbGxlY3Rpb25Gcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsCiAgICAgICAgIHR5cGVuYW1lIFRyYWl0czo6Q29sbGVjdGlvbiAmY29sbGVjdGlvbiwKICAgICAgICAgY29uc3QgY2hhciAqZGVsKQpAQCAtMTY4LDcgKzE3OSw4IEBACiB9CiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFpdHM+Ci1pbmxpbmUgdWludDMyX3QgVHlwZUNvbnZlcnRlcjxUcmFpdHM+OjptYXNrRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBjb25zdCBjaGFyICpkZWwpCitpbmxpbmUgdHlwZW5hbWUgVHJhaXRzOjpUeXBlIFR5cGVDb252ZXJ0ZXI8VHJhaXRzPjo6bWFza0Zyb21TdHJpbmcoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGNvbnN0IGNoYXIgKmRlbCkKIHsKICAgICBjaGFyICpsaXRlcmFsID0gc3RyZHVwKHN0ci5jX3N0cigpKTsKICAgICB1aW50MzJfdCB2YWx1ZSA9IDA7CkBAIC0xNzksMjAgKzE5MSwyNCBAQAogICAgICAgICB9CiAgICAgfQogICAgIGZyZWUobGl0ZXJhbCk7Ci0gICAgcmV0dXJuIHZhbHVlOworICAgIHJldHVybiBzdGF0aWNfY2FzdDx0eXBlbmFtZSBUcmFpdHM6OlR5cGU+KHZhbHVlKTsKIH0KIAogdGVtcGxhdGUgPGNsYXNzIFRyYWl0cz4KLWlubGluZSB2b2lkIFR5cGVDb252ZXJ0ZXI8VHJhaXRzPjo6bWFza1RvU3RyaW5nKHVpbnQzMl90IG1hc2ssIHN0ZDo6c3RyaW5nICZzdHIsIGNvbnN0IGNoYXIgKmRlbCkKK2lubGluZSB2b2lkIFR5cGVDb252ZXJ0ZXI8VHJhaXRzPjo6bWFza1RvU3RyaW5nKAorICAgICAgICB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgbWFzaywgc3RkOjpzdHJpbmcgJnN0ciwgY29uc3QgY2hhciAqZGVsKQogewogICAgIGlmIChtYXNrICE9IDApIHsKICAgICAgICAgYm9vbCBmaXJzdF9mbGFnID0gdHJ1ZTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IG1UYWJsZVtpXS5saXRlcmFsOyBpKyspIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1UYWJsZVtpXS52YWx1ZSk7Ci0gICAgICAgICAgICBpZiAobVRhYmxlW2ldLnZhbHVlICE9IDAgJiYgKChtYXNrICYgdmFsdWUpID09IHZhbHVlKSkgewotICAgICAgICAgICAgICAgIGlmICghZmlyc3RfZmxhZykgc3RyICs9IGRlbDsKLSAgICAgICAgICAgICAgICBmaXJzdF9mbGFnID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgc3RyICs9IG1UYWJsZVtpXS5saXRlcmFsOworICAgICAgICBmb3IgKHNpemVfdCBiaXQgPSAwOyBiaXQgPCBzaXplb2YodWludDMyX3QpICogODsgKytiaXQpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWcgPSAxdSA8PCBiaXQ7CisgICAgICAgICAgICBpZiAoKGZsYWcgJiBtYXNrKSA9PSBmbGFnKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmxhZ19zdHI7CisgICAgICAgICAgICAgICAgaWYgKHRvU3RyaW5nKHN0YXRpY19jYXN0PHR5cGVuYW1lIFRyYWl0czo6VHlwZT4oZmxhZyksIGZsYWdfc3RyKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0X2ZsYWcpIHN0ciArPSBkZWw7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0X2ZsYWcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgc3RyICs9IGZsYWdfc3RyOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC0yMDAsNiArMjE2LDcgQEAKICAgICB9CiB9CiAKK3R5cGVkZWYgVHlwZUNvbnZlcnRlcjxEZXZpY2VUcmFpdHM+IERldmljZUNvbnZlcnRlcjsKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxPdXRwdXREZXZpY2VUcmFpdHM+IE91dHB1dERldmljZUNvbnZlcnRlcjsKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxJbnB1dERldmljZVRyYWl0cz4gSW5wdXREZXZpY2VDb252ZXJ0ZXI7CiB0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8T3V0cHV0RmxhZ1RyYWl0cz4gT3V0cHV0RmxhZ0NvbnZlcnRlcjsKQEAgLTIxNiwyMyArMjMzLDIyNyBAQAogdHlwZWRlZiBUeXBlQ29udmVydGVyPFNvdXJjZVRyYWl0cz4gU291cmNlVHlwZUNvbnZlcnRlcjsKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxBdWRpb0ZsYWdUcmFpdHM+IEF1ZGlvRmxhZ0NvbnZlcnRlcjsKIAotdGVtcGxhdGU8PiBjb25zdCBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OlRhYmxlIE91dHB1dERldmljZUNvbnZlcnRlcjo6bVRhYmxlW107Ci10ZW1wbGF0ZTw+IGNvbnN0IElucHV0RGV2aWNlQ29udmVydGVyOjpUYWJsZSBJbnB1dERldmljZUNvbnZlcnRlcjo6bVRhYmxlW107Ci10ZW1wbGF0ZTw+IGNvbnN0IE91dHB1dEZsYWdDb252ZXJ0ZXI6OlRhYmxlIE91dHB1dEZsYWdDb252ZXJ0ZXI6Om1UYWJsZVtdOwotdGVtcGxhdGU8PiBjb25zdCBJbnB1dEZsYWdDb252ZXJ0ZXI6OlRhYmxlIElucHV0RmxhZ0NvbnZlcnRlcjo6bVRhYmxlW107Ci10ZW1wbGF0ZTw+IGNvbnN0IEZvcm1hdENvbnZlcnRlcjo6VGFibGUgRm9ybWF0Q29udmVydGVyOjptVGFibGVbXTsKLXRlbXBsYXRlPD4gY29uc3QgT3V0cHV0Q2hhbm5lbENvbnZlcnRlcjo6VGFibGUgT3V0cHV0Q2hhbm5lbENvbnZlcnRlcjo6bVRhYmxlW107Ci10ZW1wbGF0ZTw+IGNvbnN0IElucHV0Q2hhbm5lbENvbnZlcnRlcjo6VGFibGUgSW5wdXRDaGFubmVsQ29udmVydGVyOjptVGFibGVbXTsKLXRlbXBsYXRlPD4gY29uc3QgQ2hhbm5lbEluZGV4Q29udmVydGVyOjpUYWJsZSBDaGFubmVsSW5kZXhDb252ZXJ0ZXI6Om1UYWJsZVtdOwotdGVtcGxhdGU8PiBjb25zdCBHYWluTW9kZUNvbnZlcnRlcjo6VGFibGUgR2Fpbk1vZGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwotdGVtcGxhdGU8PiBjb25zdCBTdHJlYW1UeXBlQ29udmVydGVyOjpUYWJsZSBTdHJlYW1UeXBlQ29udmVydGVyOjptVGFibGVbXTsKIHRlbXBsYXRlPD4gY29uc3QgQXVkaW9Nb2RlQ29udmVydGVyOjpUYWJsZSBBdWRpb01vZGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwotdGVtcGxhdGU8PiBjb25zdCBBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOjpUYWJsZSBBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOjptVGFibGVbXTsKLXRlbXBsYXRlPD4gY29uc3QgVXNhZ2VUeXBlQ29udmVydGVyOjpUYWJsZSBVc2FnZVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwotdGVtcGxhdGU8PiBjb25zdCBTb3VyY2VUeXBlQ29udmVydGVyOjpUYWJsZSBTb3VyY2VUeXBlQ29udmVydGVyOjptVGFibGVbXTsKIHRlbXBsYXRlPD4gY29uc3QgQXVkaW9GbGFnQ29udmVydGVyOjpUYWJsZSBBdWRpb0ZsYWdDb252ZXJ0ZXI6Om1UYWJsZVtdOwogCi1ib29sIGRldmljZUZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGxpdGVyYWxEZXZpY2UsIGF1ZGlvX2RldmljZXNfdCYgZGV2aWNlKTsKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPERldmljZVRyYWl0cz46OnRvU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3QgRGV2aWNlVHJhaXRzOjpUeXBlICZ2YWx1ZSwgc3RkOjpzdHJpbmcgJnN0cikgeworICAgIHN0ciA9IGF1ZGlvX2RldmljZV90b19zdHJpbmcodmFsdWUpOworICAgIHJldHVybiAhc3RyLmVtcHR5KCk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPERldmljZVRyYWl0cz46OmZyb21TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBEZXZpY2VUcmFpdHM6OlR5cGUgJnJlc3VsdCkgeworICAgIHJldHVybiBhdWRpb19kZXZpY2VfZnJvbV9zdHJpbmcoc3RyLmNfc3RyKCksICZyZXN1bHQpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxPdXRwdXREZXZpY2VUcmFpdHM+Ojp0b1N0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IE91dHB1dERldmljZVRyYWl0czo6VHlwZSAmdmFsdWUsIHN0ZDo6c3RyaW5nICZzdHIpIHsKKyAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZSh2YWx1ZSkpIHsKKyAgICAgICAgc3RyID0gYXVkaW9fZGV2aWNlX3RvX3N0cmluZyh2YWx1ZSk7CisgICAgICAgIHJldHVybiAhc3RyLmVtcHR5KCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8T3V0cHV0RGV2aWNlVHJhaXRzPjo6ZnJvbVN0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIE91dHB1dERldmljZVRyYWl0czo6VHlwZSAmcmVzdWx0KSB7CisgICAgT3V0cHV0RGV2aWNlVHJhaXRzOjpUeXBlIHRlbXA7CisgICAgaWYgKGF1ZGlvX2RldmljZV9mcm9tX3N0cmluZyhzdHIuY19zdHIoKSwgJnRlbXApICYmCisgICAgICAgICAgICBhdWRpb19pc19vdXRwdXRfZGV2aWNlKHRlbXApKSB7CisgICAgICAgIHJlc3VsdCA9IHRlbXA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPElucHV0RGV2aWNlVHJhaXRzPjo6dG9TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBJbnB1dERldmljZVRyYWl0czo6VHlwZSAmdmFsdWUsIHN0ZDo6c3RyaW5nICZzdHIpIHsKKyAgICBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKHZhbHVlKSkgeworICAgICAgICBzdHIgPSBhdWRpb19kZXZpY2VfdG9fc3RyaW5nKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuICFzdHIuZW1wdHkoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxJbnB1dERldmljZVRyYWl0cz46OmZyb21TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBJbnB1dERldmljZVRyYWl0czo6VHlwZSAmcmVzdWx0KSB7CisgICAgSW5wdXREZXZpY2VUcmFpdHM6OlR5cGUgdGVtcDsKKyAgICBpZiAoYXVkaW9fZGV2aWNlX2Zyb21fc3RyaW5nKHN0ci5jX3N0cigpLCAmdGVtcCkgJiYKKyAgICAgICAgICAgIGF1ZGlvX2lzX2lucHV0X2RldmljZSh0ZW1wKSkgeworICAgICAgICByZXN1bHQgPSB0ZW1wOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxJbnB1dEZsYWdUcmFpdHM+Ojp0b1N0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IGF1ZGlvX2lucHV0X2ZsYWdzX3QgJnZhbHVlLCBzdGQ6OnN0cmluZyAmc3RyKSB7CisgICAgc3RyID0gYXVkaW9faW5wdXRfZmxhZ190b19zdHJpbmcodmFsdWUpOworICAgIHJldHVybiAhc3RyLmVtcHR5KCk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPElucHV0RmxhZ1RyYWl0cz46OmZyb21TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBhdWRpb19pbnB1dF9mbGFnc190ICZyZXN1bHQpIHsKKyAgICByZXR1cm4gYXVkaW9faW5wdXRfZmxhZ19mcm9tX3N0cmluZyhzdHIuY19zdHIoKSwgJnJlc3VsdCk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPE91dHB1dEZsYWdUcmFpdHM+Ojp0b1N0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IGF1ZGlvX291dHB1dF9mbGFnc190ICZ2YWx1ZSwgc3RkOjpzdHJpbmcgJnN0cikgeworICAgIHN0ciA9IGF1ZGlvX291dHB1dF9mbGFnX3RvX3N0cmluZyh2YWx1ZSk7CisgICAgcmV0dXJuICFzdHIuZW1wdHkoKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8T3V0cHV0RmxhZ1RyYWl0cz46OmZyb21TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBhdWRpb19vdXRwdXRfZmxhZ3NfdCAmcmVzdWx0KSB7CisgICAgcmV0dXJuIGF1ZGlvX291dHB1dF9mbGFnX2Zyb21fc3RyaW5nKHN0ci5jX3N0cigpLCAmcmVzdWx0KTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8Rm9ybWF0VHJhaXRzPjo6dG9TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCAmdmFsdWUsIHN0ZDo6c3RyaW5nICZzdHIpIHsKKyAgICBzdHIgPSBhdWRpb19mb3JtYXRfdG9fc3RyaW5nKHZhbHVlKTsKKyAgICByZXR1cm4gIXN0ci5lbXB0eSgpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxGb3JtYXRUcmFpdHM+Ojpmcm9tU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgYXVkaW9fZm9ybWF0X3QgJnJlc3VsdCkgeworICAgIHJldHVybiBhdWRpb19mb3JtYXRfZnJvbV9zdHJpbmcoc3RyLmNfc3RyKCksICZyZXN1bHQpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxPdXRwdXRDaGFubmVsVHJhaXRzPjo6dG9TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCAmdmFsdWUsIHN0ZDo6c3RyaW5nICZzdHIpIHsKKyAgICBzdHIgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX3RvX3N0cmluZyh2YWx1ZSk7CisgICAgcmV0dXJuICFzdHIuZW1wdHkoKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8T3V0cHV0Q2hhbm5lbFRyYWl0cz46OmZyb21TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBhdWRpb19jaGFubmVsX21hc2tfdCAmcmVzdWx0KSB7CisgICAgT3V0cHV0Q2hhbm5lbFRyYWl0czo6VHlwZSB0ZW1wOworICAgIGlmIChhdWRpb19jaGFubmVsX21hc2tfZnJvbV9zdHJpbmcoc3RyLmNfc3RyKCksICZ0ZW1wKSAmJgorICAgICAgICAgICAgYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwodGVtcCkpIHsKKyAgICAgICAgcmVzdWx0ID0gdGVtcDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8SW5wdXRDaGFubmVsVHJhaXRzPjo6dG9TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCAmdmFsdWUsIHN0ZDo6c3RyaW5nICZzdHIpIHsKKyAgICBzdHIgPSBhdWRpb19jaGFubmVsX2luX21hc2tfdG9fc3RyaW5nKHZhbHVlKTsKKyAgICByZXR1cm4gIXN0ci5lbXB0eSgpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxJbnB1dENoYW5uZWxUcmFpdHM+Ojpmcm9tU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgJnJlc3VsdCkgeworICAgIElucHV0Q2hhbm5lbFRyYWl0czo6VHlwZSB0ZW1wOworICAgIGlmIChhdWRpb19jaGFubmVsX21hc2tfZnJvbV9zdHJpbmcoc3RyLmNfc3RyKCksICZ0ZW1wKSAmJgorICAgICAgICAgICAgYXVkaW9faXNfaW5wdXRfY2hhbm5lbCh0ZW1wKSkgeworICAgICAgICByZXN1bHQgPSB0ZW1wOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxDaGFubmVsSW5kZXhUcmFpdHM+Ojp0b1N0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190ICZ2YWx1ZSwgc3RkOjpzdHJpbmcgJnN0cikgeworICAgIHN0ciA9IGF1ZGlvX2NoYW5uZWxfaW5kZXhfbWFza190b19zdHJpbmcodmFsdWUpOworICAgIHJldHVybiAhc3RyLmVtcHR5KCk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPENoYW5uZWxJbmRleFRyYWl0cz46OmZyb21TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBhdWRpb19jaGFubmVsX21hc2tfdCAmcmVzdWx0KSB7CisgICAgQ2hhbm5lbEluZGV4VHJhaXRzOjpUeXBlIHRlbXA7CisgICAgaWYgKGF1ZGlvX2NoYW5uZWxfbWFza19mcm9tX3N0cmluZyhzdHIuY19zdHIoKSwgJnRlbXApICYmCisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKHRlbXApID09IEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fSU5ERVgpIHsKKyAgICAgICAgcmVzdWx0ID0gdGVtcDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8U3RyZWFtVHJhaXRzPjo6dG9TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZ2YWx1ZSwgc3RkOjpzdHJpbmcgJnN0cikgeworICAgIHN0ciA9IGF1ZGlvX3N0cmVhbV90eXBlX3RvX3N0cmluZyh2YWx1ZSk7CisgICAgcmV0dXJuICFzdHIuZW1wdHkoKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8U3RyZWFtVHJhaXRzPjo6ZnJvbVN0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGF1ZGlvX3N0cmVhbV90eXBlX3QgJnJlc3VsdCkKK3sKKyAgICByZXR1cm4gYXVkaW9fc3RyZWFtX3R5cGVfZnJvbV9zdHJpbmcoc3RyLmNfc3RyKCksICZyZXN1bHQpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxHYWluTW9kZVRyYWl0cz46OnRvU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3QgYXVkaW9fZ2Fpbl9tb2RlX3QgJnZhbHVlLCBzdGQ6OnN0cmluZyAmc3RyKSB7CisgICAgc3RyID0gYXVkaW9fZ2Fpbl9tb2RlX3RvX3N0cmluZyh2YWx1ZSk7CisgICAgcmV0dXJuICFzdHIuZW1wdHkoKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8R2Fpbk1vZGVUcmFpdHM+Ojpmcm9tU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgYXVkaW9fZ2Fpbl9tb2RlX3QgJnJlc3VsdCkgeworICAgIHJldHVybiBhdWRpb19nYWluX21vZGVfZnJvbV9zdHJpbmcoc3RyLmNfc3RyKCksICZyZXN1bHQpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxBdWRpb0NvbnRlbnRUcmFpdHM+Ojp0b1N0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IGF1ZGlvX2NvbnRlbnRfdHlwZV90ICZ2YWx1ZSwgc3RkOjpzdHJpbmcgJnN0cikgeworICAgIHN0ciA9IGF1ZGlvX2NvbnRlbnRfdHlwZV90b19zdHJpbmcodmFsdWUpOworICAgIHJldHVybiAhc3RyLmVtcHR5KCk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPEF1ZGlvQ29udGVudFRyYWl0cz46OmZyb21TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBhdWRpb19jb250ZW50X3R5cGVfdCAmcmVzdWx0KSB7CisgICAgcmV0dXJuIGF1ZGlvX2NvbnRlbnRfdHlwZV9mcm9tX3N0cmluZyhzdHIuY19zdHIoKSwgJnJlc3VsdCk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPFVzYWdlVHJhaXRzPjo6dG9TdHJpbmdJbXBsKGNvbnN0IGF1ZGlvX3VzYWdlX3QgJnZhbHVlLCBzdGQ6OnN0cmluZyAmc3RyKQoreworICAgIHN0ciA9IGF1ZGlvX3VzYWdlX3RvX3N0cmluZyh2YWx1ZSk7CisgICAgcmV0dXJuICFzdHIuZW1wdHkoKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8VXNhZ2VUcmFpdHM+Ojpmcm9tU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgYXVkaW9fdXNhZ2VfdCAmcmVzdWx0KSB7CisgICAgcmV0dXJuIGF1ZGlvX3VzYWdlX2Zyb21fc3RyaW5nKHN0ci5jX3N0cigpLCAmcmVzdWx0KTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8U291cmNlVHJhaXRzPjo6dG9TdHJpbmdJbXBsKGNvbnN0IGF1ZGlvX3NvdXJjZV90ICZ2YWx1ZSwgc3RkOjpzdHJpbmcgJnN0cikKK3sKKyAgICBzdHIgPSBhdWRpb19zb3VyY2VfdG9fc3RyaW5nKHZhbHVlKTsKKyAgICByZXR1cm4gIXN0ci5lbXB0eSgpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxTb3VyY2VUcmFpdHM+Ojpmcm9tU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgYXVkaW9fc291cmNlX3QgJnJlc3VsdCkgeworICAgIHJldHVybiBhdWRpb19zb3VyY2VfZnJvbV9zdHJpbmcoc3RyLmNfc3RyKCksICZyZXN1bHQpOworfQogCiBTYW1wbGVSYXRlVHJhaXRzOjpDb2xsZWN0aW9uIHNhbXBsaW5nUmF0ZXNGcm9tU3RyaW5nKAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc2FtcGxpbmdSYXRlcywgY29uc3QgY2hhciAqZGVsID0gQXVkaW9QYXJhbWV0ZXI6OnZhbHVlTGlzdFNlcGFyYXRvcik7CkBAIC0yNTYsNiArNDc3LDcgQEAKIAogLy8gY291bnRpbmcgZW51bWVyYXRpb25zCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjplbmFibGVfaWZfdDxzdGQ6OmlzX3NhbWU8VCwgYXVkaW9fY29udGVudF90eXBlX3Q+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPFQsIGF1ZGlvX2RldmljZXNfdD46OnZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8VCwgYXVkaW9fbW9kZV90Pjo6dmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxULCBhdWRpb19zb3VyY2VfdD46OnZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8VCwgYXVkaW9fc3RyZWFtX3R5cGVfdD46OnZhbHVlCkBAIC0yODIsMTcgKzUwNCw2IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBhdWRpb19kZXZpY2VzX3QmIGRldmljZXMpCi17Ci0gICAgc3RkOjpzdHJpbmcgcmVzdWx0OwotICAgIGlmICgoZGV2aWNlcyAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApIHsKLSAgICAgICAgSW5wdXREZXZpY2VDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhkZXZpY2VzLCByZXN1bHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE91dHB1dERldmljZUNvbnZlcnRlcjo6bWFza1RvU3RyaW5nKGRldmljZXMsIHJlc3VsdCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKQogewogICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXN1bHQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWhlbHBlci90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWYyODE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDMxIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJsaWJtZWRpYV9oZWxwZXJfdGVzdHMiLAorCisgICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsiYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fVjdfMCJdLAorICAgIGdlbmVyYXRlZF9zb3VyY2VzOiBbImF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX1Y3XzAiXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJ4c2RjLXV0aWxzIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJ4bWwyIiwKKyAgICBdLAorCisgICAgc3JjczogWyJ0eXBlY29udmVydGVyX3Rlc3RzLmNwcCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWhlbHBlci90ZXN0cy90eXBlY29udmVydGVyX3Rlc3RzLmNwcCBiL21lZGlhL2xpYm1lZGlhaGVscGVyL3Rlc3RzL3R5cGVjb252ZXJ0ZXJfdGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MWQ2MzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWhlbHBlci90ZXN0cy90eXBlY29udmVydGVyX3Rlc3RzLmNwcApAQCAtMCwwICsxLDIzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjZGVmaW5lIExPR19UQUcgIlR5cGVDb252ZXJ0ZXJfVGVzdCIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX1Y3XzAuaD4KKyNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8eHNkYy9Yc2RjU3VwcG9ydC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK25hbWVzcGFjZSB4c2QgewordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmF1ZGlvOjpwb2xpY3k6OmNvbmZpZ3VyYXRpb246OlY3XzA7Cit9CisKK1RFU1QoVHlwZUNvbnZlcnRlciwgUGFyc2VDaGFubmVsTWFza3MpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZW51bVZhbCA6IHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvQ2hhbm5lbE1hc2s+e30pIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RyaW5nVmFsID0gdG9TdHJpbmcoZW51bVZhbCk7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2tGcm9tU3RyaW5nKHN0cmluZ1ZhbCk7CisgICAgICAgIEVYUEVDVF9FUShlbnVtVmFsICE9IHhzZDo6QXVkaW9DaGFubmVsTWFzazo6QVVESU9fQ0hBTk5FTF9OT05FLAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19pc192YWxpZChjaGFubmVsTWFzaykpCisgICAgICAgICAgICAgICAgPDwgIlZhbGlkaXR5IG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIGlzIG5vdCBhcyBleHBlY3RlZCI7CisgICAgfQorfQorCitURVNUKFR5cGVDb252ZXJ0ZXIsIFBhcnNlSW5wdXRPdXRwdXRJbmRleENoYW5uZWxNYXNrKSB7CisgICAgZm9yIChjb25zdCBhdXRvIGVudW1WYWwgOiB4c2RjX2VudW1fcmFuZ2U8eHNkOjpBdWRpb0NoYW5uZWxNYXNrPnt9KSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbCA9IHRvU3RyaW5nKGVudW1WYWwpOworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgY2hhbm5lbE1hc2tCYWNrOworICAgICAgICBzdGQ6OnN0cmluZyBzdHJpbmdWYWxCYWNrOworICAgICAgICBpZiAoc3RyaW5nVmFsLmZpbmQoIl9DSEFOTkVMX0lOXyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShJbnB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBjaGFubmVsTWFzaykpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIGZhaWxlZCAoYXMgaW5wdXQgY2hhbm5lbCBtYXNrKSI7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShJbnB1dENoYW5uZWxDb252ZXJ0ZXI6OnRvU3RyaW5nKGNoYW5uZWxNYXNrLCBzdHJpbmdWYWxCYWNrKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgaW5wdXQgY2hhbm5lbCBtYXNrICIgPDwgY2hhbm5lbE1hc2sgPDwgIiBmYWlsZWQiOworICAgICAgICAgICAgLy8gRHVlIHRvIGFsaWFzZWQgdmFsdWVzLCB0aGUgcmVzdWx0IG9mICd0b1N0cmluZycgbWlnaHQgbm90IGJlIHRoZSBzYW1lCisgICAgICAgICAgICAvLyBhcyAnc3RyaW5nVmFsJywgdGh1cyB3ZSBuZWVkIHRvIGNvbXBhcmUgdGhlIHJlc3VsdHMgb2YgcGFyc2luZyBpbnN0ZWFkLgorICAgICAgICAgICAgRVhQRUNUX1RSVUUoSW5wdXRDaGFubmVsQ29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmluZ1ZhbEJhY2ssIGNoYW5uZWxNYXNrQmFjaykpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWxCYWNrIDw8ICJcIiBmYWlsZWQgKGFzIGlucHV0IGNoYW5uZWwgbWFzaykiOworICAgICAgICAgICAgRVhQRUNUX0VRKGNoYW5uZWxNYXNrLCBjaGFubmVsTWFza0JhY2spOworICAgICAgICB9IGVsc2UgaWYgKHN0cmluZ1ZhbC5maW5kKCJfQ0hBTk5FTF9PVVRfIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKE91dHB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBjaGFubmVsTWFzaykpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIGZhaWxlZCAoYXMgb3V0cHV0IGNoYW5uZWwgbWFzaykiOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoT3V0cHV0Q2hhbm5lbENvbnZlcnRlcjo6dG9TdHJpbmcoY2hhbm5lbE1hc2ssIHN0cmluZ1ZhbEJhY2spKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBvdXRwdXQgY2hhbm5lbCBtYXNrICIgPDwgY2hhbm5lbE1hc2sgPDwgIiBmYWlsZWQiOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoT3V0cHV0Q2hhbm5lbENvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJpbmdWYWxCYWNrLCBjaGFubmVsTWFza0JhY2spKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsQmFjayA8PCAiXCIgZmFpbGVkIChhcyBvdXRwdXQgY2hhbm5lbCBtYXNrKSI7CisgICAgICAgICAgICBFWFBFQ1RfRVEoY2hhbm5lbE1hc2ssIGNoYW5uZWxNYXNrQmFjayk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyaW5nVmFsLmZpbmQoIl9DSEFOTkVMX0lOREVYXyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShDaGFubmVsSW5kZXhDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBjaGFubmVsTWFzaykpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIGZhaWxlZCAoYXMgaW5kZXhlZCBjaGFubmVsIG1hc2spIjsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKENoYW5uZWxJbmRleENvbnZlcnRlcjo6dG9TdHJpbmcoY2hhbm5lbE1hc2ssIHN0cmluZ1ZhbEJhY2spKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBpbmRleGVkIGNoYW5uZWwgbWFzayAiIDw8IGNoYW5uZWxNYXNrIDw8ICIgZmFpbGVkIjsKKyAgICAgICAgICAgIEVYUEVDVF9FUShzdHJpbmdWYWwsIHN0cmluZ1ZhbEJhY2spOworICAgICAgICB9IGVsc2UgaWYgKHN0cmluZ1ZhbCA9PSB0b1N0cmluZyh4c2Q6OkF1ZGlvQ2hhbm5lbE1hc2s6OkFVRElPX0NIQU5ORUxfTk9ORSkpIHsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShJbnB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBjaGFubmVsTWFzaykpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIHN1Y2NlZWRlZCAoYXMgaW5wdXQgY2hhbm5lbCBtYXNrKSI7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoT3V0cHV0Q2hhbm5lbENvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJpbmdWYWwsIGNoYW5uZWxNYXNrKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgXCIiIDw8IHN0cmluZ1ZhbCA8PCAiXCIgc3VjY2VlZGVkIChhcyBvdXRwdXQgY2hhbm5lbCBtYXNrKSI7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoQ2hhbm5lbEluZGV4Q29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmluZ1ZhbCwgY2hhbm5lbE1hc2spKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBzdWNjZWVkZWQgKGFzIGluZGV4IGNoYW5uZWwgbWFzaykiOworICAgICAgICAgICAgLy8gTm9uZSBvZiBDb252ZXJ0ZXJzIGNvdWxkIHBhcnNlIHRoaXMgYmVjYXVzZSAnTk9ORScgaXNuJ3QgYSAndmFsaWQnIGNoYW5uZWwgbWFzay4KKyAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgICAgICAgICAgLy8gSG93ZXZlciB0aGV5IGFsbCBtdXN0IHN1Y2NlZWQgaW4gY29udmVydGluZyBpdCBiYWNrLgorICAgICAgICAgICAgRVhQRUNUX1RSVUUoSW5wdXRDaGFubmVsQ29udmVydGVyOjp0b1N0cmluZyhjaGFubmVsTWFzaywgc3RyaW5nVmFsQmFjaykpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIGlucHV0IGNoYW5uZWwgbWFzayAiIDw8IGNoYW5uZWxNYXNrIDw8ICIgZmFpbGVkIjsKKyAgICAgICAgICAgIEVYUEVDVF9FUShzdHJpbmdWYWwsIHN0cmluZ1ZhbEJhY2spOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoT3V0cHV0Q2hhbm5lbENvbnZlcnRlcjo6dG9TdHJpbmcoY2hhbm5lbE1hc2ssIHN0cmluZ1ZhbEJhY2spKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBvdXRwdXQgY2hhbm5lbCBtYXNrICIgPDwgY2hhbm5lbE1hc2sgPDwgIiBmYWlsZWQiOworICAgICAgICAgICAgRVhQRUNUX0VRKHN0cmluZ1ZhbCwgc3RyaW5nVmFsQmFjayk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShDaGFubmVsSW5kZXhDb252ZXJ0ZXI6OnRvU3RyaW5nKGNoYW5uZWxNYXNrLCBzdHJpbmdWYWxCYWNrKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgaW5kZXhlZCBjaGFubmVsIG1hc2sgIiA8PCBjaGFubmVsTWFzayA8PCAiIGZhaWxlZCI7CisgICAgICAgICAgICBFWFBFQ1RfRVEoc3RyaW5nVmFsLCBzdHJpbmdWYWxCYWNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZBSUwoKSA8PCAiVW5yZWNvZ25pemVkIGNoYW5uZWwgbWFzayBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1QoVHlwZUNvbnZlcnRlciwgUGFyc2VDb250ZW50VHlwZXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZW51bVZhbCA6IHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvQ29udGVudFR5cGU+e30pIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RyaW5nVmFsID0gdG9TdHJpbmcoZW51bVZhbCk7CisgICAgICAgIGF1ZGlvX2NvbnRlbnRfdHlwZV90IGNvbnRlbnRUeXBlOworICAgICAgICBFWFBFQ1RfVFJVRShBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmluZ1ZhbCwgY29udGVudFR5cGUpKQorICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIGZhaWxlZCI7CisgICAgICAgIEVYUEVDVF9FUShzdHJpbmdWYWwsIHRvU3RyaW5nKGNvbnRlbnRUeXBlKSk7CisgICAgfQorfQorCitURVNUKFR5cGVDb252ZXJ0ZXIsIFBhcnNlRGV2aWNlcykgeworICAgIGZvciAoY29uc3QgYXV0byBlbnVtVmFsIDogeHNkY19lbnVtX3JhbmdlPHhzZDo6QXVkaW9EZXZpY2U+e30pIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RyaW5nVmFsID0gdG9TdHJpbmcoZW51bVZhbCk7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGRldmljZUJhY2s7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbEJhY2s7CisgICAgICAgIEVYUEVDVF9UUlVFKERldmljZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJpbmdWYWwsIGRldmljZSkpCisgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgXCIiIDw8IHN0cmluZ1ZhbCA8PCAiXCIgZmFpbGVkIjsKKyAgICAgICAgaWYgKGVudW1WYWwgIT0geHNkOjpBdWRpb0RldmljZTo6QVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKGF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpIHx8IGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkRldmljZSBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBpcyBuZWl0aGVyIGlucHV0LCBub3Igb3V0cHV0IGRldmljZSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gRHVlIHRvIGFsaWFzZWQgdmFsdWVzLCB0aGUgcmVzdWx0IG9mICd0b1N0cmluZycgbWlnaHQgbm90IGJlIHRoZSBzYW1lCisgICAgICAgIC8vIGFzICdzdHJpbmdWYWwnLCB0aHVzIHdlIG5lZWQgdG8gY29tcGFyZSB0aGUgcmVzdWx0cyBvZiBwYXJzaW5nIGluc3RlYWQuCisgICAgICAgIHN0cmluZ1ZhbEJhY2sgPSB0b1N0cmluZyhkZXZpY2UpOworICAgICAgICBFWFBFQ1RfVFJVRShEZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsQmFjaywgZGV2aWNlQmFjaykpCisgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgXCIiIDw8IHN0cmluZ1ZhbEJhY2sgPDwgIlwiIGZhaWxlZCI7CisgICAgICAgIEVYUEVDVF9FUShkZXZpY2UsIGRldmljZUJhY2spOworICAgIH0KK30KKworVEVTVChUeXBlQ29udmVydGVyLCBQYXJzZUluT3V0RGV2aWNlcykgeworICAgIGZvciAoY29uc3QgYXV0byBlbnVtVmFsIDogeHNkY19lbnVtX3JhbmdlPHhzZDo6QXVkaW9EZXZpY2U+e30pIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RyaW5nVmFsID0gdG9TdHJpbmcoZW51bVZhbCk7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGRldmljZUJhY2s7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbEJhY2s7CisgICAgICAgIGlmIChzdHJpbmdWYWwuZmluZCgiX0RFVklDRV9JTl8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoSW5wdXREZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBkZXZpY2UpKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBmYWlsZWQgKGFzIGlucHV0IGRldmljZSkiOworICAgICAgICAgICAgLy8gRHVlIHRvIGFsaWFzZWQgdmFsdWVzLCB0aGUgcmVzdWx0IG9mICd0b1N0cmluZycgbWlnaHQgbm90IGJlIHRoZSBzYW1lCisgICAgICAgICAgICAvLyBhcyAnc3RyaW5nVmFsJywgdGh1cyB3ZSBuZWVkIHRvIGNvbXBhcmUgdGhlIHJlc3VsdHMgb2YgcGFyc2luZyBpbnN0ZWFkLgorICAgICAgICAgICAgc3RyaW5nVmFsQmFjayA9IHRvU3RyaW5nKGRldmljZSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShJbnB1dERldmljZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJpbmdWYWxCYWNrLCBkZXZpY2VCYWNrKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgXCIiIDw8IHN0cmluZ1ZhbEJhY2sgPDwgIlwiIGZhaWxlZCI7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZGV2aWNlLCBkZXZpY2VCYWNrKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJpbmdWYWwuZmluZCgiX0RFVklDRV9PVVRfIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKE91dHB1dERldmljZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJpbmdWYWwsIGRldmljZSkpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIGZhaWxlZCAoYXMgb3V0cHV0IGRldmljZSkiOworICAgICAgICAgICAgc3RyaW5nVmFsQmFjayA9IHRvU3RyaW5nKGRldmljZSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsQmFjaywgZGV2aWNlQmFjaykpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWxCYWNrIDw8ICJcIiBmYWlsZWQiOworICAgICAgICAgICAgRVhQRUNUX0VRKGRldmljZSwgZGV2aWNlQmFjayk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyaW5nVmFsID09IHRvU3RyaW5nKHhzZDo6QXVkaW9EZXZpY2U6OkFVRElPX0RFVklDRV9OT05FKSkgeworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKElucHV0RGV2aWNlQ29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmluZ1ZhbCwgZGV2aWNlKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgXCIiIDw8IHN0cmluZ1ZhbCA8PCAiXCIgc3VjY2VlZGVkIChhcyBpbnB1dCBkZXZpY2UpIjsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBkZXZpY2UpKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBzdWNjZWVkZWQgKGFzIG91dHB1dCBkZXZpY2UpIjsKKyAgICAgICAgICAgIEVYUEVDVF9FUShzdHJpbmdWYWwsIHRvU3RyaW5nKGRldmljZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRkFJTCgpIDw8ICJVbnJlY29nbml6ZWQgYXVkaW8gZGV2aWNlIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIjsKKyAgICAgICAgfQorICAgIH0KK30KKworVEVTVChUeXBlQ29udmVydGVyLCBQYXJzZUluT3V0RmxhZ3MpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZW51bVZhbCA6IHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvSW5PdXRGbGFnPnt9KSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbCA9IHRvU3RyaW5nKGVudW1WYWwpOworICAgICAgICBpZiAoc3RyaW5nVmFsLmZpbmQoIl9JTlBVVF9GTEFHXyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWc7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShJbnB1dEZsYWdDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBmbGFnKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgXCIiIDw8IHN0cmluZ1ZhbCA8PCAiXCIgZmFpbGVkIChhcyBpbnB1dCBmbGFnKSI7CisgICAgICAgICAgICBFWFBFQ1RfRVEoc3RyaW5nVmFsLCB0b1N0cmluZyhmbGFnKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFnOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoT3V0cHV0RmxhZ0NvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJpbmdWYWwsIGZsYWcpKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBmYWlsZWQgKGFzIG91dHB1dCBmbGFnKSI7CisgICAgICAgICAgICBFWFBFQ1RfRVEoc3RyaW5nVmFsLCB0b1N0cmluZyhmbGFnKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1QoVHlwZUNvbnZlcnRlciwgUGFyc2VGb3JtYXRzKSB7CisgICAgZm9yIChjb25zdCBhdXRvIGVudW1WYWwgOiB4c2RjX2VudW1fcmFuZ2U8eHNkOjpBdWRpb0Zvcm1hdD57fSkgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBzdHJpbmdWYWwgPSB0b1N0cmluZyhlbnVtVmFsKTsKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0OworICAgICAgICBFWFBFQ1RfVFJVRShGb3JtYXRDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBmb3JtYXQpKQorICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIGZhaWxlZCI7CisgICAgICAgIEVYUEVDVF9FUShlbnVtVmFsICE9IHhzZDo6QXVkaW9Gb3JtYXQ6OkFVRElPX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgICAgIGF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpKQorICAgICAgICAgICAgICAgIDw8ICJWYWxpZGl0eSBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBpcyBub3QgYXMgZXhwZWN0ZWQiOworICAgICAgICBFWFBFQ1RfRVEoc3RyaW5nVmFsLCB0b1N0cmluZyhmb3JtYXQpKTsKKyAgICB9Cit9CisKK1RFU1QoVHlwZUNvbnZlcnRlciwgUGFyc2VHYWluTW9kZXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZW51bVZhbCA6IHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvR2Fpbk1vZGU+e30pIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RyaW5nVmFsID0gdG9TdHJpbmcoZW51bVZhbCk7CisgICAgICAgIGF1ZGlvX2dhaW5fbW9kZV90IGdhaW5Nb2RlOworICAgICAgICBFWFBFQ1RfVFJVRShHYWluTW9kZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJpbmdWYWwsIGdhaW5Nb2RlKSkKKyAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBmYWlsZWQiOworICAgICAgICBFWFBFQ1RfRVEoc3RyaW5nVmFsLCB0b1N0cmluZyhnYWluTW9kZSkpOworICAgIH0KK30KKworVEVTVChUeXBlQ29udmVydGVyLCBQYXJzZVNvdXJjZXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZW51bVZhbCA6IHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvU291cmNlPnt9KSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbCA9IHRvU3RyaW5nKGVudW1WYWwpOworICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2U7CisgICAgICAgIEVYUEVDVF9UUlVFKFNvdXJjZVR5cGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBzb3VyY2UpKQorICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIGZhaWxlZCI7CisgICAgICAgIEVYUEVDVF9FUShzb3VyY2UgIT0gQVVESU9fU09VUkNFX0RFRkFVTFQsIGF1ZGlvX2lzX3ZhbGlkX2F1ZGlvX3NvdXJjZShzb3VyY2UpKQorICAgICAgICAgICAgICAgIDw8ICJWYWxpZGl0eSBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBpcyBub3QgYXMgZXhwZWN0ZWQiOworICAgICAgICBFWFBFQ1RfRVEoc3RyaW5nVmFsLCB0b1N0cmluZyhzb3VyY2UpKTsKKyAgICB9Cit9CisKK1RFU1QoVHlwZUNvbnZlcnRlciwgUGFyc2VTdHJlYW1UeXBlcykgeworICAgIGZvciAoY29uc3QgYXV0byBlbnVtVmFsIDogeHNkY19lbnVtX3JhbmdlPHhzZDo6QXVkaW9TdHJlYW1UeXBlPnt9KSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbCA9IHRvU3RyaW5nKGVudW1WYWwpOworICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGU7CisgICAgICAgIEVYUEVDVF9UUlVFKFN0cmVhbVR5cGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBzdHJlYW1UeXBlKSkKKyAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBmYWlsZWQiOworICAgICAgICBFWFBFQ1RfRVEoc3RyaW5nVmFsLCB0b1N0cmluZyhzdHJlYW1UeXBlKSk7CisgICAgfQorfQorCitURVNUKFR5cGVDb252ZXJ0ZXIsIFBhcnNlVXNhZ2VzKSB7CisgICAgZm9yIChjb25zdCBhdXRvIGVudW1WYWwgOiB4c2RjX2VudW1fcmFuZ2U8eHNkOjpBdWRpb1VzYWdlPnt9KSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbCA9IHRvU3RyaW5nKGVudW1WYWwpOworICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlOworICAgICAgICBFWFBFQ1RfVFJVRShVc2FnZVR5cGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCB1c2FnZSkpCisgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgXCIiIDw8IHN0cmluZ1ZhbCA8PCAiXCIgZmFpbGVkIjsKKyAgICAgICAgRVhQRUNUX0VRKHN0cmluZ1ZhbCwgdG9TdHJpbmcodXNhZ2UpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwCmluZGV4IGE2M2I4YjQuLjM4NDNlNzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwCkBAIC0xLDkgKzEsMTggQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9oZWFkZXJzIHsKICAgICBuYW1lOiAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWFtZXRyaWNzIiwKIAogICAgIHNyY3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhTWV0cmljc0NvbnN0YW50cy5oIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFNZXRyaWNzQ29uc3RhbnRzLmgKaW5kZXggODQzODhjOS4uNjc0ZGYxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFNZXRyaWNzQ29uc3RhbnRzLmgKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFNZXRyaWNzQ29uc3RhbnRzLmgKQEAgLTEzOSw2ICsxMzksNyBAQAogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfU0VTU0lPTklEICAgICAgInNlc3Npb25JZCIgICAgICAvLyBpbnQzMgogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfU0hBUklOR01PREUgICAgInNoYXJpbmdNb2RlIiAgICAvLyBzdHJpbmcgdmFsdWUsICJleGNsdXNpdmUiLCBzaGFyZWQiCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9TT1VSQ0UgICAgICAgICAic291cmNlIiAgICAgICAgIC8vIHN0cmluZyAoQXVkaW9BdHRyaWJ1dGVzKQorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfU1RBUlRUSFJFU0hPTERGUkFNRVMgInN0YXJ0VGhyZXNob2xkRnJhbWVzIiAvLyBpbnQzMiAoQXVkaW9UcmFjaykKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX1NUQVJUVVBNUyAgICAgICJzdGFydHVwTXMiICAgICAgLy8gZG91YmxlIHZhbHVlCiAvLyBTdGF0ZSBpcyAiQUNUSVZFIiBvciAiU1RPUFBFRCIgZm9yIEF1ZGlvUmVjb3JkCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFURSAgICAgICAgICAic3RhdGUiICAgICAgICAgIC8vIHN0cmluZwpAQCAtMTgxLDYgKzE4Miw3IEBACiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9TRVRNT0RFICAgICJzZXRNb2RlIiAvLyBBdWRpb0ZsaW5nZXIKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX1NFVEJVRkZFUlNJWkUgICAgInNldEJ1ZmZlclNpemUiIC8vIEF1ZGlvVHJhY2sKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX1NFVFBMQVlCQUNLUEFSQU0gInNldFBsYXliYWNrUGFyYW0iIC8vIEF1ZGlvVHJhY2sKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX1NFVFNUQVJUVEhSRVNIT0xEICJzZXRTdGFydFRocmVzaG9sZCIgLy8gQXVkaW9UcmFjawogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfU0VUVk9JQ0VWT0xVTUUgICAic2V0Vm9pY2VWb2x1bWUiIC8vIEF1ZGlvRmxpbmdlcgogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfU0VUVk9MVU1FICAic2V0Vm9sdW1lIiAgLy8gQXVkaW9UcmFjawogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfU1RBUlQgICAgICAic3RhcnQiICAvLyBBdWRpb1RyYWNrLCBBdWRpb1JlY29yZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icAppbmRleCA1MzAxZjVjLi5jNWQzYzFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icApAQCAtMSw0ICsxLDIzIEBACi1jY19saWJyYXJ5X3NoYXJlZCB7CitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlibWVkaWFwbGF5ZXJzZXJ2aWNlX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhcGxheWVyc2VydmljZV9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5IHsKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkFjdGl2aXR5TWFuYWdlci5jcHAiLApAQCAtMTYsNiArMzUsOCBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKICAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYWN0aXZpdHltYW5hZ2VyX2FpZGwiLAorICAgICAgICAibGliYW5kcm9pZF9uZXQiLAogICAgICAgICAibGliYXVkaW9jbGllbnQiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLApAQCAtNzYsNCArOTcsMyBAQAogICAgIH0sCiAKIH0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCAwMTZmNjIyLi43Y2RhMmZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtMTA2Myw2ICsxMDYzLDE3IEBACiAgICAgcmV0dXJuIG1TdGF0dXMgPSBzZXREYXRhU291cmNlX3Bvc3QocCwgcC0+c2V0RGF0YVNvdXJjZShkYXRhU291cmNlKSk7CiB9CiAKK3N0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpzZXREYXRhU291cmNlKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBydHBQYXJhbXMpIHsKKyAgICBwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlID0gTlVfUExBWUVSOworICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gcCA9IHNldERhdGFTb3VyY2VfcHJlKHBsYXllclR5cGUpOworICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIC8vIG5vdyBzZXQgZGF0YSBzb3VyY2UKKyAgICByZXR1cm4gbVN0YXR1cyA9IHNldERhdGFTb3VyY2VfcG9zdChwLCBwLT5zZXREYXRhU291cmNlKHJ0cFBhcmFtcykpOworfQorCiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpkaXNjb25uZWN0TmF0aXZlV2luZG93X2woKSB7CiAgICAgaWYgKG1Db25uZWN0ZWRXaW5kb3cgIT0gTlVMTCkgewogICAgICAgICBzdGF0dXNfdCBlcnIgPSBuYXRpdmVXaW5kb3dEaXNjb25uZWN0KApAQCAtMTgxMSw4ICsxODIyLDcgQEAKIC8vc3RhdGljCiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OnNldE1pbkJ1ZmZlckNvdW50KCkKIHsKLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgaWYgKHByb3BlcnR5X2dldCgicm8ua2VybmVsLnFlbXUiLCB2YWx1ZSwgMCkpIHsKKyAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInJvLmJvb3QucWVtdSIsIGZhbHNlKSkgewogICAgICAgICBtSXNPbkVtdWxhdG9yID0gdHJ1ZTsKICAgICAgICAgbU1pbkJ1ZmZlckNvdW50ID0gMTI7ICAvLyB0byBwcmV2ZW50IHN5c3RlbWF0aWMgYnVmZmVyIHVuZGVycnVuIGZvciBlbXVsYXRvcgogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCBhN2RlM2YzLi5iMmYxYjliIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCkBAIC0zNzIsNiArMzcyLDcgQEAKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IHNwPElEYXRhU291cmNlPiAmc291cmNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBTdHJpbmc4JiBydHBQYXJhbXMpOwogCiAKICAgICAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiAgICAgc2V0RGF0YVNvdXJjZV9wcmUocGxheWVyX3R5cGUgcGxheWVyVHlwZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKaW5kZXggMWNjMjU1ZC4uOWYxNmEyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcApAQCAtNTkxLDQgKzU5MSwxMyBAQAogICAgIH0KICAgICByZXR1cm4gTk9fSU5JVDsKIH0KKworc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6Z2V0UnRwRGF0YVVzYWdlKHVpbnQ2NF90ICpieXRlcykgeworICAgIEFMT0dWKCJnZXRSdHBEYXRhVXNhZ2UiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1SZWNvcmRlciAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtUmVjb3JkZXItPmdldFJ0cERhdGFVc2FnZShieXRlcyk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCmluZGV4IDEyMjU3ZTUuLmUwNDE4NTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaApAQCAtODYsNiArODYsNyBAQAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgc2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIGdldFJ0cERhdGFVc2FnZSh1aW50NjRfdCAqYnl0ZXMpOwogCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyAgICAgICAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOyAgLy8gZm9yIGFjY2Vzc2luZyBwcml2YXRlIGNvbnN0cnVjdG9yCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKaW5kZXggNzg5Nzk1OS4uZWNiZGY2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcApAQCAtMTcsNiArMTcsOSBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJTdGFnZWZyaWdodFJlY29yZGVyIgogI2luY2x1ZGUgPGludHR5cGVzLmg+CisvLyBUT0RPL3dvcmthcm91bmQ6IGluY2x1ZGluZyBiYXNlIGxvZ2dpbmcgbm93IGFzIGl0IGNvbmZsaWN0cyB3aXRoIEFEZWJ1Zy5oCisvLyBhbmQgaXQgbXVzdCBiZSBpbmNsdWRlZCBmaXJzdC4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiV2VibVdyaXRlci5oIgpAQCAtNDQsNiArNDcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KQEAgLTExNyw2ICsxMjEsMTEgQEAKICAgICAgIG1BdWRpb1NvdXJjZSgoYXVkaW9fc291cmNlX3QpQVVESU9fU09VUkNFX0NOVCksIC8vIGluaXRpYWxpemUgd2l0aCBpbnZhbGlkIHZhbHVlCiAgICAgICBtUHJpdmFjeVNlbnNpdGl2ZShQUklWQUNZX1NFTlNJVElWRV9ERUZBVUxUKSwKICAgICAgIG1WaWRlb1NvdXJjZShWSURFT19TT1VSQ0VfTElTVF9FTkQpLAorICAgICAgbVJUUENWT0V4dE1hcCgtMSksCisgICAgICBtUlRQQ1ZPRGVncmVlcygwKSwKKyAgICAgIG1SVFBTb2NrRHNjcCgwKSwKKyAgICAgIG1SVFBTb2NrTmV0d29yaygwKSwKKyAgICAgIG1MYXN0U2VxTm8oMCksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtU2VsZWN0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKICAgICAgIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQoZmFsc2UpLApAQCAtMTI1LDYgKzEzNCw3IEBACiAKICAgICBBTE9HVigiQ29uc3RydWN0b3IiKTsKIAorICAgIG1NZXRyaWNzSXRlbSA9IE5VTEw7CiAgICAgbUFuYWx5dGljc0RpcnR5ID0gZmFsc2U7CiAgICAgcmVzZXQoKTsKIH0KQEAgLTE5OSwxMCArMjA5LDEyIEBACiB2b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXI6OmZsdXNoQW5kUmVzZXRNZXRyaWNzKGJvb2wgcmVpbml0aWFsaXplKSB7CiAgICAgQUxPR1YoImZsdXNoQW5kUmVzZXRNZXRyaWNzIik7CiAgICAgLy8gZmx1c2ggYW55dGhpbmcgd2UgaGF2ZSwgbWF5YmUgc2V0dXAgYSBuZXcgcmVjb3JkCi0gICAgaWYgKG1BbmFseXRpY3NEaXJ0eSAmJiBtTWV0cmljc0l0ZW0gIT0gTlVMTCkgewotICAgICAgICB1cGRhdGVNZXRyaWNzKCk7Ci0gICAgICAgIGlmIChtTWV0cmljc0l0ZW0tPmNvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICBtTWV0cmljc0l0ZW0tPnNlbGZyZWNvcmQoKTsKKyAgICBpZiAobU1ldHJpY3NJdGVtICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG1BbmFseXRpY3NEaXJ0eSkgeworICAgICAgICAgICAgdXBkYXRlTWV0cmljcygpOworICAgICAgICAgICAgaWYgKG1NZXRyaWNzSXRlbS0+Y291bnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBtTWV0cmljc0l0ZW0tPnNlbGZyZWNvcmQoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBkZWxldGUgbU1ldHJpY3NJdGVtOwogICAgICAgICBtTWV0cmljc0l0ZW0gPSBOVUxMOwpAQCAtNTY3LDYgKzU3OSwzMiBAQAogICAgIC8vIHJhbmdlIHRoYXQgYSBzcGVjaWZpYyBlbmNvZGVyIHN1cHBvcnRzLiBUaGUgbWlzbWF0Y2ggYmV0d2VlbiB0aGUKICAgICAvLyB0aGUgdGFyZ2V0IGFuZCByZXF1ZXN0ZWQgYml0IHJhdGUgd2lsbCBOT1QgYmUgdHJlYXRlZCBhcyBhbiBlcnJvci4KICAgICBtVmlkZW9CaXRSYXRlID0gYml0UmF0ZTsKKworICAgIC8vIEEgbmV3IGJpdHJhdGUoVE1NQlIpIHNob3VsZCBiZSBhcHBsaWVkIG9uIHJ1bnRpbWUgYXMgd2VsbCBpZiBPdXRwdXRGb3JtYXQgaXMgUlRQX0FWUAorICAgIGlmIChtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfUlRQX0FWUCkgeworICAgICAgICAvLyBSZWd1bGFyIEkgZnJhbWVzIG1heSBvdmVybG9hZCB0aGUgbmV0d29yayBzbyB3ZSByZWR1Y2UgdGhlIGJpdHJhdGUgdG8gYWxsb3cKKyAgICAgICAgLy8gbWFyZ2lucyBmb3IgdGhlIEkgZnJhbWUgb3ZlcnJ1bnMuCisgICAgICAgIC8vIFN0aWxsIHNlbmQgcmVxdWVzdGVkIGJpdHJhdGUgKFRNTUJSKSBpbiB0aGUgcmVwbHkgKFRNTUJOKS4KKyAgICAgICAgY29uc3QgZmxvYXQgY29lZmZpY2llbnQgPSAwLjhmOworICAgICAgICBtVmlkZW9CaXRSYXRlID0gKGJpdFJhdGUgKiBjb2VmZmljaWVudCkgLyAxMDAwICogMTAwMDsKKyAgICB9CisgICAgaWYgKG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9SVFBfQVZQICYmIG1TdGFydGVkICYmIG1QYXVzZVN0YXJ0VGltZVVzID09IDApIHsKKyAgICAgICAgbVZpZGVvRW5jb2RlclNvdXJjZS0+c2V0RW5jb2RpbmdCaXRyYXRlKG1WaWRlb0JpdFJhdGUpOworICAgICAgICBBUlRQV3JpdGVyKiBydHBXcml0ZXIgID0gc3RhdGljX2Nhc3Q8QVJUUFdyaXRlcio+KG1Xcml0ZXIuZ2V0KCkpOworICAgICAgICBydHBXcml0ZXItPnNldFRNTUJOSW5mbyhtT3Bwb25lbnRJRCwgYml0UmF0ZSk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVZpZGVvQml0UmF0ZU1vZGUoaW50MzJfdCBiaXRSYXRlTW9kZSkgeworICAgIEFMT0dWKCJzZXRQYXJhbVZpZGVvQml0UmF0ZU1vZGU6ICVkIiwgYml0UmF0ZU1vZGUpOworICAgIC8vIFRPRE86IGNsYXJpZnkgd2hhdCBiaXRyYXRlIG1vZGUgb2YgLTEgaXMgYXMgdGhlc2Ugc3RhcnQgZnJvbSAwCisgICAgaWYgKGJpdFJhdGVNb2RlIDwgLTEpIHsKKyAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIHZpZGVvIGJpdHJhdGUgbW9kZTogJWQiLCBiaXRSYXRlTW9kZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1WaWRlb0JpdFJhdGVNb2RlID0gYml0UmF0ZU1vZGU7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC03NzYsNiArODE0LDEwNSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1SdHBMb2NhbElwKGNvbnN0IFN0cmluZzggJmxvY2FsSXApIHsKKyAgICBBTE9HVigic2V0UGFyYW1WaWRlb0xvY2FsSXA6ICVzIiwgbG9jYWxJcC5zdHJpbmcoKSk7CisKKyAgICBtTG9jYWxJcC5zZXRUbyhsb2NhbElwLnN0cmluZygpKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtUnRwTG9jYWxQb3J0KGludDMyX3QgbG9jYWxQb3J0KSB7CisgICAgQUxPR1YoInNldFBhcmFtVmlkZW9Mb2NhbFBvcnQ6ICVkIiwgbG9jYWxQb3J0KTsKKworICAgIG1Mb2NhbFBvcnQgPSBsb2NhbFBvcnQ7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVJ0cFJlbW90ZUlwKGNvbnN0IFN0cmluZzggJnJlbW90ZUlwKSB7CisgICAgQUxPR1YoInNldFBhcmFtVmlkZW9SZW1vdGVJcDogJXMiLCByZW1vdGVJcC5zdHJpbmcoKSk7CisKKyAgICBtUmVtb3RlSXAuc2V0VG8ocmVtb3RlSXAuc3RyaW5nKCkpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1SdHBSZW1vdGVQb3J0KGludDMyX3QgcmVtb3RlUG9ydCkgeworICAgIEFMT0dWKCJzZXRQYXJhbVZpZGVvUmVtb3RlUG9ydDogJWQiLCByZW1vdGVQb3J0KTsKKworICAgIG1SZW1vdGVQb3J0ID0gcmVtb3RlUG9ydDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtU2VsZklEKGludDMyX3Qgc2VsZklEKSB7CisgICAgQUxPR1YoInNldFBhcmFtU2VsZklEOiAleCIsIHNlbGZJRCk7CisKKyAgICBtU2VsZklEID0gc2VsZklEOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1WaWRlb09wcG9uZW50SUQoaW50MzJfdCBvcHBvbmVudElEKSB7CisgICAgbU9wcG9uZW50SUQgPSBvcHBvbmVudElEOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1QYXlsb2FkVHlwZShpbnQzMl90IHBheWxvYWRUeXBlKSB7CisgICAgQUxPR1YoInNldFBhcmFtUGF5bG9hZFR5cGU6ICVkIiwgcGF5bG9hZFR5cGUpOworCisgICAgbVBheWxvYWRUeXBlID0gcGF5bG9hZFR5cGU7CisKKyAgICBpZiAobVN0YXJ0ZWQgJiYgbU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1JUUF9BVlApIHsKKyAgICAgICAgbVdyaXRlci0+dXBkYXRlUGF5bG9hZFR5cGUobVBheWxvYWRUeXBlKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFJUUENWT0V4dE1hcChpbnQzMl90IGV4dG1hcCkgeworICAgIEFMT0dWKCJzZXRSdHBDdm9FeHRNYXA6ICVkIiwgZXh0bWFwKTsKKworICAgIG1SVFBDVk9FeHRNYXAgPSBleHRtYXA7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRSVFBDVk9EZWdyZWVzKGludDMyX3QgY3ZvRGVncmVlcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisgICAgQUxPR1YoInNldFJ0cEN2b0RlZ3JlZXM6ICVkIiwgY3ZvRGVncmVlcyk7CisKKyAgICBtUlRQQ1ZPRGVncmVlcyA9IGN2b0RlZ3JlZXM7CisKKyAgICBpZiAobVN0YXJ0ZWQgJiYgbU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1JUUF9BVlApIHsKKyAgICAgICAgbVdyaXRlci0+dXBkYXRlQ1ZPRGVncmVlcyhtUlRQQ1ZPRGVncmVlcyk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVJ0cERzY3AoaW50MzJfdCBkc2NwKSB7CisgICAgQUxPR1YoInNldFBhcmFtUnRwRHNjcDogJWQiLCBkc2NwKTsKKworICAgIG1SVFBTb2NrRHNjcCA9IGRzY3A7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRTb2NrZXROZXR3b3JrKGludDY0X3QgbmV0d29ya0hhbmRsZSkgeworICAgIEFMT0dWKCJzZXRTb2NrZXROZXR3b3JrOiAlbGx1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgbmV0d29ya0hhbmRsZSk7CisKKyAgICBtUlRQU29ja05ldHdvcmsgPSBuZXR3b3JrSGFuZGxlOworICAgIGlmIChtU3RhcnRlZCAmJiBtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfUlRQX0FWUCkgeworICAgICAgICBtV3JpdGVyLT51cGRhdGVTb2NrZXROZXR3b3JrKG1SVFBTb2NrTmV0d29yayk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6cmVxdWVzdElEUkZyYW1lKCkgeworICAgIHN0YXR1c190IHJldCA9IEJBRF9WQUxVRTsKKyAgICBpZiAobVZpZGVvRW5jb2RlclNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIHJldCA9IG1WaWRlb0VuY29kZXJTb3VyY2UtPnJlcXVlc3RJRFJGcmFtZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJyZXF1ZXN0SURSRnJhbWU6IEVuY29kZXIgbm90IHJlYWR5Iik7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtZXRlcigKICAgICAgICAgY29uc3QgU3RyaW5nOCAma2V5LCBjb25zdCBTdHJpbmc4ICZ2YWx1ZSkgewogICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXI6IGtleSAoJXMpID0+IHZhbHVlICglcykiLCBrZXkuc3RyaW5nKCksIHZhbHVlLnN0cmluZygpKTsKQEAgLTg0NCw2ICs5ODEsMTEgQEAKICAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZ2aWRlb19iaXRyYXRlKSkgewogICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVmlkZW9FbmNvZGluZ0JpdFJhdGUodmlkZW9fYml0cmF0ZSk7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidmlkZW8tcGFyYW0tYml0cmF0ZS1tb2RlIikgeworICAgICAgICBpbnQzMl90IHZpZGVvX2JpdHJhdGVfbW9kZTsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZ2aWRlb19iaXRyYXRlX21vZGUpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1WaWRlb0JpdFJhdGVNb2RlKHZpZGVvX2JpdHJhdGVfbW9kZSk7CisgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGtleSA9PSAidmlkZW8tcGFyYW0tcm90YXRpb24tYW5nbGUtZGVncmVlcyIpIHsKICAgICAgICAgaW50MzJfdCBkZWdyZWVzOwogICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJmRlZ3JlZXMpKSB7CkBAIC04ODQsNiArMTAyNiw2MSBAQAogICAgICAgICBpZiAoc2FmZV9zdHJ0b2QodmFsdWUuc3RyaW5nKCksICZmcHMpKSB7CiAgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1DYXB0dXJlRnBzKGZwcyk7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLWxvY2FsLWlwIikgeworICAgICAgICByZXR1cm4gc2V0UGFyYW1SdHBMb2NhbElwKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLWxvY2FsLXBvcnQiKSB7CisgICAgICAgIGludDMyX3QgbG9jYWxQb3J0OworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJmxvY2FsUG9ydCkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVJ0cExvY2FsUG9ydChsb2NhbFBvcnQpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1yZW1vdGUtaXAiKSB7CisgICAgICAgIHJldHVybiBzZXRQYXJhbVJ0cFJlbW90ZUlwKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLXJlbW90ZS1wb3J0IikgeworICAgICAgICBpbnQzMl90IHJlbW90ZVBvcnQ7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmcmVtb3RlUG9ydCkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVJ0cFJlbW90ZVBvcnQocmVtb3RlUG9ydCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLXNlbGYtaWQiKSB7CisgICAgICAgIGludDMyX3Qgc2VsZklEOworICAgICAgICBpbnQ2NF90IHRlbXA7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTY0KHZhbHVlLnN0cmluZygpLCAmdGVtcCkpIHsKKyAgICAgICAgICAgIHNlbGZJRCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHRlbXApOworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtU2VsZklEKHNlbGZJRCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLW9wcG9uZW50LWlkIikgeworICAgICAgICBpbnQzMl90IG9wbklkOworICAgICAgICBpbnQ2NF90IHRlbXA7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTY0KHZhbHVlLnN0cmluZygpLCAmdGVtcCkpIHsKKyAgICAgICAgICAgIG9wbklkID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odGVtcCk7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1WaWRlb09wcG9uZW50SUQob3BuSWQpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1wYXlsb2FkLXR5cGUiKSB7CisgICAgICAgIGludDMyX3QgcGF5bG9hZFR5cGU7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmcGF5bG9hZFR5cGUpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1QYXlsb2FkVHlwZShwYXlsb2FkVHlwZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLWV4dC1jdm8tZXh0bWFwIikgeworICAgICAgICBpbnQzMl90IGV4dG1hcDsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZleHRtYXApKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UlRQQ1ZPRXh0TWFwKGV4dG1hcCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLWV4dC1jdm8tZGVncmVlcyIpIHsKKyAgICAgICAgaW50MzJfdCBkZWdyZWVzOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJmRlZ3JlZXMpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UlRQQ1ZPRGVncmVlcyhkZWdyZWVzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJ2aWRlby1wYXJhbS1yZXF1ZXN0LWktZnJhbWUiKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0SURSRnJhbWUoKTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLXNldC1zb2NrZXQtZHNjcCIpIHsKKyAgICAgICAgaW50MzJfdCBkc2NwOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJmRzY3ApKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1SdHBEc2NwKGRzY3ApOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1zZXQtc29ja2V0LW5ldHdvcmsiKSB7CisgICAgICAgIGludDY0X3QgbmV0d29ya0hhbmRsZTsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pNjQodmFsdWUuc3RyaW5nKCksICZuZXR3b3JrSGFuZGxlKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFNvY2tldE5ldHdvcmsobmV0d29ya0hhbmRsZSk7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBBTE9HRSgic2V0UGFyYW1ldGVyOiBmYWlsZWQgdG8gZmluZCBrZXkgJXMiLCBrZXkuc3RyaW5nKCkpOwogICAgIH0KQEAgLTEwNTAsNiArMTI0NywxNyBAQAogICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CiAgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKICAgICAgICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlUaW1lLCBzdGFydFRpbWVVcyk7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2VsZklELCBtU2VsZklEKTsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlQYXlsb2FkVHlwZSwgbVBheWxvYWRUeXBlKTsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlTb2NrZXROZXR3b3JrLCBtUlRQU29ja05ldHdvcmspOworICAgICAgICAgICAgaWYgKG1SVFBDVk9FeHRNYXAgPiAwKSB7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVJ0cEV4dE1hcCwgbVJUUENWT0V4dE1hcCk7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVJ0cEN2b0RlZ3JlZXMsIG1SVFBDVk9EZWdyZWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUlRQU29ja0RzY3AgPiAwKSB7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVJ0cERzY3AsIG1SVFBTb2NrRHNjcCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0YXJ0KG1ldGEuZ2V0KCkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTExMTMsNyArMTMyMSw3IEBACiAgICAgaWYgKG1Qcml2YWN5U2Vuc2l0aXZlID09IFBSSVZBQ1lfU0VOU0lUSVZFX0RFRkFVTFQpIHsKICAgICAgICAgaWYgKGF0dHIuc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OCiAgICAgICAgICAgICAgICAgfHwgYXR0ci5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0NBTUNPUkRFUikgewotICAgICAgICAgICAgYXR0ci5mbGFncyB8PSBBVURJT19GTEFHX0NBUFRVUkVfUFJJVkFURTsKKyAgICAgICAgICAgIGF0dHIuZmxhZ3MgPSBzdGF0aWNfY2FzdDxhdWRpb19mbGFnc19tYXNrX3Q+KGF0dHIuZmxhZ3MgfCBBVURJT19GTEFHX0NBUFRVUkVfUFJJVkFURSk7CiAgICAgICAgICAgICBtUHJpdmFjeVNlbnNpdGl2ZSA9IFBSSVZBQ1lfU0VOU0lUSVZFX0VOQUJMRUQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtUHJpdmFjeVNlbnNpdGl2ZSA9IFBSSVZBQ1lfU0VOU0lUSVZFX0RJU0FCTEVEOwpAQCAtMTEyOSw3ICsxMzM3LDcgQEAKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgICAgIGlmIChtUHJpdmFjeVNlbnNpdGl2ZSA9PSBQUklWQUNZX1NFTlNJVElWRV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICBhdHRyLmZsYWdzIHw9IEFVRElPX0ZMQUdfQ0FQVFVSRV9QUklWQVRFOworICAgICAgICAgICAgYXR0ci5mbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX2ZsYWdzX21hc2tfdD4oYXR0ci5mbGFncyB8IEFVRElPX0ZMQUdfQ0FQVFVSRV9QUklWQVRFKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTMzMCw3ICsxNTM4LDcgQEAKICAgICAgICAgbVZpZGVvRW5jb2RlclNvdXJjZSA9IHNvdXJjZTsKICAgICB9CiAKLSAgICBtV3JpdGVyID0gbmV3IEFSVFBXcml0ZXIobU91dHB1dEZkKTsKKyAgICBtV3JpdGVyID0gbmV3IEFSVFBXcml0ZXIobU91dHB1dEZkLCBtTG9jYWxJcCwgbUxvY2FsUG9ydCwgbVJlbW90ZUlwLCBtUmVtb3RlUG9ydCwgbUxhc3RTZXFObyk7CiAgICAgbVdyaXRlci0+YWRkU291cmNlKHNvdXJjZSk7CiAgICAgbVdyaXRlci0+c2V0TGlzdGVuZXIobUxpc3RlbmVyKTsKIApAQCAtMTc4NCw3ICsxOTkyLDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAobU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1JUUF9BVlApIHsKKyAgICAgICAgLy8gVGhpcyBpbmRpY2F0ZXMgdGhhdCBhIHJhdyBpbWFnZSBwcm92aWRlZCB0byBlbmNvZGVyIG5lZWRzIHRvIGJlIHJvdGF0ZWQuCisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCBtUm90YXRpb25EZWdyZWVzKTsKKyAgICB9CisKICAgICBmb3JtYXQtPnNldEludDMyKCJiaXRyYXRlIiwgbVZpZGVvQml0UmF0ZSk7CisgICAgZm9ybWF0LT5zZXRJbnQzMigiYml0cmF0ZS1tb2RlIiwgbVZpZGVvQml0UmF0ZU1vZGUpOwogICAgIGZvcm1hdC0+c2V0SW50MzIoImZyYW1lLXJhdGUiLCBtRnJhbWVSYXRlKTsKICAgICBmb3JtYXQtPnNldEludDMyKCJpLWZyYW1lLWludGVydmFsIiwgbUlGcmFtZXNJbnRlcnZhbFNlYyk7CiAKQEAgLTIxMzAsNiArMjM0NCw3IEBACiAKICAgICBpZiAobVdyaXRlciAhPSBOVUxMKSB7CiAgICAgICAgIGVyciA9IG1Xcml0ZXItPnN0b3AoKTsKKyAgICAgICAgbUxhc3RTZXFObyA9IG1Xcml0ZXItPmdldFNlcXVlbmNlTnVtKCk7CiAgICAgICAgIG1Xcml0ZXIuY2xlYXIoKTsKICAgICB9CiAKQEAgLTIyMDYsNiArMjQyMSw4IEBACiAgICAgbVZpZGVvSGVpZ2h0ICAgPSAxNDQ7CiAgICAgbUZyYW1lUmF0ZSAgICAgPSAtMTsKICAgICBtVmlkZW9CaXRSYXRlICA9IDE5MjAwMDsKKyAgICAvLyBGb2xsb3dpbmcgTWVkaWFDb2RlYydzIGRlZmF1bHQKKyAgICBtVmlkZW9CaXRSYXRlTW9kZSA9IEJJVFJBVEVfTU9ERV9WQlI7CiAgICAgbVNhbXBsZVJhdGUgICAgPSA4MDAwOwogICAgIG1BdWRpb0NoYW5uZWxzID0gMTsKICAgICBtQXVkaW9CaXRSYXRlICA9IDEyMjAwOwpAQCAtMjM1MSw2ICsyNTY4LDE0IEBACiAgICAgcmV0dXJuIE5PX0lOSVQ7CiB9CiAKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OmdldFJ0cERhdGFVc2FnZSh1aW50NjRfdCAqYnl0ZXMpIHsKKyAgICBpZiAobVdyaXRlciAhPSAwKSB7CisgICAgICAgICpieXRlcyA9IG1Xcml0ZXItPmdldEFjY3VtdWxhdGl2ZUJ5dGVzKCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OmR1bXAoCiAgICAgICAgIGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QgewogICAgIEFMT0dWKCJkdW1wIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAppbmRleCBhNzI1YmVlLi40YmJhODY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKQEAgLTgyLDYgKzgyLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOwogICAgICAgICAgICAgc3RhdHVzX3QgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSdHBEYXRhVXNhZ2UodWludDY0X3QgKmJ5dGVzKTsKIAogcHJpdmF0ZToKIApAQCAtMTE5LDYgKzEyMCw3IEBACiAgICAgaW50MzJfdCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0OwogICAgIGludDMyX3QgbUZyYW1lUmF0ZTsKICAgICBpbnQzMl90IG1WaWRlb0JpdFJhdGU7CisgICAgaW50MzJfdCBtVmlkZW9CaXRSYXRlTW9kZTsKICAgICBpbnQzMl90IG1BdWRpb0JpdFJhdGU7CiAgICAgaW50MzJfdCBtQXVkaW9DaGFubmVsczsKICAgICBpbnQzMl90IG1TYW1wbGVSYXRlOwpAQCAtMTM4LDYgKzE0MCwxOCBAQAogICAgIGludDMyX3QgbUxvbmdpdHVkZXgxMDAwMDsKICAgICBpbnQzMl90IG1TdGFydFRpbWVPZmZzZXRNczsKICAgICBpbnQzMl90IG1Ub3RhbEJpdFJhdGU7CisgICAgU3RyaW5nOCBtTG9jYWxJcDsKKyAgICBTdHJpbmc4IG1SZW1vdGVJcDsKKyAgICBpbnQzMl90IG1Mb2NhbFBvcnQ7CisgICAgaW50MzJfdCBtUmVtb3RlUG9ydDsKKyAgICBpbnQzMl90IG1TZWxmSUQ7CisgICAgaW50MzJfdCBtT3Bwb25lbnRJRDsKKyAgICBpbnQzMl90IG1QYXlsb2FkVHlwZTsKKyAgICBpbnQzMl90IG1SVFBDVk9FeHRNYXA7CisgICAgaW50MzJfdCBtUlRQQ1ZPRGVncmVlczsKKyAgICBpbnQzMl90IG1SVFBTb2NrRHNjcDsKKyAgICBpbnQ2NF90IG1SVFBTb2NrTmV0d29yazsKKyAgICB1aW50MzJfdCBtTGFzdFNlcU5vOwogCiAgICAgaW50NjRfdCBtRHVyYXRpb25SZWNvcmRlZFVzOwogICAgIGludDY0X3QgbVN0YXJ0ZWRSZWNvcmRpbmdVczsKQEAgLTIwNSw2ICsyMTksNyBAQAogICAgIHN0YXR1c190IHNldFBhcmFtQ2FwdHVyZUZwc0VuYWJsZShpbnQzMl90IHRpbWVMYXBzZUVuYWJsZSk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1DYXB0dXJlRnBzKGRvdWJsZSBmcHMpOwogICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9FbmNvZGluZ0JpdFJhdGUoaW50MzJfdCBiaXRSYXRlKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvQml0UmF0ZU1vZGUoaW50MzJfdCBiaXRSYXRlTW9kZSk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb0lGcmFtZXNJbnRlcnZhbChpbnQzMl90IHNlY29uZHMpOwogICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9FbmNvZGVyUHJvZmlsZShpbnQzMl90IHByb2ZpbGUpOwogICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9FbmNvZGVyTGV2ZWwoaW50MzJfdCBsZXZlbCk7CkBAIC0yMTksNiArMjM0LDE4IEBACiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1Nb3ZpZVRpbWVTY2FsZShpbnQzMl90IHRpbWVTY2FsZSk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1HZW9EYXRhTG9uZ2l0dWRlKGludDY0X3QgbG9uZ2l0dWRleDEwMDAwKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbUdlb0RhdGFMYXRpdHVkZShpbnQ2NF90IGxhdGl0dWRleDEwMDAwKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbVJ0cExvY2FsSXAoY29uc3QgU3RyaW5nOCAmbG9jYWxJcCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1SdHBMb2NhbFBvcnQoaW50MzJfdCBsb2NhbFBvcnQpOworICAgIHN0YXR1c190IHNldFBhcmFtUnRwUmVtb3RlSXAoY29uc3QgU3RyaW5nOCAmcmVtb3RlSXApOworICAgIHN0YXR1c190IHNldFBhcmFtUnRwUmVtb3RlUG9ydChpbnQzMl90IHJlbW90ZVBvcnQpOworICAgIHN0YXR1c190IHNldFBhcmFtU2VsZklEKGludDMyX3Qgc2VsZklEKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvT3Bwb25lbnRJRChpbnQzMl90IG9wcG9uZW50SUQpOworICAgIHN0YXR1c190IHNldFBhcmFtUGF5bG9hZFR5cGUoaW50MzJfdCBwYXlsb2FkVHlwZSk7CisgICAgc3RhdHVzX3Qgc2V0UlRQQ1ZPRXh0TWFwKGludDMyX3QgZXh0bWFwKTsKKyAgICBzdGF0dXNfdCBzZXRSVFBDVk9EZWdyZWVzKGludDMyX3QgY3ZvRGVncmVlcyk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1SdHBEc2NwKGludDMyX3QgZHNjcCk7CisgICAgc3RhdHVzX3Qgc2V0U29ja2V0TmV0d29yayhpbnQ2NF90IG5ldHdvcmtIYW5kbGUpOworICAgIHN0YXR1c190IHJlcXVlc3RJRFJGcmFtZSgpOwogICAgIHZvaWQgY2xpcFZpZGVvQml0UmF0ZSgpOwogICAgIHZvaWQgY2xpcFZpZGVvRnJhbWVSYXRlKCk7CiAgICAgdm9pZCBjbGlwVmlkZW9GcmFtZVdpZHRoKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZGF0YXNvdXJjZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2RhdGFzb3VyY2UvQW5kcm9pZC5icAppbmRleCA3MWZhNTBiLi4xOWZjMTcyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZGF0YXNvdXJjZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9kYXRhc291cmNlL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxNCBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlibWVkaWFwbGF5ZXJzZXJ2aWNlX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJtZWRpYXBsYXllcnNlcnZpY2VfbGljZW5zZSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJwbGF5ZXJzZXJ2aWNlX2RhdGFzb3VyY2UiLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvaW5jbHVkZS9NZWRpYVBsYXllckludGVyZmFjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2luY2x1ZGUvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAppbmRleCA0MzZjYjMxLi44ZDk0Njk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvaW5jbHVkZS9NZWRpYVBsYXllckludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9pbmNsdWRlL01lZGlhUGxheWVySW50ZXJmYWNlLmgKQEAgLTYwLDcgKzYwLDcgQEAKICNkZWZpbmUgREVGQVVMVF9BVURJT1NJTktfU0FNUExFUkFURSA0NDEwMAogCiAvLyB3aGVuIHRoZSBjaGFubmVsIG1hc2sgaXNuJ3Qga25vd24sIHVzZSB0aGUgY2hhbm5lbCBjb3VudCB0byBkZXJpdmUgYSBtYXNrIGluIEF1ZGlvU2luazo6b3BlbigpCi0jZGVmaW5lIENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUiAwCisjZGVmaW5lIENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUiBBVURJT19DSEFOTkVMX05PTkUKIAogLy8gZHVyYXRpb24gYmVsb3cgd2hpY2ggd2UgZG8gbm90IGFsbG93IGRlZXAgYXVkaW8gYnVmZmVyaW5nCiAjZGVmaW5lIEFVRElPX1NJTktfTUlOX0RFRVBfQlVGRkVSX0RVUkFUSU9OX1VTIDUwMDAwMDAKQEAgLTE4Myw2ICsxODMsMTAgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZShjb25zdCBTdHJpbmc4JiAvKiBydHBQYXJhbXMgKi8pIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKwogICAgIC8vIHBhc3MgdGhlIGJ1ZmZlcmVkIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgdG8gdGhlIG1lZGlhIHBsYXllciBzZXJ2aWNlCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQuYnAKaW5kZXggMzJjOTdjZi4uNmQzMzhkYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhcGxheWVyc2VydmljZV9udXBsYXllcl9saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJtZWRpYXBsYXllcnNlcnZpY2VfbnVwbGF5ZXJfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeV9zdGF0aWMgewogCiAgICAgc3JjczogWwpAQCAtMTQsNiArMzMsNyBAQAogICAgICAgICAiTnVQbGF5ZXJSZW5kZXJlci5jcHAiLAogICAgICAgICAiTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lci5jcHAiLAogICAgICAgICAiUlRTUFNvdXJjZS5jcHAiLAorICAgICAgICAiUlRQU291cmNlLmNwcCIsCiAgICAgICAgICJTdHJlYW1pbmdTb3VyY2UuY3BwIiwKICAgICBdLAogCkBAIC0zMCw2ICs1MCw3IEBACiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMiLAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwIiwKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0IiwKKyAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZCIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKaW5kZXggYzFjNGI1NS4uMzg5MjQ5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAiTnVQbGF5ZXJEcml2ZXIuaCIKICNpbmNsdWRlICJOdVBsYXllclJlbmRlcmVyLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXJTb3VyY2UuaCIKKyNpbmNsdWRlICJSVFBTb3VyY2UuaCIKICNpbmNsdWRlICJSVFNQU291cmNlLmgiCiAjaW5jbHVkZSAiU3RyZWFtaW5nU291cmNlLmgiCiAjaW5jbHVkZSAiR2VuZXJpY1NvdXJjZS5oIgpAQCAtMzY4LDYgKzM2OSwxOCBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OnNldERhdGFTb3VyY2VBc3luYyhjb25zdCBTdHJpbmc4JiBydHBQYXJhbXMpIHsKKyAgICBBTE9HRCgic2V0RGF0YVNvdXJjZUFzeW5jIGZvciBSVFAgPSAlcyIsIHJ0cFBhcmFtcy5zdHJpbmcoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldERhdGFTb3VyY2UsIHRoaXMpOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNvdXJjZU5vdGlmeSwgdGhpcyk7CisgICAgc3A8U291cmNlPiBzb3VyY2UgPSBuZXcgUlRQU291cmNlKG5vdGlmeSwgcnRwUGFyYW1zKTsKKworICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOworICAgIG1zZy0+cG9zdCgpOworICAgIG1EYXRhU291cmNlVHlwZSA9IERBVEFfU09VUkNFX1RZUEVfUlRQOworfQorCiB2b2lkIE51UGxheWVyOjpwcmVwYXJlQXN5bmMoKSB7CiAgICAgQUxPR1YoInByZXBhcmVBc3luYyIpOwogCkBAIC0xNjg5LDYgKzE3MDIsMTIgQEAKICAgICB1cGRhdGVSZWJ1ZmZlcmluZ1RpbWVyKGZhbHNlIC8qIHN0b3BwaW5nICovLCBmYWxzZSAvKiBleGl0aW5nICovKTsKIH0KIAordm9pZCBOdVBsYXllcjo6c2V0VGFyZ2V0Qml0cmF0ZShpbnQgYml0cmF0ZSkgeworICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgbVNvdXJjZS0+c2V0VGFyZ2V0Qml0cmF0ZShiaXRyYXRlKTsKKyAgICB9Cit9CisKIHZvaWQgTnVQbGF5ZXI6Om9uUGF1c2UoKSB7CiAKICAgICB1cGRhdGVQbGF5YmFja1RpbWVyKHRydWUgLyogc3RvcHBpbmcgKi8sICJvblBhdXNlIik7CkBAIC0xOTE1LDYgKzE5MzQsMTEgQEAKIAogICAgIGZvcm1hdC0+c2V0SW50MzIoInByaW9yaXR5IiwgMCAvKiByZWFsdGltZSAqLyk7CiAKKyAgICBpZiAobURhdGFTb3VyY2VUeXBlID09IERBVEFfU09VUkNFX1RZUEVfUlRQKSB7CisgICAgICAgIEFMT0dWKCJpbnN0YW50aWF0ZURlY29kZXI6IHNldCBkZWNvZGVyIGVycm9yIGZyZWUgb24gc3RyZWFtIGNvcnJ1cHQuIik7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImNvcnJ1cHQtZnJlZSIsIHRydWUpOworICAgIH0KKwogICAgIGlmICghYXVkaW8pIHsKICAgICAgICAgQVN0cmluZyBtaW1lOwogICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwpAQCAtMjcxNSw2ICsyNzM5LDE0IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgU291cmNlOjprV2hhdElNU1J4Tm90aWNlOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gSU1TUnhOb3RpY2U7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJtZXNzYWdlIiwgJklNU1J4Tm90aWNlKSk7CisgICAgICAgICAgICBzZW5kSU1TUnhOb3RpY2UoSU1TUnhOb3RpY2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CkBAIC0yODE3LDExICsyODQ5LDc1IEBACiAgICAgfQogfQogCit2b2lkIE51UGxheWVyOjpzZW5kSU1TUnhOb3RpY2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IHBheWxvYWRUeXBlOworCisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInBheWxvYWQtdHlwZSIsICZwYXlsb2FkVHlwZSkpOworCisgICAgUGFyY2VsIGluOworICAgIGluLndyaXRlSW50MzIocGF5bG9hZFR5cGUpOworCisgICAgc3dpdGNoIChwYXlsb2FkVHlwZSkgeworICAgICAgICBjYXNlIEFSVFBTb3VyY2U6OlJUQ1BfVFNGQjogICAvLyBSVENQIFRTRkIKKyAgICAgICAgY2FzZSBBUlRQU291cmNlOjpSVENQX1BTRkI6ICAgLy8gUlRDUCBQU0ZCCisgICAgICAgIGNhc2UgQVJUUFNvdXJjZTo6UlRQX0FVVE9ET1dOOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGZlZWRiYWNrVHlwZSwgaWQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmVlZGJhY2stdHlwZSIsICZmZWVkYmFja1R5cGUpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzZW5kZXIiLCAmaWQpKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIoZmVlZGJhY2tUeXBlKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIoaWQpOworICAgICAgICAgICAgaWYgKHBheWxvYWRUeXBlID09IEFSVFBTb3VyY2U6OlJUQ1BfVFNGQikgeworICAgICAgICAgICAgICAgIGludDMyX3QgYml0cmF0ZTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYml0LXJhdGUiLCAmYml0cmF0ZSkpOworICAgICAgICAgICAgICAgIGluLndyaXRlSW50MzIoYml0cmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEFSVFBTb3VyY2U6OlJUUF9RVUFMSVRZOgorICAgICAgICBjYXNlIEFSVFBTb3VyY2U6OlJUUF9RVUFMSVRZX0VNQzoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBmZWVkYmFja1R5cGUsIGJpdHJhdGU7CisgICAgICAgICAgICBpbnQzMl90IGhpZ2hlc3RTZXFOdW0sIGJhc2VTZXFOdW0sIHByZXZFeHBlY3RlZDsKKyAgICAgICAgICAgIGludDMyX3QgbnVtQnVmUmVjdiwgcHJldk51bUJ1ZlJlY3Y7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmVlZGJhY2stdHlwZSIsICZmZWVkYmFja1R5cGUpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJiaXQtcmF0ZSIsICZiaXRyYXRlKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiaGlnaGVzdC1zZXEtbnVtIiwgJmhpZ2hlc3RTZXFOdW0pKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJiYXNlLXNlcS1udW0iLCAmYmFzZVNlcU51bSkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInByZXYtZXhwZWN0ZWQiLCAmcHJldkV4cGVjdGVkKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibnVtLWJ1Zi1yZWN2IiwgJm51bUJ1ZlJlY3YpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJwcmV2LW51bS1idWYtcmVjdiIsICZwcmV2TnVtQnVmUmVjdikpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihmZWVkYmFja1R5cGUpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihiaXRyYXRlKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIoaGlnaGVzdFNlcU51bSk7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKGJhc2VTZXFOdW0pOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihwcmV2RXhwZWN0ZWQpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihudW1CdWZSZWN2KTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIocHJldk51bUJ1ZlJlY3YpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBBUlRQU291cmNlOjpSVFBfQ1ZPOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGN2bzsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJjdm8iLCAmY3ZvKSk7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKGN2byk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9JTVNfUlhfTk9USUNFLCAwLCAwLCAmaW4pOworfQorCiBjb25zdCBjaGFyICpOdVBsYXllcjo6Z2V0RGF0YVNvdXJjZVR5cGUoKSB7CiAgICAgc3dpdGNoIChtRGF0YVNvdXJjZVR5cGUpIHsKICAgICAgICAgY2FzZSBEQVRBX1NPVVJDRV9UWVBFX0hUVFBfTElWRToKICAgICAgICAgICAgIHJldHVybiAiSFRUUExpdmUiOwogCisgICAgICAgIGNhc2UgREFUQV9TT1VSQ0VfVFlQRV9SVFA6CisgICAgICAgICAgICByZXR1cm4gIlJUUCI7CisKICAgICAgICAgY2FzZSBEQVRBX1NPVVJDRV9UWVBFX1JUU1A6CiAgICAgICAgICAgICByZXR1cm4gIlJUU1AiOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5oCmluZGV4IGVmNDM1NGMuLmFkYjcwNzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5oCkBAIC01MSw2ICs1MSw4IEBACiAKICAgICB2b2lkIHNldERhdGFTb3VyY2VBc3luYyhjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKIAorICAgIHZvaWQgc2V0RGF0YVNvdXJjZUFzeW5jKGNvbnN0IFN0cmluZzgmIHJ0cFBhcmFtcyk7CisKICAgICBzdGF0dXNfdCBnZXRCdWZmZXJpbmdTZXR0aW5ncyhCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pOwogICAgIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpOwogCkBAIC0xMDAsNiArMTAyLDggQEAKIAogICAgIHZvaWQgdXBkYXRlSW50ZXJuYWxUaW1lcnMoKTsKIAorICAgIHZvaWQgc2V0VGFyZ2V0Qml0cmF0ZShpbnQgYml0cmF0ZSAvKiBicHMgKi8pOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TnVQbGF5ZXIoKTsKIApAQCAtMTE3LDYgKzEyMSw3IEBACiAgICAgc3RydWN0IEdlbmVyaWNTb3VyY2U7CiAgICAgc3RydWN0IEhUVFBMaXZlU291cmNlOwogICAgIHN0cnVjdCBSZW5kZXJlcjsKKyAgICBzdHJ1Y3QgUlRQU291cmNlOwogICAgIHN0cnVjdCBSVFNQU291cmNlOwogICAgIHN0cnVjdCBTdHJlYW1pbmdTb3VyY2U7CiAgICAgc3RydWN0IEFjdGlvbjsKQEAgLTI1Nyw2ICsyNjIsNyBAQAogICAgIHR5cGVkZWYgZW51bSB7CiAgICAgICAgIERBVEFfU09VUkNFX1RZUEVfTk9ORSwKICAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9IVFRQX0xJVkUsCisgICAgICAgIERBVEFfU09VUkNFX1RZUEVfUlRQLAogICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX1JUU1AsCiAgICAgICAgIERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19VUkwsCiAgICAgICAgIERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19GRCwKQEAgLTMzNCw2ICszNDAsNyBAQAogICAgIHZvaWQgc2VuZFN1YnRpdGxlRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLCBpbnQzMl90IGJhc2VJbmRleCk7CiAgICAgdm9pZCBzZW5kVGltZWRNZXRhRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKICAgICB2b2lkIHNlbmRUaW1lZFRleHREYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIHZvaWQgc2VuZElNU1J4Tm90aWNlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKIAogICAgIHZvaWQgd3JpdGVUcmFja0luZm8oUGFyY2VsKiByZXBseSwgY29uc3Qgc3A8QU1lc3NhZ2U+JiBmb3JtYXQpIGNvbnN0OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCmluZGV4IGY3MzQ0MzkuLjViNjBiYmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCkBAIC03NDYsOSArNzQ2LDE1IEBACiAKICAgICBtT3V0cHV0QnVmZmVycy5lZGl0SXRlbUF0KGluZGV4KSA9IGJ1ZmZlcjsKIAorICAgIGludDY0X3QgZnJhbWVJbmRleDsKKyAgICBib29sIGZyYW1lSW5kZXhGb3VuZCA9IGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoImZyYW1lSW5kZXgiLCAmZnJhbWVJbmRleCk7CisKICAgICBidWZmZXItPnNldFJhbmdlKG9mZnNldCwgc2l6ZSk7CiAgICAgYnVmZmVyLT5tZXRhKCktPmNsZWFyKCk7CiAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgIGlmIChmcmFtZUluZGV4Rm91bmQpIHsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJmcmFtZUluZGV4IiwgZnJhbWVJbmRleCk7CisgICAgfQogCiAgICAgYm9vbCBlb3MgPSBmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKICAgICAvLyB3ZSBkbyBub3QgZXhwZWN0IENPREVDQ09ORklHIG9yIFNZTkNGUkFNRSBmb3IgZGVjb2RlcgpAQCAtMTA1MCw3ICsxMDU2LDcgQEAKICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwogICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CiAKLSAgICAgICAgaW50MzJfdCBlb3MsIGNzZDsKKyAgICAgICAgaW50MzJfdCBlb3MsIGNzZCwgY3ZvOwogICAgICAgICAvLyB3ZSBkbyBub3QgZXhwZWN0IFNZTkNGUkFNRSBmb3IgZGVjb2RlcgogICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZW9zIiwgJmVvcykgJiYgZW9zKSB7CiAgICAgICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CkBAIC0xMDU4LDYgKzEwNjQsMjQgQEAKICAgICAgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0NPREVDQ09ORklHOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImN2byIsIChpbnQzMl90KikmY3ZvKSkgeworICAgICAgICAgICAgQUxPR1YoIlslc10gY3ZvKCVkKSBmb3VuZCBhdCAlbGxkIHVzIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgY3ZvLCAobG9uZyBsb25nKXRpbWVVcyk7CisgICAgICAgICAgICBzd2l0Y2ggKGN2bykgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImN2byIsIE1lZGlhQ29kZWM6OkNWT19ERUdSRUVfMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImN2byIsIE1lZGlhQ29kZWM6OkNWT19ERUdSRUVfOTApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjdm8iLCBNZWRpYUNvZGVjOjpDVk9fREVHUkVFXzE4MCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImN2byIsIE1lZGlhQ29kZWM6OkNWT19ERUdSRUVfMjcwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICAvLyBNb2R1bGFyIERSTQogICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmID0gTlVMTDsKICAgICAgICAgTnVQbGF5ZXJEcm06OkNyeXB0b0luZm8gKmNyeXB0SW5mbyA9IE5VTEw7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcAppbmRleCBkYzE0NGIyLi4yYTUwZmMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKQEAgLTIxOCw2ICsyMTgsMjYgQEAKICAgICByZXR1cm4gbUFzeW5jUmVzdWx0OwogfQogCitzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0RGF0YVNvdXJjZShjb25zdCBTdHJpbmc4JiBydHBQYXJhbXMpIHsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcCkgcnRwIHNvdXJjZSIsIHRoaXMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobVN0YXRlICE9IFNUQVRFX0lETEUpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG1TdGF0ZSA9IFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkc7CisKKyAgICBtUGxheWVyLT5zZXREYXRhU291cmNlQXN5bmMocnRwUGFyYW1zKTsKKworICAgIHdoaWxlIChtU3RhdGUgPT0gU1RBVEVfU0VUX0RBVEFTT1VSQ0VfUEVORElORykgeworICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgIH0KKworICAgIHJldHVybiBtQXN5bmNSZXN1bHQ7Cit9CisKKwogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNldFZpZGVvU3VyZmFjZVRleHR1cmUoCiAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZidWZmZXJQcm9kdWNlcikgewogICAgIEFMT0dWKCJzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKCVwKSIsIHRoaXMpOwpAQCAtNzk3LDcgKzgxNywxMSBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0UGFyYW1ldGVyKAotICAgICAgICBpbnQgLyoga2V5ICovLCBjb25zdCBQYXJjZWwgJiAvKiByZXF1ZXN0ICovKSB7CisgICAgICAgIGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCApIHsKKyAgICBpZiAoa2V5ID09IEtFWV9QQVJBTUVURVJfUlRQX0FUVFJJQlVURVMpIHsKKyAgICAgICAgbVBsYXllci0+c2V0VGFyZ2V0Qml0cmF0ZShyZXF1ZXN0LnJlYWRJbnQzMigpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKaW5kZXggZjRiMTk2OC4uNTVhMGZhZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKQEAgLTQzLDYgKzQzLDggQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiYgZGF0YVNvdXJjZSk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3QgU3RyaW5nOCYgcnRwUGFyYW1zKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlVGV4dHVyZSgKICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZidWZmZXJQcm9kdWNlcik7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAppbmRleCBjMzBmMDQ4Li42YThjNzA4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCkBAIC05MjIsNiArOTIyLDExIEBACiAgICAgICAgICAgICBmaXJzdEVudHJ5ID0gZmFsc2U7CiAgICAgICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwogICAgICAgICAgICAgQ0hFQ0soZW50cnktPm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKKyAgICAgICAgICAgIGlmIChtZWRpYVRpbWVVcyA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZmlsbEF1ZGlvQnVmZmVyOiByZXNldCBuZWdhdGl2ZSBtZWRpYSB0aW1lICUuMmYgc2VjcyB0byB6ZXJvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUaW1lVXMgLyAxRTYpOworICAgICAgICAgICAgICAgIG1lZGlhVGltZVVzID0gMDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJmaWxsQXVkaW9CdWZmZXI6IHJlbmRlcmluZyBhdWRpbyBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsIG1lZGlhVGltZVVzIC8gMUU2KTsKICAgICAgICAgICAgIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWRfbChtZWRpYVRpbWVVcyk7CiAgICAgICAgIH0KQEAgLTE5MjgsMTEgKzE5MzMsMTIgQEAKICAgICBpbnQzMl90IG51bUNoYW5uZWxzOwogICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKSk7CiAKLSAgICBpbnQzMl90IGNoYW5uZWxNYXNrOwotICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoImNoYW5uZWwtbWFzayIsICZjaGFubmVsTWFzaykpIHsKLSAgICAgICAgLy8gc2lnbmFsIHRvIHRoZSBBdWRpb1NpbmsgdG8gZGVyaXZlIHRoZSBtYXNrIGZyb20gY291bnQuCi0gICAgICAgIGNoYW5uZWxNYXNrID0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSOwotICAgIH0KKyAgICBpbnQzMl90IHJhd0NoYW5uZWxNYXNrOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0KKyAgICAgICAgICAgIGZvcm1hdC0+ZmluZEludDMyKCJjaGFubmVsLW1hc2siLCAmcmF3Q2hhbm5lbE1hc2spID8KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHJhd0NoYW5uZWxNYXNrKQorICAgICAgICAgICAgICAgICAgICAvLyBzaWduYWwgdG8gdGhlIEF1ZGlvU2luayB0byBkZXJpdmUgdGhlIG1hc2sgZnJvbSBjb3VudC4KKyAgICAgICAgICAgICAgICAgICAgOiBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVI7CiAKICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CiAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU291cmNlLmgKaW5kZXggZjEzN2M1Mi4uYmY2YjUzOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU291cmNlLmgKQEAgLTU4LDYgKzU4LDcgQEAKICAgICAgICAga1doYXRJbnN0YW50aWF0ZVNlY3VyZURlY29kZXJzLAogICAgICAgICAvLyBNb2R1bGFyIERSTQogICAgICAgICBrV2hhdERybUluZm8sCisgICAgICAgIGtXaGF0SU1TUnhOb3RpY2UsCiAgICAgfTsKIAogICAgIC8vIFRoZSBwcm92aWRlcyBtZXNzYWdlIGlzIHVzZWQgdG8gbm90aWZ5IHRoZSBwbGF5ZXIgYWJvdXQgdmFyaW91cwpAQCAtMTMxLDYgKzEzMiw4IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0T2ZmbG9hZEF1ZGlvKGJvb2wgLyogb2ZmbG9hZCAqLykge30KIAorICAgIHZpcnR1YWwgdm9pZCBzZXRUYXJnZXRCaXRyYXRlKGludDMyX3QpIHt9CisKICAgICAvLyBNb2R1bGFyIERSTQogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZURybSgKICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgLyp1dWlkKi9bMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJi8qZHJtU2Vzc2lvbklkKi8sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRQU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFBTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0M2RmMzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRQU291cmNlLmNwcApAQCAtMCwwICsxLDgwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiUlRQU291cmNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiUlRQU291cmNlLmgiCisKKworCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0IGludDY0X3Qga05lYXJFT1NUaW1lb3V0VXMgPSAyMDAwMDAwbGw7IC8vIDIgc2Vjcworc3RhdGljIGludDMyX3Qga01heEFsbG93ZWRTdGFsZUFjY2Vzc1VuaXRzID0gMjA7CisKK051UGxheWVyOjpSVFBTb3VyY2U6OlJUUFNvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgIGNvbnN0IFN0cmluZzgmIHJ0cFBhcmFtcykKKyAgICA6IFNvdXJjZShub3RpZnkpLAorICAgICAgbVJUUFBhcmFtcyhydHBQYXJhbXMpLAorICAgICAgbUZsYWdzKDApLAorICAgICAgbVN0YXRlKERJU0NPTk5FQ1RFRCksCisgICAgICBtRmluYWxSZXN1bHQoT0spLAorICAgICAgbUJ1ZmZlcmluZyhmYWxzZSksCisgICAgICBtSW5QcmVwYXJhdGlvblBoYXNlKHRydWUpLAorICAgICAgbVJUUENvbm4obmV3IEFSVFBDb25uZWN0aW9uKEFSVFBDb25uZWN0aW9uOjprVmlMVEVDb25uZWN0aW9uKSksCisgICAgICBtRU9TVGltZW91dEF1ZGlvKDApLAorICAgICAgbUVPU1RpbWVvdXRWaWRlbygwKSwKKyAgICAgIG1GaXJzdEFjY2Vzc1VuaXQodHJ1ZSksCisgICAgICBtQWxsVHJhY2tzSGF2ZVRpbWUoZmFsc2UpLAorICAgICAgbU5UUEFuY2hvclVzKC0xKSwKKyAgICAgIG1NZWRpYUFuY2hvclVzKC0xKSwKKyAgICAgIG1MYXN0TWVkaWFUaW1lVXMoLTEpLAorICAgICAgbU51bUFjY2Vzc1VuaXRzUmVjZWl2ZWQoMCksCisgICAgICBtTGFzdENWT1VwZGF0ZWQoLTEpLAorICAgICAgbVJlY2VpdmVkRmlyc3RSVENQUGFja2V0KGZhbHNlKSwKKyAgICAgIG1SZWNlaXZlZEZpcnN0UlRQUGFja2V0KGZhbHNlKSwKKyAgICAgIG1QYXVzaW5nKGZhbHNlKSwKKyAgICAgIG1QYXVzZUdlbmVyYXRpb24oMCkgeworICAgIEFMT0dEKCJSVFBTb3VyY2UgaW5pdGlhbGl6ZWQgd2l0aCBydHBQYXJhbXM9JXMiLCBydHBQYXJhbXMuc3RyaW5nKCkpOworfQorCitOdVBsYXllcjo6UlRQU291cmNlOjp+UlRQU291cmNlKCkgeworICAgIGlmIChtTG9vcGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7CisgICAgICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1SVFBDb25uLT5pZCgpKTsKKyAgICAgICAgbUxvb3Blci0+c3RvcCgpOworICAgIH0KK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6Z2V0QnVmZmVyaW5nU2V0dGluZ3MoCisgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUJ1ZmZlcmluZ1NldHRpbmdzTG9jayk7CisgICAgKmJ1ZmZlcmluZyA9IG1CdWZmZXJpbmdTZXR0aW5nczsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpSVFBTb3VyY2U6OnNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUJ1ZmZlcmluZ1NldHRpbmdzTG9jayk7CisgICAgbUJ1ZmZlcmluZ1NldHRpbmdzID0gYnVmZmVyaW5nOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdVBsYXllcjo6UlRQU291cmNlOjpwcmVwYXJlQXN5bmMoKSB7CisgICAgaWYgKG1Mb29wZXIgPT0gTlVMTCkgeworICAgICAgICBtTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgICAgIG1Mb29wZXItPnNldE5hbWUoInJ0cCIpOworICAgICAgICBtTG9vcGVyLT5zdGFydCgpOworCisgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKKyAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SVFBDb25uKTsKKyAgICB9CisKKyAgICBDSEVDS19FUShtU3RhdGUsIChpbnQpRElTQ09OTkVDVEVEKTsKKyAgICBtU3RhdGUgPSBDT05ORUNUSU5HOworCisgICAgc2V0UGFyYW1ldGVycyhtUlRQUGFyYW1zKTsKKworICAgIFRyYWNrSW5mbyAqaW5mbyA9IE5VTEw7CisgICAgdW5zaWduZWQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7IGkrKykgeworICAgICAgICBpbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdChpKTsKKworICAgICAgICBpZiAoaW5mbyA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgQVN0cmluZyBzZHA7CisgICAgICAgIEFTZXNzaW9uRGVzY3JpcHRpb246OlNEUFN0cmluZ0ZhY3Rvcnkoc2RwLCBpbmZvLT5tTG9jYWxJcCwKKyAgICAgICAgICAgICAgICBpbmZvLT5tSXNBdWRpbywgaW5mby0+bUxvY2FsUG9ydCwgaW5mby0+bVBheWxvYWRUeXBlLCBpbmZvLT5tQVMsIGluZm8tPm1Db2RlY05hbWUsCisgICAgICAgICAgICAgICAgTlVMTCwgaW5mby0+bVdpZHRoLCBpbmZvLT5tSGVpZ2h0LCBpbmZvLT5tQ1ZPRXh0TWFwKTsKKyAgICAgICAgQUxPR0QoIlJUUFNvdXJjZSBTRFAgPT5cbiVzIiwgc2RwLmNfc3RyKCkpOworCisgICAgICAgIHNwPEFTZXNzaW9uRGVzY3JpcHRpb24+IGRlc2MgPSBuZXcgQVNlc3Npb25EZXNjcmlwdGlvbjsKKyAgICAgICAgYm9vbCBpc1ZhbGlkU2RwID0gZGVzYy0+c2V0VG8oc2RwLmNfc3RyKCksIHNkcC5zaXplKCkpOworICAgICAgICBBTE9HVigiUlRQU291cmNlIGlzVmFsaWRTZHAgPT4gJWQiLCBpc1ZhbGlkU2RwKTsKKworICAgICAgICBpbnQgc29ja1J0cCwgc29ja1J0Y3A7CisgICAgICAgIEFSVFBDb25uZWN0aW9uOjpNYWtlUlRQU29ja2V0UGFpcigmc29ja1J0cCwgJnNvY2tSdGNwLCBpbmZvLT5tTG9jYWxJcCwgaW5mby0+bVJlbW90ZUlwLAorICAgICAgICAgICAgICAgIGluZm8tPm1Mb2NhbFBvcnQsIGluZm8tPm1SZW1vdGVQb3J0LCBpbmZvLT5tU29ja2V0TmV0d29yayk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZSgnYWNjdScsIHRoaXMpOworCisgICAgICAgIEFMT0dWKCJSVFBTb3VyY2UgYWRkU3RyZWFtLiB0cmFjay1pbmRleD0lZCIsIGkpOworICAgICAgICBub3RpZnktPnNldFNpemUoInRyYWNrSW5kZXgiLCBpKTsKKyAgICAgICAgLy8gaW5kZXgoaSkgc2hvdWxkIGJlIHN0YXJ0ZWQgZnJvbSAxLiAwIGlzIHJlc2VydmVkIGZvciBbcm9vdF0KKyAgICAgICAgbVJUUENvbm4tPmFkZFN0cmVhbShzb2NrUnRwLCBzb2NrUnRjcCwgZGVzYywgaSArIDEsIG5vdGlmeSwgZmFsc2UpOworICAgICAgICBtUlRQQ29ubi0+c2V0U2VsZklEKGluZm8tPm1TZWxmSUQpOworICAgICAgICBtUlRQQ29ubi0+c2V0SmJUaW1lKAorICAgICAgICAgICAgICAgIChpbmZvLT5tSmJUaW1lTXMgPD0gMzAwMCAmJiBpbmZvLT5tSmJUaW1lTXMgPj0gNDApID8gaW5mby0+bUpiVGltZU1zIDogMzAwKTsKKworICAgICAgICBpbmZvLT5tUlRQU29ja2V0ID0gc29ja1J0cDsKKyAgICAgICAgaW5mby0+bVJUQ1BTb2NrZXQgPSBzb2NrUnRjcDsKKyAgICAgICAgaW5mby0+bUZpcnN0U2VxTnVtSW5TZWdtZW50ID0gMDsKKyAgICAgICAgaW5mby0+bU5ld1NlZ21lbnQgPSB0cnVlOworICAgICAgICBpbmZvLT5tQWxsb3dlZFN0YWxlQWNjZXNzVW5pdHMgPSBrTWF4QWxsb3dlZFN0YWxlQWNjZXNzVW5pdHM7CisgICAgICAgIGluZm8tPm1SVFBBbmNob3IgPSAwOworICAgICAgICBpbmZvLT5tTlRQQW5jaG9yVXMgPSAtMTsKKyAgICAgICAgaW5mby0+bU5vcm1hbFBsYXlUaW1lUlRQID0gMDsKKyAgICAgICAgaW5mby0+bU5vcm1hbFBsYXlUaW1lVXMgPSAwbGw7CisKKyAgICAgICAgLy8gaW5kZXgoaSkgc2hvdWxkIGJlIHN0YXJ0ZWQgZnJvbSAxLiAwIGlzIHJlc2VydmVkIGZvciBbcm9vdF0KKyAgICAgICAgaW5mby0+bVBhY2tldFNvdXJjZSA9IG5ldyBBUGFja2V0U291cmNlKGRlc2MsIGkgKyAxKTsKKworICAgICAgICBpbnQzMl90IHRpbWVTY2FsZTsKKyAgICAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IGdldFRyYWNrRm9ybWF0KGksICZ0aW1lU2NhbGUpOworICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShmb3JtYXQpOworCisgICAgICAgIGlmIChpbmZvLT5tSXNBdWRpbykgeworICAgICAgICAgICAgbUF1ZGlvVHJhY2sgPSBzb3VyY2U7CisgICAgICAgICAgICBpbmZvLT5tVGltZVNjYWxlID0gMTYwMDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVmlkZW9UcmFjayA9IHNvdXJjZTsKKyAgICAgICAgICAgIGluZm8tPm1UaW1lU2NhbGUgPSA5MDAwMDsKKyAgICAgICAgfQorCisgICAgICAgIGluZm8tPm1Tb3VyY2UgPSBzb3VyY2U7CisgICAgICAgIGluZm8tPm1SVFBUaW1lID0gMDsKKyAgICAgICAgaW5mby0+bU5vcm1hbFBsYXl0aW1lVXMgPSAwOworICAgICAgICBpbmZvLT5tTlBUTWFwcGluZ1ZhbGlkID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1JblByZXBhcmF0aW9uUGhhc2UpIHsKKyAgICAgICAgbUluUHJlcGFyYXRpb25QaGFzZSA9IGZhbHNlOworICAgICAgICBub3RpZnlQcmVwYXJlZCgpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6UlRQU291cmNlOjpzdGFydCgpIHsKK30KKwordm9pZCBOdVBsYXllcjo6UlRQU291cmNlOjpwYXVzZSgpIHsKKyAgICBtU3RhdGUgPSBQQVVTRUQ7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6cmVzdW1lKCkgeworICAgIG1TdGF0ZSA9IENPTk5FQ1RJTkc7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6c3RvcCgpIHsKKyAgICBpZiAobUxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERpc2Nvbm5lY3QsIHRoaXMpOworCisgICAgc3A8QU1lc3NhZ2U+IGR1bW15OworICAgIG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJmR1bW15KTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6ZmVlZE1vcmVUU0RhdGEoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1CdWZmZXJpbmdMb2NrKTsKKyAgICByZXR1cm4gbUZpbmFsUmVzdWx0OworfQorCitzcDxNZXRhRGF0YT4gTnVQbGF5ZXI6OlJUUFNvdXJjZTo6Z2V0Rm9ybWF0TWV0YShib29sIGF1ZGlvKSB7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gZ2V0U291cmNlKGF1ZGlvKTsKKworICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gc291cmNlLT5nZXRGb3JtYXQoKTsKK30KKworYm9vbCBOdVBsYXllcjo6UlRQU291cmNlOjpoYXZlU3VmZmljaWVudERhdGFPbkFsbFRyYWNrcygpIHsKKyAgICAvLyBXZSdyZSBnb2luZyB0byBidWZmZXIgYXQgbGVhc3QgMiBzZWNzIHdvcnRoIGRhdGEgb24gYWxsIHRyYWNrcyBiZWZvcmUKKyAgICAvLyBzdGFydGluZyBwbGF5YmFjayAoYm90aCBhdCBzdGFydHVwIGFuZCBhZnRlciBhIHNlZWspLgorCisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01pbkR1cmF0aW9uVXMgPSAyMDAwMDAwbGw7CisKKyAgICBpbnQ2NF90IG1lZGlhRHVyYXRpb25VcyA9IDA7CisgICAgZ2V0RHVyYXRpb24oJm1lZGlhRHVyYXRpb25Vcyk7CisgICAgaWYgKChtQXVkaW9UcmFjayAhPSBOVUxMICYmIG1BdWRpb1RyYWNrLT5pc0ZpbmlzaGVkKG1lZGlhRHVyYXRpb25VcykpCisgICAgICAgICAgICB8fCAobVZpZGVvVHJhY2sgIT0gTlVMTCAmJiBtVmlkZW9UcmFjay0+aXNGaW5pc2hlZChtZWRpYUR1cmF0aW9uVXMpKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgIGlmIChtQXVkaW9UcmFjayAhPSBOVUxMCisgICAgICAgICAgICAmJiAoZHVyYXRpb25VcyA9IG1BdWRpb1RyYWNrLT5nZXRCdWZmZXJlZER1cmF0aW9uVXMoJmVycikpCisgICAgICAgICAgICAgICAgICAgIDwga01pbkR1cmF0aW9uVXMKKyAgICAgICAgICAgICYmIGVyciA9PSBPSykgeworICAgICAgICBBTE9HVigiYXVkaW8gdHJhY2sgZG9lc24ndCBoYXZlIGVub3VnaCBkYXRhIHlldC4gKCUuMmYgc2VjcyBidWZmZXJlZCkiLAorICAgICAgICAgICAgICBkdXJhdGlvblVzIC8gMUU2KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtVmlkZW9UcmFjayAhPSBOVUxMCisgICAgICAgICAgICAmJiAoZHVyYXRpb25VcyA9IG1WaWRlb1RyYWNrLT5nZXRCdWZmZXJlZER1cmF0aW9uVXMoJmVycikpCisgICAgICAgICAgICAgICAgICAgIDwga01pbkR1cmF0aW9uVXMKKyAgICAgICAgICAgICYmIGVyciA9PSBPSykgeworICAgICAgICBBTE9HVigidmlkZW8gdHJhY2sgZG9lc24ndCBoYXZlIGVub3VnaCBkYXRhIHlldC4gKCUuMmYgc2VjcyBidWZmZXJlZCkiLAorICAgICAgICAgICAgICBkdXJhdGlvblVzIC8gMUU2KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6UlRQU291cmNlOjpkZXF1ZXVlQWNjZXNzVW5pdCgKKyAgICAgICAgYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpIHsKKworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IGdldFNvdXJjZShhdWRpbyk7CisKKyAgICBpZiAobVN0YXRlID09IFBBVVNFRCkgeworICAgICAgICBBTE9HVigiLUVXT1VMREJMT0NLIik7CisgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CisgICAgaWYgKCFzb3VyY2UtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CisgICAgICAgIGlmIChmaW5hbFJlc3VsdCA9PSBPSykgeworICAgICAgICAgICAgaW50NjRfdCBtZWRpYUR1cmF0aW9uVXMgPSAwOworICAgICAgICAgICAgZ2V0RHVyYXRpb24oJm1lZGlhRHVyYXRpb25Vcyk7CisgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBvdGhlclNvdXJjZSA9IGdldFNvdXJjZSghYXVkaW8pOworICAgICAgICAgICAgc3RhdHVzX3Qgb3RoZXJGaW5hbFJlc3VsdDsKKworICAgICAgICAgICAgLy8gSWYgb3RoZXIgc291cmNlIGFscmVhZHkgc2lnbmFsZWQgRU9TLCB0aGlzIHNvdXJjZSBzaG91bGQgYWxzbyBzaWduYWwgRU9TCisgICAgICAgICAgICBpZiAob3RoZXJTb3VyY2UgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAhb3RoZXJTb3VyY2UtPmhhc0J1ZmZlckF2YWlsYWJsZSgmb3RoZXJGaW5hbFJlc3VsdCkgJiYKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJGaW5hbFJlc3VsdCA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgc291cmNlLT5zaWduYWxFT1MoRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIHRoaXMgc291cmNlIGhhcyBkZXRlY3RlZCBuZWFyIGVuZCwgZ2l2ZSBpdCBzb21lIHRpbWUgdG8gcmV0cmlldmUgbW9yZQorICAgICAgICAgICAgLy8gZGF0YSBiZWZvcmUgc2lnbmFsaW5nIEVPUworICAgICAgICAgICAgaWYgKHNvdXJjZS0+aXNGaW5pc2hlZChtZWRpYUR1cmF0aW9uVXMpKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBlb3NUaW1lb3V0ID0gYXVkaW8gPyBtRU9TVGltZW91dEF1ZGlvIDogbUVPU1RpbWVvdXRWaWRlbzsKKyAgICAgICAgICAgICAgICBpZiAoZW9zVGltZW91dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNldEVPU1RpbWVvdXQoYXVkaW8sIEFMb29wZXI6OkdldE5vd1VzKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKEFMb29wZXI6OkdldE5vd1VzKCkgLSBlb3NUaW1lb3V0KSA+IGtOZWFyRU9TVGltZW91dFVzKSB7CisgICAgICAgICAgICAgICAgICAgIHNldEVPU1RpbWVvdXQoYXVkaW8sIDApOworICAgICAgICAgICAgICAgICAgICBzb3VyY2UtPnNpZ25hbEVPUyhFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghKG90aGVyU291cmNlICE9IE5VTEwgJiYgb3RoZXJTb3VyY2UtPmlzRmluaXNoZWQobWVkaWFEdXJhdGlvblVzKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgbm90IGVudGVyIGJ1ZmZlcmluZyBtb2RlCisgICAgICAgICAgICAgICAgLy8gaWYgYW55IG9mIHRoZSBzb3VyY2VzIGFscmVhZHkgaGF2ZSBkZXRlY3RlZCBFT1MuCisgICAgICAgICAgICAgICAgLy8gVE9ETzogbmVlZHMgdG8gYmUgY2hlY2tlZCB3aGV0aGVyIGJlbG93IGxpbmUgaXMgbmVlZGVkIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAvLyBzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbmFsUmVzdWx0OworICAgIH0KKworICAgIHNldEVPU1RpbWVvdXQoYXVkaW8sIDApOworCisgICAgZmluYWxSZXN1bHQgPSBzb3VyY2UtPmRlcXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworICAgIGlmIChmaW5hbFJlc3VsdCAhPSBPSykgeworICAgICAgICByZXR1cm4gZmluYWxSZXN1bHQ7CisgICAgfQorCisgICAgaW50MzJfdCBjdm87CisgICAgaWYgKCgqYWNjZXNzVW5pdCkgIT0gTlVMTCAmJiAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPmZpbmRJbnQzMigiY3ZvIiwgJmN2bykgJiYKKyAgICAgICAgICAgIGN2byAhPSBtTGFzdENWT1VwZGF0ZWQpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICBtc2ctPnNldEludDMyKCJwYXlsb2FkLXR5cGUiLCBBUlRQU291cmNlOjpSVFBfQ1ZPKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiY3ZvIiwgY3ZvKTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdElNU1J4Tm90aWNlKTsKKyAgICAgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJtZXNzYWdlIiwgbXNnKTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisKKyAgICAgICAgQUxPR1YoIm5vdGlmeSBjdm8gdXBkYXRlZCAoJWQpLT4oJWQpIHRvIHVwcGVyIGxheWVyIiwgbUxhc3RDVk9VcGRhdGVkLCBjdm8pOworICAgICAgICBtTGFzdENWT1VwZGF0ZWQgPSBjdm87CisgICAgfQorCisgICAgcmV0dXJuIGZpbmFsUmVzdWx0OworfQorCitzcDxBbm90aGVyUGFja2V0U291cmNlPiBOdVBsYXllcjo6UlRQU291cmNlOjpnZXRTb3VyY2UoYm9vbCBhdWRpbykgeworICAgIHJldHVybiBhdWRpbyA/IG1BdWRpb1RyYWNrIDogbVZpZGVvVHJhY2s7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6c2V0RU9TVGltZW91dChib29sIGF1ZGlvLCBpbnQ2NF90IHRpbWVvdXQpIHsKKyAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgbUVPU1RpbWVvdXRBdWRpbyA9IHRpbWVvdXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUVPU1RpbWVvdXRWaWRlbyA9IHRpbWVvdXQ7CisgICAgfQorfQorCitzdGF0dXNfdCBOdVBsYXllcjo6UlRQU291cmNlOjpnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSB7CisgICAgKmR1cmF0aW9uVXMgPSAwbGw7CisKKyAgICBpbnQ2NF90IGF1ZGlvRHVyYXRpb25VczsKKyAgICBpZiAobUF1ZGlvVHJhY2sgIT0gTlVMTAorICAgICAgICAgICAgJiYgbUF1ZGlvVHJhY2stPmdldEZvcm1hdCgpLT5maW5kSW50NjQoCisgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAmYXVkaW9EdXJhdGlvblVzKQorICAgICAgICAgICAgJiYgYXVkaW9EdXJhdGlvblVzID4gKmR1cmF0aW9uVXMpIHsKKyAgICAgICAgKmR1cmF0aW9uVXMgPSBhdWRpb0R1cmF0aW9uVXM7CisgICAgfQorCisgICAgaW50NjRfdCB2aWRlb0R1cmF0aW9uVXM7CisgICAgaWYgKG1WaWRlb1RyYWNrICE9IE5VTEwKKyAgICAgICAgICAgICYmIG1WaWRlb1RyYWNrLT5nZXRGb3JtYXQoKS0+ZmluZEludDY0KAorICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgJnZpZGVvRHVyYXRpb25VcykKKyAgICAgICAgICAgICYmIHZpZGVvRHVyYXRpb25VcyA+ICpkdXJhdGlvblVzKSB7CisgICAgICAgICpkdXJhdGlvblVzID0gdmlkZW9EdXJhdGlvblVzOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6c2Vla1RvKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXJTZWVrTW9kZSBtb2RlKSB7CisgICAgQUxPR1YoIlJUUFNvdXJjZTo6c2Vla1RvPSVkLCBtb2RlPSVkIiwgKGludClzZWVrVGltZVVzLCBtb2RlKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6c2NoZWR1bGVQb2xsQnVmZmVyaW5nKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQb2xsQnVmZmVyaW5nLCB0aGlzKTsKKyAgICBtc2ctPnBvc3Qoa0J1ZmZlcmluZ1BvbGxJbnRlcnZhbFVzKTsgLy8gMSBzZWNvbmQgaW50ZXJ2YWxzCit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6b25Qb2xsQnVmZmVyaW5nKCkgeworICAgIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOworfQorCitib29sIE51UGxheWVyOjpSVFBTb3VyY2U6OmlzUmVhbFRpbWUoKSBjb25zdCB7CisgICAgQUxPR0QoIlJUUFNvdXJjZTo6aXNSZWFsVGltZT0lZCIsIHRydWUpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE51UGxheWVyOjpSVFBTb3VyY2U6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgQUxPR1YoIm9uTWVzc2FnZVJlY2VpdmVkID0lZCIsIG1zZy0+d2hhdCgpKTsKKworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdEFjY2Vzc1VuaXRDb21wbGV0ZToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBDT05ORUNUSU5HKSB7CisgICAgICAgICAgICAgICAgbVN0YXRlID0gQ09OTkVDVEVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQzMl90IHRpbWVVcGRhdGU7CisgICAgICAgICAgICAvLyJ0aW1lLXVwZGF0ZSIgcmFpc2VkIGZyb20gQVJUUENvbm5lY3Rpb246OnBhcnNlU1IoKQorICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJ0aW1lLXVwZGF0ZSIsICZ0aW1lVXBkYXRlKSAmJiB0aW1lVXBkYXRlKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXg7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CisKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBydHBUaW1lOworICAgICAgICAgICAgICAgIHVpbnQ2NF90IG50cFRpbWU7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJ0cC10aW1lIiwgKGludDMyX3QgKikmcnRwVGltZSkpOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJudHAtdGltZSIsIChpbnQ2NF90ICopJm50cFRpbWUpKTsKKworICAgICAgICAgICAgICAgIG9uVGltZVVwZGF0ZSh0cmFja0luZGV4LCBydHBUaW1lLCBudHBUaW1lKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50MzJfdCBmaXJzdFJUQ1A7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImZpcnN0LXJ0Y3AiLCAmZmlyc3RSVENQKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIHdvbid0IGJlIGFuIGFjY2VzcyB1bml0IGhlcmUsIGl0J3MganVzdCBhIG5vdGlmaWNhdGlvbgorICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIGRhdGEgY29tbXVuaWNhdGlvbiB3b3JrZWQgc2luY2Ugd2UgZ290IHRoZSBmaXJzdAorICAgICAgICAgICAgICAgIC8vIHJ0Y3AgcGFja2V0LgorICAgICAgICAgICAgICAgIEFMT0dWKCJmaXJzdC1ydGNwIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDMyX3QgSU1TUnhOb3RpY2U7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInJ0Y3AtZXZlbnQiLCAmSU1TUnhOb3RpY2UpKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBwYXlsb2FkVHlwZSwgZmVlZGJhY2tUeXBlOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJwYXlsb2FkLXR5cGUiLCAmcGF5bG9hZFR5cGUpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmVlZGJhY2stdHlwZSIsICZmZWVkYmFja1R5cGUpKTsKKworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRJTVNSeE5vdGljZSk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJtZXNzYWdlIiwgbXNnKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKworICAgICAgICAgICAgICAgIEFMT0dWKCJJTVNSeE5vdGljZSBcdFx0IHBheWxvYWQgOiAlZCBmZWVkYmFjayA6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkVHlwZSwgZmVlZGJhY2tUeXBlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXg7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKKworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdDsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImFjY2Vzcy11bml0IiwgJmFjY2Vzc1VuaXQpID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDMyX3QgZGFtYWdlZDsKKyAgICAgICAgICAgIGlmIChhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQzMigiZGFtYWdlZCIsICZkYW1hZ2VkKQorICAgICAgICAgICAgICAgICAgICAmJiBkYW1hZ2VkKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImRyb3BwaW5nIGRhbWFnZWQgYWNjZXNzIHVuaXQuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEltcGxpY2l0bHkgYXNzZXJ0IG9uIHZhbGlkIHRyYWNrSW5kZXggaGVyZSwgd2hpY2ggd2UgZW5zdXJlIGJ5CisgICAgICAgICAgICAvLyBuZXZlciByZW1vdmluZyB0cmFja3MuCisgICAgICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpOworCisgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBpbmZvLT5tU291cmNlOworICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcnRwVGltZTsKKyAgICAgICAgICAgICAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQzMigicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CisKKyAgICAgICAgICAgICAgICAvKiBBbm90aGVyUGFja2V0U291cmNlIG1ha2UgYW4gYXNzZXJ0aW9uIGlmIHRoZXJlIGlzIG5vIG50cCBwcm92aWRlZAorICAgICAgICAgICAgICAgICAgIFJUUFNvdXJjZSBzaG91bGQgcHJvdmlkZSBudHBVcyBhbGwgdGhlIHRpbWVzLgorICAgICAgICAgICAgICAgIGlmICghaW5mby0+bU5QVE1hcHBpbmdWYWxpZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgbGl2ZSBzdHJlYW0sIHdlIGRpZG4ndCByZWNlaXZlIGFueSBub3JtYWwKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheXRpbWUgbWFwcGluZy4gV2Ugd29uJ3QgbWFwIHRvIG5wdCB0aW1lLgorICAgICAgICAgICAgICAgICAgICBzb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50NjRfdCBucHRVcyA9CisgICAgICAgICAgICAgICAgICAgICgoZG91YmxlKXJ0cFRpbWUgLSAoZG91YmxlKWluZm8tPm1SVFBUaW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgLyBpbmZvLT5tVGltZVNjYWxlCisgICAgICAgICAgICAgICAgICAgICAgICAqIDEwMDAwMDBsbAorICAgICAgICAgICAgICAgICAgICAgICAgKyBpbmZvLT5tTm9ybWFsUGxheXRpbWVVczsKKworICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgQUxvb3Blcjo6R2V0Tm93VXMoKSk7CisKKyAgICAgICAgICAgICAgICBzb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdERpc2Nvbm5lY3Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KGkpOworCisgICAgICAgICAgICAgICAgaWYgKGluZm8tPm1Jc0F1ZGlvKSB7CisgICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrLT5zaWduYWxFT1MoRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1BdWRpb1RyYWNrIGRpc2Nvbm5lY3RlZCIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrLT5zaWduYWxFT1MoRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1WaWRlb1RyYWNrIGRpc2Nvbm5lY3RlZCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1SVFBDb25uLT5yZW1vdmVTdHJlYW0oaW5mby0+bVJUUFNvY2tldCwgaW5mby0+bVJUQ1BTb2NrZXQpOworICAgICAgICAgICAgICAgIGNsb3NlKGluZm8tPm1SVFBTb2NrZXQpOworICAgICAgICAgICAgICAgIGNsb3NlKGluZm8tPm1SVENQU29ja2V0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVRyYWNrcy5jbGVhcigpOworICAgICAgICAgICAgbUZpcnN0QWNjZXNzVW5pdCA9IHRydWU7CisgICAgICAgICAgICBtQWxsVHJhY2tzSGF2ZVRpbWUgPSBmYWxzZTsKKyAgICAgICAgICAgIG1OVFBBbmNob3JVcyA9IC0xOworICAgICAgICAgICAgbU1lZGlhQW5jaG9yVXMgPSAtMTsKKyAgICAgICAgICAgIG1MYXN0TWVkaWFUaW1lVXMgPSAtMTsKKyAgICAgICAgICAgIG1OdW1BY2Nlc3NVbml0c1JlY2VpdmVkID0gMDsKKyAgICAgICAgICAgIG1SZWNlaXZlZEZpcnN0UlRDUFBhY2tldCA9IGZhbHNlOworICAgICAgICAgICAgbVJlY2VpdmVkRmlyc3RSVFBQYWNrZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1QYXVzaW5nID0gZmFsc2U7CisgICAgICAgICAgICBtUGF1c2VHZW5lcmF0aW9uID0gMDsKKworICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShyZXBseUlEKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFBvbGxCdWZmZXJpbmc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpSVFBTb3VyY2U6OnNldFRhcmdldEJpdHJhdGUoaW50MzJfdCBiaXRyYXRlKSB7CisgICAgbVJUUENvbm4tPnNldFRhcmdldEJpdHJhdGUoYml0cmF0ZSk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6b25UaW1lVXBkYXRlKGludDMyX3QgdHJhY2tJbmRleCwgdWludDMyX3QgcnRwVGltZSwgdWludDY0X3QgbnRwVGltZSkgeworICAgIEFMT0dWKCJvblRpbWVVcGRhdGUgdHJhY2sgJWQsIHJ0cFRpbWUgPSAweCUwOHgsIG50cFRpbWUgPSAlIzAxNmxseCIsCisgICAgICAgICB0cmFja0luZGV4LCBydHBUaW1lLCAobG9uZyBsb25nKW50cFRpbWUpOworCisgICAgLy8gY29udmVydCBudHBUaW1lIGluIFEzMiBzZWNvbmRzIHRvIG1pY3Jvc2Vjb25kcy4gTm90ZTogdGhpcyB3aWxsIG5vdCBsb3NlIHByZWNpc2lvbgorICAgIC8vIGJlY2F1c2UgbnRwVGltZVVzIGlzIGF0IG1vc3QgNTIgYml0cyAoZG91YmxlIGhvbGRzIDUzIGJpdHMpCisgICAgaW50NjRfdCBudHBUaW1lVXMgPSAoaW50NjRfdCkobnRwVGltZSAqIDFFNiAvICgxbGwgPDwgMzIpKTsKKworICAgIFRyYWNrSW5mbyAqdHJhY2sgPSAmbVRyYWNrcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpOworCisgICAgdHJhY2stPm1SVFBBbmNob3IgPSBydHBUaW1lOworICAgIHRyYWNrLT5tTlRQQW5jaG9yVXMgPSBudHBUaW1lVXM7CisKKyAgICBpZiAobU5UUEFuY2hvclVzIDwgMCkgeworICAgICAgICBtTlRQQW5jaG9yVXMgPSBudHBUaW1lVXM7CisgICAgICAgIG1NZWRpYUFuY2hvclVzID0gbUxhc3RNZWRpYVRpbWVVczsKKyAgICB9CisKKyAgICBpZiAoIW1BbGxUcmFja3NIYXZlVGltZSkgeworICAgICAgICBib29sIGFsbFRyYWNrc0hhdmVUaW1lID0gKG1UcmFja3Muc2l6ZSgpID4gMCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgVHJhY2tJbmZvICp0cmFjayA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CisgICAgICAgICAgICBpZiAodHJhY2stPm1OVFBBbmNob3JVcyA8IDApIHsKKyAgICAgICAgICAgICAgICBhbGxUcmFja3NIYXZlVGltZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChhbGxUcmFja3NIYXZlVGltZSkgeworICAgICAgICAgICAgbUFsbFRyYWNrc0hhdmVUaW1lID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dJKCJUaW1lIG5vdyBlc3RhYmxpc2hlZCBmb3IgYWxsIHRyYWNrcy4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUFsbFRyYWNrc0hhdmVUaW1lICYmIGRhdGFSZWNlaXZlZE9uQWxsQ2hhbm5lbHMoKSkgeworICAgICAgICAvLyBUaW1lIGlzIG5vdyBlc3RhYmxpc2hlZCwgbGV0cyBzdGFydCB0aW1lc3RhbXBpbmcgaW1tZWRpYXRlbHkKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBUcmFja0luZm8gKnRyYWNrSW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CisgICAgICAgICAgICB3aGlsZSAoIXRyYWNrSW5mby0+bVBhY2tldHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSAqdHJhY2tJbmZvLT5tUGFja2V0cy5iZWdpbigpOworICAgICAgICAgICAgICAgIHRyYWNrSW5mby0+bVBhY2tldHMuZXJhc2UodHJhY2tJbmZvLT5tUGFja2V0cy5iZWdpbigpKTsKKworICAgICAgICAgICAgICAgIGlmIChhZGRNZWRpYVRpbWVzdGFtcChpLCB0cmFja0luZm8sIGFjY2Vzc1VuaXQpKSB7CisgICAgICAgICAgICAgICAgICAgIHBvc3RRdWV1ZUFjY2Vzc1VuaXQoaSwgYWNjZXNzVW5pdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitib29sIE51UGxheWVyOjpSVFBTb3VyY2U6OmFkZE1lZGlhVGltZXN0YW1wKAorICAgICAgICBpbnQzMl90IHRyYWNrSW5kZXgsIGNvbnN0IFRyYWNrSW5mbyAqdHJhY2ssCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSB7CisKKyAgICB1aW50MzJfdCBydHBUaW1lOworICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDMyKAorICAgICAgICAgICAgICAgICJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKKworICAgIGludDY0X3QgcmVsUnRwVGltZVVzID0KKyAgICAgICAgKCgoaW50NjRfdClydHBUaW1lIC0gKGludDY0X3QpdHJhY2stPm1SVFBBbmNob3IpICogMTAwMDAwMGxsKQorICAgICAgICAvIHRyYWNrLT5tVGltZVNjYWxlOworCisgICAgaW50NjRfdCBudHBUaW1lVXMgPSB0cmFjay0+bU5UUEFuY2hvclVzICsgcmVsUnRwVGltZVVzOworCisgICAgaW50NjRfdCBtZWRpYVRpbWVVcyA9IG1NZWRpYUFuY2hvclVzICsgbnRwVGltZVVzIC0gbU5UUEFuY2hvclVzOworCisgICAgaWYgKG1lZGlhVGltZVVzID4gbUxhc3RNZWRpYVRpbWVVcykgeworICAgICAgICBtTGFzdE1lZGlhVGltZVVzID0gbWVkaWFUaW1lVXM7CisgICAgfQorCisgICAgaWYgKG1lZGlhVGltZVVzIDwgMCkgeworICAgICAgICBBTE9HVigiZHJvcHBpbmcgZWFybHkgYWNjZXNzVW5pdC4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFMT0dWKCJ0cmFjayAlZCBydHBUaW1lPSV1IG1lZGlhVGltZVVzID0gJWxsZCB1cyAoJS4yZiBzZWNzKSIsCisgICAgICAgICAgICB0cmFja0luZGV4LCBydHBUaW1lLCAobG9uZyBsb25nKW1lZGlhVGltZVVzLCBtZWRpYVRpbWVVcyAvIDFFNik7CisKKyAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCBtZWRpYVRpbWVVcyk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBOdVBsYXllcjo6UlRQU291cmNlOjpkYXRhUmVjZWl2ZWRPbkFsbENoYW5uZWxzKCkgeworICAgIFRyYWNrSW5mbyAqdHJhY2s7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHRyYWNrID0gJm1UcmFja3MuZWRpdEl0ZW1BdChpKTsKKyAgICAgICAgaWYgKHRyYWNrLT5tUGFja2V0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6cG9zdFF1ZXVlQWNjZXNzVW5pdCgKKyAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXgsIGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEFjY2Vzc1VuaXQsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEFjY2Vzc1VuaXQpOworICAgIG1zZy0+c2V0U2l6ZSgidHJhY2tJbmRleCIsIHRyYWNrSW5kZXgpOworICAgIG1zZy0+c2V0QnVmZmVyKCJhY2Nlc3NVbml0IiwgYWNjZXNzVW5pdCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6cG9zdFF1ZXVlRU9TKHNpemVfdCB0cmFja0luZGV4LCBzdGF0dXNfdCBmaW5hbFJlc3VsdCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRFT1MsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEVPUyk7CisgICAgbXNnLT5zZXRTaXplKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7CisgICAgbXNnLT5zZXRJbnQzMigiZmluYWxSZXN1bHQiLCBmaW5hbFJlc3VsdCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3NwPE1ldGFEYXRhPiBOdVBsYXllcjo6UlRQU291cmNlOjpnZXRUcmFja0Zvcm1hdChzaXplX3QgaW5kZXgsIGludDMyX3QgKnRpbWVTY2FsZSkgeworICAgIENIRUNLX0dFKGluZGV4LCAwdSk7CisgICAgQ0hFQ0tfTFQoaW5kZXgsIG1UcmFja3Muc2l6ZSgpKTsKKworICAgIGNvbnN0IFRyYWNrSW5mbyAmaW5mbyA9IG1UcmFja3MuaXRlbUF0KGluZGV4KTsKKworICAgICp0aW1lU2NhbGUgPSBpbmZvLm1UaW1lU2NhbGU7CisKKyAgICByZXR1cm4gaW5mby5tUGFja2V0U291cmNlLT5nZXRGb3JtYXQoKTsKK30KKwordm9pZCBOdVBsYXllcjo6UlRQU291cmNlOjpvbkNvbm5lY3RlZCgpIHsKKyAgICBBTE9HVigib25Db25uZWN0ZWQiKTsKKyAgICBtU3RhdGUgPSBDT05ORUNURUQ7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6b25EaXNjb25uZWN0ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpZiAobVN0YXRlID09IERJU0NPTk5FQ1RFRCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmZXJyKSk7CisgICAgQ0hFQ0tfTkUoZXJyLCAoc3RhdHVzX3QpT0spOworCisvLyAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlci0+aWQoKSk7CisvLyAgICBtSGFuZGxlci5jbGVhcigpOworCisgICAgaWYgKG1TdGF0ZSA9PSBDT05ORUNUSU5HKSB7CisgICAgICAgIC8vIFdlJ3JlIHN0aWxsIGluIHRoZSBwcmVwYXJhdGlvbiBwaGFzZSwgc2lnbmFsIHRoYXQgaXQKKyAgICAgICAgLy8gZmFpbGVkLgorICAgICAgICBub3RpZnlQcmVwYXJlZChlcnIpOworICAgIH0KKworICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKKy8vICAgIHNldEVycm9yKGVycik7CisKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6c2V0UGFyYW1ldGVyKGNvbnN0IFN0cmluZzggJmtleSwgY29uc3QgU3RyaW5nOCAmdmFsdWUpIHsKKyAgICBBTE9HVigic2V0UGFyYW1ldGVyOiBrZXkgKCVzKSA9PiB2YWx1ZSAoJXMpIiwga2V5LnN0cmluZygpLCB2YWx1ZS5zdHJpbmcoKSk7CisKKyAgICBib29sIGlzQXVkaW9LZXkgPSBrZXkuY29udGFpbnMoImF1ZGlvIik7CisgICAgVHJhY2tJbmZvICppbmZvID0gTlVMTDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgeworICAgICAgICBpbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdChpKTsKKyAgICAgICAgaWYgKGluZm8gIT0gTlVMTCAmJiBpbmZvLT5tSXNBdWRpbyA9PSBpc0F1ZGlvS2V5KSB7CisgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyOiAlcyB0cmFjayAoJWQpIGZvdW5kIiwgaXNBdWRpb0tleSA/ICJhdWRpbyIgOiAidmlkZW8iICwgaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbmZvID09IE5VTEwpIHsKKyAgICAgICAgVHJhY2tJbmZvIG5ld1RyYWNrSW5mbzsKKyAgICAgICAgbmV3VHJhY2tJbmZvLm1Jc0F1ZGlvID0gaXNBdWRpb0tleTsKKyAgICAgICAgbVRyYWNrcy5wdXNoKG5ld1RyYWNrSW5mbyk7CisgICAgICAgIGluZm8gPSAmbVRyYWNrcy5lZGl0VG9wKCk7CisgICAgICAgIGluZm8tPm1KYlRpbWVNcyA9IDMwMDsKKyAgICB9CisKKyAgICBpZiAoa2V5ID09ICJydHAtcGFyYW0tbWltZS10eXBlIikgeworICAgICAgICBpbmZvLT5tTWltZVR5cGUgPSB2YWx1ZTsKKworICAgICAgICBjb25zdCBjaGFyICptaW1lID0gdmFsdWUuc3RyaW5nKCk7CisgICAgICAgIGNvbnN0IGNoYXIgKmRlbGltaXRlciA9IHN0cmNocihtaW1lLCAnLycpOworICAgICAgICBpbmZvLT5tQ29kZWNOYW1lID0gZGVsaW1pdGVyID8gKGRlbGltaXRlciArIDEpIDogIjxub25lPiI7CisKKyAgICAgICAgQUxPR1YoInJ0cC1wYXJhbS1taW1lLXR5cGU6IG1NaW1lVHlwZSAoJXMpID0+IG1Db2RlY05hbWUgKCVzKSIsCisgICAgICAgICAgICAgICAgaW5mby0+bU1pbWVUeXBlLnN0cmluZygpLCBpbmZvLT5tQ29kZWNOYW1lLnN0cmluZygpKTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidmlkZW8tcGFyYW0tZGVjb2Rlci1wcm9maWxlIikgeworICAgICAgICBpbmZvLT5tQ29kZWNQcm9maWxlID0gYXRvaSh2YWx1ZSk7CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInZpZGVvLXBhcmFtLWRlY29kZXItbGV2ZWwiKSB7CisgICAgICAgIGluZm8tPm1Db2RlY0xldmVsID0gYXRvaSh2YWx1ZSk7CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInZpZGVvLXBhcmFtLXdpZHRoIikgeworICAgICAgICBpbmZvLT5tV2lkdGggPSBhdG9pKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidmlkZW8tcGFyYW0taGVpZ2h0IikgeworICAgICAgICBpbmZvLT5tSGVpZ2h0ID0gYXRvaSh2YWx1ZSk7CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1sb2NhbC1pcCIpIHsKKyAgICAgICAgaW5mby0+bUxvY2FsSXAgPSB2YWx1ZTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLWxvY2FsLXBvcnQiKSB7CisgICAgICAgIGluZm8tPm1Mb2NhbFBvcnQgPSBhdG9pKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLXJlbW90ZS1pcCIpIHsKKyAgICAgICAgaW5mby0+bVJlbW90ZUlwID0gdmFsdWU7CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1yZW1vdGUtcG9ydCIpIHsKKyAgICAgICAgaW5mby0+bVJlbW90ZVBvcnQgPSBhdG9pKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLXBheWxvYWQtdHlwZSIpIHsKKyAgICAgICAgaW5mby0+bVBheWxvYWRUeXBlID0gYXRvaSh2YWx1ZSk7CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1hcyIpIHsKKyAgICAgICAgLy9BUyBtZWFucyBndWFyYW50ZWVkIGJpdCByYXRlIHRoYXQgbmVnb3RpYXRlZCBmcm9tIHNkcC4KKyAgICAgICAgaW5mby0+bUFTID0gYXRvaSh2YWx1ZSk7CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1ydHAtdGltZW91dCIpIHsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLXJ0Y3AtdGltZW91dCIpIHsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLXRpbWUtc2NhbGUiKSB7CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1zZWxmLWlkIikgeworICAgICAgICBpbmZvLT5tU2VsZklEID0gYXRvaSh2YWx1ZSk7CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1leHQtY3ZvLWV4dG1hcCIpIHsKKyAgICAgICAgaW5mby0+bUNWT0V4dE1hcCA9IGF0b2kodmFsdWUpOworICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tc2V0LXNvY2tldC1uZXR3b3JrIikgeworICAgICAgICBpbnQ2NF90IG5ldHdvcmtIYW5kbGUgPSBhdG9sbCh2YWx1ZSk7CisgICAgICAgIHNldFNvY2tldE5ldHdvcmsobmV0d29ya0hhbmRsZSk7CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1qaXR0ZXItYnVmZmVyLXRpbWUiKSB7CisgICAgICAgIGluZm8tPm1KYlRpbWVNcyA9IGF0b2kodmFsdWUpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4ICZwYXJhbXMpIHsKKyAgICBBTE9HVigic2V0UGFyYW1ldGVyczogJXMiLCBwYXJhbXMuc3RyaW5nKCkpOworICAgIGNvbnN0IGNoYXIgKmNwYXJhbXMgPSBwYXJhbXMuc3RyaW5nKCk7CisgICAgY29uc3QgY2hhciAqa2V5X3N0YXJ0ID0gY3BhcmFtczsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmVxdWFsX3BvcyA9IHN0cmNocihrZXlfc3RhcnQsICc9Jyk7CisgICAgICAgIGlmIChlcXVhbF9wb3MgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIlBhcmFtZXRlcnMgJXMgbWlzcyBhIHZhbHVlIiwgY3BhcmFtcyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFN0cmluZzgga2V5KGtleV9zdGFydCwgZXF1YWxfcG9zIC0ga2V5X3N0YXJ0KTsKKyAgICAgICAgVHJpbVN0cmluZygma2V5KTsKKyAgICAgICAgaWYgKGtleS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiUGFyYW1ldGVycyAlcyBjb250YWlucyBhbiBlbXB0eSBrZXkiLCBjcGFyYW1zKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgY2hhciAqdmFsdWVfc3RhcnQgPSBlcXVhbF9wb3MgKyAxOworICAgICAgICBjb25zdCBjaGFyICpzZW1pY29sb25fcG9zID0gc3RyY2hyKHZhbHVlX3N0YXJ0LCAnOycpOworICAgICAgICBTdHJpbmc4IHZhbHVlOworICAgICAgICBpZiAoc2VtaWNvbG9uX3BvcyA9PSBOVUxMKSB7CisgICAgICAgICAgICB2YWx1ZS5zZXRUbyh2YWx1ZV9zdGFydCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWx1ZS5zZXRUbyh2YWx1ZV9zdGFydCwgc2VtaWNvbG9uX3BvcyAtIHZhbHVlX3N0YXJ0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2V0UGFyYW1ldGVyKGtleSwgdmFsdWUpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGlmIChzZW1pY29sb25fcG9zID09IE5VTEwpIHsKKyAgICAgICAgICAgIGJyZWFrOyAgLy8gUmVhY2hlcyB0aGUgZW5kCisgICAgICAgIH0KKyAgICAgICAga2V5X3N0YXJ0ID0gc2VtaWNvbG9uX3BvcyArIDE7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdVBsYXllcjo6UlRQU291cmNlOjpzZXRTb2NrZXROZXR3b3JrKGludDY0X3QgbmV0d29ya0hhbmRsZSkgeworICAgIEFMT0dWKCJzZXRTb2NrZXROZXR3b3JrOiAlbGx1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZyluZXR3b3JrSGFuZGxlKTsKKworICAgIFRyYWNrSW5mbyAqaW5mbyA9IE5VTEw7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KGkpOworCisgICAgICAgIGlmIChpbmZvID09IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpbmZvLT5tU29ja2V0TmV0d29yayA9IG5ldHdvcmtIYW5kbGU7CisgICAgfQorfQorCisvLyBUcmltIGJvdGggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSBnaXZlbiBzdHJpbmcuCisvL3N0YXRpYwordm9pZCBOdVBsYXllcjo6UlRQU291cmNlOjpUcmltU3RyaW5nKFN0cmluZzggKnMpIHsKKyAgICBzaXplX3QgbnVtX2J5dGVzID0gcy0+Ynl0ZXMoKTsKKyAgICBjb25zdCBjaGFyICpkYXRhID0gcy0+c3RyaW5nKCk7CisKKyAgICBzaXplX3QgbGVhZGluZ19zcGFjZSA9IDA7CisgICAgd2hpbGUgKGxlYWRpbmdfc3BhY2UgPCBudW1fYnl0ZXMgJiYgaXNzcGFjZShkYXRhW2xlYWRpbmdfc3BhY2VdKSkgeworICAgICAgICArK2xlYWRpbmdfc3BhY2U7CisgICAgfQorCisgICAgc2l6ZV90IGkgPSBudW1fYnl0ZXM7CisgICAgd2hpbGUgKGkgPiBsZWFkaW5nX3NwYWNlICYmIGlzc3BhY2UoZGF0YVtpIC0gMV0pKSB7CisgICAgICAgIC0taTsKKyAgICB9CisKKyAgICBzLT5zZXRUbyhTdHJpbmc4KCZkYXRhW2xlYWRpbmdfc3BhY2VdLCBpIC0gbGVhZGluZ19zcGFjZSkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUUFNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUUFNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNGY5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRQU291cmNlLmgKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJUUF9TT1VSQ0VfSF8KKworI2RlZmluZSBSVFBfU09VUkNFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKKyNpbmNsdWRlICJBUGFja2V0U291cmNlLmgiCisjaW5jbHVkZSAiQVJUUENvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJBUlRQU291cmNlLmgiCisjaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgIk51UGxheWVyU291cmNlLmgiCisKKworCisKKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTG9vcGVyOworc3RydWN0IEFub3RoZXJQYWNrZXRTb3VyY2U7CisKK3N0cnVjdCBOdVBsYXllcjo6UlRQU291cmNlIDogcHVibGljIE51UGxheWVyOjpTb3VyY2UgeworICAgIFJUUFNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcnRwUGFyYW1zKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyaW5nU2V0dGluZ3MoCisgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKCk7CisgICAgdmlydHVhbCB2b2lkIHN0YXJ0KCk7CisgICAgdmlydHVhbCB2b2lkIHN0b3AoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcGF1c2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzdW1lKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZlZWRNb3JlVFNEYXRhKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25Vcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWVrVG8oCisgICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMsCisgICAgICAgICAgICBNZWRpYVBsYXllclNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllclNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBib29sIGlzUmVhbFRpbWUoKSBjb25zdDsKKworICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgdmlydHVhbCB2b2lkIHNldFRhcmdldEJpdHJhdGUoaW50MzJfdCBiaXRyYXRlKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflJUUFNvdXJjZSgpOworCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0TWV0YShib29sIGF1ZGlvKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRBY2Nlc3NVbml0ID0gJ2FjY1UnLAorICAgICAgICBrV2hhdEFjY2Vzc1VuaXRDb21wbGV0ZSA9ICdhY2N1JywKKyAgICAgICAga1doYXREaXNjb25uZWN0ID0gJ2Rpc2MnLAorICAgICAgICBrV2hhdEVPUyA9ICdlb3MhJywKKyAgICAgICAga1doYXRQb2xsQnVmZmVyaW5nID0gJ3BvbGwnLAorICAgICAgICBrV2hhdFNldEJ1ZmZlcmluZ1NldHRpbmdzID0gJ3NCdVMnLAorICAgIH07CisKKyAgICBjb25zdCBpbnQ2NF90IGtCdWZmZXJpbmdQb2xsSW50ZXJ2YWxVcyA9IDEwMDAwMDBsbDsKKworICAgIGVudW0gU3RhdGUgeworICAgICAgICBESVNDT05ORUNURUQsCisgICAgICAgIENPTk5FQ1RJTkcsCisgICAgICAgIENPTk5FQ1RFRCwKKyAgICAgICAgUEFVU0VELAorICAgIH07CisKKyAgICBzdHJ1Y3QgVHJhY2tJbmZvIHsKKworICAgICAgICAvKiBTRFAgb2YgdHJhY2sgKi8KKyAgICAgICAgYm9vbCBtSXNBdWRpbzsKKyAgICAgICAgaW50MzJfdCBtUGF5bG9hZFR5cGU7CisgICAgICAgIFN0cmluZzggbU1pbWVUeXBlOworICAgICAgICBTdHJpbmc4IG1Db2RlY05hbWU7CisgICAgICAgIGludDMyX3QgbUNvZGVjUHJvZmlsZTsKKyAgICAgICAgaW50MzJfdCBtQ29kZWNMZXZlbDsKKyAgICAgICAgaW50MzJfdCBtV2lkdGg7CisgICAgICAgIGludDMyX3QgbUhlaWdodDsKKyAgICAgICAgU3RyaW5nOCBtTG9jYWxJcDsKKyAgICAgICAgU3RyaW5nOCBtUmVtb3RlSXA7CisgICAgICAgIGludDMyX3QgbUxvY2FsUG9ydDsKKyAgICAgICAgaW50MzJfdCBtUmVtb3RlUG9ydDsKKyAgICAgICAgaW50NjRfdCBtU29ja2V0TmV0d29yazsKKyAgICAgICAgaW50MzJfdCBtVGltZVNjYWxlOworICAgICAgICBpbnQzMl90IG1BUzsKKworICAgICAgICAvKiBSVFAgaml0dGVyIGJ1ZmZlciB0aW1lIGluIG1pbGxpc2Vjb25kcyAqLworICAgICAgICB1aW50MzJfdCBtSmJUaW1lTXM7CisgICAgICAgIC8qIFVuaXF1ZSBJRCBpbmRpY2F0ZXMgaXRzZWxmICovCisgICAgICAgIHVpbnQzMl90IG1TZWxmSUQ7CisgICAgICAgIC8qIGV4dG1hcDo8dmFsdWU+IGZvciBDVk8gd2lsbCBiZSBzZXQgdG8gaGVyZSAqLworICAgICAgICBpbnQzMl90IG1DVk9FeHRNYXA7CisKKyAgICAgICAgLyogYSBjb3B5IG9mIFRyYWNrSW5mbyBpbiBSVFNQU291cmNlICovCisgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG1Tb3VyY2U7CisgICAgICAgIHVpbnQzMl90IG1SVFBUaW1lOworICAgICAgICBpbnQ2NF90IG1Ob3JtYWxQbGF5dGltZVVzOworICAgICAgICBib29sIG1OUFRNYXBwaW5nVmFsaWQ7CisKKyAgICAgICAgLyogYSBjb3B5IG9mIFRyYWNrSW5mbyBpbiBNeUhhbmRsZXIuaCAqLworICAgICAgICBpbnQgbVJUUFNvY2tldDsKKyAgICAgICAgaW50IG1SVENQU29ja2V0OworICAgICAgICB1aW50MzJfdCBtRmlyc3RTZXFOdW1JblNlZ21lbnQ7CisgICAgICAgIGJvb2wgbU5ld1NlZ21lbnQ7CisgICAgICAgIGludDMyX3QgbUFsbG93ZWRTdGFsZUFjY2Vzc1VuaXRzOworICAgICAgICB1aW50MzJfdCBtUlRQQW5jaG9yOworICAgICAgICBpbnQ2NF90IG1OVFBBbmNob3JVczsKKyAgICAgICAgYm9vbCBtRU9TUmVjZWl2ZWQ7CisgICAgICAgIHVpbnQzMl90IG1Ob3JtYWxQbGF5VGltZVJUUDsKKyAgICAgICAgaW50NjRfdCBtTm9ybWFsUGxheVRpbWVVczsKKyAgICAgICAgc3A8QVBhY2tldFNvdXJjZT4gbVBhY2tldFNvdXJjZTsKKyAgICAgICAgTGlzdDxzcDxBQnVmZmVyPj4gbVBhY2tldHM7CisgICAgfTsKKworICAgIGNvbnN0IFN0cmluZzggbVJUUFBhcmFtczsKKyAgICB1aW50MzJfdCBtRmxhZ3M7CisgICAgU3RhdGUgbVN0YXRlOworICAgIHN0YXR1c190IG1GaW5hbFJlc3VsdDsKKworICAgIC8vIGJlbG93IDMgcGFyYW1ldGVycyBuZWVkIHRvIGJlIGNoZWNrZWQgd2hldGhlciBpdCBuZWVkZWQgb3Igbm90LgorICAgIE11dGV4IG1CdWZmZXJpbmdMb2NrOworICAgIGJvb2wgbUJ1ZmZlcmluZzsKKyAgICBib29sIG1JblByZXBhcmF0aW9uUGhhc2U7CisgICAgTXV0ZXggbUJ1ZmZlcmluZ1NldHRpbmdzTG9jazsKKyAgICBCdWZmZXJpbmdTZXR0aW5ncyBtQnVmZmVyaW5nU2V0dGluZ3M7CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworCisgICAgc3A8QVJUUENvbm5lY3Rpb24+IG1SVFBDb25uOworCisgICAgVmVjdG9yPFRyYWNrSW5mbz4gbVRyYWNrczsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtQXVkaW9UcmFjazsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtVmlkZW9UcmFjazsKKworICAgIGludDY0X3QgbUVPU1RpbWVvdXRBdWRpbzsKKyAgICBpbnQ2NF90IG1FT1NUaW1lb3V0VmlkZW87CisKKyAgICAvKiBNeUhhbmRsZXIuaCAqLworICAgIGJvb2wgbUZpcnN0QWNjZXNzVW5pdDsKKyAgICBib29sIG1BbGxUcmFja3NIYXZlVGltZTsKKyAgICBpbnQ2NF90IG1OVFBBbmNob3JVczsKKyAgICBpbnQ2NF90IG1NZWRpYUFuY2hvclVzOworICAgIGludDY0X3QgbUxhc3RNZWRpYVRpbWVVczsKKyAgICBpbnQ2NF90IG1OdW1BY2Nlc3NVbml0c1JlY2VpdmVkOworICAgIGludDMyX3QgbUxhc3RDVk9VcGRhdGVkOworICAgIGJvb2wgbVJlY2VpdmVkRmlyc3RSVENQUGFja2V0OworICAgIGJvb2wgbVJlY2VpdmVkRmlyc3RSVFBQYWNrZXQ7CisgICAgYm9vbCBtUGF1c2luZzsKKyAgICBpbnQzMl90IG1QYXVzZUdlbmVyYXRpb247CisKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBnZXRTb3VyY2UoYm9vbCBhdWRpbyk7CisKKyAgICAvKiBNeUhhbmRsZXIuaCAqLworICAgIHZvaWQgb25UaW1lVXBkYXRlKGludDMyX3QgdHJhY2tJbmRleCwgdWludDMyX3QgcnRwVGltZSwgdWludDY0X3QgbnRwVGltZSk7CisgICAgYm9vbCBhZGRNZWRpYVRpbWVzdGFtcChpbnQzMl90IHRyYWNrSW5kZXgsIGNvbnN0IFRyYWNrSW5mbyAqdHJhY2ssCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7CisgICAgYm9vbCBkYXRhUmVjZWl2ZWRPbkFsbENoYW5uZWxzKCk7CisgICAgdm9pZCBwb3N0UXVldWVBY2Nlc3NVbml0KHNpemVfdCB0cmFja0luZGV4LCBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7CisgICAgdm9pZCBwb3N0UXVldWVFT1Moc2l6ZV90IHRyYWNrSW5kZXgsIHN0YXR1c190IGZpbmFsUmVzdWx0KTsKKyAgICBzcDxNZXRhRGF0YT4gZ2V0VHJhY2tGb3JtYXQoc2l6ZV90IGluZGV4LCBpbnQzMl90ICp0aW1lU2NhbGUpOworICAgIHZvaWQgb25Db25uZWN0ZWQoKTsKKyAgICB2b2lkIG9uRGlzY29ubmVjdGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIHZvaWQgc2NoZWR1bGVQb2xsQnVmZmVyaW5nKCk7CisgICAgdm9pZCBvblBvbGxCdWZmZXJpbmcoKTsKKworICAgIGJvb2wgaGF2ZVN1ZmZpY2llbnREYXRhT25BbGxUcmFja3MoKTsKKworICAgIHZvaWQgc2V0RU9TVGltZW91dChib29sIGF1ZGlvLCBpbnQ2NF90IHRpbWVvdXQpOworCisgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4ICZwYXJhbXMpOworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcihjb25zdCBTdHJpbmc4ICZrZXksIGNvbnN0IFN0cmluZzggJnZhbHVlKTsKKyAgICB2b2lkIHNldFNvY2tldE5ldHdvcmsoaW50NjRfdCBuZXR3b3JrSGFuZGxlKTsKKyAgICBzdGF0aWMgdm9pZCBUcmltU3RyaW5nKFN0cmluZzggKnMpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUlRQU291cmNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gUlRQX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icAppbmRleCBlODQ1YzMzLi45ODYyNmZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icApAQCAtMSwzICsxLDE0IEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJtZWRpYXBsYXllcnNlcnZpY2VfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhcGxheWVyc2VydmljZV9saWNlbnNlIiwKKyAgICBdLAorfQorCiBjY190ZXN0IHsKIAogICAgIG5hbWU6ICJEcm1TZXNzaW9uTWFuYWdlcl90ZXN0IiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9zdGFnZWZyaWdodFJlY29yZGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvc3RhZ2VmcmlnaHRSZWNvcmRlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NGQ2NGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvc3RhZ2VmcmlnaHRSZWNvcmRlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJtZWRpYXBsYXllcnNlcnZpY2VfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhcGxheWVyc2VydmljZV9saWNlbnNlIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZSIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYXBsYXllcnNlcnZpY2UiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaHR0cGxpdmUiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJhbmRyb2lkX25ldCIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCisgICAgICAgICJsaWJjb2RlYzJfY2xpZW50IiwKKyAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZGF0YXNvdXJjZSIsCisgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJkcm1mcmFtZXdvcmsiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9jb2RlY2xpc3QiLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYm1lZGlhZHJtIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKKyAgICAgICAgImxpYm5ldGRfY2xpZW50IiwKKyAgICAgICAgImxpYnBvd2VybWFuYWdlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL3N0YWdlZnJpZ2h0UmVjb3JkZXIvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL3N0YWdlZnJpZ2h0UmVjb3JkZXIvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNzAyNmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvc3RhZ2VmcmlnaHRSZWNvcmRlci9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIFN0YWdlZnJpZ2h0UmVjb3JkZXIgdW5pdCB0ZXN0cyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9IlN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUm9vdFRhcmdldFByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJmb3JjZS1yb290IiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giCisgICAgICAgICAgICAgICAgdmFsdWU9IlN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0LT4vZGF0YS9sb2NhbC90bXAvU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IlN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0IiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9zdGFnZWZyaWdodFJlY29yZGVyL1N0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9zdGFnZWZyaWdodFJlY29yZGVyL1N0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzUxNjMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL3N0YWdlZnJpZ2h0UmVjb3JkZXIvU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QuY3BwCkBAIC0wLDAgKzEsMzE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGN0aW1lPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlIDxNZWRpYVBsYXllclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworI2luY2x1ZGUgIlN0YWdlZnJpZ2h0UmVjb3JkZXIuaCIKKworI2RlZmluZSBPVVRQVVRfSU5GT19GSUxFX05BTUUgIi9kYXRhL2xvY2FsL3RtcC9zdGZyZWNvcmRlcl9hdWRpby5pbmZvIgorI2RlZmluZSBPVVRQVVRfRklMRV9OQU1FX0FVRElPICIvZGF0YS9sb2NhbC90bXAvc3RmcmVjb3JkZXJfYXVkaW8ucmF3IgorCitjb25zdCBib29sIGtEZWJ1ZyA9IGZhbHNlOworY29uc3RleHByIGludDMyX3Qga01heExvb3BDb3VudCA9IDEwOworY29uc3RleHByIGludDMyX3Qga0NsaXBEdXJhdGlvbkluU2VjID0gNDsKK2NvbnN0ZXhwciBpbnQzMl90IGtQYXVzZVRpbWVJblNlYyA9IDI7CisvLyBUb2xlcmFuY2UgdmFsdWUgZm9yIGV4dHJhY3RlZCBjbGlwZHVyYXRpb24gaXMgbWF4aW11bSAxMCUgb2YgdG90YWwgY2xpcGR1cmF0aW9uCitjb25zdGV4cHIgaW50MzJfdCBrVG9sZXJhbmNlVmFsdWVJblVzID0ga0NsaXBEdXJhdGlvbkluU2VjICogMTAwMDAwOworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QKKyAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RkOjpwYWlyPG91dHB1dF9mb3JtYXQsIGF1ZGlvX2VuY29kZXI+PiB7CisgIHB1YmxpYzoKKyAgICBTdGFnZWZyaWdodFJlY29yZGVyVGVzdCgpIDogbVN0ZlJlY29yZGVyKG51bGxwdHIpLCBtT3V0cHV0QXVkaW9GcChudWxscHRyKSB7CisgICAgICAgIG1FeHBlY3RlZER1cmF0aW9uSW5NcyA9IDA7CisgICAgICAgIG1FeHBlY3RlZFBhdXNlSW5NcyA9IDA7CisgICAgfQorCisgICAgflN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0KCkgeworICAgICAgICBpZiAobVN0ZlJlY29yZGVyKSBmcmVlKG1TdGZSZWNvcmRlcik7CisgICAgICAgIGlmIChtT3V0cHV0QXVkaW9GcCkgZmNsb3NlKG1PdXRwdXRBdWRpb0ZwKTsKKyAgICB9CisKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBtU3RmUmVjb3JkZXIgPSBuZXcgU3RhZ2VmcmlnaHRSZWNvcmRlcihTdHJpbmcxNihMT0dfVEFHKSk7CisgICAgICAgIEFTU0VSVF9ORShtU3RmUmVjb3JkZXIsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIHRoZSBpbnN0YW5jZSBvZiByZWNvcmRlciI7CisKKyAgICAgICAgbU91dHB1dEF1ZGlvRnAgPSBmb3BlbihPVVRQVVRfRklMRV9OQU1FX0FVRElPLCAid2IiKTsKKyAgICAgICAgQVNTRVJUX05FKG1PdXRwdXRBdWRpb0ZwLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIG9wZW4gb3V0cHV0IGZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IE9VVFBVVF9GSUxFX05BTUVfQVVESU8gPDwgIiBmb3Igc3RhZ2VmcmlnaHQgcmVjb3JkZXIiOworCisgICAgICAgIGludDMyX3QgZmQgPSBmaWxlbm8obU91dHB1dEF1ZGlvRnApOworICAgICAgICBBU1NFUlRfR0UoZmQsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIG91dHB1dCBmaWxlIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgT1VUUFVUX0ZJTEVfTkFNRV9BVURJTzsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnNldE91dHB1dEZpbGUoZmQpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBzZXQgdGhlIG91dHB1dCBmaWxlICIgPDwgT1VUUFVUX0ZJTEVfTkFNRV9BVURJTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmb3Igc3RhZ2VmcmlnaHQgcmVjb3JkZXIiOworICAgIH0KKworICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtT3V0cHV0QXVkaW9GcCkgeworICAgICAgICAgICAgZmNsb3NlKG1PdXRwdXRBdWRpb0ZwKTsKKyAgICAgICAgICAgIG1PdXRwdXRBdWRpb0ZwID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWtEZWJ1ZykgeworICAgICAgICAgICAgaW50MzJfdCBzdGF0dXMgPSByZW1vdmUoT1VUUFVUX0ZJTEVfTkFNRV9BVURJTyk7CisgICAgICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiVW5hYmxlIHRvIGRlbGV0ZSB0aGUgb3V0cHV0IGZpbGUgIiA8PCBPVVRQVVRfRklMRV9OQU1FX0FVRElPOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzZXRBdWRpb1JlY29yZGVyRm9ybWF0KG91dHB1dF9mb3JtYXQgb3V0cHV0Rm9ybWF0LCBhdWRpb19lbmNvZGVyIGVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlID0gQVVESU9fU09VUkNFX0RFRkFVTFQpOworICAgIHZvaWQgcmVjb3JkTWVkaWEoYm9vbCBpc1BhdXNlZCA9IGZhbHNlLCBpbnQzMl90IG51bVN0YXJ0ID0gMCwgaW50MzJfdCBudW1QYXVzZSA9IDApOworICAgIHZvaWQgZHVtcEluZm8oKTsKKyAgICB2b2lkIHNldHVwRXh0cmFjdG9yKEFNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yLCBpbnQzMl90ICZ0cmFja0NvdW50KTsKKyAgICB2b2lkIHZhbGlkYXRlT3V0cHV0KCk7CisKKyAgICBNZWRpYVJlY29yZGVyQmFzZSAqbVN0ZlJlY29yZGVyOworICAgIEZJTEUgKm1PdXRwdXRBdWRpb0ZwOworICAgIGRvdWJsZSBtRXhwZWN0ZWREdXJhdGlvbkluTXM7CisgICAgZG91YmxlIG1FeHBlY3RlZFBhdXNlSW5NczsKK307CisKK3ZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3Q6OnNldEF1ZGlvUmVjb3JkZXJGb3JtYXQob3V0cHV0X2Zvcm1hdCBvdXRwdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2VuY29kZXIgZW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnNldEF1ZGlvU291cmNlKGF1ZGlvU291cmNlKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBzZXQgdGhlIGF1ZGlvIHNvdXJjZTogIiA8PCBhdWRpb1NvdXJjZTsKKworICAgIHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+c2V0T3V0cHV0Rm9ybWF0KG91dHB1dEZvcm1hdCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gc2V0IHRoZSBvdXRwdXQgZm9ybWF0OiAiIDw8IG91dHB1dEZvcm1hdDsKKworICAgIHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+c2V0QXVkaW9FbmNvZGVyKGVuY29kZXIpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIHNldCB0aGUgYXVkaW8gZW5jb2RlcjogIiA8PCBlbmNvZGVyOworfQorCit2b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0OjpyZWNvcmRNZWRpYShib29sIGlzUGF1c2UsIGludDMyX3QgbnVtU3RhcnQsIGludDMyX3QgbnVtUGF1c2UpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPmluaXQoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBpbml0aWFsaXplIHN0YWdlZnJpZ2h0IHJlY29yZGVyIjsKKworICAgIHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+cHJlcGFyZSgpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIHByZWFwcmUgdGhlIHJlb3JkZXIiOworCisgICAgLy8gZmlyc3Qgc3RhcnQgc2hvdWxkIHN1Y2NlZWQuCisgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5zdGFydCgpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIHN0YXJ0IHRoZSByZWNvcmRlciI7CisKKyAgICBmb3IgKGludDMyX3QgY291bnQgPSAwOyBjb3VudCA8IG51bVN0YXJ0OyBjb3VudCsrKSB7CisgICAgICAgIHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+c3RhcnQoKTsKKyAgICB9CisKKyAgICBhdXRvIHRTdGFydCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOworICAgIC8vIFJlY29yZGluZyBtZWRpYSBmb3IgNCBzZWNzCisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKGtDbGlwRHVyYXRpb25JblNlYykpOworICAgIGF1dG8gdEVuZCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOworICAgIG1FeHBlY3RlZER1cmF0aW9uSW5NcyA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGUsIHN0ZDo6bWlsbGk+KHRFbmQgLSB0U3RhcnQpLmNvdW50KCk7CisKKyAgICBpZiAoaXNQYXVzZSkgeworICAgICAgICAvLyBmaXJzdCBwYXVzZSBzaG91bGQgc3VjY2VlZC4KKyAgICAgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5wYXVzZSgpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBwYXVzZSB0aGUgcmVjb3JkZXIiOworCisgICAgICAgIHRTdGFydCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOworICAgICAgICAvLyBQYXVzZWQgcmVjb3JkZXIgZm9yIDIgc2VjcworICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoa1BhdXNlVGltZUluU2VjKSk7CisKKyAgICAgICAgZm9yIChpbnQzMl90IGNvdW50ID0gMDsgY291bnQgPCBudW1QYXVzZTsgY291bnQrKykgeworICAgICAgICAgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5wYXVzZSgpOworICAgICAgICB9CisKKyAgICAgICAgdEVuZCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOworICAgICAgICBtRXhwZWN0ZWRQYXVzZUluTXMgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlLCBzdGQ6Om1pbGxpPih0RW5kIC0gdFN0YXJ0KS5jb3VudCgpOworCisgICAgICAgIHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+cmVzdW1lKCk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIHJlc3VtZSB0aGUgcmVjb3JkZXIiOworCisgICAgICAgIGF1dG8gdFN0YXJ0ID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CisgICAgICAgIC8vIFJlY29yZGluZyBtZWRpYSBmb3IgNCBzZWNzCisgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcyhrQ2xpcER1cmF0aW9uSW5TZWMpKTsKKyAgICAgICAgYXV0byB0RW5kID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CisgICAgICAgIG1FeHBlY3RlZER1cmF0aW9uSW5NcyArPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlLCBzdGQ6Om1pbGxpPih0RW5kIC0gdFN0YXJ0KS5jb3VudCgpOworICAgIH0KKyAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSByZWNvcmRlciI7Cit9CisKK3ZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3Q6OmR1bXBJbmZvKCkgeworICAgIEZJTEUgKmR1bXBPdXRwdXQgPSBmb3BlbihPVVRQVVRfSU5GT19GSUxFX05BTUUsICJ3YiIpOworICAgIGludDMyX3QgZHVtcEZkID0gZmlsZW5vKGR1bXBPdXRwdXQpOworICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPmR1bXAoZHVtcEZkLCBhcmdzKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBkdW1wIHRoZSBpbmZvIGZvciB0aGUgcmVjb3JkZXIiOworICAgIGZjbG9zZShkdW1wT3V0cHV0KTsKK30KKwordm9pZCBTdGFnZWZyaWdodFJlY29yZGVyVGVzdDo6c2V0dXBFeHRyYWN0b3IoQU1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IsIGludDMyX3QgJnRyYWNrQ291bnQpIHsKKyAgICBpbnQzMl90IGZkID0gb3BlbihPVVRQVVRfRklMRV9OQU1FX0FVRElPLCBPX1JET05MWSk7CisgICAgQVNTRVJUX0dFKGZkLCAwKSA8PCAiRmFpbGVkIHRvIG9wZW4gcmVjb3JkZXIncyBvdXRwdXQgZmlsZSAiIDw8IE9VVFBVVF9GSUxFX05BTUVfQVVESU8KKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgdG8gdmFsaWRhdGUiOworCisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIGludDMyX3Qgc3RhdHVzID0gZnN0YXQoZmQsICZidWYpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IHByb3BlcnRpZXMgb2YgaW5wdXQgZmlsZSAiIDw8IE9VVFBVVF9GSUxFX05BTUVfQVVESU8KKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZvciBleHRyYWN0b3IiOworCisgICAgc2l6ZV90IGZpbGVTaXplID0gYnVmLnN0X3NpemU7CisgICAgQVNTRVJUX0dUKGZpbGVTaXplLCAwKSA8PCAiU2l6ZSBvZiBpbnB1dCBmaWxlICIgPDwgT1VUUFVUX0ZJTEVfTkFNRV9BVURJTworICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB0byBleHRyYWN0b3IgY2Fubm90IGJlIHplcm8iOworICAgIEFMT0dWKCJTaXplIG9mIGlucHV0IGZpbGUgdG8gZXh0cmFjdG9yOiAlenUiLCBmaWxlU2l6ZSk7CisKKyAgICBzdGF0dXMgPSBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkKGV4dHJhY3RvciwgZmQsIDAsIGZpbGVTaXplKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBBTUVESUFfT0spIDw8ICJGYWlsZWQgdG8gc2V0IGRhdGEgc291cmNlIGZvciBleHRyYWN0b3IiOworCisgICAgdHJhY2tDb3VudCA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0NvdW50KGV4dHJhY3Rvcik7CisgICAgQUxPR1YoIk51bWJlciBvZiB0cmFja3MgcmVwb3J0ZWQgYnkgZXh0cmFjdG9yIDogJWQiLCB0cmFja0NvdW50KTsKK30KKworLy8gVmFsaWRhdGUgcmVjb2RlcidzIG91dHB1dCB1c2luZyBleHRyYWN0b3IKK3ZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3Q6OnZhbGlkYXRlT3V0cHV0KCkgeworICAgIGludDMyX3QgdHJhY2tDb3VudCA9IC0xOworICAgIEFNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yID0gQU1lZGlhRXh0cmFjdG9yX25ldygpOworICAgIEFTU0VSVF9ORShleHRyYWN0b3IsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGV4dHJhY3RvciI7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoc2V0dXBFeHRyYWN0b3IoZXh0cmFjdG9yLCB0cmFja0NvdW50KSk7CisgICAgQVNTRVJUX0VRKHRyYWNrQ291bnQsIDEpIDw8ICJFeHBlY3RlZCAxIHRyYWNrLCBzYXcgIiA8PCB0cmFja0NvdW50OworCisgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IHRyYWNrQ291bnQ7IGlkeCsrKSB7CisgICAgICAgIEFNZWRpYUV4dHJhY3Rvcl9zZWxlY3RUcmFjayhleHRyYWN0b3IsIGlkeCk7CisgICAgICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0ID0gQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrRm9ybWF0KGV4dHJhY3RvciwgaWR4KTsKKyAgICAgICAgQVNTRVJUX05FKGZvcm1hdCwgbnVsbHB0cikgPDwgIlRyYWNrIGZvcm1hdCBpcyBOVUxMIjsKKyAgICAgICAgQUxPR0koIlRyYWNrIGZvcm1hdCA9ICVzIiwgQU1lZGlhRm9ybWF0X3RvU3RyaW5nKGZvcm1hdCkpOworCisgICAgICAgIGludDY0X3QgY2xpcER1cmF0aW9uVXM7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQ2NChmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZjbGlwRHVyYXRpb25Vcyk7CisgICAgICAgIGludDMyX3QgZGlmZiA9IGFicygobUV4cGVjdGVkRHVyYXRpb25Jbk1zICogMTAwMCkgLSBjbGlwRHVyYXRpb25Vcyk7CisgICAgICAgIEFTU0VSVF9MRShkaWZmLCBrVG9sZXJhbmNlVmFsdWVJblVzKQorICAgICAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBkdXJhdGlvbjogIiA8PCAobUV4cGVjdGVkRHVyYXRpb25Jbk1zICogMTAwMCkKKyAgICAgICAgICAgICAgICA8PCAiIEFjdHVhbCBkdXJhdGlvbjogIiA8PCBjbGlwRHVyYXRpb25VcyA8PCAiIERpZmZlcmVuY2U6ICIgPDwgZGlmZgorICAgICAgICAgICAgICAgIDw8ICIgRGlmZmVyZW5jZSBpcyBleHBlY3RlZCB0byBiZSBsZXNzIHRoYW4gdG9sZXJhbmNlIHZhbHVlOiAiIDw8IGtUb2xlcmFuY2VWYWx1ZUluVXM7CisKKyAgICAgICAgY29uc3QgY2hhciAqbWltZSA9IG51bGxwdHI7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKKyAgICAgICAgQVNTRVJUX05FKG1pbWUsIG51bGxwdHIpIDw8ICJUcmFjayBtaW1lIGlzIE5VTEwiOworICAgICAgICBBTE9HSSgiVHJhY2sgbWltZSA9ICVzIiwgbWltZSk7CisKKyAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGJpdFJhdGU7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgJmNoYW5uZWxDb3VudCk7CisgICAgICAgIEFMT0dJKCJDaGFubmVsIGNvdW50IHJlcG9ydGVkIGJ5IGV4dHJhY3RvcjogJWQiLCBjaGFubmVsQ291bnQpOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCAmc2FtcGxlUmF0ZSk7CisgICAgICAgIEFMT0dJKCJTYW1wbGUgUmF0ZSByZXBvcnRlZCBieSBleHRyYWN0b3I6ICVkIiwgc2FtcGxlUmF0ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsICZiaXRSYXRlKTsKKyAgICAgICAgQUxPR0koIkJpdCBSYXRlIHJlcG9ydGVkIGJ5IGV4dHJhY3RvcjogJWQiLCBiaXRSYXRlKTsKKyAgICB9Cit9CisKK1RFU1RfRihTdGFnZWZyaWdodFJlY29yZGVyVGVzdCwgUmVjb3JkaW5nQXVkaW9TYW5pdHlUZXN0KSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoc2V0QXVkaW9SZWNvcmRlckZvcm1hdChPVVRQVVRfRk9STUFUX0RFRkFVTFQsIEFVRElPX0VOQ09ERVJfREVGQVVMVCkpOworCisgICAgaW50MzJfdCBtYXhBbXBsaXR1ZGUgPSAtMTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPmdldE1heEFtcGxpdHVkZSgmbWF4QW1wbGl0dWRlKTsKKyAgICBBU1NFUlRfRVEobWF4QW1wbGl0dWRlLCAwKSA8PCAiSW52YWxpZCB2YWx1ZSBvZiBtYXggYW1wbGl0dWRlIjsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHJlY29yZE1lZGlhKCkpOworCisgICAgLy8gVmVyaWZ5IGdldE1ldHJpY3MoKSBiZWhhdmlvcgorICAgIFBhcmNlbCBwYXJjZWw7CisgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5nZXRNZXRyaWNzKCZwYXJjZWwpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgcGFyY2VsIGZyb20gZ2V0TWV0cmljcyI7CisgICAgQUxPR1YoIlNpemUgb2YgdGhlIFBhcmNlbCByZXR1cm5lZCBieSBnZXRNZXRyaWNzOiAlenUiLCBwYXJjZWwuZGF0YVNpemUoKSk7CisgICAgQVNTRVJUX0dUKHBhcmNlbC5kYXRhU2l6ZSgpLCAwKSA8PCAiUGFyY2VsIHNpemUgcmVwb3J0cyBlbXB0eSByZWNvcmQiOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHZhbGlkYXRlT3V0cHV0KCkpOworICAgIGlmIChrRGVidWcpIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZHVtcEluZm8oKSk7CisgICAgfQorfQorCitURVNUX1AoU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QsIE11bHRpRm9ybWF0QXVkaW9SZWNvcmRUZXN0KSB7CisgICAgb3V0cHV0X2Zvcm1hdCBvdXRwdXRGb3JtYXQgPSBHZXRQYXJhbSgpLmZpcnN0OworICAgIGF1ZGlvX2VuY29kZXIgYXVkaW9FbmNvZGVyID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoc2V0QXVkaW9SZWNvcmRlckZvcm1hdChvdXRwdXRGb3JtYXQsIGF1ZGlvRW5jb2RlcikpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHJlY29yZE1lZGlhKCkpOworICAgIC8vIFRPRE8oYi8xNjE2ODc3NjEpCisgICAgLy8gU2tpcCBmb3IgQU1SLU5CL1dCIG91dHB1dCBmb3JtYXQKKyAgICBpZiAoIShvdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9BTVJfTkIgfHwgb3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfQU1SX1dCKSkgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh2YWxpZGF0ZU91dHB1dCgpKTsKKyAgICB9CisgICAgaWYgKGtEZWJ1ZykgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkdW1wSW5mbygpKTsKKyAgICB9Cit9CisKK1RFU1RfRihTdGFnZWZyaWdodFJlY29yZGVyVGVzdCwgR2V0QWN0aXZlTWljcm9waG9uZXNUZXN0KSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBzZXRBdWRpb1JlY29yZGVyRm9ybWF0KE9VVFBVVF9GT1JNQVRfREVGQVVMVCwgQVVESU9fRU5DT0RFUl9ERUZBVUxULCBBVURJT19TT1VSQ0VfTUlDKSk7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPmluaXQoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkluaXQgZmFpbGVkIGZvciBzdGFnZWZyaWdodCByZWNvcmRlciI7CisKKyAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnByZXBhcmUoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBwcmVhcHJlIHRoZSByZW9yZGVyIjsKKworICAgIHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+c3RhcnQoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBzdGFydCB0aGUgcmVjb3JkZXIiOworCisgICAgLy8gUmVjb3JkIG1lZGlhIGZvciA0IHNlY3MKKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoa0NsaXBEdXJhdGlvbkluU2VjKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+IGFjdGl2ZU1pY3JvcGhvbmVze307CisgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5nZXRBY3RpdmVNaWNyb3Bob25lcygmYWN0aXZlTWljcm9waG9uZXMpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIGdldCBBY3RpdmUgTWljcm9waG9uZXMiOworICAgIEFTU0VSVF9HVChhY3RpdmVNaWNyb3Bob25lcy5zaXplKCksIDApIDw8ICJObyBhY3RpdmUgbWljcm9waG9uZXMgYXJlIGZvdW5kIjsKKworICAgIHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+c3RvcCgpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIHN0b3AgdGhlIHJlY29yZGVyIjsKKyAgICBpZiAoa0RlYnVnKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGR1bXBJbmZvKCkpOworICAgIH0KK30KKworVEVTVF9GKFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0LCBNdWx0aVN0YXJ0UGF1c2VUZXN0KSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoc2V0QXVkaW9SZWNvcmRlckZvcm1hdChPVVRQVVRfRk9STUFUX0RFRkFVTFQsIEFVRElPX0VOQ09ERVJfREVGQVVMVCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHJlY29yZE1lZGlhKHRydWUsIGtNYXhMb29wQ291bnQsIGtNYXhMb29wQ291bnQpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh2YWxpZGF0ZU91dHB1dCgpKTsKKyAgICBpZiAoa0RlYnVnKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGR1bXBJbmZvKCkpOworICAgIH0KK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBTdGFnZWZyaWdodFJlY29yZGVyVGVzdEFsbCwgU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKHN0ZDo6bWFrZV9wYWlyKE9VVFBVVF9GT1JNQVRfQU1SX05CLCBBVURJT19FTkNPREVSX0FNUl9OQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKE9VVFBVVF9GT1JNQVRfQU1SX1dCLCBBVURJT19FTkNPREVSX0FNUl9XQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKE9VVFBVVF9GT1JNQVRfQUFDX0FEVFMsIEFVRElPX0VOQ09ERVJfQUFDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoT1VUUFVUX0ZPUk1BVF9PR0csIEFVRElPX0VOQ09ERVJfT1BVUykpKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICBBTE9HVigiVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwCmluZGV4IGY5NDhiZDguLjkzNzVlNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL0FuZHJvaWQuYnAKQEAgLTE1LDYgKzE1LDE1IEBACiAgKi8KIAogLy8gQUlETCBpbnRlcmZhY2VzIG9mIE1lZGlhVHJhbnNjb2RpbmcuCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGFpZGxfaW50ZXJmYWNlIHsKICAgICBuYW1lOiAibWVkaWF0cmFuc2NvZGluZ19haWRsX2ludGVyZmFjZSIsCiAgICAgdW5zdGFibGU6IHRydWUsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggODE5MWIwMC4uMTdhNDNkZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvQW5kcm9pZC5icApAQCAtMSw0ICsxLDEzIEBACiAvLyBCdWlsZCB0aGUgdW5pdCB0ZXN0cyBmb3IgbGlibWVkaWF0cmFuc2NvZGluZy4KK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJsaWJtZWRpYXRyYW5zY29kaW5nX3Rlc3RfZGVmYXVsdHMiLAogCkBAIC00NSw0ICs1NCw0IEBACiAgICAgZGVmYXVsdHM6IFsibGlibWVkaWF0cmFuc2NvZGluZ190ZXN0X2RlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbIkFkanVzdGFibGVNYXhQcmlvcml0eVF1ZXVlX3Rlc3RzLmNwcCJdLAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJuYmFpby9BbmRyb2lkLmJwCmluZGV4IDA0ZGRjZmYuLmU5NDIyY2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2RlZmF1bHRzIHsKICAgICBuYW1lOiAibGlibmJhaW9fbW9ub19kZWZhdWx0cyIsCiAgICAgc3JjczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5jcHAgYi9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmNwcAppbmRleCAxMDU0YjY4Li5jYTk4YjI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmNwcApAQCAtNDYsMTMgKzQ2LDExIEBACiAgICAgICAgIHN0YXR1c190IHJlc3VsdDsKICAgICAgICAgcmVzdWx0ID0gbVN0cmVhbS0+Z2V0QnVmZmVyU2l6ZSgmbVN0cmVhbUJ1ZmZlclNpemVCeXRlcyk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IHN0cmVhbUZvcm1hdDsKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZTsKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2s7Ci0gICAgICAgIHJlc3VsdCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygmc2FtcGxlUmF0ZSwgJmNoYW5uZWxNYXNrLCAmc3RyZWFtRm9ybWF0KTsKKyAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcgPSBBVURJT19DT05GSUdfQkFTRV9JTklUSUFMSVpFUjsKKyAgICAgICAgcmVzdWx0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKCZjb25maWcpOwogICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSByZXR1cm4gcmVzdWx0OwotICAgICAgICBtRm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKSwgc3RyZWFtRm9ybWF0KTsKKyAgICAgICAgbUZvcm1hdCA9IEZvcm1hdF9mcm9tX1NSX0MoY29uZmlnLnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNvbmZpZy5jaGFubmVsX21hc2spLCBjb25maWcuZm9ybWF0KTsKICAgICAgICAgbUZyYW1lU2l6ZSA9IEZvcm1hdF9mcmFtZVNpemUobUZvcm1hdCk7CiAgICAgfQogICAgIHJldHVybiBOQkFJT19Tb3VyY2U6Om5lZ290aWF0ZShvZmZlcnMsIG51bU9mZmVycywgY291bnRlck9mZmVycywgbnVtQ291bnRlck9mZmVycyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuY3BwIGIvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcAppbmRleCA4NTY0ODk5Li41ODE4NjdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5jcHAKQEAgLTQ0LDEzICs0NCwxMSBAQAogICAgICAgICBzdGF0dXNfdCByZXN1bHQ7CiAgICAgICAgIHJlc3VsdCA9IG1TdHJlYW0tPmdldEJ1ZmZlclNpemUoJm1TdHJlYW1CdWZmZXJTaXplQnl0ZXMpOwogICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSByZXR1cm4gcmVzdWx0OwotICAgICAgICBhdWRpb19mb3JtYXRfdCBzdHJlYW1Gb3JtYXQ7Ci0gICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGU7Ci0gICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrOwotICAgICAgICByZXN1bHQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoJnNhbXBsZVJhdGUsICZjaGFubmVsTWFzaywgJnN0cmVhbUZvcm1hdCk7CisgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0JBU0VfSU5JVElBTElaRVI7CisgICAgICAgIHJlc3VsdCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygmY29uZmlnKTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgbUZvcm1hdCA9IEZvcm1hdF9mcm9tX1NSX0Moc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spLCBzdHJlYW1Gb3JtYXQpOworICAgICAgICBtRm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhjb25maWcuc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNvbmZpZy5jaGFubmVsX21hc2spLCBjb25maWcuZm9ybWF0KTsKICAgICAgICAgbUZyYW1lU2l6ZSA9IEZvcm1hdF9mcmFtZVNpemUobUZvcm1hdCk7CiAgICAgfQogICAgIHJldHVybiBOQkFJT19TaW5rOjpuZWdvdGlhdGUob2ZmZXJzLCBudW1PZmZlcnMsIGNvdW50ZXJPZmZlcnMsIG51bUNvdW50ZXJPZmZlcnMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaAppbmRleCAwNDMxOTc2Li41NGRjMDhmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaAorKysgYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaApAQCAtMjMsNyArMjMsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyBQaXBlIGlzIG11bHRpLXRocmVhZCBzYWZlIGZvciByZWFkZXJzIChzZWUgUGlwZVJlYWRlciksIGJ1dCBzYWZlIGZvciBvbmx5IGEgc2luZ2xlIHdyaXRlciB0aHJlYWQuCi0vLyBJdCBjYW5ub3QgVU5ERVJSVU4gb24gd3JpdGUsIHVubGVzcyB3ZSBhbGxvdyBkZXNpZ25hdGlvbiBvZiBhIG1hc3RlciByZWFkZXIgdGhhdCBwcm92aWRlcyB0aGUKKy8vIEl0IGNhbm5vdCBVTkRFUlJVTiBvbiB3cml0ZSwgdW5sZXNzIHdlIGFsbG93IGRlc2lnbmF0aW9uIG9mIGEgcHJpbWFyeSByZWFkZXIgdGhhdCBwcm92aWRlcyB0aGUKIC8vIHRpbWUtYmFzZS4gUmVhZGVycyBjYW4gYmUgYWRkZWQgYW5kIHJlbW92ZWQgZHluYW1pY2FsbHksIGFuZCBpdCdzIE9LIHRvIGhhdmUgbm8gcmVhZGVycy4KIGNsYXNzIFBpcGUgOiBwdWJsaWMgTkJBSU9fU2luayB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJuYmxvZy9BbmRyb2lkLmJwCmluZGV4IDExODgzMjAuLjhjZmVjZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibmJsb2cvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKIAogICAgIG5hbWU6ICJsaWJuYmxvZyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5jcHAgYi9tZWRpYS9saWJuYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5jcHAKaW5kZXggYWE2NzhiYS4uNGM3OGIwMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuY3BwCisrKyBiL21lZGlhL2xpYm5ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmNwcApAQCAtOTIsOCArOTIsOCBAQAogICAgICAgICAoKmRhdGFKc29uKVsidGhyZWFkTnVtIl0gPSBpdGVtLmZpcnN0OwogICAgICAgICByb290LmFwcGVuZCgqZGF0YUpzb24pOwogICAgIH0KLSAgICBKc29uOjpTdHlsZWRXcml0ZXIgd3JpdGVyOwotICAgIHN0ZDo6c3RyaW5nIHJvb3RTdHIgPSB3cml0ZXIud3JpdGUocm9vdCk7CisgICAgSnNvbjo6U3RyZWFtV3JpdGVyQnVpbGRlciBmYWN0b3J5OworICAgIHN0ZDo6c3RyaW5nIHJvb3RTdHIgPSBKc29uOjp3cml0ZVN0cmluZyhmYWN0b3J5LCByb290KTsKICAgICB3cml0ZShmZCwgcm9vdFN0ci5jX3N0cigpLCByb290U3RyLnNpemUoKSk7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCmluZGV4IDhlNDgwYmYuLjIyNGVjOGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcApAQCAtMjc5LDYgKzI3OSwxMyBAQAogCiAgICAgdm9pZCBwb3N0RmlsbFRoaXNCdWZmZXIoQnVmZmVySW5mbyAqaW5mbyk7CiAKKyAgICB2b2lkIG1heWJlUG9zdEV4dHJhT3V0cHV0TWV0YWRhdGFCdWZmZXJSZXF1ZXN0KCkgeworICAgICAgICBpZiAoIW1QZW5kaW5nRXh0cmFPdXRwdXRNZXRhZGF0YUJ1ZmZlclJlcXVlc3QpIHsKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdWJtaXRFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyLCBtQ29kZWMpKS0+cG9zdCgpOworICAgICAgICAgICAgbVBlbmRpbmdFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyUmVxdWVzdCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKIHByaXZhdGU6CiAgICAgLy8gSGFuZGxlcyBhbiBPTVggbWVzc2FnZS4gUmV0dXJucyB0cnVlIGlmZiBtZXNzYWdlIHdhcyBoYW5kbGVkLgogICAgIGJvb2wgb25PTVhNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKQEAgLTMwMiw2ICszMDksOCBAQAogCiAgICAgdm9pZCBnZXRNb3JlSW5wdXREYXRhSWZQb3NzaWJsZSgpOwogCisgICAgYm9vbCBtUGVuZGluZ0V4dHJhT3V0cHV0TWV0YWRhdGFCdWZmZXJSZXF1ZXN0OworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQmFzZVN0YXRlKTsKIH07CiAKQEAgLTU1NSw2ICs1NjQsOCBAQAogICAgICAgbVNodXRkb3duSW5Qcm9ncmVzcyhmYWxzZSksCiAgICAgICBtRXhwbGljaXRTaHV0ZG93bihmYWxzZSksCiAgICAgICBtSXNMZWdhY3lWUDlEZWNvZGVyKGZhbHNlKSwKKyAgICAgIG1Jc1N0cmVhbUNvcnJ1cHRGcmVlKGZhbHNlKSwKKyAgICAgIG1Jc0xvd0xhdGVuY3koZmFsc2UpLAogICAgICAgbUVuY29kZXJEZWxheSgwKSwKICAgICAgIG1FbmNvZGVyUGFkZGluZygwKSwKICAgICAgIG1Sb3RhdGlvbkRlZ3JlZXMoMCksCkBAIC04ODcsNyArODk4LDcgQEAKIAogICAgICAgICAgICAgc3A8RGF0YUNvbnZlcnRlcj4gY29udmVydGVyID0gbUNvbnZlcnRlcltwb3J0SW5kZXhdOwogICAgICAgICAgICAgaWYgKGNvbnZlcnRlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgLy8gaGVyZSB3ZSBhc3N1bWUgc2FuZSBjb252ZXJzaW9ucyBvZiBtYXggNDoxLCBzbyByZXN1bHQgZml0cyBpbiBpbnQzMgorICAgICAgICAgICAgICAgIC8vIGhlcmUgd2UgYXNzdW1lIGNvbnZlcnNpb25zIG9mIG1heCA0OjEsIHNvIHJlc3VsdCBmaXRzIGluIGludDMyCiAgICAgICAgICAgICAgICAgaWYgKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQpIHsKICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkJ1ZmZlclNpemUgPSBjb252ZXJ0ZXItPnNvdXJjZVNpemUoYnVmU2l6ZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTIyMzcsNiArMjI0OCwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZXJyID0gc2V0dXBHNzExQ29kZWMoZW5jb2Rlciwgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpOwogICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKSkgeworICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzID0gMSwgc2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImNoYW5uZWwtY291bnQiLCAmbnVtQ2hhbm5lbHMpICYmCisgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgIGVyciA9IHNldHVwT3B1c0NvZGVjKGVuY29kZXIsIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQykpIHsKICAgICAgICAgLy8gbnVtQ2hhbm5lbHMgbmVlZHMgdG8gYmUgc2V0IHRvIHByb3Blcmx5IGNvbW11bmljYXRlIFBDTSB2YWx1ZXMuCiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSAyLCBzYW1wbGVSYXRlID0gNDQxMDAsIGNvbXByZXNzaW9uTGV2ZWwgPSAtMTsKQEAgLTIzMjMsNiArMjM0MCwxMiBAQAogICAgICAgICBtQ2hhbm5lbE1hc2tQcmVzZW50ID0gZmFsc2U7CiAgICAgfQogCisgICAgaW50MzJfdCBpc0NvcnJ1cHRGcmVlID0gMDsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoImNvcnJ1cHQtZnJlZSIsICZpc0NvcnJ1cHRGcmVlKSkgeworICAgICAgICBtSXNTdHJlYW1Db3JydXB0RnJlZSA9IGlzQ29ycnVwdEZyZWUgPT0gMSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgQUxPR1YoImNvcnJ1cHQtZnJlZT1bJWRdIiwgbUlzU3RyZWFtQ29ycnVwdEZyZWUpOworICAgIH0KKwogICAgIGludDMyX3QgbWF4SW5wdXRTaXplOwogICAgIGlmIChtc2ctPmZpbmRJbnQzMigibWF4LWlucHV0LXNpemUiLCAmbWF4SW5wdXRTaXplKSkgewogICAgICAgICBlcnIgPSBzZXRNaW5CdWZmZXJTaXplKGtQb3J0SW5kZXhJbnB1dCwgKHNpemVfdCltYXhJbnB1dFNpemUpOwpAQCAtMjQwOSw2ICsyNDMyLDcgQEAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJkZWNvZGVyIGNhbiBub3Qgc2V0IGxvdy1sYXRlbmN5IHRvICVkIChlcnIgJWQpIiwgbG93TGF0ZW5jeSwgZXJyKTsKICAgICB9CisgICAgbUlzTG93TGF0ZW5jeSA9IChsb3dMYXRlbmN5ICYmIGVyciA9PSBPSyk7CiAgICAgcmV0dXJuIGVycjsKIH0KIApAQCAtMjYwMiwxNSArMjYyNiwxNSBAQAogICAgIHVuc2lnbmVkIGludCBudW1MYXllcnMgPSAwOwogICAgIHVuc2lnbmVkIGludCBudW1CTGF5ZXJzID0gMDsKICAgICBpbnQgdGFnczsKLSAgICBjaGFyIGR1bW15OworICAgIGNoYXIgdG1wOwogICAgIE9NWF9WSURFT19BTkRST0lEX1RFTVBPUkFMTEFZRVJJTkdQQVRURVJOVFlQRSBwYXR0ZXJuID0KICAgICAgICAgT01YX1ZJREVPX0FuZHJvaWRUZW1wb3JhbExheWVyaW5nUGF0dGVybk5vbmU7Ci0gICAgaWYgKHNzY2FuZih0c1NjaGVtYS5jX3N0cigpLCAid2VicnRjLnZwOC4ldS1sYXllciVjIiwgJm51bUxheWVycywgJmR1bW15KSA9PSAxCisgICAgaWYgKHNzY2FuZih0c1NjaGVtYS5jX3N0cigpLCAid2VicnRjLnZwOC4ldS1sYXllciVjIiwgJm51bUxheWVycywgJnRtcCkgPT0gMQogICAgICAgICAgICAgJiYgbnVtTGF5ZXJzID4gMCkgewogICAgICAgICBwYXR0ZXJuID0gT01YX1ZJREVPX0FuZHJvaWRUZW1wb3JhbExheWVyaW5nUGF0dGVybldlYlJUQzsKICAgICB9IGVsc2UgaWYgKCh0YWdzID0gc3NjYW5mKHRzU2NoZW1hLmNfc3RyKCksICJhbmRyb2lkLmdlbmVyaWMuJXUlYyV1JWMiLAotICAgICAgICAgICAgICAgICAgICAmbnVtTGF5ZXJzLCAmZHVtbXksICZudW1CTGF5ZXJzLCAmZHVtbXkpKQotICAgICAgICAgICAgJiYgKHRhZ3MgPT0gMSB8fCAodGFncyA9PSAzICYmIGR1bW15ID09ICcrJykpCisgICAgICAgICAgICAgICAgICAgICZudW1MYXllcnMsICZ0bXAsICZudW1CTGF5ZXJzLCAmdG1wKSkKKyAgICAgICAgICAgICYmICh0YWdzID09IDEgfHwgKHRhZ3MgPT0gMyAmJiB0bXAgPT0gJysnKSkKICAgICAgICAgICAgICYmIG51bUxheWVycyA+IDAgJiYgbnVtTGF5ZXJzIDwgVUlOVDMyX01BWCAtIG51bUJMYXllcnMpIHsKICAgICAgICAgbnVtTGF5ZXJzICs9IG51bUJMYXllcnM7CiAgICAgICAgIHBhdHRlcm4gPSBPTVhfVklERU9fQW5kcm9pZFRlbXBvcmFsTGF5ZXJpbmdQYXR0ZXJuQW5kcm9pZDsKQEAgLTMxMTAsNiArMzEzNCwyNiBAQAogICAgICAgICAgICAga1BvcnRJbmRleElucHV0LCBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7CiB9CiAKK3N0YXR1c190IEFDb2RlYzo6c2V0dXBPcHVzQ29kZWMoYm9vbCBlbmNvZGVyLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgbnVtQ2hhbm5lbHMpIHsKKyAgICBpZiAoZW5jb2RlcikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX09QVVNUWVBFIGRlZjsKKyAgICBJbml0T01YUGFyYW1zKCZkZWYpOworICAgIGRlZi5uUG9ydEluZGV4ID0ga1BvcnRJbmRleElucHV0OworICAgIHN0YXR1c190IGVyciA9IG1PTVhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZE9wdXMsICZkZWYsIHNpemVvZihkZWYpKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJzZXR1cE9wdXNDb2RlYygpOiBFcnJvciAlZCBnZXR0aW5nIE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkT3B1cyBwYXJhbWV0ZXIiLCBlcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBkZWYublNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgIGRlZi5uQ2hhbm5lbHMgPSBudW1DaGFubmVsczsKKyAgICBlcnIgPSBtT01YTm9kZS0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZE9wdXMsICZkZWYsIHNpemVvZihkZWYpKTsKKyAgICByZXR1cm4gZXJyOworfQorCiBzdGF0dXNfdCBBQ29kZWM6OnNldHVwRmxhY0NvZGVjKAogICAgICAgICBib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjb21wcmVzc2lvbkxldmVsLAogICAgICAgICBBdWRpb0VuY29kaW5nIGVuY29kaW5nKSB7CkBAIC00MTI3LDYgKzQxNzEsMjkgQEAKICAgICAgICAgQUxPR0koInNldHVwVmlkZW9FbmNvZGVyIHN1Y2NlZWRlZCIpOwogICAgIH0KIAorICAgIC8vIFZpZGVvIHNob3VsZCBiZSBlbmNvZGVkIGFzIHN0YW5kIHN0cmFpZ2h0IGJlY2F1c2UgUlRQIHByb3RvY29sCisgICAgLy8gY2FuIHByb3ZpZGUgcm90YXRpb24gaW5mb3JtYXRpb24gb25seSBpZiBDVk8gaXMgc3VwcG9ydGVkLgorICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgYWRkZWQgdG8gc3VwcG9ydCBub24tQ1ZPIGNhc2UgZm9yIHZpZGVvIHN0cmVhbWluZyBzY2VuYXJpby4KKyAgICBpbnQzMl90IHJvdGF0aW9uID0gMDsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCAmcm90YXRpb24pKSB7CisgICAgICAgIE9NWF9DT05GSUdfUk9UQVRJT05UWVBFIGNvbmZpZzsKKyAgICAgICAgSW5pdE9NWFBhcmFtcygmY29uZmlnKTsKKyAgICAgICAgY29uZmlnLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtT01YTm9kZS0+Z2V0Q29uZmlnKAorICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleENvbmZpZ0NvbW1vblJvdGF0ZSwgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZykpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGdldENvbmZpZyBvZiBPTVhfSW5kZXhDb25maWdDb21tb25Sb3RhdGUoZXJyICVkKSIsIGVycik7CisgICAgICAgIH0KKyAgICAgICAgY29uZmlnLm5Sb3RhdGlvbiA9IHJvdGF0aW9uOworICAgICAgICBlcnIgPSBtT01YTm9kZS0+c2V0Q29uZmlnKAorICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleENvbmZpZ0NvbW1vblJvdGF0ZSwgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZykpOworCisgICAgICAgIEFMT0dEKCJBcHBseWluZyBlbmNvZGVyLXJvdGF0aW9uPVslZF0gdG8gdmlkZW8gZW5jb2Rlci4iLCBjb25maWcublJvdGF0aW9uKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBzZXRDb25maWcgb2YgT01YX0luZGV4Q29uZmlnQ29tbW9uUm90YXRlKGVyciAlZCkiLCBlcnIpOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIGVycjsKIH0KIApAQCAtNDc1NywxNSArNDgyNCwxNSBAQAogICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTGF5ZXJzID0gMDsKICAgICAgICAgdW5zaWduZWQgaW50IG51bUJMYXllcnMgPSAwOwogICAgICAgICBpbnQgdGFnczsKLSAgICAgICAgY2hhciBkdW1teTsKLSAgICAgICAgaWYgKHNzY2FuZih0c1NjaGVtYS5jX3N0cigpLCAid2VicnRjLnZwOC4ldS1sYXllciVjIiwgJm51bUxheWVycywgJmR1bW15KSA9PSAxCisgICAgICAgIGNoYXIgdG1wOworICAgICAgICBpZiAoc3NjYW5mKHRzU2NoZW1hLmNfc3RyKCksICJ3ZWJydGMudnA4LiV1LWxheWVyJWMiLCAmbnVtTGF5ZXJzLCAmdG1wKSA9PSAxCiAgICAgICAgICAgICAgICAgJiYgbnVtTGF5ZXJzID4gMCkgewogICAgICAgICAgICAgcGF0dGVybiA9IE9NWF9WSURFT19WUFhUZW1wb3JhbExheWVyUGF0dGVybldlYlJUQzsKICAgICAgICAgICAgIHRzVHlwZSA9IE9NWF9WSURFT19BbmRyb2lkVGVtcG9yYWxMYXllcmluZ1BhdHRlcm5XZWJSVEM7CiAgICAgICAgICAgICB0c0xheWVycyA9IG51bUxheWVyczsKICAgICAgICAgfSBlbHNlIGlmICgodGFncyA9IHNzY2FuZih0c1NjaGVtYS5jX3N0cigpLCAiYW5kcm9pZC5nZW5lcmljLiV1JWMldSVjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZudW1MYXllcnMsICZkdW1teSwgJm51bUJMYXllcnMsICZkdW1teSkpCi0gICAgICAgICAgICAgICAgJiYgKHRhZ3MgPT0gMSB8fCAodGFncyA9PSAzICYmIGR1bW15ID09ICcrJykpCisgICAgICAgICAgICAgICAgICAgICAgICAmbnVtTGF5ZXJzLCAmdG1wLCAmbnVtQkxheWVycywgJnRtcCkpCisgICAgICAgICAgICAgICAgJiYgKHRhZ3MgPT0gMSB8fCAodGFncyA9PSAzICYmIHRtcCA9PSAnKycpKQogICAgICAgICAgICAgICAgICYmIG51bUxheWVycyA+IDAgJiYgbnVtTGF5ZXJzIDwgVUlOVDMyX01BWCAtIG51bUJMYXllcnMpIHsKICAgICAgICAgICAgIHBhdHRlcm4gPSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEM7CiAgICAgICAgICAgICAvLyBWUFggZG9lcyBub3QgaGF2ZSBhIGNvbmNlcHQgb2YgQi1mcmFtZXMsIHNvIGp1c3QgY291bnQgYWxsIGxheWVycwpAQCAtNTYxNiwxNSArNTY4MywxOCBAQAogICAgIGludDMyX3QgcmFuZ2UsIHN0YW5kYXJkLCB0cmFuc2ZlcjsKICAgICBjb252ZXJ0Q29kZWNDb2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cyhhc3BlY3RzLCAmcmFuZ2UsICZzdGFuZGFyZCwgJnRyYW5zZmVyKTsKIAorICAgIGludDMyX3QgZHNSYW5nZSwgZHNTdGFuZGFyZCwgZHNUcmFuc2ZlcjsKKyAgICBnZXRDb2xvckNvbmZpZ0Zyb21EYXRhU3BhY2UoZGF0YVNwYWNlLCAmZHNSYW5nZSwgJmRzU3RhbmRhcmQsICZkc1RyYW5zZmVyKTsKKwogICAgIC8vIGlmIHNvbWUgYXNwZWN0cyBhcmUgdW5zcGVjaWZpZWQsIHVzZSBkYXRhc3BhY2UgZmllbGRzCiAgICAgaWYgKHJhbmdlID09IDApIHsKLSAgICAgICAgcmFuZ2UgPSAoZGF0YVNwYWNlICYgSEFMX0RBVEFTUEFDRV9SQU5HRV9NQVNLKSA+PiBIQUxfREFUQVNQQUNFX1JBTkdFX1NISUZUOworICAgICAgICByYW5nZSA9IGRzUmFuZ2U7CiAgICAgfQogICAgIGlmIChzdGFuZGFyZCA9PSAwKSB7Ci0gICAgICAgIHN0YW5kYXJkID0gKGRhdGFTcGFjZSAmIEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfTUFTSykgPj4gSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9TSElGVDsKKyAgICAgICAgc3RhbmRhcmQgPSBkc1N0YW5kYXJkOwogICAgIH0KICAgICBpZiAodHJhbnNmZXIgPT0gMCkgewotICAgICAgICB0cmFuc2ZlciA9IChkYXRhU3BhY2UgJiBIQUxfREFUQVNQQUNFX1RSQU5TRkVSX01BU0spID4+IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfU0hJRlQ7CisgICAgICAgIHRyYW5zZmVyID0gZHNUcmFuc2ZlcjsKICAgICB9CiAKICAgICBtT3V0cHV0Rm9ybWF0ID0gbU91dHB1dEZvcm1hdC0+ZHVwKCk7IC8vIHRyaWdnZXIgYW4gb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIGV2ZW50CkBAIC01NzUwLDcgKzU4MjAsOCBAQAogCiBBQ29kZWM6OkJhc2VTdGF0ZTo6QmFzZVN0YXRlKEFDb2RlYyAqY29kZWMsIGNvbnN0IHNwPEFTdGF0ZT4gJnBhcmVudFN0YXRlKQogICAgIDogQVN0YXRlKHBhcmVudFN0YXRlKSwKLSAgICAgIG1Db2RlYyhjb2RlYykgeworICAgICAgbUNvZGVjKGNvZGVjKSwKKyAgICAgIG1QZW5kaW5nRXh0cmFPdXRwdXRNZXRhZGF0YUJ1ZmZlclJlcXVlc3QoZmFsc2UpIHsKIH0KIAogQUNvZGVjOjpCYXNlU3RhdGU6OlBvcnRNb2RlIEFDb2RlYzo6QmFzZVN0YXRlOjpnZXRQb3J0TW9kZSgKQEAgLTU3OTQsMTcgKzU4NjUsMTkgQEAKIAogICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRTZXRTdXJmYWNlOgogICAgICAgICB7Ci0gICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLQogICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzdXJmYWNlIiwgJm9iaikpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPmhhbmRsZVNldFN1cmZhY2Uoc3RhdGljX2Nhc3Q8U3VyZmFjZSAqPihvYmouZ2V0KCkpKTsKIAotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgaWYgKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKSB7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgZXJyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTU4NTEsNiArNTkyNCwyMSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0U3VibWl0RXh0cmFPdXRwdXRNZXRhZGF0YUJ1ZmZlcjogeworICAgICAgICAgICAgbVBlbmRpbmdFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyUmVxdWVzdCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGdldFBvcnRNb2RlKGtQb3J0SW5kZXhPdXRwdXQpID09IFJFU1VCTUlUX0JVRkZFUlMgJiYgbUNvZGVjLT5tSXNMb3dMYXRlbmN5KSB7CisgICAgICAgICAgICAgICAgLy8gRGVjb2RlcnMgb2Z0ZW4gbmVlZCBtb3JlIHRoYW4gb25lIG91dHB1dCBidWZmZXIgdG8gYmUKKyAgICAgICAgICAgICAgICAvLyBzdWJtaXR0ZWQgYmVmb3JlIHByb2Nlc3NpbmcgYSBzaW5nbGUgaW5wdXQgYnVmZmVyLgorICAgICAgICAgICAgICAgIC8vIEZvciBsb3cgbGF0ZW5jeSBjb2RlY3MsIHdlIGRvbid0IHdhbnQgdG8gd2FpdCBmb3IgbW9yZSBpbnB1dAorICAgICAgICAgICAgICAgIC8vIHRvIGJlIHF1ZXVlZCB0byBnZXQgdGhvc2Ugb3V0cHV0IGJ1ZmZlcnMgc3VibWl0dGVkLgorICAgICAgICAgICAgICAgIGlmIChtQ29kZWMtPnN1Ym1pdE91dHB1dE1ldGFkYXRhQnVmZmVyKCkgPT0gT0sKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIG1Db2RlYy0+bU1ldGFkYXRhQnVmZmVyc1RvU3VibWl0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBtYXliZVBvc3RFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyUmVxdWVzdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC02MDAyLDYgKzYwOTAsMTIgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIGlmIChtQ29kZWMtPm1Jc1N0cmVhbUNvcnJ1cHRGcmVlICYmIGRhdGExID09IChPTVhfVTMyKU9NWF9FcnJvclN0cmVhbUNvcnJ1cHQpIHsKKyAgICAgICAgQUxPR1YoIlslc10gaGFuZGxlIE9NWF9FcnJvclN0cmVhbUNvcnJ1cHQgYXMgYSBub3JtYWwgb3BlcmF0aW9uIiwKKyAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKICAgICBBTE9HRSgiWyVzXSBFUlJPUigweCUwOHgpIiwgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBkYXRhMSk7CiAKICAgICAvLyB2ZXJpZnkgT01YIGNvbXBvbmVudCBzZW5kcyBiYWNrIGFuIGVycm9yIHdlIGV4cGVjdC4KQEAgLTYxMDksNiArNjIwMywxMyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgaW50MzJfdCBjdm87CisgICAgaWYgKG1Db2RlYy0+bU5hdGl2ZVdpbmRvdyAhPSBOVUxMICYmIGJ1ZmZlciAhPSBOVUxMICYmCisgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjdm8iLCAmY3ZvKSkgeworICAgICAgICBBTE9HVigiY3ZvKCVkKSBmb3VuZCBpbiBidWZmZXIgIyV1IiwgY3ZvLCBidWZmZXJJRCk7CisgICAgICAgIHNldE5hdGl2ZVdpbmRvd1JvdGF0aW9uKG1Db2RlYy0+bU5hdGl2ZVdpbmRvdy5nZXQoKSwgY3ZvKTsKKyAgICB9CisKICAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVM7CiAgICAgaW5mby0+bURhdGEgPSBidWZmZXI7CiAKQEAgLTYyMDcsNyArNjMwOCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRwdXRNb2RlID09IEZSRUVfQlVGRkVSUyA/ICJGUkVFIiA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dE1vZGUgPT0gS0VFUF9CVUZGRVJTID8gIktFRVAiIDogIlJFU1VCTUlUIikpOwogICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0TW9kZSA9PSBSRVNVQk1JVF9CVUZGRVJTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnN1Ym1pdE91dHB1dE1ldGFkYXRhQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPnN1Ym1pdE91dHB1dE1ldGFkYXRhQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvZGVjLT5tSXNMb3dMYXRlbmN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGVyciA9PSBPSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtQ29kZWMtPm1NZXRhZGF0YUJ1ZmZlcnNUb1N1Ym1pdCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXliZVBvc3RFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyUmVxdWVzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGluZm8tPmNoZWNrUmVhZEZlbmNlKCJvbklucHV0QnVmZmVyRmlsbGVkIik7CkBAIC02NzU3LDYgKzY4NjMsNyBAQAogICAgIEFMT0dWKCJvbkFsbG9jYXRlQ29tcG9uZW50Iik7CiAKICAgICBDSEVDSyhtQ29kZWMtPm1PTVhOb2RlID09IE5VTEwpOworICAgIG1Db2RlYy0+bUZhdGFsRXJyb3IgPSBmYWxzZTsKIAogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPTVhNZXNzYWdlTGlzdCwgbUNvZGVjKTsKICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNvZGVjLT5tTm9kZUdlbmVyYXRpb24gKyAxKTsKQEAgLTczNTIsNiArNzQ1OSw5IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CisgICAgaWYgKG1Db2RlYy0+bUlzTG93TGF0ZW5jeSkgeworICAgICAgICBtYXliZVBvc3RFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyUmVxdWVzdCgpOworICAgIH0KIAogICAgIC8vICoqKiBOT1RFOiBUSEUgRk9MTE9XSU5HIFdPUktBUk9VTkQgV0lMTCBCRSBSRU1PVkVEICoqKgogICAgIG1Db2RlYy0+c2lnbmFsU3VibWl0T3V0cHV0TWV0YWRhdGFCdWZmZXJJZkVPU193b3JrYXJvdW5kKCk7CkBAIC03NjU4LDggKzc3NjgsOCBAQAogICAgICAgICBtSW5wdXRGb3JtYXQtPnNldEludDY0KCJhbmRyb2lkLl9zdG9wLXRpbWUtb2Zmc2V0LXVzIiwgc3RvcFRpbWVPZmZzZXRVcyk7CiAgICAgfQogCi0gICAgaW50MzJfdCBkdW1teTsKLSAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoInJlcXVlc3Qtc3luYyIsICZkdW1teSkpIHsKKyAgICBpbnQzMl90IHRtcDsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoInJlcXVlc3Qtc3luYyIsICZ0bXApKSB7CiAgICAgICAgIHN0YXR1c190IGVyciA9IHJlcXVlc3RJRFJGcmFtZSgpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTgyODYsMTcgKzgzOTYsMzggQEAKICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICB9CiAgICAgICAgIGNhc2Uga1doYXRSZXN1bWU6Ci0gICAgICAgIGNhc2Uga1doYXRTZXRQYXJhbWV0ZXJzOgogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobXNnLT53aGF0KCkgPT0ga1doYXRSZXN1bWUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBEZWZlcnJpbmcgcmVzdW1lIiwgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIERlZmVycmluZyByZXN1bWUiLCBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOwogCiAgICAgICAgICAgICBtQ29kZWMtPmRlZmVyTWVzc2FnZShtc2cpOwogICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRTZXRQYXJhbWV0ZXJzOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicGFyYW1zIiwgJnBhcmFtcykpOworCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBoZHIxMFBsdXNJbmZvOworICAgICAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwgJmhkcjEwUGx1c0luZm8pKSB7CisgICAgICAgICAgICAgICAgaWYgKGhkcjEwUGx1c0luZm8gIT0gbnVsbHB0ciAmJiBoZHIxMFBsdXNJbmZvLT5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKW1Db2RlYy0+c2V0SGRyMTBQbHVzSW5mbyhoZHIxMFBsdXNJbmZvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGFyYW1zLT5yZW1vdmVFbnRyeUF0KHBhcmFtcy0+ZmluZEVudHJ5QnlOYW1lKCJoZHIxMC1wbHVzLWluZm8iKSk7CisKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1zLT5jb3VudEVudHJpZXMoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgicGFyYW1zIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1zZy0+Y291bnRFbnRyaWVzKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5kZWZlck1lc3NhZ2UobXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0Rm9yY2VTdGF0ZVRyYW5zaXRpb246CiAgICAgICAgIHsKICAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbiA9IDA7CkBAIC04MzA3LDYgKzg0MzgsMjMgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdFNldFN1cmZhY2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIERlZmVycmluZyBzZXRTdXJmYWNlIiwgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgICAgIG1Db2RlYy0+ZGVmZXJNZXNzYWdlKG1zZyk7CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgT0spOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKworICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2Uga1doYXRDaGVja0lmU3R1Y2s6CiAgICAgICAgIHsKICAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbiA9IDA7CkBAIC04NDA3LDYgKzg1NTUsMTUgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0V2ZW50Q29uZmlnVXBkYXRlOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19FUShkYXRhMSwgKE9NWF9VMzIpa1BvcnRJbmRleE91dHB1dCk7CisKKyAgICAgICAgICAgIG1Db2RlYy0+b25Db25maWdVcGRhdGUoKE9NWF9JTkRFWFRZUEUpZGF0YTIpOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQmFzZVN0YXRlOjpvbk9NWEV2ZW50KGV2ZW50LCBkYXRhMSwgZGF0YTIpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCmluZGV4IDNiY2NiN2IuLjVkOTU5Y2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icApAQCAtMSwzICsxLDIwIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIl0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLApAQCAtOCw2ICsyNSwxMiBAQAogICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCiAgICAgXSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KIAogY2NfbGlicmFyeV9zdGF0aWMgewpAQCAtMzQsNiArNTcsMTIgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiCiAgICAgXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQogCiBjY19saWJyYXJ5X3N0YXRpYyB7CkBAIC01OCw5ICs4NywxOCBAQAogICAgIH0sCiAKICAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsibGlibWVkaWFuZGsiXSwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCisKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIH0KIApAQCAtMTMyLDggKzE3MCwxMCBAQAogCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAotICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfZGF0YXNvdXJjZV9oZWFkZXJzIiwKICAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC0xNTAsNiArMTkwLDE4IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgIH0sCisKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICAgICAgbGludXg6IHsKKyAgICAgICAgICAgIGNmbGFnczogWworICAgICAgICAgICAgICAgICItRERJU0FCTEVfQVVESU9fU1lTVEVNX09GRkxPQUQiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfQorICAgIH0sCiB9CiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCmluZGV4IDliM2Y0MjAuLjRlMzRhMjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcApAQCAtNzk3LDcgKzc5Nyw3IEBACiAgICAgbVN0YXJ0VGltZVVzID0gMDsKICAgICBtTnVtSW5wdXRCdWZmZXJzID0gMDsKICAgICBtRW5jb2RlckZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKLSAgICBtRW5jb2RlckRhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVjBfQlQ3MDk7CisgICAgbUVuY29kZXJEYXRhU3BhY2UgPSBtQnVmZmVyRGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9WMF9CVDcwOTsKIAogICAgIGlmIChtZXRhKSB7CiAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7CkBAIC04MTcsNiArODE3LDcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvclNwYWNlLCAmbUVuY29kZXJEYXRhU3BhY2UpKSB7CiAgICAgICAgICAgICBBTE9HSSgiVXNpbmcgZW5jb2RlciBkYXRhIHNwYWNlOiAlI3giLCBtRW5jb2RlckRhdGFTcGFjZSk7CisgICAgICAgICAgICBtQnVmZmVyRGF0YVNwYWNlID0gbUVuY29kZXJEYXRhU3BhY2U7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTExMTQsNiArMTExNSwxMSBAQAogICAgICAgICAoKmJ1ZmZlciktPnNldE9ic2VydmVyKHRoaXMpOwogICAgICAgICAoKmJ1ZmZlciktPmFkZF9yZWYoKTsKICAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgZnJhbWVUaW1lKTsKKyAgICAgICAgaWYgKG1CdWZmZXJEYXRhU3BhY2UgIT0gbUVuY29kZXJEYXRhU3BhY2UpIHsKKyAgICAgICAgICAgIEFMT0dEKCJEYXRhIHNwYWNlIHVwZGF0ZWQgdG8gJXgiLCBtQnVmZmVyRGF0YVNwYWNlKTsKKyAgICAgICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUNvbG9yU3BhY2UsIG1CdWZmZXJEYXRhU3BhY2UpOworICAgICAgICAgICAgbUVuY29kZXJEYXRhU3BhY2UgPSBtQnVmZmVyRGF0YVNwYWNlOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KQEAgLTEzOTEsNiArMTM5Nyw3IEBACiAgICAgLy8gRmluZCBhIGF2YWlsYWJsZSBtZW1vcnkgc2xvdCB0byBzdG9yZSB0aGUgYnVmZmVyIGFzIFZpZGVvTmF0aXZlTWV0YWRhdGEuCiAgICAgc3A8SU1lbW9yeT4gZGF0YSA9ICptTWVtb3J5QmFzZXMuYmVnaW4oKTsKICAgICBtTWVtb3J5QmFzZXMuZXJhc2UobU1lbW9yeUJhc2VzLmJlZ2luKCkpOworICAgIG1CdWZmZXJEYXRhU3BhY2UgPSBidWZmZXIubURhdGFTcGFjZTsKIAogICAgIHNzaXplX3Qgb2Zmc2V0OwogICAgIHNpemVfdCBzaXplOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAKaW5kZXggNzM0ZjViYi4uNGJhODViYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwCkBAIC00Myw3ICs0Myw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtCdWZmZXJUaW1lT3V0VXMgPSAxMDAwMExMOyAvLyAxMCBtc2VjCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtSZXRyeUNvdW50ID0gNTA7IC8vIG11c3QgYmUgPjAKK3N0YXRpYyBjb25zdCBzaXplX3Qga1JldHJ5Q291bnQgPSAxMDA7IC8vIG11c3QgYmUgPjAKIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtEZWZhdWx0U2FtcGxlRHVyYXRpb25VcyA9IDMzMzMzTEw7IC8vIDMzbXMKIAogc3A8SU1lbW9yeT4gYWxsb2NWaWRlb0ZyYW1lKGNvbnN0IHNwPE1ldGFEYXRhPiYgdHJhY2tNZXRhLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSGV2Y1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hldmNVdGlscy5jcHAKaW5kZXggYjM0NzQ1My4uZTQ3OTRkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSGV2Y1V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IZXZjVXRpbHMuY3BwCkBAIC0zMCw2ICszMCw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCisjZGVmaW5lIFVOVVNFRF9QQVJBTSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCB1aW50OF90IGtIZXZjTmFsVW5pdFR5cGVzWzVdID0gewpAQCAtMzc1LDggKzM3Nyw1NiBAQAogICAgIHJldHVybiByZWFkZXIub3ZlclJlYWQoKSA/IEVSUk9SX01BTEZPUk1FRCA6IE9LOwogfQogCit2b2lkIEhldmNQYXJhbWV0ZXJTZXRzOjpGaW5kSEVWQ0RpbWVuc2lvbnMoY29uc3Qgc3A8QUJ1ZmZlcj4gJlNwc0J1ZmZlciwgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCkKK3sKKyAgICBBTE9HRCgiRmluZEhFVkNEaW1lbnNpb25zIik7CisgICAgLy8gU2VlIFJlYy4gSVRVLVQgSC4yNjUgdjMgKDA0LzIwMTUpIENoYXB0ZXIgNy4zLjIuMiBmb3IgcmVmZXJlbmNlCisgICAgQUJpdFJlYWRlciByZWFkZXIoU3BzQnVmZmVyLT5kYXRhKCkgKyAxLCBTcHNCdWZmZXItPnNpemUoKSAtIDEpOworICAgIC8vIFNraXAgc3BzX3ZpZGVvX3BhcmFtZXRlcl9zZXRfaWQKKyAgICByZWFkZXIuc2tpcEJpdHMoNCk7CisgICAgdWludDhfdCBtYXhTdWJMYXllcnNNaW51czEgPSByZWFkZXIuZ2V0Qml0c1dpdGhGYWxsYmFjaygzLCAwKTsKKyAgICAvLyBTa2lwIHNwc190ZW1wb3JhbF9pZF9uZXN0aW5nX2ZsYWc7CisgICAgcmVhZGVyLnNraXBCaXRzKDEpOworICAgIC8vIFNraXAgZ2VuZXJhbCBwcm9maWxlCisgICAgcmVhZGVyLnNraXBCaXRzKDk2KTsKKyAgICBpZiAobWF4U3ViTGF5ZXJzTWludXMxID4gMCkgeworICAgICAgICBib29sIHN1YkxheWVyUHJvZmlsZVByZXNlbnRGbGFnWzhdOworICAgICAgICBib29sIHN1YkxheWVyTGV2ZWxQcmVzZW50RmxhZ1s4XTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhTdWJMYXllcnNNaW51czE7ICsraSkgeworICAgICAgICAgICAgc3ViTGF5ZXJQcm9maWxlUHJlc2VudEZsYWdbaV0gPSByZWFkZXIuZ2V0Qml0c1dpdGhGYWxsYmFjaygxLCAwKTsKKyAgICAgICAgICAgIHN1YkxheWVyTGV2ZWxQcmVzZW50RmxhZ1tpXSA9IHJlYWRlci5nZXRCaXRzV2l0aEZhbGxiYWNrKDEsIDApOworICAgICAgICB9CisgICAgICAgIC8vIFNraXAgcmVzZXJ2ZWQKKyAgICAgICAgcmVhZGVyLnNraXBCaXRzKDIgKiAoOCAtIG1heFN1YkxheWVyc01pbnVzMSkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heFN1YkxheWVyc01pbnVzMTsgKytpKSB7CisgICAgICAgICAgICBpZiAoc3ViTGF5ZXJQcm9maWxlUHJlc2VudEZsYWdbaV0pIHsKKyAgICAgICAgICAgICAgICAvLyBTa2lwIHByb2ZpbGUKKyAgICAgICAgICAgICAgICByZWFkZXIuc2tpcEJpdHMoODgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN1YkxheWVyTGV2ZWxQcmVzZW50RmxhZ1tpXSkgeworICAgICAgICAgICAgICAgIC8vIFNraXAgc3ViX2xheWVyX2xldmVsX2lkY1tpXQorICAgICAgICAgICAgICAgIHJlYWRlci5za2lwQml0cyg4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBTa2lwIHNwc19zZXFfcGFyYW1ldGVyX3NldF9pZAorICAgIHNraXBVRSgmcmVhZGVyKTsKKyAgICB1aW50OF90IGNocm9tYUZvcm1hdElkYyA9IHBhcnNlVUVXaXRoRmFsbGJhY2soJnJlYWRlciwgMCk7CisgICAgaWYgKGNocm9tYUZvcm1hdElkYyA9PSAzKSB7CisgICAgICAgIC8vIFNraXAgc2VwYXJhdGVfY29sb3VyX3BsYW5lX2ZsYWcKKyAgICAgICAgcmVhZGVyLnNraXBCaXRzKDEpOworICAgIH0KKyAgICBza2lwVUUoJnJlYWRlcik7CisgICAgc2tpcFVFKCZyZWFkZXIpOworCisgICAgLy8gcGljX3dpZHRoX2luX2x1bWFfc2FtcGxlcworICAgICp3aWR0aCA9IHBhcnNlVUVXaXRoRmFsbGJhY2soJnJlYWRlciwgMCk7CisgICAgLy8gcGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXMKKyAgICAqaGVpZ2h0ID0gcGFyc2VVRVdpdGhGYWxsYmFjaygmcmVhZGVyLCAwKTsKK30KKwogc3RhdHVzX3QgSGV2Y1BhcmFtZXRlclNldHM6OnBhcnNlUHBzKAotICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhIF9fdW51c2VkLCBzaXplX3Qgc2l6ZSBfX3VudXNlZCkgeworICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhIFVOVVNFRF9QQVJBTSwgc2l6ZV90IHNpemUgVU5VU0VEX1BBUkFNKSB7CiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKaW5kZXggZDk5NTk2ZS4uYjJmYWU5NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcApAQCAtNDIxNywxMyArNDIxNywyMCBAQAogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlQ29sckJveCgpIHsKICAgICBDb2xvckFzcGVjdHMgYXNwZWN0czsKICAgICBtZW1zZXQoJmFzcGVjdHMsIDAsIHNpemVvZihhc3BlY3RzKSk7CisgICAgLy8gQ29sb3IgbWV0YWRhdGEgbWF5IGhhdmUgY2hhbmdlZC4KKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwogICAgIC8vIFRSSUNLWTogdXNpbmcgfCBpbnN0ZWFkIG9mIHx8IGJlY2F1c2Ugd2Ugd2FudCB0byBleGVjdXRlIGFsbCBmaW5kSW50MzItcwotICAgIGlmIChtTWV0YS0+ZmluZEludDMyKGtLZXlDb2xvclByaW1hcmllcywgKGludDMyX3QqKSZhc3BlY3RzLm1QcmltYXJpZXMpCi0gICAgICAgICAgICB8IG1NZXRhLT5maW5kSW50MzIoa0tleVRyYW5zZmVyRnVuY3Rpb24sIChpbnQzMl90KikmYXNwZWN0cy5tVHJhbnNmZXIpCi0gICAgICAgICAgICB8IG1NZXRhLT5maW5kSW50MzIoa0tleUNvbG9yTWF0cml4LCAoaW50MzJfdCopJmFzcGVjdHMubU1hdHJpeENvZWZmcykKLSAgICAgICAgICAgIHwgbU1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JSYW5nZSwgKGludDMyX3QqKSZhc3BlY3RzLm1SYW5nZSkpIHsKKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvclByaW1hcmllcywgKGludDMyX3QqKSZhc3BlY3RzLm1QcmltYXJpZXMpCisgICAgICAgICAgICB8IG1ldGEtPmZpbmRJbnQzMihrS2V5VHJhbnNmZXJGdW5jdGlvbiwgKGludDMyX3QqKSZhc3BlY3RzLm1UcmFuc2ZlcikKKyAgICAgICAgICAgIHwgbWV0YS0+ZmluZEludDMyKGtLZXlDb2xvck1hdHJpeCwgKGludDMyX3QqKSZhc3BlY3RzLm1NYXRyaXhDb2VmZnMpCisgICAgICAgICAgICB8IG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JSYW5nZSwgKGludDMyX3QqKSZhc3BlY3RzLm1SYW5nZSkpIHsKICAgICAgICAgaW50MzJfdCBwcmltYXJpZXMsIHRyYW5zZmVyLCBjb2VmZnM7CiAgICAgICAgIGJvb2wgZnVsbFJhbmdlOworICAgICAgICBBTE9HVigicHJpbWFyaWVzPSVzIHRyYW5zZmVyPSVzIG1hdHJpeD0lcyByYW5nZT0lcyIsCisgICAgICAgICAgICAgICAgYXNTdHJpbmcoYXNwZWN0cy5tUHJpbWFyaWVzKSwKKyAgICAgICAgICAgICAgICBhc1N0cmluZyhhc3BlY3RzLm1UcmFuc2ZlciksCisgICAgICAgICAgICAgICAgYXNTdHJpbmcoYXNwZWN0cy5tTWF0cml4Q29lZmZzKSwKKyAgICAgICAgICAgICAgICBhc1N0cmluZyhhc3BlY3RzLm1SYW5nZSkpOwogICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0Q29kZWNDb2xvckFzcGVjdHNUb0lzb0FzcGVjdHMoCiAgICAgICAgICAgICAgICAgYXNwZWN0cywgJnByaW1hcmllcywgJnRyYW5zZmVyLCAmY29lZmZzLCAmZnVsbFJhbmdlKTsKICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgiY29sciIpOwpAQCAtNDIzMyw2ICs0MjQwLDggQEAKICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KGNvZWZmcyk7CiAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KGludDhfdChmdWxsUmFuZ2UgPyAweDgwIDogMHgwKSk7CiAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7IC8vIGNvbHIKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigibm8gY29sb3IgaW5mb3JtYXRpb24iKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKaW5kZXggNTUzZjU5YS4uNmJmNzYxMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKQEAgLTM1NywxMSArMzU3LDI0IEBACiAgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmbVByb2R1Y2VyLCAmbUNvbnN1bWVyKTsKICAgICAgICAgbVN1cmZhY2UgPSBuZXcgU3VyZmFjZShtUHJvZHVjZXIsIGZhbHNlIC8qIGNvbnRyb2xsZWRCeUFwcCAqLyk7CiAgICAgICAgIHN0cnVjdCBDb25zdW1lckxpc3RlbmVyIDogcHVibGljIEJuQ29uc3VtZXJMaXN0ZW5lciB7Ci0gICAgICAgICAgICB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYpIG92ZXJyaWRlIHt9CisgICAgICAgICAgICBDb25zdW1lckxpc3RlbmVyKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICZjb25zdW1lcikgeworICAgICAgICAgICAgICAgIG1Db25zdW1lciA9IGNvbnN1bWVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgQnVmZmVySXRlbSBidWZmZXI7CisgICAgICAgICAgICAgICAgLy8gY29uc3VtZSBidWZmZXIKKyAgICAgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lciA9IG1Db25zdW1lci5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnN1bWVyICE9IG51bGxwdHIgJiYgY29uc3VtZXItPmFjcXVpcmVCdWZmZXIoJmJ1ZmZlciwgMCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3VtZXItPnJlbGVhc2VCdWZmZXIoYnVmZmVyLm1TbG90LCBidWZmZXIubUZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLCBidWZmZXIubUZlbmNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IG1Db25zdW1lcjsKICAgICAgICAgICAgIHZvaWQgb25CdWZmZXJzUmVsZWFzZWQoKSBvdmVycmlkZSB7fQogICAgICAgICAgICAgdm9pZCBvblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpIG92ZXJyaWRlIHt9CiAgICAgICAgIH07Ci0gICAgICAgIHNwPENvbnN1bWVyTGlzdGVuZXI+IGxpc3RlbmVye25ldyBDb25zdW1lckxpc3RlbmVyfTsKKyAgICAgICAgc3A8Q29uc3VtZXJMaXN0ZW5lcj4gbGlzdGVuZXJ7bmV3IENvbnN1bWVyTGlzdGVuZXIobUNvbnN1bWVyKX07CiAgICAgICAgIG1Db25zdW1lci0+Y29uc3VtZXJDb25uZWN0KGxpc3RlbmVyLCBmYWxzZSk7CiAgICAgICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJOYW1lKFN0cmluZzh7Ik1lZGlhQ29kZWMucmVsZWFzZSJ9KTsKICAgICAgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lclVzYWdlQml0cyh1c2FnZSk7CkBAIC02NzQsNiArNjg3LDkgQEAKICAgICAgIG1EZXF1ZXVlSW5wdXRSZXBseUlEKDApLAogICAgICAgbURlcXVldWVPdXRwdXRUaW1lb3V0R2VuZXJhdGlvbigwKSwKICAgICAgIG1EZXF1ZXVlT3V0cHV0UmVwbHlJRCgwKSwKKyAgICAgIG1UdW5uZWxlZElucHV0V2lkdGgoMCksCisgICAgICBtVHVubmVsZWRJbnB1dEhlaWdodCgwKSwKKyAgICAgIG1UdW5uZWxlZChmYWxzZSksCiAgICAgICBtSGF2ZUlucHV0U3VyZmFjZShmYWxzZSksCiAgICAgICBtSGF2ZVBlbmRpbmdJbnB1dEJ1ZmZlcnMoZmFsc2UpLAogICAgICAgbUNwdUJvb3N0UmVxdWVzdGVkKGZhbHNlKSwKQEAgLTEzNDQsNiArMTM2MCw4IEBACiAgICAgLy8gc2F2ZSBtc2cgZm9yIHJlc2V0CiAgICAgbUNvbmZpZ3VyZU1zZyA9IG1zZzsKIAorICAgIHNwPEFNZXNzYWdlPiBjYWxsYmFjayA9IG1DYWxsYmFjazsKKwogICAgIHN0YXR1c190IGVycjsKICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CiAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKG1GbGFncyAmIGtGbGFnSXNTZWN1cmUsIG1Jc1ZpZGVvKSk7CkBAIC0xMzUxLDE2ICsxMzY5LDEyIEBACiAgICAgLy8gdGhlIHJlY2xhaW1SZXNvdXJjZSBjYWxsIGRvZXNuJ3QgY29uc2lkZXIgdGhlIHJlcXVlc3RlcidzIGJ1ZmZlciBzaXplIGZvciBub3cuCiAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlOjpHcmFwaGljTWVtb3J5UmVzb3VyY2UoMSkpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IGtNYXhSZXRyeTsgKytpKSB7Ci0gICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgLy8gRG9uJ3QgdHJ5IHRvIHJlY2xhaW0gcmVzb3VyY2UgZm9yIHRoZSBmaXJzdCB0aW1lLgotICAgICAgICAgICAgaWYgKCFtUmVzb3VyY2VNYW5hZ2VyUHJveHktPnJlY2xhaW1SZXNvdXJjZShyZXNvdXJjZXMpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgICAgIGVyciA9IFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKICAgICAgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKKyAgICAgICAgICAgIGlmIChpc1Jlc291cmNlRXJyb3IoZXJyKSAmJiAhbVJlc291cmNlTWFuYWdlclByb3h5LT5yZWNsYWltUmVzb3VyY2UocmVzb3VyY2VzKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gTWVkaWFDb2RlYyBub3cgc2V0IHN0YXRlIHRvIFVOSU5JVElBTElaRUQgdXBvbiBhbnkgZmF0YWwgZXJyb3IuCiAgICAgICAgICAgICAvLyBUbyBtYWludGFpbiBiYWNrd2FyZC1jb21wYXRpYmlsaXR5LCBkbyBhIHJlc2V0KCkgdG8gcHV0IGNvZGVjCiAgICAgICAgICAgICAvLyBiYWNrIGludG8gSU5JVElBTElaRUQgc3RhdGUuCkBAIC0xMzY4LDcgKzEzODIsMTggQEAKICAgICAgICAgICAgIC8vIHRoZSBjb25maWd1cmUgZmFpbHVyZSBpcyBkdWUgdG8gd3Jvbmcgc3RhdGUuCiAKICAgICAgICAgICAgIEFMT0dFKCJjb25maWd1cmUgZmFpbGVkIHdpdGggZXJyIDB4JTA4eCwgcmVzZXR0aW5nLi4uIiwgZXJyKTsKLSAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIyID0gcmVzZXQoKTsKKyAgICAgICAgICAgIGlmIChlcnIyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoInJldHJ5aW5nIGNvbmZpZ3VyZTogZmFpbGVkIHRvIHJlc2V0IGNvZGVjICglMDh4KSIsIGVycjIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBlcnIyID0gc2V0Q2FsbGJhY2soY2FsbGJhY2spOworICAgICAgICAgICAgICAgIGlmIChlcnIyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJyZXRyeWluZyBjb25maWd1cmU6IGZhaWxlZCB0byBzZXQgY2FsbGJhY2sgKCUwOHgpIiwgZXJyMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoIWlzUmVzb3VyY2VFcnJvcihlcnIpKSB7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE0NzcsNiArMTUwMiw4IEBACiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpzdGFydCgpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIHRoaXMpOwogCisgICAgc3A8QU1lc3NhZ2U+IGNhbGxiYWNrOworCiAgICAgc3RhdHVzX3QgZXJyOwogICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKICAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UobUZsYWdzICYga0ZsYWdJc1NlY3VyZSwgbUlzVmlkZW8pKTsKQEAgLTE1MDEsNiArMTUyOCwyMCBAQAogICAgICAgICAgICAgICAgIEFMT0dFKCJyZXRyeWluZyBzdGFydDogZmFpbGVkIHRvIGNvbmZpZ3VyZSBjb2RlYyIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBzZXRDYWxsYmFjayhjYWxsYmFjayk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgicmV0cnlpbmcgc3RhcnQ6IGZhaWxlZCB0byBzZXQgY2FsbGJhY2siKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dEKCJzdWNjZWVkIHRvIHNldCBjYWxsYmFjayBmb3IgcmVjbGFpbSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gS2VlcCBjYWxsYmFjayBtZXNzYWdlIGFmdGVyIHRoZSBmaXJzdCBpdGVyYXRpb24gaWYgbmVjZXNzYXJ5LgorICAgICAgICBpZiAoaSA9PSAwICYmIG1DYWxsYmFjayAhPSBudWxscHRyICYmIG1GbGFncyAmIGtGbGFnSXNBc3luYykgeworICAgICAgICAgICAgY2FsbGJhY2sgPSBtQ2FsbGJhY2s7CisgICAgICAgICAgICBBTE9HRCgia2VlcCBjYWxsYmFjayBtZXNzYWdlIGZvciByZWNsYWltIik7CiAgICAgICAgIH0KIAogICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CkBAIC0xOTcyLDYgKzIwMTMsMjIgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE1lZGlhQ29kZWM6OnF1ZXJ5U3VwcG9ydGVkVmVuZG9yUGFyYW1ldGVycyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gKm5hbWVzKSB7CisgICAgcmV0dXJuIG1Db2RlYy0+cXVlcnlTdXBwb3J0ZWRQYXJhbWV0ZXJzKG5hbWVzKTsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlYzo6ZGVzY3JpYmVQYXJhbWV0ZXIoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIENvZGVjUGFyYW1ldGVyRGVzY3JpcHRvciAqZGVzYykgeworICAgIHJldHVybiBtQ29kZWMtPmRlc2NyaWJlUGFyYW1ldGVyKG5hbWUsIGRlc2MpOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpzdWJzY3JpYmVUb1ZlbmRvclBhcmFtZXRlcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZuYW1lcykgeworICAgIHJldHVybiBtQ29kZWMtPnN1YnNjcmliZVRvUGFyYW1ldGVycyhuYW1lcyk7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWM6OnVuc3Vic2NyaWJlRnJvbVZlbmRvclBhcmFtZXRlcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZuYW1lcykgeworICAgIHJldHVybiBtQ29kZWMtPnVuc3Vic2NyaWJlRnJvbVBhcmFtZXRlcnMobmFtZXMpOworfQorCiB2b2lkIE1lZGlhQ29kZWM6OnJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24sIHRoaXMpOwogICAgIG1zZy0+c2V0TWVzc2FnZSgibm90aWZ5Iiwgbm90aWZ5KTsKQEAgLTIyMjIsNiArMjI3OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVE9QUElORzoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdTYXdNZWRpYVNlcnZlckRpZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvc3RQZW5kaW5nUmVwbGllcyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gUkVMRUFTSU5HICYmICFtUmVwbHlJRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlJlbGVhc2luZyBhc3luY2hyb25vdXNseSwgc28gbm90aGluZyB0byByZXBseSBoZXJlLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVkaWFTZXJ2ZXIgZGllZCwgdGhlcmUgZGVmaW5pdGVseSB3b24ndAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSBhIHNodXRkb3duIGNvbXBsZXRlIG5vdGlmaWNhdGlvbiBhZnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwuCkBAIC0yMjMzLDcgKzIyOTUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBSRUxFQVNJTkcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcyhvcmlnaW4gKyAiOmRlYWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc3RQZW5kaW5nUmVwbGllcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcyhvcmlnaW4gKyAiOmRlYWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXJyb3JSZXNwb25zZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1SZXBseUlEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRFcnJvclJlc3BvbnNlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjg5OSw2ICsyOTY1LDE0IEBACiAKICAgICAgICAgICAgIGV4dHJhY3RDU0QoZm9ybWF0KTsKIAorICAgICAgICAgICAgaW50MzJfdCB0dW5uZWxlZDsKKyAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigiZmVhdHVyZS10dW5uZWxlZC1wbGF5YmFjayIsICZ0dW5uZWxlZCkgJiYgdHVubmVsZWQgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJDb25maWd1cmluZyBUVU5ORUxFRCB2aWRlbyBwbGF5YmFjay4iKTsKKyAgICAgICAgICAgICAgICBtVHVubmVsZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVHVubmVsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgbUNvZGVjLT5pbml0aWF0ZUNvbmZpZ3VyZUNvbXBvbmVudChmb3JtYXQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTMxMTIsMTYgKzMxODYsMjEgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSWYgd2UncmUgZmx1c2hpbmcsIHN0b3BwaW5nLCBjb25maWd1cmluZyBvciBzdGFydGluZyAgYnV0CisgICAgICAgICAgICAvLyBJZiB3ZSdyZSBmbHVzaGluZywgY29uZmlndXJpbmcgb3Igc3RhcnRpbmcgIGJ1dAogICAgICAgICAgICAgLy8gcmVjZWl2ZWQgYSByZWxlYXNlIHJlcXVlc3QsIHBvc3QgdGhlIHJlcGx5IGZvciB0aGUgcGVuZGluZyBjYWxsCiAgICAgICAgICAgICAvLyBmaXJzdCwgYW5kIGNvbnNpZGVyIGl0IGRvbmUuIFRoZSByZXBseSB0b2tlbiB3aWxsIGJlIHJlcGxhY2VkCiAgICAgICAgICAgICAvLyBhZnRlciB0aGlzLCBhbmQgd2UnbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gcmVwbHkuCi0gICAgICAgICAgICBpZiAobVN0YXRlID09IEZMVVNISU5HIHx8IG1TdGF0ZSA9PSBTVE9QUElORwotICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUgPT0gQ09ORklHVVJJTkcgfHwgbVN0YXRlID09IFNUQVJUSU5HKSB7CisgICAgICAgICAgICBpZiAobVN0YXRlID09IEZMVVNISU5HIHx8IG1TdGF0ZSA9PSBDT05GSUdVUklORyB8fCBtU3RhdGUgPT0gU1RBUlRJTkcpIHsKICAgICAgICAgICAgICAgICAvLyBtUmVwbHkgaXMgYWx3YXlzIHNldCBpZiBpbiB0aGVzZSBzdGF0ZXMuCiAgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcygKICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJrV2hhdFJlbGVhc2U6IikgKyBzdGF0ZVN0cmluZyhtU3RhdGUpKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIHdlJ3JlIHN0b3BwaW5nIGJ1dCByZWNlaXZlZCBhIHJlbGVhc2UgcmVxdWVzdCwgcG9zdCB0aGUgcmVwbHkKKyAgICAgICAgICAgIC8vIGZvciB0aGUgcGVuZGluZyBjYWxsIGlmIG5lY2Vzc2FyeS4gTm90ZSB0aGF0IHRoZSByZXBseSBtYXkgaGF2ZSBiZWVuCisgICAgICAgICAgICAvLyBhbHJlYWR5IHBvc3RlZCBkdWUgdG8gYW4gZXJyb3IuCisgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUT1BQSU5HICYmIG1SZXBseUlEKSB7CisgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcygia1doYXRSZWxlYXNlOlNUT1BQSU5HIik7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ1Nhd01lZGlhU2VydmVyRGllKSB7CiAgICAgICAgICAgICAgICAgLy8gSXQncyBkZWFkLCBKaW0uIERvbid0IGV4cGVjdCBpbml0aWF0ZVNodXRkb3duIHRvIHlpZWxkCkBAIC0zNjE2LDcgKzM2OTUsOCBAQAogICAgICAgICAvLyBmb3JtYXQgYXMgbmVjZXNzYXJ5LgogICAgICAgICBpbnQzMl90IGZsYWdzID0gMDsKICAgICAgICAgKHZvaWQpIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImZsYWdzIiwgJmZsYWdzKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEJVRkZFUl9GTEFHX0NPREVDQ09ORklHKSAmJiAhKG1GbGFncyAmIGtGbGFnSXNTZWN1cmUpKSB7CisgICAgICAgIGlmICgoZmxhZ3MgJiBCVUZGRVJfRkxBR19DT0RFQ0NPTkZJRykgJiYgIShtRmxhZ3MgJiBrRmxhZ0lzU2VjdXJlKQorICAgICAgICAgICAgICAgICYmICFtT3duZXJOYW1lLnN0YXJ0c1dpdGgoImNvZGVjMjo6IikpIHsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9CiAgICAgICAgICAgICAgICAgYW1lbmRPdXRwdXRGb3JtYXRXaXRoQ29kZWNTcGVjaWZpY0RhdGEoYnVmZmVyKTsKIApAQCAtMzk4Miw3ICs0MDYyLDE4IEBACiAgICAgaWYgKGhhc0NyeXB0b09yRGVzY3JhbWJsZXIoKSAmJiAhYzJCdWZmZXIgJiYgIW1lbW9yeSkgewogICAgICAgICBBU3RyaW5nICplcnJvckRldGFpbE1zZzsKICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigiZXJyb3JEZXRhaWxNc2ciLCAodm9pZCAqKikmZXJyb3JEZXRhaWxNc2cpKTsKLQorICAgICAgICAvLyBOb3RpZnkgbUNyeXB0byBvZiB2aWRlbyByZXNvbHV0aW9uIGNoYW5nZXMKKyAgICAgICAgaWYgKG1UdW5uZWxlZCAmJiBtQ3J5cHRvICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgICAgIGlmIChtSW5wdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpICYmCisgICAgICAgICAgICAgICAgbUlucHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpICYmIHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHdpZHRoICE9IG1UdW5uZWxlZElucHV0V2lkdGggfHwgaGVpZ2h0ICE9IG1UdW5uZWxlZElucHV0SGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIG1UdW5uZWxlZElucHV0V2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgbVR1bm5lbGVkSW5wdXRIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIG1DcnlwdG8tPm5vdGlmeVJlc29sdXRpb24od2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGVyciA9IG1CdWZmZXJDaGFubmVsLT5xdWV1ZVNlY3VyZUlucHV0QnVmZmVyKAogICAgICAgICAgICAgICAgIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAobUZsYWdzICYga0ZsYWdJc1NlY3VyZSksCkBAIC00MTAyLDcgKzQxOTMsMTUgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbUJ1ZmZlckNoYW5uZWwtPnJlbmRlck91dHB1dEJ1ZmZlcihidWZmZXIsIHJlbmRlclRpbWVOcyk7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJDaGFubmVsLT5yZW5kZXJPdXRwdXRCdWZmZXIoYnVmZmVyLCByZW5kZXJUaW1lTnMpOworCisgICAgICAgIGlmIChlcnIgPT0gTk9fSU5JVCkgeworICAgICAgICAgICAgQUxPR0UoInJlbmRlcmluZyB0byBub24taW5pdGlsaXplZChvYnNvbGV0ZSkgc3VyZmFjZSIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HSSgicmVuZHJpbmcgb3V0cHV0IGVycm9yICVkIiwgZXJyKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIG1CdWZmZXJDaGFubmVsLT5kaXNjYXJkQnVmZmVyKGJ1ZmZlcik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCmluZGV4IGFjNTRmYTEuLjc5OWNhMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKQEAgLTIwOSw5ICsyMDksMTIgQEAKICAgICAgICAgICAgIEFMT0dEKCJpZ25vcmVkIGEgbnVsbCBidWlsZGVyIik7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBtSW5pdENoZWNrID0gYnVpbGRlci0+YnVpbGRNZWRpYUNvZGVjTGlzdCgmd3JpdGVyKTsKLSAgICAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICBhdXRvIGN1cnJlbnRDaGVjayA9IGJ1aWxkZXItPmJ1aWxkTWVkaWFDb2RlY0xpc3QoJndyaXRlcik7CisgICAgICAgIGlmIChjdXJyZW50Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJpZ25vcmVkIGZhaWxlZCBidWlsZGVyIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBjdXJyZW50Q2hlY2s7CiAgICAgICAgIH0KICAgICB9CiAgICAgd3JpdGVyLndyaXRlR2xvYmFsU2V0dGluZ3MobUdsb2JhbFNldHRpbmdzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKaW5kZXggYzZhZTE1OS4uMDEwN2MzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CkBAIC00MjUsNiArNDI2LDMwIEBACiAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiB9CiAKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OnNldEVuY29kaW5nQml0cmF0ZShpbnQzMl90IGJpdFJhdGUpIHsKKyAgICBBTE9HVigic2V0RW5jb2RpbmdCaXRyYXRlICglZCkiLCBiaXRSYXRlKTsKKworICAgIGlmIChtRW5jb2RlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJzZXRFbmNvZGluZ0JpdHJhdGUgKCVkKSA6IG1FbmNvZGVyIGlzIG51bGwiLCBiaXRSYXRlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlOworICAgIHBhcmFtcy0+c2V0SW50MzIoInZpZGVvLWJpdHJhdGUiLCBiaXRSYXRlKTsKKworICAgIHJldHVybiBtRW5jb2Rlci0+c2V0UGFyYW1ldGVycyhwYXJhbXMpOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpyZXF1ZXN0SURSRnJhbWUoKSB7CisgICAgaWYgKG1FbmNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coInJlcXVlc3RJRFJGcmFtZSA6IG1FbmNvZGVyIGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRW5jb2Rlci0+cmVxdWVzdElEUkZyYW1lKCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9Cit9CisKIE1lZGlhQ29kZWNTb3VyY2U6Ok1lZGlhQ29kZWNTb3VyY2UoCiAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LApAQCAtNjgwLDYgKzcwNSw5IEBACiBzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpmZWVkRW5jb2RlcklucHV0QnVmZmVycygpIHsKICAgICBNZWRpYUJ1ZmZlckJhc2UqIG1idWYgPSBOVUxMOwogICAgIHdoaWxlICghbUF2YWlsRW5jb2RlcklucHV0SW5kaWNlcy5lbXB0eSgpICYmIG1QdWxsZXItPnJlYWRCdWZmZXIoJm1idWYpKSB7CisgICAgICAgIGlmICghbUVuY29kZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KICAgICAgICAgc2l6ZV90IGJ1ZmZlckluZGV4ID0gKm1BdmFpbEVuY29kZXJJbnB1dEluZGljZXMuYmVnaW4oKTsKICAgICAgICAgbUF2YWlsRW5jb2RlcklucHV0SW5kaWNlcy5lcmFzZShtQXZhaWxFbmNvZGVySW5wdXRJbmRpY2VzLmJlZ2luKCkpOwogCkBAIC03MzQsNiArNzYyLDIzIEBACiAgICAgICAgICAgICBtZW1jcHkoaW5idWYtPmRhdGEoKSwgbWJ1Zi0+ZGF0YSgpLCBzaXplKTsKIAogICAgICAgICAgICAgaWYgKG1Jc1ZpZGVvKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBkcyA9IDA7CisgICAgICAgICAgICAgICAgaWYgKG1idWYtPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5Q29sb3JTcGFjZSwgJmRzKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZHMgIT0gSEFMX0RBVEFTUEFDRV9VTktOT1dOKSB7CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFzcGFjZSA9IHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihkcyk7CisgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnREYXRhU3BhY2VUb1YwKGRhdGFzcGFjZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJVcGRhdGluZyBkYXRhc3BhY2UgdG8gJXgiLCBkYXRhc3BhY2UpOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YW5kYXJkLCB0cmFuc2ZlciwgcmFuZ2U7CisgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmdldENvbG9yQ29uZmlnRnJvbURhdGFTcGFjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhc3BhY2UsICZyYW5nZSwgJnN0YW5kYXJkLCAmdHJhbnNmZXIpOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKEtFWV9DT0xPUl9TVEFOREFSRCwgc3RhbmRhcmQpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgdHJhbnNmZXIpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKEtFWV9DT0xPUl9SQU5HRSwgcmFuZ2UpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCBkYXRhc3BhY2UpOworICAgICAgICAgICAgICAgICAgICBtRW5jb2Rlci0+c2V0UGFyYW1ldGVycyhtc2cpOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIC8vIHZpZGVvIGVuY29kZXIgd2lsbCByZWxlYXNlIE1lZGlhQnVmZmVyIHdoZW4gZG9uZQogICAgICAgICAgICAgICAgIC8vIHdpdGggdW5kZXJseWluZyBkYXRhLgogICAgICAgICAgICAgICAgIGluYnVmLT5tZXRhKCktPnNldE9iamVjdCgibWVkaWFCdWZmZXJIb2xkZXIiLCBuZXcgTWVkaWFCdWZmZXJIb2xkZXIobWJ1ZikpOwpAQCAtMTA5MSw3ICsxMTM2LDcgQEAKICAgICAgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICBwYXJhbXMtPnNldEludDY0KFBBUkFNRVRFUl9LRVlfT0ZGU0VUX1RJTUUsIG1JbnB1dEJ1ZmZlclRpbWVPZmZzZXRVcyk7Ci0gICAgICAgICAgICBlcnIgPSBtRW5jb2Rlci0+c2V0UGFyYW1ldGVycyhwYXJhbXMpOworICAgICAgICAgICAgZXJyID0gbUVuY29kZXIgPyBtRW5jb2Rlci0+c2V0UGFyYW1ldGVycyhwYXJhbXMpIDogQkFEX1ZBTFVFOwogICAgICAgICB9CiAKICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwpAQCAtMTExMSw3ICsxMTU2LDcgQEAKICAgICAgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICBwYXJhbXMtPnNldEludDY0KCJzdG9wLXRpbWUtdXMiLCBzdG9wVGltZVVzKTsKLSAgICAgICAgICAgIGVyciA9IG1FbmNvZGVyLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CisgICAgICAgICAgICBlcnIgPSBtRW5jb2RlciA/IG1FbmNvZGVyLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcykgOiBCQURfVkFMVUU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBlcnIgPSBtUHVsbGVyLT5zZXRTdG9wVGltZVVzKHN0b3BUaW1lVXMpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcAppbmRleCBjNmU3NTNkLi43Yzk4MWIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAKQEAgLTU5LDcgKzU5LDcgQEAKICAgICAgICAgICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXg7CiAgICAgICAgICAgICBtZWRpYUV4U2VydmljZS0+bWFrZUV4dHJhY3RvcigKICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlSURhdGFTb3VyY2VGcm9tRGF0YVNvdXJjZShzb3VyY2UpLAotICAgICAgICAgICAgICAgICAgICBtaW1lID8gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnN0cmluZz4obWltZSkgOiBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICBtaW1lID8gc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4obWltZSkgOiBzdGQ6Om51bGxvcHQsCiAgICAgICAgICAgICAgICAgICAgICZleCk7CiAgICAgICAgICAgICByZXR1cm4gZXg7CiAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PV05FUlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNjMjI5NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09XTkVSUwpAQCAtMCwwICsxLDExIEBACitzZXQgbm9wYXJlbnQKK2NoekBnb29nbGUuY29tCitlc3NpY2tAZ29vZ2xlLmNvbQorbGFqb3NAZ29vZ2xlLmNvbQorbWFyY29uZUBnb29nbGUuY29tCit0YWtsZWVAZ29vZ2xlLmNvbQord29uc2lrQGdvb2dsZS5jb20KKworIyBMT04KK29sbHlAZ29vZ2xlLmNvbQorYW5kcmV3bGV3aXNAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5jcHAKaW5kZXggYzI4NGVmNy4uMWY1NjllZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuY3BwCkBAIC0xNzUsNiArMTc1LDIyIEBACiAgICAgfQogfQogCitzdGF0dXNfdCBzZXROYXRpdmVXaW5kb3dSb3RhdGlvbigKKyAgICAgICAgQU5hdGl2ZVdpbmRvdyAqbmF0aXZlV2luZG93IC8qIG5vbm51bGwgKi8sIGludCByb3RhdGlvbikgeworCisgICAgaW50IHRyYW5zZm9ybSA9IDA7CisgICAgaWYgKChyb3RhdGlvbiAlIDkwKSA9PSAwKSB7CisgICAgICAgIHN3aXRjaCAoKHJvdGF0aW9uIC8gOTApICYgMykgeworICAgICAgICAgICAgY2FzZSAxOiAgdHJhbnNmb3JtID0gSEFMX1RSQU5TRk9STV9ST1RfOTA7ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogIHRyYW5zZm9ybSA9IEhBTF9UUkFOU0ZPUk1fUk9UXzE4MDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6ICB0cmFuc2Zvcm0gPSBIQUxfVFJBTlNGT1JNX1JPVF8yNzA7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogdHJhbnNmb3JtID0gMDsgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RyYW5zZm9ybShuYXRpdmVXaW5kb3csIHRyYW5zZm9ybSk7Cit9CisKIHN0YXR1c190IHB1c2hCbGFua0J1ZmZlcnNUb05hdGl2ZVdpbmRvdyhBTmF0aXZlV2luZG93ICpuYXRpdmVXaW5kb3cgLyogbm9ubnVsbCAqLykgewogICAgIHN0YXR1c190IGVyciA9IE5PX0VSUk9SOwogICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYiA9IE5VTEw7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKaW5kZXggZWNlNzljNC4uYmQ5YTY5NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcApAQCAtNDcsNiArNDcsMTYgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCisvLyBUT0RPIDogUmVtb3ZlIHRoZSBkZWZpbmVzIG9uY2UgbWFpbmxpbmUgbWVkaWEgaXMgYnVpbHQgYWdhaW5zdCBOREsgPj0gMzEuCisvLyBUaGUgbXA0IGV4dHJhY3RvciBpcyBwYXJ0IG9mIG1haW5saW5lIGFuZCBidWlsZHMgYWdhaW5zdCBOREsgMjkgYXMgb2YKKy8vIHdyaXRpbmcuIFRoZXNlIGtleXMgYXJlIGF2YWlsYWJsZSBvbmx5IGZyb20gTkRLIDMxOgorI2RlZmluZSBBTUVESUFGT1JNQVRfS0VZX01QRUdIX1BST0ZJTEVfTEVWRUxfSU5ESUNBVElPTiBcCisgICJtcGVnaC1wcm9maWxlLWxldmVsLWluZGljYXRpb24iCisjZGVmaW5lIEFNRURJQUZPUk1BVF9LRVlfTVBFR0hfUkVGRVJFTkNFX0NIQU5ORUxfTEFZT1VUIFwKKyAgIm1wZWdoLXJlZmVyZW5jZS1jaGFubmVsLWxheW91dCIKKyNkZWZpbmUgQU1FRElBRk9STUFUX0tFWV9NUEVHSF9DT01QQVRJQkxFX1NFVFMgXAorICAibXBlZ2gtY29tcGF0aWJsZS1zZXRzIgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBzdGF0dXNfdCBjb3B5TkFMVVRvQUJ1ZmZlcihzcDxBQnVmZmVyPiAqYnVmZmVyLCBjb25zdCB1aW50OF90ICpwdHIsIHNpemVfdCBsZW5ndGgpIHsKQEAgLTEwNzgsNiArMTA4OCwyNSBAQAogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiaXMtYWR0cyIsIGlzQURUUyk7CiAgICAgICAgIH0KIAorICAgICAgICBpbnQzMl90IG1wZWdoUHJvZmlsZUxldmVsSW5kaWNhdGlvbjsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5TXBlZ2hQcm9maWxlTGV2ZWxJbmRpY2F0aW9uLCAmbXBlZ2hQcm9maWxlTGV2ZWxJbmRpY2F0aW9uKSkgeworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihBTUVESUFGT1JNQVRfS0VZX01QRUdIX1BST0ZJTEVfTEVWRUxfSU5ESUNBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgbXBlZ2hQcm9maWxlTGV2ZWxJbmRpY2F0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IG1wZWdoUmVmZXJlbmNlQ2hhbm5lbExheW91dDsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5TXBlZ2hSZWZlcmVuY2VDaGFubmVsTGF5b3V0LCAmbXBlZ2hSZWZlcmVuY2VDaGFubmVsTGF5b3V0KSkgeworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihBTUVESUFGT1JNQVRfS0VZX01QRUdIX1JFRkVSRU5DRV9DSEFOTkVMX0xBWU9VVCwKKyAgICAgICAgICAgICAgICAgICAgbXBlZ2hSZWZlcmVuY2VDaGFubmVsTGF5b3V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleU1wZWdoQ29tcGF0aWJsZVNldHMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKKyAgICAgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy0+c2V0QnVmZmVyKEFNRURJQUZPUk1BVF9LRVlfTVBFR0hfQ09NUEFUSUJMRV9TRVRTLCBidWZmZXIpOworICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKKyAgICAgICAgfQorCiAgICAgICAgIGludDMyX3QgYWFjUHJvZmlsZSA9IC0xOwogICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlBQUNBT1QsICZhYWNQcm9maWxlKSkgewogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYWFjLXByb2ZpbGUiLCBhYWNQcm9maWxlKTsKQEAgLTExMzUsNyArMTE2NCw3IEBACiAgICAgICAgIC8vIGFzc2VydGlvbiwgbGV0J3MgYmUgbGVuaWVudCBmb3Igbm93Li4uCiAgICAgICAgIC8vIENIRUNLKChwdHJbNF0gPj4gMikgPT0gMHgzZik7ICAvLyByZXNlcnZlZAogCi0gICAgICAgIHNpemVfdCBsZW5ndGhTaXplIF9fdW51c2VkID0gMSArIChwdHJbNF0gJiAzKTsKKyAgICAgICAgLy8gd2UgY2FuIGdldCBsZW5ndGhTaXplIHZhbHVlIGZyb20gMSArIChwdHJbNF0gJiAzKQogCiAgICAgICAgIC8vIGNvbW1lbnRlZCBvdXQgY2hlY2sgYmVsb3cgYXMgSDI2NF9RVkdBXzUwMF9OT19BVURJTy4zZ3AKICAgICAgICAgLy8gdmlvbGF0ZXMgaXQuLi4KQEAgLTE4MzcsNiArMTg2NiwyMyBAQAogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUlzQURUUywgaXNBRFRTKTsKICAgICAgICAgfQogCisgICAgICAgIGludDMyX3QgbXBlZ2hQcm9maWxlTGV2ZWxJbmRpY2F0aW9uID0gLTE7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMihBTUVESUFGT1JNQVRfS0VZX01QRUdIX1BST0ZJTEVfTEVWRUxfSU5ESUNBVElPTiwKKyAgICAgICAgICAgICAgICAmbXBlZ2hQcm9maWxlTGV2ZWxJbmRpY2F0aW9uKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1wZWdoUHJvZmlsZUxldmVsSW5kaWNhdGlvbiwgbXBlZ2hQcm9maWxlTGV2ZWxJbmRpY2F0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IG1wZWdoUmVmZXJlbmNlQ2hhbm5lbExheW91dCA9IC0xOworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoQU1FRElBRk9STUFUX0tFWV9NUEVHSF9SRUZFUkVOQ0VfQ0hBTk5FTF9MQVlPVVQsCisgICAgICAgICAgICAgICAgJm1wZWdoUmVmZXJlbmNlQ2hhbm5lbExheW91dCkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlNcGVnaFJlZmVyZW5jZUNoYW5uZWxMYXlvdXQsIG1wZWdoUmVmZXJlbmNlQ2hhbm5lbExheW91dCk7CisgICAgICAgIH0KKyAgICAgICAgc3A8QUJ1ZmZlcj4gbXBlZ2hDb21wYXRpYmxlU2V0czsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcihBTUVESUFGT1JNQVRfS0VZX01QRUdIX0NPTVBBVElCTEVfU0VUUywKKyAgICAgICAgICAgICAgICAmbXBlZ2hDb21wYXRpYmxlU2V0cykpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU1wZWdoQ29tcGF0aWJsZVNldHMsIGtUeXBlSENPUywKKyAgICAgICAgICAgICAgICAgICAgbXBlZ2hDb21wYXRpYmxlU2V0cy0+ZGF0YSgpLCBtcGVnaENvbXBhdGlibGVTZXRzLT5zaXplKCkpOworICAgICAgICB9CisKICAgICAgICAgaW50MzJfdCBhYWNQcm9maWxlID0gLTE7CiAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiYWFjLXByb2ZpbGUiLCAmYWFjUHJvZmlsZSkpIHsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlBQUNBT1QsIGFhY1Byb2ZpbGUpOwpAQCAtMjE0Miw4ICsyMTg4LDEwIEBACiAgICAgfQogICAgIGluZm8tPnNhbXBsZV9yYXRlID0gc3JhdGU7CiAKLSAgICBpbnQzMl90IGNtYXNrID0gMDsKLSAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbE1hc2ssICZjbWFzaykgfHwgY21hc2sgPT0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSKSB7CisgICAgaW50MzJfdCByYXdDaGFubmVsTWFzazsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjbWFzayA9IG1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbE1hc2ssICZyYXdDaGFubmVsTWFzaykgPworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHJhd0NoYW5uZWxNYXNrKSA6IENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUjsKKyAgICBpZiAoY21hc2sgPT0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSKSB7CiAgICAgICAgIEFMT0dWKCJ0cmFjayBvZiB0eXBlICclcycgZG9lcyBub3QgcHVibGlzaCBjaGFubmVsIG1hc2siLCBtaW1lKTsKIAogICAgICAgICAvLyBUcnkgYSBjaGFubmVsIGNvdW50IGluc3RlYWQKQEAgLTIxODQsNyArMjIzMiwxMSBAQAogICAgIH0KICAgICAvLyBDaGVjayBpZiBvZmZsb2FkIGlzIHBvc3NpYmxlIGZvciBnaXZlbiBmb3JtYXQsIHN0cmVhbSB0eXBlLCBzYW1wbGUgcmF0ZSwKICAgICAvLyBiaXQgcmF0ZSwgZHVyYXRpb24sIHZpZGVvIGFuZCBzdHJlYW1pbmcKKyNpZmRlZiBESVNBQkxFX0FVRElPX1NZU1RFTV9PRkZMT0FECisgICAgcmV0dXJuIGZhbHNlOworI2Vsc2UKICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmlzT2ZmbG9hZFN1cHBvcnRlZChpbmZvKTsKKyNlbmRpZgogfQogCiBITFNUaW1lOjpITFNUaW1lKGNvbnN0IHNwPEFNZXNzYWdlPiYgbWV0YSkgOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0FuZHJvaWQuYnAKaW5kZXggODY5OGQzMy4uZTRmYzEyOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiXSwKK30KKwogY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZS1kZWZhdWx0cyIsCiAgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggMmZiYzNkNi4uODZhYjYyYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogIkZyYW1lRHJvcHBlcl90ZXN0IiwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLmJwCmluZGV4IDQ2YjNiOGYuLjVhYjQ5YTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2NvZGVjc19hYWNkZWNfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfY29kZWNzX2FhY2RlY19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfYWFjZGVjIiwKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5jcHAKaW5kZXggMTY4ZDE0MC4uMTU3Y2FiNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9EcmNQcmVzTW9kZVdyYXAuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvRHJjUHJlc01vZGVXcmFwLmNwcApAQCAtMjE3LDcgKzIxNyw3IEBACiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7IC8vIGhhbmRsZSBvdGhlciB1c2VkIGVuY29kZXIgdGFyZ2V0IGxldmVscwogCi0gICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2s6IERSQyBwcmVzZW50YXRpb24gbW9kZSBpcyBvbmx5IHNwZWNpZmllZCBmb3IgbWF4LiA1LjEgY2hhbm5lbHMKKyAgICAgICAgICAgIC8vIFZhbGlkYXRpb24gY2hlY2s6IERSQyBwcmVzZW50YXRpb24gbW9kZSBpcyBvbmx5IHNwZWNpZmllZCBmb3IgbWF4LiA1LjEgY2hhbm5lbHMKICAgICAgICAgICAgIGlmIChtU3RyZWFtTnJBQUNDaGFuID4gNikgewogICAgICAgICAgICAgICAgIGRyY1ByZXNNb2RlID0gMDsKICAgICAgICAgICAgIH0KQEAgLTMwOCw3ICszMDgsNyBAQAogICAgICAgICAgICAgfSAvLyBzd2l0Y2goKQogICAgICAgICB9IC8vIGlmIChtRW5jb2RlclRhcmdldCAgPT0gR1BNX0VOQ09ERVJfVEFSR0VUX0xFVkVMKQogCi0gICAgICAgIC8vIHNhbml0eSBhZ2FpbgorICAgICAgICAvLyB2YWxpZGF0aW9uIGNoZWNrIGFnYWluCiAgICAgICAgIGlmIChuZXdIZWF2eSA9PSAxKSB7CiAgICAgICAgICAgICBuZXdCb29zdEZhY3Rvcj0xMjc7IC8vIG5vdCByZWFsbHkgbmVlZGVkIGFzIHRoZSBzYW1lIHdvdWxkIGJlIGRvbmUgYnkgdGhlIGRlY29kZXIgYW55d2F5CiAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCmluZGV4IDI4YTdhMWUuLjkyZWM5NGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCkBAIC0xMjQ3LDYgKzEyNDcsNyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQuYnAKaW5kZXggYmY3ODljNC4uNzkzMTI1ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5icApAQCAtMSwzICsxLDIyIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfY29kZWNzX2FhY2VuY19saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9jb2RlY3NfYWFjZW5jX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9hYWNlbmMiLAogICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmNwcAppbmRleCA2ZTQzN2NmLi45MDQyMWI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuY3BwCkBAIC03MzIsNiArNzMyLDcgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwCmluZGV4IGI4ZTAwYjMuLjJjMDk1NGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAKQEAgLTEsODYgKzEsMjAgQEAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAotCi0gICAgc3JjczogWwotICAgICAgICAic3JjL2FfcmVmbC5jcHAiLAotICAgICAgICAic3JjL2FnYy5jcHAiLAotICAgICAgICAic3JjL2FtcmRlY29kZS5jcHAiLAotICAgICAgICAic3JjL2JfY25fY29kLmNwcCIsCi0gICAgICAgICJzcmMvYmduc2NkLmNwcCIsCi0gICAgICAgICJzcmMvY19nX2F2ZXIuY3BwIiwKLSAgICAgICAgInNyYy9kMTAzNXBmLmNwcCIsCi0gICAgICAgICJzcmMvZDJfMTFwZi5jcHAiLAotICAgICAgICAic3JjL2QyXzlwZi5jcHAiLAotICAgICAgICAic3JjL2QzXzE0cGYuY3BwIiwKLSAgICAgICAgInNyYy9kNF8xN3BmLmNwcCIsCi0gICAgICAgICJzcmMvZDhfMzFwZi5jcHAiLAotICAgICAgICAic3JjL2RfZ2Fpbl9jLmNwcCIsCi0gICAgICAgICJzcmMvZF9nYWluX3AuY3BwIiwKLSAgICAgICAgInNyYy9kX3Bsc2YuY3BwIiwKLSAgICAgICAgInNyYy9kX3Bsc2ZfMy5jcHAiLAotICAgICAgICAic3JjL2RfcGxzZl81LmNwcCIsCi0gICAgICAgICJzcmMvZGVjX2Ftci5jcHAiLAotICAgICAgICAic3JjL2RlY19nYWluLmNwcCIsCi0gICAgICAgICJzcmMvZGVjX2lucHV0X2Zvcm1hdF90YWIuY3BwIiwKLSAgICAgICAgInNyYy9kZWNfbGFnMy5jcHAiLAotICAgICAgICAic3JjL2RlY19sYWc2LmNwcCIsCi0gICAgICAgICJzcmMvZHR4X2RlYy5jcHAiLAotICAgICAgICAic3JjL2VjX2dhaW5zLmNwcCIsCi0gICAgICAgICJzcmMvZXhfY3RybC5jcHAiLAotICAgICAgICAic3JjL2lmMl90b19ldHMuY3BwIiwKLSAgICAgICAgInNyYy9pbnRfbHNmLmNwcCIsCi0gICAgICAgICJzcmMvbHNwX2F2Zy5jcHAiLAotICAgICAgICAic3JjL3BoX2Rpc3AuY3BwIiwKLSAgICAgICAgInNyYy9wb3N0X3Byby5jcHAiLAotICAgICAgICAic3JjL3ByZWVtcGguY3BwIiwKLSAgICAgICAgInNyYy9wc3RmaWx0LmNwcCIsCi0gICAgICAgICJzcmMvcWdhaW40NzVfdGFiLmNwcCIsCi0gICAgICAgICJzcmMvc3BfZGVjLmNwcCIsCi0gICAgICAgICJzcmMvd21mX3RvX2V0cy5jcHAiLAotICAgIF0sCi0KLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItRE9TQ0xfVU5VU0VEX0FSRyh4KT0odm9pZCkoeCkiLAotICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKLQotICAgICAgICAiLVdlcnJvciIsCi0gICAgXSwKLQotICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAotCi0gICAgLy9zYW5pdGl6ZTogewotICAgIC8vICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgLy8gICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgLy8gICAgXSwKLSAgICAvL30sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQotICAgIHRhcmdldDogewotICAgICAgICBkYXJ3aW46IHsKLSAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAotICAgICAgICB9LAotICAgIH0sCi19Ci0KIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9hbXJkZWMiLAogICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiU29mdEFNUi5jcHAiXSwKIAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKLQogICAgIGNmbGFnczogWwogICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKICAgICBdLApAQCAtMTAzLDM5ICszNywzIEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAogICAgIF0sCiB9Ci0KLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotY2NfdGVzdCB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjX3Rlc3QiLAotICAgIGd0ZXN0OiBmYWxzZSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLQotICAgIHNyY3M6IFsidGVzdC9hbXJuYmRlY190ZXN0LmNwcCJdLAotCi0gICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKLQotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKLQotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYmRlYyIsCi0gICAgICAgICJsaWJzbmRmaWxlIiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCi0gICAgICAgICJsaWJhdWRpb3V0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQotICAgIHRhcmdldDogewotICAgICAgICBkYXJ3aW46IHsKLSAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAotICAgICAgICB9LAotICAgIH0sCi0KLSAgICAvL3Nhbml0aXplOiB7Ci0gICAgLy8gICAgbWlzY191bmRlZmluZWQ6IFsKLSAgICAvLyAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAvLyAgICBdLAotICAgIC8vfSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwCmluZGV4IGNkZmMwM2EuLjAxZGEzZjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcApAQCAtNTc2LDYgKzU3Niw3IEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBhbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCiAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvUkVBRE1FLm1kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmUxM2FlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9SRUFETUUubWQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIyBNZWRpYSBUZXN0aW5nICMjCi0tLS0KLSMjIyMgQU1SLU5CIERlY29kZXIgOgotVGhlIEFtci1OYiBEZWNvZGVyIFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBhbXJuYiBkZWNvZGVyIGF2YWlsYWJsZSBpbiBsaWJzdGFnZWZyaWdodC4KLQotUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6Ci1gYGAKLW0gQW1ybmJEZWNvZGVyVGVzdAotYGBgCi0KLVRoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCi0KLVRoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KLQotVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCi1gYGAKLWFkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9BbXJuYkRlY29kZXJUZXN0L0Ftcm5iRGVjb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLwotYGBgCi0KLVRvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KLWBgYAotYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9BbXJuYkRlY29kZXJUZXN0L0Ftcm5iRGVjb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLwotYGBgCi0KLVRoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9kcml2ZS5nb29nbGUuY29tL2RyaXZlL2ZvbGRlcnMvMTNjTTR0QWFWRnJtci16R0ZxYUF6RkJiS3M3NXBubTliKS4gUHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KLURvd25sb2FkIGFtci1uYiBmb2xkZXIgYW5kIHB1c2ggYWxsIHRoZSBmaWxlcyBpbiB0aGlzIGZvbGRlciB0byAvZGF0YS9sb2NhbC90bXAvIG9uIHRoZSBkZXZpY2UuCi1gYGAKLWFkYiBwdXNoIGFtci1uYi8uIC9kYXRhL2xvY2FsL3RtcC8KLWBgYAotCi11c2FnZTogQW1ybmJEZWNvZGVyVGVzdCAtUCBcPHBhdGhfdG9fZm9sZGVyXD4KLWBgYAotYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9BbXJuYkRlY29kZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC8KLWBgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwCmluZGV4IDczYTFkNGIuLjZiZjJkMzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQuYnAKQEAgLTEsOTggKzEsMjEgQEAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1ybmJlbmMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAotCi0gICAgc3JjczogWwotICAgICAgICAic3JjL2FtcmVuY29kZS5jcHAiLAotICAgICAgICAic3JjL2F1dG9jb3JyLmNwcCIsCi0gICAgICAgICJzcmMvYzEwMzVwZi5jcHAiLAotICAgICAgICAic3JjL2MyXzExcGYuY3BwIiwKLSAgICAgICAgInNyYy9jMl85cGYuY3BwIiwKLSAgICAgICAgInNyYy9jM18xNHBmLmNwcCIsCi0gICAgICAgICJzcmMvYzRfMTdwZi5jcHAiLAotICAgICAgICAic3JjL2M4XzMxcGYuY3BwIiwKLSAgICAgICAgInNyYy9jYWxjX2Nvci5jcHAiLAotICAgICAgICAic3JjL2NhbGNfZW4uY3BwIiwKLSAgICAgICAgInNyYy9jYnNlYXJjaC5jcHAiLAotICAgICAgICAic3JjL2NsX2x0cC5jcHAiLAotICAgICAgICAic3JjL2NvZF9hbXIuY3BwIiwKLSAgICAgICAgInNyYy9jb252b2x2ZS5jcHAiLAotICAgICAgICAic3JjL2Nvcl9oLmNwcCIsCi0gICAgICAgICJzcmMvY29yX2hfeC5jcHAiLAotICAgICAgICAic3JjL2Nvcl9oX3gyLmNwcCIsCi0gICAgICAgICJzcmMvY29ycndnaHRfdGFiLmNwcCIsCi0gICAgICAgICJzcmMvZHR4X2VuYy5jcHAiLAotICAgICAgICAic3JjL2VuY19sYWczLmNwcCIsCi0gICAgICAgICJzcmMvZW5jX2xhZzYuY3BwIiwKLSAgICAgICAgInNyYy9lbmNfb3V0cHV0X2Zvcm1hdF90YWIuY3BwIiwKLSAgICAgICAgInNyYy9ldHNfdG9faWYyLmNwcCIsCi0gICAgICAgICJzcmMvZXRzX3RvX3dtZi5jcHAiLAotICAgICAgICAic3JjL2dfYWRhcHQuY3BwIiwKLSAgICAgICAgInNyYy9nX2NvZGUuY3BwIiwKLSAgICAgICAgInNyYy9nX3BpdGNoLmNwcCIsCi0gICAgICAgICJzcmMvZ2Fpbl9xLmNwcCIsCi0gICAgICAgICJzcmMvaHBfbWF4LmNwcCIsCi0gICAgICAgICJzcmMvaW50ZXJfMzYuY3BwIiwKLSAgICAgICAgInNyYy9pbnRlcl8zNl90YWIuY3BwIiwKLSAgICAgICAgInNyYy9sX2NvbXAuY3BwIiwKLSAgICAgICAgInNyYy9sX2V4dHJhY3QuY3BwIiwKLSAgICAgICAgInNyYy9sX25lZ2F0ZS5jcHAiLAotICAgICAgICAic3JjL2xhZ193aW5kLmNwcCIsCi0gICAgICAgICJzcmMvbGFnX3dpbmRfdGFiLmNwcCIsCi0gICAgICAgICJzcmMvbGV2aW5zb24uY3BwIiwKLSAgICAgICAgInNyYy9scGMuY3BwIiwKLSAgICAgICAgInNyYy9vbF9sdHAuY3BwIiwKLSAgICAgICAgInNyYy9wX29sX3dnaC5jcHAiLAotICAgICAgICAic3JjL3BpdGNoX2ZyLmNwcCIsCi0gICAgICAgICJzcmMvcGl0Y2hfb2wuY3BwIiwKLSAgICAgICAgInNyYy9wcmVfYmlnLmNwcCIsCi0gICAgICAgICJzcmMvcHJlX3Byb2MuY3BwIiwKLSAgICAgICAgInNyYy9wcm0yYml0cy5jcHAiLAotICAgICAgICAic3JjL3FfZ2Fpbl9jLmNwcCIsCi0gICAgICAgICJzcmMvcV9nYWluX3AuY3BwIiwKLSAgICAgICAgInNyYy9xZ2FpbjQ3NS5jcHAiLAotICAgICAgICAic3JjL3FnYWluNzk1LmNwcCIsCi0gICAgICAgICJzcmMvcXVhX2dhaW4uY3BwIiwKLSAgICAgICAgInNyYy9zMTBfOHBmLmNwcCIsCi0gICAgICAgICJzcmMvc2V0X3NpZ24uY3BwIiwKLSAgICAgICAgInNyYy9zaWRfc3luYy5jcHAiLAotICAgICAgICAic3JjL3NwX2VuYy5jcHAiLAotICAgICAgICAic3JjL3NwcmVwcm9jLmNwcCIsCi0gICAgICAgICJzcmMvc3BzdHByb2MuY3BwIiwKLSAgICAgICAgInNyYy90b25fc3RhYi5jcHAiLAotICAgIF0sCi0KLSAgICBoZWFkZXJfbGliczogWyJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIl0sCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJzcmMiXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLURPU0NMX1VOVVNFRF9BUkcoeCk9KHZvaWQpKHgpIiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgIF0sCi0KLSAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKLQotICAgIC8vYWRkcmVzc2luZyBiLzI1NDA5NzQ0Ci0gICAgLy9zYW5pdGl6ZTogewotICAgIC8vICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgLy8gICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgLy8gICAgXSwKLSAgICAvL30sCi0KLSAgICBzaGFyZWRfbGliczogWyJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iXSwKLX0KIAogLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2Ftcm5iZW5jIiwKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbIlNvZnRBTVJOQkVuY29kZXIuY3BwIl0sCiAKLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCi0KICAgICAvL2FkZHJlc3NpbmcgYi8yNTQwOTc0NAogICAgIC8vc2FuaXRpemU6IHsKICAgICAvLyAgICBtaXNjX3VuZGVmaW5lZDogWwpAQCAtMTA2LDI3ICsyOSwzIEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAogICAgIF0sCiB9Ci0KLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1jY190ZXN0IHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1ybmJlbmNfdGVzdCIsCi0gICAgZ3Rlc3Q6IGZhbHNlLAotCi0gICAgc3JjczogWyJ0ZXN0L2Ftcm5iX2VuY190ZXN0LmNwcCJdLAotCi0gICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKLQotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKLQotICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jIl0sCi0KLSAgICBzaGFyZWRfbGliczogWyJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iXSwKLQotICAgIC8vYWRkcmVzc2luZyBiLzI1NDA5NzQ0Ci0gICAgLy9zYW5pdGl6ZTogewotICAgIC8vICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgLy8gICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgLy8gICAgXSwKLSAgICAvL30sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL1NvZnRBTVJOQkVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9Tb2Z0QU1STkJFbmNvZGVyLmNwcAppbmRleCA4NWFiNjRlLi5hMWY2Njg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL1NvZnRBTVJOQkVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvU29mdEFNUk5CRW5jb2Rlci5jcHAKQEAgLTQyMSw2ICs0MjEsNyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9OT1RJQ0UgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIxZWZhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotCi0gICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvcGF0ZW50X2Rpc2NsYWltZXIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGJmMTFkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9wYXRlbnRfZGlzY2xhaW1lci50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQotVEhJUyBJUyBOT1QgQSBHUkFOVCBPRiBQQVRFTlQgUklHSFRTLgotCi1Hb29nbGUgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gb3Igd2FycmFudHkgdGhhdCB0aGUgY29kZWNzIGZvciB3aGljaAotc291cmNlIGNvZGUgaXMgbWFkZSBhdmFpbGFibGUgaGVyZXVuZGVyIGFyZSB1bmVuY3VtYmVyZWQgYnkKLXRoaXJkLXBhcnR5IHBhdGVudHMuICBUaG9zZSBpbnRlbmRpbmcgdG8gdXNlIHRoaXMgc291cmNlIGNvZGUgaW4KLWhhcmR3YXJlIG9yIHNvZnR3YXJlIHByb2R1Y3RzIGFyZSBhZHZpc2VkIHRoYXQgaW1wbGVtZW50YXRpb25zIG9mCi10aGVzZSBjb2RlY3MsIGluY2x1ZGluZyBpbiBvcGVuIHNvdXJjZSBzb2Z0d2FyZSBvciBzaGFyZXdhcmUsIG1heQotcmVxdWlyZSBwYXRlbnQgbGljZW5zZXMgZnJvbSB0aGUgcmVsZXZhbnQgcGF0ZW50IGhvbGRlcnMuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLmJwCmluZGV4IDY0ZjMwMmMuLjAwZTdiYzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLmJwCkBAIC0xLDE0NyArMSwxMyBAQAotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJ3YmVuYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCiAKLSAgICBzcmNzOiBbCi0gICAgICAgICJzcmMvYXV0b2NvcnIuYyIsCi0gICAgICAgICJzcmMvYXpfaXNwLmMiLAotICAgICAgICAic3JjL2JpdHMuYyIsCi0gICAgICAgICJzcmMvYzJ0NjRmeC5jIiwKLSAgICAgICAgInNyYy9jNHQ2NGZ4LmMiLAotICAgICAgICAic3JjL2NvbnZvbHZlLmMiLAotICAgICAgICAic3JjL2Nvcl9oX3guYyIsCi0gICAgICAgICJzcmMvZGVjaW01NC5jIiwKLSAgICAgICAgInNyYy9kZWVtcGguYyIsCi0gICAgICAgICJzcmMvZHR4LmMiLAotICAgICAgICAic3JjL2dfcGl0Y2guYyIsCi0gICAgICAgICJzcmMvZ3BjbGlwLmMiLAotICAgICAgICAic3JjL2hvbWluZy5jIiwKLSAgICAgICAgInNyYy9ocDQwMC5jIiwKLSAgICAgICAgInNyYy9ocDUwLmMiLAotICAgICAgICAic3JjL2hwNmsuYyIsCi0gICAgICAgICJzcmMvaHBfd3NwLmMiLAotICAgICAgICAic3JjL2ludF9scGMuYyIsCi0gICAgICAgICJzcmMvaXNwX2F6LmMiLAotICAgICAgICAic3JjL2lzcF9pc2YuYyIsCi0gICAgICAgICJzcmMvbGFnX3dpbmQuYyIsCi0gICAgICAgICJzcmMvbGV2aW5zb24uYyIsCi0gICAgICAgICJzcmMvbG9nMi5jIiwKLSAgICAgICAgInNyYy9scF9kZWMyLmMiLAotICAgICAgICAic3JjL21hdGhfb3AuYyIsCi0gICAgICAgICJzcmMvb3Blcl8zMmIuYyIsCi0gICAgICAgICJzcmMvcF9tZWRfb2wuYyIsCi0gICAgICAgICJzcmMvcGl0X3NocnAuYyIsCi0gICAgICAgICJzcmMvcGl0Y2hfZjQuYyIsCi0gICAgICAgICJzcmMvcHJlZF9sdDQuYyIsCi0gICAgICAgICJzcmMvcHJlZW1waC5jIiwKLSAgICAgICAgInNyYy9xX2dhaW4yLmMiLAotICAgICAgICAic3JjL3FfcHVsc2UuYyIsCi0gICAgICAgICJzcmMvcWlzZl9ucy5jIiwKLSAgICAgICAgInNyYy9xcGlzZl8ycy5jIiwKLSAgICAgICAgInNyYy9yYW5kb20uYyIsCi0gICAgICAgICJzcmMvcmVzaWR1LmMiLAotICAgICAgICAic3JjL3NjYWxlLmMiLAotICAgICAgICAic3JjL3N0cmVhbS5jIiwKLSAgICAgICAgInNyYy9zeW5fZmlsdC5jIiwKLSAgICAgICAgInNyYy91cGR0X3Rhci5jIiwKLSAgICAgICAgInNyYy91dGlsLmMiLAotICAgICAgICAic3JjL3ZvQU1SV0JFbmMuYyIsCi0gICAgICAgICJzcmMvdm9pY2VmYWMuYyIsCi0gICAgICAgICJzcmMvd2JfdmFkLmMiLAotICAgICAgICAic3JjL3dlaWdodF9hLmMiLAotICAgICAgICAic3JjL21lbV9hbGlnbi5jIiwKLSAgICBdLAotCi0gICAgYXJjaDogewotICAgICAgICBhcm06IHsKLSAgICAgICAgICAgIHNyY3M6IFsKLSAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvY29udm9sdmVfb3B0LnMiLAotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9jb3JfaF92ZWNfb3B0LnMiLAotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9EZWVtcGhfMzJfb3B0LnMiLAotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9Eb3RfcF9vcHQucyIsCi0gICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL0ZpbHRfNmtfN2tfb3B0LnMiLAotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9Ob3JtX0NvcnJfb3B0LnMiLAotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zIiwKLSAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvcmVzaWR1X2FzbV9vcHQucyIsCi0gICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL3NjYWxlX3NpZ19vcHQucyIsCi0gICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL1N5bl9maWx0XzMyX29wdC5zIiwKLSAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvc3luX2ZpbHRfb3B0LnMiLAotICAgICAgICAgICAgXSwKLQotICAgICAgICAgICAgY2ZsYWdzOiBbCi0gICAgICAgICAgICAgICAgIi1EQVJNIiwKLSAgICAgICAgICAgICAgICAiLURBU01fT1BUIiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjL2FzbS9BUk1WNUUiXSwKLQotICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fc2V0OiAiYXJtIiwKLQotICAgICAgICAgICAgbmVvbjogewotICAgICAgICAgICAgICAgIGV4Y2x1ZGVfc3JjczogWwotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvY29udm9sdmVfb3B0LnMiLAotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvY29yX2hfdmVjX29wdC5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL0RlZW1waF8zMl9vcHQucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9Eb3RfcF9vcHQucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9GaWx0XzZrXzdrX29wdC5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL05vcm1fQ29ycl9vcHQucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL3Jlc2lkdV9hc21fb3B0LnMiLAotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvc2NhbGVfc2lnX29wdC5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL1N5bl9maWx0XzMyX29wdC5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL3N5bl9maWx0X29wdC5zIiwKLSAgICAgICAgICAgICAgICBdLAotCi0gICAgICAgICAgICAgICAgc3JjczogWwotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9jb252b2x2ZV9uZW9uLnMiLAotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9jb3JfaF92ZWNfbmVvbi5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvRGVlbXBoXzMyX25lb24ucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L0RvdF9wX25lb24ucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L0ZpbHRfNmtfN2tfbmVvbi5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvTm9ybV9Db3JyX25lb24ucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L3ByZWRfbHQ0XzFfbmVvbi5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvcmVzaWR1X2FzbV9uZW9uLnMiLAotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9zY2FsZV9zaWdfbmVvbi5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvU3luX2ZpbHRfMzJfbmVvbi5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvc3luX2ZpbHRfbmVvbi5zIiwKLSAgICAgICAgICAgICAgICBdLAotCi0gICAgICAgICAgICAgICAgLy8gZG9uJ3QgYWN0dWFsbHkgZ2VuZXJhdGUgbmVvbiBpbnN0cnVjdGlvbnMsIHNlZSBidWcgMjY5MzI5ODAKLSAgICAgICAgICAgICAgICBjZmxhZ3M6IFsKLSAgICAgICAgICAgICAgICAgICAgIi1EQVJNVjciLAotICAgICAgICAgICAgICAgICAgICAiLW1mcHU9dmZwdjMiLAotICAgICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RSIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3IiwKLSAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgfSwKLQotICAgICAgICB9LAotICAgIH0sCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgIF0sCi0KLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmMiXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWyItV2Vycm9yIl0sCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgIH0sCi0KK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiXSwKIH0KIAotLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9hbXJ3YmVuYyIsCiAgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLApAQCAtMTYzLDQgKzI5LDMgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24iLAogICAgIF0sCiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL05PVElDRSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjFlZmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NDJmYzQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLWNjX3Rlc3QgewotICAgIG5hbWU6ICJBTVJXQkVuY1Rlc3QiLAotICAgIGd0ZXN0OiBmYWxzZSwKLQotICAgIHNyY3M6IFsiQU1SV0JfRV9TQU1QTEUuYyJdLAotCi0gICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKLQotICAgIGFyY2g6IHsKLSAgICAgICAgYXJtOiB7Ci0gICAgICAgICAgICBpbnN0cnVjdGlvbl9zZXQ6ICJhcm0iLAotICAgICAgICB9LAotICAgIH0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliZGwiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2FtcndiZW5jIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24iLAotICAgIF0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBjZmk6IHRydWUsCi0gICAgfSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9Tb2Z0QU1SV0JFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9Tb2Z0QU1SV0JFbmNvZGVyLmNwcAppbmRleCA3ZmI4YTRjLi42NTdhNWNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU29mdEFNUldCRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NvZnRBTVJXQkVuY29kZXIuY3BwCkBAIC00NzYsNiArNDc2LDcgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9BbmRyb2lkLmJwCmluZGV4IDBiYjZiYjAuLjFjMmY5YmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfYXZjZGVjIiwKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCkBAIC0xNiw2ICsyNSw5IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIGNvbmZpZzogeworICAgICAgICAgICAgY2ZpX2Fzc2VtYmx5X3N1cHBvcnQ6IHRydWUsCisgICAgICAgIH0sCiAgICAgfSwKIAogICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuY3BwCmluZGV4IDVhNGIyZjguLjM4OTFmMjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcApAQCAtNzI0LDYgKzcyNCw3IEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBhbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsIE9NWF9QVFIgYXBwRGF0YSwKICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvQW5kcm9pZC5icAppbmRleCA5ODAyNjFjLi41ODYwODhjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2F2Y2VuYyIsCiAgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLApAQCAtMTAsNiArMTksOSBAQAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBjb25maWc6IHsKKyAgICAgICAgICAgIGNmaV9hc3NlbWJseV9zdXBwb3J0OiB0cnVlLAorICAgICAgICB9LAogICAgIH0sCiAKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCmluZGV4IDlkYjY0NjUuLjAxMTc0YzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcApAQCAtMTUwNyw2ICsxNTA3LDcgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLmJwCmluZGV4IDI2MGE2MGEuLjA4NjkxZTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2NvZGVjc19jb21tb25fbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfY29kZWNzX2NvbW1vbl9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKQEAgLTE0LDQgKzMzLDExIEBACiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAKICAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAorCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKaW5kZXggNDA2NDc1MS4uZDA2ZTBiNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2NvZGVjc19mbGFjX2RlY19saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9jb2RlY3NfZmxhY19kZWNfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2ZsYWNkZWMiLAogICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5jcHAKaW5kZXggODQyYTdjZS4uZDY0NDhkMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5jcHAKQEAgLTQ5MSw2ICs0OTEsNyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLmJwCmluZGV4IGYzNWJjZTEuLjU5YTQ2NzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMjIgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9jb2RlY3NfZmxhY19lbmNfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfY29kZWNzX2ZsYWNfZW5jX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9mbGFjZW5jIiwKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCmluZGV4IDA3OGM4ZTMuLjI0MjE2YTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCkBAIC01OTIsNiArNTkyLDcgQEAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5icAppbmRleCBmNTM1N2Y0Li4xZGMzNGMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5icApAQCAtMSwzICsxLDIyIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfY29kZWNzX2c3MTFfZGVjX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2NvZGVjc19nNzExX2RlY19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfZzcxMWRlYyIsCiAgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKaW5kZXggODc3Y2I1YS4uZmU5MTUxMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCkBAIC0zODIsNiArMzgyLDcgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL0FuZHJvaWQuYnAKaW5kZXggNTY3MmQ4OS4uZWZhMmY4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMjIgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9jb2RlY3NfZ3NtX2RlY19saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9jb2RlY3NfZ3NtX2RlY19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfZ3NtZGVjIiwKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCmluZGV4IGQ3NzcyMjkuLjMzMGNiOGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCkBAIC0zNTQsNiArMzU0LDcgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5oCmluZGV4IGVmODY5MTUuLmQ1ODg1YTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmgKQEAgLTIwLDkgKzIwLDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKLWV4dGVybiAiQyIgewogI2luY2x1ZGUgImdzbS5oIgotfQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9BbmRyb2lkLmJwCmluZGV4IGVjNDM2Y2UuLjJjNDA5MWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9oZXZjZGVjIiwKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCkBAIC0xNyw2ICsyNiw5IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIGNvbmZpZzogeworICAgICAgICAgICAgY2ZpX2Fzc2VtYmx5X3N1cHBvcnQ6IHRydWUsCisgICAgICAgIH0sCiAgICAgfSwKIAogICAgIC8vIFdlIG5lZWQgdGhpcyBiZWNhdXNlIHRoZSBjdXJyZW50IGFzbSBnZW5lcmF0ZXMgdGhlIGZvbGxvd2luZyBsaW5rIGVycm9yOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuY3BwCmluZGV4IGY2YWUxZjQuLjE3NmRhNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5jcHAKQEAgLTcxMyw2ICs3MTMsNyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudChjb25zdCBjaGFyICpuYW1lLAogICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsIE9NWF9QVFIgYXBwRGF0YSwKICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5icAppbmRleCA0MzAzNTY1Li43MjVjNzljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLmJwCkBAIC0xLDgwICsxLDE5IEBACi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgYXBleF9hdmFpbGFibGU6IFsKLSAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAotICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCi0gICAgXSwKLSAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCi0gICAgc2hhcmVkX2xpYnM6IFsibGlibG9nIl0sCiAKLSAgICBzcmNzOiBbCi0gICAgICAgICJzcmMvYWRhcHRpdmVfc21vb3RoX25vX21teC5jcHAiLAotICAgICAgICAic3JjL2JpdHN0cmVhbS5jcHAiLAotICAgICAgICAic3JjL2Jsb2NrX2lkY3QuY3BwIiwKLSAgICAgICAgInNyYy9jYWxfZGNfc2NhbGVyLmNwcCIsCi0gICAgICAgICJzcmMvY2h2cl9maWx0ZXIuY3BwIiwKLSAgICAgICAgInNyYy9jaHZfZmlsdGVyLmNwcCIsCi0gICAgICAgICJzcmMvY29tYmluZWRfZGVjb2RlLmNwcCIsCi0gICAgICAgICJzcmMvY29uY2VhbC5jcHAiLAotICAgICAgICAic3JjL2RhdGFwYXJ0X2RlY29kZS5jcHAiLAotICAgICAgICAic3JjL2RjYWNfcHJlZGljdGlvbi5jcHAiLAotICAgICAgICAic3JjL2RlY19wcmVkX2ludHJhX2RjLmNwcCIsCi0gICAgICAgICJzcmMvZGVyaW5naW5nX2Nocm9tYS5jcHAiLAotICAgICAgICAic3JjL2RlcmluZ2luZ19sdW1hLmNwcCIsCi0gICAgICAgICJzcmMvZmluZF9taW5fbWF4LmNwcCIsCi0gICAgICAgICJzcmMvZ2V0X3ByZWRfYWR2X2JfYWRkLmNwcCIsCi0gICAgICAgICJzcmMvZ2V0X3ByZWRfb3V0c2lkZS5jcHAiLAotICAgICAgICAic3JjL2lkY3QuY3BwIiwKLSAgICAgICAgInNyYy9pZGN0X3ZjYS5jcHAiLAotICAgICAgICAic3JjL21iX21vdGlvbl9jb21wLmNwcCIsCi0gICAgICAgICJzcmMvbWJfdXRpbHMuY3BwIiwKLSAgICAgICAgInNyYy9wYWNrZXRfdXRpbC5jcHAiLAotICAgICAgICAic3JjL3Bvc3RfZmlsdGVyLmNwcCIsCi0gICAgICAgICJzcmMvcG9zdF9wcm9jX3NlbWFwaG9yZS5jcHAiLAotICAgICAgICAic3JjL3BwX3NlbWFwaG9yZV9jaHJvbWFfaW50ZXIuY3BwIiwKLSAgICAgICAgInNyYy9wcF9zZW1hcGhvcmVfbHVtYS5jcHAiLAotICAgICAgICAic3JjL3B2ZGVjX2FwaS5jcHAiLAotICAgICAgICAic3JjL3NjYWxpbmdfdGFiLmNwcCIsCi0gICAgICAgICJzcmMvdmxjX2RlY29kZS5jcHAiLAotICAgICAgICAic3JjL3ZsY19kZXF1YW50LmNwcCIsCi0gICAgICAgICJzcmMvdmxjX3RhYi5jcHAiLAotICAgICAgICAic3JjL3ZvcC5jcHAiLAotICAgICAgICAic3JjL3ppZ3phZ190YWIuY3BwIiwKLSAgICBdLAotCi0gICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiCi0gICAgXSwKLQotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLVdlcnJvciIsCi0gICAgXSwKLQotICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAotCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKLSAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgIF0sCi0gICAgICAgIGNmaTogdHJ1ZSwKLSAgICB9LAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSJdLAogfQogCi0vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X21wZWc0ZGVjIiwKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbIlNvZnRNUEVHNC5jcHAiXSwKIAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKLQogICAgIGNmbGFnczogWwogICAgIF0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcAppbmRleCA2MDc1MGQ5Li5hNGIzZTJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwCkBAIC00MTIsNiArNDEyLDcgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYWRhcHRpdmVfc21vb3RoX25vX21teC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9hZGFwdGl2ZV9zbW9vdGhfbm9fbW14LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3NjFlYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9hZGFwdGl2ZV9zbW9vdGhfbm9fbW14LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQyMSArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoKLQotIERlc2NyaXB0aW9uOiBTZXBhcmF0ZWQgbW9kdWxlcyBpbnRvIG9uZSBmdW5jdGlvbiBwZXIgZmlsZSBhbmQgcHV0IGludG8KLSAgICBuZXcgdGVtcGxhdGUuCi0KLSBEZXNjcmlwdGlvbjogT3B0aW1pemluZyBDIGNvZGUgYW5kIGFkZGluZyBjb21tZW50cy4gIEFsc28gY2hhbmdpbmcgdmFyaWFibGUKLSAgICBuYW1lcyB0byBtYWtlIHRoZW0gbW9yZSBtZWFuaW5nZnVsLgotCi0gV2hvOiAgICAgICAgICAgICAgICAgICBEYXRlOgotIERlc2NyaXB0aW9uOgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TCi0KLSBJbnB1dHM6Ci0KLSAgICBSZWNfWSA9IHBvaW50ZXIgdG8gMHRoIHBvc2l0aW9uIGluIGJ1ZmZlciBjb250YWluaW5nIGx1bWluYW5jZSB2YWx1ZXMKLSAgICAgICAgb2YgdHlwZSB1aW50OC4KLSAgICB5X3N0YXJ0ID0gdmFsdWUgb2YgeSBjb29yZGluYXRlIG9mIHR5cGUgaW50IHRoYXQgc3BlY2lmaWVzIHRoZSBmaXJzdAotICAgICAgICByb3cgb2YgcGl4ZWxzIHRvIGJlIHVzZWQgaW4gdGhlIGZpbHRlciBhbGdvcml0aG0uCi0gICAgeF9zdGFydCA9IHZhbHVlIG9mIHggY29vcmRpbmF0ZSBvZiB0eXBlIGludCB0aGF0IHNwZWNpZmllcyB0aGUgZmlyc3QKLSAgICAgICAgY29sdW1uIG9mIHBpeGVscyB0byBiZSB1c2VkIGluIHRoZSBmaWx0ZXIgYWxnb3JpdGhtLgotICAgIHlfYmxrX3N0YXJ0ID0gdmFsdWUgb2YgdGhlIHkgY29vcmRpbmF0ZSBvZiB0eXBlIGludCB0aGF0IHNwZWNpZmllcyB0aGUKLSAgICAgICAgcm93IG9mIHBpeGVscyB3aGljaCBjb250YWlucyB0aGUgc3RhcnQgb2YgYSBibG9jay4gVGhlIHJvdwotICAgICAgICBzcGVjaWZpZWQgYnkgeV9ibGtfc3RhcnQrQkxLX1NJWkUgaXMgdGhlIGxhc3Qgcm93IG9mIHBpeGVscwotICAgICAgICB0aGF0IGFyZSB1c2VkIGluIHRoZSBmaWx0ZXIgYWxnb3JpdGhtLgotICAgIHhfYmxrX3N0YXJ0ID0gdmFsdWUgb2YgdGhlIHggY29vcmRpbmF0ZSBvZiB0eXBlIGludCB0aGF0IHNwZWNpZmllcyB0aGUKLSAgICAgICAgY29sdW1uIG9mIHBpeGVscyB3aGljaCBjb250YWlucyB0aGUgc3RhcnQgb2YgYSBibG9jay4gIFRoZQotICAgICAgICBjb2x1bW4gc3BlY2lmaWVkIGJ5IHhfYmxrX3N0YXJ0K0JMS19TSVpFIGlzIHRoZSBsYXN0IGNvbHVtbiBvZgotICAgICAgICBwaXhlbHMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgZmlsdGVyIGFsZ29yaXRobS4KLSAgICB0aHIgPSB2YWx1ZSBvZiB0eXBlIGludCB0aGF0IGlzIGNvbXBhcmVkIHRvIHRoZSBlbGVtZW50cyBpbiBSZWNfWSB0bwotICAgICAgICBkZXRlcm1pbmUgaWYgYSBwYXJ0aWN1bGFyIHZhbHVlIGluIFJlY19ZIHdpbGwgYmUgbW9kaWZpZWQgYnkKLSAgICAgICAgdGhlIGZpbHRlciBvciBub3QKLSAgICB3aWR0aCA9IHZhbHVlIG9mIHR5cGUgaW50IHRoYXQgc3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgZGlzcGxheQotICAgICAgICBpbiBwaXhlbHMgKG9yIHBlbHMsIGVxdWl2YWxlbnRseSkuCi0gICAgbWF4X2RpZmYgPSB2YWx1ZSBvZiB0eXBlIGludCB0aGF0IHNwZWNpZmllcyB0aGUgdmFsdWUgdGhhdCBtYXkgYmUgYWRkZWQKLSAgICAgICAgb3Igc3VidHJhY3RlZCBmcm9tIHRoZSBwaXhlbCBpbiBSZWNfWSB0aGF0IGlzIGJlaW5nIGZpbHRlcmVkCi0gICAgICAgIGlmIHRoZSBmaWx0ZXIgYWxnb3JpdGhtIGRlY2lkZXMgdG8gY2hhbmdlIHRoYXQgcGFydGljdWxhcgotICAgICAgICBwaXhlbCdzIGx1bWluYW5jZSB2YWx1ZS4KLQotCi0gTG9jYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gT3V0cHV0czoKLSAgICBOb25lCi0KLSBQb2ludGVycyBhbmQgQnVmZmVycyBNb2RpZmllZDoKLSAgICBCdWZmZXIgcG9pbnRlZCB0byBieSBSZWNfWSBpcyBtb2RpZmllZCB3aXRoIHRoZSBmaWx0ZXJlZAotICAgIGx1bWluYW5jZSB2YWx1ZXMuCi0KLSBMb2NhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0gR2xvYmFsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBOb25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEZVTkNUSU9OIERFU0NSSVBUSU9OCi0KLSBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgYSBtb3Rpb24gY29tcGVuc2F0ZWQgbm9pc2UgZmlsdGVyIHVzaW5nIGFkYXB0aXZlCi0gd2VpZ2h0ZWQgYXZlcmFnaW5nIG9mIGx1bWluYW5jZSB2YWx1ZXMuICAqUmVjX1kgY29udGFpbnMgdGhlIGx1bWluYW5jZSB2YWx1ZXMKLSB0aGF0IGFyZSBiZWluZyBmaWx0ZXJlZC4KLQotIFRoZSBwaWN0dXJlIGJlbG93IGRlcGljdHMgYSAzeDMgZ3JvdXAgb2YgcGl4ZWwgbHVtaW5hbmNlIHZhbHVlcy4gIFRoZSAidSIsICJjIiwKLSBhbmQgImwiIHN0YW5kIGZvciAidXBwZXIiLCAiY2VudGVyIiBhbmQgImxvd2VyIiwgcmVzcGVjdGl2ZWx5LiAgVGhlIGxvY2F0aW9uCi0gb2YgcGVsYzAgaXMgc3BlY2lmaWVkIGJ5IHhfc3RhcnQgYW5kIHlfc3RhcnQgaW4gdGhlIDEtRCBhcnJheSAiUmVjX1kiIGFzCi0gZm9sbG93cyAoYXNzdW1pbmcgeF9zdGFydD0wKToKLQotIGxvY2F0aW9uIG9mIHBlbGMwID0gWyh5X3N0YXJ0KzEpICogd2lkdGhdICsgeF9zdGFydAotCi0gTW92aW5nIHVwIG9yIGRvd24gMSByb3cgKG1vdmluZyBmcm9tIHBlbHUyIHRvIHBlbGMyLCBmb3IgZXhhbXBsZSkgaXMgZG9uZSBieQotIGluY3JlbWVudGluZyBvciBkZWNyZW1lbnRpbmcgIndpZHRoIiBlbGVtZW50cyB3aXRoaW4gUmVjX1kuCi0KLSBUaGUgY29vcmRpbmF0ZXMgb2YgdGhlIHVwcGVyIGxlZnQgaGFuZCBjb3JuZXIgb2YgYSBibG9jayAobm90IHRoZSBncm91cCBvZgotIDkgcGl4ZWxzIGRlcGljdGVkIGluIHRoZSBmaWd1cmUgYmVsb3cpIGlzIHNwZWNpZmllZCBieQotICh5X2Jsa19zdGFydCwgeF9ibGtfc3RhcnQpLiAgVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGJsb2NrIGlzIEJMS1NJWkUuCi0gKHlfc3RhcnQseF9zdGFydCkgbWF5IGJlIHNwZWNpZmllZCBpbmRlcGVuZGVudGx5IG9mICh5X2Jsa19zdGFydCwgeF9ibGtfc3RhcnQpLgotCi0gICAgKHlfc3RhcnQseF9zdGFydCkKLSAtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHwgICB8ICAgfCAgIHwgICB8Ci0gICAgfCAgIFggICB8IHBlbHUxIHwgcGVsdTIgfAotICAgIHwgcGVsdTAgfCAgIHwgICB8Ci0gICAgfCAgIHwgICB8ICAgfAotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgfCAgIHwgICB8ICAgfAotICAgIHwgcGVsYzAgfCBwZWxjMSB8IHBlbGMyIHwKLSAgICB8ICAgfCAgIHwgICB8Ci0gICAgfCAgIHwgICB8ICAgfAotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgfCAgIHwgICB8ICAgfAotICAgIHwgcGVsbDAgfCBwZWxsMSB8IHBlbGwyIHwKLSAgICB8ICAgfCAgIHwgICB8Ci0gICAgfCAgIHwgICB8ICAgfAotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSBUaGUgZmlsdGVyaW5nIG9mIHRoZSBsdW1pbmFuY2UgdmFsdWVzIGlzIGFjaGlldmVkIGJ5IGNvbXBhcmluZyB0aGUgOQotIGx1bWluYW5jZSB2YWx1ZXMgdG8gYSB0aHJlc2hvbGQgdmFsdWUgKCJ0aHIiKSBhbmQgdGhlbiBjaGFuZ2luZyB0aGUKLSBsdW1pbmFuY2UgdmFsdWUgb2YgcGVsYzEgaWYgYWxsIG9mIHRoZSB2YWx1ZXMgYXJlIGFib3ZlIG9yIGFsbCBvZiB0aGUgdmFsdWVzCi0gYXJlIGJlbG93IHRoZSB0aHJlc2hvbGQuICBUaGUgYW1vdW50IHRoYXQgdGhlIGx1bWluYW5jZSB2YWx1ZSBpcyBjaGFuZ2VkCi0gZGVwZW5kcyBvbiBhIHdlaWdodGVkIHN1bSBvZiB0aGUgOSBsdW1pbmFuY2UgdmFsdWVzLiBUaGUgcG9zaXRpb24gb2YgUGVsYzEKLSBpcyB0aGVuIGFkdmFuY2VkIHRvIHRoZSByaWdodCBieSBvbmUgKGFzIHdlbGwgYXMgYWxsIG9mIHRoZSBzdXJyb3VuZGluZyBwaXhlbHMpCi0gYW5kIHRoZSBzYW1lIGNhbGN1bGF0aW9uIGlzIHBlcmZvcm1lZCBhZ2FpbiBmb3IgdGhlIGx1bWluYW5jZSB2YWx1ZSBvZiB0aGUgbmV3Ci0gUGVsYzEuIFRoaXMgY29udGludWVzIHJvdy13aXNlIHVudGlsIHBpeGVscyBpbiB0aGUgbGFzdCByb3cgb2YgdGhlIGJsb2NrIGFyZQotIGZpbHRlcmVkLgotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFUVVJUkVNRU5UUwotCi0gTm9uZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVGRVJFTkNFUwotCi0gLi5cY29yZWxpYnNcZGVjb2Rlclxjb21tb25cc3JjXHBvc3RfcHJvYy5jCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFBTRVVETy1DT0RFCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFU09VUkNFUyBVU0VECi0gICBXaGVuIHRoZSBjb2RlIGlzIHdyaXR0ZW4gZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3NvciB0aGUKLSAgICAgdGhlIHJlc291cmNlcyB1c2VkIHNob3VsZCBiZSBkb2N1bWVudGVkIGJlbG93LgotCi0gU1RBQ0sgVVNBR0U6IFtzdGFjayBjb3VudCBmb3IgdGhpcyBtb2R1bGVdICsgW3ZhcmlhYmxlIHRvIHJlcHJlc2VudAotICAgICAgICAgIHN0YWNrIHVzYWdlIGZvciBlYWNoIHN1YnJvdXRpbmUgY2FsbGVkXQotCi0gICAgIHdoZXJlOiBbc3RhY2sgdXNhZ2UgdmFyaWFibGVdID0gc3RhY2sgdXNhZ2UgZm9yIFtzdWJyb3V0aW5lCi0gICAgICAgICBuYW1lXSAoc2VlIFtmaWxlbmFtZV0uZXh0KQotCi0gREFUQSBNRU1PUlkgVVNFRDogeCB3b3JkcwotCi0gUFJPR1JBTSBNRU1PUlkgVVNFRDogeCB3b3JkcwotCi0gQ0xPQ0sgQ1lDTEVTOiBbY3ljbGUgY291bnQgZXF1YXRpb24gZm9yIHRoaXMgbW9kdWxlXSArIFt2YXJpYWJsZQotICAgICAgICAgICB1c2VkIHRvIHJlcHJlc2VudCBjeWNsZSBjb3VudCBmb3IgZWFjaCBzdWJyb3V0aW5lCi0gICAgICAgICAgIGNhbGxlZF0KLQotICAgICB3aGVyZTogW2N5Y2xlIGNvdW50IHZhcmlhYmxlXSA9IGN5Y2xlIGNvdW50IGZvciBbc3Vicm91dGluZQotICAgICAgICBuYW1lXSAoc2VlIFtmaWxlbmFtZV0uZXh0KQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElOQ0xVREVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICAgICJtcDRkZWNfbGliLmgiCi0jaW5jbHVkZSAgICAicG9zdF9wcm9jLmgiCi0jaW5jbHVkZSAgICAibXA0ZGVmLmgiCi0KLSNkZWZpbmUgT1NDTF9ESVNBQkxFX1dBUk5JTkdfQ09OVl9QT1NTSUJMRV9MT1NTX09GX0RBVEEKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1BQ1JPUwotOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgREVGSU5FUwotOyBJbmNsdWRlIGFsbCBwcmUtcHJvY2Vzc29yIHN0YXRlbWVudHMgaGVyZS4gSW5jbHVkZSBjb25kaXRpb25hbAotOyBjb21waWxlIHZhcmlhYmxlcyBhbHNvLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBGVU5DVElPTiBERUZJTklUSU9OUwotOyBGdW5jdGlvbiBQcm90b3R5cGUgZGVjbGFyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgREVGSU5JVElPTlMKLTsgVmFyaWFibGUgZGVjbGFyYXRpb24gLSBkZWZpbmVkIGhlcmUgYW5kIHVzZWQgb3V0c2lkZSB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBGVU5DVElPTiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgZnVuY3Rpb25zIGRlZmluZWQgZWxzZXdoZXJlIGFuZCByZWZlcmVuY2VkIGluIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEdMT0JBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZVTkNUSU9OIENPREUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBBZGFwdGl2ZVNtb290aF9Ob01NWCgKLSAgICB1aW50OCAqUmVjX1ksICAgICAgIC8qIGkvbyAgKi8KLSAgICBpbnQgeV9zdGFydCwgICAgICAgIC8qIGkgICAgKi8KLSAgICBpbnQgeF9zdGFydCwgICAgICAgIC8qIGkgICAgKi8KLSAgICBpbnQgeV9ibGtfc3RhcnQsICAgIC8qIGkgICAgKi8KLSAgICBpbnQgeF9ibGtfc3RhcnQsICAgIC8qIGkgICAgKi8KLSAgICBpbnQgdGhyLCAgICAgICAgLyogaSAgICAqLwotICAgIGludCB3aWR0aCwgICAgICAvKiBpICAgICovCi0gICAgaW50IG1heF9kaWZmICAgICAgICAvKiBpICAgICovCi0pCi17Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgaW50ICBzaWduX3ZbMTVdOwotICAgIGludCBzdW1fdlsxNV07Ci0gICAgaW50ICpzdW1fVl9wdHI7Ci0gICAgaW50ICpzaWduX1ZfcHRyOwotICAgIHVpbnQ4IHBlbHU7Ci0gICAgdWludDggcGVsYzsKLSAgICB1aW50OCBwZWxsOwotICAgIHVpbnQ4ICpwZWxwOwotICAgIHVpbnQ4IG9sZHJvd1sxNV07Ci0gICAgaW50ICBzdW07Ci0gICAgaW50IHN1bTE7Ci0gICAgdWludDggKlJlY19ZX3B0cjsKLSAgICBpbnQzMiAgYWRkcl92OwotICAgIGludCByb3dfY250cjsKLSAgICBpbnQgY29sX2NudHI7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIC8qICBmaXJzdCByb3cKLSAgICAqLwotICAgIGFkZHJfdiA9IChpbnQzMikoeV9zdGFydCArIDEpICogd2lkdGg7ICAvKiB5IGNvb3JkIG9mIDFzdCBlbGVtZW50IGluIHRoZSByb3cgIC8KLSAgICAgICAgICAgICAgICAgICAgIC9jb250YWluaW5nIHBlbGMgcGl4ZWwgLyAgICAgKi8KLSAgICBSZWNfWV9wdHIgPSAmUmVjX1lbYWRkcl92ICsgeF9zdGFydF07ICAvKiBpbml0aWFsaXppbmcgcG9pbnRlciB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAgcGVsYzAgcG9zaXRpb24gICovCi0gICAgc3VtX1ZfcHRyID0gJnN1bV92WzBdOyAgLyogaW5pdGlhbGl6aW5nIHBvaW50ZXIgdG8gMHRoIGVsZW1lbnQgb2YgYXJyYXkKLSAgICAgICAgICAgICAgICAvICAgdGhhdCB3aWxsIGNvbnRhaW4gd2VpZ2h0ZWQgc3VtcyBvZiBwaXhlbAotICAgICAgICAgICAgICAgIC8gICBsdW1pbmFuY2UgdmFsdWVzICovCi0gICAgc2lnbl9WX3B0ciA9ICZzaWduX3ZbMF07ICAvKiAgaW5pdGlhbGl6aW5nIHBvaW50ZXIgdG8gMHRoIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgIC8gICBhcnJheSB0aGF0IHdpbGwgY29udGFpbiBzdW1zIHRoYXQgaW5kaWNhdGUKLSAgICAgICAgICAgICAgICAgIC8gICAgaG93IG1hbnkgb2YgdGhlIDkgcGl4ZWxzIGFyZSBhYm92ZSBvciBiZWxvdwotICAgICAgICAgICAgICAgICAgLyAgICB0aGUgdGhyZXNob2xkIHZhbHVlICh0aHIpICAgICovCi0gICAgcGVscCA9ICZvbGRyb3dbMF07ICAvKiBpbml0aWFsaXppbmcgcG9pbnRlciB0byB0aGUgMHRoIGVsZW1lbnQgb2YgYXJyYXkKLSAgICAgICAgICAgICAgICAvICAgIHRoYXQgd2lsbCBjb250YWluIGN1cnJlbnQgdmFsdWVzIG9mIHBlbGMgdGhhdAotICAgICAgICAgICAgICAgIC8gICBhcmUgc2F2ZWQgYW5kIHVzZWQgYXMgdmFsdWVzIG9mIHBlbHUgd2hlbiB0aGUKLSAgICAgICAgICAgICAgICAvICAgbmV4dCByb3cgb2YgcGl4ZWxzIGFyZSBmaWx0ZXJlZCAqLwotCi0gICAgcGVsdSA9ICooUmVjX1lfcHRyIC0gd2lkdGgpOyAgLyogYXNzaWduaW5nIHZhbHVlIG9mIHBlbHUwIHRvIHBlbHUgICovCi0gICAgKnBlbHArKyA9IHBlbGMgPSAqUmVjX1lfcHRyOyAvKiBhc3NpZ25pbmcgdmFsdWUgb2YgcGVsYzAgdG8gcGVsYyBhbmQKLSAgICAgICAgICAgICAgICAgICAgIC8gIHN0b3JpbmcgdGhpcyB2YWx1ZSBpbiBwZWxwIHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICAvICAgd2lsbCBiZSB1c2VkIGFzIHZhbHVlIG9mIHBlbHUwIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgIC8gIG5leHQgcm93IGlzIGZpbHRlcmVkICovCi0gICAgcGVsbCA9ICooUmVjX1lfcHRyICsgd2lkdGgpOyAgLyogYXNzaWduaW5nIHZhbHVlIG9mIHBlbGwwIHRvIHBlbGwgKi8KLSAgICBSZWNfWV9wdHIrKzsgLyogYWR2YW5jaW5nIHBvaW50ZXIgZnJvbSBwZWxjMCB0byBwZWxjMSAqLwotICAgICpzdW1fVl9wdHIrKyA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7ICAvKiB3ZWlnaHRlZCBzdW0gb2YgcGVsdTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyAgcGVsYzAgYW5kIHBlbGwwICAqLwotICAgIC8qIHN1bSBvZiAwJ3MgYW5kIDEncyAoMCBpZiBwaXhlbCB2YWx1ZSBpcyBiZWxvdyB0aHIsIDEgaWYgdmFsdWUKLSAgICAvaXMgYWJvdmUgdGhyKSAgKi8KLSAgICAqc2lnbl9WX3B0cisrID0gSU5ERVgocGVsdSwgdGhyKSArIElOREVYKHBlbGMsIHRocikgKyBJTkRFWChwZWxsLCB0aHIpOwotCi0KLSAgICBwZWx1ID0gKihSZWNfWV9wdHIgLSB3aWR0aCk7ICAvKiBhc3NpZ25pbmcgdmFsdWUgb2YgcGVsdTEgdG8gcGVsdSAqLwotICAgICpwZWxwKysgPSBwZWxjID0gKlJlY19ZX3B0cjsgLyogYXNzaWduaW5nIHZhbHVlIG9mIHBlbGMxIHRvIHBlbGMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAvICBzdG9yaW5nIHRoaXMgdmFsdWUgaW4gcGVscCB3aGljaAotICAgICAgICAgICAgICAgICAgICAgLyAgd2lsbCBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBvZiBwZWx1MSB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAvICBuZXh0IHJvdyBpcyBmaWx0ZXJlZCAqLwotICAgIHBlbGwgPSAqKFJlY19ZX3B0ciArIHdpZHRoKTsgIC8qIGFzc2lnbmluZyB2YWx1ZSBvZiBwZWxsMSB0byBwZWxsICovCi0gICAgUmVjX1lfcHRyKys7ICAvKiBhZHZhbmNpbmcgcG9pbnRlciBmcm9tIHBlbGMxIHRvIHBlbGMyICovCi0gICAgKnN1bV9WX3B0cisrID0gcGVsdSArIChwZWxjIDw8IDEpICsgcGVsbDsgLyogd2VpZ2h0ZWQgc3VtIG9mIHBlbHUxLAotICAgICAgICAgICAgICAgICAgICAgICAgLyBwZWxjMSBhbmQgcGVsbDEgICovCi0gICAgLyogc3VtIG9mIDAncyBhbmQgMSdzICgwIGlmIHBpeGVsIHZhbHVlIGlzIGJlbG93IHRociwgMSBpZiB2YWx1ZQotICAgIC9pcyBhYm92ZSB0aHIpICAqLwotICAgICpzaWduX1ZfcHRyKysgPSBJTkRFWChwZWx1LCB0aHIpICsgSU5ERVgocGVsYywgdGhyKSArIElOREVYKHBlbGwsIHRocik7Ci0KLSAgICAvKiBUaGUgbG9vcCBiZWxvdyBwZXJmb3JtcyB0aGUgZmlsdGVyaW5nIGZvciB0aGUgZmlyc3Qgcm93IG9mCi0gICAgLyAgIHBpeGVscyBpbiB0aGUgcmVnaW9uLiAgSXQgc3RlcHMgYWNyb3NzIHRoZSByZW1haW5pbmcgcGl4ZWxzIGluCi0gICAgLyAgIHRoZSByb3cgYW5kIGFsdGVycyB0aGUgbHVtaW5hbmNlIHZhbHVlIG9mIHBlbGMxIGlmIG5lY2Vzc2FyeSwKLSAgICAvICAgZGVwZW5kaW5nIG9uIHRoZSBsdW1pbmFuY2UgdmFsdWVzIG9mIHRoZSBhZGphY2VudCBwaXhlbHMqLwotCi0gICAgZm9yIChjb2xfY250ciA9ICh4X2Jsa19zdGFydCArIEJMS1NJWkUgLSAxKSAtIHhfc3RhcnQ7IGNvbF9jbnRyID4gMDsgY29sX2NudHItLSkKLSAgICB7Ci0gICAgICAgIHBlbHUgPSAqKFJlY19ZX3B0ciAtIHdpZHRoKTsgIC8qIGFzc2lnbmluZyB2YWx1ZSBvZiBwZWx1MiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgLyAgIHBlbHUgKi8KLSAgICAgICAgKnBlbHArKyA9IHBlbGMgPSAqUmVjX1lfcHRyOyAvKiBhc3NpZ25pbmcgdmFsdWUgb2YgcGVsYzIgdG8gcGVsYwotICAgICAgICAgICAgICAgICAgICAgICAgIC8gYW5kIHN0b3JpbmcgdGhpcyB2YWx1ZSBpbiBwZWxwCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyB3aGljaCB3aWxsIGJlIHVzZWQgICBhcyB2YWx1ZSBvZiBwZWx1MgotICAgICAgICAgICAgICAgICAgICAgICAgIC8gd2hlbiBuZXh0IHJvdyBpcyBmaWx0ZXJlZCAqLwotICAgICAgICBwZWxsID0gKihSZWNfWV9wdHIgKyB3aWR0aCk7IC8qIGFzc2lnbmluZyB2YWx1ZSBvZiBwZWxsMiB0byBwZWxsICovCi0KLSAgICAgICAgLyogd2VpZ2h0ZWQgc3VtIG9mIHBlbHUxLCBwZWxjMSBhbmQgcGVsbDEgICovCi0gICAgICAgICpzdW1fVl9wdHIgPSBwZWx1ICsgKHBlbGMgPDwgMSkgKyBwZWxsOwotICAgICAgICAvKiBzdW0gb2YgMCdzIGFuZCAxJ3MgKDAgaWYgcGl4ZWwgdmFsdWUgaXMgYmVsb3cgdGhyLAotICAgICAgICAvMSBpZiB2YWx1ZSBpcyBhYm92ZSB0aHIpICAqLwotICAgICAgICAqc2lnbl9WX3B0ciA9IElOREVYKHBlbHUsIHRocikgKyBJTkRFWChwZWxjLCB0aHIpICsKLSAgICAgICAgICAgICAgICAgICAgICBJTkRFWChwZWxsLCB0aHIpOwotICAgICAgICAvKiB0aGUgdmFsdWUgb2Ygc3VtMSBpbmRpY2F0ZXMgaG93IG1hbnkgb2YgdGhlIDkgcGl4ZWxzJwotICAgICAgICAvbHVtaW5hbmNlIHZhbHVlcyBhcmUgYWJvdmUgb3IgZXF1YWwgdG8gdGhyICovCi0gICAgICAgIHN1bTEgPSAqKHNpZ25fVl9wdHIgLSAyKSArICooc2lnbl9WX3B0ciAtIDEpICsgKnNpZ25fVl9wdHI7Ci0KLSAgICAgICAgLyogYWx0ZXIgdGhlIGx1bWluYW5jZSB2YWx1ZSBvZiBwZWxjMSBpZiBhbGwgOSBsdW1pbmFuY2UgdmFsdWVzCi0gICAgICAgIC9hcmUgYWJvdmUgb3IgZXF1YWwgdG8gdGhyIG9yIGlmIGFsbCA5IHZhbHVlcyBhcmUgYmVsb3cgdGhyICovCi0gICAgICAgIGlmIChzdW0xID09IDAgfHwgc3VtMSA9PSA5KQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBzdW0gaXMgYSB3ZWlnaHRlZCBhdmVyYWdlIG9mIHRoZSA5IHBpeGVsIGx1bWluYW5jZQotICAgICAgICAgICAgL3ZhbHVlcyAgICovCi0gICAgICAgICAgICBzdW0gPSAoKihzdW1fVl9wdHIgLSAyKSArICgqKHN1bV9WX3B0ciAtIDEpIDw8IDEpICsKLSAgICAgICAgICAgICAgICAgICAqc3VtX1ZfcHRyICsgOCkgPj4gNDsKLQotICAgICAgICAgICAgUmVjX1lfcHRyLS07ICAvKiBtb3ZlIHBvaW50ZXIgYmFjayB0byBwZWxjMSAgKi8KLSAgICAgICAgICAgIC8qIElmIGx1bWluYW5jZSB2YWx1ZSBvZiBwZWxjMSBpcyBsYXJnZXIgdGhhbgotICAgICAgICAgICAgLyBzdW0gYnkgbW9yZSB0aGFuIG1heF9kaWZmLCB0aGVuIHN1YnJhY3QgbWF4X2RpZmYKLSAgICAgICAgICAgIC8gZnJvbSBsdW1pbmFuY2UgdmFsdWUgb2YgcGVsYzEqLwotICAgICAgICAgICAgaWYgKChpbnQpKCpSZWNfWV9wdHIgLSBzdW0pID4gbWF4X2RpZmYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VtID0gKlJlY19ZX3B0ciAtIG1heF9kaWZmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogSWYgbHVtaW5hbmNlIHZhbHVlIG9mIHBlbGMxIGlzIHNtYWxsZXIgdGhhbgotICAgICAgICAgICAgLyBzdW0gYnkgbW9yZSB0aGFuIG1heF9kaWZmLCB0aGVuIGFkZCBtYXhfZGlmZgotICAgICAgICAgICAgLyB0byBsdW1pbmFuY2UgdmFsdWUgb2YgcGVsYzEqLwotICAgICAgICAgICAgZWxzZSBpZiAoKGludCkoKlJlY19ZX3B0ciAtIHN1bSkgPCAtbWF4X2RpZmYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VtID0gKlJlY19ZX3B0ciArIG1heF9kaWZmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKlJlY19ZX3B0cisrID0gc3VtOyAvKiBhc3NpZ24gdmFsdWUgb2Ygc3VtIHRvIHBlbGMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFkdmFuY2UgcG9pbnRlciB0byBwZWxjMiAqLwotICAgICAgICB9Ci0gICAgICAgIFJlY19ZX3B0cisrOyAvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV3IHZhbHVlIG9mIHBlbGMyCi0gICAgICAgICAgICAgICAgIC8gICBvbGQgcGVsYzIgaXMgbm93IHRyZWF0ZWQgYXMgcGVsYzEqLwotICAgICAgICBzdW1fVl9wdHIrKzsgLyogcG9pbnRlciBpcyBhZHZhbmNlZCBzbyBuZXh0IHdlaWdodGVkIHN1bSBtYXkKLSAgICAgICAgICAgICAgICAgLyAgYmUgc2F2ZWQgKi8KLSAgICAgICAgc2lnbl9WX3B0cisrOyAvKiBwb2ludGVyIGlzIGFkdmFuY2VkIHNvIG5leHQgc3VtIG9mIDAncyBhbmQKLSAgICAgICAgICAgICAgICAgIC8gMSdzIG1heSBiZSBzYXZlZCAgKi8KLSAgICB9Ci0KLSAgICAvKiBUaGUgbmVzdGVkIGxvb3BzIGJlbG93IHBlcmZvcm0gdGhlIGZpbHRlcmluZyBmb3IgdGhlIHJlbWFpbmluZyByb3dzICovCi0KLSAgICBhZGRyX3YgPSAoeV9zdGFydCArIDIpICogd2lkdGg7ICAvKiBhZHZhbmNlIGFkZHJfdiB0byB0aGUgbmV4dCByb3cKLSAgICAgICAgICAgICAgICAgICAgIC8gICAoY29ycmVzcG9uZGluZyB0byBwZWxsMCkqLwotICAgIC8qIFRoZSBvdXRlciBsb29wIHN0ZXBzIHRocm91Z2h0IHRoZSByb3dzLiAgICovCi0gICAgZm9yIChyb3dfY250ciA9ICh5X2Jsa19zdGFydCArIEJMS1NJWkUpIC0gKHlfc3RhcnQgKyAyKTsgcm93X2NudHIgPiAwOyByb3dfY250ci0tKQotICAgIHsKLSAgICAgICAgUmVjX1lfcHRyID0gJlJlY19ZW2FkZHJfdiArIHhfc3RhcnRdOyAvKiBhZHZhbmNlIHBvaW50ZXIgdG8KLSAgICAgICAgICAgIC90aGUgb2xkIHBlbGwwLCB3aGljaCBoYXMgYmVjb21lIHRoZSBuZXcgcGVsYzAgKi8KLSAgICAgICAgYWRkcl92ICs9IHdpZHRoOyAgLyogbW92ZSBhZGRyX3YgZG93biAxIHJvdyAqLwotICAgICAgICBzdW1fVl9wdHIgPSAmc3VtX3ZbMF07ICAvKiByZS1pbml0aWFsaXppbmcgcG9pbnRlciAqLwotICAgICAgICBzaWduX1ZfcHRyID0gJnNpZ25fdlswXTsgIC8qIHJlLWluaXRpbGFpemluZyBwb2ludGVyICovCi0gICAgICAgIHBlbHAgPSAmb2xkcm93WzBdOyAvKiByZS1pbml0aWFsaXppbmcgcG9pbnRlciAqLwotCi0gICAgICAgIHBlbHUgPSAqcGVscDsgLyogc2V0dGluZyBwZWx1MCB0byBvbGQgdmFsdWUgb2YgcGVsYzAgKi8KLSAgICAgICAgKnBlbHArKyA9IHBlbGMgPSAqUmVjX1lfcHRyOwotICAgICAgICBwZWxsID0gKihSZWNfWV9wdHIgKyB3aWR0aCk7Ci0gICAgICAgIFJlY19ZX3B0cisrOwotICAgICAgICAqc3VtX1ZfcHRyKysgPSBwZWx1ICsgKHBlbGMgPDwgMSkgKyBwZWxsOwotICAgICAgICAqc2lnbl9WX3B0cisrID0gSU5ERVgocGVsdSwgdGhyKSArIElOREVYKHBlbGMsIHRocikgKwotICAgICAgICAgICAgICAgICAgICAgICAgSU5ERVgocGVsbCwgdGhyKTsKLQotICAgICAgICBwZWx1ID0gKnBlbHA7IC8qIHNldHRpbmcgcGVsdTEgdG8gb2xkIHZhbHVlIG9mIHBlbGMxICovCi0gICAgICAgICpwZWxwKysgPSBwZWxjID0gKlJlY19ZX3B0cjsKLSAgICAgICAgcGVsbCA9ICooUmVjX1lfcHRyICsgd2lkdGgpOwotICAgICAgICBSZWNfWV9wdHIrKzsKLSAgICAgICAgKnN1bV9WX3B0cisrID0gcGVsdSArIChwZWxjIDw8IDEpICsgcGVsbDsKLSAgICAgICAgKnNpZ25fVl9wdHIrKyA9IElOREVYKHBlbHUsIHRocikgKyBJTkRFWChwZWxjLCB0aHIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgIElOREVYKHBlbGwsIHRocik7Ci0gICAgICAgIC8qIFRoZSBpbm5lciBsb29wIHN0ZXBzIHRocm91Z2ggdGhlIGNvbHVtbnMgKi8KLSAgICAgICAgZm9yIChjb2xfY250ciA9ICh4X2Jsa19zdGFydCArIEJMS1NJWkUgLSAxKSAtIHhfc3RhcnQ7IGNvbF9jbnRyID4gMDsgY29sX2NudHItLSkKLSAgICAgICAgewotICAgICAgICAgICAgcGVsdSA9ICpwZWxwOyAvKiBzZXR0aW5nIHBlbHUyIHRvIG9sZCB2YWx1ZSBvZiBwZWxjMiAqLwotICAgICAgICAgICAgKnBlbHArKyA9IHBlbGMgPSAqUmVjX1lfcHRyOwotICAgICAgICAgICAgcGVsbCA9ICooUmVjX1lfcHRyICsgd2lkdGgpOwotCi0gICAgICAgICAgICAqc3VtX1ZfcHRyID0gcGVsdSArIChwZWxjIDw8IDEpICsgcGVsbDsKLSAgICAgICAgICAgICpzaWduX1ZfcHRyID0gSU5ERVgocGVsdSwgdGhyKSArIElOREVYKHBlbGMsIHRocikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBJTkRFWChwZWxsLCB0aHIpOwotCi0gICAgICAgICAgICBzdW0xID0gKihzaWduX1ZfcHRyIC0gMikgKyAqKHNpZ25fVl9wdHIgLSAxKSArICpzaWduX1ZfcHRyOwotICAgICAgICAgICAgLyogdGhlICJpZiIgc3RhdGVtZW50IGJlbG93IGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgaW4KLSAgICAgICAgICAgIC8gdGhlIGZpcnN0IGxvb3AgKi8KLSAgICAgICAgICAgIGlmIChzdW0xID09IDAgfHwgc3VtMSA9PSA5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1bSA9ICgqKHN1bV9WX3B0ciAtIDIpICsgKCooc3VtX1ZfcHRyIC0gMSkgPDwgMSkgKwotICAgICAgICAgICAgICAgICAgICAgICAqc3VtX1ZfcHRyICsgOCkgPj4gNDsKLQotICAgICAgICAgICAgICAgIFJlY19ZX3B0ci0tOwotICAgICAgICAgICAgICAgIGlmICgoaW50KSgqUmVjX1lfcHRyIC0gc3VtKSA+IG1heF9kaWZmKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3VtID0gKlJlY19ZX3B0ciAtIG1heF9kaWZmOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICgoaW50KSgqUmVjX1lfcHRyIC0gc3VtKSA8IC1tYXhfZGlmZikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN1bSA9ICpSZWNfWV9wdHIgKyBtYXhfZGlmZjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKlJlY19ZX3B0cisrID0gKHVpbnQ4KSBzdW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBSZWNfWV9wdHIrKzsKLSAgICAgICAgICAgIHN1bV9WX3B0cisrOwotICAgICAgICAgICAgc2lnbl9WX3B0cisrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybjsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY2h2X2ZpbHRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jaHZfZmlsdGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU5M2I0OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jaHZfZmlsdGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY1NCArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKLQotIElucHV0czoKLSAgICBbaW5wdXRfdmFyaWFibGVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGlucHV0IHRvIG1vZHVsZSwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLQotIExvY2FsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICBbbG9jYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGxvY2FsIHN0b3JlLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLSAgICBbbG9jYWxfYnVmZmVyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBsb2NhbCBidWZmZXIsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLSAgICBbbG9jYWxfcHRyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBsb2NhbCBwb2ludGVyLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0KLSBHbG9iYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIFtnbG9iYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGdsb2JhbCBzdG9yZSwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotICAgIFtnbG9iYWxfYnVmZmVyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBnbG9iYWwgYnVmZmVyLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0gICAgW2dsb2JhbF9wdHJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGdsb2JhbCBwb2ludGVyLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotCi0gT3V0cHV0czoKLSAgICBbcmV0dXJuX3ZhcmlhYmxlX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIGRhdGEvcG9pbnRlciByZXR1cm5lZAotICAgICAgICAgICAgICAgICAgYnkgbW9kdWxlLCBpdHMgdHlwZSBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAod2hlbiBhcHBsaWNhYmxlKV0KLQotIFBvaW50ZXJzIGFuZCBCdWZmZXJzIE1vZGlmaWVkOgotICAgIFt2YXJpYWJsZV9iZnJfcHRyXSBwb2ludHMgdG8gdGhlIFtkZXNjcmliZSB3aGVyZSB0aGUKLSAgICAgIHZhcmlhYmxlX2Jmcl9wdHIgcG9pbnRzIHRvLCBpdHMgdHlwZSBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoCi0gICAgICAod2hlbiBhcHBsaWNhYmxlKV0KLSAgICBbdmFyaWFibGVfYmZyXSBjb250ZW50cyBhcmUgW2Rlc2NyaWJlIHRoZSBuZXcgY29udGVudHMgb2YKLSAgICAgIHZhcmlhYmxlX2Jmcl0KLQotIExvY2FsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBbbG9jYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpYmUgbmV3IGNvbnRlbnRzLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLQotIEdsb2JhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgW2dsb2JhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmliZSBuZXcgY29udGVudHMsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRlVOQ1RJT04gREVTQ1JJUFRJT04KLQotICAgRm9yIGZhc3QgRGVibG9jayBmaWx0ZXJpbmcKLSAgIE5ld2VyIHZlcnNpb24gKG1hY3JvYmxvY2sgYmFzZWQgcHJvY2Vzc2luZykKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVRVUlSRU1FTlRTCi0KLSBbTGlzdCByZXF1aXJlbWVudHMgdG8gYmUgc2F0aXNmaWVkIGJ5IHRoaXMgbW9kdWxlLl0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVGRVJFTkNFUwotCi0gW0xpc3QgYWxsIHJlZmVyZW5jZXMgdXNlZCBpbiBkZXNpZ25pbmcgdGhpcyBtb2R1bGUuXQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBQU0VVRE8tQ09ERQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVNPVVJDRVMgVVNFRAotICAgV2hlbiB0aGUgY29kZSBpcyB3cml0dGVuIGZvciBhIHNwZWNpZmljIHRhcmdldCBwcm9jZXNzb3IgdGhlCi0gICAgIHRoZSByZXNvdXJjZXMgdXNlZCBzaG91bGQgYmUgZG9jdW1lbnRlZCBiZWxvdy4KLQotIFNUQUNLIFVTQUdFOiBbc3RhY2sgY291bnQgZm9yIHRoaXMgbW9kdWxlXSArIFt2YXJpYWJsZSB0byByZXByZXNlbnQKLSAgICAgICAgICBzdGFjayB1c2FnZSBmb3IgZWFjaCBzdWJyb3V0aW5lIGNhbGxlZF0KLQotICAgICB3aGVyZTogW3N0YWNrIHVzYWdlIHZhcmlhYmxlXSA9IHN0YWNrIHVzYWdlIGZvciBbc3Vicm91dGluZQotICAgICAgICAgbmFtZV0gKHNlZSBbZmlsZW5hbWVdLmV4dCkKLQotIERBVEEgTUVNT1JZIFVTRUQ6IHggd29yZHMKLQotIFBST0dSQU0gTUVNT1JZIFVTRUQ6IHggd29yZHMKLQotIENMT0NLIENZQ0xFUzogW2N5Y2xlIGNvdW50IGVxdWF0aW9uIGZvciB0aGlzIG1vZHVsZV0gKyBbdmFyaWFibGUKLSAgICAgICAgICAgdXNlZCB0byByZXByZXNlbnQgY3ljbGUgY291bnQgZm9yIGVhY2ggc3Vicm91dGluZQotICAgICAgICAgICBjYWxsZWRdCi0KLSAgICAgd2hlcmU6IFtjeWNsZSBjb3VudCB2YXJpYWJsZV0gPSBjeWNsZSBjb3VudCBmb3IgW3N1YnJvdXRpbmUKLSAgICAgICAgbmFtZV0gKHNlZSBbZmlsZW5hbWVdLmV4dCkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJTkNMVURFUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAgICAibXA0ZGVjX2xpYi5oIgotI2luY2x1ZGUgICAgInBvc3RfcHJvYy5oIgotCi0jZGVmaW5lIE9TQ0xfRElTQUJMRV9XQVJOSU5HX0NPTlZfUE9TU0lCTEVfTE9TU19PRl9EQVRBCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNQUNST1MKLTsgRGVmaW5lIG1vZHVsZSBzcGVjaWZpYyBtYWNyb3MgaGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vLyNkZWZpbmUgRklMVEVSX0xFTl84Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBERUZJTkVTCi07IEluY2x1ZGUgYWxsIHByZS1wcm9jZXNzb3Igc3RhdGVtZW50cyBoZXJlLiBJbmNsdWRlIGNvbmRpdGlvbmFsCi07IGNvbXBpbGUgdmFyaWFibGVzIGFsc28uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIEZVTkNUSU9OIERFRklOSVRJT05TCi07IEZ1bmN0aW9uIFByb3RvdHlwZSBkZWNsYXJhdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIERFRklOSVRJT05TCi07IFZhcmlhYmxlIGRlY2xhcmF0aW9uIC0gZGVmaW5lZCBoZXJlIGFuZCB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgRlVOQ1RJT04gUkVGRVJFTkNFUwotOyBEZWNsYXJlIGZ1bmN0aW9ucyBkZWZpbmVkIGVsc2V3aGVyZSBhbmQgcmVmZXJlbmNlZCBpbiB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBHTE9CQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgUkVGRVJFTkNFUwotOyBEZWNsYXJlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgbW9kdWxlIGJ1dCBkZWZpbmVkIGVsc2V3aGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBGdW5jdGlvbiBwcm90b3R5cGUgOiB2b2lkIENvbWJpbmVkSG9yelZlcnRGaWx0ZXIoICAgdWludDggKnJlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKlFQX3N0b3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcHBfbW9kKQotICAgIFBhcmFtZXRlcnMgIDoKLSAgICAgICAgcmVjICAgICA6ICAgcG9pbnRlciB0byB0aGUgZGVjb2RlZCBmcmFtZSBidWZmZXIuCi0gICAgICAgIHdpZHRoICAgOiAgIHdpZHRoIG9mIGRlY29kZWQgZnJhbWUuCi0gICAgICAgIGhlaWdodCAgOiAgIGhlaWdodCBvZiBkZWNvZGVkIGZyYW1lCi0gICAgICAgIFFQX3N0b3JlOiAgIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIFFQIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRlY29kZWQgZnJhbWUuCi0gICAgICAgICAgICAgICAgICAgIEl0IGhhZCBvbmx5IG9uZSB2YWx1ZSBmb3IgZWFjaCBNQi4KLSAgICAgICAgY2hyICAgICA6ICAgbHVtYSBvciBjb2xvciBpbmRpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgID09IDAgbHVtYQotICAgICAgICAgICAgICAgICAgICA9PSAxIGNvbG9yCi0gICAgICAgIHBwX21vZCAgOiAgIFRoZSBzZW1waG9yZSB1c2VkIGZvciBkZWJsb2NraW5nCi0KLSAgICBSZW1hcmsgICAgICA6ICAgVGhlIGZ1bmN0aW9uIGRvIHRoZSBkZWJsb2NraW5nIG9uIGRlY29kZWQgZnJhbWVzLgotICAgICAgICAgICAgICAgICAgICBGaXJzdCBiYXNlZCBvbiB0aGUgc2VtYXBob3JlIGluZm8uLCBpdCBpcyBkaXZpZGVkIGludG8gaGFyZCBhbmQgc29mdCBmaWx0ZXJpbmcuCi0gICAgICAgICAgICAgICAgICAgIFRvIGRpZmZlcmVudGlhdGUgcmVhbCBhbmQgZmFrZSBlZGdlLCBpdCB0aGVuIGNoZWNrIHRoZSBkaWZmZXJlbmNlIHdpdGggUVAgdG8KLSAgICAgICAgICAgICAgICAgICAgZGVjaWRlIHdoZXRoZXIgdG8gZG8gdGhlIGZpbHRlcmluZyBvciBub3QuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZVTkNUSU9OIENPREUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBDb21iaW5lZEhvcnpWZXJ0RmlsdGVyKAotICAgIHVpbnQ4ICpyZWMsCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQsCi0gICAgaW50MTYgKlFQX3N0b3JlLAotICAgIGludCBjaHIsCi0gICAgdWludDggKnBwX21vZCkKLXsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpbnQgYnIsIGJjLCBtYnIsIG1iYzsKLSAgICBpbnQgUVAgPSAxOwotICAgIHVpbnQ4ICpwdHIsICpwdHJfZTsKLSAgICBpbnQgcHBfdywgcHBfaDsKLSAgICBpbnQgYnJ3aWR0aDsKLQotICAgIGludCBqVmFsMCwgalZhbDEsIGpWYWwyOwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgcHBfdyA9ICh3aWR0aCA+PiAzKTsKLSAgICBwcF9oID0gKGhlaWdodCA+PiAzKTsKLQotICAgIGZvciAobWJyID0gMDsgbWJyIDwgcHBfaDsgbWJyICs9IDIpICAgICAgICAgLyogcm93IG9mIGJsb2NrcyAqLwotICAgIHsKLSAgICAgICAgYnJ3aWR0aCA9IG1iciAqIHBwX3c7ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJsb2NrcyBhYm92ZSBjdXJyZW50IGJsb2NrIHJvdyAqLwotICAgICAgICBmb3IgKG1iYyA9IDA7IG1iYyA8IHBwX3c7IG1iYyArPSAyKSAgICAgLyogY29sIG9mIGJsb2NrcyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWNocikKLSAgICAgICAgICAgICAgICBRUCA9IFFQX3N0b3JlWyhicndpZHRoPj4yKSArIChtYmM+PjEpXTsgLyogUVAgaXMgcGVyIE1CIGJhc2VkIHZhbHVlICovCi0KLSAgICAgICAgICAgIC8qKioqKioqKiogZm9yIGVhY2ggYmxvY2sgKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqIEhvcml6LiBGaWx0ZXJpbmcgKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBmb3IgKGJyID0gbWJyICsgMTsgYnIgPCBtYnIgKyAzOyBicisrKSAgLyogMngyIGJsb2NrcyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyd2lkdGggKz0gcHBfdzsgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgYWJvdmUgJiBsZWZ0IGN1cnJlbnQgYmxvY2sgcm93ICovCi0gICAgICAgICAgICAgICAgLyogdGhlIHByb2ZpbGUgb24gQVJNOTIwVCBzaG93cyBzZXBhcmF0ZSB0aGVzZSB0d28gYm91bmRhcnkgY2hlY2sgaXMgZmFzdGVyIHRoYW4gY29tYmluZSB0aGVtICovCi0gICAgICAgICAgICAgICAgaWYgKGJyIDwgcHBfaCkgICAgICAgICAgICAgICAgICAvKiBib3VuZGFyeSA6IGRvbid0IGRvIGl0IG9uIHRoZSBsb3dlc3Qgcm93IGJsb2NrICovCi0gICAgICAgICAgICAgICAgICAgIGZvciAoYmMgPSBtYmM7IGJjIDwgbWJjICsgMjsgYmMrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKiBjaGVjayBib3VuZGFyeSBmb3IgZGVibG9ja2luZyAqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmMgPCBwcF93KSAgICAgICAgICAgICAgLyogYm91bmRhcnkgOiBkb24ndCBkbyBpdCBvbiB0aGUgbW9zdCByaWdodCBjb2wgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSByZWMgKyAoYnJ3aWR0aCA8PCA2KSArIChiYyA8PCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9IGJyd2lkdGggKyBiYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hyKSAgICBRUCA9IFFQX3N0b3JlW2pWYWwwXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9lID0gcHRyICsgODsgICAgICAgIC8qIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGxvb3AgZW5kcyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgocHBfbW9kW2pWYWwwXSYweDAyKSkgJiYgKChwcF9tb2RbalZhbDAtcHBfd10mMHgwMikpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSG9yaXogSGFyZCBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtIHdpZHRoKTsgICAgIC8qIEMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKnB0cjsgICAgICAgICAgICAgICAvKiBEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGpWYWwyID4gMCkgJiYgKGpWYWwyIDwgKFFQIDw8IDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChqVmFsMiA8IDApICYmIChqVmFsMiA+IC0oUVAgPDwgMSkpKSkgLyogKEQtQykgY29tcGFyZWQgd2l0aCAyUVAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gcmVhbCBhbmQgZmFrZSBlZGdlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAoKGpWYWwwICsgalZhbDEpID4+IDEpOyAgICAgLyogKEQrQykvMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gd2lkdGgpID0gKHVpbnQ4KShqVmFsMCk7ICAgIC8qICBDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0ciA9ICh1aW50OCkoalZhbDApOyAgICAgICAgICAvKiAgRCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtICh3aWR0aCA8PCAxKSk7ICAgICAgLyogQiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKihwdHIgKyB3aWR0aCk7ICAgICAgICAgLyogRSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsgICAgICAvKiBFLUIgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqVmFsMiA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyICsgMykgPj4gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxIC09ICgoalZhbDIgKyAzKSA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAod2lkdGggPDwgMSkpID0gKHVpbnQ4KWpWYWwwOyAgICAgICAvKiAgc3RvcmUgQiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIHdpZHRoKSA9ICh1aW50OClqVmFsMTsgICAgICAgICAgLyogc3RvcmUgRSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqVmFsMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwIC09ICgoMyAtIGpWYWwyKSA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgKz0gKCgzIC0galZhbDIpID4+IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtICh3aWR0aCA8PCAxKSkgPSAodWludDgpalZhbDA7ICAgICAgIC8qICBzdG9yZSBCICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgd2lkdGgpID0gKHVpbnQ4KWpWYWwxOyAgICAgICAgICAvKiBzdG9yZSBFICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtICh3aWR0aCA8PCAxKSAtIHdpZHRoKTsgIC8qIEEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICoocHRyICsgKHdpZHRoIDw8IDEpKTsgICAgICAvKiBGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgICAgICAgICAgICAgLyogKEYtQSkgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqVmFsMiA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyICsgNykgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxIC09ICgoalZhbDIgKyA3KSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAod2lkdGggPDwgMSkgLSB3aWR0aCkgPSAodWludDgpKGpWYWwwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAod2lkdGggPDwgMSkpID0gKHVpbnQ4KShqVmFsMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpWYWwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgLT0gKCg3IC0galZhbDIpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSArPSAoKDcgLSBqVmFsMikgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gKHdpZHRoIDw8IDEpIC0gd2lkdGgpID0gKHVpbnQ4KShqVmFsMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgKHdpZHRoIDw8IDEpKSA9ICh1aW50OCkoalZhbDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0vKiBhM18wID4gMlFQICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCsrcHRyIDwgcHRyX2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlICAgLyogSG9yaXogc29mdCBmaWx0ZXIqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtIHdpZHRoKTsgLyogQiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqcHRyOyAgICAgICAgICAgLyogQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgLyogQy1CICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGpWYWwyID4gMCkgJiYgKGpWYWwyIDwgKFFQKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoalZhbDIgPCAwKSAmJiAoalZhbDIgPiAtKFFQKSkpKSAvKiAoQy1CKSBjb21wYXJlZCB3aXRoIFFQICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICgoalZhbDAgKyBqVmFsMSkgPj4gMSk7ICAgICAvKiAoQitDKS8yIGNhbm5vdCBvdmVyZmxvdzsgY2VpbCgpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSB3aWR0aCkgPSAodWludDgpKGpWYWwwKTsgICAgLyogQiA9IChCK0MpLzIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyID0gKHVpbnQ4KWpWYWwwOyAgICAgICAgICAgIC8qIEMgPSAoQitDKS8yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gKHdpZHRoIDw8IDEpKTsgICAgICAvKiBBICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqKHB0ciArIHdpZHRoKTsgICAgICAgICAvKiBEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgICAgICAgICAvKiBELUEgKi8KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpWYWwyID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxIC09ICgoalZhbDIgKyA3KSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKChqVmFsMiArIDcpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtICh3aWR0aCA8PCAxKSkgPSAodWludDgpalZhbDA7ICAgICAgIC8qIEEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyB3aWR0aCkgPSAodWludDgpalZhbDE7ICAgICAgICAgIC8qIEQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoalZhbDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSArPSAoKDcgLSBqVmFsMikgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwIC09ICgoNyAtIGpWYWwyKSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAod2lkdGggPDwgMSkpID0gKHVpbnQ4KWpWYWwwOyAgICAgICAvKiBBICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgd2lkdGgpID0gKHVpbnQ4KWpWYWwxOyAgICAgICAgICAvKiBEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgrK3B0ciA8IHB0cl9lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qIFNvZnQgZmlsdGVyKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0vKiBib3VuZGFyeSBjaGVja2luZyovCi0gICAgICAgICAgICAgICAgICAgIH0vKmJjKi8KLSAgICAgICAgICAgIH0vKmJyKi8KLSAgICAgICAgICAgIGJyd2lkdGggLT0gKHBwX3cgPDwgMSk7Ci0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqIFZlcnQuIEZpbHRlcmluZyAqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIGZvciAoYnIgPSBtYnI7IGJyIDwgbWJyICsgMjsgYnIrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYnIgPCBwcF9oKQotICAgICAgICAgICAgICAgICAgICBmb3IgKGJjID0gbWJjICsgMTsgYmMgPCBtYmMgKyAzOyBiYysrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqIGNoZWNrIGJvdW5kYXJ5IGZvciBkZWJsb2NraW5nICoqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYyA8IHBwX3cpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gcmVjICsgKGJyd2lkdGggPDwgNikgKyAoYmMgPDwgMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSBicndpZHRoICsgYmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNocikgICAgUVAgPSBRUF9zdG9yZVtqVmFsMF07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZSA9IHB0ciArICh3aWR0aCA8PCAzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKHBwX21vZFtqVmFsMC0xXSYweDAxKSkgJiYgKChwcF9tb2RbalZhbDBdJjB4MDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlcnQgSGFyZCBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqcHRyOyAgICAgICAvKiBEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gMSk7IC8qIEMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsgIC8qIEQtQyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChqVmFsMiA+IDApICYmIChqVmFsMiA8IChRUCA8PCAxKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoalZhbDIgPCAwKSAmJiAoalZhbDIgPiAtKFFQIDw8IDEpKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAoalZhbDAgKyBqVmFsMSkgPj4gMTsgICAvKiAoQytEKS8yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0ciAgICAgICAgPSAgIGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gMSkgID0gICBqVmFsMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKihwdHIgKyAxKTsgICAgIC8qIEUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gMik7ICAgICAvKiBCICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgICAgIC8qIEUtQiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpWYWwyID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxIC09ICgoalZhbDIgKyAzKSA+PiAyKTsgICAgICAgIC8qIEUgPSBFIC0oRS1CKS80ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwICs9ICgoalZhbDIgKyAzKSA+PiAyKTsgICAgICAgIC8qIEIgPSBCICsoRS1CKS80ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgMSkgPSBqVmFsMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAyKSA9IGpWYWwwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqVmFsMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxICs9ICgoMyAtIGpWYWwyKSA+PiAyKTsgICAgICAgIC8qIEUgPSBFIC0oRS1CKS80ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwIC09ICgoMyAtIGpWYWwyKSA+PiAyKTsgICAgICAgIC8qIEIgPSBCICsoRS1CKS80ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgMSkgPSBqVmFsMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAyKSA9IGpWYWwwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKihwdHIgKyAyKTsgICAgIC8qIEYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gMyk7ICAgICAvKiBBICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7ICAgICAgICAgIC8qIChGLUEpICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoalZhbDIgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiArIDcpID4+IDMpOyAgICAvKiBGIC09IChGLUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKChqVmFsMiArIDcpID4+IDMpOyAgICAvKiBBICs9IChGLUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAyKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDMpID0galZhbDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpWYWwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiAtIDcpID4+IDMpOyAgICAvKiBGIC09IChGLUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKChqVmFsMiAtIDcpID4+IDMpOyAgICAvKiBBICs9IChGLUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAyKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDMpID0galZhbDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgIC8qIGVuZCBvZiB2ZXIgaGFyZCBmaWxldGVyaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChwdHIgKz0gd2lkdGgpIDwgcHRyX2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlICAgLyogVmVydCBzb2Z0IGZpbHRlciovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICpwdHI7ICAgICAgICAgICAgICAgLyogQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtIDEpOyAgICAgICAgIC8qIEIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoalZhbDIgPiAwKSAmJiAoalZhbDIgPCAoUVApKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChqVmFsMiA8IDApICYmIChqVmFsMiA+IC0oUVApKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9IChqVmFsMCArIGpWYWwxICsgMSkgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyID0galZhbDE7ICAgICAgICAgICAvKiBDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAxKSA9IGpWYWwxOyAgICAgLyogQiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqKHB0ciArIDEpOyAgICAgLyogRCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAyKTsgICAgIC8qIEEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IChqVmFsMSAtIGpWYWwwKTsgICAgICAgIC8qIEQtIEEgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqVmFsMiA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSAtPSAoKChqVmFsMikgKyA3KSA+PiAzKTsgICAgICAvKiBEIC09IChELUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKCgoalZhbDIpICsgNykgPj4gMyk7ICAgICAgLyogQSArPSAoRC1BKS84ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgMSkgPSBqVmFsMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAyKSA9IGpWYWwwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpWYWwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgKz0gKCg3IC0gKGpWYWwyKSkgPj4gMyk7ICAgICAgLyogRCAtPSAoRC1BKS84ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwIC09ICgoNyAtIChqVmFsMikpID4+IDMpOyAgICAgIC8qIEEgKz0gKEQtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIDEpID0galZhbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gMikgPSBqVmFsMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChwdHIgKz0gd2lkdGgpIDwgcHRyX2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogU29mdCBmaWx0ZXIqLwotICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBib3VuZGFyeSovCi0gICAgICAgICAgICAgICAgICAgIH0gLypiYyovCi0gICAgICAgICAgICAgICAgYnJ3aWR0aCArPSBwcF93OwotICAgICAgICAgICAgfS8qYnIqLwotICAgICAgICAgICAgYnJ3aWR0aCAtPSAocHBfdyA8PCAxKTsKLSAgICAgICAgfS8qbWJjKi8KLSAgICAgICAgYnJ3aWR0aCArPSAocHBfdyA8PCAxKTsKLSAgICB9LyptYnIqLwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICByZXR1cm47Ci19Ci12b2lkIENvbWJpbmVkSG9yelZlcnRGaWx0ZXJfTm9Tb2Z0RGVibG9ja2luZygKLSAgICB1aW50OCAqcmVjLAotICAgIGludCB3aWR0aCwKLSAgICBpbnQgaGVpZ2h0LAotICAgIGludDE2ICpRUF9zdG9yZSwKLSAgICBpbnQgY2hyLAotICAgIHVpbnQ4ICpwcF9tb2QpCi17Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgaW50IGJyLCBiYywgbWJyLCBtYmM7Ci0gICAgaW50IFFQID0gMTsKLSAgICB1aW50OCAqcHRyLCAqcHRyX2U7Ci0gICAgaW50IHBwX3csIHBwX2g7Ci0gICAgaW50IGJyd2lkdGg7Ci0KLSAgICBpbnQgalZhbDAsIGpWYWwxLCBqVmFsMjsKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHBwX3cgPSAod2lkdGggPj4gMyk7Ci0gICAgcHBfaCA9IChoZWlnaHQgPj4gMyk7Ci0KLSAgICBmb3IgKG1iciA9IDA7IG1iciA8IHBwX2g7IG1iciArPSAyKSAgICAgICAgIC8qIHJvdyBvZiBibG9ja3MgKi8KLSAgICB7Ci0gICAgICAgIGJyd2lkdGggPSBtYnIgKiBwcF93OyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgYWJvdmUgY3VycmVudCBibG9jayByb3cgKi8KLSAgICAgICAgZm9yIChtYmMgPSAwOyBtYmMgPCBwcF93OyBtYmMgKz0gMikgICAgIC8qIGNvbCBvZiBibG9ja3MgKi8KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFjaHIpCi0gICAgICAgICAgICAgICAgUVAgPSBRUF9zdG9yZVsoYnJ3aWR0aD4+MikgKyAobWJjPj4xKV07IC8qIFFQIGlzIHBlciBNQiBiYXNlZCB2YWx1ZSAqLwotCi0gICAgICAgICAgICAvKioqKioqKioqIGZvciBlYWNoIGJsb2NrICoqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKiBIb3Jpei4gRmlsdGVyaW5nICoqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgZm9yIChiciA9IG1iciArIDE7IGJyIDwgbWJyICsgMzsgYnIrKykgIC8qIDJ4MiBibG9ja3MgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicndpZHRoICs9IHBwX3c7ICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYmxvY2tzIGFib3ZlICYgbGVmdCBjdXJyZW50IGJsb2NrIHJvdyAqLwotICAgICAgICAgICAgICAgIC8qIHRoZSBwcm9maWxlIG9uIEFSTTkyMFQgc2hvd3Mgc2VwYXJhdGUgdGhlc2UgdHdvIGJvdW5kYXJ5IGNoZWNrIGlzIGZhc3RlciB0aGFuIGNvbWJpbmUgdGhlbSAqLwotICAgICAgICAgICAgICAgIGlmIChiciA8IHBwX2gpICAgICAgICAgICAgICAgICAgLyogYm91bmRhcnkgOiBkb24ndCBkbyBpdCBvbiB0aGUgbG93ZXN0IHJvdyBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICBmb3IgKGJjID0gbWJjOyBiYyA8IG1iYyArIDI7IGJjKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKiogY2hlY2sgYm91bmRhcnkgZm9yIGRlYmxvY2tpbmcgKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJjIDwgcHBfdykgICAgICAgICAgICAgIC8qIGJvdW5kYXJ5IDogZG9uJ3QgZG8gaXQgb24gdGhlIG1vc3QgcmlnaHQgY29sIGJsb2NrICovCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gcmVjICsgKGJyd2lkdGggPDwgNikgKyAoYmMgPDwgMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSBicndpZHRoICsgYmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNocikgICAgUVAgPSBRUF9zdG9yZVtqVmFsMF07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZSA9IHB0ciArIDg7ICAgICAgICAvKiBwb2ludGVyIHRvIHdoZXJlIHRoZSBsb29wIGVuZHMgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKHBwX21vZFtqVmFsMF0mMHgwMikpICYmICgocHBfbW9kW2pWYWwwLXBwX3ddJjB4MDIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhvcml6IEhhcmQgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSB3aWR0aCk7ICAgICAvKiBDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICpwdHI7ICAgICAgICAgICAgICAgLyogRCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChqVmFsMiA+IDApICYmIChqVmFsMiA8IChRUCA8PCAxKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoalZhbDIgPCAwKSAmJiAoalZhbDIgPiAtKFFQIDw8IDEpKSkpIC8qIChELUMpIGNvbXBhcmVkIHdpdGggMlFQICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHJlYWwgYW5kIGZha2UgZWRnZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKChqVmFsMCArIGpWYWwxKSA+PiAxKTsgICAgIC8qIChEK0MpLzIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIHdpZHRoKSA9ICh1aW50OCkoalZhbDApOyAgICAvKiAgQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHIgPSAodWludDgpKGpWYWwwKTsgICAgICAgICAgLyogIEQgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAod2lkdGggPDwgMSkpOyAgICAgIC8qIEIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICoocHRyICsgd2lkdGgpOyAgICAgICAgIC8qIEUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7ICAgICAgLyogRS1CICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoalZhbDIgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKChqVmFsMiArIDMpID4+IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSAtPSAoKGpWYWwyICsgMykgPj4gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gKHdpZHRoIDw8IDEpKSA9ICh1aW50OClqVmFsMDsgICAgICAgLyogIHN0b3JlIEIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyB3aWR0aCkgPSAodWludDgpalZhbDE7ICAgICAgICAgIC8qIHN0b3JlIEUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoalZhbDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCAtPSAoKDMgLSBqVmFsMikgPj4gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxICs9ICgoMyAtIGpWYWwyKSA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAod2lkdGggPDwgMSkpID0gKHVpbnQ4KWpWYWwwOyAgICAgICAvKiAgc3RvcmUgQiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIHdpZHRoKSA9ICh1aW50OClqVmFsMTsgICAgICAgICAgLyogc3RvcmUgRSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAod2lkdGggPDwgMSkgLSB3aWR0aCk7ICAvKiBBICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqKHB0ciArICh3aWR0aCA8PCAxKSk7ICAgICAgLyogRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsgICAgICAgICAgICAgIC8qIChGLUEpICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoalZhbDIgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKChqVmFsMiArIDcpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSAtPSAoKGpWYWwyICsgNykgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gKHdpZHRoIDw8IDEpIC0gd2lkdGgpID0gKHVpbnQ4KShqVmFsMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgKHdpZHRoIDw8IDEpKSA9ICh1aW50OCkoalZhbDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqVmFsMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwIC09ICgoNyAtIGpWYWwyKSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgKz0gKCg3IC0galZhbDIpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtICh3aWR0aCA8PCAxKSAtIHdpZHRoKSA9ICh1aW50OCkoalZhbDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArICh3aWR0aCA8PCAxKSkgPSAodWludDgpKGpWYWwxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LyogYTNfMCA+IDJRUCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgrK3B0ciA8IHB0cl9lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0vKiBib3VuZGFyeSBjaGVja2luZyovCi0gICAgICAgICAgICAgICAgICAgIH0vKmJjKi8KLSAgICAgICAgICAgIH0vKmJyKi8KLSAgICAgICAgICAgIGJyd2lkdGggLT0gKHBwX3cgPDwgMSk7Ci0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqIFZlcnQuIEZpbHRlcmluZyAqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIGZvciAoYnIgPSBtYnI7IGJyIDwgbWJyICsgMjsgYnIrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYnIgPCBwcF9oKQotICAgICAgICAgICAgICAgICAgICBmb3IgKGJjID0gbWJjICsgMTsgYmMgPCBtYmMgKyAzOyBiYysrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqIGNoZWNrIGJvdW5kYXJ5IGZvciBkZWJsb2NraW5nICoqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYyA8IHBwX3cpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gcmVjICsgKGJyd2lkdGggPDwgNikgKyAoYmMgPDwgMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSBicndpZHRoICsgYmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNocikgICAgUVAgPSBRUF9zdG9yZVtqVmFsMF07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZSA9IHB0ciArICh3aWR0aCA8PCAzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKHBwX21vZFtqVmFsMC0xXSYweDAxKSkgJiYgKChwcF9tb2RbalZhbDBdJjB4MDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlcnQgSGFyZCBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqcHRyOyAgICAgICAvKiBEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gMSk7IC8qIEMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsgIC8qIEQtQyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChqVmFsMiA+IDApICYmIChqVmFsMiA8IChRUCA8PCAxKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoalZhbDIgPCAwKSAmJiAoalZhbDIgPiAtKFFQIDw8IDEpKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAoalZhbDAgKyBqVmFsMSkgPj4gMTsgICAvKiAoQytEKS8yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0ciAgICAgICAgPSAgIGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gMSkgID0gICBqVmFsMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKihwdHIgKyAxKTsgICAgIC8qIEUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gMik7ICAgICAvKiBCICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgICAgIC8qIEUtQiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpWYWwyID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxIC09ICgoalZhbDIgKyAzKSA+PiAyKTsgICAgICAgIC8qIEUgPSBFIC0oRS1CKS80ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwICs9ICgoalZhbDIgKyAzKSA+PiAyKTsgICAgICAgIC8qIEIgPSBCICsoRS1CKS80ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgMSkgPSBqVmFsMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAyKSA9IGpWYWwwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqVmFsMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxICs9ICgoMyAtIGpWYWwyKSA+PiAyKTsgICAgICAgIC8qIEUgPSBFIC0oRS1CKS80ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwIC09ICgoMyAtIGpWYWwyKSA+PiAyKTsgICAgICAgIC8qIEIgPSBCICsoRS1CKS80ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgMSkgPSBqVmFsMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAyKSA9IGpWYWwwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKihwdHIgKyAyKTsgICAgIC8qIEYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gMyk7ICAgICAvKiBBICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7ICAgICAgICAgIC8qIChGLUEpICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoalZhbDIgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiArIDcpID4+IDMpOyAgICAvKiBGIC09IChGLUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKChqVmFsMiArIDcpID4+IDMpOyAgICAvKiBBICs9IChGLUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAyKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDMpID0galZhbDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpWYWwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiAtIDcpID4+IDMpOyAgICAvKiBGIC09IChGLUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKChqVmFsMiAtIDcpID4+IDMpOyAgICAvKiBBICs9IChGLUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAyKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDMpID0galZhbDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgIC8qIGVuZCBvZiB2ZXIgaGFyZCBmaWxldGVyaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChwdHIgKz0gd2lkdGgpIDwgcHRyX2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBib3VuZGFyeSovCi0gICAgICAgICAgICAgICAgICAgIH0gLypiYyovCi0gICAgICAgICAgICAgICAgYnJ3aWR0aCArPSBwcF93OwotICAgICAgICAgICAgfS8qYnIqLwotICAgICAgICAgICAgYnJ3aWR0aCAtPSAocHBfdyA8PCAxKTsKLSAgICAgICAgfS8qbWJjKi8KLSAgICAgICAgYnJ3aWR0aCArPSAocHBfdyA8PCAxKTsKLSAgICB9LyptYnIqLwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NodnJfZmlsdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NodnJfZmlsdGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk1Y2Y3MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jaHZyX2ZpbHRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NjUgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLSNpbmNsdWRlICAgICJtcDRkZWNfbGliLmgiCi0jaW5jbHVkZSAgICAicG9zdF9wcm9jLmgiCi0KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotCi12b2lkIENvbWJpbmVkSG9yelZlcnRSaW5nRmlsdGVyKAotICAgIHVpbnQ4ICpyZWMsCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQsCi0gICAgaW50MTYgKlFQX3N0b3JlLAotICAgIGludCBjaHIsCi0gICAgdWludDggKnBwX21vZCkKLXsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpbnQgaW5kZXgsIGNvdW50ZXI7Ci0gICAgaW50IGJyLCBiYywgaW5jciwgbWJyLCBtYmM7Ci0gICAgaW50IFFQID0gMTsKLSAgICBpbnQgdls1XTsKLSAgICB1aW50OCAqcHRyLCAqcHRyX2MsICpwdHJfbjsKLSAgICBpbnQgdzEsIHcyLCB3MywgdzQ7Ci0gICAgaW50IHBwX3csIHBwX2gsIGJyd2lkdGg7Ci0gICAgaW50IHN1bSwgZGVsdGE7Ci0gICAgaW50IGEzXzAsIGEzXzEsIGEzXzIsIEEzXzA7Ci0gICAgLyogZm9yIERlcmluZ2luZyBUaHJlc2hvbGQgYXBwcm9hY2ggKE1QRUc0KSovCi0gICAgaW50IG1heF9kaWZmLCB0aHJlcywgdjAsIGgwLCBtaW5fYmxrLCBtYXhfYmxrOwotICAgIGludCBjbnRoZmxhZzsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogQ2FsY3VsYXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBhcmVhIGluIGJsb2NrcyAoZGl2aWRlIGJ5IDgpICovCi0gICAgcHBfdyA9ICh3aWR0aCA+PiAzKTsKLSAgICBwcF9oID0gKGhlaWdodCA+PiAzKTsKLQotICAgIC8qIFNldCB1cCB2YXJpb3VzIHZhbHVlcyBuZWVkZWQgZm9yIHVwZGF0aW5nIHBvaW50ZXJzIGludG8gcmVjICovCi0gICAgdzEgPSB3aWR0aDsgICAgICAgICAgICAgLyogT2Zmc2V0IHRvIG5leHQgcm93IGluIHBpeGVscyAqLwotICAgIHcyID0gd2lkdGggPDwgMTsgICAgICAgIC8qIE9mZnNldCB0byB0d28gcm93cyBpbiBwaXhlbHMgKi8KLSAgICB3MyA9IHcxICsgdzI7ICAgICAgICAgICAvKiBPZmZzZXQgdG8gdGhyZWUgcm93cyBpbiBwaXhlbHMgKi8KLSAgICB3NCA9IHcyIDw8IDE7ICAgICAgICAgICAvKiBPZmZzZXQgdG8gZm91ciByb3dzIGluIHBpeGVscyAqLwotICAgIGluY3IgPSB3aWR0aCAtIEJMS1NJWkU7IC8qIE9mZnNldCB0byBuZXh0IHJvdyBhZnRlciBwcm9jZXNzaW5nIGJsb2NrICovCi0KLSAgICAvKiBXb3JrIHRocm91Z2ggdGhlIGFyZWEgaG9ydGl6b250YWxseSBieSB0d28gcm93cyBwZXIgc3RlcCAqLwotICAgIGZvciAobWJyID0gMDsgbWJyIDwgcHBfaDsgbWJyICs9IDIpCi0gICAgewotICAgICAgICAvKiBicndpZHRoIGNvbnRhaW5zIHRoZSBibG9jayBudW1iZXIgb2YgdGhlIGxlZnRtb3N0IGJsb2NrCi0gICAgICAgICAqIG9mIHRoZSBjdXJyZW50IHJvdyAqLwotICAgICAgICBicndpZHRoID0gbWJyICogcHBfdzsKLQotICAgICAgICAvKiBXb3JrIHRocm91Z2ggdGhlIGFyZWEgdmVydGljYWxseSBieSB0d28gY29sdW1ucyBwZXIgc3RlcCAqLwotICAgICAgICBmb3IgKG1iYyA9IDA7IG1iYyA8IHBwX3c7IG1iYyArPSAyKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBpZiB0aGUgZGF0YSBpcyBsdW1pbmFuY2UgaW5mbywgZ2V0IHRoZSBjb3JyZWN0Ci0gICAgICAgICAgICAgICAgICAgICogcXVhbnRpemF0aW9uIHBhcmFtZW50ZXIuIE9uZSBwYXJhbWV0ZXIgcGVyIG1hY3JvYmxvY2sgKi8KLSAgICAgICAgICAgIGlmICghY2hyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGJyd2lkdGgvNCBpcyB0aGUgbWFjcm9ibG9jayBudW1iZXIgYW5kIG1iYy8yIGlzIHRoZSBtYWNyb2Jsb2NrIGNvbCBudW1iZXIqLwotICAgICAgICAgICAgICAgIFFQID0gUVBfc3RvcmVbKGJyd2lkdGg+PjIpICsgKG1iYz4+MSldOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqIEhvcml6LiBGaWx0ZXJpbmcgKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKiBQcm9jZXNzIGZvdXIgYmxvY2tzIGZvciB0aGUgZmlsdGVyaW5nICAgICAgICAqLwotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogTG9vcCBvdmVyIHR3byByb3dzIG9mIGJsb2NrcyAqLwotICAgICAgICAgICAgZm9yIChiciA9IG1iciArIDE7IGJyIDwgbWJyICsgMzsgYnIrKykgICAgLyogYnIgaXMgdGhlIHJvdyBjb3VudGVyIGluIGJsb2NrcyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFNldCBicndpZHRoIHRvIHRoZSBmaXJzdCAobGVmdG1vc3QpIGJsb2NrIG51bWJlciBvZiB0aGUgbmV4dCByb3cgKi8KLSAgICAgICAgICAgICAgICAvKiBicndpZHRoIGlzIHVzZWQgYXMgYW4gaW5kZXggd2hlbiBjb3VudGluZyBibG9ja3MgKi8KLSAgICAgICAgICAgICAgICBicndpZHRoICs9IHBwX3c7Ci0KLSAgICAgICAgICAgICAgICAvKiBMb29wIG92ZXIgdHdvIGNvbHVtbnMgb2YgYmxvY2tzIGluIHRoZSByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGJjID0gbWJjOyBiYyA8IG1iYyArIDI7IGJjKyspICAgIC8qIGJjIGlzIHRoZSBjb2x1bW4gY291bnRlciBpbiBibG9ja3MgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKioqKiogY2hlY2sgYm91bmRhcnkgZm9yIGRlYmxvY2tpbmcgKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAvKiBFeGVjdXRlIGlmIHRoZSByb3cgYW5kIGNvbHVtbiBjb3VudGVycyBhcmUgd2l0aGluIHRoZSBhcmVhICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChiciA8IHBwX2ggJiYgYmMgPCBwcF93KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIHB0ciB0byB0aGUgZmlyc3QgcGl4ZWwgb2YgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBzZWNvbmQgcm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIGJyd2lkdGggKiA2NCBpcyB0aGUgcGl4ZWwgcm93IG9mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgKiBiYyAqIDggaXMgdGhlIHBpeGVsIGNvbHVtbiBvZmZzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHJlYyArIChicndpZHRoIDw8IDYpICsgKGJjIDw8IDMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGluZGV4IHRvIHRoZSBjdXJyZW50IGJsb2NrIG9mIHRoZSBzZWNvbmQgcm93IGNvdW50aW5nIGluIGJsb2NrcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBicndpZHRoICsgYmM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZSBkYXRhIGlzIGNocm9taW5hbmNlIGluZm8sIGdldCB0aGUgY29ycmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICogcXVhbnRpemF0aW9uIHBhcmFtZW50ZXIuIE9uZSBwYXJhbWV0ZXIgcGVyIGJsb2NrLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNocikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUCA9IFFQX3N0b3JlW2luZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogRXhlY3V0ZSBoYXJkIGhvcml6b250YWwgZmlsdGVyIGlmIHNlbWFwaG9yZSBmb3IgaG9yaXpvbnRhbCBkZWJsb2NraW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICogaXMgc2V0IGZvciB0aGUgY3VycmVudCBibG9jayBhbmQgYmxvY2sgaW1tZWRpYXRlbHkgYWJvdmUgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKHBwX21vZFtpbmRleF0mMHgwMikgIT0gMCkgJiYgKChwcF9tb2RbaW5kZXgtcHBfd10mMHgwMikgIT0gMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7ICAgLyogSGFyZCBmaWx0ZXIgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBIb3J6SGZsYWcgKGJpdCA0KSBpbiB0aGUgcHBfbW9kIGxvY2F0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBfbW9kW2luZGV4LXBwX3ddIHw9IDB4MTA7IC8qICA0LzI2LzAwIHJldXNlIHBwX21vZCBmb3IgSG9yekhmbGFnKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBhY3Jvc3MgdGhlIDggcGl4ZWxzIG9mIHRoZSBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW5kZXggPSBCTEtTSVpFOyBpbmRleCA+IDA7IGluZGV4LS0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgcGl4ZWwgYW5kIHRoZSBwaXhlbCBhYm92ZSBpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18wID0gKnB0ciAtICoocHRyIC0gdzEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGRpZmZlcmVuY2UgaXMgZ3JlYXRlciB0aGFuIHRoZSBLVGhIIHRocmVzaG9sZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgd2l0aGluIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyLCBhcHBseSBoYXJkIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGEzXzAgPiBLVGhIIHx8IGEzXzAgPCAtS1RoSCkgJiYgYTNfMDxRUCAmJiBhM18wPiAtUVApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9jID0gcHRyIC0gdzM7ICAgLyogUG9pbnRzIHRvIHBpeGVsIHRocmVlIHJvd3MgYWJvdmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9uID0gcHRyICsgdzE7ICAgLyogUG9pbnRzIHRvIHBpeGVsIG9uZSByb3cgYmVsb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbMF0gPSAoaW50KSgqKHB0cl9jIC0gdzMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbMV0gPSAoaW50KSgqKHB0cl9jIC0gdzIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbMl0gPSAoaW50KSgqKHB0cl9jIC0gdzEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbM10gPSAoaW50KSgqcHRyX2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdls0XSA9IChpbnQpKCoocHRyX2MgKyB3MSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSB2WzBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZbMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdlsyXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAqcHRyX2MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdls0XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKihwdHJfYyArIHcyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCoocHRyX2MgKyB3MykpOyAgLyogQ3VycmVudCBwaXhlbCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IChzdW0gKyAqcHRyX2MgKyA0KSA+PiAzOyAgIC8qIEF2ZXJhZ2UgcGl4ZWwgdmFsdWVzIHdpdGggcm91bmRpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyX2MpID0gKHVpbnQ4KSBkZWx0YTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW92ZSBwb2ludGVyIGRvd24gb25lIHJvdyBvZiBwaXhlbHMgKHBvaW50cyB0byBwaXhlbCB0d28gcm93cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWJvdmUgY3VycmVudCBwaXhlbCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9jICs9IHcxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgNTsgY291bnRlcisrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1YnRyYWN0IG9mZiBoaWdoZXN0IHBpeGVsIGFuZCBhZGQgaW4gcGl4ZWwgYmVsb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSBzdW0gLSB2W2NvdW50ZXJdICsgKnB0cl9uOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF2ZXJhZ2UgdGhlIHBpeGVsIHZhbHVlcyB3aXRoIHJvdW5kaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSAoc3VtICsgKnB0cl9jICsgNCkgPj4gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyX2MgPSAodWludDgpKGRlbHRhKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBwb2ludGVycyB0byBuZXh0IHBpeGVsIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9jICs9IHcxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9uICs9IHcxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBwb2ludGVyIHRvIG5leHQgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytwdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBpbmRleCovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7IC8qIHNvZnQgZmlsdGVyKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIEhvcnpIZmxhZyAoYml0IDQpIGluIHRoZSBwcF9tb2QgbG9jYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcF9tb2RbaW5kZXgtcHBfd10gJj0gMHhlZjsgLyogcmVzZXQgMTExMCwxMTExICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGluZGV4ID0gQkxLU0laRTsgaW5kZXggPiAwOyBpbmRleC0tKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IHBpeGVsIGFuZCB0aGUgcGl4ZWwgYWJvdmUgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMCA9ICoocHRyKSAtICoocHRyIC0gdzEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGRpZmZlcmVuY2UgaXMgZ3JlYXRlciB0aGFuIHRoZSBLVGggdGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhcHBseSBzb2Z0IGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGEzXzAgPiBLVGggfHwgYTNfMCA8IC1LVGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1bSBvZiB3ZWlnaHRlZCBkaWZmZXJlbmNlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMCArPSAoKCoocHRyIC0gdzIpIC0gKihwdHIgKyB3MSkpIDw8IDEpICsgKGEzXzAgPDwgMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHN1bSBpcyBsZXNzIHRoYW4gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQVl9BQlMoYTNfMCkgPCAoUVAgPDwgMykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMSA9ICoocHRyIC0gdzIpIC0gKihwdHIgLSB3Myk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMSArPSAoKCoocHRyIC0gdzQpIC0gKihwdHIgLSB3MSkpIDw8IDEpICsgKGEzXzEgPDwgMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18yICA9ICoocHRyICsgdzIpIC0gKihwdHIgKyB3MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMiArPSAoKCoocHRyKSAtICoocHRyICsgdzMpKSA8PCAxKSArIChhM18yIDw8IDIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQTNfMCA9IFBWX0FCUyhhM18wKSAtIFBWX01JTihQVl9BQlMoYTNfMSksIFBWX0FCUyhhM18yKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQTNfMCA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBM18wICs9IEEzXzAgPDwgMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQTNfMCA9IChBM18wICsgMzIpID4+IDY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhM18wID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQTNfMCA9IC1BM18wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSAoKihwdHIgLSB3MSkgLSAqKHB0cikpID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPj0gQTNfMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IFBWX01BWChBM18wLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBM18wID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBQVl9NQVgoQTNfMCwgZGVsdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSB3MSkgPSAodWludDgpKCoocHRyIC0gdzEpIC0gZGVsdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0cikgPSAodWludDgpKCoocHRyKSArIGRlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qdGhyZXNob2xkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgcG9pbnRlciB0byBuZXh0IHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyppbmRleCovCi0gICAgICAgICAgICAgICAgICAgICAgICB9IC8qIFNvZnQgZmlsdGVyKi8KLSAgICAgICAgICAgICAgICAgICAgfS8qIGJvdW5kYXJ5IGNoZWNraW5nKi8KLSAgICAgICAgICAgICAgICB9LypiYyovCi0gICAgICAgICAgICB9LypiciovCi0gICAgICAgICAgICBicndpZHRoIC09IChwcF93IDw8IDEpOwotCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKiogVmVydC4gRmlsdGVyaW5nICoqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIFByb2Nlc3MgZm91ciBibG9ja3MgZm9yIHRoZSBmaWx0ZXJpbmcgICAgICAgICovCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKiBMb29wIG92ZXIgdHdvIHJvd3Mgb2YgYmxvY2tzICovCi0gICAgICAgICAgICBmb3IgKGJyID0gbWJyOyBiciA8IG1iciArIDI7IGJyKyspICAgICAgLyogYnIgaXMgdGhlIHJvdyBjb3VudGVyIGluIGJsb2NrcyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoYmMgPSBtYmMgKyAxOyBiYyA8IG1iYyArIDM7IGJjKyspICAvKiBiYyBpcyB0aGUgY29sdW1uIGNvdW50ZXIgaW4gYmxvY2tzICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioqKioqIGNoZWNrIGJvdW5kYXJ5IGZvciBkZWJsb2NraW5nICoqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRXhlY3V0ZSBpZiB0aGUgcm93IGFuZCBjb2x1bW4gY291bnRlcnMgYXJlIHdpdGhpbiB0aGUgYXJlYSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoYnIgPCBwcF9oICYmIGJjIDwgcHBfdykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBwdHIgdG8gdGhlIGZpcnN0IHBpeGVsIG9mIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgc2Vjb25kIHJvdwotICAgICAgICAgICAgICAgICAgICAgICAgKiBicndpZHRoICogNjQgaXMgdGhlIHBpeGVsIHJvdyBvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICogYmMgKiA4IGlzIHRoZSBwaXhlbCBjb2x1bW4gb2Zmc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSByZWMgKyAoYnJ3aWR0aCA8PCA2KSArIChiYyA8PCAzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBpbmRleCB0byB0aGUgY3VycmVudCBibG9jayBvZiB0aGUgc2Vjb25kIHJvdyBjb3VudGluZyBpbiBibG9ja3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gYnJ3aWR0aCArIGJjOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiB0aGUgZGF0YSBpcyBjaHJvbWluYW5jZSBpbmZvLCBnZXQgdGhlIGNvcnJlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHF1YW50aXphdGlvbiBwYXJhbWVudGVyLiBPbmUgcGFyYW1ldGVyIHBlciBibG9jay4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUVAgPSBRUF9zdG9yZVtpbmRleF07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEV4ZWN1dGUgaGFyZCB2ZXJ0aWNhbCBmaWx0ZXIgaWYgc2VtYXBob3JlIGZvciB2ZXJ0aWNhbCBkZWJsb2NraW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICogaXMgc2V0IGZvciB0aGUgY3VycmVudCBibG9jayBhbmQgYmxvY2sgaW1tZWRpYXRlbHkgbGVmdCBvZiBpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgocHBfbW9kW2luZGV4LTFdJjB4MDEpICE9IDApICYmICgocHBfbW9kW2luZGV4XSYweDAxKSAhPSAwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgICAvKiBIYXJkIGZpbHRlciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IFZlcnRIZmxhZyAoYml0IDUpIGluIHRoZSBwcF9tb2QgbG9jYXRpb24gb2YgcHJldmlvdXMgYmxvY2sqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwX21vZFtpbmRleC0xXSB8PSAweDIwOyAvKiAgNC8yNi8wMCByZXVzZSBwcF9tb2QgZm9yIFZlcnRIZmxhZyovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgYWNyb3NzIHRoZSA4IHBpeGVscyBvZiB0aGUgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGluZGV4ID0gQkxLU0laRTsgaW5kZXggPiAwOyBpbmRleC0tKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IHBpeGVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIHRoZSBwaXhlbCB0byBsZWZ0IG9mIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEzXzAgPSAqcHRyIC0gKihwdHIgLSAxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiB0aGUgbWFnbml0dWRlIG9mIHRoZSBkaWZmZXJlbmNlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgS1RoSCB0aHJlc2hvbGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIHdpdGhpbiB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciwgYXBwbHkgaGFyZCBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhM18wID4gS1RoSCB8fCBhM18wIDwgLUtUaEgpICYmIGEzXzA8UVAgJiYgYTNfMD4gLVFQKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfYyA9IHB0ciAtIDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfbiA9IHB0ciArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2WzBdID0gKGludCkoKihwdHJfYyAtIDMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbMV0gPSAoaW50KSgqKHB0cl9jIC0gMikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlsyXSA9IChpbnQpKCoocHRyX2MgLSAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2WzNdID0gKGludCkoKnB0cl9jKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbNF0gPSAoaW50KSgqKHB0cl9jICsgMSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSB2WzBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZbMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdlsyXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAqcHRyX2MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdls0XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKihwdHJfYyArIDIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKihwdHJfYyArIDMpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSAoc3VtICsgKnB0cl9jICsgNCkgPj4gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyX2MpID0gKHVpbnQ4KSBkZWx0YTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW92ZSBwb2ludGVyIGRvd24gb25lIHBpeGVsIHRvIHRoZSByaWdodCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2MgKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCA1OyBjb3VudGVyKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VidHJhY3Qgb2ZmIGhpZ2hlc3QgcGl4ZWwgYW5kIGFkZCBpbiBwaXhlbCBiZWxvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9IHN1bSAtIHZbY291bnRlcl0gKyAqcHRyX247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXZlcmFnZSB0aGUgcGl4ZWwgdmFsdWVzIHdpdGggcm91bmRpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IChzdW0gKyAqcHRyX2MgKyA0KSA+PiAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHJfYyA9ICh1aW50OCkoZGVsdGEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IHBvaW50ZXJzIHRvIG5leHQgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfYyArPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9uICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IHBvaW50ZXJzIHRvIG5leHQgcGl4ZWwgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArPSB3MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qIGluZGV4Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgLyogc29mdCBmaWx0ZXIqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgVmVydEhmbGFnIChiaXQgNSkgaW4gdGhlIHBwX21vZCBsb2NhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwX21vZFtpbmRleC0xXSAmPSAweGRmOyAvKiByZXNldCAxMTAxLDExMTEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGluZGV4ID0gQkxLU0laRTsgaW5kZXggPiAwOyBpbmRleC0tKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IHBpeGVsIGFuZCB0aGUgcGl4ZWwgYWJvdmUgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMCA9ICoocHRyKSAtICoocHRyIC0gMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdGhlIG1hZ25pdHVkZSBvZiB0aGUgZGlmZmVyZW5jZSBpcyBncmVhdGVyIHRoYW4gdGhlIEtUaCB0aHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFwcGx5IHNvZnQgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYTNfMCA+IEtUaCB8fCBhM18wIDwgLUtUaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VtIG9mIHdlaWdodGVkIGRpZmZlcmVuY2VzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18wICs9ICgoKihwdHIgLSAyKSAtICoocHRyICsgMSkpIDw8IDEpICsgKGEzXzAgPDwgMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHN1bSBpcyBsZXNzIHRoYW4gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQVl9BQlMoYTNfMCkgPCAoUVAgPDwgMykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMSA9ICoocHRyIC0gMikgLSAqKHB0ciAtIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEzXzEgKz0gKCgqKHB0ciAtIDQpIC0gKihwdHIgLSAxKSkgPDwgMSkgKyAoYTNfMSA8PCAyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEzXzIgID0gKihwdHIgKyAyKSAtICoocHRyICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMiArPSAoKCoocHRyKSAtICoocHRyICsgMykpIDw8IDEpICsgKGEzXzIgPDwgMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBM18wID0gUFZfQUJTKGEzXzApIC0gUFZfTUlOKFBWX0FCUyhhM18xKSwgUFZfQUJTKGEzXzIpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBM18wID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEzXzAgKz0gQTNfMCA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBM18wID0gKEEzXzAgKyAzMikgPj4gNjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEzXzAgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBM18wID0gLUEzXzA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9ICgqKHB0ciAtIDEpIC0gKihwdHIpKSA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhID49IEEzXzApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBQVl9NQVgoQTNfMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQTNfMCA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gUFZfTUFYKEEzXzAsIGRlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gMSkgPSAodWludDgpKCoocHRyIC0gMSkgLSBkZWx0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyKSA9ICh1aW50OCkoKihwdHIpICsgZGVsdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyp0aHJlc2hvbGQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArPSB3MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qaW5kZXgqLwotICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBTb2Z0IGZpbHRlciovCi0gICAgICAgICAgICAgICAgICAgIH0gLyogYm91bmRhcnkqLwotICAgICAgICAgICAgICAgIH0gLypiYyovCi0gICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IHBvaW50ZXIgdG8gbmV4dCByb3cgb2YgcGl4ZWxzICovCi0gICAgICAgICAgICAgICAgYnJ3aWR0aCArPSBwcF93OwotICAgICAgICAgICAgfS8qYnIqLwotICAgICAgICAgICAgYnJ3aWR0aCAtPSAocHBfdyA8PCAxKTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKiBEZXJpbmdpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogUHJvY2VzcyBmb3VyIGJsb2NrcyBmb3IgdGhlIGZpbHRlcmluZyAgICAgICAgKi8KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIExvb3Agb3ZlciB0d28gcm93cyBvZiBibG9ja3MgKi8KLSAgICAgICAgICAgIGZvciAoYnIgPSBtYnI7IGJyIDwgbWJyICsgMjsgYnIrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBMb29wIG92ZXIgdHdvIGNvbHVtbnMgb2YgYmxvY2tzIGluIHRoZSByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGJjID0gbWJjOyBiYyA8IG1iYyArIDI7IGJjKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBFeGVjdXRlIGlmIHRoZSByb3cgYW5kIGNvbHVtbiBjb3VudGVycyBhcmUgd2l0aGluIHRoZSBhcmVhICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChiciA8IHBwX2ggJiYgYmMgPCBwcF93KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGluZGV4IHRvIHRoZSBjdXJyZW50IGJsb2NrICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGJyd2lkdGggKyBiYzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogRXhlY3V0ZSBkZXJpbmdpbmcgaWYgc2VtYXBob3JlIGZvciBkZXJpbmdpbmcgKGJpdC0zIG9mIHBwX21vZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGlzIHNldCBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHBfbW9kW2luZGV4XSYweDA0KSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IHByb2Nlc3MgZGVyaW5naW5nIGlmIG9uIGFuIGVkZ2UgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnIgPiAwICYmIGJjID4gMCAmJiBiciA8IHBwX2ggLSAxICYmIGJjIDwgcHBfdyAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbnRoZmxhZyA9IHdlaWdodGVkIGF2ZXJhZ2Ugb2YgSG9yekhmbGFnIG9mIGN1cnJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9uZSBhYm92ZSwgcHJldmlvdXMgYmxvY2tzKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250aGZsYWcgPSAoKHBwX21vZFtpbmRleF0gJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcF9tb2RbaW5kZXgtcHBfd10gJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocHBfbW9kW2luZGV4LTFdID4+IDEpICYgMHgxMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBwX21vZFtpbmRleF0gPj4gMSkgJiAweDEwKSkgPj4gNDsgLyogNC8yNi8wMCovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG8gdGhlIGRlcmluZ2luZyBpZiBkZWNpc2lvbiBmbGFncyBpbmRpY2F0ZSBpdCdzIG5lY2Vzc2FyeSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY250aGZsYWcgPCAzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiB0aGUgZGF0YSBpcyBjaHJvbWluYW5jZSBpbmZvLCBnZXQgdGhlIGNvcnJlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHF1YW50aXphdGlvbiBwYXJhbWVudGVyLiBPbmUgcGFyYW1ldGVyIHBlciBibG9jay4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVAgPSBRUF9zdG9yZVtpbmRleF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBhbW91bnQgdG8gY2hhbmdlIGx1bWluYW5jZSBpZiBpdCBuZWVkcyB0byBiZSBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiYXNlZCBvbiBxdWFudGl6YXRpb24gcGFyYW1ldGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZGlmZiA9IChRUCA+PiAyKSArIDQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBwb2ludGVyIHRvIGZpcnN0IHBpeGVsIG9mIGN1cnJlbnQgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHJlYyArIChicndpZHRoIDw8IDYpICsgKGJjIDw8IDMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaW5kIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUgb2YgcGl4ZWwgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRNYXhNaW4ocHRyLCAmbWluX2JsaywgJm1heF9ibGssIGluY3IpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgZGV0ZXJtaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXMgPSAobWF4X2JsayArIG1pbl9ibGsgKyAxKSA+PiAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBwaXhlbCByYW5nZSBpcyBncmVhdGVyIG9yIGVxdWFsIHRoYW4gREVSSU5HX1RIUiwgc21vb3RoIHRoZSByZWdpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobWF4X2JsayAtIG1pbl9ibGspID49IERFUklOR19USFIpIC8qc21vb3RoIDh4OCByZWdpb24qLwotI2lmbmRlZiBOb01NWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNtb290aCBhbGwgcGl4ZWxzIGluIHRoZSBibG9jayovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVyaW5nQWRhcHRpdmVTbW9vdGhNTVgocHRyLCB3aWR0aCwgdGhyZXMsIG1heF9kaWZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0dXAgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSByZWdpb24gdG8gc21vb3RoICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjAgPSAoYnIgPDwgMykgLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgwID0gKGJjIDw8IDMpIC0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qc21vb3RoIDh4OCByZWdpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0aXZlU21vb3RoX05vTU1YKHJlYywgdjAsIGgwLCB2MCArIDEsIGgwICsgMSwgdGhyZXMsIHdpZHRoLCBtYXhfZGlmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS8qY250aGZsYWcqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLypkZXJpbmcgYnI9PTEgb3IgYmM9PTEgKGJvdW5kYXJ5IGJsb2NrKSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAvKiBQcm9jZXNzIHRoZSBib3VuZGFyeSBibG9ja3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlY2lkZSB0byBwZXJmb3JtIGRlYmxvY2tpbmcgYmFzZWQgb24gdGhlIHNlbWFwaG9yZSBmbGFncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9mIHRoZSBuZWlnaGJvcmluZyBibG9ja3MgaW4gZWFjaCBjYXNlLiBBIGNlcnRhaW4gbnVtYmVyIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGhhcmQgZmlsdGVyaW5nIGZsYWdzIGhhdmUgdG8gYmUgc2V0IGluIG9yZGVyIHRvIHNpZ25hbCBuZWVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZvciBzbW9vdGhpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyID4gMCAmJiBiciA8IHBwX2ggLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmMgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNudGhmbGFnID0gKChwcF9tb2RbaW5kZXgtcHBfd10gJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBwX21vZFtpbmRleF0gJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwcF9tb2RbaW5kZXgtMV0gPj4gMSkgJiAweDEwKSkgPj4gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnRoZmxhZyA9ICgocHBfbW9kW2luZGV4XSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHBfbW9kW2luZGV4LXBwX3ddICYgMHgxMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocHBfbW9kW2luZGV4XSA+PiAxKSAmIDB4MTApKSA+PiA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJjID4gMCAmJiBiYyA8IHBwX3cgLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnIgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNudGhmbGFnID0gKChwcF9tb2RbaW5kZXgtcHBfd10gJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwcF9tb2RbaW5kZXgtMV0gPj4gMSkgJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwcF9tb2RbaW5kZXhdID4+IDEpICYgMHgxMCkpID4+IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250aGZsYWcgPSAoKHBwX21vZFtpbmRleF0gJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwcF9tb2RbaW5kZXgtMV0gPj4gMSkgJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwcF9tb2RbaW5kZXhdID4+IDEpICYgMHgxMCkpID4+IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAvKiBhdCB0aGUgY29ybmVyIGRvIGRlZmF1bHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnRoZmxhZyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEbyB0aGUgZGVyaW5naW5nIGlmIGRlY2lzaW9uIGZsYWdzIGluZGljYXRlIGl0J3MgbmVjZXNzYXJ5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbnRoZmxhZyA8IDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdGhlIGRhdGEgaXMgY2hyb21pbmFuY2UgaW5mbywgZ2V0IHRoZSBjb3JyZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHF1YW50aXphdGlvbiBwYXJhbWVudGVyLiBPbmUgcGFyYW1ldGVyIHBlciBibG9jay4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVAgPSBRUF9zdG9yZVtpbmRleF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBhbW91bnQgdG8gY2hhbmdlIGx1bWluYW5jZSBpZiBpdCBuZWVkcyB0byBiZSBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiYXNlZCBvbiBxdWFudGl6YXRpb24gcGFyYW1ldGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZGlmZiA9IChRUCA+PiAyKSArIDQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBwb2ludGVyIHRvIGZpcnN0IHBpeGVsIG9mIGN1cnJlbnQgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHJlYyArIChicndpZHRoIDw8IDYpICsgKGJjIDw8IDMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaW5kIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUgb2YgcGl4ZWwgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRNYXhNaW4ocHRyLCAmbWluX2JsaywgJm1heF9ibGssIGluY3IpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgZGV0ZXJtaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXMgPSAobWF4X2JsayArIG1pbl9ibGsgKyAxKSA+PiAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXR1cCB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIHJlZ2lvbiB0byBzbW9vdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgZ29pbmcgdG8gYmUgYSA0eDQgcmVnaW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MCA9IChiciA8PCAzKSArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMCA9IChiYyA8PCAzKSArIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHBpeGVsIHJhbmdlIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiBERVJJTkdfVEhSLCBzbW9vdGggdGhlIHJlZ2lvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtYXhfYmxrIC0gbWluX2JsaykgPj0gREVSSU5HX1RIUikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTbW9vdGggNHg0IHJlZ2lvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0aXZlU21vb3RoX05vTU1YKHJlYywgdjAsIGgwLCB2MCAtIDMsIGgwIC0gMywgdGhyZXMsIHdpZHRoLCBtYXhfZGlmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0vKmNudGhmbGFnKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qIGJyPT0wLCBiYz09MCovCi0gICAgICAgICAgICAgICAgICAgICAgICB9ICAvKiBkZXJpbmcqLwotICAgICAgICAgICAgICAgICAgICB9IC8qYm91bmRhcnkgY29uZGl0aW9uKi8KLSAgICAgICAgICAgICAgICB9LypiYyovCi0gICAgICAgICAgICAgICAgYnJ3aWR0aCArPSBwcF93OwotICAgICAgICAgICAgfS8qYnIqLwotICAgICAgICAgICAgYnJ3aWR0aCAtPSAocHBfdyA8PCAxKTsKLSAgICAgICAgfS8qbWJjKi8KLSAgICAgICAgYnJ3aWR0aCArPSAocHBfdyA8PCAxKTsKLSAgICB9LyptYnIqLwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybiA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RlcmluZ2luZ19jaHJvbWEuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGVyaW5naW5nX2Nocm9tYS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzc5YjAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGVyaW5naW5nX2Nocm9tYS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLSNpbmNsdWRlICAgICJtcDRkZWNfbGliLmgiCi0jaW5jbHVkZSAgICAicG9zdF9wcm9jLmgiCi0KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotCi12b2lkIERlcmluZ2luZ19DaHJvbWEoCi0gICAgdWludDggKlJlY19DLAotICAgIGludCB3aWR0aCwKLSAgICBpbnQgaGVpZ2h0LAotICAgIGludDE2ICpRUF9zdG9yZSwKLSAgICBpbnQsCi0gICAgdWludDggKnBwX21vZAotKQotewotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpbnQgdGhyZXM7Ci0gICAgaW50IHZfYmxrLCBoX2JsazsKLSAgICBpbnQgbWF4X2RpZmY7Ci0gICAgaW50IHZfcGVsLCBoX3BlbDsKLSAgICBpbnQgbWF4X2JsaywgbWluX2JsazsKLSAgICBpbnQgdjAsIGgwOwotICAgIHVpbnQ4ICpwdHI7Ci0gICAgaW50IHN1bSwgc3VtMSwgaW5jcjsKLSAgICBpbnQzMiBhZGRyX3Y7Ci0gICAgaW50IHNpZ25fdlsxMF0sIHN1bV92WzEwXTsKLSAgICBpbnQgKnB0cjIsICpwdHIzOwotICAgIHVpbnQ4IHBlbHUsIHBlbGMsIHBlbGw7Ci0gICAgaW5jciA9IHdpZHRoIC0gQkxLU0laRTsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogY2hyb21pbmFuY2UgKi8KLSAgICAvKiBEbyB0aGUgZmlyc3QgbGluZSAoNyBwaXhlbHMgYXQgYSB0aW1lID0+IERvbid0IHVzZSBNTVgpKi8KLSAgICBmb3IgKGhfYmxrID0gMDsgaF9ibGsgPCB3aWR0aDsgaF9ibGsgKz0gQkxLU0laRSkKLSAgICB7Ci0gICAgICAgIG1heF9kaWZmID0gKFFQX3N0b3JlW2hfYmxrPj4zXSA+PiAyKSArIDQ7Ci0gICAgICAgIHB0ciA9ICZSZWNfQ1toX2Jsa107Ci0gICAgICAgIG1heF9ibGsgPSBtaW5fYmxrID0gKnB0cjsKLSAgICAgICAgRmluZE1heE1pbihwdHIsICZtaW5fYmxrLCAmbWF4X2Jsaywgd2lkdGgpOwotICAgICAgICBoMCA9ICgoaF9ibGsgLSAxKSA+PSAxKSA/IChoX2JsayAtIDEpIDogMTsKLQotICAgICAgICBpZiAobWF4X2JsayAtIG1pbl9ibGsgPj0gNCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyZXMgPSAobWF4X2JsayArIG1pbl9ibGsgKyAxKSA+PiAxOwotCi0KLSAgICAgICAgICAgIGZvciAodl9wZWwgPSAxOyB2X3BlbCA8IEJMS1NJWkUgLSAxOyB2X3BlbCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZHJfdiA9IChpbnQzMil2X3BlbCAqIHdpZHRoOwotICAgICAgICAgICAgICAgIHB0ciA9ICZSZWNfQ1thZGRyX3YgKyBoMCAtIDFdOwotICAgICAgICAgICAgICAgIHB0cjIgPSAmc3VtX3ZbMF07Ci0gICAgICAgICAgICAgICAgcHRyMyA9ICZzaWduX3ZbMF07Ci0KLSAgICAgICAgICAgICAgICBwZWx1ID0gKihwdHIgLSB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcGVsYyA9ICpwdHI7Ci0gICAgICAgICAgICAgICAgcGVsbCA9ICoocHRyICsgd2lkdGgpOwotICAgICAgICAgICAgICAgIHB0cisrOwotICAgICAgICAgICAgICAgICpwdHIyKysgPSBwZWx1ICsgKHBlbGMgPDwgMSkgKyBwZWxsOwotICAgICAgICAgICAgICAgICpwdHIzKysgPSBJTkRFWChwZWx1LCB0aHJlcykgKyBJTkRFWChwZWxjLCB0aHJlcykgKyBJTkRFWChwZWxsLCB0aHJlcyk7Ci0KLSAgICAgICAgICAgICAgICBwZWx1ID0gKihwdHIgLSB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcGVsYyA9ICpwdHI7Ci0gICAgICAgICAgICAgICAgcGVsbCA9ICoocHRyICsgd2lkdGgpOwotICAgICAgICAgICAgICAgIHB0cisrOwotICAgICAgICAgICAgICAgICpwdHIyKysgPSBwZWx1ICsgKHBlbGMgPDwgMSkgKyBwZWxsOwotICAgICAgICAgICAgICAgICpwdHIzKysgPSBJTkRFWChwZWx1LCB0aHJlcykgKyBJTkRFWChwZWxjLCB0aHJlcykgKyBJTkRFWChwZWxsLCB0aHJlcyk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGhfcGVsID0gaDA7IGhfcGVsIDwgaF9ibGsgKyBCTEtTSVpFIC0gMTsgaF9wZWwrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBlbHUgPSAqKHB0ciAtIHdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgcGVsYyA9ICpwdHI7Ci0gICAgICAgICAgICAgICAgICAgIHBlbGwgPSAqKHB0ciArIHdpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAqcHRyMiA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgICAgICAgICAgICAgICpwdHIzID0gSU5ERVgocGVsdSwgdGhyZXMpICsgSU5ERVgocGVsYywgdGhyZXMpICsgSU5ERVgocGVsbCwgdGhyZXMpOwotCi0gICAgICAgICAgICAgICAgICAgIHN1bTEgPSAqKHB0cjMgLSAyKSArICoocHRyMyAtIDEpICsgKnB0cjM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdW0xID09IDAgfHwgc3VtMSA9PSA5KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSAoKihwdHIyIC0gMikgKyAoKihwdHIyIC0gMSkgPDwgMSkgKyAqcHRyMiArIDgpID4+IDQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0tOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBWX0FCUygqcHRyIC0gc3VtKSA+IG1heF9kaWZmKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdW0gPiAqcHRyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSAqcHRyICsgbWF4X2RpZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSAqcHRyIC0gbWF4X2RpZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcHRyKysgPSAodWludDgpIHN1bTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgcHRyMisrOwotICAgICAgICAgICAgICAgICAgICBwdHIzKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICh2X2JsayA9IEJMS1NJWkU7IHZfYmxrIDwgaGVpZ2h0OyB2X2JsayArPSBCTEtTSVpFKQotICAgIHsKLSAgICAgICAgdjAgPSB2X2JsayAtIDE7Ci0gICAgICAgIC8qIERvIHRoZSBmaXJzdCBibG9jayAocGl4ZWxzPTcgPT4gTm8gTU1YKSAqLwotICAgICAgICBtYXhfZGlmZiA9IChRUF9zdG9yZVsoKCgoaW50MzIpdl9ibGsqd2lkdGgpPj4zKSk+PjNdID4+IDIpICsgNDsKLSAgICAgICAgcHRyID0gJlJlY19DWyhpbnQzMil2X2JsayAqIHdpZHRoXTsKLSAgICAgICAgbWF4X2JsayA9IG1pbl9ibGsgPSAqcHRyOwotICAgICAgICBGaW5kTWF4TWluKHB0ciwgJm1pbl9ibGssICZtYXhfYmxrLCBpbmNyKTsKLQotICAgICAgICBpZiAobWF4X2JsayAtIG1pbl9ibGsgPj0gNCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyZXMgPSAobWF4X2JsayArIG1pbl9ibGsgKyAxKSA+PiAxOwotCi0gICAgICAgICAgICBmb3IgKHZfcGVsID0gdjA7IHZfcGVsIDwgdl9ibGsgKyBCTEtTSVpFIC0gMTsgdl9wZWwrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGRyX3YgPSB2X3BlbCAqIHdpZHRoOwotICAgICAgICAgICAgICAgIHB0ciA9ICZSZWNfQ1thZGRyX3ZdOwotICAgICAgICAgICAgICAgIHB0cjIgPSAmc3VtX3ZbMF07Ci0gICAgICAgICAgICAgICAgcHRyMyA9ICZzaWduX3ZbMF07Ci0KLSAgICAgICAgICAgICAgICBwZWx1ID0gKihwdHIgLSB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcGVsYyA9ICpwdHI7Ci0gICAgICAgICAgICAgICAgcGVsbCA9ICoocHRyICsgd2lkdGgpOwotICAgICAgICAgICAgICAgIHB0cisrOwotICAgICAgICAgICAgICAgICpwdHIyKysgPSBwZWx1ICsgKHBlbGMgPDwgMSkgKyBwZWxsOwotICAgICAgICAgICAgICAgICpwdHIzKysgPSBJTkRFWChwZWx1LCB0aHJlcykgKyBJTkRFWChwZWxjLCB0aHJlcykgKyBJTkRFWChwZWxsLCB0aHJlcyk7Ci0KLSAgICAgICAgICAgICAgICBwZWx1ID0gKihwdHIgLSB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcGVsYyA9ICpwdHI7Ci0gICAgICAgICAgICAgICAgcGVsbCA9ICoocHRyICsgd2lkdGgpOwotICAgICAgICAgICAgICAgIHB0cisrOwotICAgICAgICAgICAgICAgICpwdHIyKysgPSBwZWx1ICsgKHBlbGMgPDwgMSkgKyBwZWxsOwotICAgICAgICAgICAgICAgICpwdHIzKysgPSBJTkRFWChwZWx1LCB0aHJlcykgKyBJTkRFWChwZWxjLCB0aHJlcykgKyBJTkRFWChwZWxsLCB0aHJlcyk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGhfcGVsID0gMTsgaF9wZWwgPCBCTEtTSVpFIC0gMTsgaF9wZWwrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBlbHUgPSAqKHB0ciAtIHdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgcGVsYyA9ICpwdHI7Ci0gICAgICAgICAgICAgICAgICAgIHBlbGwgPSAqKHB0ciArIHdpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAqcHRyMiA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgICAgICAgICAgICAgICpwdHIzID0gSU5ERVgocGVsdSwgdGhyZXMpICsgSU5ERVgocGVsYywgdGhyZXMpICsgSU5ERVgocGVsbCwgdGhyZXMpOwotCi0gICAgICAgICAgICAgICAgICAgIHN1bTEgPSAqKHB0cjMgLSAyKSArICoocHRyMyAtIDEpICsgKnB0cjM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdW0xID09IDAgfHwgc3VtMSA9PSA5KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSAoKihwdHIyIC0gMikgKyAoKihwdHIyIC0gMSkgPDwgMSkgKyAqcHRyMiArIDgpID4+IDQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0tOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBWX0FCUygqcHRyIC0gc3VtKSA+IG1heF9kaWZmKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdW0gPiAqcHRyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSAqcHRyICsgbWF4X2RpZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSAqcHRyIC0gbWF4X2RpZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcHRyKysgPSAodWludDgpIHN1bTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgcHRyMisrOwotICAgICAgICAgICAgICAgICAgICBwdHIzKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICAvKiBEbyB0aGUgcmVzdCBpbiBNTVggKi8KLSAgICAgICAgZm9yIChoX2JsayA9IEJMS1NJWkU7IGhfYmxrIDwgd2lkdGg7IGhfYmxrICs9IEJMS1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgocHBfbW9kWyh2X2Jsay84KSood2lkdGgvOCkraF9ibGsvOF0mMHg0KSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1heF9kaWZmID0gKFFQX3N0b3JlWygoKChpbnQzMil2X2Jsayp3aWR0aCk+PjMpK2hfYmxrKT4+M10gPj4gMikgKyA0OwotICAgICAgICAgICAgICAgIHB0ciA9ICZSZWNfQ1soaW50MzIpdl9ibGsgKiB3aWR0aCArIGhfYmxrXTsKLSAgICAgICAgICAgICAgICBtYXhfYmxrID0gbWluX2JsayA9ICpwdHI7Ci0gICAgICAgICAgICAgICAgRmluZE1heE1pbihwdHIsICZtaW5fYmxrLCAmbWF4X2JsaywgaW5jcik7Ci0gICAgICAgICAgICAgICAgaDAgPSBoX2JsayAtIDE7Ci0KLSAgICAgICAgICAgICAgICBpZiAobWF4X2JsayAtIG1pbl9ibGsgPj0gNCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocmVzID0gKG1heF9ibGsgKyBtaW5fYmxrICsgMSkgPj4gMTsKLSNpZmRlZiBOb01NWAotICAgICAgICAgICAgICAgICAgICBBZGFwdGl2ZVNtb290aF9Ob01NWChSZWNfQywgdjAsIGgwLCB2X2JsaywgaF9ibGssIHRocmVzLCB3aWR0aCwgbWF4X2RpZmYpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgRGVyaW5nQWRhcHRpdmVTbW9vdGhNTVgoJlJlY19DWyhpbnQzMil2MCp3aWR0aCtoMF0sIHdpZHRoLCB0aHJlcywgbWF4X2RpZmYpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAvKiBtYWNyb2Jsb2NrIGxldmVsICovCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IFJldHVybiBub3RoaW5nIG9yIGRhdGEgb3IgZGF0YSBwb2ludGVyCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgcmV0dXJuOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kZXJpbmdpbmdfbHVtYS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kZXJpbmdpbmdfbHVtYS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NTc0YjQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGVyaW5naW5nX2x1bWEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0jaW5jbHVkZSAgICAibXA0ZGVjX2xpYi5oIgotI2luY2x1ZGUgICAgInBvc3RfcHJvYy5oIgotCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLQotdm9pZCBEZXJpbmdpbmdfTHVtYSgKLSAgICB1aW50OCAqUmVjX1ksCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQsCi0gICAgaW50MTYgKlFQX3N0b3JlLAotICAgIGludCwKLSAgICB1aW50OCAqcHBfbW9kKQotewotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpbnQgdGhyZXNbNF0sIHJhbmdlWzRdLCBtYXhfcmFuZ2VfYmxrLCBtYXhfdGhyZXNfYmxrOwotICAgIGludCBNQl9WLCBNQl9ILCBCTEtfViwgQkxLX0g7Ci0gICAgaW50IHZfYmxrLCBoX2JsazsKLSAgICBpbnQgbWF4X2RpZmY7Ci0gICAgaW50IG1heF9ibGssIG1pbl9ibGs7Ci0gICAgaW50IHYwLCBoMDsKLSAgICB1aW50OCAqcHRyOwotICAgIGludCB0aHIsIGJsa3MsIGluY3I7Ci0gICAgaW50IG1iX2luZHgsIGJsa19pbmR4OwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpbmNyID0gd2lkdGggLSBCTEtTSVpFOwotCi0gICAgLyogRGVyaW5nIHRoZSBmaXJzdCBsaW5lIG9mIG1hY3JvIGJsb2NrcyAqLwotICAgIGZvciAoTUJfSCA9IDA7IE1CX0ggPCB3aWR0aDsgTUJfSCArPSBNQlNJWkUpCi0gICAgewotICAgICAgICBtYXhfZGlmZiA9IChRUF9zdG9yZVsoTUJfSCk+PjRdID4+IDIpICsgNDsKLQotICAgICAgICAvKiB0aHJlc2hvbGQgZGV0ZXJtaW5hdGlvbiAqLwotICAgICAgICBtYXhfcmFuZ2VfYmxrID0gbWF4X3RocmVzX2JsayA9IDA7Ci0gICAgICAgIGJsa3MgPSAwOwotCi0gICAgICAgIGZvciAoQkxLX1YgPSAwOyBCTEtfViA8IE1CU0laRTsgQkxLX1YgKz0gQkxLU0laRSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChCTEtfSCA9IDA7IEJMS19IIDwgTUJTSVpFOyBCTEtfSCArPSBCTEtTSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB0ciA9ICZSZWNfWVsoaW50MzIpKEJMS19WKSAqIHdpZHRoICsgTUJfSCArIEJMS19IXTsKLSAgICAgICAgICAgICAgICBGaW5kTWF4TWluKHB0ciwgJm1pbl9ibGssICZtYXhfYmxrLCBpbmNyKTsKLQotICAgICAgICAgICAgICAgIHRocmVzW2Jsa3NdID0gKG1heF9ibGsgKyBtaW5fYmxrICsgMSkgPj4gMTsKLSAgICAgICAgICAgICAgICByYW5nZVtibGtzXSA9IG1heF9ibGsgLSBtaW5fYmxrOwotCi0gICAgICAgICAgICAgICAgaWYgKHJhbmdlW2Jsa3NdID49IG1heF9yYW5nZV9ibGspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtYXhfcmFuZ2VfYmxrID0gcmFuZ2VbYmxrc107Ci0gICAgICAgICAgICAgICAgICAgIG1heF90aHJlc19ibGsgPSB0aHJlc1tibGtzXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYmxrcysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYmxrcyA9IDA7Ci0gICAgICAgIGZvciAodl9ibGsgPSAwOyB2X2JsayA8IE1CU0laRTsgdl9ibGsgKz0gQkxLU0laRSkKLSAgICAgICAgewotICAgICAgICAgICAgdjAgPSAoKHZfYmxrIC0gMSkgPj0gMSkgPyAodl9ibGsgLSAxKSA6IDE7Ci0gICAgICAgICAgICBmb3IgKGhfYmxrID0gTUJfSDsgaF9ibGsgPCBNQl9IICsgTUJTSVpFOyBoX2JsayArPSBCTEtTSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGgwID0gKChoX2JsayAtIDEpID49IDEpID8gKGhfYmxrIC0gMSkgOiAxOwotCi0gICAgICAgICAgICAgICAgLyogdGhyZXNob2xkIHJlYXJyYW5nZW1lbnQgZm9yIGZsYXQgcmVnaW9uIGFkamFjZW50IHRvIG5vbi1mbGF0IHJlZ2lvbiAqLwotICAgICAgICAgICAgICAgIGlmIChyYW5nZVtibGtzXTwzMiAmJiBtYXhfcmFuZ2VfYmxrID49IDY0KQotICAgICAgICAgICAgICAgICAgICB0aHJlc1tibGtzXSA9IG1heF90aHJlc19ibGs7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgcmVhcnJhbmdlbWVudCBmb3IgZGVibG9ja2luZwotICAgICAgICAgICAgICAgIChibG9ja2luZXNzIGFubm95aW5nIGF0IERDIGRvbWluYW50IHJlZ2lvbikgKi8KLSAgICAgICAgICAgICAgICBpZiAobWF4X3JhbmdlX2JsayA+PSAxNikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGFkYXB0aXZlIHNtb290aGluZyAqLwotICAgICAgICAgICAgICAgICAgICB0aHIgPSB0aHJlc1tibGtzXTsKLQotICAgICAgICAgICAgICAgICAgICBBZGFwdGl2ZVNtb290aF9Ob01NWChSZWNfWSwgdjAsIGgwLCB2X2JsaywgaF9ibGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRociwgd2lkdGgsIG1heF9kaWZmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYmxrcysrOwotICAgICAgICAgICAgfSAvKiBibG9jayBsZXZlbCAoTHVtaW5hbmNlKSAqLwotICAgICAgICB9Ci0gICAgfSAvKiBtYWNyb2Jsb2NrIGxldmVsICovCi0KLQotICAgIC8qIERvIHRoZSByZXN0IG9mIHRoZSBtYWNyby1ibG9jay1saW5lcyAqLwotICAgIGZvciAoTUJfViA9IE1CU0laRTsgTUJfViA8IGhlaWdodDsgTUJfViArPSBNQlNJWkUpCi0gICAgewotICAgICAgICAvKiBGaXJzdCBtYWNyby1ibG9jayAqLwotICAgICAgICBtYXhfZGlmZiA9IChRUF9zdG9yZVsoKCgoaW50MzIpTUJfVip3aWR0aCk+PjQpKT4+NF0gPj4gMikgKyA0OwotICAgICAgICAvKiB0aHJlc2hvbGQgZGV0ZXJtaW5hdGlvbiAqLwotICAgICAgICBtYXhfcmFuZ2VfYmxrID0gbWF4X3RocmVzX2JsayA9IDA7Ci0gICAgICAgIGJsa3MgPSAwOwotICAgICAgICBmb3IgKEJMS19WID0gMDsgQkxLX1YgPCBNQlNJWkU7IEJMS19WICs9IEJMS1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoQkxLX0ggPSAwOyBCTEtfSCA8IE1CU0laRTsgQkxLX0ggKz0gQkxLU0laRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdHIgPSAmUmVjX1lbKGludDMyKShNQl9WICsgQkxLX1YpICogd2lkdGggKyBCTEtfSF07Ci0gICAgICAgICAgICAgICAgRmluZE1heE1pbihwdHIsICZtaW5fYmxrLCAmbWF4X2JsaywgaW5jcik7Ci0gICAgICAgICAgICAgICAgdGhyZXNbYmxrc10gPSAobWF4X2JsayArIG1pbl9ibGsgKyAxKSA+PiAxOwotICAgICAgICAgICAgICAgIHJhbmdlW2Jsa3NdID0gbWF4X2JsayAtIG1pbl9ibGs7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmFuZ2VbYmxrc10gPj0gbWF4X3JhbmdlX2JsaykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1heF9yYW5nZV9ibGsgPSByYW5nZVtibGtzXTsKLSAgICAgICAgICAgICAgICAgICAgbWF4X3RocmVzX2JsayA9IHRocmVzW2Jsa3NdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBibGtzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBibGtzID0gMDsKLSAgICAgICAgZm9yICh2X2JsayA9IE1CX1Y7IHZfYmxrIDwgTUJfViArIE1CU0laRTsgdl9ibGsgKz0gQkxLU0laRSkKLSAgICAgICAgewotICAgICAgICAgICAgdjAgPSB2X2JsayAtIDE7Ci0gICAgICAgICAgICBmb3IgKGhfYmxrID0gMDsgaF9ibGsgPCBNQlNJWkU7IGhfYmxrICs9IEJMS1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaDAgPSAoKGhfYmxrIC0gMSkgPj0gMSkgPyAoaF9ibGsgLSAxKSA6IDE7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgcmVhcnJhbmdlbWVudCBmb3IgZmxhdCByZWdpb24gYWRqYWNlbnQgdG8gbm9uLWZsYXQgcmVnaW9uICovCi0gICAgICAgICAgICAgICAgaWYgKHJhbmdlW2Jsa3NdPDMyICYmIG1heF9yYW5nZV9ibGsgPj0gNjQpCi0gICAgICAgICAgICAgICAgICAgIHRocmVzW2Jsa3NdID0gbWF4X3RocmVzX2JsazsKLQotICAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCByZWFycmFuZ2VtZW50IGZvciBkZWJsb2NraW5nCi0gICAgICAgICAgICAgICAgKGJsb2NraW5lc3MgYW5ub3lpbmcgYXQgREMgZG9taW5hbnQgcmVnaW9uKSAqLwotICAgICAgICAgICAgICAgIGlmIChtYXhfcmFuZ2VfYmxrID49IDE2KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogYWRhcHRpdmUgc21vb3RoaW5nICovCi0gICAgICAgICAgICAgICAgICAgIHRociA9IHRocmVzW2Jsa3NdOwotCi0gICAgICAgICAgICAgICAgICAgIEFkYXB0aXZlU21vb3RoX05vTU1YKFJlY19ZLCB2MCwgaDAsIHZfYmxrLCBoX2JsaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyLCB3aWR0aCwgbWF4X2RpZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBibGtzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gLyogYmxvY2sgbGV2ZWwgKEx1bWluYW5jZSkgKi8KLQotICAgICAgICAvKiBSZXN0IG9mIHRoZSBtYWNyby1ibG9ja3MgKi8KLSAgICAgICAgZm9yIChNQl9IID0gTUJTSVpFOyBNQl9IIDwgd2lkdGg7IE1CX0ggKz0gTUJTSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXhfZGlmZiA9IChRUF9zdG9yZVsoKCgoaW50MzIpTUJfVip3aWR0aCk+PjQpK01CX0gpPj40XSA+PiAyKSArIDQ7Ci0KLSAgICAgICAgICAgIC8qIHRocmVzaG9sZCBkZXRlcm1pbmF0aW9uICovCi0gICAgICAgICAgICBtYXhfcmFuZ2VfYmxrID0gbWF4X3RocmVzX2JsayA9IDA7Ci0gICAgICAgICAgICBibGtzID0gMDsKLQotICAgICAgICAgICAgbWJfaW5keCA9IChNQl9WIC8gOCkgKiAod2lkdGggLyA4KSArIE1CX0ggLyA4OwotICAgICAgICAgICAgZm9yIChCTEtfViA9IDA7IEJMS19WIDwgTUJTSVpFOyBCTEtfViArPSBCTEtTSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoQkxLX0ggPSAwOyBCTEtfSCA8IE1CU0laRTsgQkxLX0ggKz0gQkxLU0laRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJsa19pbmR4ID0gbWJfaW5keCArIChCTEtfViAvIDgpICogd2lkdGggLyA4ICsgQkxLX0ggLyA4OwotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgYmFzZWQgb24gcHBfbW9kIG9ubHkgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChwcF9tb2RbYmxrX2luZHhdJjB4NCkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gJlJlY19ZWyhpbnQzMikoTUJfViArIEJMS19WKSAqIHdpZHRoICsgTUJfSCArIEJMS19IXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRNYXhNaW4ocHRyLCAmbWluX2JsaywgJm1heF9ibGssIGluY3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNbYmxrc10gPSAobWF4X2JsayArIG1pbl9ibGsgKyAxKSA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VbYmxrc10gPSBtYXhfYmxrIC0gbWluX2JsazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlW2Jsa3NdID49IG1heF9yYW5nZV9ibGspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3JhbmdlX2JsayA9IHJhbmdlW2Jsa3NdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90aHJlc19ibGsgPSB0aHJlc1tibGtzXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBibGtzKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBibGtzID0gMDsKLSAgICAgICAgICAgIGZvciAodl9ibGsgPSBNQl9WOyB2X2JsayA8IE1CX1YgKyBNQlNJWkU7IHZfYmxrICs9IEJMS1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdjAgPSB2X2JsayAtIDE7Ci0gICAgICAgICAgICAgICAgbWJfaW5keCA9ICh2X2JsayAvIDgpICogKHdpZHRoIC8gOCk7Ci0gICAgICAgICAgICAgICAgZm9yIChoX2JsayA9IE1CX0g7IGhfYmxrIDwgTUJfSCArIE1CU0laRTsgaF9ibGsgKz0gQkxLU0laRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGgwID0gaF9ibGsgLSAxOwotICAgICAgICAgICAgICAgICAgICBibGtfaW5keCA9IG1iX2luZHggKyBoX2JsayAvIDg7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgocHBfbW9kW2Jsa19pbmR4XSYweDQpICE9IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCByZWFycmFuZ2VtZW50IGZvciBmbGF0IHJlZ2lvbiBhZGphY2VudCB0byBub24tZmxhdCByZWdpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZVtibGtzXTwzMiAmJiBtYXhfcmFuZ2VfYmxrID49IDY0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzW2Jsa3NdID0gbWF4X3RocmVzX2JsazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhyZXNob2xkIHJlYXJyYW5nZW1lbnQgZm9yIGRlYmxvY2tpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIChibG9ja2luZXNzIGFubm95aW5nIGF0IERDIGRvbWluYW50IHJlZ2lvbikgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhfcmFuZ2VfYmxrID49IDE2KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkYXB0aXZlIHNtb290aGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRociA9IHRocmVzW2Jsa3NdOwotI2lmZGVmIE5vTU1YCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRpdmVTbW9vdGhfTm9NTVgoUmVjX1ksIHYwLCBoMCwgdl9ibGssIGhfYmxrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRociwgd2lkdGgsIG1heF9kaWZmKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVyaW5nQWRhcHRpdmVTbW9vdGhNTVgoJlJlY19ZW3YwKndpZHRoK2gwXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgdGhyLCBtYXhfZGlmZik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBibGtzKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAvKiBibG9jayBsZXZlbCAoTHVtaW5hbmNlKSAqLwotICAgICAgICB9IC8qIG1hY3JvYmxvY2sgbGV2ZWwgKi8KLSAgICB9IC8qIG1hY3JvYmxvY2sgbGV2ZWwgKi8KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2ZpbmRfbWluX21heC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9maW5kX21pbl9tYXguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWM4OGExLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2ZpbmRfbWluX21heC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TCi0KLSBJbnB1dHM6Ci0gICAgaW5wdXRfcHRyID0gcG9pbnRlciB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdmFsdWVzIG9mIHR5cGUgVUNoYXIKLSAgICAgICAgICAgIGluIGEgMkQgYmxvY2sgb2YgZGF0YS4KLSAgICBtaW5fcHRyID0gcG9pbnRlciB0byB0aGUgbWluaW11bSB2YWx1ZSBvZiB0eXBlIEludCB0byBiZSBmb3VuZCBpbiBhCi0gICAgICAgICAgc3F1YXJlIGJsb2NrIG9mIHNpemUgQkxLU0laRSBjb250YWluZWQgaW4gMkQgYmxvY2sgb2YgZGF0YS4KLSAgICBtYXhfcHRyID0gcG9pbnRlciB0byB0aGUgbWF4aW11bSB2YWx1ZSBvZiB0eXBlIEludCB0byBiZSBmb3VuZCBpbiBhCi0gICAgICAgICAgc3F1YXJlIGJsb2NrIG9mIHNpemUgQkxLU0laRSBjb250YWluZWQgaW4gMkQgYmxvY2sgb2YgZGF0YS4KLSAgICBpbmNyID0gdmFsdWUgb2YgdHlwZSBJbnQgcmVwcmVzZW50aW5nIHRoZSB3aWR0aCBvZiAyRCBibG9jayBvZiBkYXRhLgotCi0gTG9jYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gT3V0cHV0czoKLSAgICBOb25lCi0KLSBQb2ludGVycyBhbmQgQnVmZmVycyBNb2RpZmllZDoKLSAgICBtaW5fcHRyIHBvaW50cyB0byB0aGUgZm91bmQgbWluaW11bSB2YWx1ZSBpbiB0aGUgc3F1YXJlIGJsb2NrIG9mCi0gICAgc2l6ZSBCTEtTSVpFIGNvbnRhaW5lZCBpbiAyRCBibG9jayBvZiBkYXRhLgotCi0gICAgbWF4X3B0ciBwb2ludHMgdG8gdGhlIGZvdW5kIG1heGltdW0gdmFsdWUgaW4gdGhlIHNxdWFyZSBibG9jayBvZgotICAgIHNpemUgQkxLU0laRSBjb250YWluZWQgaW4gMkQgYmxvY2sgb2YgZGF0YS4KLQotIExvY2FsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBOb25lCi0KLSBHbG9iYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRlVOQ1RJT04gREVTQ1JJUFRJT04KLQotIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIG1heGltdW0gYW5kIHRoZSBtaW5pbXVtIHZhbHVlcyBpbiBhIHNxdWFyZSBibG9jayBvZgotIGRhdGEgb2Ygc2l6ZSBCTEtTSVpFICogQkxLU0laRS4gVGhlIGRhdGEgaXMgY29udGFpbmVkIGluIHRoZSBidWZmZXIgd2hpY2gKLSByZXByZXNlbnRzIGEgMkQgYmxvY2sgb2YgZGF0YSB0aGF0IGlzIGxhcmdlciB0aGFuIEJMS1NJWkUgKiBCTEtTSVpFLgotIFRoaXMgaXMgaWxsdXN0cmF0ZWQgYmVsb3cuCi0KLSAgICBtZW0gbG9jIHggKyAwMGggLT4gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbwotICAgIG1lbSBsb2MgeCArIDEwaCAtPiBvIG8gbyBvIG8gWCBYIFggWCBYIFggWCBYIG8gbyBvCi0gICAgbWVtIGxvYyB4ICsgMjBoIC0+IG8gbyBvIG8gbyBYIFggWCBYIFggWCBYIFggbyBvIG8KLSAgICBtZW0gbG9jIHggKyAzMGggLT4gbyBvIG8gbyBvIFggWCBYIFggWCBYIFggWCBvIG8gbwotICAgIG1lbSBsb2MgeCArIDQwaCAtPiBvIG8gbyBvIG8gWCBYIFggWCBYIFggWCBYIG8gbyBvCi0gICAgbWVtIGxvYyB4ICsgNTBoIC0+IG8gbyBvIG8gbyBYIFggWCBYIFggWCBYIFggbyBvIG8KLSAgICBtZW0gbG9jIHggKyA2MGggLT4gbyBvIG8gbyBvIFggWCBYIFggWCBYIFggWCBvIG8gbwotICAgIG1lbSBsb2MgeCArIDcwaCAtPiBvIG8gbyBvIG8gWCBYIFggWCBYIFggWCBYIG8gbyBvCi0gICAgbWVtIGxvYyB4ICsgODBoIC0+IG8gbyBvIG8gbyBYIFggWCBYIFggWCBYIFggbyBvIG8KLSAgICBtZW0gbG9jIHggKyA5MGggLT4gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbwotICAgIG1lbSBsb2MgeCArIEEwaCAtPiBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvCi0gICAgbWVtIGxvYyB4ICsgQjBoIC0+IG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8KLQotRm9yIGlsbHVzdHJhdGlvbiBwdXJwb3NlcywgdGhlIGRpYWdyYW0gYXNzdW1lcyB0aGF0IEJMS1NJWkUgaXMgZXF1YWwgdG8gOAotYnV0IHRoaXMgaXMgbm90IGEgcmVxdWlyZW1lbnQuIEluIHRoaXMgZGlhZ3JhbSwgdGhlIGJ1ZmZlciBzdGFydHMgYXQKLWxvY2F0aW9uIHggYnV0IHRoZSBpbnB1dCBwb2ludGVyLCBpbnB1dF9wdHIsIHBhc3NlZCBpbnRvIHRoaXMgZnVuY3Rpb24KLXdvdWxkIGJlIHRoZSBmaXJzdCByb3cgb2YgZGF0YSB0byBiZSBzZWFyY2hlZCB3aGljaCBpcyBhdCB4ICsgMTVoLiBUaGUKLXZhbHVlIG9mIGluY3IgcGFzc2VkIG9udG8gdGhpcyBmdW5jdGlvbiByZXByZXNlbnRzIHRoZSBhbW91bnQgdGhlIGlucHV0X3B0cgotbmVlZHMgdG8gYmUgaW5jcmVtZW50ZWQgdG8gcG9pbnQgdG8gdGhlIG5leHQgcm93IG9mIGRhdGEuCi0KLVRoaXMgZnVuY3Rpb24gY29tcGFyZXMgZWFjaCB2YWx1ZSBpbiBhIHJvdyB0byB0aGUgY3VycmVudCBtYXhpbXVtIGFuZAotbWluaW11bS4gQWZ0ZXIgZWFjaCByb3csIGlucHV0X3B0ciBpcyBpbmNyZW1lbnRlZCB0byBwb2ludCB0byB0aGUgbmV4dCByb3cuCi1UaGlzIGlzIHJlcGVhdGVkIHVudGlsIGFsbCByb3dzIGhhdmUgYmVlbiBwcm9jZXNzZWQuIFdoZW4gdGhlIHNlYXJjaCBpcwotY29tcGxldGUgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgbWluX3B0ciBjb250YWlucyB0aGUgbWluaW11bSB2YWx1ZQotZm91bmQgYW5kIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IG1heF9wdHIgY29udGFpbnMgdGhlIG1heGltdW0gdmFsdWUgZm91bmQuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSU5DTFVERVMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgICAgIm1wNGRlY19saWIuaCIKLSNpbmNsdWRlICAgICJwb3N0X3Byb2MuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1BQ1JPUwotOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERFRklORVMKLTsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKLTsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKLTsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIERFRklOSVRJT05TCi07IFZhcmlhYmxlIGRlY2xhcmF0aW9uIC0gZGVmaW5lZCBoZXJlIGFuZCB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgRlVOQ1RJT04gUkVGRVJFTkNFUwotOyBEZWNsYXJlIGZ1bmN0aW9ucyBkZWZpbmVkIGVsc2V3aGVyZSBhbmQgcmVmZXJlbmNlZCBpbiB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBHTE9CQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgUkVGRVJFTkNFUwotOyBEZWNsYXJlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgbW9kdWxlIGJ1dCBkZWZpbmVkIGVsc2V3aGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZVTkNUSU9OIENPREUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCAgRmluZE1heE1pbigKLSAgICB1aW50OCAqaW5wdXRfcHRyLAotICAgIGludCAqbWluX3B0ciwKLSAgICBpbnQgKm1heF9wdHIsCi0gICAgaW50IGluY3IpCi17Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHVpbnQgICAgaSwgajsKLSAgICBpbnQgbWluLCBtYXg7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIG1heCA9IG1pbiA9ICppbnB1dF9wdHI7Ci0gICAgLyogIGluY3IgPSBpbmNyIC0gQkxLU0laRTsgKi8gICAvKiAgMDkvMDYvMjAwMSwgYWxyZWFkeSBwYXNzZWQgaW4gYXMgd2lkdGggLSBCTEtTSVpFICovCi0KLSAgICBmb3IgKGkgPSBCTEtTSVpFOyBpID4gMDsgaS0tKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gQkxLU0laRTsgaiA+IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCppbnB1dF9wdHIgPiBtYXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWF4ID0gKmlucHV0X3B0cjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCppbnB1dF9wdHIgPCBtaW4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWluID0gKmlucHV0X3B0cjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0X3B0ciArPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogc2V0IHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCByb3cqLwotICAgICAgICBpbnB1dF9wdHIgKz0gaW5jcjsKLSAgICB9Ci0KLSAgICAqbWF4X3B0ciA9IG1heDsKLSAgICAqbWluX3B0ciA9IG1pbjsKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IFJldHVybiBub3RoaW5nIG9yIGRhdGEgb3IgZGF0YSBwb2ludGVyCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgcmV0dXJuOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wb3N0X3Byb2Nfc2VtYXBob3JlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3Bvc3RfcHJvY19zZW1hcGhvcmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWJjNmJlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3Bvc3RfcHJvY19zZW1hcGhvcmUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0vKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gSU5QVVQgQU5EIE9VVFBVVCBERUZJTklUSU9OUwotCi0gSW5wdXRzOgotICAgIHFfYmxvY2sgPSBwb2ludGVyIHRvIGJ1ZmZlciBvZiBpbnZlcnNlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzIG9mIHR5cGUKLSAgICAgICAgICAgICAgaW50IGZvciBpbnRyYS1WT1AgbW9kZSBvciBidWZmZXIgb2YgcmVzaWR1YWwgZGF0YSBvZiB0eXBlIGludAotICAgICAgICAgICAgICBmb3IgaW50ZXItVk9QIG1vZGUKLQotIExvY2FsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICBOb25lCi0KLSBHbG9iYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIE5vbmUKLQotIE91dHB1dHM6Ci0gICAgcG9zdG1vZGUgPSBwb3N0IHByb2Nlc3Npbmcgc2VtYXBob3JlIHdpdGggdGhlIHZlcnRpY2FsIGRlYmxvY2tpbmcsCi0gICAgICAgICAgICAgICBob3Jpem9udGFsIGRlYmxvY2tpbmcsIGFuZCBkZXJpbmdpbmcgYml0cyBzZXQgdXAgYWNjb3JkaW5nbHkKLQotIFBvaW50ZXJzIGFuZCBCdWZmZXJzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotIExvY2FsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBOb25lCi0KLSBHbG9iYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRlVOQ1RJT04gREVTQ1JJUFRJT04KLQotIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCB0aGUgcG9zdG1vZGUgc2VtYXBob3JlIGJhc2VkIG9uIHRoZSBjb250ZW50cyBvZiB0aGUKLSBidWZmZXIgcG9pbnRlZCB0byBieSBxX2Jsb2NrLiBUaGUgZnVuY3Rpb24gc3RhcnRzIG91dCB3aXRoIHRoZSBhc3N1bXB0aW9uCi0gdGhhdCBhbGwgZW50cmllcyBvZiBxX2Jsb2NrLCBleGNlcHQgZm9yIHRoZSBmaXJzdCBlbnRyeSAocV9ibG9ja1swXSksIGFyZQotIHplcm8uIFRoaXMgY2FzZSBjYW4gaW5kdWNlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGJsb2NraW5nIGFydGlmYWN0cywKLSB0aGVyZWZvcmUsIGJvdGggaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZGVibG9ja2luZyBiaXRzIGFyZSBlbmFibGVkLgotCi0gVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSB0ZXN0ZWQgd2hlbiBzZXR0aW5nIHVwIHRoZSBob3Jpem9udGFsL3ZlcnRpY2FsCi0gZGVibG9ja2luZyBhbmQgZGVyaW5naW5nIGJpdHM6Ci0gMS4gV2hlbiBvbmx5IHRoZSBlbGVtZW50cyBvZiB0aGUgdG9wIHJvdyBvZiB0aGUgQl9TSVpFIHggQl9TSVpFIGJsb2NrCi0gICAgKHFfYmxvY2tbbl0sIG4gPSAwLC4uLiwgQl9TSVpFLTEpIGFyZSBub24temVybywgdmVydGljYWwgYmxvY2tpbmcgYXJ0aWZhY3RzCi0gICAgbWF5IHJlc3VsdCwgdGhlcmVmb3JlLCBvbmx5IHRoZSB2ZXJ0aWNhbCBkZWJsb2NraW5nIGJpdCBpcyBlbmFibGVkLgotICAgIE90aGVyd2lzZSwgdGhlIHZlcnRpY2FsIGRlYmxvY2tpbmcgYml0IGlzIGRpc2FibGVkLgotIDIuIFdoZW4gb25seSB0aGUgZWxlbWVudHMgb2YgdGhlIGZhciBsZWZ0IGNvbHVtbiBvZiB0aGUgQl9TSVpFIHggQl9TSVpFIGJsb2NrCi0gICAgKHFfYmxvY2tbbipCX1NJWkVdLCBuID0gMCwgLi4uLCBCX1NJWkUtMSkgYXJlIG5vbi16ZXJvLCBob3Jpem9udGFsIGJsb2NraW5nCi0gICAgYXJ0aWZhY3RzIG1heSByZXN1bHQsIHRoZXJlZm9yZSwgb25seSB0aGUgaG9yaXpvbnRhbCBkZWJsb2NraW5nIGJpdCBpcwotICAgIGVuYWJsZWQuIE90aGVyd2lzZSwgdGhlIGhvcml6b250YWwgZGVibG9ja2luZyBiaXQgaXMgZGlzYWJsZWQuCi0gMy4gSWYgYW55IG5vbi16ZXJvIGVsZW1lbnRzIGV4aXN0IGluIHBvc2l0aW9ucyBvdGhlciB0aGFuIHFfYmxvY2tbMF0sCi0gICAgcV9ibG9ja1sxXSwgb3IgcV9ibG9ja1tCX1NJWkVdLCB0aGUgZGVyaW5naW5nIGJpdCBpcyBlbmFibGVkLiBPdGhlcndpc2UsCi0gICAgaXQgaXMgZGlzYWJsZWQuCi0KLSBUaGUgMyBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHBvc3Rtb2RlIGRlZmluZXMgdmVydGljYWwgb3IgaG9yaXpvbnRhbAotIGRlYmxvY2tpbmcgYW5kIGRlcmluZ2luZy4KLQotIFRoZSB2YWxpZCB2YWx1ZXMgYXJlIHNob3duIGJlbG93OgotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSB8ICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgICB8IEVuYWJsZWQgfCBEaXNhYmxlZCB8Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIHwgVmVydGljYWwgRGVibG9ja2luZyAoQml0ICMwKSAgIHwgICAgMSAgICB8ICAgICAwICAgIHwKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gfCBIb3Jpem9udGFsIERlYmxvY2tpbmcgKEJpdCAjMSkgfCAgICAxICAgIHwgICAgIDAgICAgfAotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSB8IERlcmluZ2luZyAoQml0ICMyKSAgICAgICAgICAgICB8ICAgIDEgICAgfCAgICAgMCAgICB8Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJTkNMVURFUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAgICAibXA0ZGVjX2xpYi5oIgotI2luY2x1ZGUgICAgIm1wNGRlZi5oIgotI2luY2x1ZGUgICAgInBvc3RfcHJvYy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTUFDUk9TCi07IERlZmluZSBtb2R1bGUgc3BlY2lmaWMgbWFjcm9zIGhlcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBERUZJTkVTCi07IEluY2x1ZGUgYWxsIHByZS1wcm9jZXNzb3Igc3RhdGVtZW50cyBoZXJlLiBJbmNsdWRlIGNvbmRpdGlvbmFsCi07IGNvbXBpbGUgdmFyaWFibGVzIGFsc28uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIEZVTkNUSU9OIERFRklOSVRJT05TCi07IEZ1bmN0aW9uIFByb3RvdHlwZSBkZWNsYXJhdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBERUZJTklUSU9OUwotOyBWYXJpYWJsZSBkZWNsYXJhdGlvbiAtIGRlZmluZWQgaGVyZSBhbmQgdXNlZCBvdXRzaWRlIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEZVTkNUSU9OIFJFRkVSRU5DRVMKLTsgRGVjbGFyZSBmdW5jdGlvbnMgZGVmaW5lZCBlbHNld2hlcmUgYW5kIHJlZmVyZW5jZWQgaW4gdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgR0xPQkFMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIFJFRkVSRU5DRVMKLTsgRGVjbGFyZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGlzIG1vZHVsZSBidXQgZGVmaW5lZCBlbHNld2hlcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRlVOQ1RJT04gQ09ERQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgUG9zdFByb2NTZW1hcGhvcmUoCi0gICAgaW50MTYgKnFfYmxvY2spCi17Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGludCBpLCBqOwotCi0gICAgLyogU2V0IGRlZmF1bHQgdmFsdWUgdG8gdmVydGljYWwgYW5kIGhvcml6b250YWwgZGVibG9ja2luZyBlbmFibGVkICovCi0gICAgLyogSW5pdGlhbCBhc3N1bXB0aW9uIGlzIHRoYXQgb25seSBxX2Jsb2NrWzBdIGVsZW1lbnQgaXMgbm9uLXplcm8sICovCi0gICAgLyogdGhlcmVmb3JlLCB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBkZWJsb2NraW5nIGJpdHMgYXJlIHNldCB0byAxICovCi0gICAgaW50IHBvc3Rtb2RlID0gMHgzOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBWZXJ0aWNhbCBkZWJsb2NraW5nIGJpdCBpcyBlbmFibGVkIHdoZW4gb25seSB0aGUgZW50aXJlIHRvcCByb3cgb2YgICAqLwotICAgIC8qIHRoZSBCX1NJWkUgeCBCX1NJWkUgYmxvY2ssIGkuZS4sIHFfYmxvY2tbbl0sIG4gPSAwLC4uLiwgQl9TSVpFLTEsICAgICovCi0gICAgLyogYXJlIG5vbi16ZXJvLiBTaW5jZSBpbml0aWFsIGFzc3VtcHRpb24gaXMgdGhhdCBhbGwgZWxlbWVudHMsIGV4Y2VwdCAgKi8KLSAgICAvKiBxX2Jsb2NrWzBdLCBpcyB6ZXJvLCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSByZW1haW5pbmcgZWxlbWVudHMgaW4gdGhlICAqLwotICAgIC8qIHRvcCByb3cgdG8gIGRldGVybWluZSBpZiBhbGwgb3Igc29tZSBhcmUgbm9uLXplcm8uICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKHFfYmxvY2tbMV0gIT0gMCkKLSAgICB7Ci0gICAgICAgIC8qIEF0IHRoaXMgcG9pbnQsIHFfYmxvY2tbMF0gYW5kIHFfYmxvY2tbMV0gYXJlIG5vbi16ZXJvLCB3aGlsZSAqLwotICAgICAgICAvKiBxX2Jsb2NrW25dLCBuID0gMiwuLi4sIEJfU0laRS0xLCBhcmUgemVyby4gVGhlcmVmb3JlLCB3ZSAgICAgKi8KLSAgICAgICAgLyogbmVlZCB0byBkaXNhYmxlIHZlcnRpY2FsIGRlYmxvY2tpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHBvc3Rtb2RlICY9IDB4RTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAyOyBpIDwgQl9TSVpFOyBpKyspCi0gICAgewotICAgICAgICBpZiAocV9ibG9ja1tpXSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ2hlY2sgaWYgcV9ibG9ja1tuXSwgbiA9IDIsLi4uLCBCX1NJWkUtMSwgYXJlIG5vbi16ZXJvLiovCi0gICAgICAgICAgICAvKiBJZiBhbnkgb2YgdGhlbSB0dXJuIG91dCB0byBiZSBub24temVybywgd2UgbmVlZCB0byAgICAgKi8KLSAgICAgICAgICAgIC8qIGRpc2FibGUgdmVydGljYWwgZGVibG9ja2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcG9zdG1vZGUgJj0gMHhFOwotCi0gICAgICAgICAgICAvKiBEZXJpbmdpbmcgaXMgZW5hYmxlZCBpZiBhbnkgbm9uemVybyBlbGVtZW50cyBleGlzdCBpbiAqLwotICAgICAgICAgICAgLyogcG9zaXRpb25zIG90aGVyIHRoYW4gcV9ibG9ja1swXSwgcV9ibG9ja1sxXSBvciAgICAgICAgKi8KLSAgICAgICAgICAgIC8qIHFfYmxvY2tbQl9TSVpFXS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwb3N0bW9kZSB8PSAweDQ7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogSG9yaXpvbnRhbCBkZWJsb2NraW5nIGJpdCBpcyBlbmFibGVkIHdoZW4gb25seSB0aGUgZW50aXJlIGZhciAqLwotICAgIC8qIGxlZnQgY29sdW1uLCBpLmUuLCBxX2Jsb2NrW24qQl9TSVpFXSwgbiA9IDAsIC4uLiwgQl9TSVpFLTEsICAgKi8KLSAgICAvKiBhcmUgbm9uLXplcm8uIFNpbmNlIGluaXRpYWwgYXNzdW1wdGlvbiBpcyB0aGF0IGFsbCBlbGVtZW50cywgICovCi0gICAgLyogZXhjZXB0IHFfYmxvY2tbMF0sIGlzIHplcm8sIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHJlbWFpbmluZyAgICAqLwotICAgIC8qIGVsZW1lbnRzIGluIHRoZSBmYXIgbGVmdCBjb2x1bW4gdG8gZGV0ZXJtaW5lIGlmIGFsbCBvciBzb21lICAgKi8KLSAgICAvKiBhcmUgbm9uLXplcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKHFfYmxvY2tbQl9TSVpFXSkKLSAgICB7Ci0gICAgICAgIC8qIEF0IHRoaXMgcG9pbnQsIG9ubHkgcV9ibG9ja1swXSBhbmQgcV9ibG9ja1tCX1NJWkVdIGFyZSBub24temVybywgKi8KLSAgICAgICAgLyogd2hpbGUgcV9ibG9ja1tuKkJfU0laRV0sIG4gPSAyLCAzLC4uLiwgQl9TSVpFLTEsIGFyZSB6ZXJvLiAgICAgICAqLwotICAgICAgICAvKiBUaGVyZWZvcmUsIHdlIG5lZWQgdG8gZGlzYWJsZSBob3Jpem9udGFsIGRlYmxvY2tpbmcuICAgICAgICAgICAgICovCi0gICAgICAgIHBvc3Rtb2RlICY9IDB4RDsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAxNjsgaSA8IE5DT0VGRl9CTE9DSzsgaSArPSBCX1NJWkUpCi0gICAgewotICAgICAgICBpZiAocV9ibG9ja1tpXSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ2hlY2sgaWYgcV9ibG9ja1tuXSwgbiA9IDIqQl9TSVpFLC4uLiwoQl9TSVpFLTEpKkJfU0laRSwgICovCi0gICAgICAgICAgICAvKiBhcmUgbm9uLXplcm8uIElmIGFueSBvZiB0aGVtIHR1cm4gb3V0IHRvIGJlIG5vbi16ZXJvLCAgICAgKi8KLSAgICAgICAgICAgIC8qIHdlIG5lZWQgdG8gZGlzYWJsZSBob3Jpem9udGFsIGRlYmxvY2tpbmcuICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcG9zdG1vZGUgJj0gMHhEOwotCi0gICAgICAgICAgICAvKiBEZXJpbmdpbmcgaXMgZW5hYmxlZCBpZiBhbnkgbm9uemVybyBlbGVtZW50cyBleGlzdCBpbiAqLwotICAgICAgICAgICAgLyogcG9zaXRpb25zIG90aGVyIHRoYW4gcV9ibG9ja1swXSwgcV9ibG9ja1sxXSBvciAgICAgICAgKi8KLSAgICAgICAgICAgIC8qIHFfYmxvY2tbQl9TSVpFXS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwb3N0bW9kZSB8PSAweDQ7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQXQgdGhpcyBwb2ludCwgb25seSB0aGUgZmlyc3Qgcm93IGFuZCBmYXIgbGVmdCBjb2x1bW4gZWxlbWVudHMgKi8KLSAgICAvKiBoYXZlIGJlZW4gdGVzdGVkLiBJZiBkZXJpbmdpbmcgYml0IGlzIHN0aWxsIG5vdCBzZXQgYXQgdGhpcyAgICAqLwotICAgIC8qIHBvaW50LCBjaGVjayB0aGUgcmVzdCBvZiBxX2Jsb2NrIHRvIGRldGVybWluZSBpZiB0aGUgZWxlbWVudHMgICovCi0gICAgLyogYXJlIG5vbi16ZXJvLiBJZiBhbGwgZWxlbWVudHMsIGJlc2lkZXMgcV9ibG9ja1swXSwgcV9ibG9ja1sxXSwgKi8KLSAgICAvKiBvciBxX2Jsb2NrW0JfU0laRV0gYXJlIG5vbi16ZXJvLCBkZXJpbmdpbmcgYml0IG11c3QgYmUgc2V0ICAgICAqLwotICAgIGlmICgocG9zdG1vZGUgJiAweDQpID09IDApCi0gICAgewotICAgICAgICBmb3IgKGkgPSAxOyBpIDwgQl9TSVpFOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPCBCX1NJWkU7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocV9ibG9ja1soaTw8Mykral0pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBBdCB0aGlzIHBvaW50LCBxX2Jsb2NrWzBdIGFuZCBhbm90aGVyIHFfYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCBhcmUgbm9uLXplcm8sIHRoZXJlZm9yZSwgd2UgbmVlZCB0byAgICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGRpc2FibGUgdmVydGljYWwgYW5kIGhvcml6b250YWwgZGVibG9ja2luZyAgICAqLwotICAgICAgICAgICAgICAgICAgICBwb3N0bW9kZSAmPSAweEM7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogRGVyaW5naW5nIGlzIGVuYWJsZWQgaWYgYW55IG5vbnplcm8gZWxlbWVudHMgZXhpc3QgaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgLyogcG9zaXRpb25zIG90aGVyIHRoYW4gcV9ibG9ja1swXSwgcV9ibG9ja1sxXSBvciAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogcV9ibG9ja1tCX1NJWkVdLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcG9zdG1vZGUgfD0gMHg0OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFNldCBvdXRlciBGT1IgbG9vcCBjb3VudCB0byBCX1NJWkUgdG8gZ2V0IG91dCBvZiAqLwotICAgICAgICAgICAgICAgICAgICAvKiBvdXRlciBGT1IgbG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaSA9IEJfU0laRTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBHZXQgb3V0IG9mIGlubmVyIEZPUiBsb29wICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICByZXR1cm4gKHBvc3Rtb2RlKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wcF9zZW1hcGhvcmVfY2hyb21hX2ludGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3BwX3NlbWFwaG9yZV9jaHJvbWFfaW50ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzIwMjIyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3BwX3NlbWFwaG9yZV9jaHJvbWFfaW50ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0vKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gSU5QVVQgQU5EIE9VVFBVVCBERUZJTklUSU9OUwotCi0gSW5wdXRzOgotICAgIHhwcmVkID0geC1heGlzIGNvb3JkaW5hdGUgb2YgdGhlIGJsb2NrIHVzZWQgZm9yIHByZWRpY3Rpb24gKGludCkKLSAgICB5cHJlZCA9IHktYXhpcyBjb29yZGluYXRlIG9mIHRoZSBibG9jayB1c2VkIGZvciBwcmVkaWN0aW9uIChpbnQpCi0gICAgcHBfZGVjX3UgPSBwb2ludGVyIHRvIHRoZSBwb3N0IHByb2Nlc3Npbmcgc2VtYXBob3JlIGZvciBjaHJvbWluYW5jZQotICAgICAgICAgICAgICAgKHVpbnQ4KQotICAgIHBzdHByY1R5cFBydiA9IHBvaW50ZXIgdGhlIHByZXZpb3VzIGZyYW1lJ3MgcG9zdCBwcm9jZXNzaW5nIHR5cGUKLSAgICAgICAgICAgICAgICAgICAodWludDgpCi0gICAgZHggPSBob3Jpem9udGFsIGNvbXBvbmVudCBvZiB0aGUgbW90aW9uIHZlY3RvciAoaW50KQotICAgIGR5ID0gdmVydGljYWwgY29tcG9uZW50IG9mIHRoZSBtb3Rpb24gdmVjdG9yIChpbnQpCi0gICAgbXZ3aWR0aCA9IG51bWJlciBvZiBibG9ja3MgcGVyIHJvdyBpbiB0aGUgbHVtaW5hbmNlIFZPUCAoaW50KQotICAgIGhlaWdodCA9IGx1bWluYW5jZSBWT1AgaGVpZ2h0IGluIHBpeGVscyAoaW50KQotICAgIHNpemUgPSB0b3RhbCBudW1iZXIgb2YgcGl4ZWwgaW4gdGhlIGN1cnJlbnQgbHVtaW5hbmNlIFZPUCAoaW50KQotICAgIG12X2xvYyA9IGZsYWcgaW5kaWNhdGluZyBsb2NhdGlvbiBvZiB0aGUgbW90aW9uIGNvbXBlbnNhdGVkCi0gICAgICAgICAoeCx5KSBwb3NpdGlvbiB3aXRoIHJlc3BlY3QgdG8gdGhlIGx1bWluYW5jZSBNQiAoaW50KTsKLSAgICAgICAgIDAgLT4gaW5zaWRlIE1CLCAxIC0+IG91dHNpZGUgTUIKLSAgICBtc2tfZGVibG9jayA9IGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHBlcmZvcm0gZGVibG9ja2luZwotICAgICAgICAgICAgICAobXNrX2RlYmxvY2sgPSAwKSBvciBub3QgKG1za19kZWJsb2NrID0gMSkgKHVpbnQ4KQotCi0gTG9jYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gT3V0cHV0czoKLSAgICBOb25lCi0KLSBQb2ludGVycyBhbmQgQnVmZmVycyBNb2RpZmllZDoKLSAgICBwcF9kZWNfdSBjb250ZW50cyBhcmUgdGhlIHVwZGF0ZWQgc2VtYXBob3JlIHByb3BhZ2F0aW9uIGRhdGEKLQotIExvY2FsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBOb25lCi0KLSBHbG9iYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRlVOQ1RJT04gREVTQ1JJUFRJT04KLQotIFRoaXMgZnVuY3Rpb25zIHBlcmZvcm1zIHBvc3QgcHJvY2Vzc2luZyBzZW1hcGhvcmUgcHJvcGFnYXRpb24gcHJvY2Vzc2luZwotIGFmdGVyIGNocm9taW5hbmNlIHByZWRpY3Rpb24gaW4gaW50ZXJmcmFtZSBwcm9jZXNzaW5nIG1vZGUuCi0KLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElOQ0xVREVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICAgICJtcDRkZWNfYXBpLmgiCi0jaW5jbHVkZSAgICAibXA0ZGVmLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNQUNST1MKLTsgRGVmaW5lIG1vZHVsZSBzcGVjaWZpYyBtYWNyb3MgaGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBERUZJTkVTCi07IEluY2x1ZGUgYWxsIHByZS1wcm9jZXNzb3Igc3RhdGVtZW50cyBoZXJlLiBJbmNsdWRlIGNvbmRpdGlvbmFsCi07IGNvbXBpbGUgdmFyaWFibGVzIGFsc28uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIEZVTkNUSU9OIERFRklOSVRJT05TCi07IEZ1bmN0aW9uIFByb3RvdHlwZSBkZWNsYXJhdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBERUZJTklUSU9OUwotOyBWYXJpYWJsZSBkZWNsYXJhdGlvbiAtIGRlZmluZWQgaGVyZSBhbmQgdXNlZCBvdXRzaWRlIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEZVTkNUSU9OIFJFRkVSRU5DRVMKLTsgRGVjbGFyZSBmdW5jdGlvbnMgZGVmaW5lZCBlbHNld2hlcmUgYW5kIHJlZmVyZW5jZWQgaW4gdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgR0xPQkFMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIFJFRkVSRU5DRVMKLTsgRGVjbGFyZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGlzIG1vZHVsZSBidXQgZGVmaW5lZCBlbHNld2hlcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRlVOQ1RJT04gQ09ERQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHZvaWQgcHBfc2VtYXBob3JlX2Nocm9tYV9pbnRlcigKLSAgICAgICAgaW50IHhwcmVkLCAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IHlwcmVkLCAgICAgIC8qIGkgKi8KLSAgICAgICAgdWludDggICAqcHBfZGVjX3UsICAvKiBpL28gKi8KLSAgICAgICAgdWludDggICAqcHN0cHJjVHlwUHJ2LCAgLyogaSAqLwotICAgICAgICBpbnQgZHgsICAgICAvKiBpICovCi0gICAgICAgIGludCBkeSwgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IG12d2lkdGgsICAgIC8qIGkgKi8KLSAgICAgICAgaW50IGhlaWdodCwgICAgIC8qIGkgKi8KLSAgICAgICAgaW50MzIgICBzaXplLCAgICAgICAvKiBpICovCi0gICAgICAgIGludCBtdl9sb2MsICAgICAvKiBpICovCi0gICAgICAgIHVpbnQ4ICAgbXNrX2RlYmxvY2sgLyogaSAqLwotICAgICkKLSAgICB7Ci0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCi0gICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICBpbnQgbW12eSwgbW12eCwgbm12eSwgbm12eDsKLSAgICAgICAgdWludDggKnBwX3ByZXYxLCAqcHBfcHJldjIsICpwcF9wcmV2MywgKnBwX3ByZXY0OwotCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQotICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgICAgICAvKiAwOS8yOC8yMDAwLCBtb2RpZnkgc2VtYXBob3JlIHByb3BhZ2F0aW9uIHRvICovCi0gICAgICAgIC8qIGFjY29tbW9kYXRlIHNtYXJ0IGluZGV4aW5nICovCi0gICAgICAgIG1tdnggPSB4cHJlZCA+PiA0OyAgLyogYmxvY2sgeCBjb29yICovCi0gICAgICAgIG5tdnggPSBtbXZ4OwotCi0gICAgICAgIG1tdnkgPSB5cHJlZCA+PiA0OyAgLyogYmxvY2sgeSBjb29yICovCi0gICAgICAgIG5tdnkgPSBtbXZ5OwotCi0gICAgICAgIC8qIENoZWNrIGlmIE1WIGlzIG91dHNpZGUgdGhlIGZyYW1lICovCi0gICAgICAgIGlmIChtdl9sb2MgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogUGVyZm9ybSBib3VuZGFyeSBjaGVjayAqLwotICAgICAgICAgICAgaWYgKG5tdnggPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5tdnggPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobm12eCA+IG12d2lkdGggLSAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5tdnggPSBtdndpZHRoIC0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5tdnkgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5tdnkgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobm12eSA+IChoZWlnaHQgPj4gNCkgLSAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5tdnkgPSAoaGVpZ2h0ID4+IDQpIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIENhbGN1bGF0ZSBwb2ludGVyIHRvIGZpcnN0IGNocm9taW5hbmNlIGIgc2VtYXBob3JlcyBpbiAgICAgICAqLwotICAgICAgICAvKiBwc3RwcmNUeXBQcnYsIGkuZS4sIGZpcnN0IGNocm9taW5hbmNlIGIgc2VtYXBob3JlIGlzIGluICAgICAgKi8KLSAgICAgICAgLyogKHBzdHByY1R5cFBydiArIChzaXplPj42KSkuICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogU2luY2UgdG90YWwgbnVtYmVyIG9mIGNocm9taW5hbmNlIGJsb2NrcyBwZXIgcm93IGluIGEgVk9QICAgICovCi0gICAgICAgIC8qIGlzIGhhbGYgb2YgdGhlIHRvdGFsIG51bWJlciBvZiBsdW1pbmFuY2UgYmxvY2tzIHBlciByb3cgaW4gYSAqLwotICAgICAgICAvKiBWT1AsIHdlIHVzZSAobXZ3aWR0aCA+PiAxKSB3aGVuIGNhbGN1bGF0aW5nIHRoZSByb3cgb2Zmc2V0LiAgKi8KLSAgICAgICAgcHBfcHJldjEgPSBwc3RwcmNUeXBQcnYgKyAoc2l6ZSA+PiA2KSArIG5tdnggKyBubXZ5ICogKG12d2lkdGggPj4gMSkgOwotCi0gICAgICAgIC8qIENoZWNrIGlmIE1WIGlzIGEgbXVsdGlwbGUgb2YgMTYgKi8KLSAgICAgICAgLyogIDEvNS8wMSwgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgZ28gb3V0IG9mIGJvdW5kICovCi0gICAgICAgIGlmICgoKGR5JjB4RikgIT0gMCkgJiYgKG1tdnkgKyAxIDwgKGhlaWdodCA+PiA0KSAtIDEpKQotICAgICAgICB7ICAgLyogZHkgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgKi8KLQotICAgICAgICAgICAgLyogcHBfcHJldjMgaXMgdGhlIGJsb2NrIGJlbG93IHBwX3ByZXYxIGJsb2NrICovCi0gICAgICAgICAgICBwcF9wcmV2MyA9IHBwX3ByZXYxICsgKG12d2lkdGggPj4gMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7ICAgLyogZHkgaXMgYSBtdWx0aXBsZSBvZiAxNiAqLwotICAgICAgICAgICAgcHBfcHJldjMgPSBwcF9wcmV2MTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qICAxLzUvMDEsIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGdvIG91dCBvZiBib3VuZCAqLwotICAgICAgICBpZiAoKChkeCYweEYpICE9IDApICYmIChtbXZ4ICsgMSA8IChtdndpZHRoID4+IDEpIC0gMSkpCi0gICAgICAgIHsgICAvKiBkeCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAqLwotCi0gICAgICAgICAgICAvKiBwcF9wcmV2MiBpcyB0aGUgYmxvY2sgdG8gdGhlIHJpZ2h0IG9mIHBwX3ByZXYxIGJsb2NrICovCi0gICAgICAgICAgICBwcF9wcmV2MiA9IHBwX3ByZXYxICsgMTsKLQotICAgICAgICAgICAgLyogcHBfcHJldjQgaXMgdGhlIGJsb2NrIHRvIHRoZSByaWdodCBvZiB0aGUgYmxvY2sgKi8KLSAgICAgICAgICAgIC8qIGJlbG93IHBwX3ByZXYxIGJsb2NrICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcF9wcmV2NCA9IHBwX3ByZXYzICsgMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsgICAvKiBkeCBpcyBhIG11bHRpcGxlIG9mIDE2ICovCi0KLSAgICAgICAgICAgIHBwX3ByZXYyID0gcHBfcHJldjE7Ci0gICAgICAgICAgICBwcF9wcmV2NCA9IHBwX3ByZXYzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQWR2YW5jZSBvZmZzZXQgdG8gbG9jYXRpb24gb2YgZmlyc3QgQ2hyb21pbmFuY2UgUiBzZW1hcGhvcmUgaW4gKi8KLSAgICAgICAgLyogcHN0cHJjVHlwUHJ2LiBTaW5jZSB0aGUgbnVtYmVyIG9mIHBpeGVscyBpbiBhIENocm9taW5hbmNlIFZPUCAgKi8KLSAgICAgICAgLyogaXMgKG51bWJlciBvZiBwaXhlbHMgaW4gTHVtaW5hbmNlIFZPUC80KSwgYW5kIHRoZXJlIGFyZSA2NCAgICAgKi8KLSAgICAgICAgLyogcGl4ZWxzIGluIGFuIDh4OCBDaHJvbWluYW5jZSBibG9jaywgdGhlIG9mZnNldCBjYW4gYmUgICAgICAqLwotICAgICAgICAvKiBjYWxjdWxhdGVkIGFzOiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgbXZfbG9jID0gKG51bWJlciBvZiBwaXhlbHMgaW4gTHVtaW5hbmNlIFZPUC8oNCo2NCkpICAgKi8KLSAgICAgICAgLyogICAgICAgICA9IHNpemUvMjU2ID0gc2l6ZT4+OCAgICAgICAgICAgICAgICovCi0gICAgICAgIG12X2xvYyA9IChzaXplID4+IDgpOwotCi0gICAgICAgIC8qICAxMS8zLzAwLCBjaGFuZ2UgdGhlIHByb3BhZ2F0aW9uIGZvciBkZWJsb2NraW5nICovCi0gICAgICAgIGlmIChtc2tfZGVibG9jayA9PSAwKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8qIERlYmxvY2tpbmcgc2VtYXBob3JlIHByb3BhZ2F0aW9uIGZvciBDaHJvbWluYW5jZSAqLwotICAgICAgICAgICAgLyogYiBzZW1hcGhvcmVzICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICoocHBfZGVjX3UpID0gMDsKLQotICAgICAgICAgICAgLyogQWR2YW5jZSBvZmZzZXQgdG8gcG9pbnQgdG8gQ2hyb21pbmFuY2UgciBzZW1hcGhvcmVzICovCi0gICAgICAgICAgICBwcF9kZWNfdSArPSBtdl9sb2M7Ci0KLSAgICAgICAgICAgIC8qIERlYmxvY2tpbmcgc2VtYXBob3JlIHByb3BhZ2F0aW9uIGZvciBDaHJvbWluYW5jZSAqLwotICAgICAgICAgICAgLyogciBzZW1hcGhvcmVzICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICoocHBfZGVjX3UpID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIERlcmluZ2luZyBzZW1hcGhvcmUgcHJvcGFnYXRpb24gZm9yIENocm9taW5hbmNlIEIgYmxvY2sgKi8KLSAgICAgICAgICAgIGlmICgoKihwcF9kZWNfdSkmNCkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqKHBwX2RlY191KSB8PSAoKCoocHBfcHJldjEpIHwgKihwcF9wcmV2MikgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwcF9wcmV2MykgfCAqKHBwX3ByZXY0KSkgJiAweDQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBBZHZhbmNlIG9mZnNldCB0byBwb2ludCB0byBDaHJvbWluYW5jZSByIHNlbWFwaG9yZXMgKi8KLSAgICAgICAgICAgIHBwX2RlY191ICs9IG12X2xvYzsKLSAgICAgICAgICAgIHBwX3ByZXYxICs9IG12X2xvYzsKLSAgICAgICAgICAgIHBwX3ByZXYyICs9IG12X2xvYzsKLSAgICAgICAgICAgIHBwX3ByZXYzICs9IG12X2xvYzsKLSAgICAgICAgICAgIHBwX3ByZXY0ICs9IG12X2xvYzsKLQotICAgICAgICAgICAgLyogRGVyaW5naW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiBmb3IgQ2hyb21pbmFuY2UgUiAqLwotICAgICAgICAgICAgaWYgKCgqKHBwX2RlY191KSY0KSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICoocHBfZGVjX3UpIHw9ICgoKihwcF9wcmV2MSkgfCAqKHBwX3ByZXYyKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHBwX3ByZXYzKSB8ICoocHBfcHJldjQpKSAmIDB4NCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHBfc2VtYXBob3JlX2x1bWEuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHBfc2VtYXBob3JlX2x1bWEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2ExZWJkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3BwX3NlbWFwaG9yZV9sdW1hLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKLQotIElucHV0czoKLSAgICB4cHJlZCA9IHgtYXhpcyBjb29yZGluYXRlIG9mIHRoZSBNQiB1c2VkIGZvciBwcmVkaWN0aW9uIChpbnQpCi0gICAgeXByZWQgPSB5LWF4aXMgY29vcmRpbmF0ZSBvZiB0aGUgTUIgdXNlZCBmb3IgcHJlZGljdGlvbiAoaW50KQotICAgIHBwX2RlY195ID0gcG9pbnRlciB0byB0aGUgcG9zdCBwcm9jZXNzaW5nIHNlbWFwaG9yZSBmb3IgY3VycmVudAotICAgICAgICAgICBsdW1pbmFuY2UgZnJhbWUgKHVpbnQ4KQotICAgIHBzdHByY1R5cFBydiA9IHBvaW50ZXIgdGhlIHByZXZpb3VzIGZyYW1lJ3MgcG9zdCBwcm9jZXNzaW5nIHR5cGUKLSAgICAgICAgICAgICAgICAgICAodWludDgpCi0gICAgbGwgPSBwb2ludGVyIHRvIHRoZSBidWZmZXIgKGludCkKLSAgICBtdl9sb2MgPSBmbGFnIGluZGljYXRpbmcgbG9jYXRpb24gb2YgdGhlIG1vdGlvbiBjb21wZW5zYXRlZAotICAgICAgICAgKHgseSkgcG9zaXRpb24gd2l0aCByZXNwZWN0IHRvIHRoZSBsdW1pbmFuY2UgTUIgKGludCk7Ci0gICAgICAgICAwIC0+IGluc2lkZSBNQiwgMSAtPiBvdXRzaWRlIE1CCi0gICAgZHggPSBob3Jpem9udGFsIGNvbXBvbmVudCBvZiB0aGUgbW90aW9uIHZlY3RvciAoaW50KQotICAgIGR5ID0gdmVydGljYWwgY29tcG9uZW50IG9mIHRoZSBtb3Rpb24gdmVjdG9yIChpbnQpCi0gICAgbXZ3aWR0aCA9IG51bWJlciBvZiBibG9ja3MgcGVyIHJvdyAoaW50KQotICAgIHdpZHRoID0gbHVtaW5hbmNlIFZPUCB3aWR0aCBpbiBwaXhlbHMgKGludCkKLSAgICBoZWlnaHQgPSBsdW1pbmFuY2UgVk9QIGhlaWdodCBpbiBwaXhlbHMgKGludCkKLQotIExvY2FsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICBOb25lCi0KLSBHbG9iYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIE5vbmUKLQotIE91dHB1dHM6Ci0gICAgbXNrX2RlYmxvY2sgPSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgZGVibG9ja2luZyBpcyB0byBiZQotICAgICAgICAgICAgICBwZXJmb3JtZWQgKG1za19kZWJsb2NrID0gMCkgb3Igbm90IChtc2tfZGVibG9jayA9Ci0gICAgICAgICAgICAgIDEpICh1aW50OCkKLQotIFBvaW50ZXJzIGFuZCBCdWZmZXJzIE1vZGlmaWVkOgotICAgIHBwX2RlY195IGNvbnRlbnRzIGFyZSB0aGUgdXBkYXRlZCBzZW1hcG9ob3JlIHByb3BhZ2F0aW9uIGRhdGEKLQotIExvY2FsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBOb25lCi0KLSBHbG9iYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRlVOQ1RJT04gREVTQ1JJUFRJT04KLQotIFRoaXMgZnVuY3Rpb25zIHBlcmZvcm1zIHBvc3QgcHJvY2Vzc2luZyBzZW1hcGhvcmUgcHJvcGFnYXRpb24gcHJvY2Vzc2luZwotIGFmdGVyIGx1bWluYW5jZSBwcmVkaWN0aW9uLgotCi0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJTkNMVURFUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAgICAibXA0ZGVjX2FwaS5oIgotI2luY2x1ZGUgICAgIm1wNGRlZi5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTUFDUk9TCi07IERlZmluZSBtb2R1bGUgc3BlY2lmaWMgbWFjcm9zIGhlcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgREVGSU5FUwotOyBJbmNsdWRlIGFsbCBwcmUtcHJvY2Vzc29yIHN0YXRlbWVudHMgaGVyZS4gSW5jbHVkZSBjb25kaXRpb25hbAotOyBjb21waWxlIHZhcmlhYmxlcyBhbHNvLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBGVU5DVElPTiBERUZJTklUSU9OUwotOyBGdW5jdGlvbiBQcm90b3R5cGUgZGVjbGFyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgREVGSU5JVElPTlMKLTsgVmFyaWFibGUgZGVjbGFyYXRpb24gLSBkZWZpbmVkIGhlcmUgYW5kIHVzZWQgb3V0c2lkZSB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBGVU5DVElPTiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgZnVuY3Rpb25zIGRlZmluZWQgZWxzZXdoZXJlIGFuZCByZWZlcmVuY2VkIGluIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEdMT0JBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IEZVTkNUSU9OIENPREUKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICB1aW50OCBwcF9zZW1hcGhvcmVfbHVtYSgKLSAgICAgICAgaW50IHhwcmVkLCAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IHlwcmVkLCAgICAgIC8qIGkgKi8KLSAgICAgICAgdWludDggICAqcHBfZGVjX3ksICAvKiBpL28gKi8KLSAgICAgICAgdWludDggICAqcHN0cHJjVHlwUHJ2LCAgLyogaSAqLwotICAgICAgICBpbnQgKmxsLCAgICAgICAgLyogaSAqLwotICAgICAgICBpbnQgKm12X2xvYywgICAgLyogaS9vICovCi0gICAgICAgIGludCBkeCwgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IGR5LCAgICAgLyogaSAqLwotICAgICAgICBpbnQgbXZ3aWR0aCwgICAgLyogaSAqLwotICAgICAgICBpbnQgd2lkdGgsICAgICAgLyogaSAqLwotICAgICAgICBpbnQgaGVpZ2h0ICAgICAgLyogaSAqLwotICAgICkKLSAgICB7Ci0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCi0gICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICBpbnQga2ssIG1tdnksIG1tdngsIG5tdngsIG5tdnk7Ci0gICAgICAgIHVpbnQ4ICAgKnBwX3ByZXYxLCAqcHBfcHJldjIsICpwcF9wcmV2MywgKnBwX3ByZXY0OwotICAgICAgICB1aW50OCAgIG1za19kZWJsb2NrID0gMDsgICAgICAgIC8qICAxMS8zLzAwICovCi0KLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICAvKiBJbnRlcmZyYW1lIFByb2Nlc3NpbmcgLSAxIE1WIHBlciBNQiAqLwotCi0gICAgICAgIC8qIGNoZWNrIHdoZXRoZXIgdGhlIE1WIHBvaW50cyBvdXRzaWRlIHRoZSBmcmFtZSAqLwotICAgICAgICBpZiAoeHByZWQgPj0gMCAmJiB4cHJlZCA8PSAoKHdpZHRoIDw8IDEpIC0gKDIqTUJfU0laRSkpICYmIHlwcmVkID49IDAgJiYKLSAgICAgICAgICAgICAgICB5cHJlZCA8PSAoKGhlaWdodCA8PCAxKSAtICgyKk1CX1NJWkUpKSkKLSAgICAgICAgeyAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qICh4LHkpIGlzIGluc2lkZSB0aGUgZnJhbWUgKi8KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICAgICAgICAgLyogIDEwLzI0LzIwMDAgcG9zdF9wcm9jZXNzaW5nIHNlbWFwaG9yZSAqLwotICAgICAgICAgICAgLyogZ2VuZXJhdGlvbiAqLwotCi0gICAgICAgICAgICAvKiAgMTAvMjMvMjAwMCBubyBib3VuZGFyeSBjaGVja2luZyovCi0gICAgICAgICAgICAqbXZfbG9jID0gMDsKLQotICAgICAgICAgICAgLyogQ2FsY3VsYXRlIGJsb2NrIHggY29vcmRpbmF0ZS4gRGl2aWRlIGJ5IDE2IGlzIGZvciAgKi8KLSAgICAgICAgICAgIC8qIGNvbnZlcnRpbmcgaGFsZi1waXhlbCByZXNvbHV0aW9uIHRvIGJsb2NrICAgICAgICAgICovCi0gICAgICAgICAgICBtbXZ4ID0geHByZWQgPj4gNDsKLQotICAgICAgICAgICAgLyogQ2FsY3VsYXRlIGJsb2NrIHkgY29vcmRpbmF0ZS4gRGl2aWRlIGJ5IDE2IGlzIGZvciAqLwotICAgICAgICAgICAgLyogY29udmVydGluZyBoYWxmLXBpeGVsIHJlc29sdXRpb24gdG8gYmxvY2sgICAgICAgICAqLwotICAgICAgICAgICAgbW12eSA9IHlwcmVkID4+IDQ7Ci0KLSAgICAgICAgICAgIC8qIEZpbmQgcG9zdCBwcm9jZXNzaW5nIHNlbWFwaG9yZSBsb2NhdGlvbiBmb3IgYmxvY2sgKi8KLSAgICAgICAgICAgIC8qIHVzZWQgZm9yIHByZWRpY3Rpb24sIGkuZS4sICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAvKiBwcF9wcmV2MSA9ICZwc3RwcmNUeXBQcnZbbW12eSptdndpZHRoXVttbXZ4XSAgICAgICovCi0gICAgICAgICAgICBwcF9wcmV2MSA9IHBzdHByY1R5cFBydiArIG1tdnggKyBtbXZ5ICogbXZ3aWR0aDsKLQotICAgICAgICAgICAgLyogQ2hlY2sgaWYgTVYgaXMgYSBtdWx0aXBsZSBvZiAxNiAqLwotICAgICAgICAgICAgaWYgKChkeCYweEYpICE9IDApCi0gICAgICAgICAgICB7ICAgLyogZHggaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgKi8KLQotICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYyIGlzIHRoZSBibG9jayB0byB0aGUgcmlnaHQgb2YgKi8KLSAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MSBibG9jayAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcHBfcHJldjIgPSBwcF9wcmV2MSArIDE7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKGR5JjB4RikgIT0gMCkKLSAgICAgICAgICAgICAgICB7ICAgLyogZHkgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgKi8KLQotICAgICAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MyBpcyB0aGUgYmxvY2sgYmVsb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogcHBfcHJldjEgYmxvY2sgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcHBfcHJldjMgPSBwcF9wcmV2MSArIG12d2lkdGg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7ICAgLyogZHkgaXMgYSBtdWx0aXBsZSBvZiAxNiAqLwotCi0gICAgICAgICAgICAgICAgICAgIHBwX3ByZXYzID0gcHBfcHJldjE7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogcHBfcHJldjQgaXMgdGhlIGJsb2NrIHRvIHRoZSByaWdodCBvZiAqLwotICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYzIGJsb2NrLiAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwcF9wcmV2NCA9IHBwX3ByZXYzICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsgICAvKiBkeCBpcyBhIG11bHRpcGxlIG9mIDE2ICovCi0KLSAgICAgICAgICAgICAgICBwcF9wcmV2MiA9IHBwX3ByZXYxOwotCi0gICAgICAgICAgICAgICAgaWYgKChkeSYweEYpICE9IDApCi0gICAgICAgICAgICAgICAgeyAgIC8qIGR5IGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2ICovCi0KLSAgICAgICAgICAgICAgICAgICAgLyogcHBfcHJldjMgaXMgdGhlIGJsb2NrIGJlbG93ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYxIGJsb2NrLiAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHBwX3ByZXYzID0gcHBfcHJldjEgKyBtdndpZHRoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgeyAgIC8qIGR5IGlzIGEgbXVsdGlwbGUgb2YgMTYgKi8KLQotICAgICAgICAgICAgICAgICAgICBwcF9wcmV2MyA9IHBwX3ByZXYxOwotICAgICAgICAgICAgICAgICAgICBtc2tfZGVibG9jayA9IDB4MzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcF9wcmV2NCA9IHBwX3ByZXYzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBQZXJmb3JtIHBvc3QgcHJvY2Vzc2luZyBzZW1hcGhvcmUgcHJvcGFnYXRpb24gZm9yIGVhY2ggKi8KLSAgICAgICAgICAgIC8qIG9mIHRoZSA0IGJsb2NrcyBpbiBhIE1CLiAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBmb3IgKGtrID0gMDsga2sgPCA0OyBraysrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIERlcmluZ2luZyBzZW1hcGhvcmUgcHJvcGFnYXRpb24gKi8KLSAgICAgICAgICAgICAgICBpZiAoKCoocHBfZGVjX3kpICYgNCkgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICoocHBfZGVjX3kpIHw9ICgoKihwcF9wcmV2MSkgfCAqKHBwX3ByZXYyKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwcF9wcmV2MykgfCAqKHBwX3ByZXY0KSkgJiAweDQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBEZWJsb2NraW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiAqLwotICAgICAgICAgICAgICAgIC8qICAxMS8zLzAwLCBjaGFuZ2UgdGhlIHByb3BhZ2F0aW9uIGZvciBkZWJsb2NraW5nICovCi0gICAgICAgICAgICAgICAgaWYgKG1za19kZWJsb2NrID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqKHBwX2RlY195KSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHBfZGVjX3kgKz0gbGxba2tdOwotICAgICAgICAgICAgICAgIHBwX3ByZXYxICs9IGxsW2trXTsKLSAgICAgICAgICAgICAgICBwcF9wcmV2MiArPSBsbFtra107Ci0gICAgICAgICAgICAgICAgcHBfcHJldjMgKz0gbGxba2tdOwotICAgICAgICAgICAgICAgIHBwX3ByZXY0ICs9IGxsW2trXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeyAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKiAoeCx5KSBpcyBvdXRzaWRlIHRoZSBmcmFtZSAqLwotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICAgICAgICAgLyogIDEwLzI0LzIwMDAgcG9zdF9wcm9jZXNzaW5nIHNlbWFwaG9yZSAqLwotICAgICAgICAgICAgLyogZ2VuZXJhdGlvbiAqLwotCi0gICAgICAgICAgICAvKiAgMTAvMjMvMjAwMCBib3VuZGFyeSBjaGVja2luZyovCi0gICAgICAgICAgICAqbXZfbG9jID0gMTsKLQotICAgICAgICAgICAgLyogUGVyZm9ybSBwb3N0IHByb2Nlc3Npbmcgc2VtYXBob3JlIHByb3BhZ2F0aW9uIGZvciBlYWNoICovCi0gICAgICAgICAgICAvKiBvZiB0aGUgNCBibG9ja3MgaW4gYSBNQi4gICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgZm9yIChrayA9IDA7IGtrIDwgNDsga2srKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBDYWxjdWxhdGUgYmxvY2sgeCBjb29yZGluYXRlIGFuZCByb3VuZCAoPykuICAqLwotICAgICAgICAgICAgICAgIC8qIERpdmlkZSBieSAxNiBpcyBmb3IgY29udmVydGluZyBoYWxmLXBpeGVsICAgICovCi0gICAgICAgICAgICAgICAgLyogcmVzb2x1dGlvbiB0byBibG9jay4gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBtbXZ4ID0gKHhwcmVkICsgKChrayAmIDEpIDw8IDMpKSA+PiA0OwotICAgICAgICAgICAgICAgIG5tdnggPSBtbXZ4OwotCi0gICAgICAgICAgICAgICAgLyogQ2FsY3VsYXRlIGJsb2NrIHkgY29vcmRpbmF0ZSBhbmQgcm91bmQgKD8pLiAgKi8KLSAgICAgICAgICAgICAgICAvKiBEaXZpZGUgYnkgMTYgaXMgZm9yIGNvbnZlcnRpbmcgaGFsZi1waXhlbCAgICAqLwotICAgICAgICAgICAgICAgIC8qIHJlc29sdXRpb24gdG8gYmxvY2suICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgbW12eSA9ICh5cHJlZCArICgoa2sgJiAyKSA8PCAyKSkgPj4gNDsKLSAgICAgICAgICAgICAgICBubXZ5ID0gbW12eTsKLQotICAgICAgICAgICAgICAgIC8qIFBlcmZvcm0gYm91bmRhcnkgY2hlY2tpbmcgKi8KLSAgICAgICAgICAgICAgICBpZiAobm12eCA8IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBubXZ4ID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAobm12eCA+IG12d2lkdGggLSAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbm12eCA9IG12d2lkdGggLSAxOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChubXZ5IDwgMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5tdnkgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChubXZ5ID4gKGhlaWdodCA+PiAzKSAtIDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBubXZ5ID0gKGhlaWdodCA+PiAzKSAtIDE7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogRmluZCBwb3N0IHByb2Nlc3Npbmcgc2VtYXBob3JlIGxvY2F0aW9uIGZvciBibG9jayAqLwotICAgICAgICAgICAgICAgIC8qIHVzZWQgZm9yIHByZWRpY3Rpb24sIGkuZS4sICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgLyogcHBfcHJldjEgPSAmcHN0cHJjVHlwUHJ2W25tdnkqbXZ3aWR0aF1bbm12eF0gICAgICAqLwotICAgICAgICAgICAgICAgIHBwX3ByZXYxID0gcHN0cHJjVHlwUHJ2ICsgbm12eCArIG5tdnkgKiBtdndpZHRoOwotCi0gICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgeCBjb21wb25lbnQgb2YgTVYgaXMgYSBtdWx0aXBsZSBvZiAxNiAgICAqLwotICAgICAgICAgICAgICAgIC8qIGFuZCBjaGVjayBpZiBibG9jayB4IGNvb3JkaW5hdGUgaXMgb3V0IG9mIGJvdW5kcyAgKi8KLSAgICAgICAgICAgICAgICBpZiAoKChkeCYweEYpICE9IDApICYmIChtbXZ4ICsgMSA8IG12d2lkdGggLSAxKSkKLSAgICAgICAgICAgICAgICB7ICAgLyogZHggaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgYW5kIHRoZSBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAvKiB4IGNvb3JkaW5hdGUgaXMgd2l0aGluIHRoZSBib3VuZHMgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgLyogcHBfcHJldjIgaXMgdGhlIGJsb2NrIHRvIHRoZSByaWdodCBvZiAqLwotICAgICAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MSBibG9jayAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHBwX3ByZXYyID0gcHBfcHJldjEgKyAxOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHkgY29tcG9uZW50IG9mIE1WIGlzIGEgbXVsdGlwbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogb2YgMTYgYW5kIGNoZWNrIGlmIGJsb2NrIHkgY29vcmRpbmF0ZSBpcyAqLwotICAgICAgICAgICAgICAgICAgICAvKiBvdXQgb2YgYm91bmRzICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGlmICgoKGR5JjB4RikgIT0gMCkgJiYgKG1tdnkgKyAxIDwgKGhlaWdodCA+PiAzKSAtIDEpKQotICAgICAgICAgICAgICAgICAgICB7ICAgLyogZHkgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgYmxvY2sgeSBjb29yZGluYXRlIGlzICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdpdGhpbiB0aGUgYm91bmRzICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MyBpcyB0aGUgYmxvY2sgYmVsb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYxIGJsb2NrICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwcF9wcmV2MyA9IHBwX3ByZXYxICsgbXZ3aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxsIHByZWRpY3Rpb24gYXJlIGZyb20gZGlmZmVyZW50IGJsb2NrcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbXNrX2RlYmxvY2sgPSAweDM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7ICAgLyogZHkgaXMgYSBtdWx0aXBsZSBvZiAxNiBvciB0aGUgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHkgY29vcmRpbmF0ZSBpcyBvdXQgb2YgYm91bmRzICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBwX3ByZXYzID0gcHBfcHJldjE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiBwcF9wcmV2NCBpcyB0aGUgYmxvY2sgdG8gdGhlIHJpZ2h0IG9mICovCi0gICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYzIGJsb2NrLiAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcHBfcHJldjQgPSBwcF9wcmV2MyArIDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7ICAgLyogZHggaXMgYSBtdWx0aXBsZSBvZiAxNiBvciB0aGUgYmxvY2sgeCAqLwotICAgICAgICAgICAgICAgICAgICAvKiBjb29yZGluYXRlIGlzIG91dCBvZiBib3VuZHMgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgcHBfcHJldjIgPSBwcF9wcmV2MTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB5IGNvbXBvbmVudCBvZiBNViBpcyBhIG11bHRpcGxlICovCi0gICAgICAgICAgICAgICAgICAgIC8qIG9mIDE2IGFuZCBjaGVjayBpZiBibG9jayB5IGNvb3JkaW5hdGUgaXMgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogb3V0IG9mIGJvdW5kcyAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoKChkeSYweEYpICE9IDApICYmIChtbXZ5ICsgMSA8IChoZWlnaHQgPj4gMykgLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgeyAgIC8qIGR5IGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IGFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIGJsb2NrIHkgY29vcmRpbmF0ZSBpcyAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3aXRoaW4gdGhlIGJvdW5kcyAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogcHBfcHJldjMgaXMgdGhlIGJsb2NrIGJlbG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MSBibG9jay4gICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHBfcHJldjMgPSBwcF9wcmV2MSArIG12d2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7ICAgLyogZHkgaXMgYSBtdWx0aXBsZSBvZiAxNiBvciB0aGUgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHkgY29vcmRpbmF0ZSBpcyBvdXQgb2YgYm91bmRzICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBwX3ByZXYzID0gcHBfcHJldjE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwcF9wcmV2NCA9IHBwX3ByZXYzOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIERlcmluZ2luZyBzZW1hcGhvcmUgcHJvcGFnYXRpb24gKi8KLSAgICAgICAgICAgICAgICBpZiAoKCoocHBfZGVjX3kpJjQpID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqKHBwX2RlY195KSB8PSAoKCoocHBfcHJldjEpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHBwX3ByZXYyKSB8ICoocHBfcHJldjMpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHBwX3ByZXY0KSkgJiAweDQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBEZWJsb2NraW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiAqLwotICAgICAgICAgICAgICAgIC8qICAxMS8zLzAwLCBjaGFuZ2UgdGhlIHByb3BhZ2E9ICovCi0gICAgICAgICAgICAgICAgLyogdGlvbiBmb3IgZGVibG9ja2luZyAqLwotICAgICAgICAgICAgICAgIGlmIChtc2tfZGVibG9jayA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKihwcF9kZWNfeSkgPSAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBwX2RlY195ICs9IGxsW2trXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7IFJldHVybiBub3RoaW5nIG9yIGRhdGEgb3IgZGF0YSBwb2ludGVyCi0gICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICByZXR1cm4gKG1za19kZWJsb2NrKTsKLSAgICB9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQuYnAKaW5kZXggYjhiYzI0ZS4uZDEwZTQwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5icApAQCAtMSw1OSArMSwyMCBAQAotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIGFwZXhfYXZhaWxhYmxlOiBbCi0gICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKLSAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAotICAgIF0sCi0gICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAotCi0gICAgc3JjczogWwotICAgICAgICAic3JjL2JpdHN0cmVhbV9pby5jcHAiLAotICAgICAgICAic3JjL2NvbWJpbmVkX2VuY29kZS5jcHAiLCAic3JjL2RhdGFwYXJ0X2VuY29kZS5jcHAiLAotICAgICAgICAic3JjL2RjdC5jcHAiLAotICAgICAgICAic3JjL2ZpbmRoYWxmcGVsLmNwcCIsCi0gICAgICAgICJzcmMvZmFzdGNvZGVtYi5jcHAiLAotICAgICAgICAic3JjL2Zhc3RpZGN0LmNwcCIsCi0gICAgICAgICJzcmMvZmFzdHF1YW50LmNwcCIsCi0gICAgICAgICJzcmMvbWVfdXRpbHMuY3BwIiwKLSAgICAgICAgInNyYy9tcDRlbmNfYXBpLmNwcCIsCi0gICAgICAgICJzcmMvcmF0ZV9jb250cm9sLmNwcCIsCi0gICAgICAgICJzcmMvbW90aW9uX2VzdC5jcHAiLAotICAgICAgICAic3JjL21vdGlvbl9jb21wLmNwcCIsCi0gICAgICAgICJzcmMvc2FkLmNwcCIsCi0gICAgICAgICJzcmMvc2FkX2hhbGZwZWwuY3BwIiwKLSAgICAgICAgInNyYy92bGNfZW5jb2RlLmNwcCIsCi0gICAgICAgICJzcmMvdm9wLmNwcCIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLURCWF9SQyIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAotCi0gICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCi0KLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgXSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgIH0sCi19Ci0KIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9tcGVnNGVuYyIsCiAgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWyJTb2Z0TVBFRzRFbmNvZGVyLmNwcCJdLAogCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAotCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItREJYX1JDIiwKICAgICBdLApAQCAtNjcsMjkgKzI4LDMgQEAKICAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCiB9Ci0KLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1jY190ZXN0IHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuY190ZXN0IiwKLSAgICBndGVzdDogZmFsc2UsCi0KLSAgICBzcmNzOiBbInRlc3QvbTR2X2gyNjNfZW5jX3Rlc3QuY3BwIl0sCi0KLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1EQlhfUkMiLAotICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgXSwKLQotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICBdLAotICAgICAgICBjZmk6IHRydWUsCi0gICAgfSwKLQotICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X200dmgyNjNlbmMiXSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCmluZGV4IGZhN2RiODEuLmZiNmM0ZTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcApAQCAtNTI4LDYgKzUyOCw3IEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBhbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCiAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icAppbmRleCA5NjEwNmYxLi5iNjY5Yzg0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwCkBAIC0xLDkzICsxLDE5IEBACi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wM2RlYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCiAKLSAgICBzcmNzOiBbCi0gICAgICAgICJzcmMvcHZtcDNfbm9ybWFsaXplLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfYWxpYXNfcmVkdWN0aW9uLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfY3JjLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfZGVjb2RlX2hlYWRlci5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX2RlY29kZV9odWZmX2N3LmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfZ2V0Yml0cy5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX2RlcXVhbnRpemVfc2FtcGxlLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfZnJhbWVkZWNvZGVyLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfZ2V0X21haW5fZGF0YV9zaXplLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfZ2V0X3NpZGVfaW5mby5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX2dldF9zY2FsZV9mYWN0b3JzLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2RhdGEuY3BwIiwKLSAgICAgICAgInNyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZmFjdG9ycy5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX21wZWcyX3N0ZXJlb19wcm9jLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfaHVmZm1hbl9kZWNvZGluZy5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX2h1ZmZtYW5fcGFyc2luZy5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX3RhYmxlcy5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX2ltZGN0X3N5bnRoLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfbWRjdF82LmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfZGN0XzYuY3BwIiwKLSAgICAgICAgInNyYy9wdm1wM19wb2x5X3BoYXNlX3N5bnRoZXNpcy5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX2VxdWFsaXplci5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX3NlZWtfc3luY2guY3BwIiwKLSAgICAgICAgInNyYy9wdm1wM19zdGVyZW9fcHJvYy5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX3Jlb3JkZXIuY3BwIiwKLQotICAgICAgICAic3JjL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93LmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfbWRjdF8xOC5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX2RjdF85LmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfZGN0XzE2LmNwcCIsCi0gICAgXSwKLQotICAgIGFyY2g6IHsKLSAgICAgICAgYXJtOiB7Ci0gICAgICAgICAgICBleGNsdWRlX3NyY3M6IFsKLSAgICAgICAgICAgICAgICAic3JjL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93LmNwcCIsCi0gICAgICAgICAgICAgICAgInNyYy9wdm1wM19tZGN0XzE4LmNwcCIsCi0gICAgICAgICAgICAgICAgInNyYy9wdm1wM19kY3RfOS5jcHAiLAotICAgICAgICAgICAgICAgICJzcmMvcHZtcDNfZGN0XzE2LmNwcCIsCi0gICAgICAgICAgICBdLAotICAgICAgICAgICAgc3JjczogWwotICAgICAgICAgICAgICAgICJzcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2djYy5zIiwKLSAgICAgICAgICAgICAgICAic3JjL2FzbS9wdm1wM19tZGN0XzE4X2djYy5zIiwKLSAgICAgICAgICAgICAgICAic3JjL2FzbS9wdm1wM19kY3RfOV9nY2MucyIsCi0gICAgICAgICAgICAgICAgInNyYy9hc20vcHZtcDNfZGN0XzE2X2djYy5zIiwKLSAgICAgICAgICAgIF0sCi0KLSAgICAgICAgICAgIGluc3RydWN0aW9uX3NldDogImFybSIsCi0gICAgICAgIH0sCi0gICAgfSwKLQotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICBdLAotICAgICAgICBjZmk6IHRydWUsCi0gICAgfSwKLQotICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiXSwKLQotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImluY2x1ZGUiLAotICAgICAgICAic3JjIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItRE9TQ0xfVU5VU0VEX0FSRyh4KT0odm9pZCkoeCkiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgXSwKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiXSwKIH0KIAotLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9tcDNkZWMiLAogICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiU29mdE1QMy5jcHAiXSwKIAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWwotICAgICAgICAic3JjIiwKLSAgICAgICAgImluY2x1ZGUiLAotICAgIF0sCi0KICAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAogICAgIHNhbml0aXplOiB7CkBAIC05OSwzNSArMjUsMyBAQAogCiAgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbXAzZGVjIl0sCiB9Ci0KLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotY2NfdGVzdCB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wM2RlY190ZXN0IiwKLSAgICBndGVzdDogZmFsc2UsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJ0ZXN0L21wM2RlY190ZXN0LmNwcCIsCi0gICAgICAgICJ0ZXN0L21wM3JlYWRlci5jcHAiLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAotCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzcmMiLAotICAgICAgICAiaW5jbHVkZSIsCi0gICAgXSwKLQotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICBdLAotICAgICAgICBjZmk6IHRydWUsCi0gICAgfSwKLQotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9tcDNkZWMiLAotICAgICAgICAibGlic25kZmlsZSIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbImxpYmF1ZGlvdXRpbHMiXSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCmluZGV4IGI1ZDMyZWQuLjA3YmI0NWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcApAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAKLSNpbmNsdWRlICJpbmNsdWRlL3B2bXAzZGVjb2Rlcl9hcGkuaCIKKyNpbmNsdWRlIDxwdm1wM2RlY29kZXJfYXBpLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDk4LDYgKzQ5OCw3IEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBhbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCiAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL0FuZHJvaWQuYnAKaW5kZXggZTg0OTQxMC4uYWJkMTM3OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzJkZWMiLAogICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9Tb2Z0TVBFRzIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5jcHAKaW5kZXggOWQ1ZjM0Mi4uOWY4MDAxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5jcHAKQEAgLTg2NCw2ICs4NjQsNyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLCBPTVhfUFRSIGFwcERhdGEsCiAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5icAppbmRleCA4MmJiOGQxLi5iYTZkYzJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2NvZGVjc19vbjJfZGVjX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2NvZGVjc19vbjJfZGVjX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF92cHhkZWMiLAogICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKaW5kZXggMGYyZmYxNy4uYmZmYzIzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKQEAgLTM1NSw2ICszNTUsNyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5icAppbmRleCA3MDVlNTU0Li5lODVmZjk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2NvZGVjc19vbjJfZW5jX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2NvZGVjc19vbjJfZW5jX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF92cHhlbmMiLAogICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcAppbmRleCBkMGNiMDcxLi5lOWI0MzQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCkBAIC03NzUsNiArNzc1LDcgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvQW5kcm9pZC5icAppbmRleCA3MWEyYTBkLi4zZDhhZjY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9vcHVzZGVjIiwKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcAppbmRleCA0ZjYxYWE4Li5kY2Q4ZGRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKQEAgLTU4LDYgKzU4LDggQEAKICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50KDApLAogICAgICAgbURlY29kZXIoTlVMTCksCiAgICAgICBtSGVhZGVyKE5VTEwpLAorICAgICAgbU51bUNoYW5uZWxzKDEpLAorICAgICAgbVNhbXBsaW5nUmF0ZShrUmF0ZSksCiAgICAgICBtQ29kZWNEZWxheSgwKSwKICAgICAgIG1TZWVrUHJlUm9sbCgwKSwKICAgICAgIG1BbmNob3JUaW1lVXMoMCksCkBAIC0xNjksMTEgKzE3MSwxMSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBvcHVzUGFyYW1zLT5uQXVkaW9CYW5kV2lkdGggPSAwOwotICAgICAgICAgICAgb3B1c1BhcmFtcy0+blNhbXBsZVJhdGUgPSBrUmF0ZTsKKyAgICAgICAgICAgIG9wdXNQYXJhbXMtPm5TYW1wbGVSYXRlID0gbVNhbXBsaW5nUmF0ZTsKICAgICAgICAgICAgIG9wdXNQYXJhbXMtPm5CaXRSYXRlID0gMDsKIAogICAgICAgICAgICAgaWYgKCFpc0NvbmZpZ3VyZWQoKSkgewotICAgICAgICAgICAgICAgIG9wdXNQYXJhbXMtPm5DaGFubmVscyA9IDE7CisgICAgICAgICAgICAgICAgb3B1c1BhcmFtcy0+bkNoYW5uZWxzID0gbU51bUNoYW5uZWxzOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBvcHVzUGFyYW1zLT5uQ2hhbm5lbHMgPSBtSGVhZGVyLT5jaGFubmVsczsKICAgICAgICAgICAgIH0KQEAgLTI3NCw3ICsyNzYsOCBAQAogICAgICAgICAgICAgaWYgKG9wdXNQYXJhbXMtPm5Qb3J0SW5kZXggIT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgIG1OdW1DaGFubmVscyA9IG9wdXNQYXJhbXMtPm5DaGFubmVsczsKKyAgICAgICAgICAgIG1TYW1wbGluZ1JhdGUgPSBvcHVzUGFyYW1zLT5uU2FtcGxlUmF0ZTsKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKQEAgLTQ5Niw2ICs0OTksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+KGluSGVhZGVyLT5wQnVmZmVyICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bk9mZnNldCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmF0ZSk7CisgICAgICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IGtSYXRlOworICAgICAgICAgICAgICAgIG1OdW1DaGFubmVscyA9IG1IZWFkZXItPmNoYW5uZWxzOwogICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKICAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CiAgICAgICAgICAgICB9CkBAIC02NjEsNiArNjY2LDcgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuaAppbmRleCA5MWNhZmExLi4wMDA1OGM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuaApAQCAtNzAsNiArNzAsOCBAQAogICAgIE9wdXNNU0RlY29kZXIgKm1EZWNvZGVyOwogICAgIE9wdXNIZWFkZXIgKm1IZWFkZXI7CiAKKyAgICBpbnQzMl90IG1OdW1DaGFubmVsczsKKyAgICBpbnQzMl90IG1TYW1wbGluZ1JhdGU7CiAgICAgaW50NjRfdCBtQ29kZWNEZWxheTsKICAgICBpbnQ2NF90IG1TZWVrUHJlUm9sbDsKICAgICBpbnQ2NF90IG1TYW1wbGVzVG9EaXNjYXJkOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLmJwCmluZGV4IGZjYzdhMGEuLjM2NzM3ODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2NvZGVjc19yYXdfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfY29kZWNzX3Jhd19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfcmF3ZGVjIiwKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmNwcAppbmRleCAwZTMxODA0Li44MmRkMTcxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5jcHAKQEAgLTI3Myw2ICsyNzMsNyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5icAppbmRleCAzZWZiOTUyLi43NzY0Mjk0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2NvZGVjc192b3JiaXNfZGVjX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2NvZGVjc192b3JiaXNfZGVjX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF92b3JiaXNkZWMiLAogICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKaW5kZXggMDhlMjBjYy4uM2RhZWQxMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKQEAgLTYzNiw2ICs2MzYsNyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvQW5kcm9pZC5icAppbmRleCA1Mzg1ZGJjLi4xZDAzYzE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfeGFhY2RlYyIsCiAgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLApAQCAtMTQsNiArMjMsOSBAQAogICAgICAgICAvLyBpbnRlZ2VyX292ZXJmbG93OiB0cnVlLAogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWyAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLCAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgY29uZmlnOiB7CisgICAgICAgICAgICBjZmlfYXNzZW1ibHlfc3VwcG9ydDogdHJ1ZSwKKyAgICAgICAgfSwKICAgICB9LAogCiAgICAgc3RhdGljX2xpYnM6IFsibGlieGFhY2RlYyJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuY3BwCmluZGV4IDg3ZThmZDQuLmE0Nzg2NDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5jcHAKQEAgLTE2OTMsNiArMTY5Myw3IEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBhbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50KiBjcmVhdGVTb2Z0T01YQ29tcG9uZW50KGNvbnN0IGNoYXIqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUqIGNhbGxiYWNrcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSoqIGNvbXBvbmVudCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5icAppbmRleCA2YjA4YjA4Li4wNmNlYmQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5icApAQCAtMSwzICsxLDIyIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfY29sb3Jjb252ZXJzaW9uX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2NvbG9yY29udmVyc2lvbl9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2NvbG9yX2NvbnZlcnNpb24iLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL0FuZHJvaWQuYnAKaW5kZXggNjE2YjRiMy4uNmRhMmNjYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIl0sCit9CisKIHByZWJ1aWx0X2V0YyB7CiAgICAgbmFtZTogIm1lZGlhc3djb2RlYy54bWwiLAogICAgIHNyYzogIm1lZGlhX2NvZGVjc19zdy54bWwiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3Nfc3cueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3Nfc3cueG1sCmluZGV4IDY1NzExNjIuLmRkMmVlZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX3N3LnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19zdy54bWwKQEAgLTI5NSwxMiArMjk1LDEyIEBACiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iVkJSLENCUiIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmhldmMuZW5jb2RlciIgdHlwZT0idmlkZW8vaGV2YyIgdmFyaWFudD0iIXNsb3ctY3B1Ij4KLSAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTWFpblRpZXJMZXZlbDMgLS0+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iOTYweDU0NCIgLz4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTWFpblRpZXJMZXZlbDUxIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjUxMng1MTIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSI4eDgiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTgxNjAiIC8+IDwhLS0gbWF4IDk2MHg1NDQgLS0+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTI0NDg4MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtNDA5NiIgLz4gPCEtLSBtYXggNTEyeDUxMiAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTIyODgwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImZyYW1lLXJhdGUiIHJhbmdlPSIxLTEyMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjb21wbGV4aXR5IiByYW5nZT0iMC0xMCIgIGRlZmF1bHQ9IjAiIC8+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0FuZHJvaWQuYnAKaW5kZXggODhmMzBjNC4uYWNjOWU4NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbWVkaWFmaWx0ZXIiLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icAppbmRleCAzMmIyMDc1Li4yMjVjOTMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsNyArMSwyNyBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2ZsYWNfZGVjX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2ZsYWNfZGVjX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mbGFjZGVjIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkZMQUNEZWNvZGVyLmNwcCIsCkBAIC0zMyw2ICs1MywxMyBAQAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWwotICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCiAgICAgXSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5jcHAKaW5kZXggY2VmMGJjNi4uZjVlOTUzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmNwcApAQCAtNDMzLDcgKzQzMyw3IEBACiAgICAgICAgICAgICBpZiAobUJ1ZmZlciA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlckRhdGFTaXplID0gMDsKICAgICAgICAgICAgICAgICBtQnVmZmVyTGVuID0gMDsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZGVjb2RlT25lRnJhbWU6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGlucHV0IGJ1ZmZlciIpOworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGREYXRhVG9CdWZmZXI6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGlucHV0IGJ1ZmZlciIpOwogICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQnVmZmVyTGVuID0gbUJ1ZmZlckRhdGFTaXplICsgaW5CdWZmZXJMZW47CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy90ZXN0L0FuZHJvaWQuYnAKaW5kZXggNzBjYTgwYS4uYTRjMjczNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvdGVzdC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL3Rlc3QvQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2ZsYWNfZGVjX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9mbGFjX2RlY19saWNlbnNlIiwKKyAgICBdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiRmxhY0RlY29kZXJUZXN0IiwKICAgICBndGVzdDogdHJ1ZSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwCmluZGV4IDhhN2MzZWIuLjBhNGU1OTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcApAQCAtMTY2LDcgKzE2Niw3IEBACiAgICAgICAgIH0KICAgICAgICAgcy5hcHBlbmQoIlxuIik7CiAgICAgfQotICAgIHdyaXRlKGZkLCBzLnN0cmluZygpLCBzLnNpemUoKSk7CisgICAgKHZvaWQpd3JpdGUoZmQsIHMuc3RyaW5nKCksIHMuc2l6ZSgpKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCmluZGV4IDRiZDE4NmMuLjg3MjJlMTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcApAQCAtMzg3LDEwICszODcsMTQgQEAKICAgICB2YV9zdGFydChhcCwgZm9ybWF0KTsKIAogICAgIGNoYXIgKmJ1ZmZlcjsKLSAgICB2YXNwcmludGYoJmJ1ZmZlciwgZm9ybWF0LCBhcCk7CisgICAgaW50IGJ1ZmZlclNpemUgPSB2YXNwcmludGYoJmJ1ZmZlciwgZm9ybWF0LCBhcCk7CiAKICAgICB2YV9lbmQoYXApOwogCisgICAgaWYoYnVmZmVyU2l6ZSA8IDApIHsKKyAgICAgICAgcmV0dXJuIEFTdHJpbmcoKTsKKyAgICB9CisKICAgICBBU3RyaW5nIHJlc3VsdChidWZmZXIpOwogCiAgICAgZnJlZShidWZmZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCmluZGV4IGY0NDBlMDAuLmRiODdhMzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X2hlYWRlcnMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLApAQCAtMTIsNiArMzEsNyBAQAogICAgIHZuZGs6IHsKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICB9LAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKICAgICBpbmNsdWRlX2RpcnM6IFsKICAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCkBAIC0yNSw3ICs0NSw5IEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICAgICAgLy8gdGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgdGhlIHZlbmRvciB2YXJpYW50IHRoYXQgcmVtb3ZlcyBsaWJiaW5kZXIsIGJ1dCB2ZW5kb3IKKyAgICAgICAgLy8gdGFyZ2V0IGJlbG93IGRvZXMgbm90IGFsbG93IGFkZGluZyBoZWFkZXJfbGlicy4KKyAgICAgICAgImxpYmJpbmRlcl9oZWFkZXJzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCkBAIC03OSw2ICsxMDEsNyBAQAogCiAgICAgdGFyZ2V0OiB7CiAgICAgICAgIHZlbmRvcjogeworICAgICAgICAgICAgLy8gVE9ETzogYWRkIGxpYmJpbmRlcl9oZWFkZXJzIGhlcmUgaW5zdGVhZCBvZiBhYm92ZSB3aGVuIGl0IGJlY29tZXMgc3VwcG9ydGVkCiAgICAgICAgICAgICBleGNsdWRlX3NoYXJlZF9saWJzOiBbCiAgICAgICAgICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICAgICBdLApAQCAtODYsNiArMTA5LDkgQEAKICAgICAgICAgICAgICAgICAiLUROT19JTUVNT1JZIiwKICAgICAgICAgICAgIF0sCiAgICAgICAgIH0sCisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCiAgICAgfSwKIAogICAgIGNsYW5nOiB0cnVlLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAKaW5kZXggMDcwZTMyNS4uMzgxMmFmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwCkBAIC02MTMsNiArNjEzLDM1IEBACiB9CiAKIC8vIHN0YXRpYwordm9pZCBDb2xvclV0aWxzOjpnZXRDb2xvckNvbmZpZ0Zyb21EYXRhU3BhY2UoCisgICAgICAgIGNvbnN0IGFuZHJvaWRfZGF0YXNwYWNlICZkYXRhc3BhY2UsIGludDMyX3QgKnJhbmdlLCBpbnQzMl90ICpzdGFuZGFyZCwgaW50MzJfdCAqdHJhbnNmZXIpIHsKKyAgICB1aW50MzJfdCBnZnhSYW5nZSA9CisgICAgICAgIChkYXRhc3BhY2UgJiBIQUxfREFUQVNQQUNFX1JBTkdFX01BU0spID4+IEhBTF9EQVRBU1BBQ0VfUkFOR0VfU0hJRlQ7CisgICAgdWludDMyX3QgZ2Z4U3RhbmRhcmQgPQorICAgICAgICAoZGF0YXNwYWNlICYgSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9NQVNLKSA+PiBIQUxfREFUQVNQQUNFX1NUQU5EQVJEX1NISUZUOworICAgIHVpbnQzMl90IGdmeFRyYW5zZmVyID0KKyAgICAgICAgKGRhdGFzcGFjZSAmIEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfTUFTSykgPj4gSEFMX0RBVEFTUEFDRV9UUkFOU0ZFUl9TSElGVDsKKworICAgIC8vIGFzc3VtZSAxLXRvLTEgbWFwcGluZyB0byBIQUwgdmFsdWVzICh0byBkZWFsIHdpdGggcG90ZW50aWFsIHZlbmRvciBleHRlbnNpb25zKQorICAgIENVOjpDb2xvclJhbmdlICAgIGN1UmFuZ2UgICAgPSBDVTo6a0NvbG9yUmFuZ2VVbnNwZWNpZmllZDsKKyAgICBDVTo6Q29sb3JTdGFuZGFyZCBjdVN0YW5kYXJkID0gQ1U6OmtDb2xvclN0YW5kYXJkVW5zcGVjaWZpZWQ7CisgICAgQ1U6OkNvbG9yVHJhbnNmZXIgY3VUcmFuc2ZlciA9IENVOjprQ29sb3JUcmFuc2ZlclVuc3BlY2lmaWVkOworICAgIC8vIFRSSUNLWTogdXNlICYgdG8gZW5zdXJlIGFsbCB0aHJlZSBtYXBwaW5ncyBhcmUgY29tcGxldGVkCisgICAgaWYgKCEoc0dmeFJhbmdlcy5tYXAoZ2Z4UmFuZ2UsICZjdVJhbmdlKSAmIHNHZnhTdGFuZGFyZHMubWFwKGdmeFN0YW5kYXJkLCAmY3VTdGFuZGFyZCkKKyAgICAgICAgICAgICYgc0dmeFRyYW5zZmVycy5tYXAoZ2Z4VHJhbnNmZXIsICZjdVRyYW5zZmVyKSkpIHsKKyAgICAgICAgQUxPR1coImNvdWxkIG5vdCBzYWZlbHkgbWFwIGdyYXBoaWNzIGRhdGFzcGFjZSAoUjoldSBTOiV1IFQ6JXUpIHRvICIKKyAgICAgICAgICAgICAgInBsYXRmb3JtIGNvbG9yIGFzcGVjdHMgKFI6JXUoJXMpIFM6JXUoJXMpIFQ6JXUoJXMpIiwKKyAgICAgICAgICAgICAgZ2Z4UmFuZ2UsIGdmeFN0YW5kYXJkLCBnZnhUcmFuc2ZlciwKKyAgICAgICAgICAgICAgY3VSYW5nZSwgICAgYXNTdHJpbmcoY3VSYW5nZSksCisgICAgICAgICAgICAgIGN1U3RhbmRhcmQsIGFzU3RyaW5nKGN1U3RhbmRhcmQpLAorICAgICAgICAgICAgICBjdVRyYW5zZmVyLCBhc1N0cmluZyhjdVRyYW5zZmVyKSk7CisgICAgfQorICAgICpyYW5nZSAgICA9IGN1UmFuZ2U7CisgICAgKnN0YW5kYXJkID0gY3VTdGFuZGFyZDsKKyAgICAqdHJhbnNmZXIgPSBjdVRyYW5zZmVyOworfQorCisvLyBzdGF0aWMKIHZvaWQgQ29sb3JVdGlsczo6Z2V0Q29sb3JDb25maWdGcm9tRm9ybWF0KAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgaW50MzJfdCAqcmFuZ2UsIGludDMyX3QgKnN0YW5kYXJkLCBpbnQzMl90ICp0cmFuc2ZlcikgewogICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXJhbmdlIiwgcmFuZ2UpKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAKaW5kZXggYTA4ZmVkMS4uMTQ5MzQwNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcApAQCAtNTcsNiArNTcsOCBAQAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMyA9ICJhdWRpby9lYWMzIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DID0gImF1ZGlvL2VhYzMtam9jIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDNCA9ICJhdWRpby9hYzQiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfTUhBMSA9ICJhdWRpby9taGExIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdIX01ITTEgPSAiYXVkaW8vbWhtMSI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQgPSAiYXVkaW8vc2NyYW1ibGVkIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FMQUMgPSAiYXVkaW8vYWxhYyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19XTUEgPSAiYXVkaW8veC1tcy13bWEiOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuY3BwCmluZGV4IGY1M2QyYzkuLjlkNjg4N2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5jcHAKQEAgLTU1OSwxMSArNTU5LDkgQEAKICAgICBDSEVDS19ORSh2aWRlb19vYmplY3RfdHlwZV9pbmRpY2F0aW9uLAogICAgICAgICAgICAgIDB4MjF1IC8qIEZpbmUgR3JhbnVsYXJpdHkgU2NhbGFibGUgKi8pOwogCi0gICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX3ZlcmlkIF9fdW51c2VkOwotICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl9wcmlvcml0eSBfX3VudXNlZDsKICAgICBpZiAoYnIuZ2V0Qml0cygxKSkgewotICAgICAgICB2aWRlb19vYmplY3RfbGF5ZXJfdmVyaWQgPSBici5nZXRCaXRzKDQpOwotICAgICAgICB2aWRlb19vYmplY3RfbGF5ZXJfcHJpb3JpdHkgPSBici5nZXRCaXRzKDMpOworICAgICAgICBici5za2lwQml0cyg0KTsgLy92aWRlb19vYmplY3RfbGF5ZXJfdmVyaWQKKyAgICAgICAgYnIuc2tpcEJpdHMoMyk7IC8vdmlkZW9fb2JqZWN0X2xheWVyX3ByaW9yaXR5CiAgICAgfQogICAgIHVuc2lnbmVkIGFzcGVjdF9yYXRpb19pbmZvID0gYnIuZ2V0Qml0cyg0KTsKICAgICBpZiAoYXNwZWN0X3JhdGlvX2luZm8gPT0gMHgwZiAvKiBleHRlbmRlZCBQQVIgKi8pIHsKQEAgLTYyMiw3ICs2MjAsNyBAQAogICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl9oZWlnaHQgPSBici5nZXRCaXRzKDEzKTsKICAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKIAotICAgIHVuc2lnbmVkIGludGVybGFjZWQgX191bnVzZWQgPSBici5nZXRCaXRzKDEpOworICAgIGJyLnNraXBCaXRzKDEpOyAvLyBpbnRlcmxhY2VkCiAKICAgICAqd2lkdGggPSB2aWRlb19vYmplY3RfbGF5ZXJfd2lkdGg7CiAgICAgKmhlaWdodCA9IHZpZGVvX29iamVjdF9sYXllcl9oZWlnaHQ7CkBAIC02NjgsNyArNjY2LDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHVuc2lnbmVkIHByb3RlY3Rpb24gX191bnVzZWQgPSAoaGVhZGVyID4+IDE2KSAmIDE7CisgICAgLy8gd2UgY2FuIGdldCBwcm90ZWN0aW9uIHZhbHVlIGZyb20gKGhlYWRlciA+PiAxNikgJiAxCiAKICAgICB1bnNpZ25lZCBiaXRyYXRlX2luZGV4ID0gKGhlYWRlciA+PiAxMikgJiAweDBmOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oCmluZGV4IGFiMTdhMDIuLmU0Yjk5YmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oCkBAIC0xNDgsNyArMTQ4LDggQEAKICAgICBzdGF0aWMgY2hhciAqR2V0RGVidWdOYW1lKGNvbnN0IGNoYXIgKm5hbWUpOwogCiAgICAgaW5saW5lIHN0YXRpYyBib29sIGlzRXhwZXJpbWVudEVuYWJsZWQoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lIF9fdW51c2VkIC8qIG5vbm51bGwgKi8sIGJvb2wgYWxsb3cgX191bnVzZWQgPSB0cnVlKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lIF9fYXR0cmlidXRlX18oKHVudXNlZCkpIC8qIG5vbm51bGwgKi8sCisgICAgICAgICAgICBib29sIGFsbG93IF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gdHJ1ZSkgewogI2lmZGVmIEVOQUJMRV9TVEFHRUZSSUdIVF9FWFBFUklNRU5UUwogICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAibGVnYWN5LWFkYXB0aXZlIikpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRFeHBlcmltZW50RmxhZyhhbGxvdywgbmFtZSwgMiwgMSk7IC8vIGV2ZXJ5IG90aGVyIGRheQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaAppbmRleCBhZjZiMzU3Li4zYjY0NmRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaApAQCAtNjMsNyArNjMsNyBAQAogCiB0ZW1wbGF0ZTxjbGFzcyBUPgogdm9pZCBFTlNVUkVfVU5TSUdORURfVFlQRSgpIHsKLSAgICBUIFRZUEVfTVVTVF9CRV9VTlNJR05FRFsoVCktMSA8IDAgPyAtMSA6IDBdIF9fdW51c2VkOworICAgIFQgVFlQRV9NVVNUX0JFX1VOU0lHTkVEWyhUKS0xIDwgMCA/IC0xIDogMF0gX19hdHRyaWJ1dGVfXygodW51c2VkKSk7CiB9CiAKIC8vIG5lZWRsZSBpcyBpbiByYW5nZSBbaGF5U3RhcnQsIGhheVN0YXJ0ICsgaGF5U2l6ZSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaAppbmRleCBjZDBhZjJiLi45ZTNmNzE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oCkBAIC0xNTYsNiArMTU2LDEwIEBACiAgICAgLy8gc3VpdGVkIHRvIGJsZW5kaW5nLiBUaGlzIHJlcXVpcmVzIGltcGxpY2l0IGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gb24gcGFydCBvZiB0aGUgZGV2aWNlLgogICAgIHN0YXRpYyBhbmRyb2lkX2RhdGFzcGFjZSBnZXREYXRhU3BhY2VGb3JDb2xvckFzcGVjdHMoQ29sb3JBc3BlY3RzICZhc3BlY3RzLCBib29sIG1heUV4cGFuZCk7CiAKKyAgICAvLyBpdCByZXR1cm5zIHRoZSBwbGF0Zm9ybSBjb2xvciBjb25maWdzIGZyb20gZ2l2ZW4gfGRhdGFzcGFjZXwuCisgICAgc3RhdGljIHZvaWQgZ2V0Q29sb3JDb25maWdGcm9tRGF0YVNwYWNlKAorICAgICAgICAgICAgY29uc3QgYW5kcm9pZF9kYXRhc3BhY2UgJmRhdGFzcGFjZSwgaW50ICpyYW5nZSwgaW50ICpzdGFuZGFyZCwgaW50ICp0cmFuc2Zlcik7CisKICAgICAvLyBjb252ZXJ0cyB8ZGF0YVNwYWNlfCB0byBhIFYwIGVudW0sIGFuZCByZXR1cm5zIHRydWUgaWYgZGF0YVNwYWNlIGlzIGFuIGFzcGVjdC1vbmx5IHZhbHVlCiAgICAgc3RhdGljIGJvb2wgY29udmVydERhdGFTcGFjZVRvVjAoYW5kcm9pZF9kYXRhc3BhY2UgJmRhdGFTcGFjZSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKaW5kZXggMWY5ZTYzNi4uOTc0NThjMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKQEAgLTU5LDYgKzU5LDggQEAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDNDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9NSEExOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdIX01ITTE7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVEOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FMQUM7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fV01BOwpAQCAtODksNiArOTEsOCBAQAogICAgIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQgPSAyLAogICAgIGtBdWRpb0VuY29kaW5nUGNtOGJpdCA9IDMsCiAgICAga0F1ZGlvRW5jb2RpbmdQY21GbG9hdCA9IDQsCisgICAga0F1ZGlvRW5jb2RpbmdQY20yNGJpdFBhY2tlZCA9IDIxLAorICAgIGtBdWRpb0VuY29kaW5nUGNtMzJiaXQgPSAyMiwKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FWQ1V0aWxzVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FWQ1V0aWxzVGVzdEVudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4YTdiYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQVZDVXRpbHNUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0FWQ19VVElMU19URVNUX0VOVklST05NRU5UX0hfXworI2RlZmluZSBfX0FWQ19VVElMU19URVNUX0VOVklST05NRU5UX0hfXworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGdldG9wdC5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjbGFzcyBBVkNVdGlsc1Rlc3RFbnZpcm9ubWVudCA6IHB1YmxpYzo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgQVZDVXRpbHNUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL2RhdGEvbG9jYWwvdG1wLyIpIHt9CisKKyAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyICpfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IHN0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KKworICBwcml2YXRlOgorICAgIHN0cmluZyByZXM7Cit9OworCitpbnQgQVZDVXRpbHNUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJwYXRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdQJ30sIHswLCAwLCAwLCAwfX07CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJQOiIsIG9wdGlvbnMsICZpbmRleCk7CisgICAgICAgIGlmIChjID09IC0xKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnUCc6IHsKKyAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgorICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gX19BVkNfVVRJTFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQVZDVXRpbHNVbml0VGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FWQ1V0aWxzVW5pdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YTg1OTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FWQ1V0aWxzVW5pdFRlc3QuY3BwCkBAIC0wLDAgKzEsNDExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBVkNVdGlsc1VuaXRUZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgIm1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oIgorI2luY2x1ZGUgIm1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmgiCisKKyNpbmNsdWRlICJBVkNVdGlsc1Rlc3RFbnZpcm9ubWVudC5oIgorCitjb25zdGV4cHIgc2l6ZV90IGtTbWFsbEJ1ZmZlclNpemUgPSAyOworY29uc3RleHByIHVpbnQ4X3Qga1NQU21hc2sgPSAweDFmOworY29uc3RleHByIHVpbnQ4X3Qga1NQU1N0YXJ0Q29kZSA9IDB4MDc7Citjb25zdGV4cHIgdWludDhfdCBrQ29uZmlnVmVyc2lvbiA9IDB4MDE7CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0aWMgQVZDVXRpbHNUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCitjbGFzcyBNcGVnQXVkaW9Vbml0VGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTwKKyAgICAgICAgICAgICAgdHVwbGU8LyphdWRpb0hlYWRlciovIHVpbnQzMl90LCAvKmZyYW1lU2l6ZSovIGludDMyX3QsIC8qc2FtcGxlUmF0ZSovIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgIC8qbnVtQ2hhbm5lbHMqLyBpbnQzMl90LCAvKmJpdFJhdGUqLyBpbnQzMl90LCAvKm51bVNhbXBsZXMqLyBpbnQzMl90Pj4ge307CisKK2NsYXNzIFZPTERpbWVuc2lvblRlc3QKKyAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08CisgICAgICAgICAgICAgIHR1cGxlPC8qZmlsZU5hbWUqLyBzdHJpbmcsIC8qdm9sV2lkdGgqLyBpbnQzMl90LCAvKnZvbEhlaWdodCovIGludDMyX3Q+PiB7fTsKKworY2xhc3MgQVZDVXRpbHMgeworICBwdWJsaWM6CisgICAgYm9vbCBTZXRVcEFWQ1V0aWxzKHN0cmluZyBmaWxlTmFtZSwgc3RyaW5nIGluZm9GaWxlTmFtZSkgeworICAgICAgICBtSW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBmaWxlTmFtZTsKKyAgICAgICAgbUlucHV0RmlsZVN0cmVhbS5vcGVuKG1JbnB1dEZpbGUsIGlmc3RyZWFtOjppbik7CisgICAgICAgIGlmICghbUlucHV0RmlsZVN0cmVhbS5pc19vcGVuKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBtSW5mb0ZpbGUgPSBnRW52LT5nZXRSZXMoKSArIGluZm9GaWxlTmFtZTsKKyAgICAgICAgbUluZm9GaWxlU3RyZWFtLm9wZW4obUluZm9GaWxlLCBpZnN0cmVhbTo6aW4pOworICAgICAgICBpZiAoIW1JbnB1dEZpbGVTdHJlYW0uaXNfb3BlbigpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIH5BVkNVdGlscygpIHsKKyAgICAgICAgaWYgKG1JbnB1dEZpbGVTdHJlYW0uaXNfb3BlbigpKSBtSW5wdXRGaWxlU3RyZWFtLmNsb3NlKCk7CisgICAgICAgIGlmIChtSW5mb0ZpbGVTdHJlYW0uaXNfb3BlbigpKSBtSW5mb0ZpbGVTdHJlYW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBzdHJpbmcgbUlucHV0RmlsZTsKKyAgICBzdHJpbmcgbUluZm9GaWxlOworCisgICAgaWZzdHJlYW0gbUlucHV0RmlsZVN0cmVhbTsKKyAgICBpZnN0cmVhbSBtSW5mb0ZpbGVTdHJlYW07Cit9OworCitjbGFzcyBBVkNEaW1lbnNpb25UZXN0CisgICAgOiBwdWJsaWMgQVZDVXRpbHMsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPAorICAgICAgICAgICAgICB0dXBsZTwvKmZpbGVOYW1lKi8gc3RyaW5nLCAvKmluZm9GaWxlTmFtZSovIHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgLyphdmNXaWR0aCovIHNpemVfdCwgLyphdmNIZWlnaHQqLyBzaXplX3QsIC8qbnVtYmVyT2ZOQUxVbml0cyovIGludDMyX3Q+PiB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIHR1cGxlPHN0cmluZywgc3RyaW5nLCBzaXplX3QsIHNpemVfdCwgc2l6ZV90PiBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgICAgICBzdHJpbmcgZmlsZU5hbWUgPSBnZXQ8MD4ocGFyYW1zKTsKKyAgICAgICAgc3RyaW5nIGluZm9GaWxlTmFtZSA9IGdldDwxPihwYXJhbXMpOworICAgICAgICBBVkNVdGlsczo6U2V0VXBBVkNVdGlscyhmaWxlTmFtZSwgaW5mb0ZpbGVOYW1lKTsKKworICAgICAgICBtRnJhbWVXaWR0aCA9IGdldDwyPihwYXJhbXMpOworICAgICAgICBtRnJhbWVIZWlnaHQgPSBnZXQ8Mz4ocGFyYW1zKTsKKyAgICAgICAgbU5hbFVuaXRzRXhwZWN0ZWQgPSBnZXQ8ND4ocGFyYW1zKTsKKyAgICB9CisKKyAgICBzaXplX3QgbUZyYW1lV2lkdGg7CisgICAgc2l6ZV90IG1GcmFtZUhlaWdodDsKKyAgICBpbnQzMl90IG1OYWxVbml0c0V4cGVjdGVkOworfTsKKworY2xhc3MgQXZjY0JveFRlc3QgOiBwdWJsaWMgQVZDRGltZW5zaW9uVGVzdCB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IEFWQ0RpbWVuc2lvblRlc3Q6OlNldFVwKCk7IH0KK307CisKK2NsYXNzIEFWQ0ZyYW1lVGVzdAorICAgIDogcHVibGljIEFWQ1V0aWxzLAorICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxwYWlyPC8qZmlsZU5hbWUqLyBzdHJpbmcsIC8qaW5mb0ZpbGVOYW1lKi8gc3RyaW5nPj4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBzdHJpbmcgZmlsZU5hbWUgPSBHZXRQYXJhbSgpLmZpcnN0OworICAgICAgICBzdHJpbmcgaW5mb0ZpbGVOYW1lID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgICAgIEFWQ1V0aWxzOjpTZXRVcEFWQ1V0aWxzKGZpbGVOYW1lLCBpbmZvRmlsZU5hbWUpOworICAgIH0KK307CisKK1RFU1RfUChNcGVnQXVkaW9Vbml0VGVzdCwgQXVkaW9Qcm9maWxlVGVzdCkgeworICAgIHR1cGxlPHVpbnQzMl90LCBzaXplX3QsIGludCwgaW50LCBpbnQsIGludD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICB1aW50MzJfdCBoZWFkZXIgPSBnZXQ8MD4ocGFyYW1zKTsKKworICAgIHNpemVfdCBhdWRpb0ZyYW1lU2l6ZSA9IGdldDwxPihwYXJhbXMpOworICAgIGludCBhdWRpb1NhbXBsZVJhdGUgPSBnZXQ8Mj4ocGFyYW1zKTsKKyAgICBpbnQgYXVkaW9OdW1DaGFubmVscyA9IGdldDwzPihwYXJhbXMpOworICAgIGludCBhdWRpb0JpdFJhdGUgPSBnZXQ8ND4ocGFyYW1zKTsKKyAgICBpbnQgYXVkaW9OdW1TYW1wbGVzID0gZ2V0PDU+KHBhcmFtcyk7CisKKyAgICBzaXplX3QgZnJhbWVTaXplID0gMDsKKyAgICBpbnQgc2FtcGxlUmF0ZSA9IDA7CisgICAgaW50IG51bUNoYW5uZWxzID0gMDsKKyAgICBpbnQgYml0UmF0ZSA9IDA7CisgICAgaW50IG51bVNhbXBsZXMgPSAwOworCisgICAgYm9vbCBzdGF0dXMgPSBHZXRNUEVHQXVkaW9GcmFtZVNpemUoaGVhZGVyLCAmZnJhbWVTaXplLCAmc2FtcGxlUmF0ZSwgJm51bUNoYW5uZWxzLCAmYml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtU2FtcGxlcyk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCBBdWRpbyBwcm9wZXJ0aWVzIjsKKworICAgIEFTU0VSVF9FUShmcmFtZVNpemUsIGF1ZGlvRnJhbWVTaXplKSA8PCAiV3JvbmcgZnJhbWUgc2l6ZSBmb3VuZCI7CisKKyAgICBBU1NFUlRfRVEoc2FtcGxlUmF0ZSwgYXVkaW9TYW1wbGVSYXRlKSA8PCAiV3Jvbmcgc2FtcGxlIHJhdGUgZm91bmQiOworCisgICAgQVNTRVJUX0VRKG51bUNoYW5uZWxzLCBhdWRpb051bUNoYW5uZWxzKSA8PCAiV3JvbmcgbnVtYmVyIG9mIGNoYW5uZWxzIGZvdW5kIjsKKworICAgIEFTU0VSVF9FUShiaXRSYXRlLCBhdWRpb0JpdFJhdGUpIDw8ICJXcm9uZyBiaXQgcmF0ZSBmb3VuZCI7CisKKyAgICBBU1NFUlRfRVEobnVtU2FtcGxlcywgYXVkaW9OdW1TYW1wbGVzKSA8PCAiV3JvbmcgbnVtYmVyIG9mIHNhbXBsZXMgZm91bmQiOworfQorCitURVNUX1AoVk9MRGltZW5zaW9uVGVzdCwgRGltZW5zaW9uVGVzdCkgeworICAgIHR1cGxlPHN0cmluZywgaW50MzJfdCwgaW50MzJfdD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MD4ocGFyYW1zKTsKKyAgICBpZnN0cmVhbSBpbnB1dEZpbGVTdHJlYW07CisgICAgaW5wdXRGaWxlU3RyZWFtLm9wZW4oaW5wdXRGaWxlLCBpZnN0cmVhbTo6aW4pOworICAgIEFTU0VSVF9UUlVFKGlucHV0RmlsZVN0cmVhbS5pc19vcGVuKCkpIDw8ICJGYWlsZWQgdG8gb3BlbjogIiA8PCBpbnB1dEZpbGU7CisKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgaW50OF90IGVyciA9IHN0YXQoaW5wdXRGaWxlLmNfc3RyKCksICZidWYpOworICAgIEFTU0VSVF9FUShlcnIsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGZvciBmaWxlOiAiIDw8IGlucHV0RmlsZTsKKworICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgIEFTU0VSVF9ORShmaWxlU2l6ZSwgMCkgPDwgIkludmFsaWQgZmlsZSBzaXplIGZvdW5kIjsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnZvbEJ1ZmZlciA9IG5ldyB1aW50OF90W2ZpbGVTaXplXTsKKyAgICBBU1NFUlRfTkUodm9sQnVmZmVyLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIFZPTCBidWZmZXIgb2Ygc2l6ZTogIiA8PCBmaWxlU2l6ZTsKKworICAgIGlucHV0RmlsZVN0cmVhbS5yZWFkKChjaGFyICopKHZvbEJ1ZmZlciksIGZpbGVTaXplKTsKKyAgICBBU1NFUlRfRVEoaW5wdXRGaWxlU3RyZWFtLmdjb3VudCgpLCBmaWxlU2l6ZSkKKyAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVhZCBjb21wbGV0ZSBmaWxlLCBieXRlcyByZWFkOiAiIDw8IGlucHV0RmlsZVN0cmVhbS5nY291bnQoKTsKKworICAgIGludDMyX3Qgd2lkdGggPSBnZXQ8MT4ocGFyYW1zKTsKKyAgICBpbnQzMl90IGhlaWdodCA9IGdldDwyPihwYXJhbXMpOworICAgIGludDMyX3Qgdm9sV2lkdGggPSAtMTsKKyAgICBpbnQzMl90IHZvbEhlaWdodCA9IC0xOworCisgICAgYm9vbCBzdGF0dXMgPSBFeHRyYWN0RGltZW5zaW9uc0Zyb21WT0xIZWFkZXIodm9sQnVmZmVyLCBmaWxlU2l6ZSwgJnZvbFdpZHRoLCAmdm9sSGVpZ2h0KTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpCisgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGdldCBWT0wgZGltZW5zaW9ucyBmcm9tIGZ1bmN0aW9uOiBFeHRyYWN0RGltZW5zaW9uc0Zyb21WT0xIZWFkZXIoKSI7CisKKyAgICBBU1NFUlRfRVEodm9sV2lkdGgsIHdpZHRoKSA8PCAiRXhwZWN0ZWQgd2lkdGg6ICIgPDwgd2lkdGggPDwgIkZvdW5kOiAiIDw8IHZvbFdpZHRoOworCisgICAgQVNTRVJUX0VRKHZvbEhlaWdodCwgaGVpZ2h0KSA8PCAiRXhwZWN0ZWQgaGVpZ2h0OiAiIDw8IGhlaWdodCA8PCAiRm91bmQ6ICIgPDwgdm9sSGVpZ2h0OworCisgICAgZGVsZXRlW10gdm9sQnVmZmVyOworfQorCitURVNUX1AoQVZDRGltZW5zaW9uVGVzdCwgRGltZW5zaW9uVGVzdCkgeworICAgIGludDMyX3QgbnVtTmFsVW5pdHMgPSAwOworICAgIGludDMyX3QgYXZjV2lkdGggPSAtMTsKKyAgICBpbnQzMl90IGF2Y0hlaWdodCA9IC0xOworICAgIHN0cmluZyBsaW5lOworICAgIHN0cmluZyB0eXBlOworICAgIHNpemVfdCBjaHVua0xlbmd0aDsKKyAgICB3aGlsZSAoZ2V0bGluZShtSW5mb0ZpbGVTdHJlYW0sIGxpbmUpKSB7CisgICAgICAgIGlzdHJpbmdzdHJlYW0gc3RyaW5nTGluZShsaW5lKTsKKyAgICAgICAgc3RyaW5nTGluZSA+PiB0eXBlID4+IGNodW5rTGVuZ3RoOworICAgICAgICBBU1NFUlRfR1QoY2h1bmtMZW5ndGgsIDApIDw8ICJMZW5ndGggb2YgdGhlIGRhdGEgY2h1bmsgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyI7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IG5ldyB1aW50OF90W2NodW5rTGVuZ3RoXTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGEgZGF0YSBidWZmZXIgb2Ygc2l6ZTogIiA8PCBjaHVua0xlbmd0aDsKKworICAgICAgICBjb25zdCB1aW50OF90ICpuYWxTdGFydDsKKyAgICAgICAgc2l6ZV90IG5hbFNpemU7CisKKyAgICAgICAgbUlucHV0RmlsZVN0cmVhbS5yZWFkKChjaGFyICopZGF0YSwgY2h1bmtMZW5ndGgpOworICAgICAgICBBU1NFUlRfRVEobUlucHV0RmlsZVN0cmVhbS5nY291bnQoKSwgY2h1bmtMZW5ndGgpCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byByZWFkIGNvbXBsZXRlIGZpbGUsIGJ5dGVzIHJlYWQ6ICIgPDwgbUlucHV0RmlsZVN0cmVhbS5nY291bnQoKTsKKworICAgICAgICBzaXplX3Qgc21hbGxCdWZmZXJTaXplID0ga1NtYWxsQnVmZmVyU2l6ZTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc2FuaXR5RGF0YSA9IG5ldyB1aW50OF90W3NtYWxsQnVmZmVyU2l6ZV07CisgICAgICAgIG1lbWNweSgodm9pZCAqKXNhbml0eURhdGEsICh2b2lkICopZGF0YSwgc21hbGxCdWZmZXJTaXplKTsKKworICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXROZXh0TkFMVW5pdCgmc2FuaXR5RGF0YSwgJnNtYWxsQnVmZmVyU2l6ZSwgJm5hbFN0YXJ0LCAmbmFsU2l6ZSwgdHJ1ZSk7CisgICAgICAgIEFTU0VSVF9FUShyZXN1bHQsIC1FQUdBSU4pIDw8ICJJbnZhbGlkIHJlc3VsdCBmb3VuZCB3aGVuIHdyb25nIE5BTCB1bml0IHBhc3NlZCI7CisKKyAgICAgICAgd2hpbGUgKCFnZXROZXh0TkFMVW5pdCgmZGF0YSwgJmNodW5rTGVuZ3RoLCAmbmFsU3RhcnQsICZuYWxTaXplLCB0cnVlKSkgeworICAgICAgICAgICAgbnVtTmFsVW5pdHMrKzsKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYW4gU1BTCisgICAgICAgICAgICBpZiAoKG5hbFN0YXJ0WzBdICYga1NQU21hc2spICE9IGtTUFNTdGFydENvZGUpIGNvbnRpbnVlOworICAgICAgICAgICAgQVNTRVJUX1RSVUUobmFsU2l6ZSA+IDApIDw8ICJOQUwgdW5pdCBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAiOworCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBzcHNCdWZmZXIgPSBuZXcgQUJ1ZmZlcihuYWxTaXplKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShzcHNCdWZmZXIsIG51bGxwdHIpIDw8ICJBQnVmZmVyIHJldHVybmVkIG51bGwgZm9yIHNpemU6ICIgPDwgbmFsU2l6ZTsKKworICAgICAgICAgICAgbWVtY3B5KHNwc0J1ZmZlci0+ZGF0YSgpLCBuYWxTdGFydCwgbmFsU2l6ZSk7CisgICAgICAgICAgICBGaW5kQVZDRGltZW5zaW9ucyhzcHNCdWZmZXIsICZhdmNXaWR0aCwgJmF2Y0hlaWdodCk7CisgICAgICAgICAgICBzcHNCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShhdmNXaWR0aCwgbUZyYW1lV2lkdGgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJFeHBlY3RlZCB3aWR0aDogIiA8PCBtRnJhbWVXaWR0aCA8PCAiRm91bmQ6ICIgPDwgYXZjV2lkdGg7CisKKyAgICAgICAgICAgIEFTU0VSVF9FUShhdmNIZWlnaHQsIG1GcmFtZUhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkV4cGVjdGVkIGhlaWdodDogIiA8PCBtRnJhbWVIZWlnaHQgPDwgIkZvdW5kOiAiIDw8IGF2Y0hlaWdodDsKKyAgICAgICAgfQorICAgICAgICBkZWxldGVbXSBkYXRhOworICAgIH0KKyAgICBpZiAobU5hbFVuaXRzRXhwZWN0ZWQgPCAwKSB7CisgICAgICAgIEFTU0VSVF9HVChudW1OYWxVbml0cywgMCkgPDwgIkZhaWxlZCB0byBmaW5kIGFuIE5BTCBVbml0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfRVEobnVtTmFsVW5pdHMsIG1OYWxVbml0c0V4cGVjdGVkKQorICAgICAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBudW1iZXIgb2YgTkFMIHVuaXRzOiAiIDw8IG1OYWxVbml0c0V4cGVjdGVkCisgICAgICAgICAgICAgICAgPDwgIiBmb3VuZDogIiA8PCBudW1OYWxVbml0czsKKyAgICB9Cit9CisKK1RFU1RfUChBdmNjQm94VGVzdCwgQXZjY0JveFZhbGlkYXRpb25UZXN0KSB7CisgICAgaW50MzJfdCBhdmNXaWR0aCA9IC0xOworICAgIGludDMyX3QgYXZjSGVpZ2h0ID0gLTE7CisgICAgaW50MzJfdCBhY2Nlc3NVbml0TGVuZ3RoID0gMDsKKyAgICBpbnQzMl90IHByb2ZpbGUgPSAtMTsKKyAgICBpbnQzMl90IGxldmVsID0gLTE7CisgICAgc3RyaW5nIGxpbmU7CisgICAgc3RyaW5nIHR5cGU7CisgICAgc2l6ZV90IGNodW5rTGVuZ3RoOworICAgIHdoaWxlIChnZXRsaW5lKG1JbmZvRmlsZVN0cmVhbSwgbGluZSkpIHsKKyAgICAgICAgaXN0cmluZ3N0cmVhbSBzdHJpbmdMaW5lKGxpbmUpOworICAgICAgICBzdHJpbmdMaW5lID4+IHR5cGUgPj4gY2h1bmtMZW5ndGg7CisKKyAgICAgICAgaWYgKHR5cGUuY29tcGFyZSgiU1BTIikgJiYgdHlwZS5jb21wYXJlKCJQUFMiKSkgY29udGludWU7CisgICAgICAgIEFTU0VSVF9HVChjaHVua0xlbmd0aCwgMCkgPDwgIkxlbmd0aCBvZiB0aGUgZGF0YSBjaHVuayBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIjsKKworICAgICAgICBhY2Nlc3NVbml0TGVuZ3RoICs9IGNodW5rTGVuZ3RoOworCisgICAgICAgIGlmICghdHlwZS5jb21wYXJlKCJTUFMiKSkgeworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IG5ldyB1aW50OF90W2NodW5rTGVuZ3RoXTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBhIGRhdGEgYnVmZmVyIG9mIHNpemU6ICIgPDwgY2h1bmtMZW5ndGg7CisKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm5hbFN0YXJ0OworICAgICAgICAgICAgc2l6ZV90IG5hbFNpemU7CisKKyAgICAgICAgICAgIG1JbnB1dEZpbGVTdHJlYW0ucmVhZCgoY2hhciAqKWRhdGEsICh1aW50MzJfdCljaHVua0xlbmd0aCk7CisgICAgICAgICAgICBBU1NFUlRfRVEobUlucHV0RmlsZVN0cmVhbS5nY291bnQoKSwgY2h1bmtMZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVhZCBjb21wbGV0ZSBmaWxlLCBieXRlcyByZWFkOiAiIDw8IG1JbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCk7CisKKyAgICAgICAgICAgIHdoaWxlICghZ2V0TmV4dE5BTFVuaXQoJmRhdGEsICZjaHVua0xlbmd0aCwgJm5hbFN0YXJ0LCAmbmFsU2l6ZSwgdHJ1ZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGFuIFNQUworICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKG5hbFNpemUgPiAwICYmIChuYWxTdGFydFswXSAmIGtTUFNtYXNrKSA9PSBrU1BTU3RhcnRDb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBnZXQgU1BTIjsKKworICAgICAgICAgICAgICAgIEFTU0VSVF9HRShuYWxTaXplLCA0KSA8PCAiU1BTIHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gNCI7CisKKyAgICAgICAgICAgICAgICBwcm9maWxlID0gbmFsU3RhcnRbMV07CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBuYWxTdGFydFszXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlbGV0ZVtdIGRhdGE7CisgICAgICAgIH0KKyAgICB9CisgICAgY29uc3QgdWludDhfdCAqYWNjZXNzVW5pdERhdGEgPSBuZXcgdWludDhfdFthY2Nlc3NVbml0TGVuZ3RoXTsKKyAgICBBU1NFUlRfTkUoYWNjZXNzVW5pdERhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGEgYnVmZmVyIG9mIHNpemU6ICIgPDwgYWNjZXNzVW5pdExlbmd0aDsKKworICAgIG1JbnB1dEZpbGVTdHJlYW0uc2Vla2coMCwgaW9zOjpiZWcpOworICAgIG1JbnB1dEZpbGVTdHJlYW0ucmVhZCgoY2hhciAqKWFjY2Vzc1VuaXREYXRhLCBhY2Nlc3NVbml0TGVuZ3RoKTsKKyAgICBBU1NFUlRfRVEobUlucHV0RmlsZVN0cmVhbS5nY291bnQoKSwgYWNjZXNzVW5pdExlbmd0aCkKKyAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVhZCBjb21wbGV0ZSBmaWxlLCBieXRlcyByZWFkOiAiIDw8IG1JbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCk7CisKKyAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIoYWNjZXNzVW5pdExlbmd0aCk7CisgICAgQVNTRVJUX05FKGFjY2Vzc1VuaXQsIG51bGxwdHIpCisgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBhbiBhbmRyb2lkIGRhdGEgYnVmZmVyIG9mIHNpemU6ICIgPDwgYWNjZXNzVW5pdExlbmd0aDsKKworICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksIGFjY2Vzc1VuaXREYXRhLCBhY2Nlc3NVbml0TGVuZ3RoKTsKKyAgICBzcDxBQnVmZmVyPiBjc2REYXRhQnVmZmVyID0gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKGFjY2Vzc1VuaXQsICZhdmNXaWR0aCwgJmF2Y0hlaWdodCk7CisgICAgQVNTRVJUX05FKGNzZERhdGFCdWZmZXIsIG51bGxwdHIpIDw8ICJObyBkYXRhIHJldHVybmVkIGZyb20gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKCkiOworCisgICAgQVNTRVJUX0VRKGF2Y1dpZHRoLCBtRnJhbWVXaWR0aCkgPDwgIkV4cGVjdGVkIHdpZHRoOiAiIDw8IG1GcmFtZVdpZHRoIDw8ICJGb3VuZDogIiA8PCBhdmNXaWR0aDsKKworICAgIEFTU0VSVF9FUShhdmNIZWlnaHQsIG1GcmFtZUhlaWdodCkKKyAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBoZWlnaHQ6ICIgPDwgbUZyYW1lSGVpZ2h0IDw8ICJGb3VuZDogIiA8PCBhdmNIZWlnaHQ7CisKKyAgICB1aW50OF90ICpjc2REYXRhID0gY3NkRGF0YUJ1ZmZlci0+ZGF0YSgpOworICAgIEFTU0VSVF9FUSgqY3NkRGF0YSwga0NvbmZpZ1ZlcnNpb24pIDw8ICJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gdmVyc2lvbiI7CisKKyAgICBBU1NFUlRfR0UoY3NkRGF0YUJ1ZmZlci0+c2l6ZSgpLCA0KSA8PCAiQ1NEIGRhdGEgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA0IjsKKworICAgIEFTU0VSVF9FUSgqKGNzZERhdGEgKyAxKSwgcHJvZmlsZSkKKyAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBBVkMgcHJvZmlsZTogIiA8PCBwcm9maWxlIDw8ICIgZm91bmQ6ICIgPDwgKihjc2REYXRhICsgMSk7CisKKyAgICBBU1NFUlRfRVEoKihjc2REYXRhICsgMyksIGxldmVsKQorICAgICAgICAgICAgPDwgIkV4cGVjdGVkIEFWQyBsZXZlbDogIiA8PCBsZXZlbCA8PCAiIGZvdW5kOiAiIDw8ICooY3NkRGF0YSArIDMpOworICAgIGNzZERhdGFCdWZmZXIuY2xlYXIoKTsKKyAgICBkZWxldGVbXSBhY2Nlc3NVbml0RGF0YTsKKyAgICBhY2Nlc3NVbml0LmNsZWFyKCk7Cit9CisKK1RFU1RfUChBVkNGcmFtZVRlc3QsIEZyYW1lVGVzdCkgeworICAgIHN0cmluZyBsaW5lOworICAgIHN0cmluZyB0eXBlOworICAgIHNpemVfdCBjaHVua0xlbmd0aDsKKyAgICBpbnQzMl90IGZyYW1lTGF5ZXJJRDsKKyAgICB3aGlsZSAoZ2V0bGluZShtSW5mb0ZpbGVTdHJlYW0sIGxpbmUpKSB7CisgICAgICAgIHVpbnQzMl90IGxheWVySUQgPSAwOworICAgICAgICBpc3RyaW5nc3RyZWFtIHN0cmluZ0xpbmUobGluZSk7CisgICAgICAgIHN0cmluZ0xpbmUgPj4gdHlwZSA+PiBjaHVua0xlbmd0aCA+PiBmcmFtZUxheWVySUQ7CisgICAgICAgIEFTU0VSVF9HVChjaHVua0xlbmd0aCwgMCkgPDwgIkxlbmd0aCBvZiB0aGUgZGF0YSBjaHVuayBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIjsKKworICAgICAgICBjaGFyICpkYXRhID0gbmV3IGNoYXJbY2h1bmtMZW5ndGhdOworICAgICAgICBBU1NFUlRfTkUoZGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBhbGxvY2F0aW9uIGRhdGEgYnVmZmVyIG9mIHNpemU6ICIgPDwgY2h1bmtMZW5ndGg7CisKKyAgICAgICAgbUlucHV0RmlsZVN0cmVhbS5yZWFkKGRhdGEsIGNodW5rTGVuZ3RoKTsKKyAgICAgICAgQVNTRVJUX0VRKG1JbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCksIGNodW5rTGVuZ3RoKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVhZCBjb21wbGV0ZSBmaWxlLCBieXRlcyByZWFkOiAiIDw8IG1JbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCk7CisKKyAgICAgICAgaWYgKCF0eXBlLmNvbXBhcmUoIklEUiIpKSB7CisgICAgICAgICAgICBib29sIGlzSURSID0gSXNJRFIoKHVpbnQ4X3QgKilkYXRhLCBjaHVua0xlbmd0aCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShpc0lEUik7CisKKyAgICAgICAgICAgIGxheWVySUQgPSBGaW5kQVZDTGF5ZXJJZCgodWludDhfdCAqKWRhdGEsIGNodW5rTGVuZ3RoKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShsYXllcklELCBmcmFtZUxheWVySUQpIDw8ICJXcm9uZyBsYXllciBJRCBmb3VuZCI7CisgICAgICAgIH0gZWxzZSBpZiAoIXR5cGUuY29tcGFyZSgiUCIpIHx8ICF0eXBlLmNvbXBhcmUoIkIiKSkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKGNodW5rTGVuZ3RoKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShhY2Nlc3NVbml0LCBudWxscHRyKSA8PCAiVW5hYmxlIHRvIGNyZWF0ZSBhY2Nlc3MgVW5pdCI7CisKKyAgICAgICAgICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksIGRhdGEsIGNodW5rTGVuZ3RoKTsKKyAgICAgICAgICAgIGJvb2wgaXNSZWZlcmVuY2VGcmFtZSA9IElzQVZDUmVmZXJlbmNlRnJhbWUoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShpc1JlZmVyZW5jZUZyYW1lKTsKKworICAgICAgICAgICAgYWNjZXNzVW5pdC5jbGVhcigpOworICAgICAgICAgICAgbGF5ZXJJRCA9IEZpbmRBVkNMYXllcklkKCh1aW50OF90ICopZGF0YSwgY2h1bmtMZW5ndGgpOworICAgICAgICAgICAgQVNTRVJUX0VRKGxheWVySUQsIGZyYW1lTGF5ZXJJRCkgPDwgIldyb25nIGxheWVyIElEIGZvdW5kIjsKKyAgICAgICAgfQorICAgICAgICBkZWxldGVbXSBkYXRhOworICAgIH0KK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKEFWQ1V0aWxzVGVzdEFsbCwgTXBlZ0F1ZGlvVW5pdFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgweEZGRkI5MjA0LCA0MTgsIDQ0MTAwLCAyLCAxMjgsIDExNTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoMHhGRkZCNzYwNCwgMjg5LCA0ODAwMCwgMiwgOTYsIDExNTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoMHhGRkZFNTYwNCwgMTY0LCA0ODAwMCwgMiwgMTYwLCAzODQpKSk7CisKKy8vIEluZm8gRmlsZSBjb250YWlucyB0aGUgdHlwZSBhbmQgbGVuZ3RoIGZvciBlYWNoIGNodW5rL2ZyYW1lCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIEFWQ1V0aWxzVGVzdEFsbCwgQVZDRGltZW5zaW9uVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgiY3Jvd2RfOHg4cDUwZjMyXzIwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzh4OHA1MGYzMl8yMDBrYnBzX2JwLmluZm8iLCA4LCA4LCAxMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzY0MHgzNjBwMjRmMzAwXzEwMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF82NDB4MzYwcDI0ZjMwMF8xMDAwa2Jwc19icC5pbmZvIiwgNjQwLCAzNjAsIDExKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTI4MHg3MjBwMzBmMzAwXzUwMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF8xMjgweDcyMHAzMGYzMDBfNTAwMGticHNfYnAuaW5mbyIsIDEyODAsIDcyMCwgMTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBwNTBmMzAwXzEyMDAwa2Jwc19icC5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfMTkyMHgxMDgwcDUwZjMwMF8xMjAwMGticHNfYnAuaW5mbyIsIDE5MjAsIDEwODAsIDE0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMzg0MHgyMTYwcDYwZjMwMF82ODAwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzM4NDB4MjE2MHA2MGYzMDBfNjgwMDBrYnBzX2JwLmluZm8iLCAzODQwLCAyMTYwLCAxNCkpKTsKKworLy8gSW5mbyBGaWxlIGNvbnRhaW5zIHRoZSB0eXBlIGFuZCBsZW5ndGggZm9yIGVhY2ggY2h1bmsvZnJhbWUKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgQVZDVXRpbHNUZXN0QWxsLCBBdmNjQm94VGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgiY3Jvd2RfOHg4cDUwZjMyXzIwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzh4OHA1MGYzMl8yMDBrYnBzX2JwLmluZm8iLCA4LCA4LCAxMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzEyODB4NzIwcDMwZjMwMF81MDAwa2Jwc19icC5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfMTI4MHg3MjBwMzBmMzAwXzUwMDBrYnBzX2JwLmluZm8iLCAxMjgwLCA3MjAsIDEyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTkyMHgxMDgwcDUwZjMwMF8xMjAwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzE5MjB4MTA4MHA1MGYzMDBfMTIwMDBrYnBzX2JwLmluZm8iLCAxOTIwLCAxMDgwLCAxNCkpKTsKKworLy8gSW5mbyBGaWxlIGNvbnRhaW5zIHRoZSB0eXBlIGFuZCBsZW5ndGggZm9yIGVhY2ggY2h1bmsvZnJhbWUKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChBVkNVdGlsc1Rlc3RBbGwsIFZPTERpbWVuc2lvblRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgidm9sRGF0YV83MjBfNDgwIiwgNzIwLCA0ODApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInZvbERhdGFfMTI4MF83MjAiLCAxMjgwLCA3MjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInZvbERhdGFfMTkyMF8xMDgwIiwgMTkyMCwgMTA4MCkpKTsKKworLy8gSW5mbyBGaWxlIGNvbnRhaW5zIHRoZSB0eXBlLCBsZW5ndGggYW5kIGxheWVyIElEIGZvciBlYWNoIGNodW5rL2ZyYW1lCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoQVZDVXRpbHNUZXN0QWxsLCBBVkNGcmFtZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgiY3Jvd2RfOHg4cDUwZjMyXzIwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfOHg4cDUwZjMyXzIwMGticHNfYnAuaW5mbyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzY0MHgzNjBwMjRmMzAwXzEwMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzY0MHgzNjBwMjRmMzAwXzEwMDBrYnBzX2JwLmluZm8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xMjgweDcyMHAzMGYzMDBfNTAwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfMTI4MHg3MjBwMzBmMzAwXzUwMDBrYnBzX2JwLmluZm8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBwNTBmMzAwXzEyMDAwa2Jwc19icC5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF8xOTIweDEwODBwNTBmMzAwXzEyMDAwa2Jwc19icC5pbmZvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMzg0MHgyMTYwcDYwZjMwMF82ODAwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfMzg0MHgyMTYwcDYwZjMwMF82ODAwMGticHNfYnAuaW5mbyIpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGdFbnYgPSBuZXcgQVZDVXRpbHNUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIEFMT0dWKCJUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FuZHJvaWQuYnAKc2ltaWxhcml0eSBpbmRleCA2MiUKY29weSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9BbmRyb2lkLmJwCmNvcHkgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BbmRyb2lkLmJwCmluZGV4IDY1NTQ5MWEuLjU5NGRhNTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQW5kcm9pZC5icApAQCAtMTQsMzMgKzE0LDQ5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2xpY2Vuc2UiLAorICAgIF0sCit9CisKIGNjX3Rlc3QgewotICAgIG5hbWU6ICJNcGVnNEgyNjNEZWNvZGVyVGVzdCIsCisgICAgbmFtZTogIkFWQ1V0aWxzVW5pdFRlc3QiLAogICAgIGd0ZXN0OiB0cnVlLAogCiAgICAgc3JjczogWwotICAgICAgICAiTXBlZzRIMjYzRGVjb2RlclRlc3QuY3BwIiwKKyAgICAgICAgIkFWQ1V0aWxzVW5pdFRlc3QuY3BwIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCiAKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbiIsCisgICAgXSwKKwogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV2FsbCIsCiAgICAgXSwKIAogICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCi0gICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQW5kcm9pZFRlc3QueG1sCnNpbWlsYXJpdHkgaW5kZXggNjglCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCmNvcHkgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BbmRyb2lkVGVzdC54bWwKaW5kZXggN2ZmOTczMi4uNmEwODhhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FuZHJvaWRUZXN0LnhtbApAQCAtMTMsMTkgKzEzLDE5IEBACiAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIE1wMyBEZWNvZGVyIHVuaXQgdGVzdCI+Ci0gICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9Ik1wM0RlY29kZXJUZXN0IiAvPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgQVZDIFV0aWxzIHVuaXQgdGVzdHMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJBVkNVdGlsc1VuaXRUZXN0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9Ik1wM0RlY29kZXJUZXN0LT4vZGF0YS9sb2NhbC90bXAvTXAzRGVjb2RlclRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJBVkNVdGlsc1VuaXRUZXN0LT4vZGF0YS9sb2NhbC90bXAvQVZDVXRpbHNVbml0VGVzdCIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCi0gICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXAzZGVjL3Rlc3QvTXAzRGVjb2RlclRlc3QuemlwP3VuemlwPXRydWUiCi0gICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL01wM0RlY29kZXJUZXN0UmVzLyIgLz4KKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FWQ1V0aWxzVW5pdFRlc3QuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL0FWQ1V0aWxzVW5pdFRlc3QvIiAvPgogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogCiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJNcDNEZWNvZGVyVGVzdCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL01wM0RlY29kZXJUZXN0UmVzLyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IkFWQ1V0aWxzVW5pdFRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9BVkNVdGlsc1VuaXRUZXN0LyIgLz4KICAgICA8L3Rlc3Q+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOWQ3MmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL1JFQURNRS5tZApAQCAtMCwwICsxLDM5IEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgQVZDVXRpbHMgVGVzdAorVGhlIEFWQyBVdGlsaXR5IFVuaXQgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIGF2Y191dGlscyBsaWJyYXJpeSBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi4KKworUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6CitgYGAKK20gQVZDVXRpbHNVbml0VGVzdAorYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9BVkNVdGlsc1VuaXRUZXN0L0FWQ1V0aWxzVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9BVkNVdGlsc1VuaXRUZXN0L0FWQ1V0aWxzVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FWQ1V0aWxzVW5pdFRlc3QuemlwKS4gRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgorCitgYGAKK2FkYiBwdXNoIEFWQ1V0aWxzVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK3VzYWdlOiBBVkNVdGlsc1VuaXRUZXN0IC1QIFw8cGF0aF90b19mb2xkZXJcPgorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL0FWQ1V0aWxzVW5pdFRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL0FWQ1V0aWxzVW5pdFRlc3QvCitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IEFWQ1V0aWxzVW5pdFRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggZjIxNTdjOS4uODAxZTIxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQW5kcm9pZC5icApAQCAtMSwzICsxLDE0IEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2xpY2Vuc2UiLAorICAgIF0sCit9CisKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJzZl9mb3VuZGF0aW9uX3Rlc3QiLAogICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLApAQCAtMjUsMyArMzYsMzEgQEAKICAgICAgICAgIlV0aWxzX3Rlc3QuY3BwIiwKICAgICBdLAogfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiTWV0YURhdGFCYXNlVW5pdFRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiTWV0YURhdGFCYXNlVW5pdFRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL01ldGFEYXRhQmFzZVVuaXRUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvTWV0YURhdGFCYXNlVW5pdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZWQ0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL01ldGFEYXRhQmFzZVVuaXRUZXN0LmNwcApAQCAtMCwwICsxLDI4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisKK2NvbnN0ZXhwciBpbnQzMl90IGtXaWR0aDEgPSAxOTIwOworY29uc3RleHByIGludDMyX3Qga0hlaWdodDEgPSAxMDgwOworY29uc3RleHByIGludDMyX3Qga1dpZHRoMiA9IDEyODA7Citjb25zdGV4cHIgaW50MzJfdCBrSGVpZ2h0MiA9IDkyMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtXaWR0aDMgPSA3MjA7Citjb25zdGV4cHIgaW50MzJfdCBrSGVpZ2h0MyA9IDQ4MDsKK2NvbnN0ZXhwciBpbnQzMl90IGtQcm9maWxlID0gMTsKK2NvbnN0ZXhwciBpbnQzMl90IGtMZXZlbCA9IDE7Citjb25zdGV4cHIgaW50MzJfdCBrUGxhdGZvcm1WYWx1ZSA9IDE7CisKKy8vIFJlY3RhbmdsZSBtYXJnaW5zCitjb25zdGV4cHIgaW50MzJfdCBrTGVmdCA9IDEwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtUb3AgPSAxMDA7Citjb25zdGV4cHIgaW50MzJfdCBrUmlnaHQgPSAxMDA7Citjb25zdGV4cHIgaW50MzJfdCBrQm90dG9tID0gMTAwOworCitjb25zdGV4cHIgaW50NjRfdCBrRHVyYXRpb25VcyA9IDYwMDAwMDAwOworCitjb25zdGV4cHIgZmxvYXQga0NhcHR1cmVSYXRlID0gMzAuMDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZXRhRGF0YUJhc2VVbml0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3Qge307CisKK1RFU1RfRihNZXRhRGF0YUJhc2VVbml0VGVzdCwgQ3JlYXRlTWV0YURhdGFCYXNlVGVzdCkgeworICAgIE1ldGFEYXRhQmFzZSAqbWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCk7CisgICAgQVNTRVJUX05FKG1ldGFEYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhIGRhdGEiOworCisgICAgLy8gVGVzdGluZyBjb3B5IGNvbnN0cnVjdG9yCisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YUNvcHkgPSBtZXRhRGF0YTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGFDb3B5LCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhIGRhdGEgY29weSI7CisKKyAgICBkZWxldGUgbWV0YURhdGE7Cit9CisKK1RFU1RfRihNZXRhRGF0YUJhc2VVbml0VGVzdCwgU2V0QW5kRmluZERhdGFUZXN0KSB7CisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIG1ldGEgZGF0YSI7CisKKyAgICAvLyBTZXR0aW5nIHRoZSBkaWZmZXJlbnQga2V5LXZhbHVlIHBhaXIgdHlwZSBmb3IgZmlyc3QgdGltZSwgb3ZlcndyaXRlCisgICAgLy8gZXhwZWN0ZWQgdG8gYmUgZmFsc2UKKyAgICBib29sIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlNSU1FVHlwZSwgb3ZlcndyaXRlIGlzIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGtXaWR0aDEpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleVdpZHRoLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBrSGVpZ2h0MSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5SGVpZ2h0LCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5VmlkZW9Qcm9maWxlLCBrUHJvZmlsZSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5VmlkZW9Qcm9maWxlLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5VmlkZW9MZXZlbCwga0xldmVsKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlWaWRlb0xldmVsLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwga0R1cmF0aW9uVXMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleUR1cmF0aW9uLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEZsb2F0KGtLZXlDYXB0dXJlRnJhbWVyYXRlLCBrQ2FwdHVyZVJhdGUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleUNhcHR1cmVGcmFtZXJhdGUsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBjb25zdCBpbnQzMl90ICpwbGF0Zm9ybSA9ICZrUGxhdGZvcm1WYWx1ZTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0UG9pbnRlcihrS2V5UGxhdGZvcm1Qcml2YXRlLCAodm9pZCAqKXBsYXRmb3JtKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlQbGF0Zm9ybVByaXZhdGUsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0UmVjdChrS2V5Q3JvcFJlY3QsIGtMZWZ0LCBrVG9wLCBrUmlnaHQsIGtCb3R0b20pOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleUNyb3BSZWN0LCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgLy8gRHVtcCB0byBsb2cgZm9yIHJlZmVyZW5jZQorICAgIG1ldGFEYXRhLT5kdW1wVG9Mb2coKTsKKworICAgIC8vIEZpbmQgdGhlIGRhdGEgd2hpY2ggd2FzIHNldAorICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgImtLZXlNSU1FVHlwZSBrZXkgZG9lcyBub3QgZXhpc3RzIGluIG1ldGFkYXRhIjsKKyAgICBBU1NFUlRfU1RSRVEobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSA8PCAiSW5jb3JyZWN0IG1pbWUgdHlwZSByZXR1cm5lZCI7CisKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQsIHByb2ZpbGUsIGxldmVsOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgImtLZXlXaWR0aCBrZXkgZG9lcyBub3QgZXhpc3RzIGluIG1ldGFkYXRhIjsKKyAgICBBU1NFUlRfRVEod2lkdGgsIGtXaWR0aDEpIDw8ICJJbmNvcnJlY3QgdmFsdWUgb2Ygd2lkdGggcmV0dXJuZWQiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJrS2V5SGVpZ2h0IGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUShoZWlnaHQsIGtIZWlnaHQxKSA8PCAiSW5jb3JyZWN0IHZhbHVlIG9mIGhlaWdodCByZXR1cm5lZCI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsICZwcm9maWxlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJrS2V5VmlkZW9Qcm9maWxlIGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUShwcm9maWxlLCBrUHJvZmlsZSkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiBwcm9maWxlIHJldHVybmVkIjsKKworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVZpZGVvTGV2ZWwsICZsZXZlbCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleVZpZGVvTGV2ZWwga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGxldmVsLCBrTGV2ZWwpIDw8ICJJbmNvcnJlY3QgdmFsdWUgb2YgbGV2ZWwgcmV0dXJuZWQiOworCisgICAgaW50NjRfdCBkdXJhdGlvbjsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJrS2V5RHVyYXRpb24ga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGR1cmF0aW9uLCBrRHVyYXRpb25VcykgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiBkdXJhdGlvbiByZXR1cm5lZCI7CisKKyAgICBmbG9hdCBmcmFtZVJhdGU7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRGbG9hdChrS2V5Q2FwdHVyZUZyYW1lcmF0ZSwgJmZyYW1lUmF0ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleUNhcHR1cmVGcmFtZXJhdGUga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGZyYW1lUmF0ZSwga0NhcHR1cmVSYXRlKSA8PCAiSW5jb3JyZWN0IHZhbHVlIG9mIGNhcHR1cmVGcmFtZVJhdGUgcmV0dXJuZWQiOworCisgICAgaW50MzJfdCB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQ7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRSZWN0KGtLZXlDcm9wUmVjdCwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleUNyb3BSZWN0IGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUShsZWZ0LCBrTGVmdCkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiBsZWZ0IG1hcmdpbiByZXR1cm5lZCI7CisgICAgQVNTRVJUX0VRKHRvcCwga1RvcCkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiB0b3AgbWFyZ2luIHJldHVybmVkIjsKKyAgICBBU1NFUlRfRVEocmlnaHQsIGtSaWdodCkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiByaWdodCBtYXJnaW4gcmV0dXJuZWQiOworICAgIEFTU0VSVF9FUShib3R0b20sIGtCb3R0b20pIDw8ICJJbmNvcnJlY3QgdmFsdWUgb2YgYm90dG9tIG1hcmdpbiByZXR1cm5lZCI7CisKKyAgICB2b2lkICpwbGF0Zm9ybVZhbHVlOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kUG9pbnRlcihrS2V5UGxhdGZvcm1Qcml2YXRlLCAmcGxhdGZvcm1WYWx1ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleVBsYXRmb3JtUHJpdmF0ZSBrZXkgZG9lcyBub3QgZXhpc3RzIGluIG1ldGFkYXRhIjsKKyAgICBBU1NFUlRfRVEocGxhdGZvcm1WYWx1ZSwgJmtQbGF0Zm9ybVZhbHVlKSA8PCAiSW5jb3JyZWN0IHZhbHVlIG9mIHBvaW50ZXIgcmV0dXJuZWQiOworCisgICAgLy8gQ2hlY2sgZm9yIHRoZSBrZXkgd2hpY2ggaXMgbm90IGFkZGVkIHRvIG1ldGFkYXRhCisgICAgaW50MzJfdCBhbmdsZTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJmFuZ2xlKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiVmFsdWUgZm9yIGFuIGludmFsaWQga2V5IGlzIHJldHVybmVkIHdoZW4gdGhlIGtleSBpcyBub3Qgc2V0IjsKKworICAgIGRlbGV0ZSAobWV0YURhdGEpOworfQorCitURVNUX0YoTWV0YURhdGFCYXNlVW5pdFRlc3QsIE92ZXJXcml0ZUZ1bmN0aW9uYWxpdHlUZXN0KSB7CisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIG1ldGEgZGF0YSI7CisKKyAgICAvLyBzZXQvc2V0L3JlYWQgdG8gY2hlY2sgZmlyc3Qgb3ZlcndyaXRlIG9wZXJhdGlvbgorICAgIGJvb2wgc3RhdHVzID0gbWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleU1JTUVUeXBlLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIC8vIE92ZXJ3cml0ZSB0aGUgdmFsdWUKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIlNldHRpbmcga0tleU1JTUVUeXBlIGFnYWluLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgdHJ1ZSI7CisgICAgLy8gQ2hlY2sgdGhlIHZhbHVlCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleU1JTUVUeXBlIGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9TVFJFUShtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSA8PCAiTWltZSB2YWx1ZSBpcyBub3Qgb3ZlcndyaXR0ZW4iOworCisgICAgLy8gc2V0L3NldC9zZXQvcmVhZCB0byBjaGVjayBzZWNvbmQgb3ZlcndyaXRlIG9wZXJhdGlvbgorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGtXaWR0aDEpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleVdpZHRoLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBrSGVpZ2h0MSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5SGVpZ2h0LCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIC8vIE92ZXJ3cml0ZSB0aGUgdmFsdWUKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBrV2lkdGgyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJTZXR0aW5nIGtLZXlXaWR0aCBhZ2Fpbiwgb3ZlcndyaXRlIGlzIGV4cGVjdGVkIHRvIGJlIHRydWUiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBrSGVpZ2h0Mik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiU2V0dGluZyBrS2V5SGVpZ2h0IGFnYWluLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgdHJ1ZSI7CisgICAgLy8gT3ZlcndyaXRlIHRoZSB2YWx1ZSBhZ2FpbgorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGtXaWR0aDMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIlNldHRpbmcga0tleVdpZHRoIGFnYWluLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgdHJ1ZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGtIZWlnaHQzKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJTZXR0aW5nIGtLZXlIZWlnaHQgYWdhaW4sIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSB0cnVlIjsKKyAgICAvLyBDaGVjayB0aGUgdmFsdWUKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleVdpZHRoIGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUSh3aWR0aCwga1dpZHRoMykgPDwgIlZhbHVlIG9mIHdpZHRoIGlzIG5vdCBvdmVyd3JpdHRlbiI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgImtLZXlIZWlnaHQga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGhlaWdodCwga0hlaWdodDMpIDw8ICJWYWx1ZSBvZiBoZWlnaHQgaXMgbm90IG92ZXJ3cml0dGVuIjsKKworICAgIGRlbGV0ZSAobWV0YURhdGEpOworfQorCitURVNUX0YoTWV0YURhdGFCYXNlVW5pdFRlc3QsIFJlbW92ZUtleVRlc3QpIHsKKyAgICBNZXRhRGF0YUJhc2UgKm1ldGFEYXRhID0gbmV3IE1ldGFEYXRhQmFzZSgpOworICAgIEFTU0VSVF9ORShtZXRhRGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgbWV0YSBkYXRhIjsKKworICAgIGJvb2wgc3RhdHVzID0gbWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleU1JTUVUeXBlLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIC8vIFF1ZXJ5IHRoZSBrZXkKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+aGFzRGF0YShrS2V5TUlNRVR5cGUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIk1ldGFEYXRhIGRvZXMgbm90IGhhdmUgdGhlIG1pbWUga2V5IjsKKworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5yZW1vdmUoa0tleU1JTUVUeXBlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gcmVtb3ZlIHRoZSBrS2V5TUlNRVR5cGUga2V5IjsKKworICAgIC8vIFF1ZXJ5IHRoZSBrZXkKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+aGFzRGF0YShrS2V5TUlNRVR5cGUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJNZXRhRGF0YSBoYXMgbWltZSBrZXkgYWZ0ZXIgcmVtb3ZpbmcgaXQsIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIC8vIFJlbW92ZSB0aGUgbm9uIGV4aXN0aW5nIGtleQorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5yZW1vdmUoa0tleU1JTUVUeXBlKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiUmVtb3ZlZCB0aGUgbm9uIGV4aXN0aW5nIGtleSI7CisKKyAgICAvLyBDaGVjayBvdmVyd3JpdGluZyB0aGUgcmVtb3ZlZCBrZXkKKyAgICBtZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJPdmVyd3JpdGUgc2hvdWxkIGJlIGZhbHNlIHNpbmNlIHRoZSBrZXkgd2FzIHJlbW92ZWQiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlXaWR0aCwga1dpZHRoMSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5V2lkdGgsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICAvLyBDbGVhciB3aG9sZSBtZXRhZGF0YQorICAgIG1ldGFEYXRhLT5jbGVhcigpOworCisgICAgLy8gQ2hlY2sgZmluZGluZyBrZXkgYWZ0ZXIgY2xlYXJpbmcgdGhlIG1ldGFkYXRhCisgICAgaW50MzJfdCB3aWR0aDsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiTWV0YURhdGEgZm91bmQga0tleVdpZHRoIGtleSBhZnRlciBjbGVhcmluZyBhbGwgdGhlIGl0ZW1zIGluIGl0LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIC8vIFF1ZXJ5IHRoZSBrZXkKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+aGFzRGF0YShrS2V5V2lkdGgpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpCisgICAgICAgICAgICA8PCAiTWV0YURhdGEgaGFzIHdpZHRoIGtleSBhZnRlciBjbGVhcmluZyBhbGwgdGhlIGl0ZW1zIGluIGl0LCBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+aGFzRGF0YShrS2V5TUlNRVR5cGUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpCisgICAgICAgICAgICA8PCAiTWV0YURhdGEgaGFzIG1pbWUga2V5IGFmdGVyIGNsZWFyaW5nIGFsbCB0aGUgaXRlbXMgaW4gaXQsIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIC8vIENoZWNrIHJlbW92aW5nIGtleSBhZnRlciBjbGVhcmluZyB0aGUgbWV0YWRhdGEKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+cmVtb3ZlKGtLZXlNSU1FVHlwZSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIlJlbW92ZWQgdGhlIGtleSwgYWZ0ZXIgY2xlYXJpbmcgdGhlIG1ldGFkYXRhIjsKKworICAgIC8vIENoZWNraW5nIHNldCBhZnRlciBjbGVhcmluZyB0aGUgbWV0YWRhdGEKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBrV2lkdGgxKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiT3ZlcndyaXRlIHNob3VsZCBiZSBmYWxzZSBzaW5jZSB0aGUgbWV0YWRhdGEgd2FzIGNsZWFyZWQiOworCisgICAgbWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiT3ZlcndyaXRlIHNob3VsZCBiZSBmYWxzZSBzaW5jZSB0aGUgbWV0YWRhdGEgd2FzIGNsZWFyZWQiOworCisgICAgZGVsZXRlIChtZXRhRGF0YSk7Cit9CisKK1RFU1RfRihNZXRhRGF0YUJhc2VVbml0VGVzdCwgQ29udmVydFRvU3RyaW5nVGVzdCkgeworICAgIE1ldGFEYXRhQmFzZSAqbWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCk7CisgICAgQVNTRVJUX05FKG1ldGFEYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhIGRhdGEiOworCisgICAgU3RyaW5nOCBpbmZvID0gbWV0YURhdGEtPnRvU3RyaW5nKCk7CisgICAgQVNTRVJUX0VRKGluZm8ubGVuZ3RoKCksIDApIDw8ICJFbXB0eSBNZXRhRGF0YSBsZW5ndGggaXMgbm9uLXplcm86ICIgPDwgaW5mby5sZW5ndGgoKTsKKworICAgIGJvb2wgc3RhdHVzID0gbWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleU1JTUVUeXBlLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlXaWR0aCwga1dpZHRoMSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5V2lkdGgsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGtIZWlnaHQxKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlIZWlnaHQsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsIGtQcm9maWxlKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlWaWRlb1Byb2ZpbGUsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlWaWRlb0xldmVsLCBrTGV2ZWwpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleVZpZGVvTGV2ZWwsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBpbmZvID0gbWV0YURhdGEtPnRvU3RyaW5nKCk7CisgICAgQVNTRVJUX0dUKGluZm8ubGVuZ3RoKCksIDApIDw8ICJNZXRhRGF0YSBjb250YWlucyBubyBpbmZvcm1hdGlvbiI7CisKKyAgICAvLyBEdW1wIHRvIGxvZyBmb3IgcmVmZXJlbmNlCisgICAgbWV0YURhdGEtPmR1bXBUb0xvZygpOworCisgICAgLy8gQ2xlYXIgd2hvbGUgbWV0YWRhdGEKKyAgICBtZXRhRGF0YS0+Y2xlYXIoKTsKKworICAgIGluZm8gPSBtZXRhRGF0YS0+dG9TdHJpbmcoKTsKKyAgICBBU1NFUlRfRVEoaW5mby5sZW5ndGgoKSwgMCkgPDwgIk1ldGFEYXRhIGxlbmd0aCBpcyBub24temVybyBhZnRlciBjbGVhcmluZyBpdDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmZvLmxlbmd0aCgpOworCisgICAgZGVsZXRlIChtZXRhRGF0YSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9BbmRyb2lkLmJwCnNpbWlsYXJpdHkgaW5kZXggNjclCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9BbmRyb2lkLmJwCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvQW5kcm9pZC5icAppbmRleCA2NTU0OTFhLi42YzY0ZWYzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvQW5kcm9pZC5icApAQCAtMTQsMTIgKzE0LDIzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2xpY2Vuc2UiLAorICAgIF0sCit9CisKIGNjX3Rlc3QgewotICAgIG5hbWU6ICJNcGVnNEgyNjNEZWNvZGVyVGVzdCIsCisgICAgbmFtZTogIk9wdXNIZWFkZXJUZXN0IiwKICAgICBndGVzdDogdHJ1ZSwKIAogICAgIHNyY3M6IFsKLSAgICAgICAgIk1wZWc0SDI2M0RlY29kZXJUZXN0LmNwcCIsCisgICAgICAgICJPcHVzSGVhZGVyVGVzdC5jcHAiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtMjcsNyArMzgsNiBAQAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICBdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL0FuZHJvaWRUZXN0LnhtbApzaW1pbGFyaXR5IGluZGV4IDcxJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApjb3B5IHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9BbmRyb2lkVGVzdC54bWwKaW5kZXggN2ZmOTczMi4uYWZlZTE2YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvQW5kcm9pZFRlc3QueG1sCkBAIC0xMywxOSArMTMsMTkgQEAKICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgTXAzIERlY29kZXIgdW5pdCB0ZXN0Ij4KLSAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iTXAzRGVjb2RlclRlc3QiIC8+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBvcHVzIGhlYWRlciB1bml0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iT3B1c0hlYWRlclRlc3QiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iTXAzRGVjb2RlclRlc3QtPi9kYXRhL2xvY2FsL3RtcC9NcDNEZWNvZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iT3B1c0hlYWRlclRlc3QtPi9kYXRhL2xvY2FsL3RtcC9PcHVzSGVhZGVyVGVzdCIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCi0gICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXAzZGVjL3Rlc3QvTXAzRGVjb2RlclRlc3QuemlwP3VuemlwPXRydWUiCi0gICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL01wM0RlY29kZXJUZXN0UmVzLyIgLz4KKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvT3B1c0hlYWRlci56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvT3B1c0hlYWRlclRlc3RSZXMvIiAvPgogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogCiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJNcDNEZWNvZGVyVGVzdCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL01wM0RlY29kZXJUZXN0UmVzLyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9Ik9wdXNIZWFkZXJUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWZsYWciIHZhbHVlPSItUCAvZGF0YS9sb2NhbC90bXAvT3B1c0hlYWRlclRlc3RSZXMvIiAvPgogICAgIDwvdGVzdD4KLTwvY29uZmlndXJhdGlvbj4KKzwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvT3B1c0hlYWRlclRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL09wdXNIZWFkZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzljOTE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL09wdXNIZWFkZXJUZXN0LmNwcApAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiT3B1c0hlYWRlclRlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuaD4KKworI2luY2x1ZGUgIk9wdXNIZWFkZXJUZXN0RW52aXJvbm1lbnQuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKyNkZWZpbmUgT1VUUFVUX0ZJTEVfTkFNRSAiL2RhdGEvbG9jYWwvdG1wL09wdXNPdXRwdXQiCisKKy8vIE9wdXMgaW4gV2ViTSBpcyBhIHdlbGwta25vd24sIHlldCB1bmRlci1kb2N1bWVudGVkLCBmb3JtYXQuIFRoZSBjb2RlYyBwcml2YXRlIGRhdGEKKy8vIG9mIHRoZSB0cmFjayBpcyBhbiBPcHVzIE9nZyBoZWFkZXIgKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3ODQ1I3NlY3Rpb24tNS4xKQorLy8gY2hhbm5lbCBtYXBwaW5nIG9mZnNldCBpbiBvcHVzIGhlYWRlcgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCA9IDIxOworY29uc3RleHByIHNpemVfdCBrTWF4T3B1c0hlYWRlclNpemUgPSAxMDA7CisvLyBBT1BVU0hEUiArIEFPUFVTSERSTGVuZ3RoICsKKy8vICg4ICsgOCApICsKKy8vIEhlYWRlcihjc2QpICsgbnVtX3N0cmVhbXMgKyBudW1fY291cGxlZCArIDEKKy8vICgxOSArIDEgKyAxICsgMSkgKworLy8gQU9QVVNETFkgKyBBT1BVU0RMWUxlbmd0aCArIERFTEFZICsgQU9QVVNQUkwgKyBBT1BVU1BSTExlbmd0aCArIFBSTAorLy8gKDggKyA4ICsgOCArIDggKyA4ICsgOCkKKy8vID0gODYKK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJDaGFubmVsTWFwT2Zmc2V0ID0gODY7Citjb25zdGV4cHIgdWludDMyX3Qga09wdXNTYW1wbGVSYXRlID0gNDgwMDA7Citjb25zdGV4cHIgdWludDY0X3Qga09wdXNTZWVrUHJlcm9sbE5zID0gODAwMDAwMDA7Citjb25zdGV4cHIgaW50NjRfdCBrTnNlY1BlclNlYyA9IDEwMDAwMDAwMDBsbDsKKworLy8gT3B1cyB1c2VzIFZvcmJpcyBjaGFubmVsIG1hcHBpbmcsIGFuZCBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nIHNwZWNpZmllcworLy8gbWFwcGluZ3MgZm9yIHVwIHRvIDggY2hhbm5lbHMuIFRoaXMgaW5mb3JtYXRpb24gaXMgcGFydCBvZiB0aGUgVm9yYmlzIEkKKy8vIFNwZWNpZmljYXRpb246CisvLyBodHRwOi8vd3d3LnhpcGgub3JnL3ZvcmJpcy9kb2MvVm9yYmlzX0lfc3BlYy5odG1sCitjb25zdGV4cHIgaW50IGtNYXhDaGFubmVscyA9IDg7Citjb25zdGV4cHIgdWludDhfdCBrT3B1c0NoYW5uZWxNYXBba01heENoYW5uZWxzXVtrTWF4Q2hhbm5lbHNdID0geworICAgICAgICB7MH0sCisgICAgICAgIHswLCAxfSwKKyAgICAgICAgezAsIDIsIDF9LAorICAgICAgICB7MCwgMSwgMiwgM30sCisgICAgICAgIHswLCA0LCAxLCAyLCAzfSwKKyAgICAgICAgezAsIDQsIDEsIDIsIDMsIDV9LAorICAgICAgICB7MCwgNCwgMSwgMiwgMywgNSwgNn0sCisgICAgICAgIHswLCA2LCAxLCAyLCAzLCA0LCA1LCA3fSwKK307CisKK3N0YXRpYyBPcHVzSGVhZGVyVGVzdEVudmlyb25tZW50ICpnRW52ID0gbnVsbHB0cjsKKworY2xhc3MgT3B1c0hlYWRlclRlc3QgeworICBwdWJsaWM6CisgICAgT3B1c0hlYWRlclRlc3QoKSA6IG1JbnB1dEJ1ZmZlcihudWxscHRyKSB7fQorCisgICAgfk9wdXNIZWFkZXJUZXN0KCkgeworICAgICAgICBpZiAobUVsZVN0cmVhbS5pc19vcGVuKCkpIG1FbGVTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlcikgeworICAgICAgICAgICAgZnJlZShtSW5wdXRCdWZmZXIpOworICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZnN0cmVhbSBtRWxlU3RyZWFtOworICAgIHVpbnQ4X3QgKm1JbnB1dEJ1ZmZlcjsKK307CisKK2NsYXNzIE9wdXNIZWFkZXJQYXJzZVRlc3QgOiBwdWJsaWMgT3B1c0hlYWRlclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlPHN0cmluZyAvKiBJbnB1dEZpbGVOYW1lICovLCBpbnQzMl90IC8qIENoYW5uZWxDb3VudCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLyogaXNIZWFkZXJWYWxpZCAqLywgYm9vbCAvKiBpc0NvZGVjRGVsYXlWYWxpZCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLyogaXNTZWVrUHJlUm9sbFZhbGlkICovLCBib29sIC8qIGlzSW5wdXRWYWxpZCAqLz4+IHsKK307CisKK2NsYXNzIE9wdXNIZWFkZXJXcml0ZVRlc3QKKyAgICA6IHB1YmxpYyBPcHVzSGVhZGVyVGVzdCwKKyAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGU8aW50MzJfdCAvKiBDaGFubmVsQ291bnQgKi8sIGludDMyX3QgLyogc2tpcFNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyAvKiByZWZlcmVuY2VGaWxlICovPj4ge307CisKK1RFU1RfUChPcHVzSGVhZGVyV3JpdGVUZXN0LCBXcml0ZVRlc3QpIHsKKyAgICB0dXBsZTxpbnQzMl90LCBpbnQzMl90LCBzdHJpbmc+IHBhcmFtcyA9IEdldFBhcmFtKCk7CisgICAgT3B1c0hlYWRlciB3cml0dGVuSGVhZGVyOworICAgIG1lbXNldCgmd3JpdHRlbkhlYWRlciwgMCwgc2l6ZW9mKHdyaXR0ZW5IZWFkZXIpKTsKKyAgICBpbnQzMl90IGNoYW5uZWxzID0gZ2V0PDA+KHBhcmFtcyk7CisgICAgd3JpdHRlbkhlYWRlci5jaGFubmVscyA9IGNoYW5uZWxzOworICAgIHdyaXR0ZW5IZWFkZXIubnVtX3N0cmVhbXMgPSBjaGFubmVsczsKKyAgICB3cml0dGVuSGVhZGVyLmNoYW5uZWxfbWFwcGluZyA9ICgoY2hhbm5lbHMgPiA4KSA/IDI1NSA6IChjaGFubmVscyA+IDIpKTsKKyAgICBpbnQzMl90IHNraXBTYW1wbGVzID0gZ2V0PDE+KHBhcmFtcyk7CisgICAgc3RyaW5nIHJlZmVyZW5jZUZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8Mj4ocGFyYW1zKTsKKyAgICB3cml0dGVuSGVhZGVyLnNraXBfc2FtcGxlcyA9IHNraXBTYW1wbGVzOworICAgIHVpbnQ2NF90IGNvZGVjRGVsYXlOcyA9IHNraXBTYW1wbGVzICoga05zZWNQZXJTZWMgLyBrT3B1c1NhbXBsZVJhdGU7CisgICAgdWludDhfdCBoZWFkZXJEYXRhW2tNYXhPcHVzSGVhZGVyU2l6ZV07CisgICAgaW50MzJfdCBoZWFkZXJTaXplID0gV3JpdGVPcHVzSGVhZGVycyh3cml0dGVuSGVhZGVyLCBrT3B1c1NhbXBsZVJhdGUsIGhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGVhZGVyRGF0YSksIGNvZGVjRGVsYXlOcywga09wdXNTZWVrUHJlcm9sbE5zKTsKKyAgICBBU1NFUlRfR1QoaGVhZGVyU2l6ZSwgMCkgPDwgImZhaWxlZCB0byBnZW5lcmF0ZSBPcHVzIGhlYWRlciI7CisgICAgQVNTRVJUX0xFKGhlYWRlclNpemUsIGtNYXhPcHVzSGVhZGVyU2l6ZSkKKyAgICAgICAgICAgIDw8ICJJbnZhbGlkIGhlYWRlciB3cml0dGVuLiBIZWFkZXIgc2l6ZSBjYW4ndCBleGNlZWQga01heE9wdXNIZWFkZXJTaXplIjsKKworICAgIG9mc3RyZWFtIG9zdHJtOworICAgIG9zdHJtLm9wZW4oT1VUUFVUX0ZJTEVfTkFNRSwgb2ZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX1RSVUUob3N0cm0uaXNfb3BlbigpKSA8PCAiRmFpbGVkIHRvIG9wZW4gb3V0cHV0IGZpbGUgIiA8PCBPVVRQVVRfRklMRV9OQU1FOworICAgIG9zdHJtLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihoZWFkZXJEYXRhKSwgaGVhZGVyU2l6ZSk7CisgICAgb3N0cm0uY2xvc2UoKTsKKworICAgIG1FbGVTdHJlYW0ub3BlbihyZWZlcmVuY2VGaWxlTmFtZSwgaWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKSA8PCAiRmFpbGVkIHRvIG9wZW4gcmVmZXJlbmNlRmlsZU5hbWUgIiA8PCBnZXQ8Mj4ocGFyYW1zKTsKKworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICBpbnQzMl90IHN0YXRTdGF0dXMgPSBzdGF0KHJlZmVyZW5jZUZpbGVOYW1lLmNfc3RyKCksICZidWYpOworICAgIEFTU0VSVF9FUShzdGF0U3RhdHVzLCAwKSA8PCAiVW5hYmxlIHRvIGdldCBmaWxlIHByb3BlcnRpZXMiOworCisgICAgc2l6ZV90IGZpbGVTaXplID0gYnVmLnN0X3NpemU7CisgICAgbUlucHV0QnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2MoZmlsZVNpemUpOworICAgIEFTU0VSVF9ORShtSW5wdXRCdWZmZXIsIG51bGxwdHIpIDw8ICJJbnN1ZmZpY2llbnQgbWVtb3J5LiBNYWxsb2MgZmFpbGVkIGZvciBzaXplICIgPDwgZmlsZVNpemU7CisKKyAgICBtRWxlU3RyZWFtLnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KG1JbnB1dEJ1ZmZlciksIGZpbGVTaXplKTsKKyAgICBBU1NFUlRfRVEobUVsZVN0cmVhbS5nY291bnQoKSwgZmlsZVNpemUpIDw8ICJtRWxlU3RyZWFtLmdjb3VudCgpICE9IGJ5dGVzQ291bnQiOworCisgICAgQVNTRVJUX0VRKGZpbGVTaXplLCBoZWFkZXJTaXplKQorICAgICAgICAgICAgPDwgIk1pc21hdGNoIGluIHNpemUgYmV0d2VlbiBoZWFkZXIgZ2VuZXJhdGVkIGFuZCByZWZlcmVuY2UgaGVhZGVyIjsKKyAgICBpbnQzMl90IG1hdGNoID0gbWVtY21wKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihtSW5wdXRCdWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KGhlYWRlckRhdGEpLCBmaWxlU2l6ZSk7CisgICAgQVNTRVJUX0VRKG1hdGNoLCAwKSA8PCAiT3B1cyBoZWFkZXIgZG9lcyBub3QgbWF0Y2ggcmVmZXJlbmNlIGZpbGU6ICIgPDwgcmVmZXJlbmNlRmlsZU5hbWU7CisKKyAgICBzaXplX3Qgb3B1c0hlYWRTaXplID0gMDsKKyAgICBzaXplX3QgY29kZWNEZWxheUJ1ZlNpemUgPSAwOworICAgIHNpemVfdCBzZWVrUHJlUm9sbEJ1ZlNpemUgPSAwOworICAgIHZvaWQgKm9wdXNIZWFkQnVmID0gbnVsbHB0cjsKKyAgICB2b2lkICpjb2RlY0RlbGF5QnVmID0gbnVsbHB0cjsKKyAgICB2b2lkICpzZWVrUHJlUm9sbEJ1ZiA9IG51bGxwdHI7CisgICAgYm9vbCBzdGF0dXMgPSBHZXRPcHVzSGVhZGVyQnVmZmVycyhoZWFkZXJEYXRhLCBoZWFkZXJTaXplLCAmb3B1c0hlYWRCdWYsICZvcHVzSGVhZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNEZWxheUJ1ZiwgJmNvZGVjRGVsYXlCdWZTaXplLCAmc2Vla1ByZVJvbGxCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vla1ByZVJvbGxCdWZTaXplKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJFbmNvdW50ZXJlZCBlcnJvciBpbiBHZXRPcHVzSGVhZGVyQnVmZmVycyI7CisKKyAgICB1aW50NjRfdCB2YWx1ZSA9ICooKHVpbnQ2NF90ICopY29kZWNEZWxheUJ1Zik7CisgICAgQVNTRVJUX0VRKHZhbHVlLCBjb2RlY0RlbGF5TnMpOworCisgICAgdmFsdWUgPSAqKCh1aW50NjRfdCAqKXNlZWtQcmVSb2xsQnVmKTsKKyAgICBBU1NFUlRfRVEodmFsdWUsIGtPcHVzU2Vla1ByZXJvbGxOcyk7CisKKyAgICBPcHVzSGVhZGVyIHBhcnNlZEhlYWRlcjsKKyAgICBzdGF0dXMgPSBQYXJzZU9wdXNIZWFkZXIoKHVpbnQ4X3QgKilvcHVzSGVhZEJ1Ziwgb3B1c0hlYWRTaXplLCAmcGFyc2VkSGVhZGVyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJFbmNvdW50ZXJlZCBlcnJvciB3aGlsZSBQYXJzaW5nIE9wdXMgSGVhZGVyLiI7CisKKyAgICBBU1NFUlRfRVEod3JpdHRlbkhlYWRlci5jaGFubmVscywgcGFyc2VkSGVhZGVyLmNoYW5uZWxzKQorICAgICAgICAgICAgPDwgIkludmFsaWQgaGVhZGVyIGdlbmVyYXRlZC4gTWlzbWF0Y2ggYmV0d2VlbiBjaGFubmVsIGNvdW50cyI7CisKKyAgICBBU1NFUlRfRVEod3JpdHRlbkhlYWRlci5za2lwX3NhbXBsZXMsIHBhcnNlZEhlYWRlci5za2lwX3NhbXBsZXMpCisgICAgICAgICAgICA8PCAiTWlzbWF0Y2ggYmV0d2VlbiBubyBvZiBza2lwU2FtcGxlcyB3cml0dGVuICIKKyAgICAgICAgICAgICAgICJhbmQgbm8gb2Ygc2tpcFNhbXBsZXMgZ290IGFmdGVyIHBhcnNpbmciOworCisgICAgQVNTRVJUX0VRKHdyaXR0ZW5IZWFkZXIuY2hhbm5lbF9tYXBwaW5nLCBwYXJzZWRIZWFkZXIuY2hhbm5lbF9tYXBwaW5nKQorICAgICAgICAgICAgPDwgIk1pc21hdGNoIGJldHdlZW4gY2hhbm5lbE1hcHBpbmcgd3JpdHRlbiAiCisgICAgICAgICAgICAgICAiYW5kIGNoYW5uZWxNYXBwaW5nIGdvdCBhZnRlciBwYXJzaW5nIjsKKworICAgIGlmIChwYXJzZWRIZWFkZXIuY2hhbm5lbF9tYXBwaW5nKSB7CisgICAgICAgIEFTU0VSVF9HVChwYXJzZWRIZWFkZXIuY2hhbm5lbHMsIDIpOworICAgICAgICBBU1NFUlRfRVEod3JpdHRlbkhlYWRlci5udW1fc3RyZWFtcywgcGFyc2VkSGVhZGVyLm51bV9zdHJlYW1zKQorICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIGhlYWRlciBnZW5lcmF0ZWQuIE1pc21hdGNoIGJldHdlZW4gY2hhbm5lbCBjb3VudHMiOworCisgICAgICAgIEFTU0VSVF9FUSh3cml0dGVuSGVhZGVyLm51bV9jb3VwbGVkLCBwYXJzZWRIZWFkZXIubnVtX2NvdXBsZWQpCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgaGVhZGVyIGdlbmVyYXRlZC4gTWlzbWF0Y2ggYmV0d2VlbiBjaGFubmVsIGNvdW50cyI7CisKKyAgICAgICAgQVNTRVJUX0VRKHBhcnNlZEhlYWRlci5udW1fY291cGxlZCArIHBhcnNlZEhlYWRlci5udW1fc3RyZWFtcywgcGFyc2VkSGVhZGVyLmNoYW5uZWxzKTsKKworICAgICAgICBBU1NFUlRfTEUocGFyc2VkSGVhZGVyLm51bV9jb3VwbGVkLCBwYXJzZWRIZWFkZXIubnVtX3N0cmVhbXMpCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgaGVhZGVyIGdlbmVyYXRlZC4gTnVtYmVyIG9mIGNvdXBsZWQgc3RyZWFtcyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuICIKKyAgICAgICAgICAgICAgICAgICAibnVtYmVyICIKKyAgICAgICAgICAgICAgICAgICAib2Ygc3RyZWFtcy4iOworCisgICAgICAgIEFTU0VSVF9FUShoZWFkZXJTaXplLCBrT3B1c0hlYWRlckNoYW5uZWxNYXBPZmZzZXQgKyB3cml0dGVuSGVhZGVyLmNoYW5uZWxzKQorICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIGhlYWRlciB3cml0dGVuLiBIZWFkZXIgc2l6ZSBzaG91bGQgYmUgZXF1YWwgdG8gODYgKyAiCisgICAgICAgICAgICAgICAgICAgIndyaXR0ZW5IZWFkZXIuY2hhbm5lbHMiOworCisgICAgICAgIHVpbnQ4X3QgbWFwcGVkQ2hhbm5lbE51bWJlcjsKKyAgICAgICAgZm9yIChpbnQzMl90IGNoYW5uZWxOdW1iZXIgPSAwOyBjaGFubmVsTnVtYmVyIDwgY2hhbm5lbHM7IGNoYW5uZWxOdW1iZXIrKykgeworICAgICAgICAgICAgbWFwcGVkQ2hhbm5lbE51bWJlciA9ICoocmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KG9wdXNIZWFkQnVmKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGNoYW5uZWxOdW1iZXIpOworICAgICAgICAgICAgQVNTRVJUX0xUKG1hcHBlZENoYW5uZWxOdW1iZXIsIGNoYW5uZWxzKSA8PCAiSW52YWxpZCBoZWFkZXIgZ2VuZXJhdGVkLiBDaGFubmVsIG1hcHBpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBjaGFubmVsIGNvdW50LiI7CisKKyAgICAgICAgICAgIEFTU0VSVF9FUShtYXBwZWRDaGFubmVsTnVtYmVyLCBrT3B1c0NoYW5uZWxNYXBbY2hhbm5lbHMgLSAxXVtjaGFubmVsTnVtYmVyXSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgaGVhZGVyIGdlbmVyYXRlZC4gQ2hhbm5lbCBtYXBwaW5nIGlzIG5vdCBhcyBwZXIgc3BlY2lmaWNhdGlvbi4iOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX0xFKHBhcnNlZEhlYWRlci5jaGFubmVscywgMik7CisgICAgfQorfQorCitURVNUX1AoT3B1c0hlYWRlclBhcnNlVGVzdCwgUGFyc2VUZXN0KSB7CisgICAgdHVwbGU8c3RyaW5nLCBpbnQzMl90LCBib29sLCBib29sLCBib29sLCBib29sPiBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MD4ocGFyYW1zKTsKKyAgICBtRWxlU3RyZWFtLm9wZW4oaW5wdXRGaWxlTmFtZSwgaWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKSA8PCAiRmFpbGVkIHRvIG9wZW4gaW5wdXRmaWxlICIgPDwgZ2V0PDA+KHBhcmFtcyk7CisgICAgYm9vbCBpc0hlYWRlclZhbGlkID0gZ2V0PDI+KHBhcmFtcyk7CisgICAgYm9vbCBpc0NvZGVjRGVsYXlWYWxpZCA9IGdldDwzPihwYXJhbXMpOworICAgIGJvb2wgaXNTZWVrUHJlUm9sbFZhbGlkID0gZ2V0PDQ+KHBhcmFtcyk7CisgICAgYm9vbCBpc0lucHV0VmFsaWQgPSBnZXQ8NT4ocGFyYW1zKTsKKworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICBzdGF0KGlucHV0RmlsZU5hbWUuY19zdHIoKSwgJmJ1Zik7CisgICAgc2l6ZV90IGZpbGVTaXplID0gYnVmLnN0X3NpemU7CisgICAgbUlucHV0QnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2MoZmlsZVNpemUpOworICAgIEFTU0VSVF9ORShtSW5wdXRCdWZmZXIsIG51bGxwdHIpIDw8ICJJbnN1ZmZpY2llbnQgbWVtb3J5LiBNYWxsb2MgZmFpbGVkIGZvciBzaXplICIgPDwgZmlsZVNpemU7CisKKyAgICBtRWxlU3RyZWFtLnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KG1JbnB1dEJ1ZmZlciksIGZpbGVTaXplKTsKKyAgICBBU1NFUlRfRVEobUVsZVN0cmVhbS5nY291bnQoKSwgZmlsZVNpemUpIDw8ICJtRWxlU3RyZWFtLmdjb3VudCgpICE9IGJ5dGVzQ291bnQiOworCisgICAgT3B1c0hlYWRlciBoZWFkZXI7CisgICAgc2l6ZV90IG9wdXNIZWFkU2l6ZSA9IDA7CisgICAgc2l6ZV90IGNvZGVjRGVsYXlCdWZTaXplID0gMDsKKyAgICBzaXplX3Qgc2Vla1ByZVJvbGxCdWZTaXplID0gMDsKKyAgICB2b2lkICpvcHVzSGVhZEJ1ZiA9IG51bGxwdHI7CisgICAgdm9pZCAqY29kZWNEZWxheUJ1ZiA9IG51bGxwdHI7CisgICAgdm9pZCAqc2Vla1ByZVJvbGxCdWYgPSBudWxscHRyOworICAgIGJvb2wgc3RhdHVzID0gR2V0T3B1c0hlYWRlckJ1ZmZlcnMobUlucHV0QnVmZmVyLCBmaWxlU2l6ZSwgJm9wdXNIZWFkQnVmLCAmb3B1c0hlYWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjRGVsYXlCdWYsICZjb2RlY0RlbGF5QnVmU2l6ZSwgJnNlZWtQcmVSb2xsQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlZWtQcmVSb2xsQnVmU2l6ZSk7CisgICAgaWYgKCFpc0hlYWRlclZhbGlkKSB7CisgICAgICAgIEFTU0VSVF9FUShvcHVzSGVhZEJ1ZiwgbnVsbHB0cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX05FKG9wdXNIZWFkQnVmLCBudWxscHRyKTsKKyAgICB9CisgICAgaWYgKCFpc0NvZGVjRGVsYXlWYWxpZCkgeworICAgICAgICBBU1NFUlRfRVEoY29kZWNEZWxheUJ1ZiwgbnVsbHB0cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX05FKGNvZGVjRGVsYXlCdWYsIG51bGxwdHIpOworICAgIH0KKyAgICBpZiAoIWlzU2Vla1ByZVJvbGxWYWxpZCkgeworICAgICAgICBBU1NFUlRfRVEoc2Vla1ByZVJvbGxCdWYsIG51bGxwdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9ORShzZWVrUHJlUm9sbEJ1ZiwgbnVsbHB0cik7CisgICAgfQorICAgIGlmICghc3RhdHVzKSB7CisgICAgICAgIEFTU0VSVF9GQUxTRShpc0lucHV0VmFsaWQpIDw8ICJHZXRPcHVzSGVhZGVyQnVmZmVycyBmYWlsZWQiOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RhdHVzID0gUGFyc2VPcHVzSGVhZGVyKCh1aW50OF90ICopb3B1c0hlYWRCdWYsIG9wdXNIZWFkU2l6ZSwgJmhlYWRlcik7CisKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGlzSW5wdXRWYWxpZCkgPDwgIlBhcnNlIG9wdXMgaGVhZGVyIGRpZG4ndCBmYWlsIGZvciBpbnZhbGlkIGlucHV0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfRkFMU0UoaXNJbnB1dFZhbGlkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3QgY2hhbm5lbHMgPSBnZXQ8MT4ocGFyYW1zKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLmNoYW5uZWxzLCBjaGFubmVscykgPDwgIlBhcnNlciByZXR1cm5lZCBpbnZhbGlkIGNoYW5uZWwgY291bnQiOworICAgIEFTU0VSVF9MRShoZWFkZXIuY2hhbm5lbHMsIGtNYXhDaGFubmVscyk7CisKKyAgICBBU1NFUlRfTEUoaGVhZGVyLm51bV9jb3VwbGVkLCBoZWFkZXIubnVtX3N0cmVhbXMpCisgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIgZ2VuZXJhdGVkLiBOdW1iZXIgb2YgY291cGxlZCBzdHJlYW1zIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gbnVtYmVyICIKKyAgICAgICAgICAgICAgICJvZiBzdHJlYW1zLiI7CisKKyAgICBBU1NFUlRfRVEoaGVhZGVyLm51bV9jb3VwbGVkICsgaGVhZGVyLm51bV9zdHJlYW1zLCBoZWFkZXIuY2hhbm5lbHMpOworCisgICAgaWYgKGhlYWRlci5jaGFubmVsX21hcHBpbmcpIHsKKyAgICAgICAgdWludDhfdCBtYXBwZWRDaGFubmVsTnVtYmVyOworICAgICAgICBmb3IgKGludDMyX3QgY2hhbm5lbE51bWJlciA9IDA7IGNoYW5uZWxOdW1iZXIgPCBjaGFubmVsczsgY2hhbm5lbE51bWJlcisrKSB7CisgICAgICAgICAgICBtYXBwZWRDaGFubmVsTnVtYmVyID0gKihyZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4ob3B1c0hlYWRCdWYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ICsgY2hhbm5lbE51bWJlcik7CisgICAgICAgICAgICBBU1NFUlRfTFQobWFwcGVkQ2hhbm5lbE51bWJlciwgY2hhbm5lbHMpCisgICAgICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIGhlYWRlci4gQ2hhbm5lbCBtYXBwaW5nIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gY2hhbm5lbCBjb3VudC4iOworCisgICAgICAgICAgICBBU1NFUlRfRVEobWFwcGVkQ2hhbm5lbE51bWJlciwga09wdXNDaGFubmVsTWFwW2NoYW5uZWxzIC0gMV1bY2hhbm5lbE51bWJlcl0pCisgICAgICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIGhlYWRlciBnZW5lcmF0ZWQuIENoYW5uZWwgbWFwcGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICJpcyBub3QgYXMgcGVyIHNwZWNpZmljYXRpb24uIjsKKyAgICAgICAgfQorICAgIH0KK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBPcHVzSGVhZGVyVGVzdEFsbCwgT3B1c0hlYWRlcldyaXRlVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgxLCAzMTIsICJvdXRwdXRfY2hhbm5lbHNfMXNraXBTYW1wbGVzXzMxMi5vcHVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoMiwgMzEyLCAib3V0cHV0X2NoYW5uZWxzXzJza2lwU2FtcGxlc18zMTIub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDUsIDMxMiwgIm91dHB1dF9jaGFubmVsc181c2tpcFNhbXBsZXNfMzEyLm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSg2LCAzMTIsICJvdXRwdXRfY2hhbm5lbHNfNnNraXBTYW1wbGVzXzMxMi5vcHVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoMSwgMCwgIm91dHB1dF9jaGFubmVsc18xc2tpcFNhbXBsZXNfMC5vcHVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoMiwgMCwgIm91dHB1dF9jaGFubmVsc18yc2tpcFNhbXBsZXNfMC5vcHVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoNSwgMCwgIm91dHB1dF9jaGFubmVsc181c2tpcFNhbXBsZXNfMC5vcHVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoNiwgMCwgIm91dHB1dF9jaGFubmVsc182c2tpcFNhbXBsZXNfMC5vcHVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoMSwgNjI0LCAib3V0cHV0X2NoYW5uZWxzXzFza2lwU2FtcGxlc182MjQub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDIsIDYyNCwgIm91dHB1dF9jaGFubmVsc18yc2tpcFNhbXBsZXNfNjI0Lm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSg1LCA2MjQsICJvdXRwdXRfY2hhbm5lbHNfNXNraXBTYW1wbGVzXzYyNC5vcHVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoNiwgNjI0LCAib3V0cHV0X2NoYW5uZWxzXzZza2lwU2FtcGxlc182MjQub3B1cyIpKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgT3B1c0hlYWRlclRlc3RBbGwsIE9wdXNIZWFkZXJQYXJzZVRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjJjaF92YWxpZF9zaXplODNCLm9wdXMiLCAyLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIzY2hfdmFsaWRfc2l6ZTg4Qi5vcHVzIiwgMywgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiNWNoX3ZhbGlkLm9wdXMiLCA1LCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjZjaF92YWxpZC5vcHVzIiwgNiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIxY2hfdmFsaWQub3B1cyIsIDEsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiMmNoX3ZhbGlkLm9wdXMiLCAyLCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF9pbnZhbGlkX3NpemUub3B1cyIsIDMsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIzY2hfaW52YWxpZF9zdHJlYW1zLm9wdXMiLCAzLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiNWNoX2ludmFsaWRfY2hhbm5lbG1hcHBpbmcub3B1cyIsIDUsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjVjaF9pbnZhbGlkX2NvdXBsZWRzdHJlYW1zLm9wdXMiLCA1LCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCI2Y2hfaW52YWxpZF9jaGFubmVsbWFwcGluZy5vcHVzIiwgNiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiOWNoX2ludmFsaWRfY2hhbm5lbHMub3B1cyIsIDksIHRydWUsIHRydWUsIHRydWUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIyY2hfaW52YWxpZF9oZWFkZXIub3B1cyIsIDIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIyY2hfaW52YWxpZF9oZWFkZXJsZW5ndGhfMTYub3B1cyIsIDIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIyY2hfaW52YWxpZF9oZWFkZXJsZW5ndGhfMjU2Lm9wdXMiLCAyLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiMmNoX2ludmFsaWRfc2l6ZS5vcHVzIiwgMiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF9pbnZhbGlkX2NoYW5uZWxtYXBwaW5nXzAub3B1cyIsIDMsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIzY2hfaW52YWxpZF9jb3VwbGVkc3RyZWFtcy5vcHVzIiwgMywgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF9pbnZhbGlkX2hlYWRlcmxlbmd0aC5vcHVzIiwgMywgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF9pbnZhbGlkX2hlYWRlclNpemUxLm9wdXMiLCAzLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfaGVhZGVyU2l6ZTIub3B1cyIsIDMsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIzY2hfaW52YWxpZF9oZWFkZXJTaXplMy5vcHVzIiwgMywgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF9pbnZhbGlkX25vZGVsYXkub3B1cyIsIDMsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIzY2hfaW52YWxpZF9ub3ByZXJvbGwub3B1cyIsIDMsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSkpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IE9wdXNIZWFkZXJUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIEFMT0dEKCJPcHVzIEhlYWRlciBUZXN0IFJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL09wdXNIZWFkZXJUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9PcHVzSGVhZGVyVGVzdEVudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxNjNjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9PcHVzSGVhZGVyVGVzdEVudmlyb25tZW50LmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19PUFVTX0hFQURFUl9URVNUX0VOVklST05NRU5UX0hfXworI2RlZmluZSBfX09QVVNfSEVBREVSX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIE9wdXNIZWFkZXJUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgIHB1YmxpYzoKKyAgICBPcHVzSGVhZGVyVGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSB7fQorCisgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisgICAgdm9pZCBzZXRSZXMoY29uc3QgY2hhciAqX3JlcykgeyByZXMgPSBfcmVzOyB9CisKKyAgICBjb25zdCBzdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJpbmcgcmVzOworfTsKKworaW50IE9wdXNIZWFkZXJUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJwYXRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdQJ30sIHswLCAwLCAwLCAwfX07CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJQOiIsIG9wdGlvbnMsICZpbmRleCk7CisgICAgICAgIGlmIChjID09IC0xKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnUCc6IHsKKyAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgorICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gX19PUFVTX0hFQURFUl9URVNUX0VOVklST05NRU5UX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYwYzgyNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9SRUFETUUubWQKQEAgLTAsMCArMSwzOSBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIE9wdXMgSGVhZGVyCitUaGUgT3B1c0hlYWRlciBUZXN0IFN1aXRlIHZhbGlkYXRlcyB0aGUgT1BVUyBoZWFkZXIgYXZhaWxhYmxlIGluIGxpYnN0YWdlZnJpZ2h0LgorCitSdW4gdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB0aGUgdGVzdCBzdWl0ZToKK2BgYAorbSBPcHVzSGVhZGVyVGVzdAorYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9PcHVzSGVhZGVyVGVzdC9PcHVzSGVhZGVyVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L09wdXNIZWFkZXJUZXN0L09wdXNIZWFkZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL09wdXNIZWFkZXIuemlwKS4gRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgorCitgYGAKK2FkYiBwdXNoIE9wdXNIZWFkZXIgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK3VzYWdlOiBPcHVzSGVhZGVyVGVzdCAtUCBcPHBhdGhfdG9fZm9sZGVyXD4KK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9PcHVzSGVhZGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvT3B1c0hlYWRlci8KK2BgYAorQWx0ZXJuYXRpdmVseSwgdGhlIHRlc3QgY2FuIGFsc28gYmUgcnVuIHVzaW5nIGF0ZXN0IGNvbW1hbmQuCisKK2BgYAorYXRlc3QgT3B1c0hlYWRlclRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL1R5cGVUcmFpdHNfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL1R5cGVUcmFpdHNfdGVzdC5jcHAKaW5kZXggMWUyMDQ5ZC4uZDUzODNkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9UeXBlVHJhaXRzX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvVHlwZVRyYWl0c190ZXN0LmNwcApAQCAtMzAsNyArMzAsNyBAQAogICAgIGVudW0gSUEgOiBpbnQzMl90IHsgfTsKIH07CiAKLS8vID09PT09PT09PT09IGJhc2ljIHNhbml0eSB0ZXN0cyBmb3IgdHlwZS1zdXBwb3J0IHRlbXBsYXRlcworLy8gPT09PT09PT09PT0gYmFzaWMgdGVzdHMgZm9yIHR5cGUtc3VwcG9ydCB0ZW1wbGF0ZXMKIFRFU1RfRihUeXBlVHJhaXRzVGVzdCwgU3RhdGljVGVzdHMpIHsKIAogICAgIC8vID09PT09PT09PT09PSBpc19pbnRlZ3JhbF9vcl9lbnVtCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvY29sb3J1dGlscy9BbmRyb2lkLmJwCnNpbWlsYXJpdHkgaW5kZXggNjUlCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZC5icApjb3B5IHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvY29sb3J1dGlscy9BbmRyb2lkLmJwCmluZGV4IDY1NTQ5MWEuLjVhMTdlNGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvY29sb3J1dGlscy9BbmRyb2lkLmJwCkBAIC0xNCwyMCArMTQsMzIgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fbGljZW5zZSIsCisgICAgXSwKK30KKwogY2NfdGVzdCB7Ci0gICAgbmFtZTogIk1wZWc0SDI2M0RlY29kZXJUZXN0IiwKKyAgICBuYW1lOiAiQ29sb3JVdGlsc1Rlc3QiLAogICAgIGd0ZXN0OiB0cnVlLAogCiAgICAgc3JjczogWwotICAgICAgICAiTXBlZzRIMjYzRGVjb2RlclRlc3QuY3BwIiwKKyAgICAgICAgIkNvbG9yVXRpbHNUZXN0LmNwcCIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICBdLAogCkBAIC0zNywxMCArNDksMTAgQEAKICAgICBdLAogCiAgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKLSAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL2NvbG9ydXRpbHMvQ29sb3JVdGlsc1Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9jb2xvcnV0aWxzL0NvbG9yVXRpbHNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDgwMmI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9jb2xvcnV0aWxzL0NvbG9yVXRpbHNUZXN0LmNwcApAQCAtMCwwICsxLDc3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29sb3JVdGlsc1Rlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorCitjb25zdCBzaXplX3Qga0hEUkJ1ZmZlclNpemUgPSAyNTsKK2NvbnN0IHVpbnQxNl90IGtIRFJJbmZvVGVzdFZhbHVlMSA9IDQyMDsKK2NvbnN0IHVpbnQxNl90IGtIRFJJbmZvVGVzdFZhbHVlMiA9IDQyMDY5OworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKwordHlwZWRlZiBDb2xvckFzcGVjdHMgQ0E7CisKK2NsYXNzIENvbG9yUmFuZ2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTwvKiBDb2xvclJhbmdlICovIENBOjpSYW5nZT4geworICBwdWJsaWM6CisgICAgQ29sb3JSYW5nZVRlc3QoKSB7IG1SYW5nZSA9IEdldFBhcmFtKCk7IH07CisKKyAgICBDQTo6UmFuZ2UgbVJhbmdlOworfTsKKworY2xhc3MgQ29sb3JUcmFuc2ZlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPC8qIENvbG9yVHJhbnNmZXIgKi8gQ0E6OlRyYW5zZmVyPiB7CisgIHB1YmxpYzoKKyAgICBDb2xvclRyYW5zZmVyVGVzdCgpIHsgbVRyYW5zZmVyID0gR2V0UGFyYW0oKTsgfTsKKworICAgIENBOjpUcmFuc2ZlciBtVHJhbnNmZXI7Cit9OworCitjbGFzcyBDb2xvclN0YW5kYXJkVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RkOjpwYWlyPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByaW1hcmllcyAqLyBDQTo6UHJpbWFyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hdHJpeENvZWZmcyAqLyBDQTo6TWF0cml4Q29lZmZzPj4geworICBwdWJsaWM6CisgICAgQ29sb3JTdGFuZGFyZFRlc3QoKSB7CisgICAgICAgIG1QcmltYXJpZXMgPSBHZXRQYXJhbSgpLmZpcnN0OworICAgICAgICBtTWF0cml4Q29lZmZzID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgfTsKKworICAgIENBOjpQcmltYXJpZXMgbVByaW1hcmllczsKKyAgICBDQTo6TWF0cml4Q29lZmZzIG1NYXRyaXhDb2VmZnM7Cit9OworCitjbGFzcyBJc29Ub1BsYXRmb3JtQXNwZWN0c1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0ZDo6dHVwbGU8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByaW1hcmllcyAqLyBDQTo6UHJpbWFyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2ZlciAqLyBDQTo6VHJhbnNmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hdHJpeENvZWZmcyAqLyBDQTo6TWF0cml4Q29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGFuZGFyZCAqLyBpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2ZlciAqLyBpbnQzMl90Pj4geworICBwdWJsaWM6CisgICAgSXNvVG9QbGF0Zm9ybUFzcGVjdHNUZXN0KCkgeworICAgICAgICBtUHJpbWFyaWVzID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1UcmFuc2ZlciA9IHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOworICAgICAgICBtTWF0cml4Q29lZmZzID0gc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1QbGF0Zm9ybVN0YW5kYXJkID0gc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1QbGF0Zm9ybVRyYW5zZmVyID0gc3RkOjpnZXQ8ND4oR2V0UGFyYW0oKSk7CisgICAgfTsKKworICAgIENBOjpQcmltYXJpZXMgbVByaW1hcmllczsKKyAgICBDQTo6VHJhbnNmZXIgbVRyYW5zZmVyOworICAgIENBOjpNYXRyaXhDb2VmZnMgbU1hdHJpeENvZWZmczsKKyAgICBpbnQzMl90IG1QbGF0Zm9ybVN0YW5kYXJkOworICAgIGludDMyX3QgbVBsYXRmb3JtVHJhbnNmZXI7Cit9OworCitjbGFzcyBDb2xvckFzcGVjdHNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnR1cGxlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJpbWFyaWVzICovIENBOjpQcmltYXJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2xvclRyYW5zZmVyICovIENBOjpUcmFuc2ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hdHJpeENvZWZmcyAqLyBDQTo6TWF0cml4Q29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29sb3JSYW5nZSAqLyBDQTo6UmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2xvclN0YW5kYXJkICovIENBOjpTdGFuZGFyZD4+IHsKKyAgcHVibGljOgorICAgIENvbG9yQXNwZWN0c1Rlc3QoKSB7CisgICAgICAgIG1QcmltYXJpZXMgPSBzdGQ6OmdldDwwPihHZXRQYXJhbSgpKTsKKyAgICAgICAgbVRyYW5zZmVyID0gc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1NYXRyaXhDb2VmZnMgPSBzdGQ6OmdldDwyPihHZXRQYXJhbSgpKTsKKyAgICAgICAgbVJhbmdlID0gc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1TdGFuZGFyZCA9IHN0ZDo6Z2V0PDQ+KEdldFBhcmFtKCkpOworICAgIH07CisKKyAgICBDQTo6UHJpbWFyaWVzIG1QcmltYXJpZXM7CisgICAgQ0E6OlRyYW5zZmVyIG1UcmFuc2ZlcjsKKyAgICBDQTo6TWF0cml4Q29lZmZzIG1NYXRyaXhDb2VmZnM7CisgICAgQ0E6OlJhbmdlIG1SYW5nZTsKKyAgICBDQTo6U3RhbmRhcmQgbVN0YW5kYXJkOworfTsKKworY2xhc3MgRGVmYXVsdENvbG9yQXNwZWN0c1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0ZDo6dHVwbGU8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2lkdGggKi8gaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIZWlnaHQgKi8gaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcmltYXJpZXMgKi8gQ0E6OlByaW1hcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXRyaXhDb2VmZnMgKi8gQ0E6Ok1hdHJpeENvZWZmcz4+IHsKKyAgcHVibGljOgorICAgIERlZmF1bHRDb2xvckFzcGVjdHNUZXN0KCkgeworICAgICAgICBtV2lkdGggPSBzdGQ6OmdldDwwPihHZXRQYXJhbSgpKTsKKyAgICAgICAgbUhlaWdodCA9IHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOworICAgICAgICBtUHJpbWFyaWVzID0gc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1NYXRyaXhDb2VmZnMgPSBzdGQ6OmdldDwzPihHZXRQYXJhbSgpKTsKKyAgICB9OworCisgICAgaW50MzJfdCBtV2lkdGg7CisgICAgaW50MzJfdCBtSGVpZ2h0OworICAgIENBOjpQcmltYXJpZXMgbVByaW1hcmllczsKKyAgICBDQTo6TWF0cml4Q29lZmZzIG1NYXRyaXhDb2VmZnM7Cit9OworCitjbGFzcyBEYXRhU3BhY2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnR1cGxlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29sb3JSYW5nZSAqLyBDQTo6UmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcmltYXJpZXMgKi8gQ0E6OlByaW1hcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbG9yVHJhbnNmZXIgKi8gQ0E6OlRyYW5zZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF0cml4Q29lZmZzICovIENBOjpNYXRyaXhDb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2MF9hbmRyb2lkX2RhdGFzcGFjZSAqLyBhbmRyb2lkX2RhdGFzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZHJvaWRfZGF0YXNwYWNlICovIGFuZHJvaWRfZGF0YXNwYWNlPj4geworICBwdWJsaWM6CisgICAgRGF0YVNwYWNlVGVzdCgpIHsKKyAgICAgICAgbVJhbmdlID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1QcmltYXJpZXMgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKKyAgICAgICAgbVRyYW5zZmVyID0gc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1NYXRyaXhDb2VmZnMgPSBzdGQ6OmdldDwzPihHZXRQYXJhbSgpKTsKKyAgICAgICAgbURhdGFTcGFjZVYwID0gc3RkOjpnZXQ8ND4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1EYXRhU3BhY2UgPSBzdGQ6OmdldDw1PihHZXRQYXJhbSgpKTsKKyAgICB9OworCisgICAgQ0E6OlJhbmdlIG1SYW5nZTsKKyAgICBDQTo6UHJpbWFyaWVzIG1QcmltYXJpZXM7CisgICAgQ0E6OlRyYW5zZmVyIG1UcmFuc2ZlcjsKKyAgICBDQTo6TWF0cml4Q29lZmZzIG1NYXRyaXhDb2VmZnM7CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgbURhdGFTcGFjZVYwOworICAgIGFuZHJvaWRfZGF0YXNwYWNlIG1EYXRhU3BhY2U7Cit9OworCitURVNUX1AoQ29sb3JSYW5nZVRlc3QsIFdyYXBDb2xvclJhbmdlVGVzdCkgeworICAgIGludDMyX3QgcmFuZ2UgPSBDb2xvclV0aWxzOjp3cmFwQ29sb3JBc3BlY3RzSW50b0NvbG9yUmFuZ2UobVJhbmdlKTsKKyAgICBDQTo6UmFuZ2UgdW53cmFwcGVkUmFuZ2U7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gQ29sb3JVdGlsczo6dW53cmFwQ29sb3JBc3BlY3RzRnJvbUNvbG9yUmFuZ2UocmFuZ2UsICZ1bndyYXBwZWRSYW5nZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJ1bndyYXBwaW5nIENvbG9yQXNwZWN0cyBmcm9tIENvbG9yUmFuZ2UgZmFpbGVkIjsKKyAgICBFWFBFQ1RfRVEodW53cmFwcGVkUmFuZ2UsIG1SYW5nZSkgPDwgIlJldHVybmVkIENvbG9yUmFuZ2UgZG9lc24ndCBtYXRjaCI7CisgICAgQUxPR1YoInRvU3RyaW5nIHRlc3Q6IFJhbmdlOiAlcyIsIGFzU3RyaW5nKG1SYW5nZSwgImRlZmF1bHQiKSk7Cit9CisKK1RFU1RfUChDb2xvclRyYW5zZmVyVGVzdCwgV3JhcENvbG9yVHJhbnNmZXJUZXN0KSB7CisgICAgaW50MzJfdCB0cmFuc2ZlciA9IENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JUcmFuc2ZlcihtVHJhbnNmZXIpOworICAgIENBOjpUcmFuc2ZlciB1bndyYXBwZWRUcmFuc2ZlcjsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBDb2xvclV0aWxzOjp1bndyYXBDb2xvckFzcGVjdHNGcm9tQ29sb3JUcmFuc2Zlcih0cmFuc2ZlciwgJnVud3JhcHBlZFRyYW5zZmVyKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgInVud3JhcHBpbmcgQ29sb3JBc3BlY3RzIGZyb20gQ29sb3JUcmFuc2ZlciBmYWlsZWQiOworICAgIEVYUEVDVF9FUSh1bndyYXBwZWRUcmFuc2ZlciwgbVRyYW5zZmVyKSA8PCAiUmV0dXJuZWQgQ29sb3JUcmFuc2ZlciBkb2Vzbid0IG1hdGNoIjsKKyAgICBBTE9HVigidG9TdHJpbmcgdGVzdDogVHJhbnNmZXI6ICVzIiwgYXNTdHJpbmcobVRyYW5zZmVyLCAiZGVmYXVsdCIpKTsKK30KKworVEVTVF9QKENvbG9yU3RhbmRhcmRUZXN0LCBXcmFwQ29sb3JTdGFuZGFyZFRlc3QpIHsKKyAgICBpbnQzMl90IHN0YW5kYXJkID0gQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclN0YW5kYXJkKG1QcmltYXJpZXMsIG1NYXRyaXhDb2VmZnMpOworICAgIENBOjpQcmltYXJpZXMgdW53cmFwcGVkUHJpbWFyaWVzOworICAgIENBOjpNYXRyaXhDb2VmZnMgdW53cmFwcGVkTWF0cml4Q29lZmZzOworICAgIHN0YXR1c190IHN0YXR1cyA9IENvbG9yVXRpbHM6OnVud3JhcENvbG9yQXNwZWN0c0Zyb21Db2xvclN0YW5kYXJkKHN0YW5kYXJkLCAmdW53cmFwcGVkUHJpbWFyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1bndyYXBwZWRNYXRyaXhDb2VmZnMpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAidW53cmFwcGluZyBDb2xvckFzcGVjdHMgZnJvbSBDb2xvclN0YW5kYXJkIGZhaWxlZCI7CisgICAgRVhQRUNUX0VRKHVud3JhcHBlZFByaW1hcmllcywgbVByaW1hcmllcykgPDwgIlJldHVybmVkIHByaW1hcmllcyBkb2Vzbid0IG1hdGNoIjsKKyAgICBFWFBFQ1RfRVEodW53cmFwcGVkTWF0cml4Q29lZmZzLCBtTWF0cml4Q29lZmZzKSA8PCAiUmV0dXJuZWQgIG1hdHJpeENvZWZmcyBkb2Vzbid0IG1hdGNoIjsKK30KKworVEVTVF9QKENvbG9yQXNwZWN0c1Rlc3QsIFBsYXRmb3JtQXNwZWN0c1Rlc3QpIHsKKyAgICBDQSBhc3BlY3RzOworICAgIGFzcGVjdHMubVJhbmdlID0gbVJhbmdlOworICAgIGFzcGVjdHMubVByaW1hcmllcyA9IG1QcmltYXJpZXM7CisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBtVHJhbnNmZXI7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gbU1hdHJpeENvZWZmczsKKworICAgIGludDMyX3QgcmFuZ2UgPSAtMTsKKyAgICBpbnQzMl90IHN0YW5kYXJkID0gLTE7CisgICAgaW50MzJfdCB0cmFuc2ZlciA9IC0xOworICAgIHN0YXR1c190IHN0YXR1cyA9IENvbG9yVXRpbHM6OmNvbnZlcnRDb2RlY0NvbG9yQXNwZWN0c1RvUGxhdGZvcm1Bc3BlY3RzKGFzcGVjdHMsICZyYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhbmRhcmQsICZ0cmFuc2Zlcik7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJDb252ZXJzaW9uIG9mIENvbG9yQXNwZWN0cyB0byBQbGF0Zm9ybUFzcGVjdHMgZmFpbGVkIjsKKworICAgIENBIHJldHVybmVkQXNwZWN0czsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjpjb252ZXJ0UGxhdGZvcm1Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cyhyYW5nZSwgc3RhbmRhcmQsIHRyYW5zZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkQXNwZWN0cyk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJDb252ZXJzaW9uIG9mIFBsYXRmb3JtQXNwZWN0cyB0byBDb2xvckFzcGVjdHMgZmFpbGVkIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1SYW5nZSwgYXNwZWN0cy5tUmFuZ2UpCisgICAgICAgICAgICA8PCAicmFuZ2UgbWlzbWF0Y2ggZm9yIGNvbnZlcnNpb24gYmV0d2VlbiBQbGF0Zm9ybUFzcGVjdHMiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKQorICAgICAgICAgICAgPDwgInByaW1hcmllcyBtaXNtYXRjaCBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIFBsYXRmb3JtQXNwZWN0cyI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tVHJhbnNmZXIsIGFzcGVjdHMubVRyYW5zZmVyKQorICAgICAgICAgICAgPDwgInRyYW5zZmVyIG1pc21hdGNoIGZvciBjb252ZXJzaW9uIGJldHdlZW4gUGxhdGZvcm1Bc3BlY3RzIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1NYXRyaXhDb2VmZnMsIGFzcGVjdHMubU1hdHJpeENvZWZmcykKKyAgICAgICAgICAgIDw8ICJtYXRyaXhDb2VmZnMgbWlzbWF0Y2ggZm9yIGNvbnZlcnNpb24gYmV0d2VlbiBQbGF0Zm9ybUFzcGVjdHMiOworfQorCitURVNUX1AoQ29sb3JBc3BlY3RzVGVzdCwgSXNvQXNwZWN0c1Rlc3QpIHsKKyAgICBDQSBhc3BlY3RzOworICAgIGFzcGVjdHMubVJhbmdlID0gbVJhbmdlOworICAgIGFzcGVjdHMubVByaW1hcmllcyA9IG1QcmltYXJpZXM7CisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBtVHJhbnNmZXI7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gbU1hdHJpeENvZWZmczsKKworICAgIGludDMyX3QgcHJpbWFyaWVzID0gLTE7CisgICAgaW50MzJfdCBjb2xvclRyYW5zZmVyID0gLTE7CisgICAgaW50MzJfdCBtYXRyaXhDb2VmZnMgPSAtMTsKKyAgICBib29sIGZ1bGxSYW5nZSA9IGZhbHNlOworICAgIENvbG9yVXRpbHM6OmNvbnZlcnRDb2RlY0NvbG9yQXNwZWN0c1RvSXNvQXNwZWN0cyhhc3BlY3RzLCAmcHJpbWFyaWVzLCAmY29sb3JUcmFuc2ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hdHJpeENvZWZmcywgJmZ1bGxSYW5nZSk7CisKKyAgICBDQSByZXR1cm5lZEFzcGVjdHM7CisgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKHByaW1hcmllcywgY29sb3JUcmFuc2ZlciwgbWF0cml4Q29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsUmFuZ2UsIHJldHVybmVkQXNwZWN0cyk7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUmFuZ2UsIGFzcGVjdHMubVJhbmdlKQorICAgICAgICAgICAgPDwgInJhbmdlIG1pc21hdGNoIGZvciBjb252ZXJzaW9uIGJldHdlZW4gSXNvQXNwZWN0cyI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUHJpbWFyaWVzLCBhc3BlY3RzLm1QcmltYXJpZXMpCisgICAgICAgICAgICA8PCAicHJpbWFyaWVzIG1pc21hdGNoIGZvciBjb252ZXJzaW9uIGJldHdlZW4gSXNvQXNwZWN0cyI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tVHJhbnNmZXIsIGFzcGVjdHMubVRyYW5zZmVyKQorICAgICAgICAgICAgPDwgInRyYW5zZmVyIG1pc21hdGNoIGZvciBjb252ZXJzaW9uIGJldHdlZW4gSXNvQXNwZWN0cyI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tTWF0cml4Q29lZmZzLCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMpCisgICAgICAgICAgICA8PCAibWF0cml4Q29lZmZzIG1pc21hdGNoIGZvciBjb252ZXJzaW9uIGJldHdlZW4gSXNvQXNwZWN0cyI7Cit9CisKK1RFU1RfUChJc29Ub1BsYXRmb3JtQXNwZWN0c1Rlc3QsIElzb0FzcGVjdHNUb1BsYXRmb3JtQXNwZWN0c1Rlc3QpIHsKKyAgICBDQSBhc3BlY3RzOworICAgIGFzcGVjdHMubVByaW1hcmllcyA9IG1QcmltYXJpZXM7CisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBtVHJhbnNmZXI7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gbU1hdHJpeENvZWZmczsKKworICAgIGludDMyX3QgaXNvUHJpbWFyaWVzID0gLTE7CisgICAgaW50MzJfdCBpc29UcmFuc2ZlciA9IC0xOworICAgIGludDMyX3QgaXNvTWF0cml4Q29lZmZzID0gLTE7CisgICAgYm9vbCBmdWxscmFuZ2UgPSBmYWxzZTsKKyAgICBDb2xvclV0aWxzOjpjb252ZXJ0Q29kZWNDb2xvckFzcGVjdHNUb0lzb0FzcGVjdHMoYXNwZWN0cywgJmlzb1ByaW1hcmllcywgJmlzb1RyYW5zZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNvTWF0cml4Q29lZmZzLCAmZnVsbHJhbmdlKTsKKworICAgIGludDMyX3QgcmFuZ2UgPSAtMTsKKyAgICBpbnQzMl90IHN0YW5kYXJkID0gLTE7CisgICAgaW50MzJfdCB0cmFuc2ZlciA9IC0xOworICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cyhpc29QcmltYXJpZXMsIGlzb1RyYW5zZmVyLCBpc29NYXRyaXhDb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxyYW5nZSwgJnJhbmdlLCAmc3RhbmRhcmQsICZ0cmFuc2Zlcik7CisgICAgaWYgKGZ1bGxyYW5nZSkgeworICAgICAgICBFWFBFQ1RfRVEocmFuZ2UsIENvbG9yVXRpbHM6OmtDb2xvclJhbmdlRnVsbCkKKyAgICAgICAgICAgICAgICA8PCAicmFuZ2UgaW5jb3JyZWN0IGNvbnZlcnRpbmcgdG8gUGxhdGZvcm1Bc3BlY3RzIjsKKyAgICB9CisgICAgRVhQRUNUX0VRKHN0YW5kYXJkLCBtUGxhdGZvcm1TdGFuZGFyZCkgPDwgInN0YW5kYXJkIGluY29ycmVjdCBjb252ZXJ0aW5nIHRvIFBsYXRmb3JtQXNwZWN0cyI7CisgICAgRVhQRUNUX0VRKHRyYW5zZmVyLCBtUGxhdGZvcm1UcmFuc2ZlcikgPDwgInRyYW5zZmVyIGluY29ycmVjdCBjb252ZXJ0aW5nIHRvIFBsYXRmb3JtQXNwZWN0cyI7Cit9CisKK1RFU1RfUChDb2xvckFzcGVjdHNUZXN0LCBQYWNrQ29sb3JBc3BlY3RzVGVzdCkgeworICAgIENBIGFzcGVjdHM7CisgICAgYXNwZWN0cy5tUmFuZ2UgPSBtUmFuZ2U7CisgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gbVByaW1hcmllczsKKyAgICBhc3BlY3RzLm1UcmFuc2ZlciA9IG1UcmFuc2ZlcjsKKyAgICBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgPSBtTWF0cml4Q29lZmZzOworICAgIHVpbnQzMl90IHBhY2tlZENvbG9yQXNwZWN0cyA9IENvbG9yVXRpbHM6OnBhY2tUb1UzMihhc3BlY3RzKTsKKworICAgIENBIHVucGFja2VkQXNwZWN0cyA9IENvbG9yVXRpbHM6OnVucGFja1RvQ29sb3JBc3BlY3RzKHBhY2tlZENvbG9yQXNwZWN0cyk7CisgICAgRVhQRUNUX0VRKHVucGFja2VkQXNwZWN0cy5tUmFuZ2UsIG1SYW5nZSkgPDwgInJhbmdlIG1pc21hdGNoIGFmdGVyIHVucGFja2luZyI7CisgICAgRVhQRUNUX0VRKHVucGFja2VkQXNwZWN0cy5tUHJpbWFyaWVzLCBtUHJpbWFyaWVzKSA8PCAicHJpbWFyaWVzIG1pc21hdGNoIGFmdGVyIHVucGFja2luZyI7CisgICAgRVhQRUNUX0VRKHVucGFja2VkQXNwZWN0cy5tVHJhbnNmZXIsIG1UcmFuc2ZlcikgPDwgInRyYW5zZmVyIG1pc21hdGNoIGFmdGVyIHVucGFja2luZyI7CisgICAgRVhQRUNUX0VRKHVucGFja2VkQXNwZWN0cy5tTWF0cml4Q29lZmZzLCBtTWF0cml4Q29lZmZzKQorICAgICAgICAgICAgPDwgIm1hdHJpeENvZWZmcyBtaXNtYXRjaCBhZnRlciB1bnBhY2tpbmciOworICAgIEFMT0dWKCJ0b1N0cmluZyB0ZXN0OiBTdGFuZGFyZDogJXMiLCBhc1N0cmluZyhtU3RhbmRhcmQsICJkZWZhdWx0IikpOworfQorCitURVNUX1AoRGVmYXVsdENvbG9yQXNwZWN0c1Rlc3QsIERlZmF1bHRDb2xvckFzcGVjdHNUZXN0KSB7CisgICAgQ0EgYXNwZWN0czsKKyAgICBhc3BlY3RzLm1SYW5nZSA9IENBOjpSYW5nZVVuc3BlY2lmaWVkOworICAgIGFzcGVjdHMubVByaW1hcmllcyA9IENBOjpQcmltYXJpZXNVbnNwZWNpZmllZDsKKyAgICBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgPSBDQTo6TWF0cml4VW5zcGVjaWZpZWQ7CisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBDQTo6VHJhbnNmZXJVbnNwZWNpZmllZDsKKworICAgIENvbG9yVXRpbHM6OnNldERlZmF1bHRDb2RlY0NvbG9yQXNwZWN0c0lmTmVlZGVkKGFzcGVjdHMsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgRVhQRUNUX0VRKGFzcGVjdHMubVJhbmdlLCBDQTo6UmFuZ2VMaW1pdGVkKSA8PCAicmFuZ2Ugbm90IHNldCB0byBkZWZhdWx0IjsKKyAgICBFWFBFQ1RfRVEoYXNwZWN0cy5tUHJpbWFyaWVzLCBtUHJpbWFyaWVzKSA8PCAicHJpbWFyaWVzIG5vdCBzZXQgdG8gZGVmYXVsdCI7CisgICAgRVhQRUNUX0VRKGFzcGVjdHMubU1hdHJpeENvZWZmcywgbU1hdHJpeENvZWZmcykgPDwgIm1hdHJpeENvZWZmcyBub3Qgc2V0IHRvIGRlZmF1bHQiOworICAgIEVYUEVDVF9FUShhc3BlY3RzLm1UcmFuc2ZlciwgQ0E6OlRyYW5zZmVyU01QVEUxNzBNKSA8PCAidHJhbnNmZXIgbm90IHNldCB0byBkZWZhdWx0IjsKK30KKworVEVTVF9QKERhdGFTcGFjZVRlc3QsIERhdGFTcGFjZVRlc3QpIHsKKyAgICBDQSBhc3BlY3RzOworICAgIGFzcGVjdHMubVJhbmdlID0gbVJhbmdlOworICAgIGFzcGVjdHMubVByaW1hcmllcyA9IG1QcmltYXJpZXM7CisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBtVHJhbnNmZXI7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gbU1hdHJpeENvZWZmczsKKworICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSA9IENvbG9yVXRpbHM6OmdldERhdGFTcGFjZUZvckNvbG9yQXNwZWN0cyhhc3BlY3RzLCBmYWxzZSk7CisgICAgRVhQRUNUX0VRKGRhdGFTcGFjZSwgbURhdGFTcGFjZSkgPDwgIlJldHVybmVkIGluY29ycmVjdCBkYXRhc3BhY2UiOworCisgICAgYm9vbCBzdGF0dXMgPSBDb2xvclV0aWxzOjpjb252ZXJ0RGF0YVNwYWNlVG9WMChkYXRhU3BhY2UpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIlJldHVybmVkIHYwIGRhdGFzcGFjZSBpcyBub3QgYXNwZWN0LW9ubHkiOworICAgIEVYUEVDVF9FUShkYXRhU3BhY2UsIG1EYXRhU3BhY2VWMCkgPDwgIlJldHVybmVkIGluY29ycmVjdCB2MCBkYXRhc3BhY2UiOworfQorCitURVNUKENvbG9yVXRpbHNVbml0VGVzdCwgQXNwZWN0c0NoYW5nZWRUZXN0KSB7CisgICAgQ0Egb3JpZ0FzcGVjdHM7CisgICAgb3JpZ0FzcGVjdHMubVJhbmdlID0gQ0E6OlJhbmdlOjpSYW5nZUZ1bGw7CisgICAgb3JpZ0FzcGVjdHMubVByaW1hcmllcyA9IENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNzA5XzU7CisgICAgb3JpZ0FzcGVjdHMubVRyYW5zZmVyID0gQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhcjsKKyAgICBvcmlnQXNwZWN0cy5tTWF0cml4Q29lZmZzID0gQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ3MDlfNTsKKworICAgIENBIGFzcGVjdHM7CisgICAgYXNwZWN0cy5tUmFuZ2UgPSBDQTo6UmFuZ2U6OlJhbmdlRnVsbDsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDcwOV81OworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhcjsKKyAgICBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgPSBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDcwOV81OworCisgICAgYm9vbCBzdGF0dXMgPSBDb2xvclV0aWxzOjpjaGVja0lmQXNwZWN0c0NoYW5nZWRBbmRVbnNwZWNpZnlUaGVtKGFzcGVjdHMsIG9yaWdBc3BlY3RzKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiQ29sb3JBc3BlY3RzIGNvbXBhcmlzb24gY2hlY2sgZmFpbGVkIjsKKworICAgIGFzcGVjdHMubVJhbmdlID0gQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQ7CisgICAgc3RhdHVzID0gQ29sb3JVdGlsczo6Y2hlY2tJZkFzcGVjdHNDaGFuZ2VkQW5kVW5zcGVjaWZ5VGhlbShhc3BlY3RzLCBvcmlnQXNwZWN0cyk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiQ29sb3JBc3BlY3RzIGNvbXBhcmlzb24gY2hlY2sgZmFpbGVkIjsKKyAgICBFWFBFQ1RfRVEoYXNwZWN0cy5tUmFuZ2UsIENBOjpSYW5nZTo6UmFuZ2VVbnNwZWNpZmllZCkgPDwgInJhbmdlIHNob3VsZCBoYXZlIGJlZW4gdW5zcGVjaWZpZWQiOworICAgIGFzcGVjdHMubVJhbmdlID0gQ0E6OlJhbmdlOjpSYW5nZUZ1bGw7CisKKyAgICBhc3BlY3RzLm1UcmFuc2ZlciA9IENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTUkdCOworICAgIHN0YXR1cyA9IENvbG9yVXRpbHM6OmNoZWNrSWZBc3BlY3RzQ2hhbmdlZEFuZFVuc3BlY2lmeVRoZW0oYXNwZWN0cywgb3JpZ0FzcGVjdHMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkNvbG9yQXNwZWN0cyBjb21wYXJpc29uIGNoZWNrIGZhaWxlZCI7CisgICAgRVhQRUNUX0VRKGFzcGVjdHMubVRyYW5zZmVyLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyVW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAidHJhbnNmZXIgc2hvdWxkIGhhdmUgYmVlbiB1bnNwZWNpZmllZCI7CisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyOworCisgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQyMDIwOworICAgIHN0YXR1cyA9IENvbG9yVXRpbHM6OmNoZWNrSWZBc3BlY3RzQ2hhbmdlZEFuZFVuc3BlY2lmeVRoZW0oYXNwZWN0cywgb3JpZ0FzcGVjdHMsIHRydWUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkNvbG9yQXNwZWN0cyBjb21wYXJpc29uIGNoZWNrIGZhaWxlZCI7CisgICAgRVhQRUNUX0VRKGFzcGVjdHMubVByaW1hcmllcywgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzVW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAicHJpbWFyaWVzIHNob3VsZCBoYXZlIGJlZW4gdW5zcGVjaWZpZWQiOworICAgIEVYUEVDVF9FUShhc3BlY3RzLm1NYXRyaXhDb2VmZnMsIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeFVuc3BlY2lmaWVkKQorICAgICAgICAgICAgPDwgIm1hdHJpeENvZWZmcyBzaG91bGQgaGF2ZSBiZWVuIHVuc3BlY2lmaWVkIjsKKworICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeFNNUFRFMjQwTTsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjpjaGVja0lmQXNwZWN0c0NoYW5nZWRBbmRVbnNwZWNpZnlUaGVtKGFzcGVjdHMsIG9yaWdBc3BlY3RzLCB0cnVlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJDb2xvckFzcGVjdHMgY29tcGFyaXNvbiBjaGVjayBmYWlsZWQiOworICAgIEVYUEVDVF9FUShhc3BlY3RzLm1QcmltYXJpZXMsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc1Vuc3BlY2lmaWVkKQorICAgICAgICAgICAgPDwgInByaW1hcmllcyBzaG91bGQgaGF2ZSBiZWVuIHVuc3BlY2lmaWVkIjsKKyAgICBFWFBFQ1RfRVEoYXNwZWN0cy5tTWF0cml4Q29lZmZzLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJtYXRyaXhDb2VmZnMgc2hvdWxkIGhhdmUgYmVlbiB1bnNwZWNpZmllZCI7Cit9CisKK1RFU1QoQ29sb3JVdGlsc1VuaXRUZXN0LCBDb2xvckNvbmZpZ0Zyb21Gb3JtYXRUZXN0KSB7CisgICAgaW50IHJhbmdlID0gLTE7CisgICAgaW50IHN0YW5kYXJkID0gLTE7CisgICAgaW50IHRyYW5zZmVyID0gLTE7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgIEFTU0VSVF9ORShmb3JtYXQsIG51bGxwdHIpIDw8ICJmYWlsZWQgdG8gY3JlYXRlIEFNZXNzYWdlIjsKKyAgICBDb2xvclV0aWxzOjpnZXRDb2xvckNvbmZpZ0Zyb21Gb3JtYXQoZm9ybWF0LCAmcmFuZ2UsICZzdGFuZGFyZCwgJnRyYW5zZmVyKTsKKyAgICBFWFBFQ1RfRVEocmFuZ2UgfCBzdGFuZGFyZCB8IHRyYW5zZmVyLCAwKSA8PCAiY29sb3IgY29uZmlnIGRpZG4ndCBkZWZhdWx0IHRvIDAiOworCisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfUkFOR0UsIENBOjpSYW5nZTo6UmFuZ2VGdWxsKTsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9TVEFOREFSRCwgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZEJUNzA5KTsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhcik7CisgICAgQ29sb3JVdGlsczo6Z2V0Q29sb3JDb25maWdGcm9tRm9ybWF0KGZvcm1hdCwgJnJhbmdlLCAmc3RhbmRhcmQsICZ0cmFuc2Zlcik7CisgICAgRVhQRUNUX0VRKHJhbmdlLCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCkgPDwgInJhbmdlIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEoc3RhbmRhcmQsIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDcwOSkgPDwgInN0YW5kYXJkIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEodHJhbnNmZXIsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJMaW5lYXIpIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaCI7CisKKyAgICByYW5nZSA9IHN0YW5kYXJkID0gdHJhbnNmZXIgPSAtMTsKKyAgICBzcDxBTWVzc2FnZT4gY29weUZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgIEFTU0VSVF9ORShjb3B5Rm9ybWF0LCBudWxscHRyKSA8PCAiZmFpbGVkIHRvIGNyZWF0ZSBBTWVzc2FnZSI7CisgICAgQ29sb3JVdGlsczo6Y29weUNvbG9yQ29uZmlnKGZvcm1hdCwgY29weUZvcm1hdCk7CisgICAgYm9vbCBzdGF0dXMgPSBjb3B5Rm9ybWF0LT5maW5kSW50MzIoS0VZX0NPTE9SX1JBTkdFLCAmcmFuZ2UpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkNvbG9yQ29uZmlnIHJhbmdlIGVudHJ5IG1pc3NpbmciOworICAgIHN0YXR1cyA9IGNvcHlGb3JtYXQtPmZpbmRJbnQzMihLRVlfQ09MT1JfU1RBTkRBUkQsICZzdGFuZGFyZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiQ29sb3JDb25maWcgc3RhbmRhcmQgZW50cnkgbWlzc2luZyI7CisgICAgc3RhdHVzID0gY29weUZvcm1hdC0+ZmluZEludDMyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgJnRyYW5zZmVyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJDb2xvckNvbmZpZyB0cmFuc2ZlciBlbnRyeSBtaXNzaW5nIjsKKyAgICBFWFBFQ1RfRVEocmFuZ2UsIENBOjpSYW5nZTo6UmFuZ2VGdWxsKSA8PCAicmFuZ2UgbWlzbWF0Y2giOworICAgIEVYUEVDVF9FUShzdGFuZGFyZCwgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZEJUNzA5KSA8PCAic3RhbmRhcmQgbWlzbWF0Y2giOworICAgIEVYUEVDVF9FUSh0cmFuc2ZlciwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhcikgPDwgInRyYW5zZmVyIG1pc21hdGNoZCI7CisKKyAgICByYW5nZSA9IHN0YW5kYXJkID0gdHJhbnNmZXIgPSAtMTsKKyAgICBDb2xvclV0aWxzOjpnZXRDb2xvckNvbmZpZ0Zyb21Gb3JtYXQoY29weUZvcm1hdCwgJnJhbmdlLCAmc3RhbmRhcmQsICZ0cmFuc2Zlcik7CisgICAgRVhQRUNUX0VRKHJhbmdlLCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCkgPDwgInJhbmdlIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEoc3RhbmRhcmQsIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDcwOSkgPDwgInN0YW5kYXJkIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEodHJhbnNmZXIsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJMaW5lYXIpIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaCI7Cit9CisKK1RFU1RfUChDb2xvckFzcGVjdHNUZXN0LCBGb3JtYXRUZXN0KSB7CisgICAgQ0EgYXNwZWN0czsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisgICAgQVNTRVJUX05FKGZvcm1hdCwgbnVsbHB0cikgPDwgImZhaWxlZCB0byBjcmVhdGUgQU1lc3NhZ2UiOworICAgIENvbG9yVXRpbHM6OnNldENvbG9yQXNwZWN0c0ludG9Gb3JtYXQoYXNwZWN0cywgZm9ybWF0LCB0cnVlKTsKKworICAgIENBIHJldHVybmVkQXNwZWN0czsKKyAgICBDb2xvclV0aWxzOjpnZXRDb2xvckFzcGVjdHNGcm9tRm9ybWF0KGZvcm1hdCwgcmV0dXJuZWRBc3BlY3RzKTsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1SYW5nZSwgYXNwZWN0cy5tUmFuZ2UpIDw8ICJyYW5nZSBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUHJpbWFyaWVzLCBhc3BlY3RzLm1QcmltYXJpZXMpIDw8ICJwcmltYXJpZXMgbWlzbWF0Y2giOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVRyYW5zZmVyLCBhc3BlY3RzLm1UcmFuc2ZlcikgPDwgInRyYW5zZmVyIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1NYXRyaXhDb2VmZnMsIGFzcGVjdHMubU1hdHJpeENvZWZmcykgPDwgIm1hdHJpeENvZWZmcyBtaXNtYXRjaCI7CisKKyAgICBhc3BlY3RzLm1SYW5nZSA9IG1SYW5nZTsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBtUHJpbWFyaWVzOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gbVRyYW5zZmVyOworICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IG1NYXRyaXhDb2VmZnM7CisgICAgQ29sb3JVdGlsczo6c2V0Q29sb3JBc3BlY3RzSW50b0Zvcm1hdChhc3BlY3RzLCBmb3JtYXQpOworCisgICAgbWVtc2V0KCZyZXR1cm5lZEFzcGVjdHMsIDAsIHNpemVvZihyZXR1cm5lZEFzcGVjdHMpKTsKKyAgICBDb2xvclV0aWxzOjpnZXRDb2xvckFzcGVjdHNGcm9tRm9ybWF0KGZvcm1hdCwgcmV0dXJuZWRBc3BlY3RzKTsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1SYW5nZSwgYXNwZWN0cy5tUmFuZ2UpIDw8ICJyYW5nZSBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUHJpbWFyaWVzLCBhc3BlY3RzLm1QcmltYXJpZXMpIDw8ICJwcmltYXJpZXMgbWlzbWF0Y2giOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVRyYW5zZmVyLCBhc3BlY3RzLm1UcmFuc2ZlcikgPDwgInRyYW5zZmVyIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1NYXRyaXhDb2VmZnMsIGFzcGVjdHMubU1hdHJpeENvZWZmcykgPDwgIm1hdHJpeENvZWZmcyBtaXNtYXRjaCI7Cit9CisKK1RFU1QoQ29sb3JVdGlsc1VuaXRUZXN0LCBIRFJTdGF0aWNJbmZvVGVzdCkgeworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBBU1NFUlRfTkUoZm9ybWF0LCBudWxscHRyKSA8PCAiZmFpbGVkIHRvIGNyZWF0ZSBBTWVzc2FnZSI7CisKKyAgICBIRFJTdGF0aWNJbmZvIHJldHVybmVkSW5mb0hEUjsKKyAgICBib29sIHN0YXR1cyA9IENvbG9yVXRpbHM6OmdldEhEUlN0YXRpY0luZm9Gcm9tRm9ybWF0KGZvcm1hdCwgJnJldHVybmVkSW5mb0hEUik7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkhEUiBpbmZvIHNob3VsZCBiZSBhYnNlbnQgaW4gZW1wdHkgZm9ybWF0IjsKKworICAgIEhEUlN0YXRpY0luZm8gaW5mb0hEUjsKKyAgICBpbmZvSERSLnNUeXBlMS5tTWF4RGlzcGxheUx1bWluYW5jZSA9IGtIRFJJbmZvVGVzdFZhbHVlMjsKKyAgICBpbmZvSERSLnNUeXBlMS5tTWluRGlzcGxheUx1bWluYW5jZSA9IGtIRFJJbmZvVGVzdFZhbHVlMTsKKyAgICBpbmZvSERSLnNUeXBlMS5tTWF4Q29udGVudExpZ2h0TGV2ZWwgPSBrSERSSW5mb1Rlc3RWYWx1ZTI7CisgICAgaW5mb0hEUi5zVHlwZTEubU1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwgPSBrSERSSW5mb1Rlc3RWYWx1ZTE7CisgICAgaW5mb0hEUi5zVHlwZTEubVIueCA9IGtIRFJJbmZvVGVzdFZhbHVlMTsKKyAgICBpbmZvSERSLnNUeXBlMS5tUi55ID0ga0hEUkluZm9UZXN0VmFsdWUyOworICAgIGluZm9IRFIuc1R5cGUxLm1HLnggPSBrSERSSW5mb1Rlc3RWYWx1ZTE7CisgICAgaW5mb0hEUi5zVHlwZTEubUcueSA9IGtIRFJJbmZvVGVzdFZhbHVlMjsKKyAgICBpbmZvSERSLnNUeXBlMS5tQi54ID0ga0hEUkluZm9UZXN0VmFsdWUxOworICAgIGluZm9IRFIuc1R5cGUxLm1CLnkgPSBrSERSSW5mb1Rlc3RWYWx1ZTI7CisgICAgaW5mb0hEUi5zVHlwZTEubVcueCA9IGtIRFJJbmZvVGVzdFZhbHVlMTsKKyAgICBpbmZvSERSLnNUeXBlMS5tVy55ID0ga0hEUkluZm9UZXN0VmFsdWUyOworICAgIENvbG9yVXRpbHM6OnNldEhEUlN0YXRpY0luZm9JbnRvRm9ybWF0KGluZm9IRFIsIGZvcm1hdCk7CisKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjpnZXRIRFJTdGF0aWNJbmZvRnJvbUZvcm1hdChmb3JtYXQsICZyZXR1cm5lZEluZm9IRFIpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgSERSIGluZm8gZnJvbSBmb3JtYXQiOworICAgIEFTU0VSVF9FUSgwLCBtZW1jbXAoJnJldHVybmVkSW5mb0hEUiwgJmluZm9IRFIsIHNpemVvZihpbmZvSERSKSkpIDw8ICIgSERSU3RhdGljSW5mbyBtaXNtYXRjaCI7CisKKyAgICBBTWVkaWFGb3JtYXQgKm1lZGlhRm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIEFTU0VSVF9ORShtZWRpYUZvcm1hdCwgbnVsbHB0cikgPDwgIlVuYWJsZSB0byBjcmVhdGUgQU1lZGlhRm9ybWF0IjsKKyAgICBDb2xvclV0aWxzOjpzZXRIRFJTdGF0aWNJbmZvSW50b0FNZWRpYUZvcm1hdChpbmZvSERSLCBtZWRpYUZvcm1hdCk7CisgICAgbWVtc2V0KCZyZXR1cm5lZEluZm9IRFIsIDAsIHNpemVvZihyZXR1cm5lZEluZm9IRFIpKTsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjpnZXRIRFJTdGF0aWNJbmZvRnJvbUZvcm1hdChtZWRpYUZvcm1hdC0+bUZvcm1hdCwgJnJldHVybmVkSW5mb0hEUik7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtZWRpYUZvcm1hdCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCBIRFIgaW5mbyBmcm9tIG1lZGlhIGZvcm1hdCI7CisgICAgQVNTRVJUX0VRKDAsIG1lbWNtcCgmcmV0dXJuZWRJbmZvSERSLCAmaW5mb0hEUiwgc2l6ZW9mKGluZm9IRFIpKSkgPDwgIiBIRFJTdGF0aWNJbmZvIG1pc21hdGNoIjsKK30KKworVEVTVChDb2xvclV0aWxzVW5pdFRlc3QsIFNhbml0eVRlc3QpIHsKKyAgICBDQTo6UHJpbWFyaWVzIHVubWFwcGVkUHJpbWFyaWVzID0gKENBOjpQcmltYXJpZXMpKENBOjpQcmltYXJpZXM6OlByaW1hcmllc090aGVyICsgMSk7CisgICAgQ0E6Ok1hdHJpeENvZWZmcyB1bm1hcHBlZE1hdHJpeENvZWZmcyA9IChDQTo6TWF0cml4Q29lZmZzKShDQTo6TWF0cml4T3RoZXIgKyAxKTsKKyAgICBpbnQzMl90IGNvbG9yU3RhbmRhcmQgPQorICAgICAgICAgICAgQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclN0YW5kYXJkKHVubWFwcGVkUHJpbWFyaWVzLCBDQTo6TWF0cml4VW5zcGVjaWZpZWQpOworICAgIEVYUEVDVF9FUShjb2xvclN0YW5kYXJkLCBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZFVuc3BlY2lmaWVkKQorICAgICAgICAgICAgPDwgIlN0YW5kYXJkIHVuc3BlY2lmaWVkIGV4cGVjdGVkIjsKKyAgICBjb2xvclN0YW5kYXJkID0KKyAgICAgICAgICAgIENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JTdGFuZGFyZChDQTo6UHJpbWFyaWVzT3RoZXIsIHVubWFwcGVkTWF0cml4Q29lZmZzKTsKKyAgICBFWFBFQ1RfRVEoY29sb3JTdGFuZGFyZCwgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJTdGFuZGFyZCB1bnNwZWNpZmllZCBleHBlY3RlZCI7CisgICAgY29sb3JTdGFuZGFyZCA9IENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JTdGFuZGFyZChDQTo6UHJpbWFyaWVzQlQ2MDFfNl81MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4QlQyMDIwKTsKKyAgICBFWFBFQ1RfR0UoY29sb3JTdGFuZGFyZCwgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRFeHRlbmRlZFN0YXJ0KQorICAgICAgICAgICAgPDwgIlN0YW5kYXJkIGdyZWF0ZXIgdGhhbiBleHRlbmRlZCBzdGFydCBleHBlY3RlZCI7CisgICAgdW5tYXBwZWRQcmltYXJpZXMgPSAoQ0E6OlByaW1hcmllcykoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQyMDIwICsgMSk7CisgICAgdW5tYXBwZWRNYXRyaXhDb2VmZnMgPSAoQ0E6Ok1hdHJpeENvZWZmcykoQ0E6Ok1hdHJpeEJUMjAyMENvbnN0YW50ICsgMSk7CisgICAgY29sb3JTdGFuZGFyZCA9CisgICAgICAgICAgICBDb2xvclV0aWxzOjp3cmFwQ29sb3JBc3BlY3RzSW50b0NvbG9yU3RhbmRhcmQodW5tYXBwZWRQcmltYXJpZXMsIHVubWFwcGVkTWF0cml4Q29lZmZzKTsKKyAgICBFWFBFQ1RfR0UoY29sb3JTdGFuZGFyZCwgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRFeHRlbmRlZFN0YXJ0KQorICAgICAgICAgICAgPDwgIlN0YW5kYXJkIGdyZWF0ZXIgdGhhbiBleHRlbmRlZCBzdGFydCBleHBlY3RlZCI7CisKKyAgICBDQSBhc3BlY3RzOworICAgIGludDMyX3QgY29sb3JSYW5nZSA9IC0xOworICAgIGNvbG9yU3RhbmRhcmQgPSAtMTsKKyAgICBpbnQzMl90IGNvbG9yVHJhbnNmZXIgPSAtMTsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSAoQ0E6OlByaW1hcmllcykoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzT3RoZXIgKyAxKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBDb2xvclV0aWxzOjpjb252ZXJ0Q29kZWNDb2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cygKKyAgICAgICAgICAgIGFzcGVjdHMsICZjb2xvclJhbmdlLCAmY29sb3JTdGFuZGFyZCwgJmNvbG9yVHJhbnNmZXIpOworICAgIEVYUEVDVF9ORShzdGF0dXMsIE9LKSA8PCAiaW52YWxpZCBjb2xvckFzcGVjdHMgdmFsdWUgYWNjZXB0ZWQiOworCisgICAgaW50MzJfdCBjb2xvclByaW1hcmllcyA9IC0xOworICAgIGNvbG9yVHJhbnNmZXIgPSAtMTsKKyAgICBpbnQzMl90IGNvbG9yTWF0cml4Q29lZmZzID0gLTE7CisgICAgYm9vbCBmdWxsUmFuZ2UgPSBmYWxzZTsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBDQTo6UHJpbWFyaWVzT3RoZXI7CisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBDQTo6VHJhbnNmZXJPdGhlcjsKKyAgICBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgPSBDQTo6TWF0cml4T3RoZXI7CisgICAgQ29sb3JVdGlsczo6Y29udmVydENvZGVjQ29sb3JBc3BlY3RzVG9Jc29Bc3BlY3RzKGFzcGVjdHMsICZjb2xvclByaW1hcmllcywgJmNvbG9yVHJhbnNmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvck1hdHJpeENvZWZmcywgJmZ1bGxSYW5nZSk7CisgICAgQ0EgcmV0dXJuZWRBc3BlY3RzOworICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cyhjb2xvclByaW1hcmllcywgY29sb3JUcmFuc2ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JNYXRyaXhDb2VmZnMsIGZ1bGxSYW5nZSwgcmV0dXJuZWRBc3BlY3RzKTsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1QcmltYXJpZXMsIENBOjpQcmltYXJpZXNVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJleHBlY3RlZCB1bnNwZWNpZmllZCBQcmltYXJpZXMiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVRyYW5zZmVyLCBDQTo6VHJhbnNmZXJVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJleHBlY3RlZCB1bnNwZWNpZmllZCBUcmFuc2ZlciI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tTWF0cml4Q29lZmZzLCBDQTo6TWF0cml4VW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAiZXhwZWN0ZWQgdW5zcGVjaWZpZWQgTWF0cml4Q29lZmZzIjsKKworICAgIC8vIGludmFsaWQgdmFsdWVzLCBvdGhlciB2YWx1ZSBlcXVhbHMgMHhGRgorICAgIGNvbG9yUHJpbWFyaWVzID0gQ0E6OlByaW1hcmllc090aGVyOworICAgIGNvbG9yVHJhbnNmZXIgPSBDQTo6VHJhbnNmZXJPdGhlcjsKKyAgICBjb2xvck1hdHJpeENvZWZmcyA9IENBOjpNYXRyaXhPdGhlcjsKKyAgICBmdWxsUmFuZ2UgPSBmYWxzZTsKKyAgICBtZW1zZXQoJnJldHVybmVkQXNwZWN0cywgMCwgc2l6ZW9mKHJldHVybmVkQXNwZWN0cykpOworICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cyhjb2xvclByaW1hcmllcywgY29sb3JUcmFuc2ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JNYXRyaXhDb2VmZnMsIGZ1bGxSYW5nZSwgcmV0dXJuZWRBc3BlY3RzKTsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1QcmltYXJpZXMsIENBOjpQcmltYXJpZXNVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJleHBlY3RlZCB1bnNwZWNpZmllZCBQcmltYXJpZXMiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVRyYW5zZmVyLCBDQTo6VHJhbnNmZXJVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJleHBlY3RlZCB1bnNwZWNpZmllZCBUcmFuc2ZlciI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tTWF0cml4Q29lZmZzLCBDQTo6TWF0cml4VW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAiZXhwZWN0ZWQgdW5zcGVjaWZpZWQgTWF0cml4Q29lZmZzIjsKKworICAgIENBOjpQcmltYXJpZXMgcHJpbWFyaWVzID0gQ0E6OlByaW1hcmllc1Vuc3BlY2lmaWVkOworICAgIENBOjpNYXRyaXhDb2VmZnMgbWF0cml4Q29lZmZzID0gQ0E6Ok1hdHJpeFVuc3BlY2lmaWVkOworICAgIHN0YXR1cyA9IENvbG9yVXRpbHM6OnVud3JhcENvbG9yQXNwZWN0c0Zyb21Db2xvclN0YW5kYXJkKENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkVmVuZG9yU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByaW1hcmllcywgJm1hdHJpeENvZWZmcyk7CisgICAgRVhQRUNUX0VRKHN0YXR1cywgT0spIDw8ICJ1bndyYXBwaW5nIGFzcGVjdHMgZnJvbSBjb2xvciBzdGFuZGFyZCBmYWlsZWQiOworCisgICAgcHJpbWFyaWVzID0gQ0E6OlByaW1hcmllc1Vuc3BlY2lmaWVkOworICAgIG1hdHJpeENvZWZmcyA9IENBOjpNYXRyaXhVbnNwZWNpZmllZDsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjp1bndyYXBDb2xvckFzcGVjdHNGcm9tQ29sb3JTdGFuZGFyZCgKKyAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkVmVuZG9yU3RhcnQgKiA0LCAmcHJpbWFyaWVzLCAmbWF0cml4Q29lZmZzKTsKKyAgICBFWFBFQ1RfTkUoc3RhdHVzLCBPSykgPDwgInVud3JhcHBpbmcgYXNwZWN0cyBmcm9tIGNvbG9yIHN0YW5kYXJkIGZhaWxlZCI7CisKKyAgICBjb2xvclJhbmdlID0gQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclJhbmdlKChDQTo6UmFuZ2UpKENBOjpSYW5nZU90aGVyICsgMSkpOworICAgIEVYUEVDVF9FUShjb2xvclJhbmdlLCBDb2xvclV0aWxzOjprQ29sb3JSYW5nZVVuc3BlY2lmaWVkKSA8PCAiZXhwZWN0ZWQgdW5zcGVjaWZpZWQgY29sb3IgcmFuZ2UiOworCisgICAgQ0E6OlJhbmdlIHJhbmdlOworICAgIHN0YXR1cyA9IENvbG9yVXRpbHM6OnVud3JhcENvbG9yQXNwZWN0c0Zyb21Db2xvclJhbmdlKAorICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yUmFuZ2VWZW5kb3JTdGFydCArIENBOjpSYW5nZU90aGVyICsgMSwgJnJhbmdlKTsKKyAgICBFWFBFQ1RfTkUoc3RhdHVzLCBPSykgPDwgImludmFsaWQgcmFuZ2UgdmFsdWUgYWNjZXB0ZWQiOworICAgIEVYUEVDVF9FUShyYW5nZSwgQ0E6OlJhbmdlT3RoZXIpIDw8ICJyZXR1cm5lZCB1bmV4cGVjdGVkIHJhbmdlIHZhbHVlIjsKKworICAgIGNvbG9yVHJhbnNmZXIgPQorICAgICAgICAgICAgQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclRyYW5zZmVyKChDQTo6VHJhbnNmZXIpKENBOjpUcmFuc2Zlck90aGVyICsgMSkpOworICAgIEVYUEVDVF9FUShjb2xvclRyYW5zZmVyLCBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlclVuc3BlY2lmaWVkKQorICAgICAgICAgICAgPDwgImV4cGVjdGVkIHVuc3BlY2lmaWVkIGNvbG9yIHRyYW5zZmVyIjsKKworICAgIENBOjpUcmFuc2ZlciB0cmFuc2ZlcjsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjp1bndyYXBDb2xvckFzcGVjdHNGcm9tQ29sb3JUcmFuc2ZlcigKKyAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclRyYW5zZmVyVmVuZG9yU3RhcnQgKyBDQTo6VHJhbnNmZXJPdGhlciArIDEsICZ0cmFuc2Zlcik7CisgICAgRVhQRUNUX05FKHN0YXR1cywgT0spIDw8ICJpbnZhbGlkIHRyYW5zZmVyIHZhbHVlIGFjY2VwdGVkIjsKKyAgICBFWFBFQ1RfRVEodHJhbnNmZXIsIENBOjpUcmFuc2Zlck90aGVyKSA8PCAiZXhwZWN0ZWQgb3RoZXIgY29sb3IgdHJhbnNmZXIiOworfQorCitURVNUKENvbG9yVXRpbHNVbml0VGVzdCwgSERSSW5mb1Nhbml0eVRlc3QpIHsKKyAgICBIRFJTdGF0aWNJbmZvIGhkckluZm87CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgIEFTU0VSVF9ORShmb3JtYXQsIG51bGxwdHIpIDw8ICJmYWlsZWQgdG8gY3JlYXRlIEFNZXNzYWdlIjsKKworICAgIGJvb2wgYm9vbFN0YXR1cyA9IENvbG9yVXRpbHM6OmdldEhEUlN0YXRpY0luZm9Gcm9tRm9ybWF0KGZvcm1hdCwgJmhkckluZm8pOworICAgIEVYUEVDVF9GQUxTRShib29sU3RhdHVzKSA8PCAiSERSU3RhdGljSW5mbyBzaG91bGQgbm90IGJlIHByZXNlbnQiOworCisgICAgc3A8QUJ1ZmZlcj4gaW52YWxpZFNpemVIRFJJbmZvQnVmZmVyID0gbmV3IEFCdWZmZXIoa0hEUkJ1ZmZlclNpemUgLSAxKTsKKyAgICBBU1NFUlRfTkUoaW52YWxpZFNpemVIRFJJbmZvQnVmZmVyLCBudWxscHRyKSA8PCAiZmFpbGVkIHRvIGNyZWF0ZSBBQnVmZmVyIjsKKyAgICBmb3JtYXQtPnNldEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCBpbnZhbGlkU2l6ZUhEUkluZm9CdWZmZXIpOworICAgIG1lbXNldCgmaGRySW5mbywgMCwgc2l6ZW9mKGhkckluZm8pKTsKKyAgICBib29sU3RhdHVzID0gQ29sb3JVdGlsczo6Z2V0SERSU3RhdGljSW5mb0Zyb21Gb3JtYXQoZm9ybWF0LCAmaGRySW5mbyk7CisgICAgRVhQRUNUX0ZBTFNFKGJvb2xTdGF0dXMpIDw8ICJpbmNvcnJlY3QgSERSU3RhdGljSW5mbyBidWZmZXIgYWNjZXB0ZWQiOworCisgICAgc3A8QUJ1ZmZlcj4gaW52YWxpZEhEUkluZm9CdWZmZXIgPSBuZXcgQUJ1ZmZlcihrSERSQnVmZmVyU2l6ZSk7CisgICAgQVNTRVJUX05FKGludmFsaWRIRFJJbmZvQnVmZmVyLCBudWxscHRyKSA8PCAiZmFpbGVkIHRvIGNyZWF0ZSBBQnVmZmVyIjsKKyAgICB1aW50OF90ICpkYXRhID0gaW52YWxpZEhEUkluZm9CdWZmZXItPmRhdGEoKTsKKyAgICAqZGF0YSA9IEhEUlN0YXRpY0luZm86OmtUeXBlMSArIDE7CisgICAgZm9ybWF0LT5zZXRCdWZmZXIoS0VZX0hEUl9TVEFUSUNfSU5GTywgaW52YWxpZEhEUkluZm9CdWZmZXIpOworICAgIG1lbXNldCgmaGRySW5mbywgMCwgc2l6ZW9mKGhkckluZm8pKTsKKyAgICBib29sU3RhdHVzID0gQ29sb3JVdGlsczo6Z2V0SERSU3RhdGljSW5mb0Zyb21Gb3JtYXQoZm9ybWF0LCAmaGRySW5mbyk7CisgICAgRVhQRUNUX0ZBTFNFKGJvb2xTdGF0dXMpIDw8ICJpbmNvcnJlY3QgSERSU3RhdGljSW5mbyBidWZmZXIgYWNjZXB0ZWQiOworCisgICAgQ0EgYXNwZWN0czsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9SQU5HRSwgQ29sb3JVdGlsczo6a0NvbG9yUmFuZ2VWZW5kb3JTdGFydCArIENBOjpSYW5nZU90aGVyICsgMSk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfU1RBTkRBUkQsIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDcwOSk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfVFJBTlNGRVIsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJMaW5lYXIpOworICAgIENvbG9yVXRpbHM6OmdldENvbG9yQXNwZWN0c0Zyb21Gb3JtYXQoZm9ybWF0LCBhc3BlY3RzKTsKKyAgICBFWFBFQ1RfRVEoYXNwZWN0cy5tUmFuZ2UsIENBOjpSYW5nZU90aGVyKSA8PCAidW5leHBlY3RlZCByYW5nZSI7Cit9CisKK1RFU1QoQ29sb3JVdGlsc1VuaXRUZXN0LCBEYXRhU3BhY2VTYW5pdHlUZXN0KSB7CisgICAgQ0EgYXNwZWN0czsKKyAgICBhc3BlY3RzLm1SYW5nZSA9IENBOjpSYW5nZVVuc3BlY2lmaWVkOworICAgIGFzcGVjdHMubVByaW1hcmllcyA9IENBOjpQcmltYXJpZXNVbnNwZWNpZmllZDsKKyAgICBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgPSBDQTo6TWF0cml4VW5zcGVjaWZpZWQ7CisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBDQTo6VHJhbnNmZXJVbnNwZWNpZmllZDsKKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UgPSBDb2xvclV0aWxzOjpnZXREYXRhU3BhY2VGb3JDb2xvckFzcGVjdHMoYXNwZWN0cywgdHJ1ZSk7CisgICAgRVhQRUNUX0VRKGRhdGFTcGFjZSwgMCkgPDwgImV4cGVjdGVkIGludmFsaWQgZGF0YXNwYWNlIjsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBDQTo6UHJpbWFyaWVzVW5zcGVjaWZpZWQ7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gQ0E6Ok1hdHJpeEJUMjAyMENvbnN0YW50OworICAgIGRhdGFTcGFjZSA9IENvbG9yVXRpbHM6OmdldERhdGFTcGFjZUZvckNvbG9yQXNwZWN0cyhhc3BlY3RzLCB0cnVlKTsKKyAgICBFWFBFQ1RfTkUoZGF0YVNwYWNlLCAwKSA8PCAidW5leHBlY3RlZCB2YWx1ZSI7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChDb2xvclV0aWxzVW5pdFRlc3QsIENvbG9yUmFuZ2VUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29sb3JSYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpSYW5nZTo6UmFuZ2VGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlJhbmdlOjpSYW5nZVVuc3BlY2lmaWVkLCBDQTo6UmFuZ2U6OlJhbmdlT3RoZXIpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKENvbG9yVXRpbHNVbml0VGVzdCwgQ29sb3JUcmFuc2ZlclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb2xvclRyYW5zZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyVW5zcGVjaWZpZWQsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJMaW5lYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU1JHQiwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJHYW1tYTIyLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyR2FtbWEyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTVDIwODQsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJITEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUyNDBNLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyWHZZQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyQlQxMzYxLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU1Q0MjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyT3RoZXIpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBDb2xvclV0aWxzVW5pdFRlc3QsIENvbG9yU3RhbmRhcmRUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAvLyBQcmltYXJpZXMsIE1hdHJpeENvZWZmcworICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKENBOjpQcmltYXJpZXM6OlByaW1hcmllc1Vuc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeFVuc3BlY2lmaWVkKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDcwOV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNzA5XzUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNjI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNjAxXzYpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNjI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNzA5XzUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNjAxXzYpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeFNNUFRFMjQwTSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQyMDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUMjAyMCksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQyMDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUMjAyMENvbnN0YW50KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDQ3MF82TSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDQ3MF82TSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzR2VuZXJpY0ZpbG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQyMDIwKSkpOworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIENvbG9yVXRpbHNVbml0VGVzdCwgQ29sb3JBc3BlY3RzVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgLy8gUHJpbWFyaWVzLCBDb2xvclRyYW5zZmVyLCBNYXRyaXhDb2VmZnMsIENvbG9yUmFuZ2UsIENvbG9yU3RhbmRhcmQKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzVW5zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJVbnNwZWNpZmllZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4VW5zcGVjaWZpZWQsIENBOjpSYW5nZTo6UmFuZ2VGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkVW5zcGVjaWZpZWQpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDcwOV81LCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDcwOV81LCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZEJUNzA5KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ2MDFfNl82MjUsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTUkdCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDYwMV82LCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZFVuc3BlY2lmaWVkKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ2MDFfNl82MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTTVBURTE3ME0sIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpSYW5nZTo6UmFuZ2VGdWxsLCBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkVW5zcGVjaWZpZWQpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzUyNSwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckdhbW1hMjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNjAxXzYsIENBOjpSYW5nZTo6UmFuZ2VGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkVW5zcGVjaWZpZWQpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzUyNSwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckdhbW1hMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeFNNUFRFMjQwTSwgQ0E6OlJhbmdlOjpSYW5nZUZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDQ3ME0pLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDIwMjAsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTVDIwODQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUMjAyMCwgQ0E6OlJhbmdlOjpSYW5nZUZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDYwMV81MjUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDIwMjAsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJITEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUMjAyMENvbnN0YW50LCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZEJUNjAxXzUyNSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNDcwXzZNLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDQ3MF82TSwgQ0E6OlJhbmdlOjpSYW5nZUZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRVbnNwZWNpZmllZCksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0dlbmVyaWNGaWxtLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjAsIENBOjpSYW5nZTo6UmFuZ2VGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkQlQ2MDFfNjI1KSkpOworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIENvbG9yVXRpbHNVbml0VGVzdCwgSXNvVG9QbGF0Zm9ybUFzcGVjdHNUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAvLyBQcmltYXJpZXMsIFRyYW5zZmVyLCBNYXRyaXhDb2VmZnMsIFN0YW5kYXJkLCBUcmFuc2ZlcgorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzVW5zcGVjaWZpZWQsIENBOjpUcmFuc2ZlclVuc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4VW5zcGVjaWZpZWQsIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkVW5zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclRyYW5zZmVyVW5zcGVjaWZpZWQpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzQlQ3MDlfNSwgQ0E6OlRyYW5zZmVyTGluZWFyLCBDQTo6TWF0cml4QlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDcwOSwgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJMaW5lYXIpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzQlQ2MDFfNl82MjUsIENBOjpUcmFuc2ZlclNSR0IsIENBOjpNYXRyaXhCVDYwMV82LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNjAxXzYyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJTUkdCKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc0JUNjAxXzZfNjI1LCBDQTo6VHJhbnNmZXJTTVBURTE3ME0sIENBOjpNYXRyaXhCVDcwOV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNjAxXzYyNV9VbmFkanVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlclNNUFRFXzE3ME0pLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzQlQ2MDFfNl81MjUsIENBOjpUcmFuc2ZlckdhbW1hMjIsIENBOjpNYXRyaXhCVDYwMV82LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNjAxXzUyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJHYW1tYTIyKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc0JUNjAxXzZfNTI1LCBDQTo6VHJhbnNmZXJHYW1tYTI4LCBDQTo6TWF0cml4U01QVEUyNDBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNjAxXzUyNV9VbmFkanVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlckdhbW1hMjgpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzQlQyMDIwLCBDQTo6VHJhbnNmZXJTVDIwODQsIENBOjpNYXRyaXhCVDIwMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQyMDIwLCBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlclNUMjA4NCksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXNCVDIwMjAsIENBOjpUcmFuc2ZlckhMRywgQ0E6Ok1hdHJpeEJUMjAyMENvbnN0YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUMjAyMENvbnN0YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlckhMRyksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXNCVDQ3MF82TSwgQ0E6OlRyYW5zZmVyVW5zcGVjaWZpZWQsIENBOjpNYXRyaXhCVDQ3MF82TSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDQ3ME0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclRyYW5zZmVyVW5zcGVjaWZpZWQpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzR2VuZXJpY0ZpbG0sIENBOjpUcmFuc2ZlckxpbmVhciwgQ0E6Ok1hdHJpeEJUMjAyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRGaWxtLCBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlckxpbmVhcikpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBDb2xvclV0aWxzVW5pdFRlc3QsIERlZmF1bHRDb2xvckFzcGVjdHNUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAvLyBXaWR0aCwgSGVpZ2h0LCBQcmltYXJpZXMsIE1hdHJpeENvZWZmcworICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZSgzODQwLCAzODQwLCBDQTo6UHJpbWFyaWVzQlQyMDIwLCBDQTo6TWF0cml4QlQyMDIwKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoNzIwLCA1NzYsIENBOjpQcmltYXJpZXNCVDYwMV82XzYyNSwgQ0E6Ok1hdHJpeEJUNjAxXzYpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZSg0ODAsIDM2MCwgQ0E6OlByaW1hcmllc0JUNjAxXzZfNTI1LCBDQTo6TWF0cml4QlQ2MDFfNiksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKDQ4MCwgMTkyMCwgQ0E6OlByaW1hcmllc0JUNzA5XzUsIENBOjpNYXRyaXhCVDcwOV81KSkpOworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIENvbG9yVXRpbHNVbml0VGVzdCwgRGF0YVNwYWNlVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgLy8gQ29sb3JSYW5nZSwgUHJpbWFyaWVzLCBDb2xvclRyYW5zZmVyLCBNYXRyaXhDb2VmZnMsIHYwX2FuZHJvaWRfZGF0YXNwYWNlLAorICAgICAgICAgICAgICAgIC8vIGFuZHJvaWRfZGF0YXNwYWNlCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VGdWxsLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDcwOV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU1JHQiwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9TUkdCLCBIQUxfREFUQVNQQUNFX1NSR0IpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlTGltaXRlZCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9CVDcwOSwgSEFMX0RBVEFTUEFDRV9CVDcwOSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VGdWxsLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDcwOV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDcwOV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1YwX1NSR0JfTElORUFSLCBIQUxfREFUQVNQQUNFX1NSR0JfTElORUFSKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDYwMV82LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1YwX0JUNjAxXzUyNSwgSEFMX0RBVEFTUEFDRV9CVDYwMV81MjUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlTGltaXRlZCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ2MDFfNl82MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTTVBURTE3ME0sIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNjAxXzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfQlQ2MDFfNjI1LCBIQUxfREFUQVNQQUNFX0JUNjAxXzYyNSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VGdWxsLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzYyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ2MDFfNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9KRklGLCBIQUxfREFUQVNQQUNFX0pGSUYpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlTGltaXRlZCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ0NzBfNk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfQlQ2MDFfNjI1LCBIQUxfREFUQVNQQUNFX0JUNjAxXzYyNSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDcwOV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDYwMV82LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1YwX0JUNjAxXzYyNSwgSEFMX0RBVEFTUEFDRV9CVDYwMV82MjUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlTGltaXRlZCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4U01QVEUyNDBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1YwX0JUNzA5LCBIQUxfREFUQVNQQUNFX0JUNzA5KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTTVBURTE3ME0sIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUMjAyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9CVDcwOSwgSEFMX0RBVEFTUEFDRV9CVDcwOSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDcwOV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjBDb25zdGFudCwgSEFMX0RBVEFTUEFDRV9WMF9CVDYwMV81MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfQlQ2MDFfNTI1KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNjI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDQ3MF82TSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9CVDYwMV82MjUsIEhBTF9EQVRBU1BBQ0VfQlQ2MDFfNjI1KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNjI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjBDb25zdGFudCwgSEFMX0RBVEFTUEFDRV9WMF9CVDYwMV81MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfQlQ2MDFfNTI1KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDQ3MF82TSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9CVDYwMV81MjUsIEhBTF9EQVRBU1BBQ0VfQlQ2MDFfNTI1KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjBDb25zdGFudCwgSEFMX0RBVEFTUEFDRV9WMF9CVDYwMV81MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfQlQ2MDFfNTI1KSkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLmJwCmluZGV4IDg2NTVjYWYuLmY0ZDZkOTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2h0dHBfc3VwcG9ydCIsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwCmluZGV4IDEyZTdjYTYuLjBiMGFjYmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icApAQCAtMSwzICsxLDIyIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfaHR0cGxpdmVfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfaHR0cGxpdmVfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlIiwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icAppbmRleCBkYjM3ZmU5Li4zZjViYTQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icApAQCAtMSwzICsxLDIyIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfaWQzX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2lkM19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2lkMyIsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLApAQCAtNSw3ICsyNCw5IEBACiAgICAgc3JjczogWyJJRDMuY3BwIl0sCiAKICAgICBoZWFkZXJfbGliczogWwotICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYV9kYXRhc291cmNlX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgIF0sCiAKQEAgLTE5LDYgKzQwLDEyIEBACiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CiAKIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcAppbmRleCBlOTdmNmViLi4xZjNjYWQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcApAQCAtMjM0LDEwICsyMzQsMjAgQEAKICAgICB9CiAKICAgICAvLyBmaXJzdCBoYW5kbGUgZ2xvYmFsIHVuc3luY2hyb25pemF0aW9uCisgICAgYm9vbCBoYXNHbG9iYWxVbnN5bmMgPSBmYWxzZTsKICAgICBpZiAoaGVhZGVyLmZsYWdzICYgMHg4MCkgewotICAgICAgICBBTE9HVigicmVtb3ZpbmcgdW5zeW5jaHJvbml6YXRpb24iKTsKKyAgICAgICAgQUxPR1YoImhhcyBHbG9iYWwgdW5zeW5jaHJvbml6YXRpb24iKTsKKyAgICAgICAgaGFzR2xvYmFsVW5zeW5jID0gdHJ1ZTsKKyAgICAgICAgLy8gd2UgaGF2ZSB0byB3YWl0IG9uIGFwcGx5aW5nIGdsb2JhbCB1bnN5bmNocm9uaXphdGlvbiB0byBWMi40IGZyYW1lcworICAgICAgICAvLyBpZiB3ZSBhcHBseSBpdCBub3csIHRoZSBsZW5ndGggaW5mb3JtYXRpb24gd2l0aGluIGFueSBWMi40IGZyYW1lcyBnb2VzIGJhZAorICAgICAgICAvLyBSZW1vdmluZyB1bnN5bmNocm9uaXphdGlvbiBzaHJpbmtzIHRoZSBidWZmZXIsIGJ1dCBsZW5ndGhzIChzdG9yZWQgaW4gc2FmZXN5bmMKKyAgICAgICAgLy8gZm9ybWF0KSBzdG9yZWQgd2l0aGluIHRoZSBmcmFtZSByZWZsZWN0ICJwcmUtc2hyaW5raW5nIiB0b3RhbHMuCiAKLSAgICAgICAgcmVtb3ZlVW5zeW5jaHJvbml6YXRpb24oKTsKKyAgICAgICAgLy8gd2UgY2FuIChhbmQgc2hvdWxkKSBhcHBseSB0aGUgbm9uLTIuNCBzeW5jaCBub3cuCisgICAgICAgIGlmICggaGVhZGVyLnZlcnNpb25fbWFqb3IgIT0gNCkgeworICAgICAgICAgICAgQUxPR1YoIkFwcGx5IGdsb2JhbCB1bnN5bmMgZm9yIG5vbiBWMi40IGZyYW1lcyIpOworICAgICAgICAgICAgcmVtb3ZlVW5zeW5jaHJvbml6YXRpb24oKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIGhhbmRsZSBleHRlbmRlZCBoZWFkZXIsIGlmIHByZXNlbnQKQEAgLTMyNyw5ICszMzcsMTAgQEAKICAgICAvLyBIYW5kbGUgYW55IHYyLjQgcGVyLWZyYW1lIHVuc3luY2hyb25pemF0aW9uCiAgICAgLy8gVGhlIGlkMyBzcGVjIGlzbid0IGNsZWFyIGFib3V0IHdoYXQgc2hvdWxkIGhhcHBlbiBpZiB0aGUgZ2xvYmFsCiAgICAgLy8gdW5zeW5jaHJvbml6YXRpb24gZmxhZyBpcyBjb21iaW5lZCB3aXRoIHBlci1mcmFtZSB1bnN5bmNocm9uaXphdGlvbiwKLSAgICAvLyBvciB3aGV0aGVyIHRoYXQncyBldmVuIGFsbG93ZWQsIHNvIHRoaXMgY29kZSBhc3N1bWVzIGlkMyB3cml0aW5nCi0gICAgLy8gdG9vbHMgZG8gdGhlIHJpZ2h0IHRoaW5nIGFuZCBub3QgYXBwbHkgZG91YmxlLXVuc3luY2hyb25pemF0aW9uLAotICAgIC8vIGJ1dCB3aWxsIGhvbm9yIHRoZSBmbGFncyBpZiB0aGV5IGFyZSBzZXQuCisgICAgLy8gb3Igd2hldGhlciB0aGF0J3MgZXZlbiBhbGxvd2VkLiBXZSBjaG9vc2UgYSAibm8gbW9yZSB0aGFuIDEgdW5zeW5jaHJvbml6YXRpb24iCisgICAgLy8gc2VtYW50aWM7IHRoZSBWMl80IHVuc3luY2hyb25pemVyIGdldHMgYSBjb3B5IG9mIHRoZSBnbG9iYWwgZmxhZyBzbyBpdCBjYW4gaGFuZGxlCisgICAgLy8gdGhpcyBwb3NzaWJsZSBhbWJpcXVpdHkuCisgICAgLy8KICAgICBpZiAoaGVhZGVyLnZlcnNpb25fbWFqb3IgPT0gNCkgewogICAgICAgICB2b2lkICpjb3B5ID0gbWFsbG9jKHNpemUpOwogICAgICAgICBpZiAoY29weSA9PSBOVUxMKSB7CkBAIC0zNDEsMTIgKzM1MiwxMiBAQAogCiAgICAgICAgIG1lbWNweShjb3B5LCBtRGF0YSwgc2l6ZSk7CiAKLSAgICAgICAgYm9vbCBzdWNjZXNzID0gcmVtb3ZlVW5zeW5jaHJvbml6YXRpb25WMl80KGZhbHNlIC8qIGlUdW5lc0hhY2sgKi8pOworICAgICAgICBib29sIHN1Y2Nlc3MgPSByZW1vdmVVbnN5bmNocm9uaXphdGlvblYyXzQoZmFsc2UgLyogaVR1bmVzSGFjayAqLywgaGFzR2xvYmFsVW5zeW5jKTsKICAgICAgICAgaWYgKCFzdWNjZXNzKSB7CiAgICAgICAgICAgICBtZW1jcHkobURhdGEsIGNvcHksIHNpemUpOwogICAgICAgICAgICAgbVNpemUgPSBzaXplOwogCi0gICAgICAgICAgICBzdWNjZXNzID0gcmVtb3ZlVW5zeW5jaHJvbml6YXRpb25WMl80KHRydWUgLyogaVR1bmVzSGFjayAqLyk7CisgICAgICAgICAgICBzdWNjZXNzID0gcmVtb3ZlVW5zeW5jaHJvbml6YXRpb25WMl80KHRydWUgLyogaVR1bmVzSGFjayAqLywgaGFzR2xvYmFsVW5zeW5jKTsKIAogICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiSGFkIHRvIGFwcGx5IHRoZSBpVHVuZXMgaGFjayB0byBwYXJzZSB0aGlzIElEMyB0YWciKTsKQEAgLTM2NSw3ICszNzYsNiBAQAogICAgIH0KIAogCi0KICAgICBpZiAoaGVhZGVyLnZlcnNpb25fbWFqb3IgPT0gMikgewogICAgICAgICBtVmVyc2lvbiA9IElEM19WMl8yOwogICAgIH0gZWxzZSBpZiAoaGVhZGVyLnZlcnNpb25fbWFqb3IgPT0gMykgewpAQCAtNDA3LDcgKzQxNyw3IEBACiAgICAgfQogfQogCi1ib29sIElEMzo6cmVtb3ZlVW5zeW5jaHJvbml6YXRpb25WMl80KGJvb2wgaVR1bmVzSGFjaykgeworYm9vbCBJRDM6OnJlbW92ZVVuc3luY2hyb25pemF0aW9uVjJfNChib29sIGlUdW5lc0hhY2ssIGJvb2wgaGFzR2xvYmFsVW5zeW5jKSB7CiAgICAgc2l6ZV90IG9sZFNpemUgPSBtU2l6ZTsKIAogICAgIHNpemVfdCBvZmZzZXQgPSBtRmlyc3RGcmFtZU9mZnNldDsKQEAgLTQ0Myw3ICs0NTMsMTEgQEAKICAgICAgICAgICAgIGZsYWdzICY9IH4xOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKChmbGFncyAmIDIpICYmIChkYXRhU2l6ZSA+PSAyKSkgeworICAgICAgICBBTE9HVigiaGFzZ2xvYmFsICVkICBmbGFncyYyICVkIiwgaGFzR2xvYmFsVW5zeW5jLCBmbGFncyYyKTsKKyAgICAgICAgaWYgKGhhc0dsb2JhbFVuc3luYyAmJiAhKGZsYWdzICYgMikpIHsKKyAgICAgICAgICAgIEFMT0dWKCJPT1BTOiBnbG9iYWwgdW5zeW5jIHNldCwgYnV0IHBlci1mcmFtZSBOT1Qgc2V0OyByZW1vdmluZyB1bnN5bmMgYW55d2F5Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChoYXNHbG9iYWxVbnN5bmMgfHwgKGZsYWdzICYgMikpICYmIChkYXRhU2l6ZSA+PSAyKSkgewogICAgICAgICAgICAgLy8gVGhpcyBmcmFtZSBoYXMgInVuc3luY2hyb25pemF0aW9uIiwgc28gd2UgaGF2ZSB0byByZXBsYWNlIG9jY3VycmVuY2VzCiAgICAgICAgICAgICAvLyBvZiAweGZmIDB4MDAgd2l0aCBqdXN0IDB4ZmYgaW4gb3JkZXIgdG8gZ2V0IHRoZSByZWFsIGRhdGEuCiAKQEAgLTQ3MCw3ICs0ODQsNiBAQAogICAgICAgICAgICAgICAgIEFMT0dFKCJiLzM0NjE4NjA3ICglenUgJXp1ICV6dSAlenUpIiwgcmVhZE9mZnNldCwgd3JpdGVPZmZzZXQsIG9sZFNpemUsIG1TaXplKTsKICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjM0NjE4NjA3Iik7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgfQogICAgICAgICBmbGFncyAmPSB+MjsKICAgICAgICAgaWYgKGZsYWdzICE9IHByZXZGbGFncyB8fCBpVHVuZXNIYWNrKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvQW5kcm9pZC5icAppbmRleCA5ZDI2ZWVjLi4zY2Q4NTY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9pZDNfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2lkM19saWNlbnNlIiwKKyAgICBdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiSUQzVGVzdCIsCiAgICAgZ3Rlc3Q6IHRydWUsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9BbmRyb2lkVGVzdC54bWwKaW5kZXggNmM2Njk3ZC4uNTBmOTI1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvQW5kcm9pZFRlc3QueG1sCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0FuZHJvaWRUZXN0LnhtbApAQCAtMTksNyArMTksNyBAQAogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJJRDNUZXN0LT4vZGF0YS9sb2NhbC90bXAvSUQzVGVzdCIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCi0gICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvSUQzVGVzdC56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9JRDNUZXN0LTEuMi56aXA/dW56aXA9dHJ1ZSIKICAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvSUQzVGVzdFJlcy8iIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0lEM1Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvSUQzVGVzdC5jcHAKaW5kZXggY2Q1Y2Q5ZS4uYTBhODRlYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvSUQzVGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvSUQzVGVzdC5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKIAogI2luY2x1ZGUgIklEM1Rlc3RFbnZpcm9ubWVudC5oIgogCisKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCiBzdGF0aWMgSUQzVGVzdEVudmlyb25tZW50ICpnRW52ID0gbnVsbHB0cjsKQEAgLTQxLDYgKzQyLDcgQEAKIAogVEVTVF9QKElEM3RhZ1Rlc3QsIFRhZ1Rlc3QpIHsKICAgICBzdHJpbmcgcGF0aCA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKTsKKyAgICBBTE9HVigiID09PT09ICAgVGFnVGVzdCBmb3IgJXMiLCBwYXRoLmNfc3RyKCkpOwogICAgIHNwPEZpbGVTb3VyY2U+IGZpbGUgPSBuZXcgRmlsZVNvdXJjZShwYXRoLmNfc3RyKCkpOwogICAgIEFTU0VSVF9FUShmaWxlLT5pbml0Q2hlY2soKSwgKHN0YXR1c190KU9LKSA8PCAiRmlsZSBpbml0aWFsaXphdGlvbiBmYWlsZWQhIFxuIjsKICAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihmaWxlLT53cmFwKCkpOwpAQCAtNTEsNyArNTMsNyBAQAogICAgIHdoaWxlICghaXQuZG9uZSgpKSB7CiAgICAgICAgIFN0cmluZzggaWQ7CiAgICAgICAgIGl0LmdldElEKCZpZCk7Ci0gICAgICAgIEFTU0VSVF9HVChpZC5sZW5ndGgoKSwgMCkgPDwgIk5vIElEIHRhZyBmb3VuZCEgXG4iOworICAgICAgICBBU1NFUlRfR1QoaWQubGVuZ3RoKCksIDApIDw8ICJGb3VuZCBhbiBJRDMgdGFnIG9mIDAgc2l6ZSI7CiAgICAgICAgIEFMT0dWKCJGb3VuZCBJRCB0YWc6ICVzXG4iLCBTdHJpbmc4KGlkKS5jX3N0cigpKTsKICAgICAgICAgaXQubmV4dCgpOwogICAgIH0KQEAgLTYwLDE5ICs2MiwyMSBAQAogVEVTVF9QKElEM3ZlcnNpb25UZXN0LCBWZXJzaW9uVGVzdCkgewogICAgIGludCB2ZXJzaW9uTnVtYmVyID0gR2V0UGFyYW0oKS5zZWNvbmQ7CiAgICAgc3RyaW5nIHBhdGggPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCkuZmlyc3Q7CisgICAgQUxPR1YoIiA9PT09PSAgIFZlcnNpb25UZXN0IGZvciAlcyIsIHBhdGguY19zdHIoKSk7CiAgICAgc3A8YW5kcm9pZDo6RmlsZVNvdXJjZT4gZmlsZSA9IG5ldyBGaWxlU291cmNlKHBhdGguY19zdHIoKSk7CiAgICAgQVNTRVJUX0VRKGZpbGUtPmluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spIDw8ICJGaWxlIGluaXRpYWxpemF0aW9uIGZhaWxlZCEgXG4iOwogCiAgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIoZmlsZS0+d3JhcCgpKTsKICAgICBJRDMgdGFnKCZoZWxwZXIpOwogICAgIEFTU0VSVF9UUlVFKHRhZy5pc1ZhbGlkKCkpIDw8ICJObyB2YWxpZCBJRDMgdGFnIGZvdW5kIGZvciAiIDw8IHBhdGguY19zdHIoKSA8PCAiXG4iOwotICAgIEFTU0VSVF9UUlVFKHRhZy52ZXJzaW9uKCkgPj0gdmVyc2lvbk51bWJlcikKLSAgICAgICAgICAgIDw8ICJFeHBlY3RlZCB2ZXJzaW9uOiAiIDw8IHRhZy52ZXJzaW9uKCkgPDwgIiBGb3VuZCB2ZXJzaW9uOiAiIDw8IHZlcnNpb25OdW1iZXI7CisgICAgQVNTRVJUX0VRKHRhZy52ZXJzaW9uKCksIHZlcnNpb25OdW1iZXIpCisgICAgICAgICAgICA8PCAiRm91bmQgdmVyc2lvbjogIiA8PCB0YWcudmVyc2lvbigpIDw8ICIgRXhwZWN0ZWQgdmVyc2lvbjogIiA8PCB2ZXJzaW9uTnVtYmVyOwogfQogCiBURVNUX1AoSUQzdGV4dFRhZ1Rlc3QsIFRleHRUYWdUZXN0KSB7CiAgICAgaW50IG51bVRleHRGcmFtZXMgPSBHZXRQYXJhbSgpLnNlY29uZDsKICAgICBzdHJpbmcgcGF0aCA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKS5maXJzdDsKKyAgICBBTE9HVigiID09PT09ICAgVGV4dFRhZ1Rlc3QgZm9yICVzIiwgcGF0aC5jX3N0cigpKTsKICAgICBzcDxhbmRyb2lkOjpGaWxlU291cmNlPiBmaWxlID0gbmV3IEZpbGVTb3VyY2UocGF0aC5jX3N0cigpKTsKICAgICBBU1NFUlRfRVEoZmlsZS0+aW5pdENoZWNrKCksIChzdGF0dXNfdClPSykgPDwgIkZpbGUgaW5pdGlhbGl6YXRpb24gZmFpbGVkISBcbiI7CiAKQEAgLTgxLDE3ICs4NSwzNCBAQAogICAgIEFTU0VSVF9UUlVFKHRhZy5pc1ZhbGlkKCkpIDw8ICJObyB2YWxpZCBJRDMgdGFnIGZvdW5kIGZvciAiIDw8IHBhdGguY19zdHIoKSA8PCAiXG4iOwogICAgIGludCBjb3VudFRleHRGcmFtZXMgPSAwOwogICAgIElEMzo6SXRlcmF0b3IgaXQodGFnLCBudWxscHRyKTsKLSAgICB3aGlsZSAoIWl0LmRvbmUoKSkgewotICAgICAgICBTdHJpbmc4IGlkOwotICAgICAgICBpdC5nZXRJRCgmaWQpOwotICAgICAgICBBU1NFUlRfR1QoaWQubGVuZ3RoKCksIDApOwotICAgICAgICBpZiAoaWRbMF0gPT0gJ1QnKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IHRleHQ7Ci0gICAgICAgICAgICBjb3VudFRleHRGcmFtZXMrKzsKLSAgICAgICAgICAgIGl0LmdldFN0cmluZygmdGV4dCk7Ci0gICAgICAgICAgICBBTE9HVigiRm91bmQgdGV4dCBmcmFtZSAlcyA6ICVzIFxuIiwgaWQuc3RyaW5nKCksIHRleHQuc3RyaW5nKCkpOworICAgIGlmICh0YWcudmVyc2lvbigpICE9IElEMzo6SUQzX1YxICYmIHRhZy52ZXJzaW9uKCkgIT0gSUQzOjpJRDNfVjFfMSkgeworICAgICAgICB3aGlsZSAoIWl0LmRvbmUoKSkgeworICAgICAgICAgICAgU3RyaW5nOCBpZDsKKyAgICAgICAgICAgIGl0LmdldElEKCZpZCk7CisgICAgICAgICAgICBBU1NFUlRfR1QoaWQubGVuZ3RoKCksIDApIDw8ICJGb3VuZCBhbiBJRDMgdGFnIG9mIDAgc2l6ZSI7CisgICAgICAgICAgICBpZiAoaWRbMF0gPT0gJ1QnKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCB0ZXh0OworICAgICAgICAgICAgICAgIGNvdW50VGV4dEZyYW1lcysrOworICAgICAgICAgICAgICAgIGl0LmdldFN0cmluZygmdGV4dCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkZvdW5kIHRleHQgZnJhbWUgJXMgOiAlcyBcbiIsIGlkLnN0cmluZygpLCB0ZXh0LnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGl0Lm5leHQoKTsKICAgICAgICAgfQotICAgICAgICBpdC5uZXh0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKCFpdC5kb25lKCkpIHsKKyAgICAgICAgICAgIFN0cmluZzggaWQ7CisgICAgICAgICAgICBTdHJpbmc4IHRleHQ7CisgICAgICAgICAgICBpdC5nZXRJRCgmaWQpOworICAgICAgICAgICAgQVNTRVJUX0dUKGlkLmxlbmd0aCgpLCAwKSA8PCAiRm91bmQgYW4gSUQzIHRhZyBvZiAwIHNpemUiOworICAgICAgICAgICAgaXQuZ2V0U3RyaW5nKCZ0ZXh0KTsKKyAgICAgICAgICAgIC8vIGlmIHRoZSB0YWcgaGFzIGEgdmFsdWUKKyAgICAgICAgICAgIGlmIChzdHJjbXAodGV4dC5zdHJpbmcoKSwgIiIpKSB7CisgICAgICAgICAgICAgICAgY291bnRUZXh0RnJhbWVzKys7CisgICAgICAgICAgICAgICAgQUxPR1YoIklEOiAlc1xuIiwgaWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIlRleHQgc3RyaW5nOiAlc1xuIiwgdGV4dC5zdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpdC5uZXh0KCk7CisgICAgICAgIH0KICAgICB9CiAgICAgQVNTRVJUX0VRKGNvdW50VGV4dEZyYW1lcywgbnVtVGV4dEZyYW1lcykKICAgICAgICAgICAgIDw8ICJFeHBlY3RlZCAiIDw8IG51bVRleHRGcmFtZXMgPDwgIiB0ZXh0IGZyYW1lcywgZm91bmQgIiA8PCBjb3VudFRleHRGcmFtZXM7CkBAIC0xMDAsNiArMTIxLDcgQEAKIFRFU1RfUChJRDNhbGJ1bUFydFRlc3QsIEFsYnVtQXJ0VGVzdCkgewogICAgIGJvb2wgYWxidW1BcnRQcmVzZW50ID0gR2V0UGFyYW0oKS5zZWNvbmQ7CiAgICAgc3RyaW5nIHBhdGggPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCkuZmlyc3Q7CisgICAgQUxPR1YoIiA9PT09PSAgIEFsYnVtQXJ0IGZvciAlcyIsIHBhdGguY19zdHIoKSk7CiAgICAgc3A8YW5kcm9pZDo6RmlsZVNvdXJjZT4gZmlsZSA9IG5ldyBGaWxlU291cmNlKHBhdGguY19zdHIoKSk7CiAgICAgQVNTRVJUX0VRKGZpbGUtPmluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spIDw8ICJGaWxlIGluaXRpYWxpemF0aW9uIGZhaWxlZCEgXG4iOwogCkBAIC0xMTQsMTAgKzEzNiwxMSBAQAogICAgICAgICBpZiAoZGF0YSkgewogICAgICAgICAgICAgQUxPR1YoIkZvdW5kIGFsYnVtIGFydDogc2l6ZSA9ICV6dSBtaW1lID0gJXMgXG4iLCBkYXRhU2l6ZSwgbWltZS5zdHJpbmcoKSk7CiAgICAgICAgIH0KLSAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpIDw8ICJFeHBlY3RlZCBhbGJ1bSBhcnQsIGZvdW5kIG5vbmUhIiA8PCBwYXRoOworICAgICAgICBBU1NFUlRfTkUoZGF0YSwgbnVsbHB0cikgPDwgIkV4cGVjdGVkIGFsYnVtIGFydCwgZm91bmQgbm9uZSEgIiA8PCBwYXRoOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFTU0VSVF9FUShkYXRhLCBudWxscHRyKSA8PCAiRm91bmQgYWxidW0gYXJ0IHdoZW4gZXhwZWN0ZWQgbm9uZSEiOwogICAgIH0KKwogI2lmIChMT0dfTkRFQlVHID09IDApCiAgICAgaGV4ZHVtcChkYXRhLCBkYXRhU2l6ZSA+IDEyOCA/IDEyOCA6IGRhdGFTaXplKTsKICNlbmRpZgpAQCAtMTM3LDcgKzE2MCw3IEBACiAgICAgd2hpbGUgKCFpdC5kb25lKCkpIHsKICAgICAgICAgU3RyaW5nOCBpZDsKICAgICAgICAgaXQuZ2V0SUQoJmlkKTsKLSAgICAgICAgQVNTRVJUX0dUKGlkLmxlbmd0aCgpLCAwKTsKKyAgICAgICAgQVNTRVJUX0dUKGlkLmxlbmd0aCgpLCAwKSA8PCAiRm91bmQgYW4gSUQzIHRhZyBvZiAwIHNpemUiOwogICAgICAgICAvLyBDaGVjayBpZiB0aGUgdGFnIGlzIGFuICJBUElDL1BJQyIgdGFnLgogICAgICAgICBpZiAoU3RyaW5nOChpZCkgPT0gIkFQSUMiIHx8IFN0cmluZzgoaWQpID09ICJQSUMiKSB7CiAgICAgICAgICAgICBjb3VudCsrOwpAQCAtMTUwLDcgKzE3Myw3IEBACiAgICAgICAgICAgICAgICAgaGV4ZHVtcChkYXRhLCBkYXRhU2l6ZSA+IDEyOCA/IDEyOCA6IGRhdGFTaXplKTsKICNlbmRpZgogICAgICAgICAgICAgfQotICAgICAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpIDw8ICJFeHBlY3RlZCBhbGJ1bSBhcnQsIGZvdW5kIG5vbmUhIiA8PCBwYXRoOworICAgICAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpIDw8ICJFeHBlY3RlZCBhbGJ1bSBhcnQsIGZvdW5kIG5vbmUhICIgPDwgcGF0aDsKICAgICAgICAgfQogICAgICAgICBpdC5uZXh0KCk7CiAgICAgfQpAQCAtMTU4LDU3ICsxODEsOTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGFsYnVtIGFydHMhIFxuIjsKIH0KIAorLy8gd2UgaGF2ZSBhIHRlc3QgYXNzZXQgd2l0aCBsYXJnZSBhbGJ1bSBhcnQgLS0gd2hpY2ggaXMgbGFyZ2VyIHRoYW4gb3VyIDNNIGNhcAorLy8gdGhhdCB3ZSBpbnNlcnRlZCBpbnRlbnRpb25hbGx5IGluIHRoZSBJRDMgcGFyc2luZyByb3V0aW5lLgorLy8gUmF0aGVyIHRoYW4gaGF2ZSBpdCBmYWlsIGFsbCB0aGUgdGltZSwgd2UgaGF2ZSB3cmFwcGVkIGl0IHVuZGVyIGFuICNpZmRlZgorLy8gc28gdGhhdCB0aGUgdGVzdHMgd2lsbCBwYXNzLgorI3VuZGVmICBURVNUX0xBUkdFCisKKworLy8gaXQgYXBwZWFycyB0aGF0IGJiYl8yc2VjX3YyNF91bnN5bmNocm9uaXplZEFsbEZyYW1lcy5tcDMgaXMgbm90IGEgbGVnYWwgZmlsZSwKKy8vIHNvIHdlJ3ZlIGNvbW1lbnRlZCBpdCBvdXQgb2YgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgdGVzdGVkCisvLworCiBJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoaWQzVGVzdEFsbCwgSUQzdGFnVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjLm1wMyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlY18xX2ltYWdlLm1wMyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlY18yX2ltYWdlLm1wMyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWlucy5tcDMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnNfMV9pbWFnZS5tcDMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnNfMl9pbWFnZS5tcDMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnNfbGFyZ2VTaXplLm1wMyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlY19tb3JlVGV4dEZyYW1lcy5tcDMiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoImJiYl8xc2VjX3YyMy5tcDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfMXNlY18xX2ltYWdlLm1wMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl8xc2VjXzJfaW1hZ2UubXAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzJzZWNfdjI0Lm1wMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl8yc2VjXzFfaW1hZ2UubXAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzJzZWNfMl9pbWFnZS5tcDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfMnNlY19sYXJnZVNpemUubXAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzFzZWNfdjIzXzN0YWdzLm1wMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl8xc2VjX3YxXzV0YWdzLm1wMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl8yc2VjX3YyNF91bnN5bmNocm9uaXplZE9uZUZyYW1lLm1wMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkdjI0X3Vuc3luY2hyb25pemVkLm1wMyIpKTsKIAogSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAogICAgICAgICBpZDNUZXN0QWxsLCBJRDN2ZXJzaW9uVGVzdCwKLSAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWMubXAzIiwgNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjXzFfaW1hZ2UubXAzIiwgNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjXzJfaW1hZ2UubXAzIiwgNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zLm1wMyIsIDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18xX2ltYWdlLm1wMyIsIDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18yX2ltYWdlLm1wMyIsIDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc19sYXJnZVNpemUubXAzIiwgNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjX21vcmVUZXh0RnJhbWVzLm1wMyIsIDQpKSk7CisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfcGFpcigiYmJiXzFzZWNfdjIzLm1wMyIsIElEMzo6SUQzX1YyXzMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjXzFfaW1hZ2UubXAzIiwgSUQzOjpJRDNfVjJfMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzFzZWNfMl9pbWFnZS5tcDMiLCBJRDM6OklEM19WMl8zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY192MjQubXAzIiwgSUQzOjpJRDNfVjJfNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfMV9pbWFnZS5tcDMiLCBJRDM6OklEM19WMl80KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY18yX2ltYWdlLm1wMyIsIElEMzo6SUQzX1YyXzQpLAorI2lmIFRFU1RfTEFSR0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY19sYXJnZVNpemUubXAzIiwgSUQzOjpJRDNfVjJfNCksIC8vIEZBSUwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjX3YyM18zdGFncy5tcDMiLCBJRDM6OklEM19WMl8zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMXNlY192MV81dGFncy5tcDMiLCBJRDM6OklEM19WMV8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMXNlY192MV8zdGFncy5tcDMiLCBJRDM6OklEM19WMV8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY192MjRfdW5zeW5jaHJvbml6ZWRPbmVGcmFtZS5tcDMiLCBJRDM6OklEM19WMl80KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJpZHYyNF91bnN5bmNocm9uaXplZC5tcDMiLCBJRDM6OklEM19WMl80KSkpOwogCiBJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCiAgICAgICAgIGlkM1Rlc3RBbGwsIElEM3RleHRUYWdUZXN0LAotICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlYy5tcDMiLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfMV9pbWFnZS5tcDMiLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfMl9pbWFnZS5tcDMiLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnMubXAzIiwgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zXzFfaW1hZ2UubXAzIiwgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zXzJfaW1hZ2UubXAzIiwgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zX2xhcmdlU2l6ZS5tcDMiLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfbW9yZVRleHRGcmFtZXMubXAzIiwgNSkpKTsKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMXNlY192MjMubXAzIiwgMSksCisgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMXNlY18xX2ltYWdlLm1wMyIsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzFzZWNfMl9pbWFnZS5tcDMiLCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjX3YyNC5tcDMiLCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjXzFfaW1hZ2UubXAzIiwgMSksCisgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY18yX2ltYWdlLm1wMyIsIDEpLAorI2lmIFRFU1RfTEFSR0UKKyAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjX2xhcmdlU2l6ZS5tcDMiLCAxKSwgLy8gRkFJTAorI2VuZGlmCisgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMXNlY192MjNfM3RhZ3MubXAzIiwgMyksCisgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMXNlY192MV81dGFncy5tcDMiLCA1KSwKKyAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjX3YxXzN0YWdzLm1wMyIsIDMpLAorICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfdjI0X3Vuc3luY2hyb25pemVkT25lRnJhbWUubXAzIiwgMykKKyAgICAgICAgICAgICAgICApKTsKIAotSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAotICAgICAgICBpZDNUZXN0QWxsLCBJRDNhbGJ1bUFydFRlc3QsCi0gICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjLm1wMyIsIGZhbHNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfMV9pbWFnZS5tcDMiLCB0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfMl9pbWFnZS5tcDMiLCB0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnMubXAzIiwgZmFsc2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18xX2ltYWdlLm1wMyIsIHRydWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18yX2ltYWdlLm1wMyIsIHRydWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc19sYXJnZVNpemUubXAzIiwgdHJ1ZSkpKTsKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChpZDNUZXN0QWxsLCBJRDNhbGJ1bUFydFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJiYmJfMXNlY192MjMubXAzIiwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzFzZWNfMV9pbWFnZS5tcDMiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjXzJfaW1hZ2UubXAzIiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY192MjQubXAzIiwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfMV9pbWFnZS5tcDMiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjXzJfaW1hZ2UubXAzIiwgdHJ1ZSksCisjaWYgVEVTVF9MQVJHRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfbGFyZ2VTaXplLm1wMyIsIHRydWUpLCAvLyBGQUlMCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjX3YxXzV0YWdzLm1wMyIsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImlkdjI0X3Vuc3luY2hyb25pemVkLm1wMyIsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7CiAKLUlOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKLSAgICAgICAgaWQzVGVzdEFsbCwgSUQzbXVsdGlBbGJ1bUFydFRlc3QsCi0gICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjLm1wMyIsIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWlucy5tcDMiLCAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfMV9pbWFnZS5tcDMiLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnNfMV9pbWFnZS5tcDMiLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfMl9pbWFnZS5tcDMiLCAyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnNfMl9pbWFnZS5tcDMiLCAyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnNfbGFyZ2VTaXplLm1wMyIsIDMpKSk7CitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoaWQzVGVzdEFsbCwgSUQzbXVsdGlBbGJ1bUFydFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJiYmJfMXNlY192MjMubXAzIiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY192MjQubXAzIiwgMCksCisjaWYgVEVTVF9MQVJHRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfbGFyZ2VTaXplLm1wMyIsIDMpLCAvLyBGQUlMCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjXzFfaW1hZ2UubXAzIiwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY18xX2ltYWdlLm1wMyIsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzFzZWNfMl9pbWFnZS5tcDMiLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjXzJfaW1hZ2UubXAzIiwgMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICAgZ0VudiA9IG5ldyBJRDNUZXN0RW52aXJvbm1lbnQoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSGV2Y1V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hldmNVdGlscy5oCmluZGV4IDBmNTk2MzEuLjMzNWRlMmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSGV2Y1V0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IZXZjVXRpbHMuaApAQCAtOTAsNiArOTAsOCBAQAogICAgIC8vIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBkb2VzIG5vdCB3cml0ZSB0aGUgc3RhcnQgY29kZS4KICAgICBib29sIHdyaXRlKHNpemVfdCBpbmRleCwgdWludDhfdCogZGVzdCwgc2l6ZV90IHNpemUpOwogICAgIHN0YXR1c190IG1ha2VIdmNjKHVpbnQ4X3QgKmh2Y2MsIHNpemVfdCAqaHZjY1NpemUsIHNpemVfdCBuYWxTaXplTGVuZ3RoKTsKKyAgICB2b2lkIEZpbmRIRVZDRGltZW5zaW9ucygKKyAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZTcHNCdWZmZXIsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpOwogCiAgICAgSW5mbyBnZXRJbmZvKCkgY29uc3QgeyByZXR1cm4gbUluZm87IH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmgKaW5kZXggMGJlNTg5Ni4uYmQwZDI3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0lEMy5oCkBAIC05MSw3ICs5MSw3IEBACiAgICAgYm9vbCBwYXJzZVYxKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOwogICAgIGJvb2wgcGFyc2VWMihEYXRhU291cmNlQmFzZSAqc291cmNlLCBvZmY2NF90IG9mZnNldCk7CiAgICAgdm9pZCByZW1vdmVVbnN5bmNocm9uaXphdGlvbigpOwotICAgIGJvb2wgcmVtb3ZlVW5zeW5jaHJvbml6YXRpb25WMl80KGJvb2wgaVR1bmVzSGFjayk7CisgICAgYm9vbCByZW1vdmVVbnN5bmNocm9uaXphdGlvblYyXzQoYm9vbCBpVHVuZXNIYWNrLCBib29sIGhhc0dsb2JhbFVuc3luYyk7CiAKICAgICBzdGF0aWMgYm9vbCBQYXJzZVN5bmNzYWZlSW50ZWdlcihjb25zdCB1aW50OF90IGVuY29kZWRbNF0sIHNpemVfdCAqeCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCmluZGV4IDgzZTkyYjkuLjRjOTdiNGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaApAQCAtMTQ3LDYgKzE0Nyw3IEBACiAgICAgICAgIGtXaGF0UmVsZWFzZUNvZGVjSW5zdGFuY2UgICAgPSAncmVsQycsCiAgICAgICAgIGtXaGF0Rm9yY2VTdGF0ZVRyYW5zaXRpb24gICAgPSAnZnN0dCcsCiAgICAgICAgIGtXaGF0Q2hlY2tJZlN0dWNrICAgICAgICAgICAgPSAnQ3N0aycsCisgICAgICAgIGtXaGF0U3VibWl0RXh0cmFPdXRwdXRNZXRhZGF0YUJ1ZmZlciA9ICdzYnhvJywKICAgICB9OwogCiAgICAgZW51bSB7CkBAIC0yNzIsNiArMjczLDggQEAKICAgICBib29sIG1TaHV0ZG93bkluUHJvZ3Jlc3M7CiAgICAgYm9vbCBtRXhwbGljaXRTaHV0ZG93bjsKICAgICBib29sIG1Jc0xlZ2FjeVZQOURlY29kZXI7CisgICAgYm9vbCBtSXNTdHJlYW1Db3JydXB0RnJlZTsKKyAgICBib29sIG1Jc0xvd0xhdGVuY3k7CiAKICAgICAvLyBJZiAibUtlZXBDb21wb25lbnRBbGxvY2F0ZWQiIHdlIG9ubHkgdHJhbnNpdGlvbiBiYWNrIHRvIExvYWRlZCBzdGF0ZQogICAgIC8vIGFuZCBkbyBub3QgcmVsZWFzZSB0aGUgY29tcG9uZW50IGluc3RhbmNlLgpAQCAtNDk5LDYgKzUwMiw3IEBACiAgICAgc3RhdHVzX3Qgc2V0dXBBTVJDb2RlYyhib29sIGVuY29kZXIsIGJvb2wgaXNXQU1SLCBpbnQzMl90IGJpdFJhdGUpOwogICAgIHN0YXR1c190IHNldHVwRzcxMUNvZGVjKGJvb2wgZW5jb2RlciwgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IG51bUNoYW5uZWxzKTsKIAorICAgIHN0YXR1c190IHNldHVwT3B1c0NvZGVjKGJvb2wgZW5jb2RlciwgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IG51bUNoYW5uZWxzKTsKICAgICBzdGF0dXNfdCBzZXR1cEZsYWNDb2RlYygKICAgICAgICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNvbXByZXNzaW9uTGV2ZWwsCiAgICAgICAgICAgICBBdWRpb0VuY29kaW5nIGVuY29kaW5nKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCmluZGV4IDZmMGQzYjUuLmVmZGZhMDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaApAQCAtMTkyLDYgKzE5Miw3IEBACiAgICAgaW50MzJfdCAgbUNvbG9yRm9ybWF0OwogICAgIGludDMyX3QgIG1FbmNvZGVyRm9ybWF0OwogICAgIGludDMyX3QgIG1FbmNvZGVyRGF0YVNwYWNlOworICAgIGludDMyX3QgIG1CdWZmZXJEYXRhU3BhY2U7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKIAogICAgIHNwPENhbWVyYT4gICBtQ2FtZXJhOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmgKaW5kZXggZGQ2ZGY5MC4uMmU5OGZlYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oCkBAIC02MSw2ICs2MSwxMSBAQAogCiB1c2luZyBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OklEZXNjcmFtYmxlcjsKIAorc3RydWN0IENvZGVjUGFyYW1ldGVyRGVzY3JpcHRvciB7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBBTWVzc2FnZTo6VHlwZSB0eXBlOworfTsKKwogc3RydWN0IENvZGVjQmFzZSA6IHB1YmxpYyBBSGFuZGxlciwgLyogc3RhdGljICovIENvbG9yVXRpbHMgewogICAgIC8qKgogICAgICAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgZXZlbnRzIGZpcmluZyBmcm9tIENvZGVjQmFzZSBiYWNrIHRvIE1lZGlhQ29kZWMuCkBAIC0yMzMsNiArMjM4LDY0IEBACiAgICAgdmlydHVhbCB2b2lkIHNpZ25hbFNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpID0gMDsKIAorICAgIC8qKgorICAgICAqIFF1ZXJ5IHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGZyb20gdGhpcyBpbnN0YW5jZSwgYW5kIGZpbGwgfG5hbWVzfCB3aXRoIHRoZQorICAgICAqIG5hbWVzIG9mIHRoZSBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogXHBhcmFtIG5hbWVzIHN0cmluZyB2ZWN0b3IgdG8gZmlsbCB3aXRoIHN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICAgICAqIFxyZXR1cm4gT0sgaWYgc3VjY2Vzc2Z1bDsKKyAgICAgKiAgICAgICAgIEJBRF9WQUxVRSBpZiB8bmFtZXN8IGlzIG51bGw7CisgICAgICogICAgICAgICBJTlZBTElEX09QRVJBVElPTiBpZiBhbHJlYWR5IHJlbGVhc2VkOworICAgICAqICAgICAgICAgRVJST1JfVU5TVVBQT1JURUQgaWYgbm90IHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1ldGVycyhbW21heWJlX3VudXNlZF1dIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAqbmFtZXMpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICAvKioKKyAgICAgKiBGaWxsIHxkZXNjfCB3aXRoIGRlc2NyaXB0aW9uIG9mIHRoZSBwYXJhbWV0ZXIgd2l0aCB8bmFtZXwuCisgICAgICoKKyAgICAgKiBccGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdG8gZGVzY3JpYmUKKyAgICAgKiBccGFyYW0gZGVzYyBwb2ludGVyIHRvIENvZGVjUGFyYW1ldGVyRGVzY3JpcHRvciB0byBiZSBmaWxsZWQKKyAgICAgKiBccmV0dXJuIE9LIGlmIHN1Y2Nlc3NmdWw7CisgICAgICogICAgICAgICBCQURfVkFMVUUgaWYgfGRlc2N8IGlzIG51bGw7CisgICAgICogICAgICAgICBOQU1FX05PVF9GT1VORCBpZiB8bmFtZXwgaXMgbm90IHJlY29nbml6ZWQgYnkgdGhlIGNvbXBvbmVudDsKKyAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIGFscmVhZHkgcmVsZWFzZWQ7CisgICAgICogICAgICAgICBFUlJPUl9VTlNVUFBPUlRFRCBpZiBub3Qgc3VwcG9ydGVkLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVzY3JpYmVQYXJhbWV0ZXIoCisgICAgICAgICAgICBbW21heWJlX3VudXNlZF1dIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgW1ttYXliZV91bnVzZWRdXSBDb2RlY1BhcmFtZXRlckRlc2NyaXB0b3IgKmRlc2MpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICAvKioKKyAgICAgKiBTdWJzY3JpYmUgdG8gcGFyYW1ldGVycyBpbiB8bmFtZXN8IGFuZCBnZXQgb3V0cHV0IGZvcm1hdCBjaGFuZ2UgZXZlbnQKKyAgICAgKiB3aGVuIHRoZXkgY2hhbmdlLgorICAgICAqIFVucmVjb2duaXplZCAvIGFscmVhZHkgc3Vic2NyaWJlZCBwYXJhbWV0ZXJzIGFyZSBpZ25vcmVkLgorICAgICAqCisgICAgICogXHBhcmFtIG5hbWVzIG5hbWVzIG9mIHBhcmFtZXRlcnMgdG8gc3Vic2NyaWJlCisgICAgICogXHJldHVybiBPSyBpZiBzdWNjZXNzZnVsOworICAgICAqICAgICAgICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgYWxyZWFkeSByZWxlYXNlZDsKKyAgICAgKiAgICAgICAgIEVSUk9SX1VOU1VQUE9SVEVEIGlmIG5vdCBzdXBwb3J0ZWQuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdWJzY3JpYmVUb1BhcmFtZXRlcnMoCisgICAgICAgICAgICBbW21heWJlX3VudXNlZF1dIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmbmFtZXMpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICAvKioKKyAgICAgKiBVbnN1YnNjcmliZSBmcm9tIHBhcmFtZXRlcnMgaW4gfG5hbWVzfCBhbmQgbm8gbG9uZ2VyIGdldAorICAgICAqIG91dHB1dCBmb3JtYXQgY2hhbmdlIGV2ZW50IHdoZW4gdGhleSBjaGFuZ2UuCisgICAgICogVW5yZWNvZ25pemVkIC8gYWxyZWFkeSB1bnN1YnNjcmliZWQgcGFyYW1ldGVycyBhcmUgaWdub3JlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuYW1lcyBuYW1lcyBvZiBwYXJhbWV0ZXJzIHRvIHVuc3Vic2NyaWJlCisgICAgICogXHJldHVybiBPSyBpZiBzdWNjZXNzZnVsOworICAgICAqICAgICAgICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgYWxyZWFkeSByZWxlYXNlZDsKKyAgICAgKiAgICAgICAgIEVSUk9SX1VOU1VQUE9SVEVEIGlmIG5vdCBzdXBwb3J0ZWQuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCB1bnN1YnNjcmliZUZyb21QYXJhbWV0ZXJzKAorICAgICAgICAgICAgW1ttYXliZV91bnVzZWRdXSBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5hbWVzKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKICAgICB0eXBlZGVmIENvZGVjQmFzZSAqKCpDcmVhdGVDb2RlY0Z1bmMpKHZvaWQpOwogICAgIHR5cGVkZWYgUGVyc2lzdGVudFN1cmZhY2UgKigqQ3JlYXRlSW5wdXRTdXJmYWNlRnVuYykodm9pZCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKaW5kZXggNzYxNGJhNS4uODk1MjM3NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKQEAgLTUwLDYgKzUwLDcgQEAKIHN0cnVjdCBCYXR0ZXJ5Q2hlY2tlcjsKIGNsYXNzIEJ1ZmZlckNoYW5uZWxCYXNlOwogc3RydWN0IENvZGVjQmFzZTsKK3N0cnVjdCBDb2RlY1BhcmFtZXRlckRlc2NyaXB0b3I7CiBjbGFzcyBJQmF0dGVyeVN0YXRzOwogc3RydWN0IElDcnlwdG87CiBjbGFzcyBNZWRpYUNvZGVjQnVmZmVyOwpAQCAtODEsNiArODIsMTMgQEAKICAgICAgICAgQlVGRkVSX0ZMQUdfTVVYRVJfREFUQSAgICA9IDE2LAogICAgIH07CiAKKyAgICBlbnVtIENWT0RlZ3JlZSB7CisgICAgICAgIENWT19ERUdSRUVfMCAgID0gMCwKKyAgICAgICAgQ1ZPX0RFR1JFRV85MCAgPSA5MCwKKyAgICAgICAgQ1ZPX0RFR1JFRV8xODAgPSAxODAsCisgICAgICAgIENWT19ERUdSRUVfMjcwID0gMjcwLAorICAgIH07CisKICAgICBlbnVtIHsKICAgICAgICAgQ0JfSU5QVVRfQVZBSUxBQkxFID0gMSwKICAgICAgICAgQ0JfT1VUUFVUX0FWQUlMQUJMRSA9IDIsCkBAIC0yMzksNiArMjQ3LDExIEBACiAKICAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKTsKIAorICAgIHN0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmVuZG9yUGFyYW1ldGVycyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gKm5hbWVzKTsKKyAgICBzdGF0dXNfdCBkZXNjcmliZVBhcmFtZXRlcihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgQ29kZWNQYXJhbWV0ZXJEZXNjcmlwdG9yICpkZXNjKTsKKyAgICBzdGF0dXNfdCBzdWJzY3JpYmVUb1ZlbmRvclBhcmFtZXRlcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZuYW1lcyk7CisgICAgc3RhdHVzX3QgdW5zdWJzY3JpYmVGcm9tVmVuZG9yUGFyYW1ldGVycyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5hbWVzKTsKKwogICAgIC8vIENyZWF0ZSBhIE1lZGlhQ29kZWMgbm90aWZpY2F0aW9uIG1lc3NhZ2UgZnJvbSBhIGxpc3Qgb2YgcmVuZGVyZWQgb3IgZHJvcHBlZCByZW5kZXIgaW5mb3MKICAgICAvLyBieSBhZGRpbmcgcmVuZGVyZWQgZnJhbWUgaW5mb3JtYXRpb24gdG8gYSBiYXNlIG5vdGlmaWNhdGlvbiBtZXNzYWdlLiBSZXR1cm5zIHRoZSBudW1iZXIKICAgICAvLyBvZiBmcmFtZXMgdGhhdCB3ZXJlIHJlbmRlcmVkLgpAQCAtNDE4LDYgKzQzMSwxMCBAQAogCiAgICAgc3A8SUNyeXB0bz4gbUNyeXB0bzsKIAorICAgIGludDMyX3QgbVR1bm5lbGVkSW5wdXRXaWR0aDsKKyAgICBpbnQzMl90IG1UdW5uZWxlZElucHV0SGVpZ2h0OworICAgIGJvb2wgbVR1bm5lbGVkOworCiAgICAgc3A8SURlc2NyYW1ibGVyPiBtRGVzY3JhbWJsZXI7CiAKICAgICBMaXN0PHNwPEFCdWZmZXI+ID4gbUNTRDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmgKaW5kZXggMTc4ZDMzNC4uYmVlOTZiMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmgKQEAgLTYxOSw2ICs2MTksNyBAQAogY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0WVVWNDIyU2VtaVBsYW5hciAgICAgICAgPSAyNDsKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdFlVVjQ0NEZsZXhpYmxlICAgICAgICAgID0gMHg3RjQ0NDg4ODsKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdFlVVjQ0NEludGVybGVhdmVkICAgICAgID0gMjk7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRZVVZQMDEwICAgICAgICAgICAgICAgICA9IDU0OwogY29uc3RleHByIGludDMyX3QgQ09MT1JfUUNPTV9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyICAgPSAweDdmYTMwYzAwOwogY29uc3RleHByIGludDMyX3QgQ09MT1JfVElfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hciA9IDB4N2YwMDAxMDA7CiAKQEAgLTc1MSw3ICs3NTIsNyBAQAogY29uc3RleHByIGNoYXIgS0VZX0NBX1NZU1RFTV9JRFtdID0gImNhLXN5c3RlbS1pZCI7CiBjb25zdGV4cHIgY2hhciBLRVlfQ0FfUFJJVkFURV9EQVRBW10gPSAiY2EtcHJpdmF0ZS1kYXRhIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DQVBUVVJFX1JBVEVbXSA9ICJjYXB0dXJlLXJhdGUiOwotY29uc3RleHByIGNoYXIgS0VZX0NIQU5ORUxfQ09VTlRbXSA9ICJjaGFubmVsLWNvdW50IjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9DSEFOTkVMX0NPVU5UW10gPSAiY2hhbm5lbC1jb3VudCI7ICAgLy8gdmFsdWUgTiwgZXEgdG8gcmFuZ2UgMS4uTgogY29uc3RleHByIGNoYXIgS0VZX0NIQU5ORUxfTUFTS1tdID0gImNoYW5uZWwtbWFzayI7CiBjb25zdGV4cHIgY2hhciBLRVlfQ09MT1JfRk9STUFUW10gPSAiY29sb3ItZm9ybWF0IjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DT0xPUl9SQU5HRVtdID0gImNvbG9yLXJhbmdlIjsKQEAgLTc5Miw3ICs3OTMsNyBAQAogY29uc3RleHByIGNoYXIgS0VZX1BDTV9FTkNPRElOR1tdID0gInBjbS1lbmNvZGluZyI7CiBjb25zdGV4cHIgY2hhciBLRVlfUElYRUxfQVNQRUNUX1JBVElPX0hFSUdIVFtdID0gInNhci1oZWlnaHQiOwogY29uc3RleHByIGNoYXIgS0VZX1BJWEVMX0FTUEVDVF9SQVRJT19XSURUSFtdID0gInNhci13aWR0aCI7Ci1jb25zdGV4cHIgY2hhciBLRVlfUFJFUEVORF9IRUFERVJTX1RPX1NZTkNfRlJBTUVTW10gPSAicHJlcGVuZC1zcHMtcHBzLXRvLWlkci1mcmFtZXMiOworY29uc3RleHByIGNoYXIgS0VZX1BSRVBFTkRfSEVBREVSX1RPX1NZTkNfRlJBTUVTW10gPSAicHJlcGVuZC1zcHMtcHBzLXRvLWlkci1mcmFtZXMiOwogY29uc3RleHByIGNoYXIgS0VZX1BSSU9SSVRZW10gPSAicHJpb3JpdHkiOwogY29uc3RleHByIGNoYXIgS0VZX1BST0ZJTEVbXSA9ICJwcm9maWxlIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUFtdID0gInB1c2gtYmxhbmstYnVmZmVycy1vbi1zaHV0ZG93biI7CkBAIC04MDYsNiArODA3LDE0IEBACiBjb25zdGV4cHIgY2hhciBLRVlfVElMRV9IRUlHSFRbXSA9ICJ0aWxlLWhlaWdodCI7CiBjb25zdGV4cHIgY2hhciBLRVlfVElMRV9XSURUSFtdID0gInRpbGUtd2lkdGgiOwogY29uc3RleHByIGNoYXIgS0VZX1RSQUNLX0lEW10gPSAidHJhY2staWQiOworY29uc3RleHByIGNoYXIgS0VZX1ZJREVPX1FQX0JfTUFYW10gPSAidmlkZW8tcXAtYi1tYXgiOworY29uc3RleHByIGNoYXIgS0VZX1ZJREVPX1FQX0JfTUlOW10gPSAidmlkZW8tcXAtYi1taW4iOworY29uc3RleHByIGNoYXIgS0VZX1ZJREVPX1FQX0lfTUFYW10gPSAidmlkZW8tcXAtaS1tYXgiOworY29uc3RleHByIGNoYXIgS0VZX1ZJREVPX1FQX0lfTUlOW10gPSAidmlkZW8tcXAtaS1taW4iOworY29uc3RleHByIGNoYXIgS0VZX1ZJREVPX1FQX01BWFtdID0gInZpZGVvLXFwLW1heCI7Citjb25zdGV4cHIgY2hhciBLRVlfVklERU9fUVBfTUlOW10gPSAidmlkZW8tcXAtbWluIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9WSURFT19RUF9QX01BWFtdID0gInZpZGVvLXFwLXAtbWF4IjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9WSURFT19RUF9QX01JTltdID0gInZpZGVvLXFwLXAtbWluIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9XSURUSFtdID0gIndpZHRoIjsKIAogLy8gZnJvbSBNZWRpYUNvZGVjLmphdmEKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaAppbmRleCBlNjgxZDI1Li43OGQxMDA1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oCkBAIC04OCw3ICs4OCw3IEBACiAgICAgc3RhdGljIHNwPElNZWRpYUNvZGVjTGlzdD4gc0NvZGVjTGlzdDsKICAgICBzdGF0aWMgc3A8SU1lZGlhQ29kZWNMaXN0PiBzUmVtb3RlTGlzdDsKIAotICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisgICAgc3RhdHVzX3QgbUluaXRDaGVja3tOT19JTklUfTsKIAogICAgIHNwPEFNZXNzYWdlPiBtR2xvYmFsU2V0dGluZ3M7CiAgICAgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+ID4gbUNvZGVjSW5mb3M7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oCmluZGV4IDJmOThhZjEuLjBmN2I1MzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oCkBAIC02NCwxMiArNjQsMTUgQEAKIAogICAgIC8vIE1lZGlhQnVmZmVyT2JzZXJ2ZXIKICAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RW5jb2RpbmdCaXRyYXRlKGludDMyX3QgYml0UmF0ZSAvKiBicHMgKi8pOwogCiAgICAgLy8gZm9yIEFIYW5kbGVyUmVmbGVjdG9yCiAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKIAogCisgICAgc3RhdHVzX3QgcmVxdWVzdElEUkZyYW1lKCk7CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NZWRpYUNvZGVjU291cmNlKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaAppbmRleCAxZjRmYmNiLi45ZjIwMTg1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oCkBAIC01NCw2ICs1NCwxMSBAQAogICAgIHZpcnR1YWwgdm9pZCBzZXRTdGFydFRpbWVPZmZzZXRNcyhpbnQgLyptcyovKSB7fQogICAgIHZpcnR1YWwgaW50MzJfdCBnZXRTdGFydFRpbWVPZmZzZXRNcygpIGNvbnN0IHsgcmV0dXJuIDA7IH0KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE5leHRGZChpbnQgLypmZCovKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQorICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVDVk9EZWdyZWVzKGludDMyX3QgLypjdm9EZWdyZWVzKi8pIHt9CisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVBheWxvYWRUeXBlKGludDMyX3QgLypwYXlsb2FkVHlwZSovKSB7fQorICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVTb2NrZXROZXR3b3JrKGludDY0X3QgLypzb2NrZXROZXR3b3JrKi8pIHt9CisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTZXF1ZW5jZU51bSgpIHsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIHVpbnQ2NF90IGdldEFjY3VtdWxhdGl2ZUJ5dGVzKCkgeyByZXR1cm4gMDsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWVkaWFXcml0ZXIoKSB7fQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKaW5kZXggNjRlYjhiNC4uYWFlNWVmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCkBAIC0xNTIsNiArMTUyLDEwIEBACiAgICAga0tleUlzQURUUyAgICAgICAgICAgID0gJ2FkdHMnLCAgLy8gYm9vbCAoaW50MzJfdCkKICAgICBrS2V5QUFDQU9UICAgICAgICAgICAgPSAnYWFvdCcsICAvLyBpbnQzMl90CiAKKyAgICBrS2V5TXBlZ2hQcm9maWxlTGV2ZWxJbmRpY2F0aW9uID0gJ2hwbGknLCAvLyBpbnQzMl90CisgICAga0tleU1wZWdoUmVmZXJlbmNlQ2hhbm5lbExheW91dCA9ICdocmNsJywgLy8gaW50MzJfdAorICAgIGtLZXlNcGVnaENvbXBhdGlibGVTZXRzICAgICAgICAgPSAnaGNvcycsIC8vIHJhdyBkYXRhCisKICAgICAvLyBJZiBhIE1lZGlhQnVmZmVyJ3MgZGF0YSByZXByZXNlbnRzIChhdCBsZWFzdCBwYXJ0aWFsbHkpIGVuY3J5cHRlZAogICAgIC8vIGRhdGEsIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFpZCBpbiBkZWNyeXB0aW9uLgogICAgIC8vIFRoZSBkYXRhIGNhbiBiZSB0aG91Z2h0IG9mIGFzIHBhaXJzIG9mIHBsYWluIGFuZCBlbmNyeXB0ZWQgZGF0YQpAQCAtMjQ3LDYgKzI1MSwxNSBAQAogCiAgICAgLy8gVHJlYXQgZW1wdHkgdHJhY2sgYXMgbWFsZm9ybWVkIGZvciBNZWRpYVJlY29yZGVyLgogICAgIGtLZXlFbXB0eVRyYWNrTWFsRm9ybWVkID0gJ25lbXQnLCAvLyBib29sIChpbnQzMl90KQorICAgIGtLZXlWcHMgICAgICAgICAgICAgID0gJ3NWcHMnLCAvLyBpbnQzMl90LCBpbmRpY2F0ZXMgdGhhdCBhIGJ1ZmZlciBoYXMgdnBzLgorICAgIGtLZXlTcHMgICAgICAgICAgICAgID0gJ3NTcHMnLCAvLyBpbnQzMl90LCBpbmRpY2F0ZXMgdGhhdCBhIGJ1ZmZlciBoYXMgc3BzLgorICAgIGtLZXlQcHMgICAgICAgICAgICAgID0gJ3NQcHMnLCAvLyBpbnQzMl90LCBpbmRpY2F0ZXMgdGhhdCBhIGJ1ZmZlciBoYXMgcHBzLgorICAgIGtLZXlTZWxmSUQgICAgICAgICAgID0gJ3NmaWQnLCAvLyBpbnQzMl90LCBzb3VyY2UgSUQgdG8gaWRlbnRpZnkgaXRzZWxmIG9uIFJUUCBwcm90b2NvbC4KKyAgICBrS2V5UGF5bG9hZFR5cGUgICAgICA9ICdwVHlwJywgLy8gaW50MzJfdCwgU0RQIG5lZ290aWF0ZWQgcGF5bG9hZCB0eXBlLgorICAgIGtLZXlSdHBFeHRNYXAgICAgICAgID0gJ2V4dG0nLCAvLyBpbnQzMl90LCBydHAgZXh0ZW5zaW9uIElEIGZvciBjdm8gb24gUlRQIHByb3RvY29sLgorICAgIGtLZXlSdHBDdm9EZWdyZWVzICAgID0gJ2N2b2QnLCAvLyBpbnQzMl90LCBydHAgY3ZvIGRlZ3JlZXMgYXMgcGVyIDNHUFAgMjYuMTE0LgorICAgIGtLZXlSdHBEc2NwICAgICAgICAgID0gJ2RzY3AnLCAvLyBpbnQzMl90LCBEU0NQKERpZmZlcmVudGlhdGVkIHNlcnZpY2VzIGNvZGVwb2ludCkgb2YgUkZDIDI0NzQuCisgICAga0tleVNvY2tldE5ldHdvcmsgICAgPSAnc05ldCcsIC8vIGludDY0X3QsIHNvY2tldCB3aWxsIGJlIGJvdW5kIHRvIG5ldHdvcmsgaGFuZGxlLgogfTsKIAogZW51bSB7CkBAIC0yNTYsNiArMjY5LDcgQEAKICAgICBrVHlwZUFWMUMgICAgICAgID0gJ2F2MWMnLAogICAgIGtUeXBlRFZDQyAgICAgICAgPSAnZHZjYycsCiAgICAga1R5cGVEMjYzICAgICAgICA9ICdkMjYzJywKKyAgICBrVHlwZUhDT1MgICAgICAgID0gJ2hjb3MnLAogfTsKIAogZW51bSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaAppbmRleCBhZTU1YzY1Li4zNWIzZmEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmgKQEAgLTM4LDYgKzM4LDggQEAKICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgcm90YXRpb24sIGludCB1c2FnZSwgYm9vbCByZWNvbm5lY3QpOwogdm9pZCBzZXROYXRpdmVXaW5kb3dIZHJNZXRhZGF0YSgKICAgICAgICAgQU5hdGl2ZVdpbmRvdyAqbmF0aXZlV2luZG93IC8qIG5vbm51bGwgKi8sIEhEUlN0YXRpY0luZm8gKmluZm8gLyogbm9ubnVsbCAqLyk7CitzdGF0dXNfdCBzZXROYXRpdmVXaW5kb3dSb3RhdGlvbigKKyAgICAgICAgQU5hdGl2ZVdpbmRvdyAqbmF0aXZlV2luZG93IC8qIG5vbm51bGwgKi8sIGludCByb3RhdGlvbik7CiBzdGF0dXNfdCBwdXNoQmxhbmtCdWZmZXJzVG9OYXRpdmVXaW5kb3coQU5hdGl2ZVdpbmRvdyAqbmF0aXZlV2luZG93IC8qIG5vbm51bGwgKi8pOwogc3RhdHVzX3QgbmF0aXZlV2luZG93Q29ubmVjdChBTmF0aXZlV2luZG93ICpzdXJmYWNlLCBjb25zdCBjaGFyICpyZWFzb24pOwogc3RhdHVzX3QgbmF0aXZlV2luZG93RGlzY29ubmVjdChBTmF0aXZlV2luZG93ICpzdXJmYWNlLCBjb25zdCBjaGFyICpyZWFzb24pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCmluZGV4IGZiYjJkMGMuLmE5NzAyMjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKQEAgLTEsMTIgKzEsMzAgQEAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0IiwKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9tcGVnMnRzX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X21wZWcydHNfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnRfZGVmYXVsdHMiLAogCiAgICAgc3JjczogWwogICAgICAgICAiQW5vdGhlclBhY2tldFNvdXJjZS5jcHAiLAogICAgICAgICAiQVRTUGFyc2VyLmNwcCIsCiAgICAgICAgICJDYXNNYW5hZ2VyLmNwcCIsCiAgICAgICAgICJFU1F1ZXVlLmNwcCIsCi0gICAgICAgICJIbHNTYW1wbGVEZWNyeXB0b3IuY3BwIiwKICAgICBdLAogCiAgICAgaW5jbHVkZV9kaXJzOiBbCkBAIC0yOCw3ICs0Niw2IEBACiAgICAgfSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjcnlwdG8iLAogICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKQEAgLTM2LDkgKzUzLDEwIEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2RhdGFzb3VyY2VfaGVhZGVycyIsCiAgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKICAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLApAQCAtNDgsNCArNjYsMzkgQEAKICAgICBdLAogCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0IiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0X2RlZmF1bHRzIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURFTkFCTEVfQ1JZUFRPIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgIF0sCisgICAgc3JjczogWworICAgICAgICAiSGxzU2FtcGxlRGVjcnlwdG9yLmNwcCIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnRfbm9jcnlwdG8iLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnRfZGVmYXVsdHMiLAorICAgIF0sCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKaW5kZXggZWE1ZDJkZS4uMTkyYmE3NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiAKLSNpZm5kZWYgX19BTkRST0lEX0FQRVhfXworI2lmZGVmIEVOQUJMRV9DUllQVE8KICNpbmNsdWRlICJIbHNTYW1wbGVEZWNyeXB0b3IuaCIKICNlbmRpZgogCkBAIC01NSwxMCArNTUsMTAgQEAKICAgICAvLyBDcmVhdGUgdGhlIGRlY3J5cHRvciBhbnl3YXkgc2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgdXNlLWNhc2UgdW5sZXNzIGtleSBpcyBwcm92aWRlZAogICAgIC8vIFdvbid0IGRlY3J5cHQgaWYga2V5IGluZm8gbm90IGF2YWlsYWJsZSAoZS5nLiwgc2Nhbm5lci9leHRyYWN0b3IganVzdCBwYXJzaW5nIHRzIGZpbGVzKQogICAgIG1TYW1wbGVEZWNyeXB0b3IgPSBpc1NhbXBsZUVuY3J5cHRlZCgpID8KLSNpZmRlZiBfX0FORFJPSURfQVBFWF9fCi0gICAgICAgIG5ldyBTYW1wbGVEZWNyeXB0b3IKLSNlbHNlCisjaWZkZWYgRU5BQkxFX0NSWVBUTwogICAgICAgICBuZXcgSGxzU2FtcGxlRGVjcnlwdG9yCisjZWxzZQorICAgICAgICBuZXcgU2FtcGxlRGVjcnlwdG9yCiAjZW5kaWYKICAgICAgICAgOiBOVUxMOwogfQpAQCAtMTcyLDI5ICsxNzIsMjYgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgdW5zaWduZWQgYnNtb2QgX191bnVzZWQgPSBiaXRzLmdldEJpdHMoMyk7CisgICAgYml0cy5za2lwQml0cygzKTsgLy8gYnNtb2QKICAgICB1bnNpZ25lZCBhY21vZCA9IGJpdHMuZ2V0Qml0cygzKTsKLSAgICB1bnNpZ25lZCBjbWl4bGV2IF9fdW51c2VkID0gMDsKLSAgICB1bnNpZ25lZCBzdXJtaXhsZXYgX191bnVzZWQgPSAwOwotICAgIHVuc2lnbmVkIGRzdXJtb2QgX191bnVzZWQgPSAwOwogCiAgICAgaWYgKChhY21vZCAmIDEpID4gMCAmJiBhY21vZCAhPSAxKSB7CiAgICAgICAgIGlmIChiaXRzLm51bUJpdHNMZWZ0KCkgPCAyKSB7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICBjbWl4bGV2ID0gYml0cy5nZXRCaXRzKDIpOworICAgICAgICBiaXRzLnNraXBCaXRzKDIpOyAvL2NtaXhsZXYKICAgICB9CiAgICAgaWYgKChhY21vZCAmIDQpID4gMCkgewogICAgICAgICBpZiAoYml0cy5udW1CaXRzTGVmdCgpIDwgMikgewogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KLSAgICAgICAgc3VybWl4bGV2ID0gYml0cy5nZXRCaXRzKDIpOworICAgICAgICBiaXRzLnNraXBCaXRzKDIpOyAvL3N1cm1peGxldgogICAgIH0KICAgICBpZiAoYWNtb2QgPT0gMikgewogICAgICAgICBpZiAoYml0cy5udW1CaXRzTGVmdCgpIDwgMikgewogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KLSAgICAgICAgZHN1cm1vZCA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICAgICAgYml0cy5za2lwQml0cygyKTsgLy9kc3VybW9kCiAgICAgfQogCiAgICAgaWYgKGJpdHMubnVtQml0c0xlZnQoKSA8IDEpIHsKQEAgLTI2OSw3ICsyNjYsNyBAQAogICAgICAgICBzYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGVUYWJsZTJbZnNjb2QyXTsKICAgICB9IGVsc2UgewogICAgICAgICBzYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGVUYWJsZVtmc2NvZF07Ci0gICAgICAgIHVuc2lnbmVkIG51bWJsa3Njb2QgX191bnVzZWQgPSBiaXRzLmdldEJpdHMoMik7CisgICAgICAgIGJpdHMuc2tpcEJpdHMoMik7IC8vIG51bWJsa3Njb2QKICAgICB9CiAKICAgICB1bnNpZ25lZCBhY21vZCA9IGJpdHMuZ2V0Qml0cygzKTsKQEAgLTEwODcsNyArMTA4NCw3IEBACiAgICAgfQogICAgIHVuc2lnbmVkIG51bUFVcyA9IGJpdHMuZ2V0Qml0cyg4KTsKICAgICBiaXRzLnNraXBCaXRzKDgpOwotICAgIHVuc2lnbmVkIHF1YW50aXphdGlvbl93b3JkX2xlbmd0aCBfX3VudXNlZCA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICBiaXRzLnNraXBCaXRzKDIpOyAvLyBxdWFudGl6YXRpb25fd29yZF9sZW5ndGgKICAgICB1bnNpZ25lZCBhdWRpb19zYW1wbGluZ19mcmVxdWVuY3kgPSBiaXRzLmdldEJpdHMoMyk7CiAgICAgdW5zaWduZWQgbnVtX2NoYW5uZWxzID0gYml0cy5nZXRCaXRzKDMpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMjc5NGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvQW5kcm9pZC5icApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbXBlZzJ0c19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbXBlZzJ0c19saWNlbnNlIiwKKyAgICBdLAorfQorCitjY190ZXN0eworICAgIG5hbWU6ICJNcGVnMnRzVW5pdFRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiTXBlZzJ0c1VuaXRUZXN0LmNwcCIKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgICAgICAibGliY3J5cHRvIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmRhdGFzb3VyY2UiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzLyIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0LyIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L0FuZHJvaWRUZXN0LnhtbApzaW1pbGFyaXR5IGluZGV4IDcxJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApjb3B5IHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9BbmRyb2lkVGVzdC54bWwKaW5kZXggN2ZmOTczMi4uYWMxMjk0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvQW5kcm9pZFRlc3QueG1sCkBAIC0xMywxOSArMTMsMTkgQEAKICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgTXAzIERlY29kZXIgdW5pdCB0ZXN0Ij4KLSAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iTXAzRGVjb2RlclRlc3QiIC8+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBNcGVnMnRzIHVuaXQgdGVzdHMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJNcGVnMnRzVW5pdFRlc3QiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iTXAzRGVjb2RlclRlc3QtPi9kYXRhL2xvY2FsL3RtcC9NcDNEZWNvZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iTXBlZzJ0c1VuaXRUZXN0LT4vZGF0YS9sb2NhbC90bXAvTXBlZzJ0c1VuaXRUZXN0IiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKLSAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDNkZWMvdGVzdC9NcDNEZWNvZGVyVGVzdC56aXA/dW56aXA9dHJ1ZSIKLSAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvTXAzRGVjb2RlclRlc3RSZXMvIiAvPgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9NcGVnMnRzVW5pdFRlc3QuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL01wZWcydHNVbml0VGVzdFJlcy8iIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAKICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9Ik1wM0RlY29kZXJUZXN0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWZsYWciIHZhbHVlPSItUCAvZGF0YS9sb2NhbC90bXAvTXAzRGVjb2RlclRlc3RSZXMvIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iTXBlZzJ0c1VuaXRUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWZsYWciIHZhbHVlPSItUCAvZGF0YS9sb2NhbC90bXAvTXBlZzJ0c1VuaXRUZXN0UmVzLyIgLz4KICAgICA8L3Rlc3Q+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvTXBlZzJ0c1VuaXRUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9NcGVnMnRzVW5pdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YzIzM2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvTXBlZzJ0c1VuaXRUZXN0LmNwcApAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTXBlZzJ0c1VuaXRUZXN0IgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9GaWxlU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKworI2luY2x1ZGUgIm1wZWcydHMvQVRTUGFyc2VyLmgiCisjaW5jbHVkZSAibXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgiCisKKyNpbmNsdWRlICJNcGVnMnRzVW5pdFRlc3RFbnZpcm9ubWVudC5oIgorCitjb25zdGV4cHIgc2l6ZV90IGtUU1BhY2tldFNpemUgPSAxODg7Citjb25zdGV4cHIgdWludDE2X3Qga1BJRE1hc2sgPSAweDFGRkY7CisvLyBNYXggdmFsdWUgb2YgUElEIHdoaWNoIGlzIGFsc28gdXNlZCBmb3IgTnVsbCBwYWNrZXRzCitjb25zdGV4cHIgdWludDE2X3Qga1BJRE1heFZhbHVlID0gODE5MTsKK2NvbnN0ZXhwciB1aW50OF90IGtUU1N5bmNCeXRlID0gMHg0NzsKK2NvbnN0ZXhwciB1aW50OF90IGtWaWRlb1ByZXNlbnQgPSAweDAxOworY29uc3RleHByIHVpbnQ4X3Qga0F1ZGlvUHJlc2VudCA9IDB4MDI7Citjb25zdGV4cHIgdWludDhfdCBrTWV0YURhdGFQcmVzZW50ID0gMHgwNDsKKworc3RhdGljIE1wZWcydHNVbml0VGVzdEVudmlyb25tZW50ICpnRW52ID0gbnVsbHB0cjsKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIE1wZWcydHNVbml0VGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZyA6OlRlc3RXaXRoUGFyYW08CisgICAgICAgICAgICAgIHR1cGxlPC8qZmlsZU5hbWUqLyBzdHJpbmcsIC8qc291cmNlVHlwZSovIGNoYXIsIC8qbnVtU291cmNlKi8gdWludDE2X3Q+PiB7CisgIHB1YmxpYzoKKyAgICBNcGVnMnRzVW5pdFRlc3QoKQorICAgICAgICA6IG1JbnB1dEJ1ZmZlcihudWxscHRyKSwgbVNvdXJjZShudWxscHRyKSwgbUZwSW5wdXQobnVsbHB0ciksIG1QYXJzZXIobnVsbHB0cikge30KKworICAgIH5NcGVnMnRzVW5pdFRlc3QoKSB7CisgICAgICAgIGlmIChtSW5wdXRCdWZmZXIpIGZyZWUobUlucHV0QnVmZmVyKTsKKyAgICAgICAgaWYgKG1GcElucHV0KSBmY2xvc2UobUZwSW5wdXQpOworICAgICAgICBtU291cmNlLmNsZWFyKCk7CisgICAgfQorCisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbU9mZnNldCA9IDA7CisgICAgICAgIG1OdW1EYXRhU291cmNlID0gMDsKKyAgICAgICAgdHVwbGU8c3RyaW5nLCBjaGFyLCB1aW50MTZfdD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICAgICAgY2hhciBzb3VyY2VUeXBlID0gZ2V0PDE+KHBhcmFtcyk7CisgICAgICAgIC8qIG1Tb3VyY2VUeXBlID0gMGIgeCB4IHggeCB4IE0gQSBWCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAgfCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhICBhdWRpbyAgdmlkZW8gKi8KKyAgICAgICAgbU1lZGlhVHlwZSA9IChzb3VyY2VUeXBlICYgMHgwNyk7CisgICAgICAgIG1OdW1EYXRhU291cmNlID0gZ2V0PDI+KHBhcmFtcyk7CisgICAgICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwwPihwYXJhbXMpOworICAgICAgICBtRnBJbnB1dCA9IGZvcGVuKGlucHV0RmlsZS5jX3N0cigpLCAicmIiKTsKKyAgICAgICAgQVNTRVJUX05FKG1GcElucHV0LCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIG9wZW4gZmlsZTogIiA8PCBpbnB1dEZpbGU7CisKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBpbnQ4X3QgZXJyID0gc3RhdChpbnB1dEZpbGUuY19zdHIoKSwgJmJ1Zik7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGZvciBmaWxlOiAiIDw8IGlucHV0RmlsZTsKKworICAgICAgICBsb25nIGZpbGVTaXplID0gYnVmLnN0X3NpemU7CisgICAgICAgIG1Ub3RhbFBhY2tldHMgPSBmaWxlU2l6ZSAvIGtUU1BhY2tldFNpemU7CisgICAgICAgIGludDMyX3QgZmQgPSBmaWxlbm8obUZwSW5wdXQpOworICAgICAgICBBU1NFUlRfR0UoZmQsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBpbnRlZ2VyIGZpbGUgZGVzY3JpcHRvciI7CisKKyAgICAgICAgbVNvdXJjZSA9IG5ldyBGaWxlU291cmNlKGR1cChmZCksIDAsIGJ1Zi5zdF9zaXplKTsKKyAgICAgICAgQVNTRVJUX05FKG1Tb3VyY2UsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBkYXRhIHNvdXJjZSEiOworCisgICAgICAgIG1QYXJzZXIgPSBuZXcgQVRTUGFyc2VyKCk7CisgICAgICAgIEFTU0VSVF9ORShtUGFyc2VyLCBudWxscHRyKSA8PCAiVW5hYmxlIHRvIGNyZWF0ZSBBVFMgcGFyc2VyISI7CisgICAgICAgIG1JbnB1dEJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKGtUU1BhY2tldFNpemUpOworICAgICAgICBBU1NFUlRfTkUobUlucHV0QnVmZmVyLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgVFMgcGFja2V0ISI7CisgICAgfQorCisgICAgdWludDY0X3QgbU9mZnNldDsKKyAgICB1aW50NjRfdCBtVG90YWxQYWNrZXRzOworICAgIHVpbnQxNl90IG1OdW1EYXRhU291cmNlOworCisgICAgaW50OF90IG1NZWRpYVR5cGU7CisKKyAgICB1aW50OF90ICptSW5wdXRCdWZmZXI7CisgICAgc3RyaW5nIG1JbnB1dEZpbGU7CisgICAgc3A8RGF0YVNvdXJjZT4gbVNvdXJjZTsKKyAgICBGSUxFICptRnBJbnB1dDsKKyAgICBBVFNQYXJzZXIgKm1QYXJzZXI7Cit9OworCitURVNUX1AoTXBlZzJ0c1VuaXRUZXN0LCBNZWRpYUluZm9UZXN0KSB7CisgICAgYm9vbCB2aWRlb0ZvdW5kID0gZmFsc2U7CisgICAgYm9vbCBhdWRpb0ZvdW5kID0gZmFsc2U7CisgICAgYm9vbCBtZXRhRGF0YUZvdW5kID0gZmFsc2U7CisgICAgYm9vbCBzeW5jUG9pbnRQcmVzZW50ID0gZmFsc2U7CisKKyAgICBpbnQxNl90IHRvdGFsRGF0YVNvdXJjZSA9IDA7CisgICAgaW50MzJfdCB2YWwzMiA9IDA7CisgICAgdWludDhfdCBudW1EYXRhU291cmNlID0gMDsKKyAgICB1aW50OF90IHBhY2tldFtrVFNQYWNrZXRTaXplXTsKKyAgICBzc2l6ZV90IG51bUJ5dGVzUmVhZCA9IC0xOworCisgICAgQVRTUGFyc2VyOjpTeW5jRXZlbnQgZXZlbnQobU9mZnNldCk7CisgICAgc3RhdGljIGNvbnN0IEFUU1BhcnNlcjo6U291cmNlVHlwZSBtZWRpYVR5cGVbXSA9IHtBVFNQYXJzZXI6OlZJREVPLCBBVFNQYXJzZXI6OkFVRElPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpNRVRBLCBBVFNQYXJzZXI6Ok5VTV9TT1VSQ0VfVFlQRVN9OworICAgIGNvbnN0IHVpbnQzMl90IG5NZWRpYVR5cGVzID0gc2l6ZW9mKG1lZGlhVHlwZSkgLyBzaXplb2YobWVkaWFUeXBlWzBdKTsKKworICAgIHdoaWxlICgobnVtQnl0ZXNSZWFkID0gbVNvdXJjZS0+cmVhZEF0KG1PZmZzZXQsIHBhY2tldCwga1RTUGFja2V0U2l6ZSkpID09IGtUU1BhY2tldFNpemUpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUocGFja2V0WzBdID09IGtUU1N5bmNCeXRlKSA8PCAiU3luYyBieXRlIGVycm9yISI7CisKKyAgICAgICAgLy8gcGlkIGlzIDEzIGJpdHMKKyAgICAgICAgdWludDE2X3QgcGlkID0gKHBhY2tldFsxXSArIChwYWNrZXRbMl0gPDwgOCkpICYga1BJRE1hc2s7CisgICAgICAgIEFTU0VSVF9UUlVFKHBpZCA8PSBrUElETWF4VmFsdWUpIDw8ICJJbnZhbGlkIFBJRDogIiA8PCBwaWQ7CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbVBhcnNlci0+ZmVlZFRTUGFja2V0KHBhY2tldCwga1RTUGFja2V0U2l6ZSwgJmV2ZW50KTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgKHN0YXR1c190KU9LKSA8PCAiVW5hYmxlIHRvIGZlZWQgVFMgcGFja2V0ISI7CisKKyAgICAgICAgbU9mZnNldCArPSBudW1CeXRlc1JlYWQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbk1lZGlhVHlwZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKG1QYXJzZXItPmhhc1NvdXJjZShtZWRpYVR5cGVbaV0pKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChtZWRpYVR5cGVbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBVFNQYXJzZXI6OlZJREVPOgorICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9Gb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBVFNQYXJzZXI6OkFVRElPOgorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBVFNQYXJzZXI6Ok1FVEE6CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YUZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFUU1BhcnNlcjo6TlVNX1NPVVJDRV9UWVBFUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bURhdGFTb3VyY2UgPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZGVvRm91bmQgJiYgYXVkaW9Gb3VuZCAmJiBtZXRhRGF0YUZvdW5kICYmIChudW1EYXRhU291cmNlID09IDMpKSBicmVhazsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5NZWRpYVR5cGVzOyBpKyspIHsKKyAgICAgICAgQVRTUGFyc2VyOjpTb3VyY2VUeXBlIGN1cnJlbnRNZWRpYVR5cGUgPSBtZWRpYVR5cGVbaV07CisgICAgICAgIGlmIChtUGFyc2VyLT5oYXNTb3VyY2UoY3VycmVudE1lZGlhVHlwZSkpIHsKKyAgICAgICAgICAgIGlmIChldmVudC5oYXNSZXR1cm5lZERhdGEoKSkgeworICAgICAgICAgICAgICAgIHN5bmNQb2ludFByZXNlbnQgPSB0cnVlOworICAgICAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHN5bmNQYWNrZXRTb3VyY2UgPSBldmVudC5nZXRNZWRpYVNvdXJjZSgpOworICAgICAgICAgICAgICAgIEFTU0VSVF9ORShzeW5jUGFja2V0U291cmNlLCBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkNhbm5vdCBnZXQgc3luYyBzb3VyY2UgZm9yIG1lZGlhIHR5cGU6ICIgPDwgY3VycmVudE1lZGlhVHlwZTsKKworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHN5bmNQYWNrZXRTb3VyY2UtPnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGVyciwgKHN0YXR1c190KU9LKSA8PCAiRXJyb3IgcmV0dXJuZWQgd2hpbGUgc3RhcnRpbmchIjsKKworICAgICAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBzeW5jUGFja2V0U291cmNlLT5nZXRGb3JtYXQoKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfTkUoZm9ybWF0LCBudWxscHRyKSA8PCAiVW5hYmxlIHRvIGdldCB0aGUgZm9ybWF0IG9mIHRoZSBzb3VyY2UgcGFja2V0ISI7CisKKyAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZjsKKyAgICAgICAgICAgICAgICBzeW5jUGFja2V0U291cmNlLT5yZWFkKCZidWYsIG51bGxwdHIpOworICAgICAgICAgICAgICAgIEFTU0VSVF9ORShidWYsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gcmVhZCBzeW5jIHBhY2tldCBzb3VyY2UgZGF0YSI7CisKKyAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2UgJmluTWV0YSA9IGJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgYm9vbCBzdGF0dXMgPSBpbk1ldGEuZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJnZhbDMyKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCB0cnVlKSA8PCAiU3luYyBmcmFtZSBrZXkgaXMgbm90IHNldCI7CisKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBpbk1ldGEuZmluZEludDMyKGtLZXlDcnlwdG9Nb2RlLCAmdmFsMzIpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIGZhbHNlKSA8PCAiSW52YWxpZCBwYWNrZXQsIGZvdW5kIHNjcmFtYmxlZCBwYWNrZXRzISI7CisKKyAgICAgICAgICAgICAgICBlcnIgPSBzeW5jUGFja2V0U291cmNlLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGVyciwgKHN0YXR1c190KU9LKSA8PCAiRXJyb3IgcmV0dXJuZWQgd2hpbGUgc3RvcHBpbmchIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHBhY2tldFNvdXJjZSA9IG1QYXJzZXItPmdldFNvdXJjZShjdXJyZW50TWVkaWFUeXBlKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShwYWNrZXRTb3VyY2UsIG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDYW5ub3QgZ2V0IHNvdXJjZSBmb3IgbWVkaWEgdHlwZTogIiA8PCBjdXJyZW50TWVkaWFUeXBlOworCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYWNrZXRTb3VyY2UtPnN0YXJ0KCk7CisgICAgICAgICAgICBBU1NFUlRfRVEoZXJyLCAoc3RhdHVzX3QpT0spIDw8ICJFcnJvciByZXR1cm5lZCB3aGlsZSBzdGFydGluZyEiOworICAgICAgICAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IHBhY2tldFNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgICAgICAgICBBU1NFUlRfTkUoZm9ybWF0LCBudWxscHRyKSA8PCAiVW5hYmxlIHRvIGdldCB0aGUgZm9ybWF0IG9mIHRoZSBwYWNrZXQhIjsKKworICAgICAgICAgICAgZXJyID0gcGFja2V0U291cmNlLT5zdG9wKCk7CisgICAgICAgICAgICBBU1NFUlRfRVEoZXJyLCAoc3RhdHVzX3QpT0spIDw8ICJFcnJvciByZXR1cm5lZCB3aGlsZSBzdG9wcGluZyEiOworICAgICAgICB9CisgICAgfQorCisgICAgQVNTRVJUX0VRKHZpZGVvRm91bmQsIGJvb2wobU1lZGlhVHlwZSAmIGtWaWRlb1ByZXNlbnQpKSA8PCAiTm8gVmlkZW8gcGFja2V0cyBmb3VuZCEiOworICAgIEFTU0VSVF9FUShhdWRpb0ZvdW5kLCBib29sKG1NZWRpYVR5cGUgJiBrQXVkaW9QcmVzZW50KSkgPDwgIk5vIEF1ZGlvIHBhY2tldHMgZm91bmQhIjsKKyAgICBBU1NFUlRfRVEobWV0YURhdGFGb3VuZCwgYm9vbChtTWVkaWFUeXBlICYga01ldGFEYXRhUHJlc2VudCkpIDw8ICJObyBtZXRhIGRhdGEgZm91bmQhIjsKKworICAgIGlmICh2aWRlb0ZvdW5kIHx8IGF1ZGlvRm91bmQpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoc3luY1BvaW50UHJlc2VudCkgPDwgIk5vIHN5bmMgcG9pbnRzIGZvdW5kIGZvciBhdWRpby92aWRlbyI7CisgICAgfQorCisgICAgaWYgKHZpZGVvRm91bmQpIHRvdGFsRGF0YVNvdXJjZSArPSAxOworICAgIGlmIChhdWRpb0ZvdW5kKSB0b3RhbERhdGFTb3VyY2UgKz0gMTsKKyAgICBpZiAobWV0YURhdGFGb3VuZCkgdG90YWxEYXRhU291cmNlICs9IDE7CisKKyAgICBBU1NFUlRfVFJVRSh0b3RhbERhdGFTb3VyY2UgPT0gbU51bURhdGFTb3VyY2UpCisgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgIiA8PCBtTnVtRGF0YVNvdXJjZSA8PCAiIGRhdGEgc291cmNlcywgZm91bmQgIiA8PCB0b3RhbERhdGFTb3VyY2U7CisgICAgaWYgKG51bURhdGFTb3VyY2UgPT0gMykgeworICAgICAgICBBU1NFUlRfRVEobnVtRGF0YVNvdXJjZSwgbU51bURhdGFTb3VyY2UpCisgICAgICAgICAgICAgICAgPDwgIkV4cGVjdGVkICIgPDwgbU51bURhdGFTb3VyY2UgPDwgIiBkYXRhIHNvdXJjZXMsIGZvdW5kICIgPDwgdG90YWxEYXRhU291cmNlOworICAgIH0KK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBpbmZvVGVzdCwgTXBlZzJ0c1VuaXRUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNjcwMGticHNfaDI2NC50cyIsIDB4MDEsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJzZWdtZW50MDAwMDAxLnRzIiwgMHgwMywgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWlucy50cyIsIDB4MDIsIDEpKSk7CisKK2ludDMyX3QgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IE1wZWcydHNVbml0VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgdWludDhfdCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR1YoIk1wZWcydHNVbml0IFRlc3QgUmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvTXBlZzJ0c1VuaXRUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9NcGVnMnRzVW5pdFRlc3RFbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNDFkYjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvTXBlZzJ0c1VuaXRUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX01QRUcyVFNfVU5JVF9URVNUX0VOVklST05NRU5UX0hfXworI2RlZmluZSBfX01QRUcyVFNfVU5JVF9URVNUX0VOVklST05NRU5UX0hfXworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGdldG9wdC5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjbGFzcyBNcGVnMnRzVW5pdFRlc3RFbnZpcm9ubWVudCA6IHB1YmxpYzo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgTXBlZzJ0c1VuaXRUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL2RhdGEvbG9jYWwvdG1wLyIpIHt9CisKKyAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyICpfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IHN0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KKworICBwcml2YXRlOgorICAgIHN0cmluZyByZXM7Cit9OworCitpbnQgTXBlZzJ0c1VuaXRUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJwYXRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdQJ30sIHswLCAwLCAwLCAwfX07CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJQOiIsIG9wdGlvbnMsICZpbmRleCk7CisgICAgICAgIGlmIChjID09IC0xKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnUCc6IHsKKyAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgorICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gX19NUEVHMlRTX1VOSVRfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzN2NlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzggQEAKKyMjIE1lZGlhIFRlc3RpbmcgIyMKKy0tLQorIyMjIyBNcGVnMlRTIFVuaXQgVGVzdCA6CitUaGUgTXBlZzJUUyBVbml0IFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBsaWJyYXJpZXMgcHJlc2VudCBpbiBNcGVnMlRTLgorCitSdW4gdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB0aGUgdGVzdCBzdWl0ZToKK2BgYAorbW1tIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0LworYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCisKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9NcGVnMnRzVW5pdFRlc3QvTXBlZzJ0c1VuaXRUZXN0IC9kYXRhL2xvY2FsL3RtcC8KKworVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgorCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L01wZWcydHNVbml0VGVzdC9NcGVnMnRzVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L01wZWcydHNVbml0VGVzdC56aXAgKS4KK0Rvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KKworYGBgCithZGIgcHVzaCBNcGVnMnRzVW5pdFRlc3RSZXMvLiAvZGF0YS9sb2NhbC90bXAvCitgYGAKKwordXNhZ2U6IE1wZWcydHNVbml0VGVzdCAtUCBcPHBhdGhfdG9fZm9sZGVyXD4KK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9NcGVnMnRzVW5pdFRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL01wZWcydHNVbml0VGVzdFJlcy8KK2BgYAorQWx0ZXJuYXRpdmVseSwgdGhlIHRlc3QgY2FuIGFsc28gYmUgcnVuIHVzaW5nIGF0ZXN0IGNvbW1hbmQuCisKK2BgYAorYXRlc3QgTXBlZzJ0c1VuaXRUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwCmluZGV4IGVlZjljZTMuLmViMTUwMzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Bc1N0cmluZy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PbXhHcmFwaGljQnVmZmVyU291cmNlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhOb2RlLmg+CkBAIC00MSwyMSArNDEsMjEgQEAKIGNvbnN0ZXhwciBzaXplX3Qga01heE5vZGVJbnN0YW5jZXMgPSAoMSA8PCAxNik7CiAKIE9teDo6T214KCkgOgotICAgIG1NYXN0ZXIobmV3IE9NWE1hc3RlcigpKSwKKyAgICBtU3RvcmUobmV3IE9NWFN0b3JlKCkpLAogICAgIG1QYXJzZXIoKSB7CiAgICAgKHZvaWQpbVBhcnNlci5wYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKCk7CiAgICAgKHZvaWQpbVBhcnNlci5wYXJzZVhtbFBhdGgobVBhcnNlci5kZWZhdWx0UHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpOwogfQogCiBPbXg6On5PbXgoKSB7Ci0gICAgZGVsZXRlIG1NYXN0ZXI7CisgICAgZGVsZXRlIG1TdG9yZTsKIH0KIAogUmV0dXJuPHZvaWQ+IE9teDo6bGlzdE5vZGVzKGxpc3ROb2Rlc19jYiBfaGlkbF9jYikgewogICAgIHN0ZDo6bGlzdDw6OmFuZHJvaWQ6OklPTVg6OkNvbXBvbmVudEluZm8+IGxpc3Q7CiAgICAgY2hhciBjb21wb25lbnROYW1lWzI1Nl07CiAgICAgZm9yIChPTVhfVTMyIGluZGV4ID0gMDsKLSAgICAgICAgICAgIG1NYXN0ZXItPmVudW1lcmF0ZUNvbXBvbmVudHMoCisgICAgICAgICAgICBtU3RvcmUtPmVudW1lcmF0ZUNvbXBvbmVudHMoCiAgICAgICAgICAgICBjb21wb25lbnROYW1lLCBzaXplb2YoY29tcG9uZW50TmFtZSksIGluZGV4KSA9PSBPTVhfRXJyb3JOb25lOwogICAgICAgICAgICAgKytpbmRleCkgewogICAgICAgICBsaXN0LnB1c2hfYmFjayg6OmFuZHJvaWQ6OklPTVg6OkNvbXBvbmVudEluZm8oKSk7CkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgIGluZm8ubU5hbWUgPSBjb21wb25lbnROYW1lOwogICAgICAgICA6OmFuZHJvaWQ6OlZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzg+IHJvbGVzOwogICAgICAgICBPTVhfRVJST1JUWVBFIGVyciA9Ci0gICAgICAgICAgICAgICAgbU1hc3Rlci0+Z2V0Um9sZXNPZkNvbXBvbmVudChjb21wb25lbnROYW1lLCAmcm9sZXMpOworICAgICAgICAgICAgICAgIG1TdG9yZS0+Z2V0Um9sZXNPZkNvbXBvbmVudChjb21wb25lbnROYW1lLCAmcm9sZXMpOwogICAgICAgICBpZiAoZXJyID09IE9NWF9FcnJvck5vbmUpIHsKICAgICAgICAgICAgIGZvciAoT01YX1UzMiBpID0gMDsgaSA8IHJvbGVzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICAgICAgaW5mby5tUm9sZXMucHVzaF9iYWNrKHJvbGVzW2ldKTsKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgICAgICAgICAgICAgIHRoaXMsIG5ldyBMV09teE9ic2VydmVyKG9ic2VydmVyKSwgbmFtZS5jX3N0cigpKTsKIAogICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqaGFuZGxlOwotICAgICAgICBPTVhfRVJST1JUWVBFIGVyciA9IG1NYXN0ZXItPm1ha2VDb21wb25lbnRJbnN0YW5jZSgKKyAgICAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBtU3RvcmUtPm1ha2VDb21wb25lbnRJbnN0YW5jZSgKICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksICZPTVhOb2RlSW5zdGFuY2U6OmtDYWxsYmFja3MsCiAgICAgICAgICAgICAgICAgaW5zdGFuY2UuZ2V0KCksICZoYW5kbGUpOwogCkBAIC0yMDgsNyArMjA4LDcgQEAKIAogICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX0Vycm9yTm9uZTsKICAgICBpZiAoaW5zdGFuY2UtPmhhbmRsZSgpICE9IE5VTEwpIHsKLSAgICAgICAgZXJyID0gbU1hc3Rlci0+ZGVzdHJveUNvbXBvbmVudEluc3RhbmNlKAorICAgICAgICBlcnIgPSBtU3RvcmUtPmRlc3Ryb3lDb21wb25lbnRJbnN0YW5jZSgKICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxPTVhfQ09NUE9ORU5UVFlQRSo+KGluc3RhbmNlLT5oYW5kbGUoKSkpOwogICAgIH0KICAgICByZXR1cm4gU3RhdHVzRnJvbU9NWEVycm9yKGVycik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCmluZGV4IDY3ZjQ3OGUuLmI1YzExNjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCkBAIC01NCw2ICs1NCwyNCBAQAogICAgICAgICB9KTsKICAgICB9CiAKKyAgICBpZiAoIW5vZGVzLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBhbnlOb2RlID0gbm9kZXMuY2JlZ2luKCk7CisgICAgICAgIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBmaXJzdCA9IGFueU5vZGUtPmNiZWdpbigpOworICAgICAgICBzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgbGFzdCA9IGFueU5vZGUtPmNlbmQoKTsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSA6IG5vZGVzKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXQxID0gZmlyc3Q7CisgICAgICAgICAgICBmb3IgKHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdDIgPSBuYW1lLmNiZWdpbigpOworICAgICAgICAgICAgICAgICAgICBpdDEgIT0gbGFzdCAmJiBpdDIgIT0gbmFtZS5jZW5kKCkgJiYgdG9sb3dlcigqaXQxKSA9PSB0b2xvd2VyKCppdDIpOworICAgICAgICAgICAgICAgICAgICArK2l0MSwgKytpdDIpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3QgPSBpdDE7CisgICAgICAgIH0KKyAgICAgICAgbVByZWZpeCA9IHN0ZDo6c3RyaW5nKGZpcnN0LCBsYXN0KTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJvbXggY29tbW9uIHByZWZpeDogJyIgPDwgbVByZWZpeC5jX3N0cigpIDw8ICInIjsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0coSU5GTykgPDwgIm9teCBjb21tb24gcHJlZml4OiBubyBub2RlcyI7CisgICAgfQorCiAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXIgcGFyc2VyOwogICAgIHBhcnNlci5wYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKHhtbE5hbWVzLCBzZWFyY2hEaXJzKTsKICAgICBpZiAocHJvZmlsaW5nUmVzdWx0c1htbFBhdGggIT0gbnVsbHB0cikgewpAQCAtMTEyLDggKzEzMCw2IEBACiAgICAgICAgIG1Sb2xlTGlzdFtpXSA9IHN0ZDo6bW92ZShyb2xlKTsKICAgICAgICAgKytpOwogICAgIH0KLQotICAgIG1QcmVmaXggPSBwYXJzZXIuZ2V0Q29tbW9uUHJlZml4KCk7CiB9CiAKIE9teFN0b3JlOjp+T214U3RvcmUoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwCmluZGV4IDc4YjRmMTkuLjU0YzU2OTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMjIgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9vbXhfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfb214X2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLApAQCAtNyw3ICsyNiw3IEBACiAgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAogCiAgICAgc3JjczogWwotICAgICAgICAiT01YTWFzdGVyLmNwcCIsCisgICAgICAgICJPTVhTdG9yZS5jcHAiLAogICAgICAgICAiT01YTm9kZUluc3RhbmNlLmNwcCIsCiAgICAgICAgICJPTVhVdGlscy5jcHAiLAogICAgICAgICAiT214R3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAiLApAQCAtMjI3LDQgKzI0NiwzIEBACiAgICAgfSwKICAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCmluZGV4IGFjNDIzNzMuLmJlYmQ1MTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9JT01YQnVmZmVyU291cmNlLmg+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmNwcApzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmNwcAppbmRleCAwOTRiMWY1Li5lOGZlZTQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuY3BwCkBAIC0xNSwxMSArMTUsMTEgQEAKICAqLwogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk9NWE1hc3RlciIKKyNkZWZpbmUgTE9HX1RBRyAiT01YU3RvcmUiCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAKQEAgLTMwLDcgKzMwLDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1PTVhNYXN0ZXI6Ok9NWE1hc3RlcigpIHsKK09NWFN0b3JlOjpPTVhTdG9yZSgpIHsKIAogICAgIHBpZF90IHBpZCA9IGdldHBpZCgpOwogICAgIGNoYXIgZmlsZW5hbWVbMjBdOwpAQCAtNTUsMTkgKzU1LDE5IEBACiAgICAgYWRkUGxhdGZvcm1QbHVnaW4oKTsKIH0KIAotT01YTWFzdGVyOjp+T01YTWFzdGVyKCkgeworT01YU3RvcmU6On5PTVhTdG9yZSgpIHsKICAgICBjbGVhclBsdWdpbnMoKTsKIH0KIAotdm9pZCBPTVhNYXN0ZXI6OmFkZFZlbmRvclBsdWdpbigpIHsKK3ZvaWQgT01YU3RvcmU6OmFkZFZlbmRvclBsdWdpbigpIHsKICAgICBhZGRQbHVnaW4oImxpYnN0YWdlZnJpZ2h0aHcuc28iKTsKIH0KIAotdm9pZCBPTVhNYXN0ZXI6OmFkZFBsYXRmb3JtUGx1Z2luKCkgewordm9pZCBPTVhTdG9yZTo6YWRkUGxhdGZvcm1QbHVnaW4oKSB7CiAgICAgYWRkUGx1Z2luKCJsaWJzdGFnZWZyaWdodF9zb2Z0b214X3BsdWdpbi5zbyIpOwogfQogCi12b2lkIE9NWE1hc3Rlcjo6YWRkUGx1Z2luKGNvbnN0IGNoYXIgKmxpYm5hbWUpIHsKK3ZvaWQgT01YU3RvcmU6OmFkZFBsdWdpbihjb25zdCBjaGFyICpsaWJuYW1lKSB7CiAgICAgaWYgKDo6YW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoInZlbmRvci5tZWRpYS5vbXgiLCBpbnQ2NF90KDEpKSA9PSAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC05OSw3ICs5OSw3IEBACiAgICAgfQogfQogCi12b2lkIE9NWE1hc3Rlcjo6YWRkUGx1Z2luKE9NWFBsdWdpbkJhc2UgKnBsdWdpbikgewordm9pZCBPTVhTdG9yZTo6YWRkUGx1Z2luKE9NWFBsdWdpbkJhc2UgKnBsdWdpbikgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBPTVhfVTMyIGluZGV4ID0gMDsKQEAgLTEyNiw3ICsxMjYsNyBAQAogICAgIH0KIH0KIAotdm9pZCBPTVhNYXN0ZXI6OmNsZWFyUGx1Z2lucygpIHsKK3ZvaWQgT01YU3RvcmU6OmNsZWFyUGx1Z2lucygpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgbVBsdWdpbkJ5Q29tcG9uZW50TmFtZS5jbGVhcigpOwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAgICAgbVBsdWdpbnMuY2xlYXIoKTsKIH0KIAotT01YX0VSUk9SVFlQRSBPTVhNYXN0ZXI6Om1ha2VDb21wb25lbnRJbnN0YW5jZSgKK09NWF9FUlJPUlRZUEUgT01YU3RvcmU6Om1ha2VDb21wb25lbnRJbnN0YW5jZSgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICBPTVhfUFRSIGFwcERhdGEsCkBAIC0xNzcsNyArMTc3LDcgQEAKICAgICByZXR1cm4gZXJyOwogfQogCi1PTVhfRVJST1JUWVBFIE9NWE1hc3Rlcjo6ZGVzdHJveUNvbXBvbmVudEluc3RhbmNlKAorT01YX0VSUk9SVFlQRSBPTVhTdG9yZTo6ZGVzdHJveUNvbXBvbmVudEluc3RhbmNlKAogICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqY29tcG9uZW50KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIApAQCAtMTkzLDcgKzE5Myw3IEBACiAgICAgcmV0dXJuIHBsdWdpbi0+ZGVzdHJveUNvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudCk7CiB9CiAKLU9NWF9FUlJPUlRZUEUgT01YTWFzdGVyOjplbnVtZXJhdGVDb21wb25lbnRzKAorT01YX0VSUk9SVFlQRSBPTVhTdG9yZTo6ZW51bWVyYXRlQ29tcG9uZW50cygKICAgICAgICAgT01YX1NUUklORyBuYW1lLAogICAgICAgICBzaXplX3Qgc2l6ZSwKICAgICAgICAgT01YX1UzMiBpbmRleCkgewpAQCAtMjEzLDcgKzIxMyw3IEBACiAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiB9CiAKLU9NWF9FUlJPUlRZUEUgT01YTWFzdGVyOjpnZXRSb2xlc09mQ29tcG9uZW50KAorT01YX0VSUk9SVFlQRSBPTVhTdG9yZTo6Z2V0Um9sZXNPZkNvbXBvbmVudCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgVmVjdG9yPFN0cmluZzg+ICpyb2xlcykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcAppbmRleCAxYjg0OTNhLi5kNmQyODBmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAKQEAgLTM1NCw3ICszNTQsNyBAQAogICAgIERlc2NyaWJlQ29sb3JGb3JtYXQyUGFyYW1zIGRlc2NyaWJlUGFyYW1zOwogICAgIEluaXRPTVhQYXJhbXMoJmRlc2NyaWJlUGFyYW1zKTsKICAgICBkZXNjcmliZVBhcmFtcy5lQ29sb3JGb3JtYXQgPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpY29sb3JGb3JtYXQ7Ci0gICAgLy8gcmVhc29uYWJsZSBkdW1teSB2YWx1ZXMKKyAgICAvLyByZWFzb25hYmxlIGluaXRpYWwgdmFsdWVzICh0aGF0IHdpbGwgYmUgb3ZlcndyaXR0ZW4pCiAgICAgZGVzY3JpYmVQYXJhbXMubkZyYW1lV2lkdGggPSAxMjg7CiAgICAgZGVzY3JpYmVQYXJhbXMubkZyYW1lSGVpZ2h0ID0gMTI4OwogICAgIGRlc2NyaWJlUGFyYW1zLm5TdHJpZGUgPSAxMjg7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaAppbmRleCA1YTQ2YjI2Li44NGFlNTExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214LmgKQEAgLTI3LDcgKzI3LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgT01YTWFzdGVyOworc3RydWN0IE9NWFN0b3JlOwogc3RydWN0IE9NWE5vZGVJbnN0YW5jZTsKIAogbmFtZXNwYWNlIGhhcmR3YXJlIHsKQEAgLTUxLDcgKzUxLDcgQEAKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CiB1c2luZyA6OmFuZHJvaWQ6OndwOwogCi11c2luZyA6OmFuZHJvaWQ6Ok9NWE1hc3RlcjsKK3VzaW5nIDo6YW5kcm9pZDo6T01YU3RvcmU7CiB1c2luZyA6OmFuZHJvaWQ6Ok9NWE5vZGVJbnN0YW5jZTsKIAogc3RydWN0IE9teCA6IHB1YmxpYyBJT214LCBwdWJsaWMgaGlkbF9kZWF0aF9yZWNpcGllbnQgewpAQCAtNzMsNyArNzMsNyBAQAogICAgIHN0YXR1c190IGZyZWVOb2RlKHNwPE9NWE5vZGVJbnN0YW5jZT4gY29uc3QmIGluc3RhbmNlKTsKIAogcHJvdGVjdGVkOgotICAgIE9NWE1hc3RlciogbU1hc3RlcjsKKyAgICBPTVhTdG9yZSogbVN0b3JlOwogICAgIE11dGV4IG1Mb2NrOwogICAgIEtleWVkVmVjdG9yPHdwPElCYXNlPiwgc3A8T01YTm9kZUluc3RhbmNlPiA+IG1MaXZlTm9kZXM7CiAgICAgS2V5ZWRWZWN0b3I8T01YTm9kZUluc3RhbmNlKiwgd3A8SUJhc2U+ID4gbU5vZGUyT2JzZXJ2ZXI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmgKaW5kZXggYTc2MWVmNi4uNWYzMmM5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuaApAQCAtMzMsNyArMzMsNyBAQAogY2xhc3MgR3JhcGhpY0J1ZmZlcjsKIGNsYXNzIElPTVhCdWZmZXJTb3VyY2U7CiBjbGFzcyBJT01YT2JzZXJ2ZXI7Ci1zdHJ1Y3QgT01YTWFzdGVyOworc3RydWN0IE9NWFN0b3JlOwogY2xhc3MgT01YQnVmZmVyOwogdXNpbmcgSUhpZGxNZW1vcnkgPSBoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnk7CiB1c2luZyBoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6aW1wbGVtZW50YXRpb246Ok9teDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5oCnNpbWlsYXJpdHkgaW5kZXggODglCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmgKaW5kZXggOTNlYWVmMS4uNWQ2YzNlZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5oCkBAIC0xNCw5ICsxNCw5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIE9NWF9NQVNURVJfSF8KKyNpZm5kZWYgT01YX1NUT1JFX0hfCiAKLSNkZWZpbmUgT01YX01BU1RFUl9IXworI2RlZmluZSBPTVhfU1RPUkVfSF8KIAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL09NWFBsdWdpbkJhc2UuaD4KIApAQCAtMjcsOSArMjcsOSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBPTVhNYXN0ZXIgOiBwdWJsaWMgT01YUGx1Z2luQmFzZSB7Ci0gICAgT01YTWFzdGVyKCk7Ci0gICAgdmlydHVhbCB+T01YTWFzdGVyKCk7CitzdHJ1Y3QgT01YU3RvcmUgOiBwdWJsaWMgT01YUGx1Z2luQmFzZSB7CisgICAgT01YU3RvcmUoKTsKKyAgICB2aXJ0dWFsIH5PTVhTdG9yZSgpOwogCiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIG1ha2VDb21wb25lbnRJbnN0YW5jZSgKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCkBAIC02NiwxMCArNjYsMTAgQEAKICAgICB2b2lkIGFkZFBsdWdpbihPTVhQbHVnaW5CYXNlICpwbHVnaW4pOwogICAgIHZvaWQgY2xlYXJQbHVnaW5zKCk7CiAKLSAgICBPTVhNYXN0ZXIoY29uc3QgT01YTWFzdGVyICYpOwotICAgIE9NWE1hc3RlciAmb3BlcmF0b3I9KGNvbnN0IE9NWE1hc3RlciAmKTsKKyAgICBPTVhTdG9yZShjb25zdCBPTVhTdG9yZSAmKTsKKyAgICBPTVhTdG9yZSAmb3BlcmF0b3I9KGNvbnN0IE9NWFN0b3JlICYpOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAotI2VuZGlmICAvLyBPTVhfTUFTVEVSX0hfCisjZW5kaWYgIC8vIE9NWF9TVE9SRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icAppbmRleCBmZWZiM2JiLi44M2NjODBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icApAQCAtMSwzICsxLDIyIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfb214X3Rlc3RzX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X29teF90ZXN0c19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAib214X3Rlc3RzIiwKICAgICBndGVzdDogZmFsc2UsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmNwcAppbmRleCA0YmM2N2U4Li4yZjkzZDVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5jcHAKQEAgLTI1LDggKzI1LDExIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CisKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzcsMzYgKzQwLDE0MiBAQAogICAgICAgbUFjY2Vzc1VuaXRSVFBUaW1lKDApLAogICAgICAgbU5leHRFeHBlY3RlZFNlcU5vVmFsaWQoZmFsc2UpLAogICAgICAgbU5leHRFeHBlY3RlZFNlcU5vKDApLAotICAgICAgbUFjY2Vzc1VuaXREYW1hZ2VkKGZhbHNlKSB7CisgICAgICBtQWNjZXNzVW5pdERhbWFnZWQoZmFsc2UpLAorICAgICAgbUZpcnN0SUZyYW1lUHJvdmlkZWQoZmFsc2UpLAorICAgICAgbUxhc3RJRnJhbWVQcm92aWRlZEF0TXMoMCksCisgICAgICBtV2lkdGgoMCksCisgICAgICBtSGVpZ2h0KDApIHsKIH0KIAogQUFWQ0Fzc2VtYmxlcjo6fkFBVkNBc3NlbWJsZXIoKSB7CiB9CiAKK2ludDMyX3QgQUFWQ0Fzc2VtYmxlcjo6YWRkTmFjaygKKyAgICAgICAgY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSkgeworICAgIExpc3Q8c3A8QUJ1ZmZlcj4+ICpxdWV1ZSA9IHNvdXJjZS0+cXVldWUoKTsKKyAgICBpbnQzMl90IG5hY2tDb3VudCA9IDA7CisKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gcXVldWUtPmJlZ2luKCk7CisKKyAgICBpZiAoaXQgPT0gcXVldWUtPmVuZCgpKSB7CisgICAgICAgIHJldHVybiBuYWNrQ291bnQgLyogMCAqLzsKKyAgICB9CisKKyAgICB1aW50MTZfdCBxdWV1ZUhlYWRTZXFOdW0gPSAoKml0KS0+aW50MzJEYXRhKCk7CisKKyAgICAvLyBtb3ZlIHRvIHRoZSBwYWNrZXQgYWZ0ZXIgd2hpY2ggUlRDUDpOQUNLIHdhcyBzZW50LgorICAgIGZvciAoOyBpdCAhPSBxdWV1ZS0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaW50MzJfdCBzZXFOdW0gPSAoKml0KS0+aW50MzJEYXRhKCk7CisgICAgICAgIGlmIChzZXFOdW0gPj0gc291cmNlLT5tSGlnaGVzdE5hY2tOdW1iZXIpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaW50MzJfdCBuYWNrU3RhcnRBdCA9IC0xOworCisgICAgd2hpbGUgKGl0ICE9IHF1ZXVlLT5lbmQoKSkgeworICAgICAgICBpbnQzMl90IHNlcUJlZm9yZUxhc3QgPSAoKml0KS0+aW50MzJEYXRhKCk7CisgICAgICAgIC8vIGluY3JlYXNlIGl0ZXJhdG9yLgorICAgICAgICBpZiAoKCsraXQpID09IHF1ZXVlLT5lbmQoKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBzZXFMYXN0ID0gKCppdCktPmludDMyRGF0YSgpOworCisgICAgICAgIGlmICgoc2VxTGFzdCAtIHNlcUJlZm9yZUxhc3QpIDwgMCkgeworICAgICAgICAgICAgQUxPR0QoImFkZE5hY2s6IGZvdW5kIGVuZCBvZiBzZXFOdW0gZnJvbSglZCkgdG8oJWQpIiwgc2VxQmVmb3JlTGFzdCwgc2VxTGFzdCk7CisgICAgICAgICAgICBzb3VyY2UtPm1IaWdoZXN0TmFja051bWJlciA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBtaXNzZWQgcGFja2V0IGZvdW5kCisgICAgICAgIGlmIChzZXFMYXN0ID4gKHNlcUJlZm9yZUxhc3QgKyAxKSAmJgorICAgICAgICAgICAgICAgIC8vIHdlIGRpZG4ndCBzZW5kIFJUQ1A6TkFDSyBmb3IgdGhpcyBwYWNrZXQgeWV0LgorICAgICAgICAgICAgICAgIChzZXFMYXN0IC0gMSkgPiBzb3VyY2UtPm1IaWdoZXN0TmFja051bWJlcikgeworICAgICAgICAgICAgc291cmNlLT5tSGlnaGVzdE5hY2tOdW1iZXIgPSBzZXFMYXN0IC0gMTsKKyAgICAgICAgICAgIG5hY2tTdGFydEF0ID0gc2VxQmVmb3JlTGFzdCArIDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgaWYgKG5hY2tTdGFydEF0ICE9IC0xKSB7CisgICAgICAgIG5hY2tDb3VudCA9IHNvdXJjZS0+bUhpZ2hlc3ROYWNrTnVtYmVyIC0gbmFja1N0YXJ0QXQgKyAxOworICAgICAgICBBTE9HRCgiYWRkTmFjazogbmFja0NvdW50PSVkLCBuYWNrRnJvbT0lZCwgbmFja1RvPSVkIiwgbmFja0NvdW50LAorICAgICAgICAgICAgICAgIG5hY2tTdGFydEF0LCBzb3VyY2UtPm1IaWdoZXN0TmFja051bWJlcik7CisKKyAgICAgICAgdWludDE2X3QgbWFzayA9ICh1aW50MTZfdCkoMHhmZmZmKSA+PiAoMTYgLSBuYWNrQ291bnQgKyAxKTsKKyAgICAgICAgc291cmNlLT5zZXRTZXFOdW1Ub05BQ0sobmFja1N0YXJ0QXQsIG1hc2ssIHF1ZXVlSGVhZFNlcU51bSk7CisgICAgfQorCisgICAgcmV0dXJuIG5hY2tDb3VudDsKK30KKwogQVJUUEFzc2VtYmxlcjo6QXNzZW1ibHlTdGF0dXMgQUFWQ0Fzc2VtYmxlcjo6YWRkTkFMVW5pdCgKICAgICAgICAgY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSkgewogICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPiAqcXVldWUgPSBzb3VyY2UtPnF1ZXVlKCk7CisgICAgY29uc3QgdWludDMyX3QgZmlyc3RSVFBUaW1lID0gc291cmNlLT5tRmlyc3RSdHBUaW1lOwogCiAgICAgaWYgKHF1ZXVlLT5lbXB0eSgpKSB7CiAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CiAgICAgfQogCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gKnF1ZXVlLT5iZWdpbigpOworICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRPYmplY3QoInNvdXJjZSIsIHNvdXJjZSk7CisKKyAgICBpbnQ2NF90IHJ0cFRpbWUgPSBmaW5kUlRQVGltZShmaXJzdFJUUFRpbWUsIGJ1ZmZlcik7CisKKyAgICBpbnQ2NF90IHN0YXJ0VGltZSA9IHNvdXJjZS0+bUZpcnN0U3lzVGltZSAvIDEwMDA7CisgICAgaW50NjRfdCBub3dUaW1lID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAvIDEwMDA7CisgICAgaW50NjRfdCBwbGF5ZWRUaW1lID0gbm93VGltZSAtIHN0YXJ0VGltZTsKKworICAgIGludDY0X3QgcGxheWVkVGltZVJ0cCA9IHNvdXJjZS0+bUZpcnN0UnRwVGltZSArIHBsYXllZFRpbWUgKiAoaW50NjRfdClzb3VyY2UtPm1DbG9ja1JhdGUgLyAxMDAwOworICAgIGNvbnN0IGludDY0X3Qgaml0dGVyVGltZSA9IHNvdXJjZS0+bUpiVGltZU1zICogKGludDY0X3Qpc291cmNlLT5tQ2xvY2tSYXRlIC8gMTAwMDsKKworICAgIGludDY0X3QgZXhwaXJlZFRpbWVJbkpiID0gcnRwVGltZSArIGppdHRlclRpbWU7CisgICAgYm9vbCBpc0V4cGlyZWQgPSBleHBpcmVkVGltZUluSmIgPD0gKHBsYXllZFRpbWVSdHApOworICAgIGJvb2wgaXNUb29MYXRlMjAwID0gZXhwaXJlZFRpbWVJbkpiIDwgKHBsYXllZFRpbWVSdHAgLSBqaXR0ZXJUaW1lKTsKKyAgICBib29sIGlzVG9vTGF0ZTMwMCA9IGV4cGlyZWRUaW1lSW5KYiA8IChwbGF5ZWRUaW1lUnRwIC0gKGppdHRlclRpbWUgKiAzIC8gMikpOworCisgICAgaWYgKG1TaG93UXVldWUgJiYgbVNob3dRdWV1ZUNudCA8IDIwKSB7CisgICAgICAgIHNob3dDdXJyZW50UXVldWUocXVldWUpOworICAgICAgICBwcmludE5vd1RpbWVVcyhzdGFydFRpbWUsIG5vd1RpbWUsIHBsYXllZFRpbWUpOworICAgICAgICBwcmludFJUUFRpbWUocnRwVGltZSwgcGxheWVkVGltZVJ0cCwgZXhwaXJlZFRpbWVJbkpiLCBpc0V4cGlyZWQpOworICAgICAgICBtU2hvd1F1ZXVlQ250Kys7CisgICAgfQorCisgICAgQUFWQ0Fzc2VtYmxlcjo6YWRkTmFjayhzb3VyY2UpOworCisgICAgaWYgKCFpc0V4cGlyZWQpIHsKKyAgICAgICAgQUxPR1YoImJ1ZmZlcmluZyBpbiBqaXR0ZXIgYnVmZmVyLiIpOworICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgIH0KKworICAgIGlmIChpc1Rvb0xhdGUyMDApIHsKKyAgICAgICAgQUxPR1coIj09PSBXQVJOSU5HID09PSBidWZmZXIgYXJyaXZlZCAyMDBtcyBsYXRlLiA9PT0gV0FSTklORyA9PT0gIik7CisgICAgfQorCisgICAgaWYgKGlzVG9vTGF0ZTMwMCkgeworICAgICAgICBBTE9HVygiYnVmZmVyIGFycml2ZWQgYWZ0ZXIgMzAwbXMgLi4uIFx0IERpZmYgaW4gSmI9JWxsZCBcdCBTZXEjICVkIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKShwbGF5ZWRUaW1lUnRwIC0gZXhwaXJlZFRpbWVJbkpiKSwgYnVmZmVyLT5pbnQzMkRhdGEoKSk7CisgICAgICAgIHByaW50Tm93VGltZVVzKHN0YXJ0VGltZSwgbm93VGltZSwgcGxheWVkVGltZSk7CisgICAgICAgIHByaW50UlRQVGltZShydHBUaW1lLCBwbGF5ZWRUaW1lUnRwLCBleHBpcmVkVGltZUluSmIsIGlzRXhwaXJlZCk7CisKKyAgICAgICAgbU5leHRFeHBlY3RlZFNlcU5vID0gcGlja1Byb3BlclNlcShxdWV1ZSwgZmlyc3RSVFBUaW1lLCBwbGF5ZWRUaW1lUnRwLCBqaXR0ZXJUaW1lKTsKKyAgICB9CisKICAgICBpZiAobU5leHRFeHBlY3RlZFNlcU5vVmFsaWQpIHsKLSAgICAgICAgTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IHF1ZXVlLT5iZWdpbigpOwotICAgICAgICB3aGlsZSAoaXQgIT0gcXVldWUtPmVuZCgpKSB7Ci0gICAgICAgICAgICBpZiAoKHVpbnQzMl90KSgqaXQpLT5pbnQzMkRhdGEoKSA+PSBtTmV4dEV4cGVjdGVkU2VxTm8pIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBzaXplID0gcXVldWUtPnNpemUoKTsKKyAgICAgICAgaW50MzJfdCBjbnRSZW1vdmUgPSBkZWxldGVVbml0VW5kZXJTZXEocXVldWUsIG1OZXh0RXhwZWN0ZWRTZXFObyk7CiAKLSAgICAgICAgICAgIGl0ID0gcXVldWUtPmVyYXNlKGl0KTsKKyAgICAgICAgaWYgKGNudFJlbW92ZSA+IDApIHsKKyAgICAgICAgICAgIHNvdXJjZS0+bm90aWNlQWJhbmRvbkJ1ZmZlcihjbnRSZW1vdmUpOworICAgICAgICAgICAgQUxPR1coImRlbGV0ZSAlZCBvZiAlZCBidWZmZXJzIiwgY250UmVtb3ZlLCBzaXplKTsKICAgICAgICAgfQotCiAgICAgICAgIGlmIChxdWV1ZS0+ZW1wdHkoKSkgewogICAgICAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICpxdWV1ZS0+YmVnaW4oKTsKKyAgICBidWZmZXIgPSAqcXVldWUtPmJlZ2luKCk7CiAKICAgICBpZiAoIW1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKSB7CiAgICAgICAgIG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkID0gdHJ1ZTsKQEAgLTEyMywxNSArMjMyLDcyIEBACiAgICAgfQogfQogCit2b2lkIEFBVkNBc3NlbWJsZXI6OmNoZWNrU3BzVXBkYXRlZChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIHVuc2lnbmVkIG5hbFR5cGUgPSBkYXRhWzBdICYgMHgxZjsKKyAgICBpZiAobmFsVHlwZSA9PSAweDcpIHsKKyAgICAgICAgaW50MzJfdCB3aWR0aCA9IDAsIGhlaWdodCA9IDA7CisgICAgICAgIEZpbmRBVkNEaW1lbnNpb25zKGJ1ZmZlciwgJndpZHRoLCAmaGVpZ2h0KTsKKyAgICAgICAgaWYgKHdpZHRoICE9IG1XaWR0aCB8fCBoZWlnaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgbUZpcnN0SUZyYW1lUHJvdmlkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1XaWR0aCA9IHdpZHRoOworICAgICAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgICAgIEFMT0dEKCJmb3VuZCBhIG5ldyByZXNvbHV0aW9uICgldSB4ICV1KSIsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQUFWQ0Fzc2VtYmxlcjo6Y2hlY2tJRnJhbWVQcm92aWRlZChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgdW5zaWduZWQgbmFsVHlwZSA9IGRhdGFbMF0gJiAweDFmOworICAgIGlmIChuYWxUeXBlID09IDB4NSkgeworICAgICAgICBtTGFzdElGcmFtZVByb3ZpZGVkQXRNcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLyAxMDAwOworICAgICAgICBpZiAoIW1GaXJzdElGcmFtZVByb3ZpZGVkKSB7CisgICAgICAgICAgICBtRmlyc3RJRnJhbWVQcm92aWRlZCA9IHRydWU7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHJ0cFRpbWU7CisgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKKyAgICAgICAgICAgIEFMT0dEKCJnb3QgRmlyc3QgSS1mcmFtZSB0byBiZSBkZWNvZGVkLiBydHBUaW1lPSVkLCBzaXplPSV6dSIsIHJ0cFRpbWUsIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBBQVZDQXNzZW1ibGVyOjpkcm9wRnJhbWVzVW50aWxJZnJhbWUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICB1bnNpZ25lZCBuYWxUeXBlID0gZGF0YVswXSAmIDB4MWY7CisgICAgaWYgKCFtRmlyc3RJRnJhbWVQcm92aWRlZCAmJiBuYWxUeXBlIDwgMHg1KSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwogdm9pZCBBQVZDQXNzZW1ibGVyOjphZGRTaW5nbGVOQUxVbml0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKICAgICBBTE9HVigiYWRkU2luZ2xlTkFMVW5pdCBvZiBzaXplICV6dSIsIGJ1ZmZlci0+c2l6ZSgpKTsKICNpZiAhTE9HX05ERUJVRwogICAgIGhleGR1bXAoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKICNlbmRpZgogCisgICAgY2hlY2tTcHNVcGRhdGVkKGJ1ZmZlcik7CisgICAgY2hlY2tJRnJhbWVQcm92aWRlZChidWZmZXIpOworCiAgICAgdWludDMyX3QgcnRwVGltZTsKICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKIAorICAgIGlmIChkcm9wRnJhbWVzVW50aWxJZnJhbWUoYnVmZmVyKSkgeworICAgICAgICBzcDxBUlRQU291cmNlPiBzb3VyY2UgPSBudWxscHRyOworICAgICAgICBidWZmZXItPm1ldGEoKS0+ZmluZE9iamVjdCgic291cmNlIiwgKHNwPGFuZHJvaWQ6OlJlZkJhc2U+Kikmc291cmNlKTsKKyAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRCgiSXNzdWVkIEZJUiB0byBnZXQgdGhlIEktZnJhbWUiKTsKKyAgICAgICAgICAgIHNvdXJjZS0+b25Jc3N1ZUZJUkJ5QXNzZW1ibGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIkRyb3BwaW5nIFAtZnJhbWUgdGlsbCBJLWZyYW1lIHByb3ZpZGVkLiBydHBUaW1lICV1IiwgcnRwVGltZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBpZiAoIW1OQUxVbml0cy5lbXB0eSgpICYmIHJ0cFRpbWUgIT0gbUFjY2Vzc1VuaXRSVFBUaW1lKSB7CiAgICAgICAgIHN1Ym1pdEFjY2Vzc1VuaXQoKTsKICAgICB9CkBAIC0yMTYsNiArMzgyLDExIEBACiAgICAgc2l6ZV90IHRvdGFsQ291bnQgPSAxOwogICAgIGJvb2wgY29tcGxldGUgPSBmYWxzZTsKIAorICAgIHVpbnQzMl90IHJ0cFRpbWVTdGFydEF0OworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInJ0cC10aW1lIiwgKGludDMyX3QgKikmcnRwVGltZVN0YXJ0QXQpKTsKKyAgICB1aW50MzJfdCBzdGFydFNlcU5vID0gYnVmZmVyLT5pbnQzMkRhdGEoKTsKKyAgICBib29sIHBGcmFtZSA9IG5hbFR5cGUgPT0gMHgxOworCiAgICAgaWYgKGRhdGFbMV0gJiAweDQwKSB7CiAgICAgICAgIC8vIEh1aD8gRW5kIGJpdCBhbHNvIHNldCBvbiB0aGUgZmlyc3QgYnVmZmVyLgogCkBAIC0yMjQsNiArMzk1LDggQEAKICAgICAgICAgY29tcGxldGUgPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSArK3F1ZXVlLT5iZWdpbigpOworICAgICAgICBpbnQzMl90IGNvbm5lY3RlZCA9IDE7CisgICAgICAgIGJvb2wgc25hcHBlZCA9IGZhbHNlOwogICAgICAgICB3aGlsZSAoaXQgIT0gcXVldWUtPmVuZCgpKSB7CiAgICAgICAgICAgICBBTE9HVigic2VxdWVuY2UgbGVuZ3RoICV6dSIsIHRvdGFsQ291bnQpOwogCkBAIC0yMzMsMjYgKzQwNiwzMiBAQAogICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnNpemUoKTsKIAogICAgICAgICAgICAgaWYgKCh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpICE9IGV4cGVjdGVkU2VxTm8pIHsKLSAgICAgICAgICAgICAgICBBTE9HVigic2VxdWVuY2Ugbm90IGNvbXBsZXRlLCBleHBlY3RlZCBzZXFObyAlZCwgZ290ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkU2VxTm8sICh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpKTsKKyAgICAgICAgICAgICAgICBBTE9HRCgic2VxdWVuY2Ugbm90IGNvbXBsZXRlLCBleHBlY3RlZCBzZXFObyAldSwgZ290ICV1LCBuYWxUeXBlICV1IiwKKyAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkU2VxTm8sICh1bnNpZ25lZClidWZmZXItPmludDMyRGF0YSgpLCBuYWxUeXBlKTsKKyAgICAgICAgICAgICAgICBzbmFwcGVkID0gdHJ1ZTsKIAotICAgICAgICAgICAgICAgIHJldHVybiBXUk9OR19TRVFVRU5DRV9OVU1CRVI7CisgICAgICAgICAgICAgICAgaWYgKCFwRnJhbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdST05HX1NFUVVFTkNFX05VTUJFUjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmICghc25hcHBlZCkgeworICAgICAgICAgICAgICAgIGNvbm5lY3RlZCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCBydHBUaW1lOworICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CiAgICAgICAgICAgICBpZiAoc2l6ZSA8IDIKICAgICAgICAgICAgICAgICAgICAgfHwgZGF0YVswXSAhPSBpbmRpY2F0b3IKICAgICAgICAgICAgICAgICAgICAgfHwgKGRhdGFbMV0gJiAweDFmKSAhPSBuYWxUeXBlCi0gICAgICAgICAgICAgICAgICAgIHx8IChkYXRhWzFdICYgMHg4MCkpIHsKKyAgICAgICAgICAgICAgICAgICAgfHwgKGRhdGFbMV0gJiAweDgwKQorICAgICAgICAgICAgICAgICAgICB8fCBydHBUaW1lICE9IHJ0cFRpbWVTdGFydEF0KSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIklnbm9yaW5nIG1hbGZvcm1lZCBGVSBidWZmZXIuIik7CiAKICAgICAgICAgICAgICAgICAvLyBEZWxldGUgdGhlIHdob2xlIHN0YXJ0IG9mIHRoZSBGVS4KIAotICAgICAgICAgICAgICAgIGl0ID0gcXVldWUtPmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPD0gdG90YWxDb3VudDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0ID0gcXVldWUtPmVyYXNlKGl0KTsKLSAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8gPSBleHBlY3RlZFNlcU5vICsgMTsKKyAgICAgICAgICAgICAgICBkZWxldGVVbml0VW5kZXJTZXEocXVldWUsIG1OZXh0RXhwZWN0ZWRTZXFObyk7CiAKICAgICAgICAgICAgICAgICByZXR1cm4gTUFMRk9STUVEX1BBQ0tFVDsKICAgICAgICAgICAgIH0KQEAgLTI2MCw5ICs0MzksMTcgQEAKICAgICAgICAgICAgIHRvdGFsU2l6ZSArPSBzaXplIC0gMjsKICAgICAgICAgICAgICsrdG90YWxDb3VudDsKIAotICAgICAgICAgICAgZXhwZWN0ZWRTZXFObyA9IGV4cGVjdGVkU2VxTm8gKyAxOworICAgICAgICAgICAgZXhwZWN0ZWRTZXFObyA9ICh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpICsgMTsKIAogICAgICAgICAgICAgaWYgKGRhdGFbMV0gJiAweDQwKSB7CisgICAgICAgICAgICAgICAgaWYgKHBGcmFtZSAmJiAhcmVjeWNsZVVuaXQoc3RhcnRTZXFObywgZXhwZWN0ZWRTZXFObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQsIHRvdGFsQ291bnQsIDAuNWYpKSB7CisgICAgICAgICAgICAgICAgICAgIG1OZXh0RXhwZWN0ZWRTZXFObyA9IGV4cGVjdGVkU2VxTm87CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVVuaXRVbmRlclNlcShxdWV1ZSwgbU5leHRFeHBlY3RlZFNlcU5vKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTUFMRk9STUVEX1BBQ0tFVDsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBsYXN0IGZyYWdtZW50LgogICAgICAgICAgICAgICAgIGNvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTI5MCw2ICs0NzcsOCBAQAogICAgIHVuaXQtPmRhdGEoKVswXSA9IChucmkgPDwgNSkgfCBuYWxUeXBlOwogCiAgICAgc2l6ZV90IG9mZnNldCA9IDE7CisgICAgaW50MzJfdCBjdm8gPSAtMTsKKyAgICBzcDxBUlRQU291cmNlPiBzb3VyY2UgPSBudWxscHRyOwogICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRvdGFsQ291bnQ7ICsraSkgewogICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyID0gKml0OwpAQCAtMzAwLDYgKzQ4OSw5IEBACiAjZW5kaWYKIAogICAgICAgICBtZW1jcHkodW5pdC0+ZGF0YSgpICsgb2Zmc2V0LCBidWZmZXItPmRhdGEoKSArIDIsIGJ1ZmZlci0+c2l6ZSgpIC0gMik7CisKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPmZpbmRPYmplY3QoInNvdXJjZSIsIChzcDxhbmRyb2lkOjpSZWZCYXNlPiopJnNvdXJjZSk7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImN2byIsICZjdm8pOwogICAgICAgICBvZmZzZXQgKz0gYnVmZmVyLT5zaXplKCkgLSAyOwogCiAgICAgICAgIGl0ID0gcXVldWUtPmVyYXNlKGl0KTsKQEAgLTMwNyw2ICs0OTksMTMgQEAKIAogICAgIHVuaXQtPnNldFJhbmdlKDAsIHRvdGFsU2l6ZSk7CiAKKyAgICBpZiAoY3ZvID49IDApIHsKKyAgICAgICAgdW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiY3ZvIiwgY3ZvKTsKKyAgICB9CisgICAgaWYgKHNvdXJjZSAhPSBudWxscHRyKSB7CisgICAgICAgIHVuaXQtPm1ldGEoKS0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOworICAgIH0KKwogICAgIGFkZFNpbmdsZU5BTFVuaXQodW5pdCk7CiAKICAgICBBTE9HVigic3VjY2Vzc2Z1bGx5IGFzc2VtYmxlZCBhIE5BTCB1bml0IGZyb20gZnJhZ21lbnRzLiIpOwpAQCAtMzE3LDcgKzUxNiwxMSBAQAogdm9pZCBBQVZDQXNzZW1ibGVyOjpzdWJtaXRBY2Nlc3NVbml0KCkgewogICAgIENIRUNLKCFtTkFMVW5pdHMuZW1wdHkoKSk7CiAKLSAgICBBTE9HVigiQWNjZXNzIHVuaXQgY29tcGxldGUgKCV6dSBuYWwgdW5pdHMpIiwgbU5BTFVuaXRzLnNpemUoKSk7CisgICAgaWYoYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KCJkZWJ1Zy5zdGFnZWZyaWdodC5mcHMiLCBmYWxzZSkpIHsKKyAgICAgICAgQUxPR0QoIkFjY2VzcyB1bml0IGNvbXBsZXRlICglenUgbmFsIHVuaXRzKSIsIG1OQUxVbml0cy5zaXplKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJBY2Nlc3MgdW5pdCBjb21wbGV0ZSAoJXp1IG5hbCB1bml0cykiLCBtTkFMVW5pdHMuc2l6ZSgpKTsKKyAgICB9CiAKICAgICBzaXplX3QgdG90YWxTaXplID0gMDsKICAgICBmb3IgKExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBtTkFMVW5pdHMuYmVnaW4oKTsKQEAgLTMyNyw2ICs1MzAsNyBAQAogCiAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKHRvdGFsU2l6ZSk7CiAgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgaW50MzJfdCBjdm8gPSAtMTsKICAgICBmb3IgKExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBtTkFMVW5pdHMuYmVnaW4oKTsKICAgICAgICAgIGl0ICE9IG1OQUxVbml0cy5lbmQoKTsgKytpdCkgewogICAgICAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpICsgb2Zmc2V0LCAiXHgwMFx4MDBceDAwXHgwMSIsIDQpOwpAQCAtMzM1LDYgKzUzOSw4IEBACiAgICAgICAgIHNwPEFCdWZmZXI+IG5hbCA9ICppdDsKICAgICAgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSArIG9mZnNldCwgbmFsLT5kYXRhKCksIG5hbC0+c2l6ZSgpKTsKICAgICAgICAgb2Zmc2V0ICs9IG5hbC0+c2l6ZSgpOworCisgICAgICAgIG5hbC0+bWV0YSgpLT5maW5kSW50MzIoImN2byIsICZjdm8pOwogICAgIH0KIAogICAgIENvcHlUaW1lcyhhY2Nlc3NVbml0LCAqbU5BTFVuaXRzLmJlZ2luKCkpOwpAQCAtMzQzLDYgKzU0OSw5IEBACiAgICAgcHJpbnRmKG1BY2Nlc3NVbml0RGFtYWdlZCA/ICJYIiA6ICIuIik7CiAgICAgZmZsdXNoKHN0ZG91dCk7CiAjZW5kaWYKKyAgICBpZiAoY3ZvID49IDApIHsKKyAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiY3ZvIiwgY3ZvKTsKKyAgICB9CiAKICAgICBpZiAobUFjY2Vzc1VuaXREYW1hZ2VkKSB7CiAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImRhbWFnZWQiLCB0cnVlKTsKQEAgLTM1NiwyMiArNTY1LDg5IEBACiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKK2lubGluZSBpbnQ2NF90IEFBVkNBc3NlbWJsZXI6OmZpbmRSVFBUaW1lKAorICAgICAgICBjb25zdCB1aW50MzJfdCYgZmlyc3RSVFBUaW1lLCBjb25zdCBzcDxBQnVmZmVyPiYgYnVmZmVyKSB7CisgICAgLyogSWYgeW91IHdhbnQgdG8gKywgLSwgKiBydHBUaW1lLCByZWNvbW1lbmQgdG8gZGVjbGFyZSBydHBUaW1lIGFzIGludDY0X3QuCisgICAgICAgQmVjYXVzZSBydHBUaW1lIGNhbiBiZSBuZWFyIFVJTlQzMl9NQVguIEJld2FyZSB0aGUgb3ZlcmZsb3cuICovCisgICAgaW50NjRfdCBydHBUaW1lID0gMDsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKKyAgICAvLyBJZiB0aGUgZmlyc3Qgb3ZlcnMgMl4zMSBhbmQgcnRwIHVuZGVycyAyXjMxLCB0aGUgcnRwIHZhbHVlIGlzIG92ZXJmbG93ZWQgb25lLgorICAgIGludDY0X3Qgb3ZlcmZsb3dNYXNrID0gKGZpcnN0UlRQVGltZSAmIDB4ODAwMDAwMDAgJiB+cnRwVGltZSkgPDwgMTsKKyAgICByZXR1cm4gcnRwVGltZSB8IG92ZXJmbG93TWFzazsKK30KKworaW50MzJfdCBBQVZDQXNzZW1ibGVyOjpwaWNrUHJvcGVyU2VxKGNvbnN0IFF1ZXVlICpxdWV1ZSwKKyAgICAgICAgdWludDMyX3QgZmlyc3QsIGludDY0X3QgcGxheSwgaW50NjRfdCBqaXQpIHsKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSAqKHF1ZXVlLT5iZWdpbigpKTsKKyAgICBpbnQzMl90IG5leHRTZXFObyA9IGJ1ZmZlci0+aW50MzJEYXRhKCk7CisKKyAgICBRdWV1ZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gcXVldWUtPmVuZCgpKSB7CisgICAgICAgIGludDY0X3QgcnRwVGltZSA9IGZpbmRSVFBUaW1lKGZpcnN0LCAqaXQpOworICAgICAgICAvLyBpZiBwa3QgaW4gdGltZSBleGlzdHMsIHRoYXQgc2hvdWxkIGJlIHRoZSBuZXh0IHBpdm90CisgICAgICAgIGlmIChydHBUaW1lICsgaml0ID49IHBsYXkpIHsKKyAgICAgICAgICAgIG5leHRTZXFObyA9ICgqaXQpLT5pbnQzMkRhdGEoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGl0Kys7CisgICAgfQorICAgIHJldHVybiBuZXh0U2VxTm87Cit9CisKK2Jvb2wgQUFWQ0Fzc2VtYmxlcjo6cmVjeWNsZVVuaXQodWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGVuZCwgdWludDMyX3QgY29ubmVjdGVkLAorICAgICAgICBzaXplX3QgYXZhaWwsIGZsb2F0IGdvb2RSYXRpbykgeworICAgIGZsb2F0IHRvdGFsID0gZW5kIC0gc3RhcnQ7CisgICAgZmxvYXQgdmFsaWQgPSBjb25uZWN0ZWQ7CisgICAgZmxvYXQgZXhpc3QgPSBhdmFpbDsKKyAgICBib29sIGlzUmVjeWNsZSA9ICh2YWxpZCAvIHRvdGFsKSA+PSBnb29kUmF0aW87CisKKyAgICBBTE9HVigiY2hlY2tpbmcgcC1mcmFtZSBsb3NzZXMuLiByZWN2QnVmcyAlZiB2YWxpZCAlZiBkaWZmICVmIHJlY3ljbGU/ICVkIiwKKyAgICAgICAgICAgIGV4aXN0LCB2YWxpZCwgdG90YWwsIGlzUmVjeWNsZSk7CisKKyAgICByZXR1cm4gaXNSZWN5Y2xlOworfQorCitpbnQzMl90IEFBVkNBc3NlbWJsZXI6OmRlbGV0ZVVuaXRVbmRlclNlcShRdWV1ZSAqcXVldWUsIHVpbnQzMl90IHNlcSkgeworICAgIGludDMyX3QgaW5pdFNpemUgPSBxdWV1ZS0+c2l6ZSgpOworICAgIFF1ZXVlOjppdGVyYXRvciBpdCA9IHF1ZXVlLT5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBxdWV1ZS0+ZW5kKCkpIHsKKyAgICAgICAgaWYgKCh1aW50MzJfdCkoKml0KS0+aW50MzJEYXRhKCkgPj0gc2VxKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpdCsrOworICAgIH0KKyAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCksIGl0KTsKKyAgICByZXR1cm4gaW5pdFNpemUgLSBxdWV1ZS0+c2l6ZSgpOworfQorCitpbmxpbmUgdm9pZCBBQVZDQXNzZW1ibGVyOjpwcmludE5vd1RpbWVVcyhpbnQ2NF90IHN0YXJ0LCBpbnQ2NF90IG5vdywgaW50NjRfdCBwbGF5KSB7CisgICAgQUxPR0QoInN0YXJ0PSVsbGQsIG5vdz0lbGxkLCBwbGF5ZWQ9JWxsZCIsCisgICAgICAgICAgICAobG9uZyBsb25nKXN0YXJ0LCAobG9uZyBsb25nKW5vdywgKGxvbmcgbG9uZylwbGF5KTsKK30KKworaW5saW5lIHZvaWQgQUFWQ0Fzc2VtYmxlcjo6cHJpbnRSVFBUaW1lKGludDY0X3QgcnRwLCBpbnQ2NF90IHBsYXksIGludDY0X3QgZXhwLCBib29sIGlzRXhwKSB7CisgICAgQUxPR0QoInJ0cC10aW1lKEpCKT0lbGxkLCBwbGF5ZWQtcnRwLXRpbWUoSkIpPSVsbGQsIGV4cGlyZWQtcnRwLXRpbWUoSkIpPSVsbGQgZXhwaXJlZD0lZCIsCisgICAgICAgICAgICAobG9uZyBsb25nKXJ0cCwgKGxvbmcgbG9uZylwbGF5LCAobG9uZyBsb25nKWV4cCwgaXNFeHApOworfQorCiBBUlRQQXNzZW1ibGVyOjpBc3NlbWJseVN0YXR1cyBBQVZDQXNzZW1ibGVyOjphc3NlbWJsZU1vcmUoCiAgICAgICAgIGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpIHsKICAgICBBc3NlbWJseVN0YXR1cyBzdGF0dXMgPSBhZGROQUxVbml0KHNvdXJjZSk7CiAgICAgaWYgKHN0YXR1cyA9PSBNQUxGT1JNRURfUEFDS0VUKSB7Ci0gICAgICAgIG1BY2Nlc3NVbml0RGFtYWdlZCA9IHRydWU7CisgICAgICAgIHVpbnQ2NF90IG1zZWNzU2luY2VMYXN0SUZyYW1lID0gKEFMb29wZXI6OkdldE5vd1VzKCkgLyAxMDAwKSAtIG1MYXN0SUZyYW1lUHJvdmlkZWRBdE1zOworICAgICAgICBpZiAobXNlY3NTaW5jZUxhc3RJRnJhbWUgPiAxMDAwKSB7CisgICAgICAgICAgICBBTE9HVigicmVxdWVzdCBGSVIgdG8gZ2V0IGEgbmV3IEktRnJhbWUsIHRpbWUgc2luY2UgIgorICAgICAgICAgICAgICAgICAgICAibGFzdCBJLUZyYW1lICVsbHUgbXMiLCAodW5zaWduZWQgbG9uZyBsb25nKW1zZWNzU2luY2VMYXN0SUZyYW1lKTsKKyAgICAgICAgICAgIHNvdXJjZS0+b25Jc3N1ZUZJUkJ5QXNzZW1ibGVyKCk7CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogdm9pZCBBQVZDQXNzZW1ibGVyOjpwYWNrZXRMb3N0KCkgewogICAgIENIRUNLKG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKTsKLSAgICBBTE9HVigicGFja2V0TG9zdCAoZXhwZWN0ZWQgJWQpIiwgbU5leHRFeHBlY3RlZFNlcU5vKTsKLQorICAgIEFMT0dEKCJwYWNrZXRMb3N0IChleHBlY3RlZCAldSkiLCBtTmV4dEV4cGVjdGVkU2VxTm8pOwogICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOwotCi0gICAgbUFjY2Vzc1VuaXREYW1hZ2VkID0gdHJ1ZTsKIH0KIAogdm9pZCBBQVZDQXNzZW1ibGVyOjpvbkJ5ZVJlY2VpdmVkKCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuaAppbmRleCBlMTk0ODBjLi45ZDcxZTJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuaApAQCAtMzEsNiArMzEsNyBAQAogc3RydWN0IEFBVkNBc3NlbWJsZXIgOiBwdWJsaWMgQVJUUEFzc2VtYmxlciB7CiAgICAgZXhwbGljaXQgQUFWQ0Fzc2VtYmxlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CiAKKyAgICB0eXBlZGVmIExpc3Q8c3A8QUJ1ZmZlcj4gPiBRdWV1ZTsKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BQVZDQXNzZW1ibGVyKCk7CiAKQEAgLTQ1LDggKzQ2LDE2IEBACiAgICAgYm9vbCBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZDsKICAgICB1aW50MzJfdCBtTmV4dEV4cGVjdGVkU2VxTm87CiAgICAgYm9vbCBtQWNjZXNzVW5pdERhbWFnZWQ7CisgICAgYm9vbCBtRmlyc3RJRnJhbWVQcm92aWRlZDsKKyAgICB1aW50NjRfdCBtTGFzdElGcmFtZVByb3ZpZGVkQXRNczsKKyAgICBpbnQzMl90IG1XaWR0aDsKKyAgICBpbnQzMl90IG1IZWlnaHQ7CiAgICAgTGlzdDxzcDxBQnVmZmVyPiA+IG1OQUxVbml0czsKIAorICAgIGludDMyX3QgYWRkTmFjayhjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKTsKKyAgICB2b2lkIGNoZWNrU3BzVXBkYXRlZChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKyAgICB2b2lkIGNoZWNrSUZyYW1lUHJvdmlkZWQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisgICAgYm9vbCBkcm9wRnJhbWVzVW50aWxJZnJhbWUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAgICAgQXNzZW1ibHlTdGF0dXMgYWRkTkFMVW5pdChjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKTsKICAgICB2b2lkIGFkZFNpbmdsZU5BTFVuaXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAgICAgQXNzZW1ibHlTdGF0dXMgYWRkRnJhZ21lbnRlZE5BTFVuaXQoTGlzdDxzcDxBQnVmZmVyPiA+ICpxdWV1ZSk7CkBAIC01NCw2ICs2MywxNCBAQAogCiAgICAgdm9pZCBzdWJtaXRBY2Nlc3NVbml0KCk7CiAKKyAgICBpbmxpbmUgaW50NjRfdCBmaW5kUlRQVGltZShjb25zdCB1aW50MzJfdCYgZmlyc3RSVFBUaW1lLCBjb25zdCBzcDxBQnVmZmVyPiYgYnVmZmVyKTsKKyAgICBpbnQzMl90IHBpY2tQcm9wZXJTZXEoY29uc3QgUXVldWUgKnEsIHVpbnQzMl90IGZpcnN0LCBpbnQ2NF90IHBsYXksIGludDY0X3Qgaml0KTsKKyAgICBib29sIHJlY3ljbGVVbml0KHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBlbmQsIHVpbnQzMl90IGNvbm5lY3RlZCwKKyAgICAgICAgICAgIHNpemVfdCBhdmFpbCwgZmxvYXQgZ29vZFJhdGlvKTsKKyAgICBpbnQzMl90IGRlbGV0ZVVuaXRVbmRlclNlcShRdWV1ZSAqcSwgdWludDMyX3Qgc2VxKTsKKyAgICB2b2lkIHByaW50Tm93VGltZVVzKGludDY0X3Qgc3RhcnQsIGludDY0X3Qgbm93LCBpbnQ2NF90IHBsYXkpOworICAgIHZvaWQgcHJpbnRSVFBUaW1lKGludDY0X3QgcnRwLCBpbnQ2NF90IHBsYXksIGludDY0X3QgZXhwLCBib29sIGlzRXhwKTsKKwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFBVkNBc3NlbWJsZXIpOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIRVZDQXNzZW1ibGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTNlYTA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5jcHAKQEAgLTAsMCArMSw2NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFIRVZDQXNzZW1ibGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQUhFVkNBc3NlbWJsZXIuaCIKKworI2luY2x1ZGUgIkFSVFBTb3VyY2UuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPGluY2x1ZGUvSGV2Y1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBIMjY1X05BTFVfTUFTSyAweDNGCisjZGVmaW5lIEgyNjVfTkFMVV9WUFMgMHgyMAorI2RlZmluZSBIMjY1X05BTFVfU1BTIDB4MjEKKyNkZWZpbmUgSDI2NV9OQUxVX1BQUyAweDIyCisjZGVmaW5lIEgyNjVfTkFMVV9BUCAweDMwCisjZGVmaW5lIEgyNjVfTkFMVV9GVSAweDMxCisjZGVmaW5lIEgyNjVfTkFMVV9QQUNJIDB4MzIKKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYworQUhFVkNBc3NlbWJsZXI6OkFIRVZDQXNzZW1ibGVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KQorICAgIDogbU5vdGlmeU1zZyhub3RpZnkpLAorICAgICAgbUFjY2Vzc1VuaXRSVFBUaW1lKDApLAorICAgICAgbU5leHRFeHBlY3RlZFNlcU5vVmFsaWQoZmFsc2UpLAorICAgICAgbU5leHRFeHBlY3RlZFNlcU5vKDApLAorICAgICAgbUFjY2Vzc1VuaXREYW1hZ2VkKGZhbHNlKSwKKyAgICAgIG1GaXJzdElGcmFtZVByb3ZpZGVkKGZhbHNlKSwKKyAgICAgIG1MYXN0SUZyYW1lUHJvdmlkZWRBdE1zKDApLAorICAgICAgbVdpZHRoKDApLAorICAgICAgbUhlaWdodCgwKSB7CisKKyAgICAgIEFMT0dWKCJDb25zdHJ1Y3RvciIpOworfQorCitBSEVWQ0Fzc2VtYmxlcjo6fkFIRVZDQXNzZW1ibGVyKCkgeworfQorCitpbnQzMl90IEFIRVZDQXNzZW1ibGVyOjphZGROYWNrKAorICAgICAgICBjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKSB7CisgICAgTGlzdDxzcDxBQnVmZmVyPj4gKnF1ZXVlID0gc291cmNlLT5xdWV1ZSgpOworICAgIGludDMyX3QgbmFja0NvdW50ID0gMDsKKworICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKKworICAgIGlmIChpdCA9PSBxdWV1ZS0+ZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIG5hY2tDb3VudCAvKiAwICovOworICAgIH0KKworICAgIHVpbnQxNl90IHF1ZXVlSGVhZFNlcU51bSA9ICgqaXQpLT5pbnQzMkRhdGEoKTsKKworICAgIC8vIG1vdmUgdG8gdGhlIHBhY2tldCBhZnRlciB3aGljaCBSVENQOk5BQ0sgd2FzIHNlbnQuCisgICAgZm9yICg7IGl0ICE9IHF1ZXVlLT5lbmQoKTsgKytpdCkgeworICAgICAgICBpbnQzMl90IHNlcU51bSA9ICgqaXQpLT5pbnQzMkRhdGEoKTsKKyAgICAgICAgaWYgKHNlcU51bSA+PSBzb3VyY2UtPm1IaWdoZXN0TmFja051bWJlcikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IG5hY2tTdGFydEF0ID0gLTE7CisKKyAgICB3aGlsZSAoaXQgIT0gcXVldWUtPmVuZCgpKSB7CisgICAgICAgIGludDMyX3Qgc2VxQmVmb3JlTGFzdCA9ICgqaXQpLT5pbnQzMkRhdGEoKTsKKyAgICAgICAgLy8gaW5jcmVhc2UgaXRlcmF0b3IuCisgICAgICAgIGlmICgoKytpdCkgPT0gcXVldWUtPmVuZCgpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3Qgc2VxTGFzdCA9ICgqaXQpLT5pbnQzMkRhdGEoKTsKKworICAgICAgICBpZiAoKHNlcUxhc3QgLSBzZXFCZWZvcmVMYXN0KSA8IDApIHsKKyAgICAgICAgICAgIEFMT0dEKCJhZGROYWNrOiBmb3VuZCBlbmQgb2Ygc2VxTnVtIGZyb20oJWQpIHRvKCVkKSIsIHNlcUJlZm9yZUxhc3QsIHNlcUxhc3QpOworICAgICAgICAgICAgc291cmNlLT5tSGlnaGVzdE5hY2tOdW1iZXIgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gbWlzc2VkIHBhY2tldCBmb3VuZAorICAgICAgICBpZiAoc2VxTGFzdCA+IChzZXFCZWZvcmVMYXN0ICsgMSkgJiYKKyAgICAgICAgICAgIC8vIHdlIGRpZG4ndCBzZW5kIFJUQ1A6TkFDSyBmb3IgdGhpcyBwYWNrZXQgeWV0LgorICAgICAgICAgICAgKHNlcUxhc3QgLSAxKSA+IHNvdXJjZS0+bUhpZ2hlc3ROYWNrTnVtYmVyKSB7CisgICAgICAgICAgICBzb3VyY2UtPm1IaWdoZXN0TmFja051bWJlciA9IHNlcUxhc3QgLTE7CisgICAgICAgICAgICBuYWNrU3RhcnRBdCA9IHNlcUJlZm9yZUxhc3QgKyAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIH0KKworICAgIGlmIChuYWNrU3RhcnRBdCAhPSAtMSkgeworICAgICAgICBuYWNrQ291bnQgPSBzb3VyY2UtPm1IaWdoZXN0TmFja051bWJlciAtIG5hY2tTdGFydEF0ICsgMTsKKyAgICAgICAgQUxPR0QoImFkZE5hY2s6IG5hY2tDb3VudD0lZCwgbmFja0Zyb209JWQsIG5hY2tUbz0lZCIsIG5hY2tDb3VudCwKKyAgICAgICAgICAgIG5hY2tTdGFydEF0LCBzb3VyY2UtPm1IaWdoZXN0TmFja051bWJlcik7CisKKyAgICAgICAgdWludDE2X3QgbWFzayA9ICh1aW50MTZfdCkoMHhmZmZmKSA+PiAoMTYgLSBuYWNrQ291bnQgKyAxKTsKKyAgICAgICAgc291cmNlLT5zZXRTZXFOdW1Ub05BQ0sobmFja1N0YXJ0QXQsIG1hc2ssIHF1ZXVlSGVhZFNlcU51bSk7CisgICAgfQorCisgICAgcmV0dXJuIG5hY2tDb3VudDsKK30KKworQVJUUEFzc2VtYmxlcjo6QXNzZW1ibHlTdGF0dXMgQUhFVkNBc3NlbWJsZXI6OmFkZE5BTFVuaXQoCisgICAgICAgIGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID4gKnF1ZXVlID0gc291cmNlLT5xdWV1ZSgpOworICAgIGNvbnN0IHVpbnQzMl90IGZpcnN0UlRQVGltZSA9IHNvdXJjZS0+bUZpcnN0UnRwVGltZTsKKworICAgIGlmIChxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICpxdWV1ZS0+YmVnaW4oKTsKKyAgICBidWZmZXItPm1ldGEoKS0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOworICAgIGludDY0X3QgcnRwVGltZSA9IGZpbmRSVFBUaW1lKGZpcnN0UlRQVGltZSwgYnVmZmVyKTsKKworICAgIGludDY0X3Qgc3RhcnRUaW1lID0gc291cmNlLT5tRmlyc3RTeXNUaW1lIC8gMTAwMDsKKyAgICBpbnQ2NF90IG5vd1RpbWUgPSBBTG9vcGVyOjpHZXROb3dVcygpIC8gMTAwMDsKKyAgICBpbnQ2NF90IHBsYXllZFRpbWUgPSBub3dUaW1lIC0gc3RhcnRUaW1lOworICAgIGludDY0X3QgcGxheWVkVGltZVJ0cCA9IHNvdXJjZS0+bUZpcnN0UnRwVGltZSArIHBsYXllZFRpbWUgKiAoaW50NjRfdClzb3VyY2UtPm1DbG9ja1JhdGUgLyAxMDAwOworICAgIGNvbnN0IGludDY0X3Qgaml0dGVyVGltZSA9IHNvdXJjZS0+bUpiVGltZU1zICogKGludDY0X3Qpc291cmNlLT5tQ2xvY2tSYXRlIC8gMTAwMDsKKworICAgIGludDY0X3QgZXhwaXJlZFRpbWVJbkpiID0gcnRwVGltZSArIGppdHRlclRpbWU7CisgICAgYm9vbCBpc0V4cGlyZWQgPSBleHBpcmVkVGltZUluSmIgPD0gKHBsYXllZFRpbWVSdHApOworICAgIGJvb2wgaXNUb29MYXRlMjAwID0gZXhwaXJlZFRpbWVJbkpiIDwgKHBsYXllZFRpbWVSdHAgLSBqaXR0ZXJUaW1lKTsKKyAgICBib29sIGlzVG9vTGF0ZTMwMCA9IGV4cGlyZWRUaW1lSW5KYiA8IChwbGF5ZWRUaW1lUnRwIC0gKGppdHRlclRpbWUgKiAzIC8gMikpOworCisgICAgaWYgKG1TaG93UXVldWVDbnQgPCAyMCkgeworICAgICAgICBzaG93Q3VycmVudFF1ZXVlKHF1ZXVlKTsKKyAgICAgICAgcHJpbnROb3dUaW1lVXMoc3RhcnRUaW1lLCBub3dUaW1lLCBwbGF5ZWRUaW1lKTsKKyAgICAgICAgcHJpbnRSVFBUaW1lKHJ0cFRpbWUsIHBsYXllZFRpbWVSdHAsIGV4cGlyZWRUaW1lSW5KYiwgaXNFeHBpcmVkKTsKKyAgICAgICAgbVNob3dRdWV1ZUNudCsrOworICAgIH0KKworICAgIEFIRVZDQXNzZW1ibGVyOjphZGROYWNrKHNvdXJjZSk7CisKKyAgICBpZiAoIWlzRXhwaXJlZCkgeworICAgICAgICBBTE9HVigiYnVmZmVyaW5nIGluIGppdHRlciBidWZmZXIuIik7CisgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgfQorCisgICAgaWYgKGlzVG9vTGF0ZTIwMCkgeworICAgICAgICBBTE9HVygiPT09IFdBUk5JTkcgPT09IGJ1ZmZlciBhcnJpdmVkIDIwMG1zIGxhdGUuID09PSBXQVJOSU5HID09PSAiKTsKKyAgICB9CisKKyAgICBpZiAoaXNUb29MYXRlMzAwKSB7CisgICAgICAgIEFMT0dXKCJidWZmZXIgYXJyaXZlZCBhZnRlciAzMDBtcyAuLi4gXHQgRGlmZiBpbiBKYj0lbGxkIFx0IFNlcSMgJWQiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKHBsYXllZFRpbWVSdHAgLSBleHBpcmVkVGltZUluSmIpLCBidWZmZXItPmludDMyRGF0YSgpKTsKKyAgICAgICAgcHJpbnROb3dUaW1lVXMoc3RhcnRUaW1lLCBub3dUaW1lLCBwbGF5ZWRUaW1lKTsKKyAgICAgICAgcHJpbnRSVFBUaW1lKHJ0cFRpbWUsIHBsYXllZFRpbWVSdHAsIGV4cGlyZWRUaW1lSW5KYiwgaXNFeHBpcmVkKTsKKworICAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8gPSBwaWNrUHJvcGVyU2VxKHF1ZXVlLCBmaXJzdFJUUFRpbWUsIHBsYXllZFRpbWVSdHAsIGppdHRlclRpbWUpOworICAgIH0KKworICAgIGlmIChtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZCkgeworICAgICAgICBpbnQzMl90IHNpemUgPSBxdWV1ZS0+c2l6ZSgpOworICAgICAgICBpbnQzMl90IGNudFJlbW92ZSA9IGRlbGV0ZVVuaXRVbmRlclNlcShxdWV1ZSwgbU5leHRFeHBlY3RlZFNlcU5vKTsKKworICAgICAgICBpZiAoY250UmVtb3ZlID4gMCkgeworICAgICAgICAgICAgc291cmNlLT5ub3RpY2VBYmFuZG9uQnVmZmVyKGNudFJlbW92ZSk7CisgICAgICAgICAgICBBTE9HVygiZGVsZXRlICVkIG9mICVkIGJ1ZmZlcnMiLCBjbnRSZW1vdmUsIHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHF1ZXVlLT5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgYnVmZmVyID0gKnF1ZXVlLT5iZWdpbigpOworCisgICAgaWYgKCFtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZCkgeworICAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZCA9IHRydWU7CisgICAgICAgIG1OZXh0RXhwZWN0ZWRTZXFObyA9ICh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpOworICAgIH0gZWxzZSBpZiAoKHVpbnQzMl90KWJ1ZmZlci0+aW50MzJEYXRhKCkgIT0gbU5leHRFeHBlY3RlZFNlcU5vKSB7CisgICAgICAgIEFMT0dWKCJOb3QgdGhlIHNlcXVlbmNlIG51bWJlciBJIGV4cGVjdGVkIik7CisKKyAgICAgICAgcmV0dXJuIFdST05HX1NFUVVFTkNFX05VTUJFUjsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnNpemUoKTsKKworICAgIGlmIChzaXplIDwgMSB8fCAoZGF0YVswXSAmIDB4ODApKSB7CisgICAgICAgIC8vIENvcnJ1cHQuCisKKyAgICAgICAgQUxPR1YoIklnbm9yaW5nIGNvcnJ1cHQgYnVmZmVyLiIpOworICAgICAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOworCisgICAgICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworICAgICAgICByZXR1cm4gTUFMRk9STUVEX1BBQ0tFVDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBuYWxUeXBlID0gKGRhdGFbMF0gPj4gMSkgJiBIMjY1X05BTFVfTUFTSzsKKyAgICBpZiAobmFsVHlwZSA+IDAgJiYgbmFsVHlwZSA8IEgyNjVfTkFMVV9BUCkgeworICAgICAgICBhZGRTaW5nbGVOQUxVbml0KGJ1ZmZlcik7CisgICAgICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CisgICAgICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmIChuYWxUeXBlID09IEgyNjVfTkFMVV9GVSkgeworICAgICAgICAvLyBGVS1BCisgICAgICAgIHJldHVybiBhZGRGcmFnbWVudGVkTkFMVW5pdChxdWV1ZSk7CisgICAgfSBlbHNlIGlmIChuYWxUeXBlID09IEgyNjVfTkFMVV9BUCkgeworICAgICAgICAvLyBTVEFQLUEKKyAgICAgICAgYm9vbCBzdWNjZXNzID0gYWRkU2luZ2xlVGltZUFnZ3JlZ2F0aW9uUGFja2V0KGJ1ZmZlcik7CisgICAgICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CisgICAgICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworCisgICAgICAgIHJldHVybiBzdWNjZXNzID8gT0sgOiBNQUxGT1JNRURfUEFDS0VUOworICAgIH0gZWxzZSBpZiAobmFsVHlwZSA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJJZ25vcmluZyB1bmRlZmluZWQgbmFsIHR5cGUuIik7CisKKyAgICAgICAgcXVldWUtPmVyYXNlKHF1ZXVlLT5iZWdpbigpKTsKKyAgICAgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJJZ25vcmluZyB1bnN1cHBvcnRlZCBidWZmZXIgKG5hbFR5cGU9JWQpIiwgbmFsVHlwZSk7CisKKyAgICAgICAgcXVldWUtPmVyYXNlKHF1ZXVlLT5iZWdpbigpKTsKKyAgICAgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisKKyAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgfQorfQorCit2b2lkIEFIRVZDQXNzZW1ibGVyOjpjaGVja1Nwc1VwZGF0ZWQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGlmIChidWZmZXItPnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIEhldmNQYXJhbWV0ZXJTZXRzIHBhcmFtU2V0czsKKyAgICB1bnNpZ25lZCBuYWxUeXBlID0gKGRhdGFbMF0gPj4gMSkgJiBIMjY1X05BTFVfTUFTSzsKKyAgICBpZiAobmFsVHlwZSA9PSBIMjY1X05BTFVfU1BTKSB7CisgICAgICAgIGludDMyX3Qgd2lkdGggPSAwLCBoZWlnaHQgPSAwOworICAgICAgICBwYXJhbVNldHMuRmluZEhFVkNEaW1lbnNpb25zKGJ1ZmZlciwgJndpZHRoLCAmaGVpZ2h0KTsKKyAgICAgICAgQUxPR1YoImV4aXN0aW5nIHJlc29sdXRpb24gKCV1IHggJXUpIiwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgaWYgKHdpZHRoICE9IG1XaWR0aCB8fCBoZWlnaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgbUZpcnN0SUZyYW1lUHJvdmlkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1XaWR0aCA9IHdpZHRoOworICAgICAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgICAgIEFMT0dEKCJmb3VuZCBhIG5ldyByZXNvbHV0aW9uICgldSB4ICV1KSIsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQUhFVkNBc3NlbWJsZXI6OmNoZWNrSUZyYW1lUHJvdmlkZWQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGlmIChidWZmZXItPnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIHVuc2lnbmVkIG5hbFR5cGUgPSAoZGF0YVswXSA+PiAxKSAmIEgyNjVfTkFMVV9NQVNLOworICAgIGlmIChuYWxUeXBlID4gMHgwRiAmJiBuYWxUeXBlIDwgMHgxOCkgeworICAgICAgICBtTGFzdElGcmFtZVByb3ZpZGVkQXRNcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLyAxMDAwOworICAgICAgICBpZiAoIW1GaXJzdElGcmFtZVByb3ZpZGVkKSB7CisgICAgICAgICAgICBtRmlyc3RJRnJhbWVQcm92aWRlZCA9IHRydWU7CisgICAgICAgICAgICB1aW50MzJfdCBydHBUaW1lOworICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CisgICAgICAgICAgICBBTE9HRCgiZ290IEZpcnN0IEktZnJhbWUgdG8gYmUgZGVjb2RlZC4gcnRwVGltZT0lZCwgc2l6ZT0lenUiLCBydHBUaW1lLCBidWZmZXItPnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQUhFVkNBc3NlbWJsZXI6OmRyb3BGcmFtZXNVbnRpbElmcmFtZShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgdW5zaWduZWQgbmFsVHlwZSA9IChkYXRhWzBdID4+IDEpICYgSDI2NV9OQUxVX01BU0s7CisgICAgcmV0dXJuICFtRmlyc3RJRnJhbWVQcm92aWRlZCAmJiBuYWxUeXBlIDwgMHgxMDsKK30KKwordm9pZCBBSEVWQ0Fzc2VtYmxlcjo6YWRkU2luZ2xlTkFMVW5pdChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgQUxPR1YoImFkZFNpbmdsZU5BTFVuaXQgb2Ygc2l6ZSAlenUiLCBidWZmZXItPnNpemUoKSk7CisjaWYgIUxPR19OREVCVUcKKyAgICBoZXhkdW1wKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisjZW5kaWYKKyAgICBjaGVja1Nwc1VwZGF0ZWQoYnVmZmVyKTsKKyAgICBjaGVja0lGcmFtZVByb3ZpZGVkKGJ1ZmZlcik7CisKKyAgICB1aW50MzJfdCBydHBUaW1lOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInJ0cC10aW1lIiwgKGludDMyX3QgKikmcnRwVGltZSkpOworCisgICAgaWYgKGRyb3BGcmFtZXNVbnRpbElmcmFtZShidWZmZXIpKSB7CisgICAgICAgIHNwPEFSVFBTb3VyY2U+IHNvdXJjZSA9IG51bGxwdHI7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5maW5kT2JqZWN0KCJzb3VyY2UiLCAoc3A8YW5kcm9pZDo6UmVmQmFzZT4qKSZzb3VyY2UpOworICAgICAgICBpZiAoc291cmNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJJc3N1ZWQgRklSIHRvIGdldCB0aGUgSS1mcmFtZSIpOworICAgICAgICAgICAgc291cmNlLT5vbklzc3VlRklSQnlBc3NlbWJsZXIoKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HRCgiZHJvcCBQLWZyYW1lcyB0aWxsIGFuIEktZnJhbWUgcHJvdmlkZWQuIHJ0cFRpbWUgJXUiLCBydHBUaW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghbU5BTFVuaXRzLmVtcHR5KCkgJiYgcnRwVGltZSAhPSBtQWNjZXNzVW5pdFJUUFRpbWUpIHsKKyAgICAgICAgc3VibWl0QWNjZXNzVW5pdCgpOworICAgIH0KKyAgICBtQWNjZXNzVW5pdFJUUFRpbWUgPSBydHBUaW1lOworCisgICAgbU5BTFVuaXRzLnB1c2hfYmFjayhidWZmZXIpOworfQorCitib29sIEFIRVZDQXNzZW1ibGVyOjphZGRTaW5nbGVUaW1lQWdncmVnYXRpb25QYWNrZXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworCisgICAgaWYgKHNpemUgPCAzKSB7CisgICAgICAgIEFMT0dWKCJEaXNjYXJkaW5nIHRvbyBzbWFsbCBTVEFQLUEgcGFja2V0LiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKytkYXRhOworICAgIC0tc2l6ZTsKKyAgICB3aGlsZSAoc2l6ZSA+PSAyKSB7CisgICAgICAgIHNpemVfdCBuYWxTaXplID0gKGRhdGFbMF0gPDwgOCkgfCBkYXRhWzFdOworCisgICAgICAgIGlmIChzaXplIDwgbmFsU2l6ZSArIDIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJEaXNjYXJkaW5nIG1hbGZvcm1lZCBTVEFQLUEgcGFja2V0LiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gdW5pdCA9IG5ldyBBQnVmZmVyKG5hbFNpemUpOworICAgICAgICBtZW1jcHkodW5pdC0+ZGF0YSgpLCAmZGF0YVsyXSwgbmFsU2l6ZSk7CisKKyAgICAgICAgQ29weVRpbWVzKHVuaXQsIGJ1ZmZlcik7CisKKyAgICAgICAgYWRkU2luZ2xlTkFMVW5pdCh1bml0KTsKKworICAgICAgICBkYXRhICs9IDIgKyBuYWxTaXplOworICAgICAgICBzaXplIC09IDIgKyBuYWxTaXplOworICAgIH0KKworICAgIGlmIChzaXplICE9IDApIHsKKyAgICAgICAgQUxPR1YoIlVuZXhwZWN0ZWQgcGFkZGluZyBhdCBlbmQgb2YgU1RBUC1BIHBhY2tldC4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworQVJUUEFzc2VtYmxlcjo6QXNzZW1ibHlTdGF0dXMgQUhFVkNBc3NlbWJsZXI6OmFkZEZyYWdtZW50ZWROQUxVbml0KAorICAgICAgICBMaXN0PHNwPEFCdWZmZXI+ID4gKnF1ZXVlKSB7CisgICAgQ0hFQ0soIXF1ZXVlLT5lbXB0eSgpKTsKKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICpxdWV1ZS0+YmVnaW4oKTsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnNpemUoKTsKKworICAgIENIRUNLKHNpemUgPiAwKTsKKyAgICAvKiAgIEgyNjUgcGF5bG9hZCBoZWFkZXIgaXMgMTYgYml0CisgICAgICAgIDAgMSAyIDMgNCA1IDYgNyAwIDEgMiAzIDQgNSA2IDcKKyAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICB8RnwgICAgIFR5cGUgIHwgIExheWVyIElEIHwgVElEIHwKKyAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgKi8KKyAgICB1bnNpZ25lZCBpbmRpY2F0b3IgPSAoZGF0YVswXSA+PiAxKTsKKworICAgIENIRUNLKChpbmRpY2F0b3IgJiBIMjY1X05BTFVfTUFTSykgPT0gSDI2NV9OQUxVX0ZVKTsKKworICAgIGlmIChzaXplIDwgMykgeworICAgICAgICBBTE9HVigiSWdub3JpbmcgbWFsZm9ybWVkIEZVIGJ1ZmZlciAoc2l6ZSA9ICV6dSkiLCBzaXplKTsKKworICAgICAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOworICAgICAgICArK21OZXh0RXhwZWN0ZWRTZXFObzsKKyAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgfQorCisgICAgaWYgKCEoZGF0YVsyXSAmIDB4ODApKSB7CisgICAgICAgIC8vIFN0YXJ0IGJpdCBub3Qgc2V0IG9uIHRoZSBmaXJzdCBidWZmZXIuCisKKyAgICAgICAgQUxPR1YoIlN0YXJ0IGJpdCBub3Qgc2V0IG9uIGZpcnN0IGJ1ZmZlciIpOworCisgICAgICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CisgICAgICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworICAgICAgICByZXR1cm4gTUFMRk9STUVEX1BBQ0tFVDsKKyAgICB9CisKKyAgICAvKiAgRlUgSU5ESUNBVE9SIEhEUgorICAgICAgICAwIDEgMiAzIDQgNSA2IDcKKyAgICAgICArLSstKy0rLSstKy0rLSstKworICAgICAgIHxTfEV8ICAgVHlwZSAgICB8CisgICAgICAgKy0rLSstKy0rLSstKy0rLSsKKyAgICAgKi8KKyAgICB1aW50MzJfdCBuYWxUeXBlID0gZGF0YVsyXSAmIEgyNjVfTkFMVV9NQVNLOworICAgIHVpbnQzMl90IHRpZCA9IGRhdGFbMV0gJiAweDc7CisgICAgQUxPR1YoIm5hbFR5cGUgPSV1LCB0aWQgPSV1IiwgbmFsVHlwZSwgdGlkKTsKKworICAgIHVpbnQzMl90IGV4cGVjdGVkU2VxTm8gPSAodWludDMyX3QpYnVmZmVyLT5pbnQzMkRhdGEoKSArIDE7CisgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IHNpemUgLSAzOworICAgIHNpemVfdCB0b3RhbENvdW50ID0gMTsKKyAgICBib29sIGNvbXBsZXRlID0gZmFsc2U7CisKKyAgICB1aW50MzJfdCBydHBUaW1lU3RhcnRBdDsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWVTdGFydEF0KSk7CisgICAgdWludDMyX3Qgc3RhcnRTZXFObyA9IGJ1ZmZlci0+aW50MzJEYXRhKCk7CisgICAgYm9vbCBwRnJhbWUgPSAobmFsVHlwZSA8IDB4MTApOworCisgICAgaWYgKGRhdGFbMl0gJiAweDQwKSB7CisgICAgICAgIC8vIEh1aD8gRW5kIGJpdCBhbHNvIHNldCBvbiB0aGUgZmlyc3QgYnVmZmVyLgorCisgICAgICAgIEFMT0dWKCJHcnJyLiBUaGlzIGlzbid0IGZyYWdtZW50ZWQgYXQgYWxsLiIpOworCisgICAgICAgIGNvbXBsZXRlID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gKytxdWV1ZS0+YmVnaW4oKTsKKyAgICAgICAgaW50MzJfdCBjb25uZWN0ZWQgPSAxOworICAgICAgICBib29sIHNuYXBwZWQgPSBmYWxzZTsKKyAgICAgICAgd2hpbGUgKGl0ICE9IHF1ZXVlLT5lbmQoKSkgeworICAgICAgICAgICAgQUxPR1YoInNlcXVlbmNlIGxlbmd0aCAlenUiLCB0b3RhbENvdW50KTsKKworICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciA9ICppdDsKKworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnNpemUoKTsKKworICAgICAgICAgICAgaWYgKCh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpICE9IGV4cGVjdGVkU2VxTm8pIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2VxdWVuY2Ugbm90IGNvbXBsZXRlLCBleHBlY3RlZCBzZXFObyAldSwgZ290ICV1LCBuYWxUeXBlICV1IiwKKyAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkU2VxTm8sICh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpLCBuYWxUeXBlKTsKKyAgICAgICAgICAgICAgICBzbmFwcGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGlmICghcEZyYW1lKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBXUk9OR19TRVFVRU5DRV9OVU1CRVI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXNuYXBwZWQpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWQrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3QgcnRwVGltZTsKKyAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInJ0cC10aW1lIiwgKGludDMyX3QgKikmcnRwVGltZSkpOworICAgICAgICAgICAgaWYgKHNpemUgPCAzCisgICAgICAgICAgICAgICAgICAgIHx8ICgoZGF0YVswXSA+PiAxKSAmIEgyNjVfTkFMVV9NQVNLKSAhPSBpbmRpY2F0b3IKKyAgICAgICAgICAgICAgICAgICAgfHwgKGRhdGFbMl0gJiBIMjY1X05BTFVfTUFTSykgIT0gbmFsVHlwZQorICAgICAgICAgICAgICAgICAgICB8fCAoZGF0YVsyXSAmIDB4ODApCisgICAgICAgICAgICAgICAgICAgIHx8IHJ0cFRpbWUgIT0gcnRwVGltZVN0YXJ0QXQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiSWdub3JpbmcgbWFsZm9ybWVkIEZVIGJ1ZmZlci4iKTsKKworICAgICAgICAgICAgICAgIC8vIERlbGV0ZSB0aGUgd2hvbGUgc3RhcnQgb2YgdGhlIEZVLgorCisgICAgICAgICAgICAgICAgbU5leHRFeHBlY3RlZFNlcU5vID0gZXhwZWN0ZWRTZXFObyArIDE7CisgICAgICAgICAgICAgICAgZGVsZXRlVW5pdFVuZGVyU2VxKHF1ZXVlLCBtTmV4dEV4cGVjdGVkU2VxTm8pOworCisgICAgICAgICAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRvdGFsU2l6ZSArPSBzaXplIC0gMzsKKyAgICAgICAgICAgICsrdG90YWxDb3VudDsKKworICAgICAgICAgICAgZXhwZWN0ZWRTZXFObyA9ICh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpICsgMTsKKworICAgICAgICAgICAgaWYgKGRhdGFbMl0gJiAweDQwKSB7CisgICAgICAgICAgICAgICAgaWYgKHBGcmFtZSAmJiAhcmVjeWNsZVVuaXQoc3RhcnRTZXFObywgZXhwZWN0ZWRTZXFObywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCwgdG90YWxDb3VudCwgMC41ZikpIHsKKyAgICAgICAgICAgICAgICAgICAgbU5leHRFeHBlY3RlZFNlcU5vID0gZXhwZWN0ZWRTZXFObzsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlVW5pdFVuZGVyU2VxKHF1ZXVlLCBtTmV4dEV4cGVjdGVkU2VxTm8pOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNQUxGT1JNRURfUEFDS0VUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBsYXN0IGZyYWdtZW50LgorICAgICAgICAgICAgICAgIGNvbXBsZXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghY29tcGxldGUpIHsKKyAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICB9CisKKyAgICBtTmV4dEV4cGVjdGVkU2VxTm8gPSBleHBlY3RlZFNlcU5vOworCisgICAgLy8gV2UgZm91bmQgYWxsIHRoZSBmcmFnbWVudHMgdGhhdCBtYWtlIHVwIHRoZSBjb21wbGV0ZSBOQUwgdW5pdC4KKworICAgIC8vIExlYXZlIHJvb20gZm9yIHRoZSBoZWFkZXIuIFNvIGZhciB0b3RhbFNpemUgZGlkIG5vdCBpbmNsdWRlIHRoZQorICAgIC8vIGhlYWRlciBieXRlLgorICAgIHRvdGFsU2l6ZSArPSAyOworCisgICAgc3A8QUJ1ZmZlcj4gdW5pdCA9IG5ldyBBQnVmZmVyKHRvdGFsU2l6ZSk7CisgICAgQ29weVRpbWVzKHVuaXQsICpxdWV1ZS0+YmVnaW4oKSk7CisKKyAgICB1bml0LT5kYXRhKClbMF0gPSAobmFsVHlwZSA8PCAxKTsKKyAgICB1bml0LT5kYXRhKClbMV0gPSB0aWQ7CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMjsKKyAgICBpbnQzMl90IGN2byA9IC0xOworICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRvdGFsQ291bnQ7ICsraSkgeworICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyID0gKml0OworCisgICAgICAgIEFMT0dWKCJwaWVjZSAjJXp1LyV6dSIsIGkgKyAxLCB0b3RhbENvdW50KTsKKyNpZiAhTE9HX05ERUJVRworICAgICAgICBoZXhkdW1wKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisjZW5kaWYKKworICAgICAgICBtZW1jcHkodW5pdC0+ZGF0YSgpICsgb2Zmc2V0LCBidWZmZXItPmRhdGEoKSArIDMsIGJ1ZmZlci0+c2l6ZSgpIC0gMyk7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImN2byIsICZjdm8pOworICAgICAgICBvZmZzZXQgKz0gYnVmZmVyLT5zaXplKCkgLSAzOworCisgICAgICAgIGl0ID0gcXVldWUtPmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICB1bml0LT5zZXRSYW5nZSgwLCB0b3RhbFNpemUpOworCisgICAgaWYgKGN2byA+PSAwKSB7CisgICAgICAgIHVuaXQtPm1ldGEoKS0+c2V0SW50MzIoImN2byIsIGN2byk7CisgICAgfQorCisgICAgYWRkU2luZ2xlTkFMVW5pdCh1bml0KTsKKworICAgIEFMT0dWKCJzdWNjZXNzZnVsbHkgYXNzZW1ibGVkIGEgTkFMIHVuaXQgZnJvbSBmcmFnbWVudHMuIik7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQUhFVkNBc3NlbWJsZXI6OnN1Ym1pdEFjY2Vzc1VuaXQoKSB7CisgICAgQ0hFQ0soIW1OQUxVbml0cy5lbXB0eSgpKTsKKworICAgIEFMT0dWKCJBY2Nlc3MgdW5pdCBjb21wbGV0ZSAoJXp1IG5hbCB1bml0cykiLCBtTkFMVW5pdHMuc2l6ZSgpKTsKKworICAgIHNpemVfdCB0b3RhbFNpemUgPSAwOworICAgIGZvciAoTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IG1OQUxVbml0cy5iZWdpbigpOworICAgICAgICAgaXQgIT0gbU5BTFVuaXRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIHRvdGFsU2l6ZSArPSA0ICsgKCppdCktPnNpemUoKTsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIodG90YWxTaXplKTsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBpbnQzMl90IGN2byA9IC0xOworICAgIGZvciAoTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IG1OQUxVbml0cy5iZWdpbigpOworICAgICAgICAgaXQgIT0gbU5BTFVuaXRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCkgKyBvZmZzZXQsICJceDAwXHgwMFx4MDBceDAxIiwgNCk7CisgICAgICAgIG9mZnNldCArPSA0OworCisgICAgICAgIHNwPEFCdWZmZXI+IG5hbCA9ICppdDsKKyAgICAgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSArIG9mZnNldCwgbmFsLT5kYXRhKCksIG5hbC0+c2l6ZSgpKTsKKyAgICAgICAgb2Zmc2V0ICs9IG5hbC0+c2l6ZSgpOworICAgICAgICBuYWwtPm1ldGEoKS0+ZmluZEludDMyKCJjdm8iLCAmY3ZvKTsKKyAgICB9CisKKyAgICBDb3B5VGltZXMoYWNjZXNzVW5pdCwgKm1OQUxVbml0cy5iZWdpbigpKTsKKworI2lmIDAKKyAgICBwcmludGYobUFjY2Vzc1VuaXREYW1hZ2VkID8gIlgiIDogIi4iKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorICAgIGlmIChjdm8gPj0gMCkgeworICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJjdm8iLCBjdm8pOworICAgIH0KKworICAgIGlmIChtQWNjZXNzVW5pdERhbWFnZWQpIHsKKyAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiZGFtYWdlZCIsIHRydWUpOworICAgIH0KKworICAgIG1OQUxVbml0cy5jbGVhcigpOworICAgIG1BY2Nlc3NVbml0RGFtYWdlZCA9IGZhbHNlOworCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnlNc2ctPmR1cCgpOworICAgIG1zZy0+c2V0QnVmZmVyKCJhY2Nlc3MtdW5pdCIsIGFjY2Vzc1VuaXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCitpbmxpbmUgaW50NjRfdCBBSEVWQ0Fzc2VtYmxlcjo6ZmluZFJUUFRpbWUoCisgICAgICAgIGNvbnN0IHVpbnQzMl90JiBmaXJzdFJUUFRpbWUsIGNvbnN0IHNwPEFCdWZmZXI+JiBidWZmZXIpIHsKKyAgICAvKiBJZiB5b3Ugd2FudCB0byArLCAtLCAqIHJ0cFRpbWUsIHJlY29tbWVuZCB0byBkZWNsYXJlIHJ0cFRpbWUgYXMgaW50NjRfdC4KKyAgICAgICBCZWNhdXNlIHJ0cFRpbWUgY2FuIGJlIG5lYXIgVUlOVDMyX01BWC4gQmV3YXJlIHRoZSBvdmVyZmxvdy4gKi8KKyAgICBpbnQ2NF90IHJ0cFRpbWUgPSAwOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInJ0cC10aW1lIiwgKGludDMyX3QgKikmcnRwVGltZSkpOworICAgIC8vIElmIHRoZSBmaXJzdCBvdmVycyAyXjMxIGFuZCBydHAgdW5kZXJzIDJeMzEsIHRoZSBydHAgdmFsdWUgaXMgb3ZlcmZsb3dlZCBvbmUuCisgICAgaW50NjRfdCBvdmVyZmxvd01hc2sgPSAoZmlyc3RSVFBUaW1lICYgMHg4MDAwMDAwMCAmIH5ydHBUaW1lKSA8PCAxOworICAgIHJldHVybiBydHBUaW1lIHwgb3ZlcmZsb3dNYXNrOworfQorCitpbnQzMl90IEFIRVZDQXNzZW1ibGVyOjpwaWNrUHJvcGVyU2VxKGNvbnN0IFF1ZXVlICpxdWV1ZSwKKyAgICAgICAgdWludDMyX3QgZmlyc3QsIGludDY0X3QgcGxheSwgaW50NjRfdCBqaXQpIHsKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSAqKHF1ZXVlLT5iZWdpbigpKTsKKyAgICBpbnQzMl90IG5leHRTZXFObyA9IGJ1ZmZlci0+aW50MzJEYXRhKCk7CisKKyAgICBRdWV1ZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gcXVldWUtPmVuZCgpKSB7CisgICAgICAgIGludDY0X3QgcnRwVGltZSA9IGZpbmRSVFBUaW1lKGZpcnN0LCAqaXQpOworICAgICAgICAvLyBpZiBwa3QgaW4gdGltZSBleGlzdHMsIHRoYXQgc2hvdWxkIGJlIHRoZSBuZXh0IHBpdm90CisgICAgICAgIGlmIChydHBUaW1lICsgaml0ID49IHBsYXkpIHsKKyAgICAgICAgICAgIG5leHRTZXFObyA9ICgqaXQpLT5pbnQzMkRhdGEoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGl0Kys7CisgICAgfQorICAgIHJldHVybiBuZXh0U2VxTm87Cit9CisKK2Jvb2wgQUhFVkNBc3NlbWJsZXI6OnJlY3ljbGVVbml0KHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBlbmQsICB1aW50MzJfdCBjb25uZWN0ZWQsCisgICAgICAgICBzaXplX3QgYXZhaWwsIGZsb2F0IGdvb2RSYXRpbykgeworICAgIGZsb2F0IHRvdGFsID0gZW5kIC0gc3RhcnQ7CisgICAgZmxvYXQgdmFsaWQgPSBjb25uZWN0ZWQ7CisgICAgZmxvYXQgZXhpc3QgPSBhdmFpbDsKKyAgICBib29sIGlzUmVjeWNsZSA9ICh2YWxpZCAvIHRvdGFsKSA+PSBnb29kUmF0aW87CisKKyAgICBBTE9HVigiY2hlY2tpbmcgcC1mcmFtZSBsb3NzZXMuLiByZWN2QnVmcyAlZiB2YWxpZCAlZiBkaWZmICVmIHJlY3ljbGU/ICVkIiwKKyAgICAgICAgICAgIGV4aXN0LCB2YWxpZCwgdG90YWwsIGlzUmVjeWNsZSk7CisKKyAgICByZXR1cm4gaXNSZWN5Y2xlOworfQorCitpbnQzMl90IEFIRVZDQXNzZW1ibGVyOjpkZWxldGVVbml0VW5kZXJTZXEoUXVldWUgKnF1ZXVlLCB1aW50MzJfdCBzZXEpIHsKKyAgICBpbnQzMl90IGluaXRTaXplID0gcXVldWUtPnNpemUoKTsKKyAgICBRdWV1ZTo6aXRlcmF0b3IgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gcXVldWUtPmVuZCgpKSB7CisgICAgICAgIGlmICgodWludDMyX3QpKCppdCktPmludDMyRGF0YSgpID49IHNlcSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaXQrKzsKKyAgICB9CisgICAgcXVldWUtPmVyYXNlKHF1ZXVlLT5iZWdpbigpLCBpdCk7CisgICAgcmV0dXJuIGluaXRTaXplIC0gcXVldWUtPnNpemUoKTsKK30KKworaW5saW5lIHZvaWQgQUhFVkNBc3NlbWJsZXI6OnByaW50Tm93VGltZVVzKGludDY0X3Qgc3RhcnQsIGludDY0X3Qgbm93LCBpbnQ2NF90IHBsYXkpIHsKKyAgICBBTE9HRCgic3RhcnQ9JWxsZCwgbm93PSVsbGQsIHBsYXllZD0lbGxkIiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpc3RhcnQsIChsb25nIGxvbmcpbm93LCAobG9uZyBsb25nKXBsYXkpOworfQorCitpbmxpbmUgdm9pZCBBSEVWQ0Fzc2VtYmxlcjo6cHJpbnRSVFBUaW1lKGludDY0X3QgcnRwLCBpbnQ2NF90IHBsYXksIGludDY0X3QgZXhwLCBib29sIGlzRXhwKSB7CisgICAgQUxPR0QoInJ0cC10aW1lKEpCKT0lbGxkLCBwbGF5ZWQtcnRwLXRpbWUoSkIpPSVsbGQsIGV4cGlyZWQtcnRwLXRpbWUoSkIpPSVsbGQgZXhwaXJlZD0lZCIsCisgICAgICAgICAgICAobG9uZyBsb25nKXJ0cCwgKGxvbmcgbG9uZylwbGF5LCAobG9uZyBsb25nKWV4cCwgaXNFeHApOworfQorCitBUlRQQXNzZW1ibGVyOjpBc3NlbWJseVN0YXR1cyBBSEVWQ0Fzc2VtYmxlcjo6YXNzZW1ibGVNb3JlKAorICAgICAgICBjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKSB7CisgICAgQXNzZW1ibHlTdGF0dXMgc3RhdHVzID0gYWRkTkFMVW5pdChzb3VyY2UpOworICAgIGlmIChzdGF0dXMgPT0gTUFMRk9STUVEX1BBQ0tFVCkgeworICAgICAgICB1aW50NjRfdCBtc2Vjc1NpbmNlTGFzdElGcmFtZSA9IChBTG9vcGVyOjpHZXROb3dVcygpIC8gMTAwMCkgLSBtTGFzdElGcmFtZVByb3ZpZGVkQXRNczsKKyAgICAgICAgaWYgKG1zZWNzU2luY2VMYXN0SUZyYW1lID4gMTAwMCkgeworICAgICAgICAgICAgQUxPR1YoInJlcXVlc3QgRklSIHRvIGdldCBhIG5ldyBJLUZyYW1lLCB0aW1lIGFmdGVyICIKKyAgICAgICAgICAgICAgICAgICAgImxhc3QgSS1GcmFtZSBpbiAlbGx1IG1zIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltc2Vjc1NpbmNlTGFzdElGcmFtZSk7CisgICAgICAgICAgICBzb3VyY2UtPm9uSXNzdWVGSVJCeUFzc2VtYmxlcigpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgQUhFVkNBc3NlbWJsZXI6OnBhY2tldExvc3QoKSB7CisgICAgQ0hFQ0sobU5leHRFeHBlY3RlZFNlcU5vVmFsaWQpOworICAgIEFMT0dEKCJwYWNrZXRMb3N0IChleHBlY3RlZCAldSkiLCBtTmV4dEV4cGVjdGVkU2VxTm8pOworCisgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87Cit9CisKK3ZvaWQgQUhFVkNBc3NlbWJsZXI6Om9uQnllUmVjZWl2ZWQoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnlNc2ctPmR1cCgpOworICAgIG1zZy0+c2V0SW50MzIoImVvcyIsIHRydWUpOworICAgIG1zZy0+cG9zdCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMWNkZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIRVZDQXNzZW1ibGVyLmgKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9IRVZDX0FTU0VNQkxFUl9IXworCisjZGVmaW5lIEFfSEVWQ19BU1NFTUJMRVJfSF8KKworI2luY2x1ZGUgIkFSVFBBc3NlbWJsZXIuaCIKKworI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CitzdHJ1Y3QgQU1lc3NhZ2U7CisKK3N0cnVjdCBBSEVWQ0Fzc2VtYmxlciA6IHB1YmxpYyBBUlRQQXNzZW1ibGVyIHsKKyAgICBBSEVWQ0Fzc2VtYmxlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CisKKyAgICB0eXBlZGVmIExpc3Q8c3A8QUJ1ZmZlcj4gPiBRdWV1ZTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFIRVZDQXNzZW1ibGVyKCk7CisKKyAgICB2aXJ0dWFsIEFzc2VtYmx5U3RhdHVzIGFzc2VtYmxlTW9yZShjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25CeWVSZWNlaXZlZCgpOworICAgIHZpcnR1YWwgdm9pZCBwYWNrZXRMb3N0KCk7CisKK3ByaXZhdGU6CisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnlNc2c7CisKKyAgICB1aW50MzJfdCBtQWNjZXNzVW5pdFJUUFRpbWU7CisgICAgYm9vbCBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZDsKKyAgICB1aW50MzJfdCBtTmV4dEV4cGVjdGVkU2VxTm87CisgICAgYm9vbCBtQWNjZXNzVW5pdERhbWFnZWQ7CisgICAgYm9vbCBtRmlyc3RJRnJhbWVQcm92aWRlZDsKKyAgICB1aW50NjRfdCBtTGFzdElGcmFtZVByb3ZpZGVkQXRNczsKKyAgICBpbnQzMl90IG1XaWR0aDsKKyAgICBpbnQzMl90IG1IZWlnaHQ7CisgICAgTGlzdDxzcDxBQnVmZmVyPiA+IG1OQUxVbml0czsKKworICAgIGludDMyX3QgYWRkTmFjayhjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKTsKKyAgICB2b2lkIGNoZWNrU3BzVXBkYXRlZChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKyAgICB2b2lkIGNoZWNrSUZyYW1lUHJvdmlkZWQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisgICAgYm9vbCBkcm9wRnJhbWVzVW50aWxJZnJhbWUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisgICAgQXNzZW1ibHlTdGF0dXMgYWRkTkFMVW5pdChjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKTsKKyAgICB2b2lkIGFkZFNpbmdsZU5BTFVuaXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisgICAgQXNzZW1ibHlTdGF0dXMgYWRkRnJhZ21lbnRlZE5BTFVuaXQoTGlzdDxzcDxBQnVmZmVyPiA+ICpxdWV1ZSk7CisgICAgYm9vbCBhZGRTaW5nbGVUaW1lQWdncmVnYXRpb25QYWNrZXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICB2b2lkIHN1Ym1pdEFjY2Vzc1VuaXQoKTsKKworICAgIGlubGluZSBpbnQ2NF90IGZpbmRSVFBUaW1lKGNvbnN0IHVpbnQzMl90JiBmaXJzdFJUUFRpbWUsIGNvbnN0IHNwPEFCdWZmZXI+JiBidWZmZXIpOworICAgIGludDMyX3QgcGlja1Byb3BlclNlcShjb25zdCBRdWV1ZSAqcSwgdWludDMyX3QgZmlyc3QsIGludDY0X3QgcGxheSwgaW50NjRfdCBqaXQpOworICAgIGJvb2wgcmVjeWNsZVVuaXQodWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGVuZCwgdWludDMyX3QgY29ubmVjdGVkLAorICAgICAgICAgICAgIHNpemVfdCBhdmFpbCwgZmxvYXQgZ29vZFJhdGlvKTsKKyAgICBpbnQzMl90IGRlbGV0ZVVuaXRVbmRlclNlcShRdWV1ZSAqcXVldWUsIHVpbnQzMl90IHNlcSk7CisgICAgdm9pZCBwcmludE5vd1RpbWVVcyhpbnQ2NF90IHN0YXJ0LCBpbnQ2NF90IG5vdywgaW50NjRfdCBwbGF5KTsKKyAgICB2b2lkIHByaW50UlRQVGltZShpbnQ2NF90IHJ0cCwgaW50NjRfdCBwbGF5LCBpbnQ2NF90IGV4cCwgYm9vbCBpc0V4cCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBSEVWQ0Fzc2VtYmxlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfSEVWQ19BU1NFTUJMRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCmluZGV4IDU3NGJkN2EuLjhmNGRmOGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcApAQCAtNDU0LDYgKzQ1NCwxNyBAQAogCiAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOwogICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoZGVzYy5jX3N0cigpLCAiSDI2NS8iLCA1KSkgeworICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7CisKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICBpZiAoIXNlc3Npb25EZXNjLT5nZXREaW1lbnNpb25zKGluZGV4LCBQVCwgJndpZHRoLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgd2lkdGggPSAtMTsKKyAgICAgICAgICAgIGhlaWdodCA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7CisgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7CiAgICAgfSBlbHNlIGlmICghc3RybmNtcChkZXNjLmNfc3RyKCksICJIMjYzLTIwMDAvIiwgMTApCiAgICAgICAgICAgICB8fCAhc3RybmNtcChkZXNjLmNfc3RyKCksICJIMjYzLTE5OTgvIiwgMTApKSB7CiAgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuY3BwCmluZGV4IGJlZmMyMjYuLjUyYWEzYTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmNwcApAQCAtMTQsNiArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2RlZmluZSBMT0dfVEFHICJBUlRQQXNzZW1ibGVyIgogI2luY2x1ZGUgIkFSVFBBc3NlbWJsZXIuaCIKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgpAQCAtMjEsMTIgKzIyLDE2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKwogI2luY2x1ZGUgPHN0ZGludC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEFSVFBBc3NlbWJsZXI6OkFSVFBBc3NlbWJsZXIoKQotICAgIDogbUZpcnN0RmFpbHVyZVRpbWVVcygtMSkgeworICAgIDogbVNob3dRdWV1ZUNudCgwKSwKKyAgICAgIG1GaXJzdEZhaWx1cmVUaW1lVXMoLTEpIHsKKyAgICBtU2hvd1F1ZXVlID0gYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KCJkZWJ1Zy5zdGFnZWZyaWdodC5ydHAiLCBmYWxzZSk7CiB9CiAKIHZvaWQgQVJUUEFzc2VtYmxlcjo6b25QYWNrZXRSZWNlaXZlZChjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKSB7CkBAIC0xNDEsNCArMTQ2LDE1IEBACiAgICAgcmV0dXJuIGFjY2Vzc1VuaXQ7CiB9CiAKK3ZvaWQgQVJUUEFzc2VtYmxlcjo6c2hvd0N1cnJlbnRRdWV1ZShMaXN0PHNwPEFCdWZmZXI+ID4gKnF1ZXVlKSB7CisgICAgQVN0cmluZyB0ZW1wKCJRdWV1ZSBlbGVtIHNpemUgOiAiKTsKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gcXVldWUtPmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IHF1ZXVlLT5lbmQoKSkgeworICAgICAgICB0ZW1wLmFwcGVuZCgoKml0KS0+c2l6ZSgpKTsKKyAgICAgICAgdGVtcC5hcHBlbmQoIiAgXHQiKTsKKyAgICAgICAgaXQrKzsKKyAgICB9CisgICAgQUxPR0QoIiVzIix0ZW1wLmNfc3RyKCkpOworfTsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmgKaW5kZXggNDA4MmQ0Yy4uMTkxZjA4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmgKQEAgLTU2LDYgKzU2LDExIEBACiAgICAgc3RhdGljIHNwPEFCdWZmZXI+IE1ha2VDb21wb3VuZEZyb21QYWNrZXRzKAogICAgICAgICAgICAgY29uc3QgTGlzdDxzcDxBQnVmZmVyPiA+ICZmcmFtZXMpOwogCisgICAgdm9pZCBzaG93Q3VycmVudFF1ZXVlKExpc3Q8c3A8QUJ1ZmZlcj4gPiAqcXVldWUpOworCisgICAgYm9vbCBtU2hvd1F1ZXVlOworICAgIGludDMyX3QgbVNob3dRdWV1ZUNudDsKKwogcHJpdmF0ZToKICAgICBpbnQ2NF90IG1GaXJzdEZhaWx1cmVUaW1lVXM7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKaW5kZXggNmE0NzA2ZC4uNjFjMDZkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKQEAgLTMwLDYgKzMwLDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvbXVsdGluZXR3b3JrLmg+CisKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAKQEAgLTUzLDYgKzU1LDcgQEAKIGNvbnN0IGludDY0X3QgQVJUUENvbm5lY3Rpb246OmtTZWxlY3RUaW1lb3V0VXMgPSAxMDAwTEw7CiAKIHN0cnVjdCBBUlRQQ29ubmVjdGlvbjo6U3RyZWFtSW5mbyB7CisgICAgYm9vbCBpc0lQdjY7CiAgICAgaW50IG1SVFBTb2NrZXQ7CiAgICAgaW50IG1SVENQU29ja2V0OwogICAgIHNwPEFTZXNzaW9uRGVzY3JpcHRpb24+IG1TZXNzaW9uRGVzYzsKQEAgLTYzLDE0ICs2NiwyMSBAQAogICAgIGludDY0X3QgbU51bVJUQ1BQYWNrZXRzUmVjZWl2ZWQ7CiAgICAgaW50NjRfdCBtTnVtUlRQUGFja2V0c1JlY2VpdmVkOwogICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBtUmVtb3RlUlRDUEFkZHI7CisgICAgc3RydWN0IHNvY2thZGRyX2luNiBtUmVtb3RlUlRDUEFkZHI2OwogCiAgICAgYm9vbCBtSXNJbmplY3RlZDsKKworICAgIC8vIFJUQ1AgRXh0ZW5zaW9uIGZvciBDVk8KKyAgICBpbnQgbUNWT0V4dE1hcDsgLy8gd2lsbCBiZSBzZXQgdG8gMCBpZiBjdm8gaXMgbm90IG5lZ290aWF0ZWQgaW4gc2RwCiB9OwogCiBBUlRQQ29ubmVjdGlvbjo6QVJUUENvbm5lY3Rpb24odWludDMyX3QgZmxhZ3MpCiAgICAgOiBtRmxhZ3MoZmxhZ3MpLAogICAgICAgbVBvbGxFdmVudFBlbmRpbmcoZmFsc2UpLAotICAgICAgbUxhc3RSZWNlaXZlclJlcG9ydFRpbWVVcygtMSkgeworICAgICAgbUxhc3RSZWNlaXZlclJlcG9ydFRpbWVVcygtMSksCisgICAgICBtTGFzdEJpdHJhdGVSZXBvcnRUaW1lVXMoLTEpLAorICAgICAgbVRhcmdldEJpdHJhdGUoLTEpLAorICAgICAgbUpiVGltZU1zKDMwMCkgewogfQogCiBBUlRQQ29ubmVjdGlvbjo6fkFSVFBDb25uZWN0aW9uKCkgewpAQCAtMTIxLDcgKzEzMSw3IEBACiAgICAgdW5zaWduZWQgc3RhcnQgPSAodW5zaWduZWQpKChyYW5kKCkqIDEwMDBMTCkvUkFORF9NQVgpICsgMTU1NTA7CiAgICAgc3RhcnQgJj0gfjE7CiAKLSAgICBmb3IgKHVuc2lnbmVkIHBvcnQgPSBzdGFydDsgcG9ydCA8IDY1NTM2OyBwb3J0ICs9IDIpIHsKKyAgICBmb3IgKHVuc2lnbmVkIHBvcnQgPSBzdGFydDsgcG9ydCA8IDY1NTM1OyBwb3J0ICs9IDIpIHsKICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CiAgICAgICAgIG1lbXNldChhZGRyLnNpbl96ZXJvLCAwLCBzaXplb2YoYWRkci5zaW5femVybykpOwogICAgICAgICBhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwpAQCAtMTM5LDEyICsxNDksMTMwIEBACiAgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKSA9PSAwKSB7CiAgICAgICAgICAgICAqcnRwUG9ydCA9IHBvcnQ7CiAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB3ZSBzaG91bGQgcmVjcmVhdGUgYSBSVFAgc29ja2V0IHRvIGF2b2lkIGJpbmQgb3RoZXIgcG9ydCBpbiBzYW1lIFJUUCBzb2NrZXQKKyAgICAgICAgICAgIGNsb3NlKCpydHBTb2NrZXQpOworCisgICAgICAgICAgICAqcnRwU29ja2V0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICAgICAgICAgICAgQ0hFQ0tfR0UoKnJ0cFNvY2tldCwgMCk7CisgICAgICAgICAgICBidW1wU29ja2V0QnVmZmVyU2l6ZSgqcnRwU29ja2V0KTsKICAgICAgICAgfQogICAgIH0KIAogICAgIFRSRVNQQVNTKCk7CiB9CiAKKy8vIHN0YXRpYwordm9pZCBBUlRQQ29ubmVjdGlvbjo6TWFrZVJUUFNvY2tldFBhaXIoCisgICAgICAgIGludCAqcnRwU29ja2V0LCBpbnQgKnJ0Y3BTb2NrZXQsIGNvbnN0IGNoYXIgKmxvY2FsSXAsIGNvbnN0IGNoYXIgKnJlbW90ZUlwLAorICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsIHVuc2lnbmVkIHJlbW90ZVBvcnQsIGludDY0X3Qgc29ja2V0TmV0d29yaykgeworICAgIGJvb2wgaXNJUHY2ID0gZmFsc2U7CisgICAgaWYgKHN0cmNocihsb2NhbElwLCAnOicpICE9IE5VTEwpCisgICAgICAgIGlzSVB2NiA9IHRydWU7CisKKyAgICAqcnRwU29ja2V0ID0gc29ja2V0KGlzSVB2NiA/IEFGX0lORVQ2IDogQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgICAgQ0hFQ0tfR0UoKnJ0cFNvY2tldCwgMCk7CisKKyAgICBidW1wU29ja2V0QnVmZmVyU2l6ZSgqcnRwU29ja2V0KTsKKworICAgICpydGNwU29ja2V0ID0gc29ja2V0KGlzSVB2NiA/IEFGX0lORVQ2IDogQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgICAgQ0hFQ0tfR0UoKnJ0Y3BTb2NrZXQsIDApOworCisgICAgaWYgKHNvY2tldE5ldHdvcmsgIT0gMCkgeworICAgICAgICBBTE9HRCgidHJ5aW5nIHRvIGJpbmQgcnRwIHNvY2tldCglZCkgdG8gbmV0d29yayglbGx1KS4iLAorICAgICAgICAgICAgICAgICpydHBTb2NrZXQsICh1bnNpZ25lZCBsb25nIGxvbmcpc29ja2V0TmV0d29yayk7CisKKyAgICAgICAgaW50IHJlc3VsdCA9IGFuZHJvaWRfc2V0c29ja25ldHdvcmsoKG5ldF9oYW5kbGVfdClzb2NrZXROZXR3b3JrLCAqcnRwU29ja2V0KTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVygiZmFpbGVkKCVkKSB0byBiaW5kIHJ0cCBzb2NrZXQoJWQpIHRvIG5ldHdvcmsoJWxsdSkiLAorICAgICAgICAgICAgICAgICAgICByZXN1bHQsICpydHBTb2NrZXQsICh1bnNpZ25lZCBsb25nIGxvbmcpc29ja2V0TmV0d29yayk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gYW5kcm9pZF9zZXRzb2NrbmV0d29yaygobmV0X2hhbmRsZV90KXNvY2tldE5ldHdvcmssICpydGNwU29ja2V0KTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVygiZmFpbGVkKCVkKSB0byBiaW5kIHJ0Y3Agc29ja2V0KCVkKSB0byBuZXR3b3JrKCVsbHUpIiwKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCAqcnRjcFNvY2tldCwgKHVuc2lnbmVkIGxvbmcgbG9uZylzb2NrZXROZXR3b3JrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJ1bXBTb2NrZXRCdWZmZXJTaXplKCpydGNwU29ja2V0KTsKKworICAgIHN0cnVjdCBzb2NrYWRkciAqYWRkcjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjQ7CisgICAgc3RydWN0IHNvY2thZGRyX2luNiBhZGRyNjsKKworICAgIGlmIChpc0lQdjYpIHsKKyAgICAgICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcjY7CisgICAgICAgIG1lbXNldCgmYWRkcjYsIDAsIHNpemVvZihhZGRyNikpOworICAgICAgICBhZGRyNi5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworICAgICAgICBpbmV0X3B0b24oQUZfSU5FVDYsIGxvY2FsSXAsICZhZGRyNi5zaW42X2FkZHIpOworICAgICAgICBhZGRyNi5zaW42X3BvcnQgPSBodG9ucygodWludDE2X3QpbG9jYWxQb3J0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBhZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyNDsKKyAgICAgICAgbWVtc2V0KCZhZGRyNCwgMCwgc2l6ZW9mKGFkZHI0KSk7CisgICAgICAgIGFkZHI0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBhZGRyNC5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIobG9jYWxJcCk7CisgICAgICAgIGFkZHI0LnNpbl9wb3J0ID0gaHRvbnMoKHVpbnQxNl90KWxvY2FsUG9ydCk7CisgICAgfQorCisgICAgaW50IHNvY2tvcHQgPSAxOworICAgIHNldHNvY2tvcHQoKnJ0cFNvY2tldCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAoaW50ICopJnNvY2tvcHQsIHNpemVvZihzb2Nrb3B0KSk7CisgICAgc2V0c29ja29wdCgqcnRjcFNvY2tldCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAoaW50ICopJnNvY2tvcHQsIHNpemVvZihzb2Nrb3B0KSk7CisKKyAgICBpbnQgc2l6ZVNvY2tTdCA9IGlzSVB2NiA/IHNpemVvZihhZGRyNikgOiBzaXplb2YoYWRkcjQpOworCisgICAgaWYgKGJpbmQoKnJ0cFNvY2tldCwgYWRkciwgc2l6ZVNvY2tTdCkgPT0gMCkgeworICAgICAgICBBTE9HSSgicnRwIHNvY2tldCBzdWNjZXNzZnVsbHkgYmluZGVkLiBhZGRyPSVzOiVkIiwgbG9jYWxJcCwgbG9jYWxQb3J0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGJpbmQgcnRwIHNvY2tldCBhZGRyPSVzOiVkIGVycj0lcyIsIGxvY2FsSXAsIGxvY2FsUG9ydCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpc0lQdjYpCisgICAgICAgIGFkZHI2LnNpbjZfcG9ydCA9IGh0b25zKGxvY2FsUG9ydCArIDEpOworICAgIGVsc2UKKyAgICAgICAgYWRkcjQuc2luX3BvcnQgPSBodG9ucyhsb2NhbFBvcnQgKyAxKTsKKworICAgIGlmIChiaW5kKCpydGNwU29ja2V0LCBhZGRyLCBzaXplU29ja1N0KSA9PSAwKSB7CisgICAgICAgIEFMT0dJKCJydGNwIHNvY2tldCBzdWNjZXNzZnVsbHkgYmluZGVkLiBhZGRyPSVzOiVkIiwgbG9jYWxJcCwgbG9jYWxQb3J0ICsgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBiaW5kIHJ0Y3Agc29ja2V0IGFkZHI9JXM6JWQgZXJyPSVzIiwgbG9jYWxJcCwKKyAgICAgICAgICAgICAgICBsb2NhbFBvcnQgKyAxLCBzdHJlcnJvcihlcnJubykpOworICAgIH0KKworICAgIC8vIFJlIHVzZXMgYWRkciB2YXJpYWJsZSBhcyByZW1vdGUgYWRkci4KKyAgICBpZiAoaXNJUHY2KSB7CisgICAgICAgIG1lbXNldCgmYWRkcjYsIDAsIHNpemVvZihhZGRyNikpOworICAgICAgICBhZGRyNi5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworICAgICAgICBpbmV0X3B0b24oQUZfSU5FVDYsIHJlbW90ZUlwLCAmYWRkcjYuc2luNl9hZGRyKTsKKyAgICAgICAgYWRkcjYuc2luNl9wb3J0ID0gaHRvbnMoKHVpbnQxNl90KXJlbW90ZVBvcnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbXNldCgmYWRkcjQsIDAsIHNpemVvZihhZGRyNCkpOworICAgICAgICBhZGRyNC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgYWRkcjQuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKHJlbW90ZUlwKTsKKyAgICAgICAgYWRkcjQuc2luX3BvcnQgPSBodG9ucygodWludDE2X3QpcmVtb3RlUG9ydCk7CisgICAgfQorICAgIGlmIChjb25uZWN0KCpydHBTb2NrZXQsIGFkZHIsIHNpemVTb2NrU3QpID09IDApIHsKKyAgICAgICAgQUxPR0koInJ0cCBzb2NrZXQgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byByZW1vdGU9JXM6JWQiLCByZW1vdGVJcCwgcmVtb3RlUG9ydCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBjb25uZWN0IHJ0cCBzb2NrZXQgdG8gcmVtb3RlIGFkZHI9JXM6JWQgZXJyPSVzIiwgcmVtb3RlSXAsCisgICAgICAgICAgICAgICAgcmVtb3RlUG9ydCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpc0lQdjYpCisgICAgICAgIGFkZHI2LnNpbjZfcG9ydCA9IGh0b25zKHJlbW90ZVBvcnQgKyAxKTsKKyAgICBlbHNlCisgICAgICAgIGFkZHI0LnNpbl9wb3J0ID0gaHRvbnMocmVtb3RlUG9ydCArIDEpOworCisgICAgaWYgKGNvbm5lY3QoKnJ0Y3BTb2NrZXQsIGFkZHIsIHNpemVTb2NrU3QpID09IDApIHsKKyAgICAgICAgQUxPR0koInJ0Y3Agc29ja2V0IHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gcmVtb3RlPSVzOiVkIiwgcmVtb3RlSXAsIHJlbW90ZVBvcnQgKyAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGNvbm5lY3QgcnRjcCBzb2NrZXQgYWRkcj0lczolZCBlcnI9JXMiLCByZW1vdGVJcCwKKyAgICAgICAgICAgICAgICByZW1vdGVQb3J0ICsgMSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKwogdm9pZCBBUlRQQ29ubmVjdGlvbjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgIGNhc2Uga1doYXRBZGRTdHJlYW06CkBAIC0yMDQsNiArMzMyLDE5IEBACiAgICAgaW5mby0+bU51bVJUQ1BQYWNrZXRzUmVjZWl2ZWQgPSAwOwogICAgIGluZm8tPm1OdW1SVFBQYWNrZXRzUmVjZWl2ZWQgPSAwOwogICAgIG1lbXNldCgmaW5mby0+bVJlbW90ZVJUQ1BBZGRyLCAwLCBzaXplb2YoaW5mby0+bVJlbW90ZVJUQ1BBZGRyKSk7CisgICAgbWVtc2V0KCZpbmZvLT5tUmVtb3RlUlRDUEFkZHI2LCAwLCBzaXplb2YoaW5mby0+bVJlbW90ZVJUQ1BBZGRyNikpOworCisgICAgc3A8QVNlc3Npb25EZXNjcmlwdGlvbj4gc2Vzc2lvbkRlc2MgPSBpbmZvLT5tU2Vzc2lvbkRlc2M7CisgICAgaW5mby0+bUNWT0V4dE1hcCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzZXNzaW9uRGVzYy0+Y291bnRUcmFja3MoKTsgKytpKSB7CisgICAgICAgIGludDMyX3QgY3ZvRXh0TWFwOworICAgICAgICBpZiAoc2Vzc2lvbkRlc2MtPmdldEN2b0V4dE1hcChpLCAmY3ZvRXh0TWFwKSkgeworICAgICAgICAgICAgaW5mby0+bUNWT0V4dE1hcCA9IGN2b0V4dE1hcDsKKyAgICAgICAgICAgIEFMT0dJKCJ1cm46M2dwcDp2aWRlby1vcmllbnRhdGlvbihjdm8pIGZvdW5kIGFzIGV4dG1hcDolZCIsIGluZm8tPm1DVk9FeHRNYXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0koInVybjozZ3BwOnZpZGVvLW9yaWVudGF0aW9uKGN2bykgbm90IGZvdW5kIDolZCIsIGluZm8tPm1DVk9FeHRNYXApOworICAgICAgICB9CisgICAgfQogCiAgICAgaWYgKCFpbmplY3RlZCkgewogICAgICAgICBwb3N0UG9sbEV2ZW50KCk7CkBAIC0yOTUsMTcgKzQzNiw1OSBAQAogCiAgICAgICAgICAgICBpZiAoZXJyID09IC1FQ09OTlJFU0VUKSB7CiAgICAgICAgICAgICAgICAgLy8gc29ja2V0IGZhaWx1cmUsIHRoaXMgc3RyZWFtIGlzIGRlYWQsIEppbS4KKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gaXQtPm1Ob3RpZnlNc2ctPmR1cCgpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInJ0Y3AtZXZlbnQiLCAxKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJwYXlsb2FkLXR5cGUiLCA0MDApOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImZlZWRiYWNrLXR5cGUiLCAxKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzZW5kZXIiLCBpdC0+bVNvdXJjZXMudmFsdWVBdCgwKS0+Z2V0U2VsZklEKCkpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogCiAgICAgICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byByZWNlaXZlIFJUUC9SVENQIGRhdGFncmFtLiIpOwogICAgICAgICAgICAgICAgIGl0ID0gbVN0cmVhbXMuZXJhc2UoaXQpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBhZGQgTkFDSyBhbmQgRklSIHRoYXQgbmVlZHMgdG8gYmUgc2VudCBpbW1lZGlhdGVseS4KKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKGtNYXhVRFBTaXplKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaXQtPm1Tb3VyY2VzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgICAgICAgICBpbnQgY250ID0gaXQtPm1Tb3VyY2VzLnZhbHVlQXQoaSktPmFkZE5BQ0soYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoY250ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiU2VuZCBOQUNLIGZvciBsb3N0ICVkIFBhY2tldHMiLCBjbnQpOworICAgICAgICAgICAgICAgICAgICBzZW5kKCYqaXQsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgICAgICAgICBpdC0+bVNvdXJjZXMudmFsdWVBdChpKS0+YWRkRklSKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiU2VuZCBGSVIgaW1tZWRpYXRlbHkgZm9yIGxvc3QgUGFja2V0cyIpOworICAgICAgICAgICAgICAgICAgICBzZW5kKCYqaXQsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgICAgICAgICBpdC0+bVNvdXJjZXMudmFsdWVBdChpKS0+YWRkVE1NQlIoYnVmZmVyLCBtVGFyZ2V0Qml0cmF0ZSk7CisgICAgICAgICAgICAgICAgbVRhcmdldEJpdHJhdGUgPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLT5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJTZW5kaW5nIFRNTUJSLi4uIik7CisgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgbiA9IHNlbmQoJippdCwgYnVmZmVyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobiAhPSAoc3NpemVfdClidWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byBzZW5kIFJUQ1AgVE1NQlIgKCVzKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID49IDAgPyAiY29ubmVjdGlvbiBnb25lIiA6IHN0cmVycm9yKGVycm5vKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ID0gbVN0cmVhbXMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgICsraXQ7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBjaGVja1J4Qml0cmF0ZShub3dVcyk7CisKICAgICBpZiAobUxhc3RSZWNlaXZlclJlcG9ydFRpbWVVcyA8PSAwCiAgICAgICAgICAgICB8fCBtTGFzdFJlY2VpdmVyUmVwb3J0VGltZVVzICsgNTAwMDAwMExMIDw9IG5vd1VzKSB7CiAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKGtNYXhVRFBTaXplKTsKQEAgLTM0MCwyNCArNTIzLDE2IEBACiAgICAgICAgICAgICBpZiAoYnVmZmVyLT5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlNlbmRpbmcgUlIuLi4iKTsKIAotICAgICAgICAgICAgICAgIHNzaXplX3QgbjsKLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgIG4gPSBzZW5kdG8oCi0gICAgICAgICAgICAgICAgICAgICAgICBzLT5tUlRDUFNvY2tldCwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZzLT5tUmVtb3RlUlRDUEFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yocy0+bVJlbW90ZVJUQ1BBZGRyKSk7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworICAgICAgICAgICAgICAgIHNzaXplX3QgbiA9IHNlbmQocywgYnVmZmVyKTsKIAotICAgICAgICAgICAgICAgIGlmIChuIDw9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobiAhPSAoc3NpemVfdClidWZmZXItPnNpemUoKSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHNlbmQgUlRDUCByZWNlaXZlciByZXBvcnQgKCVzKS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIG4gPT0gMCA/ICJjb25uZWN0aW9uIGdvbmUiIDogc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID49IDAgPyAiY29ubmVjdGlvbiBnb25lIiA6IHN0cmVycm9yKGVycm5vKSk7CiAKICAgICAgICAgICAgICAgICAgICAgaXQgPSBtU3RyZWFtcy5lcmFzZShpdCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIENIRUNLX0VRKG4sIChzc2l6ZV90KWJ1ZmZlci0+c2l6ZSgpKTsKLQogICAgICAgICAgICAgICAgIG1MYXN0UmVjZWl2ZXJSZXBvcnRUaW1lVXMgPSBub3dVczsKICAgICAgICAgICAgIH0KIApAQCAtMzc3LDkgKzU1MiwyMiBAQAogCiAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoNjU1MzYpOwogCisgICAgc3RydWN0IHNvY2thZGRyICpwUmVtb3RlUlRDUEFkZHI7CisgICAgaW50IHNpemVTb2NrU3Q7CisgICAgaWYgKHMtPmlzSVB2NikgeworICAgICAgICBwUmVtb3RlUlRDUEFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJnMtPm1SZW1vdGVSVENQQWRkcjY7CisgICAgICAgIHNpemVTb2NrU3QgPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcFJlbW90ZVJUQ1BBZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSZzLT5tUmVtb3RlUlRDUEFkZHI7CisgICAgICAgIHNpemVTb2NrU3QgPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKyAgICB9CiAgICAgc29ja2xlbl90IHJlbW90ZUFkZHJMZW4gPQogICAgICAgICAoIXJlY2VpdmVSVFAgJiYgcy0+bU51bVJUQ1BQYWNrZXRzUmVjZWl2ZWQgPT0gMCkKLSAgICAgICAgICAgID8gc2l6ZW9mKHMtPm1SZW1vdGVSVENQQWRkcikgOiAwOworICAgICAgICAgICAgPyBzaXplU29ja1N0IDogMDsKKworICAgIGlmIChtRmxhZ3MgJiBrVmlMVEVDb25uZWN0aW9uKSB7CisgICAgICAgIHJlbW90ZUFkZHJMZW4gPSAwOworICAgIH0KIAogICAgIHNzaXplX3QgbmJ5dGVzOwogICAgIGRvIHsKQEAgLTM4OCw4ICs1NzYsOSBAQAogICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCksCiAgICAgICAgICAgICBidWZmZXItPmNhcGFjaXR5KCksCiAgICAgICAgICAgICAwLAotICAgICAgICAgICAgcmVtb3RlQWRkckxlbiA+IDAgPyAoc3RydWN0IHNvY2thZGRyICopJnMtPm1SZW1vdGVSVENQQWRkciA6IE5VTEwsCisgICAgICAgICAgICByZW1vdGVBZGRyTGVuID4gMCA/IHBSZW1vdGVSVENQQWRkciA6IE5VTEwsCiAgICAgICAgICAgICByZW1vdGVBZGRyTGVuID4gMCA/ICZyZW1vdGVBZGRyTGVuIDogTlVMTCk7CisgICAgICAgIG1DdW11bGF0aXZlQnl0ZXMgKz0gbmJ5dGVzOwogICAgIH0gd2hpbGUgKG5ieXRlcyA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwogCiAgICAgaWYgKG5ieXRlcyA8PSAwKSB7CkBAIC00MTAsNiArNTk5LDM2IEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAorc3NpemVfdCBBUlRQQ29ubmVjdGlvbjo6c2VuZChjb25zdCBTdHJlYW1JbmZvICppbmZvLCBjb25zdCBzcDxBQnVmZmVyPiBidWZmZXIpIHsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyKiBwUmVtb3RlUlRDUEFkZHI7CisgICAgICAgIGludCBzaXplU29ja1N0OworCisgICAgICAgIC8qIEl0IHNlZW1zIHRoaXMgaXNJUHY2IHZhcmlhYmxlIGlzIHVzZWxlc3MuCisgICAgICAgICAqIFdlIHNob3VsZCByZW1vdmUgaXQgdG8gcHJldmVudCBjb25mdXNpb24gKi8KKyAgICAgICAgaWYgKGluZm8tPmlzSVB2NikgeworICAgICAgICAgICAgcFJlbW90ZVJUQ1BBZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSZpbmZvLT5tUmVtb3RlUlRDUEFkZHI2OworICAgICAgICAgICAgc2l6ZVNvY2tTdCA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBSZW1vdGVSVENQQWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmaW5mby0+bVJlbW90ZVJUQ1BBZGRyOworICAgICAgICAgICAgc2l6ZVNvY2tTdCA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1GbGFncyAmIGtWaUxURUNvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgIEFMT0dWKCJWaUxURSBSVENQIik7CisgICAgICAgICAgICBwUmVtb3RlUlRDUEFkZHIgPSBOVUxMOworICAgICAgICAgICAgc2l6ZVNvY2tTdCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBzc2l6ZV90IG47CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIG4gPSBzZW5kdG8oCisgICAgICAgICAgICAgICAgICAgIGluZm8tPm1SVENQU29ja2V0LCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCksIDAsCisgICAgICAgICAgICAgICAgICAgIHBSZW1vdGVSVENQQWRkciwgc2l6ZVNvY2tTdCk7CisgICAgICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKKworICAgICAgICByZXR1cm4gbjsKK30KKwogc3RhdHVzX3QgQVJUUENvbm5lY3Rpb246OnBhcnNlUlRQKFN0cmVhbUluZm8gKnMsIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKICAgICBpZiAocy0+bU51bVJUUFBhY2tldHNSZWNlaXZlZCsrID09IDApIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IHMtPm1Ob3RpZnlNc2ctPmR1cCgpOwpAQCAtNDMxLDYgKzY1MCwxMSBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCisgICAgaWYgKChkYXRhWzFdICYgMHg3ZikgPT0gMjAgLyogZGVjaW1hbCAqLykgeworICAgICAgICAvLyBVbmFzc2lnbmVkIHBheWxvYWQgdHlwZQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCiAgICAgaWYgKGRhdGFbMF0gJiAweDIwKSB7CiAgICAgICAgIC8vIFBhZGRpbmcgcHJlc2VudC4KIApAQCAtNDU0LDYgKzY3OCw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKKyAgICBpbnQzMl90IGN2b0RlZ3JlZXMgPSAtMTsKICAgICBpZiAoZGF0YVswXSAmIDB4MTApIHsKICAgICAgICAgLy8gSGVhZGVyIGVYdGVuc2lvbiBwcmVzZW50LgogCkBAIC00NjcsMTMgKzY5MiwxNCBAQAogICAgICAgICBjb25zdCB1aW50OF90ICpleHRlbnNpb25EYXRhID0gJmRhdGFbcGF5bG9hZE9mZnNldF07CiAKICAgICAgICAgc2l6ZV90IGV4dGVuc2lvbkxlbmd0aCA9Ci0gICAgICAgICAgICA0ICogKGV4dGVuc2lvbkRhdGFbMl0gPDwgOCB8IGV4dGVuc2lvbkRhdGFbM10pOworICAgICAgICAgICAgKDQgKiAoZXh0ZW5zaW9uRGF0YVsyXSA8PCA4IHwgZXh0ZW5zaW9uRGF0YVszXSkpICsgNDsKIAotICAgICAgICBpZiAoc2l6ZSA8IHBheWxvYWRPZmZzZXQgKyA0ICsgZXh0ZW5zaW9uTGVuZ3RoKSB7CisgICAgICAgIGlmIChzaXplIDwgcGF5bG9hZE9mZnNldCArIGV4dGVuc2lvbkxlbmd0aCkgewogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAKLSAgICAgICAgcGF5bG9hZE9mZnNldCArPSA0ICsgZXh0ZW5zaW9uTGVuZ3RoOworICAgICAgICBwYXJzZVJUUEV4dChzLCAoY29uc3QgdWludDhfdCAqKWV4dGVuc2lvbkRhdGEsIGV4dGVuc2lvbkxlbmd0aCwgJmN2b0RlZ3JlZXMpOworICAgICAgICBwYXlsb2FkT2Zmc2V0ICs9IGV4dGVuc2lvbkxlbmd0aDsKICAgICB9CiAKICAgICB1aW50MzJfdCBzcmNJZCA9IHUzMmF0KCZkYXRhWzhdKTsKQEAgLTQ4Nyw2ICs3MTMsOSBAQAogICAgIG1ldGEtPnNldEludDMyKCJydHAtdGltZSIsIHJ0cFRpbWUpOwogICAgIG1ldGEtPnNldEludDMyKCJQVCIsIGRhdGFbMV0gJiAweDdmKTsKICAgICBtZXRhLT5zZXRJbnQzMigiTSIsIGRhdGFbMV0gPj4gNyk7CisgICAgaWYgKGN2b0RlZ3JlZXMgPj0gMCkgeworICAgICAgICBtZXRhLT5zZXRJbnQzMigiY3ZvIiwgY3ZvRGVncmVlcyk7CisgICAgfQogCiAgICAgYnVmZmVyLT5zZXRJbnQzMkRhdGEodTE2YXQoJmRhdGFbMl0pKTsKICAgICBidWZmZXItPnNldFJhbmdlKHBheWxvYWRPZmZzZXQsIHNpemUgLSBwYXlsb2FkT2Zmc2V0KTsKQEAgLTQ5NiwxMSArNzI1LDY1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBBUlRQQ29ubmVjdGlvbjo6cGFyc2VSVFBFeHQoU3RyZWFtSW5mbyAqcywKKyAgICAgICAgY29uc3QgdWludDhfdCAqZXh0SGVhZGVyLCBzaXplX3QgZXh0TGVuLCBpbnQzMl90ICpjdm9EZWdyZWVzKSB7CisgICAgaWYgKGV4dExlbiA8IDQpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHVpbnQxNl90IGhlYWRlciA9IChleHRIZWFkZXJbMF0gPDwgOCkgfCAoZXh0SGVhZGVyWzFdKTsKKyAgICBib29sIGlzT25lYnl0ZUhlYWRlciA9IGZhbHNlOworCisgICAgaWYgKGhlYWRlciA9PSAweEJFREUpIHsKKyAgICAgICAgaXNPbmVieXRlSGVhZGVyID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGhlYWRlciA9PSAweDEwMDApIHsKKyAgICAgICAgQUxPR1coInBhcnNlUlRQRXh0OiB0d28tYnl0ZSBoZWFkZXIgaXMgbm90IGltcGxlbWVudGVkIHlldCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coInBhcnNlUlRQRXh0OiBjYW4gbm90IHJlY29nbml6ZSBoZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QgKmV4dFBheWxvYWQgPSBleHRIZWFkZXIgKyA0OworICAgIGV4dExlbiAtPSA0OworICAgIHNpemVfdCBvZmZzZXQgPSAwOyAvL3N0YXJ0IGZyb20gZmlyc3QgcGF5bG9hZCBvZiBydHAgZXh0ZW5zaW9uLgorICAgIC8vIG9uZS1ieXRlIGhlYWRlciBwYXJzZXIKKyAgICB3aGlsZSAoaXNPbmVieXRlSGVhZGVyICYmIG9mZnNldCA8IGV4dExlbikgeworICAgICAgICB1aW50OF90IGV4dG1hcElkID0gZXh0UGF5bG9hZFtvZmZzZXRdID4+IDQ7CisgICAgICAgIHVpbnQ4X3QgbGVuZ3RoID0gKGV4dFBheWxvYWRbb2Zmc2V0XSAmIDB4RikgKyAxOworICAgICAgICBvZmZzZXQrKzsKKworICAgICAgICAvLyBwYWRkaW5nIGNhc2UKKyAgICAgICAgaWYgKGV4dG1hcElkID09IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICB1aW50OF90IGRhdGFbMTZdOyAvLyBtYXhpbXVtIGxlbmd0aCB2YWx1ZQorICAgICAgICBmb3IgKHVpbnQ4X3QgaiA9IDA7IG9mZnNldCArIGogPD0gZXh0TGVuICYmIGogPCBsZW5ndGg7IGorKykgeworICAgICAgICAgICAgZGF0YVtqXSA9IGV4dFBheWxvYWRbb2Zmc2V0ICsgal07CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgKz0gbGVuZ3RoOworCisgICAgICAgIGlmIChleHRtYXBJZCA9PSBzLT5tQ1ZPRXh0TWFwKSB7CisgICAgICAgICAgICAqY3ZvRGVncmVlcyA9IChpbnQzMl90KWRhdGFbMF07CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCiBzdGF0dXNfdCBBUlRQQ29ubmVjdGlvbjo6cGFyc2VSVENQKFN0cmVhbUluZm8gKnMsIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKICAgICBpZiAocy0+bU51bVJUQ1BQYWNrZXRzUmVjZWl2ZWQrKyA9PSAwKSB7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBzLT5tTm90aWZ5TXNnLT5kdXAoKTsKICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZmlyc3QtcnRjcCIsIHRydWUpOwogICAgICAgICBub3RpZnktPnBvc3QoKTsKKworICAgICAgICBBTE9HSSgic2VuZCBmaXJzdC1ydGNwIGV2ZW50IHRvIHVwcGVyIGxheWVyIGFzIEltc1J4Tm90aWNlIik7CisgICAgICAgIHNwPEFNZXNzYWdlPiBpbXNOb3RpZnkgPSBzLT5tTm90aWZ5TXNnLT5kdXAoKTsKKyAgICAgICAgaW1zTm90aWZ5LT5zZXRJbnQzMigicnRjcC1ldmVudCIsIDEpOworICAgICAgICBpbXNOb3RpZnktPnNldEludDMyKCJwYXlsb2FkLXR5cGUiLCAxMDEpOworICAgICAgICBpbXNOb3RpZnktPnNldEludDMyKCJmZWVkYmFjay10eXBlIiwgMCk7CisgICAgICAgIGltc05vdGlmeS0+cG9zdCgpOwogICAgIH0KIAogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKQEAgLTU1MSw4ICs4MzQsMTIgQEAKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSAyMDU6ICAvLyBUU0ZCICh0cmFuc3BvcnQgbGF5ZXIgc3BlY2lmaWMgZmVlZGJhY2spCisgICAgICAgICAgICAgICAgcGFyc2VUU0ZCKHMsIGRhdGEsIGhlYWRlckxlbmd0aCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDIwNjogIC8vIFBTRkIgKHBheWxvYWQgc3BlY2lmaWMgZmVlZGJhY2spCiAgICAgICAgICAgICAgICAgLy8gaGV4ZHVtcChkYXRhLCBoZWFkZXJMZW5ndGgpOworICAgICAgICAgICAgICAgIHBhcnNlUFNGQihzLCBkYXRhLCBoZWFkZXJMZW5ndGgpOworICAgICAgICAgICAgICAgIEFMT0dJKCJSVENQIHBhY2tldCB0eXBlICV1IG9mIHNpemUgJXp1IiwgKHVuc2lnbmVkKWRhdGFbMV0sIGhlYWRlckxlbmd0aCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgMjAzOgpAQCAtNTg5LDYgKzg3NiwxMiBAQAogCiAgICAgc3A8QVJUUFNvdXJjZT4gc291cmNlID0gZmluZFNvdXJjZShzLCBpZCk7CiAKKyAgICAvLyBSZXBvcnQgYSBmaW5hbCBzdGFzdGljcyB0byBiZSB1c2VkIGZvciBydHAgZGF0YSB1c2FnZS4KKyAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBpbnQzMl90IHRpbWVEaWZmID0gKG5vd1VzIC0gbUxhc3RCaXRyYXRlUmVwb3J0VGltZVVzKSAvIDEwMDAwMDBsbDsKKyAgICBpbnQzMl90IGJpdHJhdGUgPSBtQ3VtdWxhdGl2ZUJ5dGVzICogOCAvIHRpbWVEaWZmOworICAgIHNvdXJjZS0+bm90aWZ5UGt0SW5mbyhiaXRyYXRlLCB0cnVlIC8qIGlzUmVndWxhciAqLyk7CisKICAgICBzb3VyY2UtPmJ5ZVJlY2VpdmVkKCk7CiAKICAgICByZXR1cm4gT0s7CkBAIC02MjEsNiArOTE0LDE0NCBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0dXNfdCBBUlRQQ29ubmVjdGlvbjo6cGFyc2VUU0ZCKAorICAgICAgICBTdHJlYW1JbmZvICpzLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplIDwgMTIpIHsKKyAgICAgICAgLy8gYnJva2VuIHBhY2tldAorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgdWludDhfdCBtc2dUeXBlID0gZGF0YVswXSAmIDB4MWY7CisgICAgdWludDMyX3QgaWQgPSB1MzJhdCgmZGF0YVs0XSk7CisKKyAgICBjb25zdCB1aW50OF90ICpwdHIgPSAmZGF0YVsxMl07CisgICAgc2l6ZSAtPSAxMjsKKworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisgICAgc2l6ZV90IEZDSVNpemU7CisgICAgc3dpdGNoKG1zZ1R5cGUpIHsKKyAgICAgICAgY2FzZSAxOiAgICAgLy8gR2VuZXJpYyBOQUNLCisgICAgICAgIHsKKyAgICAgICAgICAgIEZDSVNpemUgPSA0OworICAgICAgICAgICAgd2hpbGUgKHNpemUgPj0gRkNJU2l6ZSkgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IFBJRCA9IHUxNmF0KCZwdHJbMF0pOyAgLy8gbG9zdCBwYWNrZXQgUlRQIG51bWJlcgorICAgICAgICAgICAgICAgIHVpbnQxNl90IEJMUCA9IHUxNmF0KCZwdHJbMl0pOyAgLy8gQml0bWFzayBvZiBmb2xsb3dpbmcgTG9zdCBQYWNrZXRzCisKKyAgICAgICAgICAgICAgICBzaXplIC09IEZDSVNpemU7CisgICAgICAgICAgICAgICAgcHRyICs9IEZDSVNpemU7CisKKyAgICAgICAgICAgICAgICBBU3RyaW5nIGxpc3Rfb2ZfbG9zdHM7CisgICAgICAgICAgICAgICAgbGlzdF9vZl9sb3N0cy5hcHBlbmQoUElEKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTAgOyBpPDE2IDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbG9zdCA9IEJMUCAmICgweDEgPDwgaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc19sb3N0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X29mX2xvc3RzLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rfb2ZfbG9zdHMuYXBwZW5kKFBJRCArIGkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dJKCJPcHBvbmVudCBsb3N0cyBwYWNrZXQgb2YgUlRQICVzIiwgbGlzdF9vZl9sb3N0cy5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgMzogICAgIC8vIFRNTUJSCisgICAgICAgIGNhc2UgNDogICAgIC8vIFRNTUJOCisgICAgICAgIHsKKyAgICAgICAgICAgIEZDSVNpemUgPSA4OworICAgICAgICAgICAgd2hpbGUgKHNpemUgPj0gRkNJU2l6ZSkgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IE14VEJSID0gdTMyYXQoJnB0cls0XSk7CisgICAgICAgICAgICAgICAgdWludDMyX3QgTXhUQlJFeHAgPSBNeFRCUiA+PiAyNjsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBNeFRCUk1hbnRpc3NhID0gKE14VEJSID4+IDkpICYgMHgwMUZGRkY7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgb3ZlcmhlYWQgPSBNeFRCUiAmIDB4MDFGRjsKKworICAgICAgICAgICAgICAgIHNpemUgLT0gRkNJU2l6ZTsKKyAgICAgICAgICAgICAgICBwdHIgKz0gRkNJU2l6ZTsKKworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJpdFJhdGUgPSAoMSA8PCBNeFRCUkV4cCkgKiBNeFRCUk1hbnRpc3NhOworCisgICAgICAgICAgICAgICAgaWYgKG1zZ1R5cGUgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIk9wIC0+IFVFIFJlcSBUeCBiaXRyYXRlIDogJWQgWCAyXiVkID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgTXhUQlJNYW50aXNzYSwgTXhUQlJFeHAsIGJpdFJhdGUpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1zZ1R5cGUgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIk9QIC0+IFVFIE5vdGkgUnggYml0cmF0ZSA6ICVkIFggMl4lZCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE14VEJSTWFudGlzc2EsIE14VEJSRXhwLCBiaXRSYXRlKTsKKworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBzLT5tTm90aWZ5TXNnLT5kdXAoKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJydGNwLWV2ZW50IiwgMSk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicGF5bG9hZC10eXBlIiwgMjA1KTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJmZWVkYmFjay10eXBlIiwgbXNnVHlwZSk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2VuZGVyIiwgaWQpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImJpdC1yYXRlIiwgYml0UmF0ZSk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICAgICAgQUxPR0koIm92ZXJoZWFkIDogJWQiLCBvdmVyaGVhZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HSSgiTm90IHN1cHBvcnRlZCBUU0ZCIHR5cGUgJWQiLCBtc2dUeXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXR1c190IEFSVFBDb25uZWN0aW9uOjpwYXJzZVBTRkIoCisgICAgICAgIFN0cmVhbUluZm8gKnMsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKHNpemUgPCAxMikgeworICAgICAgICAvLyBicm9rZW4gcGFja2V0CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB1aW50OF90IG1zZ1R5cGUgPSBkYXRhWzBdICYgMHgxZjsKKyAgICB1aW50MzJfdCBpZCA9IHUzMmF0KCZkYXRhWzRdKTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9ICZkYXRhWzEyXTsKKyAgICBzaXplIC09IDEyOworCisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICBzd2l0Y2gobXNnVHlwZSkgeworICAgICAgICBjYXNlIDE6ICAgICAvLyBQaWN0dXJlIExvc3MgSW5kaWNhdGlvbiAoUExJKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBQTEkgZG9lcyBub3QgbmVlZCBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IHMtPm1Ob3RpZnlNc2ctPmR1cCgpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicnRjcC1ldmVudCIsIDEpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicGF5bG9hZC10eXBlIiwgMjA2KTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImZlZWRiYWNrLXR5cGUiLCBtc2dUeXBlKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNlbmRlciIsIGlkKTsKKyAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgQUxPR0koIlBMSSBkZXRlY3RlZC4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgNDogICAgIC8vIEZ1bGwgSW50cmEgUmVxdWVzdCAoRklSKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQzMl90IHJlcXVlc3RlZElkID0gdTMyYXQoJnB0clswXSk7CisgICAgICAgICAgICBpZiAocmVxdWVzdGVkSWQgPT0gKHVpbnQzMl90KW1TZWxmSUQpIHsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gcy0+bU5vdGlmeU1zZy0+ZHVwKCk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicnRjcC1ldmVudCIsIDEpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInBheWxvYWQtdHlwZSIsIDIwNik7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZmVlZGJhY2stdHlwZSIsIG1zZ1R5cGUpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNlbmRlciIsIGlkKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICBBTE9HSSgiRklSIGRldGVjdGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR0koIk5vdCBzdXBwb3J0ZWQgUFNGQiB0eXBlICVkIiwgbXNnVHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQogc3A8QVJUUFNvdXJjZT4gQVJUUENvbm5lY3Rpb246OmZpbmRTb3VyY2UoU3RyZWFtSW5mbyAqaW5mbywgdWludDMyX3Qgc3JjSWQpIHsKICAgICBzcDxBUlRQU291cmNlPiBzb3VyY2U7CiAgICAgc3NpemVfdCBpbmRleCA9IGluZm8tPm1Tb3VyY2VzLmluZGV4T2ZLZXkoc3JjSWQpOwpAQCAtNjMwLDYgKzEwNjEsMTIgQEAKICAgICAgICAgc291cmNlID0gbmV3IEFSVFBTb3VyY2UoCiAgICAgICAgICAgICAgICAgc3JjSWQsIGluZm8tPm1TZXNzaW9uRGVzYywgaW5mby0+bUluZGV4LCBpbmZvLT5tTm90aWZ5TXNnKTsKIAorICAgICAgICBpZiAobUZsYWdzICYga1ZpTFRFQ29ubmVjdGlvbikgeworICAgICAgICAgICAgc291cmNlLT5zZXRQZXJpb2RpY0ZJUihmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBzb3VyY2UtPnNldFNlbGZJRChtU2VsZklEKTsKKyAgICAgICAgc291cmNlLT5zZXRKYlRpbWUobUpiVGltZU1zID4gMCA/IG1KYlRpbWVNcyA6IDMwMCk7CiAgICAgICAgIGluZm8tPm1Tb3VyY2VzLmFkZChzcmNJZCwgc291cmNlKTsKICAgICB9IGVsc2UgewogICAgICAgICBzb3VyY2UgPSBpbmZvLT5tU291cmNlcy52YWx1ZUF0KGluZGV4KTsKQEAgLTY0NSw2ICsxMDgyLDc4IEBACiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKK3ZvaWQgQVJUUENvbm5lY3Rpb246OnNldFNlbGZJRChjb25zdCB1aW50MzJfdCBzZWxmSUQpIHsKKyAgICBtU2VsZklEID0gc2VsZklEOworfQorCit2b2lkIEFSVFBDb25uZWN0aW9uOjpzZXRKYlRpbWUoY29uc3QgdWludDMyX3QgamJUaW1lTXMpIHsKKyAgICBtSmJUaW1lTXMgPSBqYlRpbWVNczsKK30KKwordm9pZCBBUlRQQ29ubmVjdGlvbjo6c2V0VGFyZ2V0Qml0cmF0ZShpbnQzMl90IHRhcmdldEJpdHJhdGUpIHsKKyAgICBtVGFyZ2V0Qml0cmF0ZSA9IHRhcmdldEJpdHJhdGU7Cit9CisKK3ZvaWQgQVJUUENvbm5lY3Rpb246OmNoZWNrUnhCaXRyYXRlKGludDY0X3Qgbm93VXMpIHsKKyAgICBpZiAobUxhc3RCaXRyYXRlUmVwb3J0VGltZVVzIDw9IDApIHsKKyAgICAgICAgbUN1bXVsYXRpdmVCeXRlcyA9IDA7CisgICAgICAgIG1MYXN0Qml0cmF0ZVJlcG9ydFRpbWVVcyA9IG5vd1VzOworICAgIH0KKyAgICBlbHNlIGlmIChtTGFzdEVhcmx5Tm90aWZ5VGltZVVzICsgMTAwMDAwbGwgPD0gbm93VXMpIHsKKyAgICAgICAgaW50MzJfdCB0aW1lRGlmZiA9IChub3dVcyAtIG1MYXN0Qml0cmF0ZVJlcG9ydFRpbWVVcykgLyAxMDAwMDAwbGw7CisgICAgICAgIGludDMyX3QgYml0cmF0ZSA9IG1DdW11bGF0aXZlQnl0ZXMgKiA4IC8gdGltZURpZmY7CisgICAgICAgIG1MYXN0RWFybHlOb3RpZnlUaW1lVXMgPSBub3dVczsKKworICAgICAgICBMaXN0PFN0cmVhbUluZm8+OjppdGVyYXRvciBpdCA9IG1TdHJlYW1zLmJlZ2luKCk7CisgICAgICAgIHdoaWxlIChpdCAhPSBtU3RyZWFtcy5lbmQoKSkgeworICAgICAgICAgICAgU3RyZWFtSW5mbyAqcyA9ICYqaXQ7CisgICAgICAgICAgICBpZiAocy0+bUlzSW5qZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzLT5tU291cmNlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIHNwPEFSVFBTb3VyY2U+IHNvdXJjZSA9IHMtPm1Tb3VyY2VzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS0+aXNOZWVkVG9FYXJseU5vdGlmeSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+bm90aWZ5UGt0SW5mbyhiaXRyYXRlLCBmYWxzZSAvKiBpc1JlZ3VsYXIgKi8pOworICAgICAgICAgICAgICAgICAgICBtTGFzdEVhcmx5Tm90aWZ5VGltZVVzID0gbm93VXMgKyAoMTAwMDAwMGxsICogMzYwMCAqIDI0KTsgLy8gYWZ0ZXIgMSBkYXkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKG1MYXN0Qml0cmF0ZVJlcG9ydFRpbWVVcyArIDEwMDAwMDBsbCA8PSBub3dVcykgeworICAgICAgICBpbnQzMl90IHRpbWVEaWZmID0gKG5vd1VzIC0gbUxhc3RCaXRyYXRlUmVwb3J0VGltZVVzKSAvIDEwMDAwMDBsbDsKKyAgICAgICAgaW50MzJfdCBiaXRyYXRlID0gbUN1bXVsYXRpdmVCeXRlcyAqIDggLyB0aW1lRGlmZjsKKyAgICAgICAgQUxPR0koIkFjdHVhbCBSeCBiaXRyYXRlIDogJWQgYml0cy9zZWMiLCBiaXRyYXRlKTsKKworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihrTWF4VURQU2l6ZSk7CisgICAgICAgIExpc3Q8U3RyZWFtSW5mbz46Oml0ZXJhdG9yIGl0ID0gbVN0cmVhbXMuYmVnaW4oKTsKKyAgICAgICAgd2hpbGUgKGl0ICE9IG1TdHJlYW1zLmVuZCgpKSB7CisgICAgICAgICAgICBTdHJlYW1JbmZvICpzID0gJippdDsKKyAgICAgICAgICAgIGlmIChzLT5tSXNJbmplY3RlZCkgeworICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzLT5tTnVtUlRDUFBhY2tldHNSZWNlaXZlZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBuZXZlciByZWNlaXZlZCBhbnkgUlRDUCBwYWNrZXRzIG9uIHRoaXMgc3RyZWFtLAorICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGV2ZW4ga25vdyB3aGVyZSB0byBzZW5kIGEgcmVwb3J0LgorICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHMtPm1Tb3VyY2VzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgc3A8QVJUUFNvdXJjZT4gc291cmNlID0gcy0+bVNvdXJjZXMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICBzb3VyY2UtPm5vdGlmeVBrdEluZm8oYml0cmF0ZSwgdHJ1ZSAvKiBpc1JlZ3VsYXIgKi8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgICAgICBtQ3VtdWxhdGl2ZUJ5dGVzID0gMDsKKyAgICAgICAgbUxhc3RCaXRyYXRlUmVwb3J0VGltZVVzID0gbm93VXM7CisgICAgICAgIG1MYXN0RWFybHlOb3RpZnlUaW1lVXMgPSBub3dVczsKKyAgICB9Cit9CiB2b2lkIEFSVFBDb25uZWN0aW9uOjpvbkluamVjdFBhY2tldChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIGludDMyX3QgaW5kZXg7CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImluZGV4IiwgJmluZGV4KSk7CkBAIC02NzIsNCArMTE4MSwzIEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uaAppbmRleCBkNWY3YzJlLi5hMzdhYzBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5oCkBAIC0zMCw2ICszMCw3IEBACiBzdHJ1Y3QgQVJUUENvbm5lY3Rpb24gOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIGVudW0gRmxhZ3MgewogICAgICAgICBrUmVndWxhcmx5UmVxdWVzdEZJUiA9IDIsCisgICAgICAgIGtWaUxURUNvbm5lY3Rpb24gPSA0LAogICAgIH07CiAKICAgICBleHBsaWNpdCBBUlRQQ29ubmVjdGlvbih1aW50MzJfdCBmbGFncyA9IDApOwpAQCAtNDQsMTEgKzQ1LDIyIEBACiAKICAgICB2b2lkIGluamVjdFBhY2tldChpbnQgaW5kZXgsIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogCisgICAgdm9pZCBzZXRTZWxmSUQoY29uc3QgdWludDMyX3Qgc2VsZklEKTsKKyAgICB2b2lkIHNldEpiVGltZShjb25zdCB1aW50MzJfdCBqYlRpbWVNcyk7CisgICAgdm9pZCBzZXRUYXJnZXRCaXRyYXRlKGludDMyX3QgdGFyZ2V0Qml0cmF0ZSk7CisKICAgICAvLyBDcmVhdGVzIGEgcGFpciBvZiBVRFAgZGF0YWdyYW0gc29ja2V0cyBib3VuZCB0byBhZGphY2VudCBwb3J0cwogICAgIC8vICh0aGUgcnRwU29ja2V0IGlzIGJvdW5kIHRvIGFuIGV2ZW4gcG9ydCwgdGhlIHJ0Y3BTb2NrZXQgdG8gdGhlCiAgICAgLy8gbmV4dCBoaWdoZXIgcG9ydCkuCiAgICAgc3RhdGljIHZvaWQgTWFrZVBvcnRQYWlyKAogICAgICAgICAgICAgaW50ICpydHBTb2NrZXQsIGludCAqcnRjcFNvY2tldCwgdW5zaWduZWQgKnJ0cFBvcnQpOworICAgIC8vIENyZWF0ZXMgYSBwYWlyIG9mIFVEUCBkYXRhZ3JhbSBzb2NrZXRzIGJvdW5kIHRvIGFzc2lnbmVkIGlwIGFuZAorICAgIC8vIHBvcnRzICh0aGUgcnRwU29ja2V0IGlzIGJvdW5kIHRvIGFuIGV2ZW4gcG9ydCwgdGhlIHJ0Y3BTb2NrZXQKKyAgICAvLyB0byB0aGUgbmV4dCBoaWdoZXIgcG9ydCkuCisgICAgc3RhdGljIHZvaWQgTWFrZVJUUFNvY2tldFBhaXIoCisgICAgICAgICAgICBpbnQgKnJ0cFNvY2tldCwgaW50ICpydGNwU29ja2V0LAorICAgICAgICAgICAgY29uc3QgY2hhciAqbG9jYWxJcCwgY29uc3QgY2hhciAqcmVtb3RlSXAsCisgICAgICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsIHVuc2lnbmVkIHJlbW90ZVBvcnQsIGludDY0X3Qgc29ja2V0TmV0d29yayA9IDApOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QVJUUENvbm5lY3Rpb24oKTsKQEAgLTcxLDE4ICs4MywzMiBAQAogCiAgICAgYm9vbCBtUG9sbEV2ZW50UGVuZGluZzsKICAgICBpbnQ2NF90IG1MYXN0UmVjZWl2ZXJSZXBvcnRUaW1lVXM7CisgICAgaW50NjRfdCBtTGFzdEJpdHJhdGVSZXBvcnRUaW1lVXM7CisgICAgaW50NjRfdCBtTGFzdEVhcmx5Tm90aWZ5VGltZVVzOworCisgICAgaW50MzJfdCBtU2VsZklEOworICAgIGludDMyX3QgbVRhcmdldEJpdHJhdGU7CisKKyAgICB1aW50MzJfdCBtSmJUaW1lTXM7CisKKyAgICBpbnQzMl90IG1DdW11bGF0aXZlQnl0ZXM7CiAKICAgICB2b2lkIG9uQWRkU3RyZWFtKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uUmVtb3ZlU3RyZWFtKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uUG9sbFN0cmVhbXMoKTsKICAgICB2b2lkIG9uSW5qZWN0UGFja2V0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uU2VuZFJlY2VpdmVyUmVwb3J0cygpOworICAgIHZvaWQgY2hlY2tSeEJpdHJhdGUoaW50NjRfdCBub3dVcyk7CiAKICAgICBzdGF0dXNfdCByZWNlaXZlKFN0cmVhbUluZm8gKmluZm8sIGJvb2wgcmVjZWl2ZVJUUCk7CisgICAgc3NpemVfdCBzZW5kKGNvbnN0IFN0cmVhbUluZm8gKmluZm8sIGNvbnN0IHNwPEFCdWZmZXI+IGJ1ZmZlcik7CiAKICAgICBzdGF0dXNfdCBwYXJzZVJUUChTdHJlYW1JbmZvICppbmZvLCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKyAgICBzdGF0dXNfdCBwYXJzZVJUUEV4dChTdHJlYW1JbmZvICpzLCBjb25zdCB1aW50OF90ICpleHREYXRhLCBzaXplX3QgZXh0TGVuLCBpbnQzMl90ICpjdm9EZWdyZWVzKTsKICAgICBzdGF0dXNfdCBwYXJzZVJUQ1AoU3RyZWFtSW5mbyAqaW5mbywgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAgICAgc3RhdHVzX3QgcGFyc2VTUihTdHJlYW1JbmZvICppbmZvLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VUU0ZCKFN0cmVhbUluZm8gKmluZm8sIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0dXNfdCBwYXJzZVBTRkIoU3RyZWFtSW5mbyAqaW5mbywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwogICAgIHN0YXR1c190IHBhcnNlQllFKFN0cmVhbUluZm8gKmluZm8sIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKIAogICAgIHNwPEFSVFBTb3VyY2U+IGZpbmRTb3VyY2UoU3RyZWFtSW5mbyAqaW5mbywgdWludDMyX3QgaWQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5jcHAKaW5kZXggZjVmODEyOC4uM2ZkZjhlNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlICJBQU1SQXNzZW1ibGVyLmgiCiAjaW5jbHVkZSAiQUFWQ0Fzc2VtYmxlci5oIgorI2luY2x1ZGUgIkFIRVZDQXNzZW1ibGVyLmgiCiAjaW5jbHVkZSAiQUgyNjNBc3NlbWJsZXIuaCIKICNpbmNsdWRlICJBTVBFRzJUU0Fzc2VtYmxlci5oIgogI2luY2x1ZGUgIkFNUEVHNEF1ZGlvQXNzZW1ibGVyLmgiCkBAIC0zMywyMyArMzQsMzUgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KIAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0aWMgY29uc3QgdWludDMyX3Qga1NvdXJjZUlEID0gMHhkZWFkYmVlZjsKK3N0YXRpYyB1aW50MzJfdCBrU291cmNlSUQgPSAweGRlYWRiZWVmOwogCiBBUlRQU291cmNlOjpBUlRQU291cmNlKAogICAgICAgICB1aW50MzJfdCBpZCwKICAgICAgICAgY29uc3Qgc3A8QVNlc3Npb25EZXNjcmlwdGlvbj4gJnNlc3Npb25EZXNjLCBzaXplX3QgaW5kZXgsCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KQotICAgIDogbUlEKGlkKSwKKyAgICA6IG1GaXJzdFNlcU51bWJlcigwKSwKKyAgICAgIG1GaXJzdFJ0cFRpbWUoMCksCisgICAgICBtRmlyc3RTeXNUaW1lKDApLAorICAgICAgbUNsb2NrUmF0ZSgwKSwKKyAgICAgIG1KYlRpbWVNcygzMDApLCAvLyBkZWZhdWx0IGppdHRlciBidWZmZXIgdGltZSBpcyAzMDBtcy4KKyAgICAgIG1GaXJzdFNzcmMoMCksCisgICAgICBtSGlnaGVzdE5hY2tOdW1iZXIoMCksCisgICAgICBtSUQoaWQpLAogICAgICAgbUhpZ2hlc3RTZXFOdW1iZXIoMCksCiAgICAgICBtUHJldkV4cGVjdGVkKDApLAogICAgICAgbUJhc2VTZXFOdW1iZXIoMCksCiAgICAgICBtTnVtQnVmZmVyc1JlY2VpdmVkKDApLAogICAgICAgbVByZXZOdW1CdWZmZXJzUmVjZWl2ZWQoMCksCisgICAgICBtUHJldkV4cGVjdGVkRm9yUlIoMCksCisgICAgICBtUHJldk51bUJ1ZmZlcnNSZWNlaXZlZEZvclJSKDApLAogICAgICAgbUxhc3ROVFBUaW1lKDApLAogICAgICAgbUxhc3ROVFBUaW1lVXBkYXRlVXMoMCksCiAgICAgICBtSXNzdWVGSVJSZXF1ZXN0cyhmYWxzZSksCisgICAgICBtSXNzdWVGSVJCeUFzc2VtYmxlcihmYWxzZSksCiAgICAgICBtTGFzdEZJUlJlcXVlc3RVcygtMSksCiAgICAgICBtTmV4dEZJUlNlcU5vKChyYW5kKCkgKiAyNTYuMCkgLyBSQU5EX01BWCksCiAgICAgICBtTm90aWZ5KG5vdGlmeSkgewpAQCAtNjEsNiArNzQsOSBAQAogICAgIGlmICghc3RybmNtcChkZXNjLmNfc3RyKCksICJIMjY0LyIsIDUpKSB7CiAgICAgICAgIG1Bc3NlbWJsZXIgPSBuZXcgQUFWQ0Fzc2VtYmxlcihub3RpZnkpOwogICAgICAgICBtSXNzdWVGSVJSZXF1ZXN0cyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChkZXNjLmNfc3RyKCksICJIMjY1LyIsIDUpKSB7CisgICAgICAgIG1Bc3NlbWJsZXIgPSBuZXcgQUhFVkNBc3NlbWJsZXIobm90aWZ5KTsKKyAgICAgICAgbUlzc3VlRklSUmVxdWVzdHMgPSB0cnVlOwogICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoZGVzYy5jX3N0cigpLCAiTVA0QS1MQVRNLyIsIDEwKSkgewogICAgICAgICBtQXNzZW1ibGVyID0gbmV3IEFNUEVHNEF1ZGlvQXNzZW1ibGVyKG5vdGlmeSwgcGFyYW1zKTsKICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGRlc2MuY19zdHIoKSwgIkgyNjMtMTk5OC8iLCAxMCkKQEAgLTExMiwxMyArMTI4LDI5IEBACiBib29sIEFSVFBTb3VyY2U6OnF1ZXVlUGFja2V0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKICAgICB1aW50MzJfdCBzZXFOdW0gPSAodWludDMyX3QpYnVmZmVyLT5pbnQzMkRhdGEoKTsKIAotICAgIGlmIChtTnVtQnVmZmVyc1JlY2VpdmVkKysgPT0gMCkgeworICAgIGludDMyX3Qgc3NyYyA9IDA7CisgICAgYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigic3NyYyIsICZzc3JjKTsKKworICAgIGlmIChtTnVtQnVmZmVyc1JlY2VpdmVkKysgPT0gMCAmJiBtRmlyc3RTeXNUaW1lID09IDApIHsKKyAgICAgICAgdWludDMyX3QgZmlyc3RSdHBUaW1lOworICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJmZpcnN0UnRwVGltZSkpOworICAgICAgICBtRmlyc3RTeXNUaW1lID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKICAgICAgICAgbUhpZ2hlc3RTZXFOdW1iZXIgPSBzZXFOdW07CiAgICAgICAgIG1CYXNlU2VxTnVtYmVyID0gc2VxTnVtOworICAgICAgICBtRmlyc3RSdHBUaW1lID0gZmlyc3RSdHBUaW1lOworICAgICAgICBtRmlyc3RTc3JjID0gc3NyYzsKKyAgICAgICAgQUxPR0QoImZpcnN0LXJ0cCBhcnJpdmVkOiBmaXJzdC1ydHAtdGltZT0lZCwgc3lzLXRpbWU9JWxsZCwgc2VxLW51bT0ldSwgc3NyYz0lZCIsCisgICAgICAgICAgICAgICAgbUZpcnN0UnRwVGltZSwgKGxvbmcgbG9uZyltRmlyc3RTeXNUaW1lLCBtSGlnaGVzdFNlcU51bWJlciwgbUZpcnN0U3NyYyk7CisgICAgICAgIG1DbG9ja1JhdGUgPSA5MDAwMDsKICAgICAgICAgbVF1ZXVlLnB1c2hfYmFjayhidWZmZXIpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKKyAgICBpZiAobUZpcnN0U3NyYyAhPSBzc3JjKSB7CisgICAgICAgIEFMT0dXKCJEaXNjYXJkaW5nIGEgYnVmZmVyIGR1ZSB0byB1bmV4cGVjdGVkIHNzcmMiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIC8vIE9ubHkgdGhlIGxvd2VyIDE2LWJpdCBvZiB0aGUgc2VxdWVuY2UgbnVtYmVycyBhcmUgdHJhbnNtaXR0ZWQsCiAgICAgLy8gZGVyaXZlIHRoZSBoaWdoLW9yZGVyIGJpdHMgYnkgY2hvb3NpbmcgdGhlIGNhbmRpZGF0ZSBjbG9zZXN0CiAgICAgLy8gdG8gdGhlIGhpZ2hlc3Qgc2VxdWVuY2UgbnVtYmVyIChleHRlbmRlZCB0byAzMiBiaXRzKSByZWNlaXZlZCBzbyBmYXIuCkBAIC0xODEsMjAgKzIxMywzNCBAQAogfQogCiB2b2lkIEFSVFBTb3VyY2U6OmFkZEZJUihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7Ci0gICAgaWYgKCFtSXNzdWVGSVJSZXF1ZXN0cykgeworICAgIGlmICghbUlzc3VlRklSUmVxdWVzdHMgJiYgIW1Jc3N1ZUZJUkJ5QXNzZW1ibGVyKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBib29sIHNlbmQgPSBmYWxzZTsKICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICBpZiAobUxhc3RGSVJSZXF1ZXN0VXMgPj0gMCAmJiBtTGFzdEZJUlJlcXVlc3RVcyArIDUwMDAwMDBMTCA+IG5vd1VzKSB7Ci0gICAgICAgIC8vIFNlbmQgRklSIHJlcXVlc3RzIGF0IG1vc3QgZXZlcnkgNSBzZWNzLgorICAgIGludDY0X3QgdXNlY3NTaW5jZUxhc3RGSVIgPSBub3dVcyAtIG1MYXN0RklSUmVxdWVzdFVzOworICAgIGlmIChtTGFzdEZJUlJlcXVlc3RVcyA8IDApIHsKKyAgICAgICAgLy8gQSBmaXJzdCBGSVIsIGp1c3Qgc2VuZCBpdC4KKyAgICAgICAgc2VuZCA9IHRydWU7CisgICAgfSAgZWxzZSBpZiAobUlzc3VlRklSQnlBc3NlbWJsZXIgJiYgKHVzZWNzU2luY2VMYXN0RklSID4gMTAwMDAwMCkpIHsKKyAgICAgICAgLy8gQSBGSVIgaXNzdWVkIGJ5IEFzc2VtYmxlci4KKyAgICAgICAgLy8gU2VuZCBpdCBpZiBsYXN0IEZJUiBpcyBub3Qgc2VudCB3aXRoaW4gYSBzZWMuCisgICAgICAgIHNlbmQgPSB0cnVlOworICAgIH0gZWxzZSBpZiAobUlzc3VlRklSUmVxdWVzdHMgJiYgKHVzZWNzU2luY2VMYXN0RklSID4gNTAwMDAwMCkpIHsKKyAgICAgICAgLy8gQSBGSVIgaXNzdWVkIHBlcmlvZGljYWxseSByZWdhcmRsZXNzIHBhY2tldCBsb3NzLgorICAgICAgICAvLyBTZW5kIGl0IGlmIGxhc3QgRklSIGlzIG5vdCBzZW50IHdpdGhpbiA1IHNlY3MuCisgICAgICAgIHNlbmQgPSB0cnVlOworICAgIH0KKworICAgIGlmICghc2VuZCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgbUxhc3RGSVJSZXF1ZXN0VXMgPSBub3dVczsKIAogICAgIGlmIChidWZmZXItPnNpemUoKSArIDIwID4gYnVmZmVyLT5jYXBhY2l0eSgpKSB7Ci0gICAgICAgIEFMT0dXKCJSVENQIGJ1ZmZlciB0b28gc21hbGwgdG8gYWNjb21vZGF0ZSBGSVIuIik7CisgICAgICAgIEFMT0dXKCJSVENQIGJ1ZmZlciB0b28gc21hbGwgdG8gYWNjb21tb2RhdGUgRklSLiIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0yMDMsNyArMjQ5LDcgQEAKICAgICBkYXRhWzBdID0gMHg4MCB8IDQ7CiAgICAgZGF0YVsxXSA9IDIwNjsgIC8vIFBTRkIKICAgICBkYXRhWzJdID0gMDsKLSAgICBkYXRhWzNdID0gNDsKKyAgICBkYXRhWzNdID0gNDsgICAgLy8gdG90YWwgKDQrMSkgKiBzaXplb2YoaW50MzJfdCkgPSAyMCBieXRlcwogICAgIGRhdGFbNF0gPSBrU291cmNlSUQgPj4gMjQ7CiAgICAgZGF0YVs1XSA9IChrU291cmNlSUQgPj4gMTYpICYgMHhmZjsKICAgICBkYXRhWzZdID0gKGtTb3VyY2VJRCA+PiA4KSAmIDB4ZmY7CkBAIC0yMjUsMTQgKzI3MSwxNiBAQAogICAgIGRhdGFbMThdID0gMHgwMDsKICAgICBkYXRhWzE5XSA9IDB4MDA7CiAKLSAgICBidWZmZXItPnNldFJhbmdlKGJ1ZmZlci0+b2Zmc2V0KCksIGJ1ZmZlci0+c2l6ZSgpICsgMjApOworICAgIGJ1ZmZlci0+c2V0UmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSwgYnVmZmVyLT5zaXplKCkgKyAoZGF0YVszXSArIDEpICogc2l6ZW9mKGludDMyX3QpKTsKKworICAgIG1Jc3N1ZUZJUkJ5QXNzZW1ibGVyID0gZmFsc2U7CiAKICAgICBBTE9HVigiQWRkZWQgRklSIHJlcXVlc3QuIik7CiB9CiAKIHZvaWQgQVJUUFNvdXJjZTo6YWRkUmVjZWl2ZXJSZXBvcnQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewogICAgIGlmIChidWZmZXItPnNpemUoKSArIDMyID4gYnVmZmVyLT5jYXBhY2l0eSgpKSB7Ci0gICAgICAgIEFMT0dXKCJSVENQIGJ1ZmZlciB0b28gc21hbGwgdG8gYWNjb21vZGF0ZSBSUi4iKTsKKyAgICAgICAgQUxPR1coIlJUQ1AgYnVmZmVyIHRvbyBzbWFsbCB0byBhY2NvbW1vZGF0ZSBSUi4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMjQwLDE2ICsyODgsMTYgQEAKIAogICAgIC8vIEFjY29yZGluZyB0byBhcHBlbmRpeCBBLjMgaW4gUkZDIDM1NTAKICAgICB1aW50MzJfdCBleHBlY3RlZCA9IG1IaWdoZXN0U2VxTnVtYmVyIC0gbUJhc2VTZXFOdW1iZXIgKyAxOwotICAgIGludDY0X3QgaW50ZXJ2YWxFeHBlY3RlZCA9IGV4cGVjdGVkIC0gbVByZXZFeHBlY3RlZDsKLSAgICBpbnQ2NF90IGludGVydmFsUmVjZWl2ZWQgPSBtTnVtQnVmZmVyc1JlY2VpdmVkIC0gbVByZXZOdW1CdWZmZXJzUmVjZWl2ZWQ7CisgICAgaW50NjRfdCBpbnRlcnZhbEV4cGVjdGVkID0gZXhwZWN0ZWQgLSBtUHJldkV4cGVjdGVkRm9yUlI7CisgICAgaW50NjRfdCBpbnRlcnZhbFJlY2VpdmVkID0gbU51bUJ1ZmZlcnNSZWNlaXZlZCAtIG1QcmV2TnVtQnVmZmVyc1JlY2VpdmVkRm9yUlI7CiAgICAgaW50NjRfdCBpbnRlcnZhbFBhY2tldExvc3QgPSBpbnRlcnZhbEV4cGVjdGVkIC0gaW50ZXJ2YWxSZWNlaXZlZDsKIAogICAgIGlmIChpbnRlcnZhbEV4cGVjdGVkID4gMCAmJiBpbnRlcnZhbFBhY2tldExvc3QgPiAwKSB7CiAgICAgICAgIGZyYWN0aW9uID0gKGludGVydmFsUGFja2V0TG9zdCA8PCA4KSAvIGludGVydmFsRXhwZWN0ZWQ7CiAgICAgfQogCi0gICAgbVByZXZFeHBlY3RlZCA9IGV4cGVjdGVkOwotICAgIG1QcmV2TnVtQnVmZmVyc1JlY2VpdmVkID0gbU51bUJ1ZmZlcnNSZWNlaXZlZDsKKyAgICBtUHJldkV4cGVjdGVkRm9yUlIgPSBleHBlY3RlZDsKKyAgICBtUHJldk51bUJ1ZmZlcnNSZWNlaXZlZEZvclJSID0gbU51bUJ1ZmZlcnNSZWNlaXZlZDsKICAgICBpbnQzMl90IGN1bXVsYXRpdmVQYWNrZXRMb3N0ID0gKGludDMyX3QpZXhwZWN0ZWQgLSBtTnVtQnVmZmVyc1JlY2VpdmVkOwogCiAgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5zaXplKCk7CkBAIC0yNTcsNyArMzA1LDcgQEAKICAgICBkYXRhWzBdID0gMHg4MCB8IDE7CiAgICAgZGF0YVsxXSA9IDIwMTsgIC8vIFJSCiAgICAgZGF0YVsyXSA9IDA7Ci0gICAgZGF0YVszXSA9IDc7CisgICAgZGF0YVszXSA9IDc7ICAgIC8vIHRvdGFsICg3KzEpICogc2l6ZW9mKGludDMyX3QpID0gMzIgYnl0ZXMKICAgICBkYXRhWzRdID0ga1NvdXJjZUlEID4+IDI0OwogICAgIGRhdGFbNV0gPSAoa1NvdXJjZUlEID4+IDE2KSAmIDB4ZmY7CiAgICAgZGF0YVs2XSA9IChrU291cmNlSUQgPj4gOCkgJiAweGZmOwpAQCAtMzAzLDkgKzM1MSwyMTAgQEAKICAgICBkYXRhWzMwXSA9IChETFNSID4+IDgpICYgMHhmZjsKICAgICBkYXRhWzMxXSA9IERMU1IgJiAweGZmOwogCi0gICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpLCBidWZmZXItPnNpemUoKSArIDMyKTsKKyAgICBidWZmZXItPnNldFJhbmdlKGJ1ZmZlci0+b2Zmc2V0KCksIGJ1ZmZlci0+c2l6ZSgpICsgKGRhdGFbM10gKyAxKSAqIHNpemVvZihpbnQzMl90KSk7CiB9CiAKK3ZvaWQgQVJUUFNvdXJjZTo6YWRkVE1NQlIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgaW50MzJfdCB0YXJnZXRCaXRyYXRlKSB7CisgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpICsgMjAgPiBidWZmZXItPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgQUxPR1coIlJUQ1AgYnVmZmVyIHRvbyBzbWFsbCB0byBhY2NvbW1vZGF0ZSBSUi4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0YXJnZXRCaXRyYXRlIDw9IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+c2l6ZSgpOworCisgICAgZGF0YVswXSA9IDB4ODAgfCAzOyAvLyBUTU1CUgorICAgIGRhdGFbMV0gPSAyMDU7ICAgICAgLy8gVFNGQgorICAgIGRhdGFbMl0gPSAwOworICAgIGRhdGFbM10gPSA0OyAgICAgICAgLy8gdG90YWwgKDQrMSkgKiBzaXplb2YoaW50MzJfdCkgPSAyMCBieXRlcworICAgIGRhdGFbNF0gPSBrU291cmNlSUQgPj4gMjQ7CisgICAgZGF0YVs1XSA9IChrU291cmNlSUQgPj4gMTYpICYgMHhmZjsKKyAgICBkYXRhWzZdID0gKGtTb3VyY2VJRCA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVs3XSA9IGtTb3VyY2VJRCAmIDB4ZmY7CisKKyAgICAqKGludDMyX3QqKSgmZGF0YVs4XSkgPSAwOyAgLy8gNCBieXRlcyBibGFuaworCisgICAgZGF0YVsxMl0gPSBtSUQgPj4gMjQ7CisgICAgZGF0YVsxM10gPSAobUlEID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVsxNF0gPSAobUlEID4+IDgpICYgMHhmZjsKKyAgICBkYXRhWzE1XSA9IG1JRCAmIDB4ZmY7CisKKyAgICAvLyBGaW5kIHRoZSBmaXJzdCBiaXQgJzEnIGZyb20gbGVmdCAmIHJpZ2h0IHNpZGUgb2YgdGhlIHZhbHVlLgorICAgIGludDMyX3QgbGVmdEVuZCA9IDMxIC0gX19idWlsdGluX2Nseih0YXJnZXRCaXRyYXRlKTsKKyAgICBpbnQzMl90IHJpZ2h0RW5kID0gZmZzKHRhcmdldEJpdHJhdGUpIC0gMTsKKworICAgIC8vIE1hbnRpc3NhIGhhdmUgb25seSAxN2JpdCBzcGFjZSBieSBSVENQIHNwZWNpZmljYXRpb24uCisgICAgaWYgKChsZWZ0RW5kIC0gcmlnaHRFbmQpID4gMTYpIHsKKyAgICAgICAgcmlnaHRFbmQgPSBsZWZ0RW5kIC0gMTY7CisgICAgfQorICAgIGludDMyX3QgbWFudGlzc2EgPSB0YXJnZXRCaXRyYXRlID4+IHJpZ2h0RW5kOworCisgICAgZGF0YVsxNl0gPSAoKHJpZ2h0RW5kIDw8IDIpICYgMHhmYykgfCAoKG1hbnRpc3NhICYgMHgxODAwMCkgPj4gMTUpOworICAgIGRhdGFbMTddID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYW50aXNzYSAmIDB4MDdmODApID4+IDc7CisgICAgZGF0YVsxOF0gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hbnRpc3NhICYgMHgwMDA3ZikgPDwgMTsKKyAgICBkYXRhWzE5XSA9IDQwOyAgICAgICAgICAgICAgLy8gNDAgYnl0ZXMgb3ZlcmhlYWQ7CisKKyAgICBidWZmZXItPnNldFJhbmdlKGJ1ZmZlci0+b2Zmc2V0KCksIGJ1ZmZlci0+c2l6ZSgpICsgKGRhdGFbM10gKyAxKSAqIHNpemVvZihpbnQzMl90KSk7CisKKyAgICBBTE9HSSgiVUUgLT4gT3AgUmVxIFJ4IGJpdHJhdGUgOiAlZCAiLCBtYW50aXNzYSA8PCByaWdodEVuZCk7Cit9CisKK2ludCBBUlRQU291cmNlOjphZGROQUNLKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtNYXhGQ0lzID0gMTA7IC8vIG1heCBudW1iZXIgb2YgRkNJcworICAgIGlmIChidWZmZXItPnNpemUoKSArICgzICsga01heEZDSXMpICogc2l6ZW9mKGludDMyX3QpID4gYnVmZmVyLT5jYXBhY2l0eSgpKSB7CisgICAgICAgIEFMT0dXKCJSVENQIGJ1ZmZlciB0b28gc21hbGwgdG8gYWNjb21tb2RhdGUgTkFDSy4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+c2l6ZSgpOworCisgICAgZGF0YVswXSA9IDB4ODAgfCAxOyAvLyBHZW5lcmljIE5BQ0sKKyAgICBkYXRhWzFdID0gMjA1OyAgICAgIC8vIFRTRkIKKyAgICBkYXRhWzJdID0gMDsKKyAgICBkYXRhWzNdID0gMDsgICAgICAgIC8vIHdpbGwgYmUgZGVjaWRlZCBsYXRlcgorICAgIGRhdGFbNF0gPSBrU291cmNlSUQgPj4gMjQ7CisgICAgZGF0YVs1XSA9IChrU291cmNlSUQgPj4gMTYpICYgMHhmZjsKKyAgICBkYXRhWzZdID0gKGtTb3VyY2VJRCA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVs3XSA9IGtTb3VyY2VJRCAmIDB4ZmY7CisKKyAgICBkYXRhWzhdID0gbUlEID4+IDI0OworICAgIGRhdGFbOV0gPSAobUlEID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVsxMF0gPSAobUlEID4+IDgpICYgMHhmZjsKKyAgICBkYXRhWzExXSA9IG1JRCAmIDB4ZmY7CisKKyAgICBMaXN0PGludD4gbGlzdDsKKyAgICBMaXN0PGludD46Oml0ZXJhdG9yIGl0OworICAgIGdldFNlcU51bVRvTkFDSyhsaXN0LCBrTWF4RkNJcyk7CisgICAgc2l6ZV90IGNudCA9IDA7CisKKyAgICBpbnQgKkZDSSA9IChpbnQgKikoZGF0YSArIDEyKTsKKyAgICBmb3IgKGl0ID0gbGlzdC5iZWdpbigpOyBpdCAhPSBsaXN0LmVuZCgpICYmIGNudCA8IGtNYXhGQ0lzOyBpdCsrKSB7CisgICAgICAgICooRkNJICsgY250KSA9ICppdDsKKyAgICAgICAgY250Kys7CisgICAgfQorCisgICAgZGF0YVszXSA9ICgzICsgY250KSAtIDE7ICAvLyB0b3RhbCAoMyArICNvZkZDSSkgKiBzaXplb2YoaW50MzJfdCkgYnl0ZQorCisgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpLCBidWZmZXItPnNpemUoKSArIChkYXRhWzNdICsgMSkgKiBzaXplb2YoaW50MzJfdCkpOworCisgICAgcmV0dXJuIGNudDsKK30KKworaW50IEFSVFBTb3VyY2U6OmdldFNlcU51bVRvTkFDSyhMaXN0PGludD4mIGxpc3QsIGludCBzaXplKSB7CisgICAgQXV0b011dGV4IF9sKG1NYXBMb2NrKTsKKyAgICBpbnQgY250ID0gMDsKKworICAgIHN0ZDo6bWFwPHVpbnQxNl90LCBpbmZvTkFDSz46Oml0ZXJhdG9yIGl0OworICAgIGZvcihpdCA9IG1OQUNLTWFwLmJlZ2luKCk7IGl0ICE9IG1OQUNLTWFwLmVuZCgpICYmIGNudCA8IHNpemU7IGl0KyspIHsKKyAgICAgICAgaW5mb05BQ0sgJmluZm9faXQgPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoaW5mb19pdC5uZWVkVG9OQUNLKSB7CisgICAgICAgICAgICBpbmZvX2l0Lm5lZWRUb05BQ0sgPSBmYWxzZTsKKyAgICAgICAgICAgIC8vIHN3aXRjaCBMU0IgdG8gTVNCIGZvciBzZW5kaW5nIE4vVworICAgICAgICAgICAgdWludDMyX3QgRkNJOworICAgICAgICAgICAgdWludDhfdCAqdGVtcCA9ICh1aW50OF90ICopJkZDSTsKKyAgICAgICAgICAgIHRlbXBbMF0gPSAoaW5mb19pdC5zZXFOdW0gPj4gOCkgJiAweGZmOworICAgICAgICAgICAgdGVtcFsxXSA9IChpbmZvX2l0LnNlcU51bSkgICAgICAmIDB4ZmY7CisgICAgICAgICAgICB0ZW1wWzJdID0gKGluZm9faXQubWFzayA+PiA4KSAgICYgMHhmZjsKKyAgICAgICAgICAgIHRlbXBbM10gPSAoaW5mb19pdC5tYXNrKSAgICAgICAgJiAweGZmOworCisgICAgICAgICAgICBsaXN0LnB1c2hfYmFjayhGQ0kpOworICAgICAgICAgICAgY250Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY250OworfQorCit2b2lkIEFSVFBTb3VyY2U6OnNldFNlcU51bVRvTkFDSyh1aW50MTZfdCBzZXFOdW0sIHVpbnQxNl90IG1hc2ssIHVpbnQxNl90IG5vd0ppdHRlckhlYWRTZXFOdW0pIHsKKyAgICBBdXRvTXV0ZXggX2wobU1hcExvY2spOworICAgIGluZm9OQUNLIGluZm8gPSB7c2VxTnVtLCBtYXNrLCBub3dKaXR0ZXJIZWFkU2VxTnVtLCB0cnVlfTsKKyAgICBzdGQ6Om1hcDx1aW50MTZfdCwgaW5mb05BQ0s+OjppdGVyYXRvciBpdDsKKworICAgIGl0ID0gbU5BQ0tNYXAuZmluZChzZXFOdW0pOworICAgIGlmIChpdCAhPSBtTkFDS01hcC5lbmQoKSkgeworICAgICAgICBpbmZvTkFDSyAmaW5mb19pdCA9IGl0LT5zZWNvbmQ7CisgICAgICAgIC8vIHJlbmV3IGlmIChtYXNrIG9yIGhlYWQgc2VxKSBpcyBjaGFuZ2VkCisgICAgICAgIGlmICgoaW5mb19pdC5tYXNrICE9IG1hc2spIHx8IChpbmZvX2l0Lm5vd0ppdHRlckhlYWRTZXFOdW0gIT0gbm93Sml0dGVySGVhZFNlcU51bSkpIHsKKyAgICAgICAgICAgIGluZm9faXQgPSBpbmZvOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbU5BQ0tNYXBbc2VxTnVtXSA9IGluZm87CisgICAgfQorCisgICAgLy8gZGVsZXRlIGFsbCBOQUNLIGZhciBmcm9tIGN1cnJlbnQgSml0dGVyJ3MgZmlyc3Qgc2VxdWVuY2UgbnVtYmVyCisgICAgaXQgPSBtTkFDS01hcC5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtTkFDS01hcC5lbmQoKSkgeworICAgICAgICBpbmZvTkFDSyAmaW5mb19pdCA9IGl0LT5zZWNvbmQ7CisKKyAgICAgICAgaW50IGRpZmYgPSBub3dKaXR0ZXJIZWFkU2VxTnVtIC0gaW5mb19pdC5ub3dKaXR0ZXJIZWFkU2VxTnVtOworICAgICAgICBpZiAoZGlmZiA+IDEwMCkgeworICAgICAgICAgICAgQUxPR1YoIkRlbGV0ZSAlZCBwa3QgZnJvbSBOQUNLIG1hcCAiLCBpbmZvX2l0LnNlcU51bSk7CisgICAgICAgICAgICBpdCA9IG1OQUNLTWFwLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0Kys7CisgICAgICAgIH0KKyAgICB9CisKK30KKwordWludDMyX3QgQVJUUFNvdXJjZTo6Z2V0U2VsZklEKCkgeworICAgIHJldHVybiBrU291cmNlSUQ7Cit9CisKK3ZvaWQgQVJUUFNvdXJjZTo6c2V0U2VsZklEKGNvbnN0IHVpbnQzMl90IHNlbGZJRCkgeworICAgIGtTb3VyY2VJRCA9IHNlbGZJRDsKK30KKwordm9pZCBBUlRQU291cmNlOjpzZXRKYlRpbWUoY29uc3QgdWludDMyX3QgamJUaW1lTXMpIHsKKyAgICBtSmJUaW1lTXMgPSBqYlRpbWVNczsKK30KKwordm9pZCBBUlRQU291cmNlOjpzZXRQZXJpb2RpY0ZJUihib29sIGVuYWJsZSkgeworICAgIEFMT0dEKCJzZXRQZXJpb2RpY0ZJUiAlZCIsIGVuYWJsZSk7CisgICAgbUlzc3VlRklSUmVxdWVzdHMgPSBlbmFibGU7Cit9CisKK2Jvb2wgQVJUUFNvdXJjZTo6aXNOZWVkVG9FYXJseU5vdGlmeSgpIHsKKyAgICB1aW50MzJfdCBleHBlY3RlZCA9IG1IaWdoZXN0U2VxTnVtYmVyIC0gbUJhc2VTZXFOdW1iZXIgKyAxOworICAgIGludDMyX3QgaW50ZXJ2YWxFeHBlY3RlZEluTm93ID0gZXhwZWN0ZWQgLSBtUHJldkV4cGVjdGVkOworICAgIGludDMyX3QgaW50ZXJ2YWxSZWNlaXZlZEluTm93ID0gbU51bUJ1ZmZlcnNSZWNlaXZlZCAtIG1QcmV2TnVtQnVmZmVyc1JlY2VpdmVkOworCisgICAgaWYgKGludGVydmFsRXhwZWN0ZWRJbk5vdyAtIGludGVydmFsUmVjZWl2ZWRJbk5vdyA+IDUpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBUlRQU291cmNlOjpub3RpZnlQa3RJbmZvKGludDMyX3QgYml0cmF0ZSwgYm9vbCBpc1JlZ3VsYXIpIHsKKyAgICBpbnQzMl90IHBheWxvYWRUeXBlID0gaXNSZWd1bGFyID8gUlRQX1FVQUxJVFkgOiBSVFBfUVVBTElUWV9FTUM7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigicnRjcC1ldmVudCIsIDEpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInBheWxvYWQtdHlwZSIsIHBheWxvYWRUeXBlKTsKKyAgICBub3RpZnktPnNldEludDMyKCJmZWVkYmFjay10eXBlIiwgMCk7CisgICAgLy8gc2VuZGluZyB0YXJnZXQgYml0cmF0ZSB1cCB0byBhcHBsaWNhdGlvbiB0byBzaGFyZSBydHAgcXVhbGl0eS4KKyAgICBub3RpZnktPnNldEludDMyKCJiaXQtcmF0ZSIsIGJpdHJhdGUpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImhpZ2hlc3Qtc2VxLW51bSIsIG1IaWdoZXN0U2VxTnVtYmVyKTsKKyAgICBub3RpZnktPnNldEludDMyKCJiYXNlLXNlcS1udW0iLCBtQmFzZVNlcU51bWJlcik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigicHJldi1leHBlY3RlZCIsIG1QcmV2RXhwZWN0ZWQpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIm51bS1idWYtcmVjdiIsIG1OdW1CdWZmZXJzUmVjZWl2ZWQpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInByZXYtbnVtLWJ1Zi1yZWN2IiwgbVByZXZOdW1CdWZmZXJzUmVjZWl2ZWQpOworICAgIG5vdGlmeS0+cG9zdCgpOworCisgICAgaWYgKGlzUmVndWxhcikgeworICAgICAgICB1aW50MzJfdCBleHBlY3RlZCA9IG1IaWdoZXN0U2VxTnVtYmVyIC0gbUJhc2VTZXFOdW1iZXIgKyAxOworICAgICAgICBtUHJldkV4cGVjdGVkID0gZXhwZWN0ZWQ7CisgICAgICAgIG1QcmV2TnVtQnVmZmVyc1JlY2VpdmVkID0gbU51bUJ1ZmZlcnNSZWNlaXZlZDsKKyAgICB9Cit9CisKK3ZvaWQgQVJUUFNvdXJjZTo6b25Jc3N1ZUZJUkJ5QXNzZW1ibGVyKCkgeworICAgIG1Jc3N1ZUZJUkJ5QXNzZW1ibGVyID0gdHJ1ZTsKK30KKwordm9pZCBBUlRQU291cmNlOjpub3RpY2VBYmFuZG9uQnVmZmVyKGludCBjbnQpIHsKKyAgICBtTnVtQnVmZmVyc1JlY2VpdmVkIC09IGNudDsKK30KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaAppbmRleCBmNDRlODNmLi5jNTFmZDhhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaApAQCAtMjMsNiArMjMsOSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgorCisjaW5jbHVkZSA8bWFwPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM3LDYgKzQwLDE3IEBACiAgICAgICAgICAgICBjb25zdCBzcDxBU2Vzc2lvbkRlc2NyaXB0aW9uPiAmc2Vzc2lvbkRlc2MsIHNpemVfdCBpbmRleCwKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKIAorICAgIGVudW0geworICAgICAgICBSVFBfRklSU1RfUEFDS0VUID0gMTAwLAorICAgICAgICBSVENQX0ZJUlNUX1BBQ0tFVCA9IDEwMSwKKyAgICAgICAgUlRQX1FVQUxJVFkgPSAxMDIsCisgICAgICAgIFJUUF9RVUFMSVRZX0VNQyA9IDEwMywKKyAgICAgICAgUlRDUF9UU0ZCID0gMjA1LAorICAgICAgICBSVENQX1BTRkIgPSAyMDYsCisgICAgICAgIFJUUF9DVk8gPSAzMDAsCisgICAgICAgIFJUUF9BVVRPRE9XTiA9IDQwMCwKKyAgICB9OworCiAgICAgdm9pZCBwcm9jZXNzUlRQUGFja2V0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogICAgIHZvaWQgdGltZVVwZGF0ZSh1aW50MzJfdCBydHBUaW1lLCB1aW50NjRfdCBudHBUaW1lKTsKICAgICB2b2lkIGJ5ZVJlY2VpdmVkKCk7CkBAIC00NSwyMiArNTksNTkgQEAKIAogICAgIHZvaWQgYWRkUmVjZWl2ZXJSZXBvcnQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAgICAgdm9pZCBhZGRGSVIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisgICAgdm9pZCBhZGRUTU1CUihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLCBpbnQzMl90IHRhcmdldEJpdHJhdGUpOworICAgIGludCBhZGROQUNLKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIHZvaWQgc2V0U2VxTnVtVG9OQUNLKHVpbnQxNl90IHNlcU51bSwgdWludDE2X3QgbWFzaywgdWludDE2X3Qgbm93Sml0dGVySGVhZFNlcU51bSk7CisgICAgdWludDMyX3QgZ2V0U2VsZklEKCk7CisgICAgdm9pZCBzZXRTZWxmSUQoY29uc3QgdWludDMyX3Qgc2VsZklEKTsKKyAgICB2b2lkIHNldEpiVGltZShjb25zdCB1aW50MzJfdCBqYlRpbWVNcyk7CisgICAgdm9pZCBzZXRQZXJpb2RpY0ZJUihib29sIGVuYWJsZSk7CisgICAgYm9vbCBpc05lZWRUb0Vhcmx5Tm90aWZ5KCk7CisgICAgdm9pZCBub3RpZnlQa3RJbmZvKGludDMyX3QgYml0cmF0ZSwgYm9vbCBpc1JlZ3VsYXIpOworICAgIC8vIEZJUiBuZWVkcyB0byBiZSBzZW50IGJ5IG1pc3NpbmcgcGFja2V0IG9yIGJyb2tlbiB2aWRlbyBpbWFnZS4KKyAgICB2b2lkIG9uSXNzdWVGSVJCeUFzc2VtYmxlcigpOworCisgICAgdm9pZCBub3RpY2VBYmFuZG9uQnVmZmVyKGludCBjbnQ9MSk7CisKKyAgICBpbnQzMl90IG1GaXJzdFNlcU51bWJlcjsKKyAgICB1aW50MzJfdCBtRmlyc3RSdHBUaW1lOworICAgIGludDY0X3QgbUZpcnN0U3lzVGltZTsKKyAgICBpbnQzMl90IG1DbG9ja1JhdGU7CisKKyAgICB1aW50MzJfdCBtSmJUaW1lTXM7CisgICAgaW50MzJfdCBtRmlyc3RTc3JjOworICAgIGludDMyX3QgbUhpZ2hlc3ROYWNrTnVtYmVyOwogCiBwcml2YXRlOgorCiAgICAgdWludDMyX3QgbUlEOwogICAgIHVpbnQzMl90IG1IaWdoZXN0U2VxTnVtYmVyOwogICAgIHVpbnQzMl90IG1QcmV2RXhwZWN0ZWQ7CiAgICAgdWludDMyX3QgbUJhc2VTZXFOdW1iZXI7CiAgICAgaW50MzJfdCBtTnVtQnVmZmVyc1JlY2VpdmVkOwogICAgIGludDMyX3QgbVByZXZOdW1CdWZmZXJzUmVjZWl2ZWQ7CisgICAgdWludDMyX3QgbVByZXZFeHBlY3RlZEZvclJSOworICAgIGludDMyX3QgbVByZXZOdW1CdWZmZXJzUmVjZWl2ZWRGb3JSUjsKIAogICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPiBtUXVldWU7CiAgICAgc3A8QVJUUEFzc2VtYmxlcj4gbUFzc2VtYmxlcjsKIAorICAgIHR5cGVkZWYgc3RydWN0IGluZm9OQUNLIHsKKyAgICAgICAgdWludDE2X3Qgc2VxTnVtOworICAgICAgICB1aW50MTZfdCBtYXNrOworICAgICAgICB1aW50MTZfdCBub3dKaXR0ZXJIZWFkU2VxTnVtOworICAgICAgICBib29sICAgIG5lZWRUb05BQ0s7CisgICAgfSBpbmZvTkFDSzsKKworICAgIE11dGV4IG1NYXBMb2NrOworICAgIHN0ZDo6bWFwPHVpbnQxNl90LCBpbmZvTkFDSz4gbU5BQ0tNYXA7CisgICAgaW50IGdldFNlcU51bVRvTkFDSyhMaXN0PGludD4mIGxpc3QsIGludCBzaXplKTsKKwogICAgIHVpbnQ2NF90IG1MYXN0TlRQVGltZTsKICAgICBpbnQ2NF90IG1MYXN0TlRQVGltZVVwZGF0ZVVzOwogCiAgICAgYm9vbCBtSXNzdWVGSVJSZXF1ZXN0czsKKyAgICBib29sIG1Jc3N1ZUZJUkJ5QXNzZW1ibGVyOwogICAgIGludDY0X3QgbUxhc3RGSVJSZXF1ZXN0VXM7CiAgICAgdWludDhfdCBtTmV4dEZJUlNlcU5vOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcAppbmRleCA1OGQ2MDg2Li5lYzcwOTUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAKQEAgLTIwLDggKzIwLDYgQEAKIAogI2luY2x1ZGUgIkFSVFBXcml0ZXIuaCIKIAotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0zMiwxMyArMzAsNDMgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPHV0aWxzL0J5dGVPcmRlci5oPgogCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisKICNkZWZpbmUgUFQgICAgICA5NwogI2RlZmluZSBQVF9TVFIgICI5NyIKIAorI2RlZmluZSBIMjY0X05BTFVfTUFTSyAweDFGCisjZGVmaW5lIEgyNjRfTkFMVV9TUFMgMHg3CisjZGVmaW5lIEgyNjRfTkFMVV9QUFMgMHg4CisjZGVmaW5lIEgyNjRfTkFMVV9JRlJBTUUgMHg1CisjZGVmaW5lIEgyNjRfTkFMVV9QRlJBTUUgMHgxCisKKyNkZWZpbmUgSDI2NV9OQUxVX01BU0sgMHgzRgorI2RlZmluZSBIMjY1X05BTFVfVlBTIDB4MjAKKyNkZWZpbmUgSDI2NV9OQUxVX1NQUyAweDIxCisjZGVmaW5lIEgyNjVfTkFMVV9QUFMgMHgyMgorCisjZGVmaW5lIElQVjRfSEVBREVSX1NJWkUgMjAKKyNkZWZpbmUgSVBWNl9IRUFERVJfU0laRSA0MAorI2RlZmluZSBVRFBfSEVBREVSX1NJWkUgOAorI2RlZmluZSBUQ1BJUFY0X0hFQURFUl9TSVpFIChJUFY0X0hFQURFUl9TSVpFICsgVURQX0hFQURFUl9TSVpFKQorI2RlZmluZSBUQ1BJUFY2X0hFQURFUl9TSVpFIChJUFY2X0hFQURFUl9TSVpFICsgVURQX0hFQURFUl9TSVpFKQorI2RlZmluZSBUQ1BJUF9IRUFERVJfU0laRSBUQ1BJUFY0X0hFQURFUl9TSVpFCisjZGVmaW5lIFJUUF9IRUFERVJfU0laRSAxMgorI2RlZmluZSBSVFBfSEVBREVSX0VYVF9TSVpFIDgKKyNkZWZpbmUgUlRQX0ZVX0hFQURFUl9TSVpFIDIKKyNkZWZpbmUgUlRQX1BBWUxPQURfUk9PTV9TSVpFIDEwMCAvLyBST09NIHNpemUgZm9yIElQdjYgaGVhZGVyLCBFU1AgYW5kIGV0Yy4KKworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIHN0YXRpYyBjb25zdCBzaXplX3Qga01heFBhY2tldFNpemUgPSA2NTUwNzsgIC8vIG1heGltdW0gcGF5bG9hZCBpbiBVRFAgb3ZlciBJUAotc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4UGFja2V0U2l6ZSA9IDE1MDA7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhQYWNrZXRTaXplID0gMTI4MDsKK3N0YXRpYyBjaGFyIGtDTkFNRVsyNTVdID0gInNvbWVvbmVAc29tZXdoZXJlIjsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrVHJhZmZpY1JlY29yZGVyTWF4RW50cmllcyA9IDEyODsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1RyYWZmaWNSZWNvcmRlck1heFRpbWVTcGFuTXMgPSAyMDAwOwogCiBzdGF0aWMgaW50IFVuaWZvcm1SYW5kKGludCBsaW1pdCkgewogICAgIHJldHVybiAoKGRvdWJsZSlyYW5kKCkgKiBsaW1pdCkgLyBSQU5EX01BWDsKQEAgLTQ4LDE1ICs3NiwyMCBAQAogICAgIDogbUZsYWdzKDApLAogICAgICAgbUZkKGR1cChmZCkpLAogICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCi0gICAgICBtUmVmbGVjdG9yKG5ldyBBSGFuZGxlclJlZmxlY3RvcjxBUlRQV3JpdGVyPih0aGlzKSkgeworICAgICAgbVJlZmxlY3RvcihuZXcgQUhhbmRsZXJSZWZsZWN0b3I8QVJUUFdyaXRlcj4odGhpcykpLAorICAgICAgbVRyYWZmaWNSZWMobmV3IFRyYWZmaWNSZWNvcmRlcjx1aW50MzJfdCAvKiBUaW1lICovLCBCeXRlcz4oCisgICAgICAgICAgICAgIGtUcmFmZmljUmVjb3JkZXJNYXhFbnRyaWVzLCBrVHJhZmZpY1JlY29yZGVyTWF4VGltZVNwYW5NcykpIHsKICAgICBDSEVDS19HRShmZCwgMCk7CisgICAgbUlzSVB2NiA9IGZhbHNlOwogCiAgICAgbUxvb3Blci0+c2V0TmFtZSgicnRwIHdyaXRlciIpOwogICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yKTsKICAgICBtTG9vcGVyLT5zdGFydCgpOwogCi0gICAgbVNvY2tldCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKLSAgICBDSEVDS19HRShtU29ja2V0LCAwKTsKKyAgICBtUlRQU29ja2V0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICAgIENIRUNLX0dFKG1SVFBTb2NrZXQsIDApOworICAgIG1SVENQU29ja2V0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICAgIENIRUNLX0dFKG1SVENQU29ja2V0LCAwKTsKIAogICAgIG1lbXNldChtUlRQQWRkci5zaW5femVybywgMCwgc2l6ZW9mKG1SVFBBZGRyLnNpbl96ZXJvKSk7CiAgICAgbVJUUEFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CkBAIC03Miw2ICsxMDUsNDYgQEAKIAogICAgIG1SVENQQWRkciA9IG1SVFBBZGRyOwogICAgIG1SVENQQWRkci5zaW5fcG9ydCA9IGh0b25zKG50b2hzKG1SVFBBZGRyLnNpbl9wb3J0KSB8IDEpOworICAgIG1TUFNCdWYgPSBOVUxMOworICAgIG1QUFNCdWYgPSBOVUxMOworCisjaWYgTE9HX1RPX0ZJTEVTCisgICAgbVJUUEZkID0gb3BlbigKKyAgICAgICAgICAgICIvZGF0YS9taXNjL3J0cG91dC5iaW4iLAorICAgICAgICAgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywKKyAgICAgICAgICAgIDA2NDQpOworICAgIENIRUNLX0dFKG1SVFBGZCwgMCk7CisKKyAgICBtUlRDUEZkID0gb3BlbigKKyAgICAgICAgICAgICIvZGF0YS9taXNjL3J0Y3BvdXQuYmluIiwKKyAgICAgICAgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsCisgICAgICAgICAgICAwNjQ0KTsKKyAgICBDSEVDS19HRShtUlRDUEZkLCAwKTsKKyNlbmRpZgorfQorCitBUlRQV3JpdGVyOjpBUlRQV3JpdGVyKGludCBmZCwgU3RyaW5nOCYgbG9jYWxJcCwgaW50IGxvY2FsUG9ydCwgU3RyaW5nOCYgcmVtb3RlSXAsCisgICAgaW50IHJlbW90ZVBvcnQsIHVpbnQzMl90IHNlcU5vKQorICAgIDogbUZsYWdzKDApLAorICAgICAgbUZkKGR1cChmZCkpLAorICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCisgICAgICBtUmVmbGVjdG9yKG5ldyBBSGFuZGxlclJlZmxlY3RvcjxBUlRQV3JpdGVyPih0aGlzKSksCisgICAgICBtVHJhZmZpY1JlYyhuZXcgVHJhZmZpY1JlY29yZGVyPHVpbnQzMl90IC8qIFRpbWUgKi8sIEJ5dGVzPigKKyAgICAgICAgICAgICAga1RyYWZmaWNSZWNvcmRlck1heEVudHJpZXMsIGtUcmFmZmljUmVjb3JkZXJNYXhUaW1lU3Bhbk1zKSkgeworICAgIENIRUNLX0dFKGZkLCAwKTsKKyAgICBtSXNJUHY2ID0gZmFsc2U7CisKKyAgICBtTG9vcGVyLT5zZXROYW1lKCJydHAgd3JpdGVyIik7CisgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3IpOworICAgIG1Mb29wZXItPnN0YXJ0KCk7CisKKyAgICBtYWtlU29ja2V0UGFpckFuZEJpbmQobG9jYWxJcCwgbG9jYWxQb3J0LCByZW1vdGVJcCAsIHJlbW90ZVBvcnQpOworICAgIG1WUFNCdWYgPSBOVUxMOworICAgIG1TUFNCdWYgPSBOVUxMOworICAgIG1QUFNCdWYgPSBOVUxMOworCisgICAgaW5pdFN0YXRlKCk7CisgICAgbVNlcU5vID0gc2VxTm87ICAgICAvLyBNdXN0IHVzZSBleHBsaWNpdCAjIG9mIHNlcSBmb3IgUlRQIGNvbnRpbnVpdHkKIAogI2lmIExPR19UT19GSUxFUwogICAgIG1SVFBGZCA9IG9wZW4oCkBAIC04OSw2ICsxNjIsMjEgQEAKIH0KIAogQVJUUFdyaXRlcjo6fkFSVFBXcml0ZXIoKSB7CisgICAgaWYgKG1WUFNCdWYgIT0gTlVMTCkgeworICAgICAgICBtVlBTQnVmLT5yZWxlYXNlKCk7CisgICAgICAgIG1WUFNCdWYgPSBOVUxMOworICAgIH0KKworICAgIGlmIChtU1BTQnVmICE9IE5VTEwpIHsKKyAgICAgICAgbVNQU0J1Zi0+cmVsZWFzZSgpOworICAgICAgICBtU1BTQnVmID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobVBQU0J1ZiAhPSBOVUxMKSB7CisgICAgICAgIG1QUFNCdWYtPnJlbGVhc2UoKTsKKyAgICAgICAgbVBQU0J1ZiA9IE5VTEw7CisgICAgfQorCiAjaWYgTE9HX1RPX0ZJTEVTCiAgICAgY2xvc2UobVJUQ1BGZCk7CiAgICAgbVJUQ1BGZCA9IC0xOwpAQCAtOTcsMTMgKzE4NSwzOSBAQAogICAgIG1SVFBGZCA9IC0xOwogI2VuZGlmCiAKLSAgICBjbG9zZShtU29ja2V0KTsKLSAgICBtU29ja2V0ID0gLTE7CisgICAgY2xvc2UobVJUUFNvY2tldCk7CisgICAgbVJUUFNvY2tldCA9IC0xOworCisgICAgY2xvc2UobVJUQ1BTb2NrZXQpOworICAgIG1SVENQU29ja2V0ID0gLTE7CiAKICAgICBjbG9zZShtRmQpOwogICAgIG1GZCA9IC0xOwogfQogCit2b2lkIEFSVFBXcml0ZXI6OmluaXRTdGF0ZSgpIHsKKyAgICBpZiAobVNvdXJjZUlEID09IDApCisgICAgICAgIG1Tb3VyY2VJRCA9IHJhbmQoKTsKKyAgICBtUGF5bG9hZFR5cGUgPSAwOworICAgIGlmIChtU2VxTm8gPT0gMCkKKyAgICAgICAgbVNlcU5vID0gVW5pZm9ybVJhbmQoNjU1MzYpOworICAgIG1SVFBUaW1lQmFzZSA9IDA7CisgICAgbU51bVJUUFNlbnQgPSAwOworICAgIG1OdW1SVFBPY3RldHNTZW50ID0gMDsKKyAgICBtTGFzdFJUUFRpbWUgPSAwOworICAgIG1MYXN0TlRQVGltZSA9IDA7CisKKyAgICBtT3Bwb25lbnRJRCA9IDA7CisgICAgbUJpdHJhdGUgPSAxOTIwMDA7CisKKyAgICBtTnVtU1JzU2VudCA9IDA7CisgICAgbVJUUENWT0V4dE1hcCA9IC0xOworICAgIG1SVFBDVk9EZWdyZWVzID0gMDsKKyAgICBtUlRQU29ja05ldHdvcmsgPSAwOworCisgICAgbU1vZGUgPSBJTlZBTElEOworfQorCiBzdGF0dXNfdCBBUlRQV3JpdGVyOjphZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKICAgICBtU291cmNlID0gc291cmNlOwogICAgIHJldHVybiBPSzsKQEAgLTExNCwyOCArMjI4LDQ2IEBACiAgICAgcmV0dXJuIChtRmxhZ3MgJiBrRmxhZ0VPUykgIT0gMDsKIH0KIAotc3RhdHVzX3QgQVJUUFdyaXRlcjo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKK3N0YXR1c190IEFSVFBXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICogcGFyYW1zKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBpZiAobUZsYWdzICYga0ZsYWdTdGFydGVkKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKICAgICBtRmxhZ3MgJj0gfmtGbGFnRU9TOwotICAgIG1Tb3VyY2VJRCA9IHJhbmQoKTsKLSAgICBtU2VxTm8gPSBVbmlmb3JtUmFuZCg2NTUzNik7Ci0gICAgbVJUUFRpbWVCYXNlID0gcmFuZCgpOwotICAgIG1OdW1SVFBTZW50ID0gMDsKLSAgICBtTnVtUlRQT2N0ZXRzU2VudCA9IDA7Ci0gICAgbUxhc3RSVFBUaW1lID0gMDsKLSAgICBtTGFzdE5UUFRpbWUgPSAwOwotICAgIG1OdW1TUnNTZW50ID0gMDsKKyAgICBpbml0U3RhdGUoKTsKIAogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgQ0hFQ0sobVNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKIAotICAgIG1Nb2RlID0gSU5WQUxJRDsKKyAgICBpbnQzMl90IHNlbGZJRCA9IDA7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKGtLZXlTZWxmSUQsICZzZWxmSUQpKQorICAgICAgICBtU291cmNlSUQgPSBzZWxmSUQ7CisKKyAgICBpbnQzMl90IHBheWxvYWRUeXBlID0gMDsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoa0tleVBheWxvYWRUeXBlLCAmcGF5bG9hZFR5cGUpKQorICAgICAgICBtUGF5bG9hZFR5cGUgPSBwYXlsb2FkVHlwZTsKKworICAgIGludDMyX3QgcnRwRXh0TWFwID0gMDsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoa0tleVJ0cEV4dE1hcCwgJnJ0cEV4dE1hcCkpCisgICAgICAgIG1SVFBDVk9FeHRNYXAgPSBydHBFeHRNYXA7CisKKyAgICBpbnQzMl90IHJ0cENWT0RlZ3JlZXMgPSAwOworICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMihrS2V5UnRwQ3ZvRGVncmVlcywgJnJ0cENWT0RlZ3JlZXMpKQorICAgICAgICBtUlRQQ1ZPRGVncmVlcyA9IHJ0cENWT0RlZ3JlZXM7CisKKyAgICBpbnQzMl90IGRzY3AgPSAwOworICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMihrS2V5UnRwRHNjcCwgJmRzY3ApKQorICAgICAgICB1cGRhdGVTb2NrZXREc2NwKGRzY3ApOworCisgICAgaW50NjRfdCBzb2NrTmV0d29yayA9IDA7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDY0KGtLZXlTb2NrZXROZXR3b3JrLCAmc29ja05ldHdvcmspKQorICAgICAgICB1cGRhdGVTb2NrZXROZXR3b3JrKHNvY2tOZXR3b3JrKTsKKwogICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7CiAgICAgICAgIG1Nb2RlID0gSDI2NDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpKSB7CisgICAgICAgIG1Nb2RlID0gSDI2NTsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMpKSB7CiAgICAgICAgIG1Nb2RlID0gSDI2MzsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQikpIHsKQEAgLTE4NywxMSArMzE5LDEzNyBAQAogICAgIH0KIH0KIAorc3RhdGljIGNvbnN0IHVpbnQ4X3QgU1BDU2l6ZSA9IDQ7ICAgICAgLy8gU3RhcnQgUHJlZml4IENvZGUgU2l6ZQorc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3RhcnRQcmVmaXhDb2RlW1NQQ1NpemVdID0gezAsIDAsIDAsIDF9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3BjS01QaWR4W1NQQ1NpemVdID0gezAsIDAsIDIsIDB9Oworc3RhdGljIHZvaWQgU3BzUHBzUGFyc2VyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLAorICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipzcHNCdWZmZXIsIE1lZGlhQnVmZmVyQmFzZSAqKnBwc0J1ZmZlcikgeworCisgICAgd2hpbGUgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKk5BTFB0ciA9IChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOworCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKnRhcmdldFB0ciA9IE5VTEw7CisgICAgICAgIGlmICgoKk5BTFB0ciAmIEgyNjRfTkFMVV9NQVNLKSA9PSBIMjY0X05BTFVfU1BTKSB7CisgICAgICAgICAgICB0YXJnZXRQdHIgPSBzcHNCdWZmZXI7CisgICAgICAgIH0gZWxzZSBpZiAoKCpOQUxQdHIgJiBIMjY0X05BTFVfTUFTSykgPT0gSDI2NF9OQUxVX1BQUykgeworICAgICAgICAgICAgdGFyZ2V0UHRyID0gcHBzQnVmZmVyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJTUFMoNykgb3IgUFBTKDgpIGZvdW5kLiBUeXBlICVkIiwgKk5BTFB0ciAmIEgyNjRfTkFMVV9NQVNLKTsKKworICAgICAgICB1aW50MzJfdCBidWZmZXJTaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlIComdGFyZ2V0ID0gKnRhcmdldFB0cjsKKyAgICAgICAgdWludDMyX3QgaSA9IDAsIGogPSAwOworICAgICAgICBib29sIGlzQm91bmRGb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVyU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICB3aGlsZSAoaiA+IDAgJiYgTkFMUHRyW2ldICE9IHN0YXJ0UHJlZml4Q29kZVtqXSkgeworICAgICAgICAgICAgICAgIGogPSBzcGNLTVBpZHhbaiAtIDFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKE5BTFB0cltpXSA9PSBzdGFydFByZWZpeENvZGVbal0pIHsKKyAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgaWYgKGogPT0gU1BDU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBpc0JvdW5kRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCB0YXJnZXRTaXplOworICAgICAgICBpZiAodGFyZ2V0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHRhcmdldC0+cmVsZWFzZSgpOworICAgICAgICB9CisgICAgICAgIC8vIG5vdGUgdGhhdCB0YXJnZXRTaXplIGlzIG5ldmVyIDAgYXMgdGhlIGZpcnN0IGJ5dGUgaXMgbmV2ZXIgcGFydAorICAgICAgICAvLyBvZiBhIHN0YXJ0IHByZWZpeAorICAgICAgICBpZiAoaXNCb3VuZEZvdW5kKSB7CisgICAgICAgICAgICB0YXJnZXRTaXplID0gaSAtIFNQQ1NpemUgKyAxOworICAgICAgICAgICAgdGFyZ2V0ID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUodGFyZ2V0U2l6ZSk7CisgICAgICAgICAgICBtZW1jcHkodGFyZ2V0LT5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgdGFyZ2V0U2l6ZSk7CisgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZShidWZmZXItPnJhbmdlX29mZnNldCgpICsgdGFyZ2V0U2l6ZSArIFNQQ1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gdGFyZ2V0U2l6ZSAtIFNQQ1NpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGFyZ2V0U2l6ZSA9IGJ1ZmZlclNpemU7CisgICAgICAgICAgICB0YXJnZXQgPSBNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZSh0YXJnZXRTaXplKTsKKyAgICAgICAgICAgIG1lbWNweSh0YXJnZXQtPmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICB0YXJnZXRTaXplKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBidWZmZXJTaXplLCAwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgVnBzU3BzUHBzUGFyc2VyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLAorICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKip2cHNCdWZmZXIsIE1lZGlhQnVmZmVyQmFzZSAqKnNwc0J1ZmZlciwgTWVkaWFCdWZmZXJCYXNlICoqcHBzQnVmZmVyKSB7CisKKyAgICB3aGlsZSAoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqTkFMUHRyID0gKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgICAgIHVpbnQ4X3QgbmFsVHlwZSA9ICgoKk5BTFB0cikgPj4gMSkgJiBIMjY1X05BTFVfTUFTSzsKKworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKip0YXJnZXRQdHIgPSBOVUxMOworICAgICAgICBpZiAobmFsVHlwZSA9PSBIMjY1X05BTFVfVlBTKSB7CisgICAgICAgICAgICB0YXJnZXRQdHIgPSB2cHNCdWZmZXI7CisgICAgICAgIH0gZWxzZSBpZiAobmFsVHlwZSA9PSBIMjY1X05BTFVfU1BTKSB7CisgICAgICAgICAgICB0YXJnZXRQdHIgPSBzcHNCdWZmZXI7CisgICAgICAgIH0gZWxzZSBpZiAobmFsVHlwZSA9PSBIMjY1X05BTFVfUFBTKSB7CisgICAgICAgICAgICB0YXJnZXRQdHIgPSBwcHNCdWZmZXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlZQUygzMikgU1BTKDMzKSBvciBQUFMoMzQpIGZvdW5kLiBUeXBlICVkIiwgbmFsVHlwZSk7CisKKyAgICAgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqJnRhcmdldCA9ICp0YXJnZXRQdHI7CisgICAgICAgIHVpbnQzMl90IGkgPSAwLCBqID0gMDsKKyAgICAgICAgYm9vbCBpc0JvdW5kRm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlclNpemU7IGkrKykgeworICAgICAgICAgICAgd2hpbGUgKGogPiAwICYmIE5BTFB0cltpXSAhPSBzdGFydFByZWZpeENvZGVbal0pIHsKKyAgICAgICAgICAgICAgICBqID0gc3BjS01QaWR4W2ogLSAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChOQUxQdHJbaV0gPT0gc3RhcnRQcmVmaXhDb2RlW2pdKSB7CisgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgIGlmIChqID09IFNQQ1NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNCb3VuZEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHRhcmdldCAhPSBOVUxMKSB7CisgICAgICAgICAgICB0YXJnZXQtPnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCB0YXJnZXRTaXplOworICAgICAgICAvLyBub3RlIHRoYXQgdGFyZ2V0U2l6ZSBpcyBuZXZlciAwIGFzIHRoZSBmaXJzdCBieXRlIGlzIG5ldmVyIHBhcnQKKyAgICAgICAgLy8gb2YgYSBzdGFydCBwcmVmaXgKKyAgICAgICAgaWYgKGlzQm91bmRGb3VuZCkgeworICAgICAgICAgICAgdGFyZ2V0U2l6ZSA9IGkgLSBTUENTaXplICsgMTsKKyAgICAgICAgICAgIHRhcmdldCA9IE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKGopOworICAgICAgICAgICAgbWVtY3B5KHRhcmdldC0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgICAgICAgIGopOworICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIHRhcmdldFNpemUgKyBTUENTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIHRhcmdldFNpemUgLSBTUENTaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRhcmdldFNpemUgPSBidWZmZXJTaXplOworICAgICAgICAgICAgdGFyZ2V0ID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUodGFyZ2V0U2l6ZSk7CisgICAgICAgICAgICBtZW1jcHkodGFyZ2V0LT5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgdGFyZ2V0U2l6ZSk7CisgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZShidWZmZXItPnJhbmdlX29mZnNldCgpICsgYnVmZmVyU2l6ZSwgMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKIHZvaWQgQVJUUFdyaXRlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgIGNhc2Uga1doYXRTdGFydDoKICAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfRVEobVNvdXJjZS0+c3RhcnQoKSwgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhKCk7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5VGltZSwgMTBsbCk7CisgICAgICAgICAgICBDSEVDS19FUShtU291cmNlLT5zdGFydChtZXRhLmdldCgpKSwgKHN0YXR1c190KU9LKTsKIAogI2lmIDAKICAgICAgICAgICAgIGlmIChtTW9kZSA9PSBIMjY0KSB7CkBAIC0yNjQsNiArNTIyLDE4IEBACiAgICAgfQogfQogCit2b2lkIEFSVFBXcml0ZXI6OnNldFRNTUJOSW5mbyh1aW50MzJfdCBvcHBvbmVudElELCB1aW50MzJfdCBiaXRyYXRlKSB7CisgICAgbU9wcG9uZW50SUQgPSBvcHBvbmVudElEOworICAgIG1CaXRyYXRlID0gYml0cmF0ZTsKKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKDY1NTM2KTsKKyAgICBidWZmZXItPnNldFJhbmdlKDAsIDApOworCisgICAgYWRkVE1NQk4oYnVmZmVyKTsKKworICAgIHNlbmQoYnVmZmVyLCB0cnVlIC8qIGlzUlRDUCAqLyk7Cit9CisKIHZvaWQgQVJUUFdyaXRlcjo6b25SZWFkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1ZjsKICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZtZWRpYUJ1Zik7CkBAIC0yODEsNyArNTUxLDE2IEBACiAKICAgICAgICAgaWYgKG1Nb2RlID09IEgyNjQpIHsKICAgICAgICAgICAgIFN0cmlwU3RhcnRjb2RlKG1lZGlhQnVmKTsKLSAgICAgICAgICAgIHNlbmRBVkNEYXRhKG1lZGlhQnVmKTsKKyAgICAgICAgICAgIFNwc1Bwc1BhcnNlcihtZWRpYUJ1ZiwgJm1TUFNCdWYsICZtUFBTQnVmKTsKKyAgICAgICAgICAgIGlmIChtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgc2VuZEFWQ0RhdGEobWVkaWFCdWYpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1Nb2RlID09IEgyNjUpIHsKKyAgICAgICAgICAgIFN0cmlwU3RhcnRjb2RlKG1lZGlhQnVmKTsKKyAgICAgICAgICAgIFZwc1Nwc1Bwc1BhcnNlcihtZWRpYUJ1ZiwgJm1WUFNCdWYsICZtU1BTQnVmLCAmbVBQU0J1Zik7CisgICAgICAgICAgICBpZiAobWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIHNlbmRIRVZDRGF0YShtZWRpYUJ1Zik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gSDI2MykgewogICAgICAgICAgICAgc2VuZEgyNjNEYXRhKG1lZGlhQnVmKTsKICAgICAgICAgfSBlbHNlIGlmIChtTW9kZSA9PSBBTVJfTkIgfHwgbU1vZGUgPT0gQU1SX1dCKSB7CkBAIC0zMDksMTIgKzU4OCwzOSBAQAogfQogCiB2b2lkIEFSVFBXcml0ZXI6OnNlbmQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgYm9vbCBpc1JUQ1ApIHsKLSAgICBzc2l6ZV90IG4gPSBzZW5kdG8oCi0gICAgICAgICAgICBtU29ja2V0LCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCksIDAsCi0gICAgICAgICAgICAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopKGlzUlRDUCA/ICZtUlRDUEFkZHIgOiAmbVJUUEFkZHIpLAotICAgICAgICAgICAgc2l6ZW9mKG1SVENQQWRkcikpOworICAgIGludCBzaXplU29ja1N0OworICAgIHN0cnVjdCBzb2NrYWRkciAqcmVtQWRkcjsKIAotICAgIENIRUNLX0VRKG4sIChzc2l6ZV90KWJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBpZiAobUlzSVB2NikgeworICAgICAgICBzaXplU29ja1N0ID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworICAgICAgICBpZiAoaXNSVENQKQorICAgICAgICAgICAgcmVtQWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmbVJUQ1BBZGRyNjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVtQWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmbVJUUEFkZHI2OworICAgIH0gZWxzZSB7CisgICAgICAgIHNpemVTb2NrU3QgPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKyAgICAgICAgaWYgKGlzUlRDUCkKKyAgICAgICAgICAgIHJlbUFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJm1SVENQQWRkcjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVtQWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmbVJUUEFkZHI7CisgICAgfQorCisgICAgLy8gVW5zZWFsIGNvZGUgaWYgbW9kZXJhdG9yIGlzIG5lZWRlZCAocHJldmVudCBvdmVyZmxvdyBvZiBpbnN0YW50IGJhbmR3aWR0aCkKKyAgICAvLyBTZXQgbGltaXQgYml0cyBwZXIgcGVyaW9kIHRocm91Z2ggdGhlIG1vZGVyYXRvci4KKyAgICAvLyBleCkgNktCeXRlLzEwbXMgPSA0OEtCaXQvMTBtcyA9IDQuOE1CaXQvcyBpbnN0YW50IGxpbWl0CisgICAgLy8gTW9kZXJhdGVJbnN0YW50VHJhZmZpYygxMCwgNiAqIDEwMjQpOworCisgICAgc3NpemVfdCBuID0gc2VuZHRvKGlzUlRDUCA/IG1SVENQU29ja2V0IDogbVJUUFNvY2tldCwKKyAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSwgMCwgcmVtQWRkciwgc2l6ZVNvY2tTdCk7CisKKyAgICBpZiAobiAhPSAoc3NpemVfdClidWZmZXItPnNpemUoKSkgeworICAgICAgICBBTE9HVygicGFja2V0cyBjYW4gbm90IGJlIHNlbnQuIHJldD0lZCwgYnVmPSVkIiwgKGludCluLCAoaW50KWJ1ZmZlci0+c2l6ZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBSZWNvcmQgY3VycmVudCB0cmFmZmljICYgUHJpbnQgYml0cyB3aGlsZSBsYXN0IDFzZWMgKDEwMDBtcykKKyAgICAgICAgbVRyYWZmaWNSZWMtPndyaXRlQnl0ZXMoYnVmZmVyLT5zaXplKCkgKworICAgICAgICAgICAgICAgIChtSXNJUHY2ID8gVENQSVBWNl9IRUFERVJfU0laRSA6IFRDUElQVjRfSEVBREVSX1NJWkUpKTsKKyAgICAgICAgbVRyYWZmaWNSZWMtPnByaW50QWNjdUJpdHNGb3JMYXN0UGVyaW9kKDEwMDAsIDEwMDApOworICAgIH0KIAogI2lmIExPR19UT19GSUxFUwogICAgIGludCBmZCA9IGlzUlRDUCA/IG1SVENQRmQgOiBtUlRQRmQ7CkBAIC0zNzksNyArNjg1LDYgQEAKIAogICAgIGRhdGFbb2Zmc2V0KytdID0gMTsgIC8vIENOQU1FCiAKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqa0NOQU1FID0gInNvbWVvbmVAc29tZXdoZXJlIjsKICAgICBkYXRhW29mZnNldCsrXSA9IHN0cmxlbihrQ05BTUUpOwogCiAgICAgbWVtY3B5KCZkYXRhW29mZnNldF0sIGtDTkFNRSwgc3RybGVuKGtDTkFNRSkpOwpAQCAtNDE2LDkgKzcyMSw1NSBAQAogICAgIGJ1ZmZlci0+c2V0UmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSwgYnVmZmVyLT5zaXplKCkgKyBvZmZzZXQpOwogfQogCit2b2lkIEFSVFBXcml0ZXI6OmFkZFRNTUJOKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBpZiAoYnVmZmVyLT5zaXplKCkgKyAyMCA+IGJ1ZmZlci0+Y2FwYWNpdHkoKSkgeworICAgICAgICBBTE9HVygiUlRDUCBidWZmZXIgdG9vIHNtYWxsIHRvIGFjY29tbW9kYXRlIFNSLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtT3Bwb25lbnRJRCA9PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnNpemUoKTsKKworICAgIGRhdGFbMF0gPSAweDgwIHwgNDsgLy8gVE1NQk4KKyAgICBkYXRhWzFdID0gMjA1OyAgICAgIC8vIFRTRkIKKyAgICBkYXRhWzJdID0gMDsKKyAgICBkYXRhWzNdID0gNDsgICAgICAgIC8vIHRvdGFsICg0KzEpICogc2l6ZW9mKGludDMyX3QpID0gMjAgYnl0ZXMKKyAgICBkYXRhWzRdID0gbVNvdXJjZUlEID4+IDI0OworICAgIGRhdGFbNV0gPSAobVNvdXJjZUlEID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVs2XSA9IChtU291cmNlSUQgPj4gOCkgJiAweGZmOworICAgIGRhdGFbN10gPSBtU291cmNlSUQgJiAweGZmOworCisgICAgKihpbnQzMl90KikoJmRhdGFbOF0pID0gMDsgIC8vIDQgYnl0ZXMgYmxhbmsKKworICAgIGRhdGFbMTJdID0gbU9wcG9uZW50SUQgPj4gMjQ7CisgICAgZGF0YVsxM10gPSAobU9wcG9uZW50SUQgPj4gMTYpICYgMHhmZjsKKyAgICBkYXRhWzE0XSA9IChtT3Bwb25lbnRJRCA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVsxNV0gPSBtT3Bwb25lbnRJRCAmIDB4ZmY7CisKKyAgICAvLyBGaW5kIHRoZSBmaXJzdCBiaXQgJzEnIGZyb20gbGVmdCAmIHJpZ2h0IHNpZGUgb2YgdGhlIHZhbHVlLgorICAgIGludDMyX3QgbGVmdEVuZCA9IDMxIC0gX19idWlsdGluX2NseihtQml0cmF0ZSk7CisgICAgaW50MzJfdCByaWdodEVuZCA9IGZmcyhtQml0cmF0ZSkgLSAxOworCisgICAgLy8gTWFudGlzc2EgaGF2ZSBvbmx5IDE3Yml0IHNwYWNlIGJ5IFJUQ1Agc3BlY2lmaWNhdGlvbi4KKyAgICBpZiAoKGxlZnRFbmQgLSByaWdodEVuZCkgPiAxNikgeworICAgICAgICByaWdodEVuZCA9IGxlZnRFbmQgLSAxNjsKKyAgICB9CisgICAgaW50MzJfdCBtYW50aXNzYSA9IG1CaXRyYXRlID4+IHJpZ2h0RW5kOworCisgICAgZGF0YVsxNl0gPSAoKHJpZ2h0RW5kIDw8IDIpICYgMHhmYykgfCAoKG1hbnRpc3NhICYgMHgxODAwMCkgPj4gMTUpOworICAgIGRhdGFbMTddID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYW50aXNzYSAmIDB4MDdmODApID4+IDc7CisgICAgZGF0YVsxOF0gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hbnRpc3NhICYgMHgwMDA3ZikgPDwgMTsKKyAgICBkYXRhWzE5XSA9IDQwOyAgICAgICAgICAgICAgLy8gNDAgYnl0ZXMgb3ZlcmhlYWQ7CisKKyAgICBidWZmZXItPnNldFJhbmdlKGJ1ZmZlci0+b2Zmc2V0KCksIGJ1ZmZlci0+c2l6ZSgpICsgMjApOworCisgICAgQUxPR0koIlVFIC0+IE9wIE5vdGkgVHggYml0cmF0ZSA6ICVkICIsIG1hbnRpc3NhIDw8IHJpZ2h0RW5kKTsKK30KKwogLy8gc3RhdGljCiB1aW50NjRfdCBBUlRQV3JpdGVyOjpHZXROb3dOVFAoKSB7Ci0gICAgdWludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIHVpbnQ2NF90IG5vd1VzID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSkgLyAxMDAwbGw7CiAKICAgICBub3dVcyArPSAoKDcwTEwgKiAzNjUgKyAxNykgKiAyNCkgKiA2MCAqIDYwICogMTAwMDAwMExMOwogCkBAIC00NjMsNyArODE0LDcgQEAKICAgICAgICAgc2RwLmFwcGVuZCgibT1hdWRpbyAiKTsKICAgICB9CiAKLSAgICBzZHAuYXBwZW5kKEFTdHJpbmdQcmludGYoIiVkIiwgbnRvaHMobVJUUEFkZHIuc2luX3BvcnQpKSk7CisgICAgc2RwLmFwcGVuZChBU3RyaW5nUHJpbnRmKCIlZCIsIG1Jc0lQdjYgPyBudG9ocyhtUlRQQWRkcjYuc2luNl9wb3J0KSA6IG50b2hzKG1SVFBBZGRyLnNpbl9wb3J0KSkpOwogICAgIHNkcC5hcHBlbmQoCiAgICAgICAgICAgIiBSVFAvQVZQICIgUFRfU1RSICJcclxuIgogICAgICAgICAgICJiPUFTIDMyMDAwMFxyXG4iCkBAIC01NjksMjQgKzkyMCw5MSBAQAogICAgIHNlbmQoYnVmZmVyLCB0cnVlIC8qIGlzUlRDUCAqLyk7CiB9CiAKLXZvaWQgQVJUUFdyaXRlcjo6c2VuZEFWQ0RhdGEoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1Zikgewordm9pZCBBUlRQV3JpdGVyOjpzZW5kU1BTUFBTSWZJRnJhbWUoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1ZiwgaW50NjRfdCB0aW1lVXMpIHsKKyAgICBDSEVDSyhtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgPiAwKTsKKyAgICBjb25zdCB1aW50OF90ICptZWRpYURhdGEgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKW1lZGlhQnVmLT5kYXRhKCkgKyBtZWRpYUJ1Zi0+cmFuZ2Vfb2Zmc2V0KCk7CisKKyAgICBpZiAoKG1lZGlhRGF0YVswXSAmIEgyNjRfTkFMVV9NQVNLKSAhPSBIMjY0X05BTFVfSUZSQU1FKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobVNQU0J1ZiAhPSBOVUxMKSB7CisgICAgICAgIG1TUFNCdWYtPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICBtU1BTQnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5U3BzLCAxKTsKKyAgICAgICAgc2VuZEFWQ0RhdGEobVNQU0J1Zik7CisgICAgfQorCisgICAgaWYgKG1QUFNCdWYgIT0gTlVMTCkgeworICAgICAgICBtUFBTQnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICAgICAgbVBQU0J1Zi0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleVBwcywgMSk7CisgICAgICAgIHNlbmRBVkNEYXRhKG1QUFNCdWYpOworICAgIH0KK30KKwordm9pZCBBUlRQV3JpdGVyOjpzZW5kVlBTU1BTUFBTSWZJRnJhbWUoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1ZiwgaW50NjRfdCB0aW1lVXMpIHsKKyAgICBDSEVDSyhtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgPiAwKTsKKyAgICBjb25zdCB1aW50OF90ICptZWRpYURhdGEgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKW1lZGlhQnVmLT5kYXRhKCkgKyBtZWRpYUJ1Zi0+cmFuZ2Vfb2Zmc2V0KCk7CisKKyAgICBpbnQgbmFsVHlwZSA9ICgobWVkaWFEYXRhWzBdID4+IDEpICYgSDI2NV9OQUxVX01BU0spOworICAgIGlmICghKG5hbFR5cGUgPj0gMTYgJiYgbmFsVHlwZSA8PSAyMSkgLypIMjY1X05BTFVfSUZSQU1FKi8pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtVlBTQnVmICE9IE5VTEwpIHsKKyAgICAgICAgbVZQU0J1Zi0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgICAgIG1WUFNCdWYtPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlWcHMsIDEpOworICAgICAgICBzZW5kSEVWQ0RhdGEobVZQU0J1Zik7CisgICAgfQorCisgICAgaWYgKG1TUFNCdWYgIT0gTlVMTCkgeworICAgICAgICBtU1BTQnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICAgICAgbVNQU0J1Zi0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleVNwcywgMSk7CisgICAgICAgIHNlbmRIRVZDRGF0YShtU1BTQnVmKTsKKyAgICB9CisKKyAgICBpZiAobVBQU0J1ZiAhPSBOVUxMKSB7CisgICAgICAgIG1QUFNCdWYtPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICBtUFBTQnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5UHBzLCAxKTsKKyAgICAgICAgc2VuZEhFVkNEYXRhKG1QUFNCdWYpOworICAgIH0KK30KKwordm9pZCBBUlRQV3JpdGVyOjpzZW5kSEVWQ0RhdGEoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1ZikgewogICAgIC8vIDEyIGJ5dGVzIFJUUCBoZWFkZXIgKyAyIGJ5dGVzIGZvciB0aGUgRlUtaW5kaWNhdG9yIGFuZCBGVS1oZWFkZXIuCiAgICAgQ0hFQ0tfR0Uoa01heFBhY2tldFNpemUsIDEydSArIDJ1KTsKIAogICAgIGludDY0X3QgdGltZVVzOwogICAgIENIRUNLKG1lZGlhQnVmLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKIAotICAgIHVpbnQzMl90IHJ0cFRpbWUgPSBtUlRQVGltZUJhc2UgKyAodGltZVVzICogOSAvIDEwMExMKTsKKyAgICBzZW5kVlBTU1BTUFBTSWZJRnJhbWUobWVkaWFCdWYsIHRpbWVVcyk7CiAKKyAgICB1aW50MzJfdCBydHBUaW1lID0gbVJUUFRpbWVCYXNlICsgKHRpbWVVcyAqIDkgLyAxMDBsbCk7CisKKyAgICBDSEVDSyhtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgPiAwKTsKICAgICBjb25zdCB1aW50OF90ICptZWRpYURhdGEgPQogICAgICAgICAoY29uc3QgdWludDhfdCAqKW1lZGlhQnVmLT5kYXRhKCkgKyBtZWRpYUJ1Zi0+cmFuZ2Vfb2Zmc2V0KCk7CiAKKyAgICBpbnQzMl90IGlzTm9uVkNMID0gMDsKKyAgICBpZiAobWVkaWFCdWYtPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5VnBzLCAmaXNOb25WQ0wpIHx8CisgICAgICAgICAgICBtZWRpYUJ1Zi0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlTcHMsICZpc05vblZDTCkgfHwKKyAgICAgICAgICAgIG1lZGlhQnVmLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoa0tleVBwcywgJmlzTm9uVkNMKSkgeworICAgICAgICBpc05vblZDTCA9IDE7CisgICAgfQorCiAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoa01heFBhY2tldFNpemUpOwotICAgIGlmIChtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgKyAxMiA8PSBidWZmZXItPmNhcGFjaXR5KCkpIHsKKworICAgIGlmIChtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgKyBUQ1BJUF9IRUFERVJfU0laRSArIFJUUF9IRUFERVJfU0laRSArIFJUUF9IRUFERVJfRVhUX1NJWkUKKyAgICAgICAgICAgICsgUlRQX1BBWUxPQURfUk9PTV9TSVpFIDw9IGJ1ZmZlci0+Y2FwYWNpdHkoKSkgewogICAgICAgICAvLyBUaGUgZGF0YSBmaXRzIGludG8gYSBzaW5nbGUgcGFja2V0CiAgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKICAgICAgICAgZGF0YVswXSA9IDB4ODA7Ci0gICAgICAgIGRhdGFbMV0gPSAoMSA8PCA3KSB8IFBUOyAgLy8gTS1iaXQKKyAgICAgICAgaWYgKGlzTm9uVkNMKSB7CisgICAgICAgICAgICBkYXRhWzFdID0gbVBheWxvYWRUeXBlOyAgLy8gTWFya2VyIGJpdCBzaG91bGQgbm90IGJlIHNldCBpbiBjYXNlIG9mIE5vbi1WQ0wKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGFbMV0gPSAoMSA8PCA3KSB8IG1QYXlsb2FkVHlwZTsgIC8vIE0tYml0CisgICAgICAgIH0KICAgICAgICAgZGF0YVsyXSA9IChtU2VxTm8gPj4gOCkgJiAweGZmOwogICAgICAgICBkYXRhWzNdID0gbVNlcU5vICYgMHhmZjsKICAgICAgICAgZGF0YVs0XSA9IHJ0cFRpbWUgPj4gMjQ7CkBAIC02MTEsMjEgKzEwMjksMjQgQEAKICAgICB9IGVsc2UgewogICAgICAgICAvLyBGVS1BCiAKLSAgICAgICAgdW5zaWduZWQgbmFsVHlwZSA9IG1lZGlhRGF0YVswXTsKLSAgICAgICAgc2l6ZV90IG9mZnNldCA9IDE7CisgICAgICAgIHVuc2lnbmVkIG5hbFR5cGUgPSAobWVkaWFEYXRhWzBdID4+IDEpICYgSDI2NV9OQUxVX01BU0s7CisgICAgICAgIEFMT0dWKCJIMjY1IG5hbFR5cGUgMHgleCwgZGF0YVswXT0weCV4IiwgbmFsVHlwZSwgbWVkaWFEYXRhWzBdKTsKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IDI7IC8vSDI2NSBwYXlsb2FkIGhlYWRlciBpcyAxNiBiaXQuCiAKICAgICAgICAgYm9vbCBmaXJzdFBhY2tldCA9IHRydWU7CiAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkpIHsKICAgICAgICAgICAgIHNpemVfdCBzaXplID0gbWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpIC0gb2Zmc2V0OwogICAgICAgICAgICAgYm9vbCBsYXN0UGFja2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChzaXplICsgMTIgKyAyID4gYnVmZmVyLT5jYXBhY2l0eSgpKSB7CisgICAgICAgICAgICBpZiAoc2l6ZSArIFRDUElQX0hFQURFUl9TSVpFICsgUlRQX0hFQURFUl9TSVpFICsgUlRQX0hFQURFUl9FWFRfU0laRSArCisgICAgICAgICAgICAgICAgICAgIFJUUF9GVV9IRUFERVJfU0laRSArIFJUUF9QQVlMT0FEX1JPT01fU0laRSA+IGJ1ZmZlci0+Y2FwYWNpdHkoKSkgewogICAgICAgICAgICAgICAgIGxhc3RQYWNrZXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBzaXplID0gYnVmZmVyLT5jYXBhY2l0eSgpIC0gMTIgLSAyOworICAgICAgICAgICAgICAgIHNpemUgPSBidWZmZXItPmNhcGFjaXR5KCkgLSBUQ1BJUF9IRUFERVJfU0laRSAtIFJUUF9IRUFERVJfU0laRSAtCisgICAgICAgICAgICAgICAgICAgIFJUUF9IRUFERVJfRVhUX1NJWkUgLSBSVFBfRlVfSEVBREVSX1NJWkUgLSBSVFBfUEFZTE9BRF9ST09NX1NJWkU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKICAgICAgICAgICAgIGRhdGFbMF0gPSAweDgwOwotICAgICAgICAgICAgZGF0YVsxXSA9IChsYXN0UGFja2V0ID8gKDEgPDwgNykgOiAweDAwKSB8IFBUOyAgLy8gTS1iaXQKKyAgICAgICAgICAgIGRhdGFbMV0gPSAobGFzdFBhY2tldCA/ICgxIDw8IDcpIDogMHgwMCkgfCBtUGF5bG9hZFR5cGU7ICAvLyBNLWJpdAogICAgICAgICAgICAgZGF0YVsyXSA9IChtU2VxTm8gPj4gOCkgJiAweGZmOwogICAgICAgICAgICAgZGF0YVszXSA9IG1TZXFObyAmIDB4ZmY7CiAgICAgICAgICAgICBkYXRhWzRdID0gcnRwVGltZSA+PiAyNDsKQEAgLTYzNywxOCArMTA1OCwzOSBAQAogICAgICAgICAgICAgZGF0YVsxMF0gPSAobVNvdXJjZUlEID4+IDgpICYgMHhmZjsKICAgICAgICAgICAgIGRhdGFbMTFdID0gbVNvdXJjZUlEICYgMHhmZjsKIAotICAgICAgICAgICAgZGF0YVsxMl0gPSAyOCB8IChuYWxUeXBlICYgMHhlMCk7CisgICAgICAgICAgICAvKiAgSDI2NSBwYXlsb2FkIGhlYWRlciBpcyAxNiBiaXQKKyAgICAgICAgICAgICAgICAgMCAxIDIgMyA0IDUgNiA3IDAgMSAyIDMgNCA1IDYgNworICAgICAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgICAgIHxGfCAgICAgVHlwZSAgfCAgTGF5ZXIgSUQgfCBUSUQgfAorICAgICAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEFMT0dWKCJIMjY1IHBheWxvYWQgaGVhZGVyIDB4JXggJXgiLCBtZWRpYURhdGFbMF0sIG1lZGlhRGF0YVsxXSk7CisgICAgICAgICAgICAvLyBleGNsdWRlcyBUeXBlIGZyb20gMXN0IGJ5dGUgb2YgSDI2NSBwYXlsb2FkIGhlYWRlci4KKyAgICAgICAgICAgIGRhdGFbMTJdID0gbWVkaWFEYXRhWzBdICYgMHg4MTsKKyAgICAgICAgICAgIC8vIGZpbGxzIFR5cGUgYXMgRlUgKDQ5ID09IDB4MzEpCisgICAgICAgICAgICBkYXRhWzEyXSA9IGRhdGFbMTJdIHwgKDB4MzEgPDwgMSk7CisgICAgICAgICAgICBkYXRhWzEzXSA9IG1lZGlhRGF0YVsxXTsKKworICAgICAgICAgICAgQUxPR1YoIkgyNjUgRlUgaGVhZGVyIDB4JXggJXgiLCBkYXRhWzEyXSwgZGF0YVsxM10pOwogCiAgICAgICAgICAgICBDSEVDSyghZmlyc3RQYWNrZXQgfHwgIWxhc3RQYWNrZXQpOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICBGVSBJTkRJQ0FUT1IgSERSCisgICAgICAgICAgICAgICAgMCAxIDIgMyA0IDUgNiA3CisgICAgICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICAgICAgfFN8RXwgICBUeXBlICB8CisgICAgICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICAqLwogCi0gICAgICAgICAgICBkYXRhWzEzXSA9CisgICAgICAgICAgICBkYXRhWzE0XSA9CiAgICAgICAgICAgICAgICAgKGZpcnN0UGFja2V0ID8gMHg4MCA6IDB4MDApCiAgICAgICAgICAgICAgICAgfCAobGFzdFBhY2tldCA/IDB4NDAgOiAweDAwKQotICAgICAgICAgICAgICAgIHwgKG5hbFR5cGUgJiAweDFmKTsKKyAgICAgICAgICAgICAgICB8IChuYWxUeXBlICYgSDI2NV9OQUxVX01BU0spOworICAgICAgICAgICAgQUxPR1YoIkgyNjUgRlUgaW5kaWNhdG9yIDB4JXgiLCBkYXRhWzE0XSk7CiAKLSAgICAgICAgICAgIG1lbWNweSgmZGF0YVsxNF0sICZtZWRpYURhdGFbb2Zmc2V0XSwgc2l6ZSk7CisgICAgICAgICAgICBtZW1jcHkoJmRhdGFbMTVdLCAmbWVkaWFEYXRhW29mZnNldF0sIHNpemUpOwogCi0gICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIDE0ICsgc2l6ZSk7CisgICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIDE1ICsgc2l6ZSk7CiAKICAgICAgICAgICAgIHNlbmQoYnVmZmVyLCBmYWxzZSAvKiBpc1JUQ1AgKi8pOwogCkBAIC02NjMsNiArMTEwNSwxNzIgQEAKIAogICAgIG1MYXN0UlRQVGltZSA9IHJ0cFRpbWU7CiAgICAgbUxhc3ROVFBUaW1lID0gR2V0Tm93TlRQKCk7CisKK30KKwordm9pZCBBUlRQV3JpdGVyOjpzZW5kQVZDRGF0YShNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmKSB7CisgICAgLy8gMTIgYnl0ZXMgUlRQIGhlYWRlciArIDIgYnl0ZXMgZm9yIHRoZSBGVS1pbmRpY2F0b3IgYW5kIEZVLWhlYWRlci4KKyAgICBDSEVDS19HRShrTWF4UGFja2V0U2l6ZSwgMTJ1ICsgMnUpOworCisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgQ0hFQ0sobWVkaWFCdWYtPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworCisgICAgc2VuZFNQU1BQU0lmSUZyYW1lKG1lZGlhQnVmLCB0aW1lVXMpOworCisgICAgdWludDMyX3QgcnRwVGltZSA9IG1SVFBUaW1lQmFzZSArICh0aW1lVXMgKiA5IC8gMTAwTEwpOworCisgICAgQ0hFQ0sobWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpID4gMCk7CisgICAgY29uc3QgdWludDhfdCAqbWVkaWFEYXRhID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltZWRpYUJ1Zi0+ZGF0YSgpICsgbWVkaWFCdWYtPnJhbmdlX29mZnNldCgpOworCisgICAgaW50MzJfdCBzcHMsIHBwczsKKyAgICBib29sIGlzU3BzUHBzID0gZmFsc2U7CisgICAgaWYgKG1lZGlhQnVmLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoa0tleVNwcywgJnNwcykgfHwKKyAgICAgICAgICAgIG1lZGlhQnVmLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoa0tleVBwcywgJnBwcykpIHsKKyAgICAgICAgaXNTcHNQcHMgPSB0cnVlOworICAgIH0KKworICAgIG1UcmFmZmljUmVjLT51cGRhdGVDbG9jayhBTG9vcGVyOjpHZXROb3dVcygpIC8gMTAwMCk7CisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoa01heFBhY2tldFNpemUpOworICAgIGlmIChtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgKyBUQ1BJUF9IRUFERVJfU0laRSArIFJUUF9IRUFERVJfU0laRSArIFJUUF9IRUFERVJfRVhUX1NJWkUKKyAgICAgICAgICAgICsgUlRQX1BBWUxPQURfUk9PTV9TSVpFIDw9IGJ1ZmZlci0+Y2FwYWNpdHkoKSkgeworICAgICAgICAvLyBUaGUgZGF0YSBmaXRzIGludG8gYSBzaW5nbGUgcGFja2V0CisgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICAgICAgZGF0YVswXSA9IDB4ODA7CisgICAgICAgIGlmIChtUlRQQ1ZPRXh0TWFwID4gMCkKKyAgICAgICAgICAgIGRhdGFbMF0gfD0gMHgxMDsKKyAgICAgICAgaWYgKGlzU3BzUHBzKQorICAgICAgICAgICAgZGF0YVsxXSA9IG1QYXlsb2FkVHlwZTsgIC8vIE1hcmtlciBiaXQgc2hvdWxkIG5vdCBiZSBzZXQgaW4gY2FzZSBvZiBzcHMvcHBzCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRhdGFbMV0gPSAoMSA8PCA3KSB8IG1QYXlsb2FkVHlwZTsKKyAgICAgICAgZGF0YVsyXSA9IChtU2VxTm8gPj4gOCkgJiAweGZmOworICAgICAgICBkYXRhWzNdID0gbVNlcU5vICYgMHhmZjsKKyAgICAgICAgZGF0YVs0XSA9IHJ0cFRpbWUgPj4gMjQ7CisgICAgICAgIGRhdGFbNV0gPSAocnRwVGltZSA+PiAxNikgJiAweGZmOworICAgICAgICBkYXRhWzZdID0gKHJ0cFRpbWUgPj4gOCkgJiAweGZmOworICAgICAgICBkYXRhWzddID0gcnRwVGltZSAmIDB4ZmY7CisgICAgICAgIGRhdGFbOF0gPSBtU291cmNlSUQgPj4gMjQ7CisgICAgICAgIGRhdGFbOV0gPSAobVNvdXJjZUlEID4+IDE2KSAmIDB4ZmY7CisgICAgICAgIGRhdGFbMTBdID0gKG1Tb3VyY2VJRCA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGRhdGFbMTFdID0gbVNvdXJjZUlEICYgMHhmZjsKKworICAgICAgICBpbnQgcnRwRXh0SW5kZXggPSAwOworICAgICAgICBpZiAobVJUUENWT0V4dE1hcCA+IDApIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgICAgfCAgICAgICAweEJFICAgIHwgICAgMHhERSAgICAgICB8ICAgICAgICAgICBsZW5ndGg9MyAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICAgICB8ICBJRCAgIHwgTD0wICAgfCAgICAgZGF0YSAgICAgIHwgIElEICAgfCAgTD0xICB8ICAgZGF0YS4uLgorICAgICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICAgICAgICAgIC4uLmRhdGEgICB8ICAgIDAgKHBhZCkgICAgfCAgICAwIChwYWQpICAgIHwgIElEICAgfCBMPTMgICB8CisgICAgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKKworICAgICAgICAgICAgICBJbiB0aGUgb25lLWJ5dGUgaGVhZGVyIGZvcm0gb2YgZXh0ZW5zaW9ucywgdGhlIDE2LWJpdCB2YWx1ZSByZXF1aXJlZAorICAgICAgICAgICAgICBieSB0aGUgUlRQIHNwZWNpZmljYXRpb24gZm9yIGEgaGVhZGVyIGV4dGVuc2lvbiwgbGFiZWxlZCBpbiB0aGUgUlRQCisgICAgICAgICAgICAgIHNwZWNpZmljYXRpb24gYXMgImRlZmluZWQgYnkgcHJvZmlsZSIsIHRha2VzIHRoZSBmaXhlZCBiaXQgcGF0dGVybgorICAgICAgICAgICAgICAweEJFREUgKHRoZSBmaXJzdCB2ZXJzaW9uIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiB3YXMgd3JpdHRlbiBvbiB0aGUKKyAgICAgICAgICAgICAgZmVhc3QgZGF5IG9mIHRoZSBWZW5lcmFibGUgQmVkZSkuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgZGF0YVsxMl0gPSAweEJFOworICAgICAgICAgICAgZGF0YVsxM10gPSAweERFOworICAgICAgICAgICAgLy8gcHV0IGEgbGVuZ3RoIG9mIFJUUCBFeHRlbnNpb24uCisgICAgICAgICAgICBkYXRhWzE0XSA9IDB4MDA7CisgICAgICAgICAgICBkYXRhWzE1XSA9IDB4MDE7CisgICAgICAgICAgICAvLyBwdXQgZXh0bWFwIG9mIFJUUCBhc3NpZ25lZCBmb3IgQ1ZPLgorICAgICAgICAgICAgZGF0YVsxNl0gPSAobVJUUENWT0V4dE1hcCA8PCA0KSB8IDB4MDsKKyAgICAgICAgICAgIC8vIHB1dCBpbWFnZSBkZWdyZWVzIGFzIHBlciBDVk8gc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICAgIGRhdGFbMTddID0gbVJUUENWT0RlZ3JlZXM7CisgICAgICAgICAgICBkYXRhWzE4XSA9IDB4MDsKKyAgICAgICAgICAgIGRhdGFbMTldID0gMHgwOworICAgICAgICAgICAgcnRwRXh0SW5kZXggPSA4OworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KCZkYXRhWzEyICsgcnRwRXh0SW5kZXhdLAorICAgICAgICAgICAgICAgbWVkaWFEYXRhLCBtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkpOworCisgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgbWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpICsgKDEyICsgcnRwRXh0SW5kZXgpKTsKKworICAgICAgICBzZW5kKGJ1ZmZlciwgZmFsc2UgLyogaXNSVENQICovKTsKKworICAgICAgICArK21TZXFObzsKKyAgICAgICAgKyttTnVtUlRQU2VudDsKKyAgICAgICAgbU51bVJUUE9jdGV0c1NlbnQgKz0gYnVmZmVyLT5zaXplKCkgLSAoMTIgKyBydHBFeHRJbmRleCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRlUtQQorCisgICAgICAgIHVuc2lnbmVkIG5hbFR5cGUgPSBtZWRpYURhdGFbMF07CisgICAgICAgIHNpemVfdCBvZmZzZXQgPSAxOworCisgICAgICAgIGJvb2wgZmlyc3RQYWNrZXQgPSB0cnVlOworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgbWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpKSB7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSAtIG9mZnNldDsKKyAgICAgICAgICAgIGJvb2wgbGFzdFBhY2tldCA9IHRydWU7CisgICAgICAgICAgICBpZiAoc2l6ZSArIFRDUElQX0hFQURFUl9TSVpFICsgUlRQX0hFQURFUl9TSVpFICsgUlRQX0hFQURFUl9FWFRfU0laRSArCisgICAgICAgICAgICAgICAgICAgIFJUUF9GVV9IRUFERVJfU0laRSArIFJUUF9QQVlMT0FEX1JPT01fU0laRSA+IGJ1ZmZlci0+Y2FwYWNpdHkoKSkgeworICAgICAgICAgICAgICAgIGxhc3RQYWNrZXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzaXplID0gYnVmZmVyLT5jYXBhY2l0eSgpIC0gVENQSVBfSEVBREVSX1NJWkUgLSBSVFBfSEVBREVSX1NJWkUgLQorICAgICAgICAgICAgICAgICAgICBSVFBfSEVBREVSX0VYVF9TSVpFIC0gUlRQX0ZVX0hFQURFUl9TSVpFIC0gUlRQX1BBWUxPQURfUk9PTV9TSVpFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgICAgICAgICBkYXRhWzBdID0gMHg4MDsKKyAgICAgICAgICAgIGlmIChsYXN0UGFja2V0ICYmIG1SVFBDVk9FeHRNYXAgPiAwKQorICAgICAgICAgICAgICAgIGRhdGFbMF0gfD0gMHgxMDsKKyAgICAgICAgICAgIGRhdGFbMV0gPSAobGFzdFBhY2tldCA/ICgxIDw8IDcpIDogMHgwMCkgfCBtUGF5bG9hZFR5cGU7ICAvLyBNLWJpdAorICAgICAgICAgICAgZGF0YVsyXSA9IChtU2VxTm8gPj4gOCkgJiAweGZmOworICAgICAgICAgICAgZGF0YVszXSA9IG1TZXFObyAmIDB4ZmY7CisgICAgICAgICAgICBkYXRhWzRdID0gcnRwVGltZSA+PiAyNDsKKyAgICAgICAgICAgIGRhdGFbNV0gPSAocnRwVGltZSA+PiAxNikgJiAweGZmOworICAgICAgICAgICAgZGF0YVs2XSA9IChydHBUaW1lID4+IDgpICYgMHhmZjsKKyAgICAgICAgICAgIGRhdGFbN10gPSBydHBUaW1lICYgMHhmZjsKKyAgICAgICAgICAgIGRhdGFbOF0gPSBtU291cmNlSUQgPj4gMjQ7CisgICAgICAgICAgICBkYXRhWzldID0gKG1Tb3VyY2VJRCA+PiAxNikgJiAweGZmOworICAgICAgICAgICAgZGF0YVsxMF0gPSAobVNvdXJjZUlEID4+IDgpICYgMHhmZjsKKyAgICAgICAgICAgIGRhdGFbMTFdID0gbVNvdXJjZUlEICYgMHhmZjsKKworICAgICAgICAgICAgaW50IHJ0cEV4dEluZGV4ID0gMDsKKyAgICAgICAgICAgIGlmIChsYXN0UGFja2V0ICYmIG1SVFBDVk9FeHRNYXAgPiAwKSB7CisgICAgICAgICAgICAgICAgZGF0YVsxMl0gPSAweEJFOworICAgICAgICAgICAgICAgIGRhdGFbMTNdID0gMHhERTsKKyAgICAgICAgICAgICAgICBkYXRhWzE0XSA9IDB4MDA7CisgICAgICAgICAgICAgICAgZGF0YVsxNV0gPSAweDAxOworICAgICAgICAgICAgICAgIGRhdGFbMTZdID0gKG1SVFBDVk9FeHRNYXAgPDwgNCkgfCAweDA7CisgICAgICAgICAgICAgICAgZGF0YVsxN10gPSBtUlRQQ1ZPRGVncmVlczsKKyAgICAgICAgICAgICAgICBkYXRhWzE4XSA9IDB4MDsKKyAgICAgICAgICAgICAgICBkYXRhWzE5XSA9IDB4MDsKKyAgICAgICAgICAgICAgICBydHBFeHRJbmRleCA9IDg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRhdGFbMTIgKyBydHBFeHRJbmRleF0gPSAyOCB8IChuYWxUeXBlICYgMHhlMCk7CisKKyAgICAgICAgICAgIENIRUNLKCFmaXJzdFBhY2tldCB8fCAhbGFzdFBhY2tldCk7CisKKyAgICAgICAgICAgIGRhdGFbMTMgKyBydHBFeHRJbmRleF0gPQorICAgICAgICAgICAgICAgIChmaXJzdFBhY2tldCA/IDB4ODAgOiAweDAwKQorICAgICAgICAgICAgICAgIHwgKGxhc3RQYWNrZXQgPyAweDQwIDogMHgwMCkKKyAgICAgICAgICAgICAgICB8IChuYWxUeXBlICYgMHgxZik7CisKKyAgICAgICAgICAgIG1lbWNweSgmZGF0YVsxNCArIHJ0cEV4dEluZGV4XSwgJm1lZGlhRGF0YVtvZmZzZXRdLCBzaXplKTsKKworICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAxNCArIHJ0cEV4dEluZGV4ICsgc2l6ZSk7CisKKyAgICAgICAgICAgIHNlbmQoYnVmZmVyLCBmYWxzZSAvKiBpc1JUQ1AgKi8pOworCisgICAgICAgICAgICArK21TZXFObzsKKyAgICAgICAgICAgICsrbU51bVJUUFNlbnQ7CisgICAgICAgICAgICBtTnVtUlRQT2N0ZXRzU2VudCArPSBidWZmZXItPnNpemUoKSAtICgxMiArIHJ0cEV4dEluZGV4KTsKKworICAgICAgICAgICAgZmlyc3RQYWNrZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIG9mZnNldCArPSBzaXplOworICAgICAgICB9CisgICAgfQorCisgICAgbUxhc3RSVFBUaW1lID0gcnRwVGltZTsKKyAgICBtTGFzdE5UUFRpbWUgPSBHZXROb3dOVFAoKTsKIH0KIAogdm9pZCBBUlRQV3JpdGVyOjpzZW5kSDI2M0RhdGEoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1ZikgewpAQCAtNjk2LDcgKzEzMDQsNyBAQAogCiAgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKICAgICAgICAgZGF0YVswXSA9IDB4ODA7Ci0gICAgICAgIGRhdGFbMV0gPSAobGFzdFBhY2tldCA/IDB4ODAgOiAweDAwKSB8IFBUOyAgLy8gTS1iaXQKKyAgICAgICAgZGF0YVsxXSA9IChsYXN0UGFja2V0ID8gMHg4MCA6IDB4MDApIHwgbVBheWxvYWRUeXBlOyAgLy8gTS1iaXQKICAgICAgICAgZGF0YVsyXSA9IChtU2VxTm8gPj4gOCkgJiAweGZmOwogICAgICAgICBkYXRhWzNdID0gbVNlcU5vICYgMHhmZjsKICAgICAgICAgZGF0YVs0XSA9IHJ0cFRpbWUgPj4gMjQ7CkBAIC03MjcsNiArMTMzNSw1OCBAQAogICAgIG1MYXN0TlRQVGltZSA9IEdldE5vd05UUCgpOwogfQogCit2b2lkIEFSVFBXcml0ZXI6OnVwZGF0ZUNWT0RlZ3JlZXMoaW50MzJfdCBjdm9EZWdyZWVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtUlRQQ1ZPRGVncmVlcyA9IGN2b0RlZ3JlZXM7Cit9CisKK3ZvaWQgQVJUUFdyaXRlcjo6dXBkYXRlUGF5bG9hZFR5cGUoaW50MzJfdCBwYXlsb2FkVHlwZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbVBheWxvYWRUeXBlID0gcGF5bG9hZFR5cGU7Cit9CisKK3ZvaWQgQVJUUFdyaXRlcjo6dXBkYXRlU29ja2V0RHNjcChpbnQzMl90IGRzY3ApIHsKKyAgICBtUnRwTGF5ZXIzRHNjcCA9IGRzY3AgPDwgMjsKKworICAgIC8qIG1SdHBMYXllcjNEc2NwIHdpbGwgYmUgbWFwcGVkIHRvIFdNTShXaWZpKSBhcyBwZXIgb3BlcmF0b3IncyByZXF1aXJlbWVudCAqLworICAgIGlmIChzZXRzb2Nrb3B0KG1SVFBTb2NrZXQsIElQUFJPVE9fSVAsIElQX1RPUywKKyAgICAgICAgICAgICAgICAoaW50ICopJm1SdHBMYXllcjNEc2NwLCBzaXplb2YobVJ0cExheWVyM0RzY3ApKSA8IDApIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBzZXQgZHNjcCBvbiBydHBzb2NrLiBlcnI9JXMiLCBzdHJlcnJvcihlcnJubykpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCJzdWNjZXNzZnVsbHkgc2V0IGRzY3Agb24gcnRwc29jay4gb3B0PSVkIiwgbVJ0cExheWVyM0RzY3ApOworICAgICAgICBzZXRzb2Nrb3B0KG1SVENQU29ja2V0LCBJUFBST1RPX0lQLCBJUF9UT1MsCisgICAgICAgICAgICAgICAgKGludCAqKSZtUnRwTGF5ZXIzRHNjcCwgc2l6ZW9mKG1SdHBMYXllcjNEc2NwKSk7CisgICAgICAgIEFMT0dEKCJzdWNjZXNzZnVsbHkgc2V0IGRzY3Agb24gcnRjcHNvY2suIG9wdD0lZCIsIG1SdHBMYXllcjNEc2NwKTsKKyAgICB9Cit9CisKK3ZvaWQgQVJUUFdyaXRlcjo6dXBkYXRlU29ja2V0TmV0d29yayhpbnQ2NF90IHNvY2tldE5ldHdvcmspIHsKKyAgICBtUlRQU29ja05ldHdvcmsgPSAobmV0X2hhbmRsZV90KXNvY2tldE5ldHdvcms7CisgICAgQUxPR0koInRyeWluZyB0byBiaW5kIHJ0cCBzb2NrZXQoJWQpIHRvIG5ldHdvcmsoJWxsdSkuIiwKKyAgICAgICAgICAgICAgICBtUlRQU29ja2V0LCAodW5zaWduZWQgbG9uZyBsb25nKW1SVFBTb2NrTmV0d29yayk7CisKKyAgICBpbnQgcmVzdWx0ID0gYW5kcm9pZF9zZXRzb2NrbmV0d29yayhtUlRQU29ja05ldHdvcmssIG1SVFBTb2NrZXQpOworICAgIGlmIChyZXN1bHQgIT0gMCkgeworICAgICAgICBBTE9HVygiZmFpbGVkKCVkKSB0byBiaW5kIHJ0cCBzb2NrZXQoJWQpIHRvIG5ldHdvcmsoJWxsdSkiLAorICAgICAgICAgICAgICAgIHJlc3VsdCwgbVJUUFNvY2tldCwgKHVuc2lnbmVkIGxvbmcgbG9uZyltUlRQU29ja05ldHdvcmspOworICAgIH0KKyAgICByZXN1bHQgPSBhbmRyb2lkX3NldHNvY2tuZXR3b3JrKG1SVFBTb2NrTmV0d29yaywgbVJUQ1BTb2NrZXQpOworICAgIGlmIChyZXN1bHQgIT0gMCkgeworICAgICAgICBBTE9HVygiZmFpbGVkKCVkKSB0byBiaW5kIHJ0Y3Agc29ja2V0KCVkKSB0byBuZXR3b3JrKCVsbHUpIiwKKyAgICAgICAgICAgICAgICByZXN1bHQsIG1SVENQU29ja2V0LCAodW5zaWduZWQgbG9uZyBsb25nKW1SVFBTb2NrTmV0d29yayk7CisgICAgfQorICAgIEFMT0dJKCJkb25lLiBiaW5kIHJ0cCBzb2NrZXQoJWQpIHRvIG5ldHdvcmsoJWxsdSkiLAorICAgICAgICAgICAgICAgIG1SVFBTb2NrZXQsICh1bnNpZ25lZCBsb25nIGxvbmcpbVJUUFNvY2tOZXR3b3JrKTsKK30KKwordWludDMyX3QgQVJUUFdyaXRlcjo6Z2V0U2VxdWVuY2VOdW0oKSB7CisgICAgcmV0dXJuIG1TZXFObzsKK30KKwordWludDY0X3QgQVJUUFdyaXRlcjo6Z2V0QWNjdW11bGF0aXZlQnl0ZXMoKSB7CisgICAgcmV0dXJuIG1UcmFmZmljUmVjLT5yZWFkQnl0ZXNGb3JUb3RhbCgpOworfQorCiBzdGF0aWMgc2l6ZV90IGdldEZyYW1lU2l6ZShib29sIGlzV2lkZSwgdW5zaWduZWQgRlQpIHsKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtGcmFtZVNpemVOQls4XSA9IHsKICAgICAgICAgOTUsIDEwMywgMTE4LCAxMzQsIDE0OCwgMTU5LCAyMDQsIDI0NApAQCAtNzc4LDcgKzE0MzgsNyBAQAogICAgIC8vIFRoZSBkYXRhIGZpdHMgaW50byBhIHNpbmdsZSBwYWNrZXQKICAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CiAgICAgZGF0YVswXSA9IDB4ODA7Ci0gICAgZGF0YVsxXSA9IFBUOworICAgIGRhdGFbMV0gPSBtUGF5bG9hZFR5cGU7CiAgICAgaWYgKG1OdW1SVFBTZW50ID09IDApIHsKICAgICAgICAgLy8gU2lnbmFsIHN0YXJ0IG9mIHRhbGstc3B1cnQuCiAgICAgICAgIGRhdGFbMV0gfD0gMHg4MDsgIC8vIE0tYml0CkBAIC04MzQsNSArMTQ5NCw5MSBAQAogICAgIG1MYXN0TlRQVGltZSA9IEdldE5vd05UUCgpOwogfQogCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAordm9pZCBBUlRQV3JpdGVyOjptYWtlU29ja2V0UGFpckFuZEJpbmQoU3RyaW5nOCYgbG9jYWxJcCwgaW50IGxvY2FsUG9ydCwKKyAgICAgICAgU3RyaW5nOCYgcmVtb3RlSXAsIGludCByZW1vdGVQb3J0KSB7CisgICAgc3RhdGljIGNoYXIga1NvbWVvbmVbMTZdID0gInNvbWVvbmVAIjsKKyAgICBpbnQgbmFtZUxlbmd0aCA9IHN0cmxlbihrU29tZW9uZSk7CisgICAgbWVtY3B5KGtDTkFNRSwga1NvbWVvbmUsIG5hbWVMZW5ndGgpOworICAgIG1lbWNweShrQ05BTUUgKyBuYW1lTGVuZ3RoLCBsb2NhbElwLmNfc3RyKCksIGxvY2FsSXAubGVuZ3RoKCkgKyAxKTsKIAorICAgIGlmIChsb2NhbElwLmNvbnRhaW5zKCI6IikpCisgICAgICAgIG1Jc0lQdjYgPSB0cnVlOworICAgIGVsc2UKKyAgICAgICAgbUlzSVB2NiA9IGZhbHNlOworCisgICAgbVJUUFNvY2tldCA9IHNvY2tldChtSXNJUHY2ID8gQUZfSU5FVDYgOiBBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgICBDSEVDS19HRShtUlRQU29ja2V0LCAwKTsKKyAgICBtUlRDUFNvY2tldCA9IHNvY2tldChtSXNJUHY2ID8gQUZfSU5FVDYgOiBBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgICBDSEVDS19HRShtUlRDUFNvY2tldCwgMCk7CisKKyAgICBpbnQgc29ja29wdCA9IDE7CisgICAgc2V0c29ja29wdChtUlRQU29ja2V0LCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsIChpbnQgKikmc29ja29wdCwgc2l6ZW9mKHNvY2tvcHQpKTsKKyAgICBzZXRzb2Nrb3B0KG1SVENQU29ja2V0LCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsIChpbnQgKikmc29ja29wdCwgc2l6ZW9mKHNvY2tvcHQpKTsKKworICAgIGlmIChtSXNJUHY2KSB7CisgICAgICAgIG1lbXNldCgmbUxvY2FsQWRkcjYsIDAsIHNpemVvZihtTG9jYWxBZGRyNikpOworICAgICAgICBtZW1zZXQoJm1SVFBBZGRyNiwgMCwgc2l6ZW9mKG1SVFBBZGRyNikpOworICAgICAgICBtZW1zZXQoJm1SVENQQWRkcjYsIDAsIHNpemVvZihtUlRDUEFkZHI2KSk7CisKKyAgICAgICAgbUxvY2FsQWRkcjYuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKyAgICAgICAgaW5ldF9wdG9uKEFGX0lORVQ2LCBsb2NhbElwLnN0cmluZygpLCAmbUxvY2FsQWRkcjYuc2luNl9hZGRyKTsKKyAgICAgICAgbUxvY2FsQWRkcjYuc2luNl9wb3J0ID0gaHRvbnMoKHVpbnQxNl90KWxvY2FsUG9ydCk7CisKKyAgICAgICAgbVJUUEFkZHI2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisgICAgICAgIGluZXRfcHRvbihBRl9JTkVUNiwgcmVtb3RlSXAuc3RyaW5nKCksICZtUlRQQWRkcjYuc2luNl9hZGRyKTsKKyAgICAgICAgbVJUUEFkZHI2LnNpbjZfcG9ydCA9IGh0b25zKCh1aW50MTZfdClyZW1vdGVQb3J0KTsKKworICAgICAgICBtUlRDUEFkZHI2ID0gbVJUUEFkZHI2OworICAgICAgICBtUlRDUEFkZHI2LnNpbjZfcG9ydCA9IGh0b25zKCh1aW50MTZfdCkocmVtb3RlUG9ydCArIDEpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZW1zZXQoJm1Mb2NhbEFkZHIsIDAsIHNpemVvZihtTG9jYWxBZGRyKSk7CisgICAgICAgIG1lbXNldCgmbVJUUEFkZHIsIDAsIHNpemVvZihtUlRQQWRkcikpOworICAgICAgICBtZW1zZXQoJm1SVENQQWRkciwgMCwgc2l6ZW9mKG1SVENQQWRkcikpOworCisgICAgICAgIG1Mb2NhbEFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIG1Mb2NhbEFkZHIuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKGxvY2FsSXAuc3RyaW5nKCkpOworICAgICAgICBtTG9jYWxBZGRyLnNpbl9wb3J0ID0gaHRvbnMoKHVpbnQxNl90KWxvY2FsUG9ydCk7CisKKyAgICAgICAgbVJUUEFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIG1SVFBBZGRyLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihyZW1vdGVJcC5zdHJpbmcoKSk7CisgICAgICAgIG1SVFBBZGRyLnNpbl9wb3J0ID0gaHRvbnMoKHVpbnQxNl90KXJlbW90ZVBvcnQpOworCisgICAgICAgIG1SVENQQWRkciA9IG1SVFBBZGRyOworICAgICAgICBtUlRDUEFkZHIuc2luX3BvcnQgPSBodG9ucygodWludDE2X3QpKHJlbW90ZVBvcnQgKyAxKSk7CisgICAgfQorCisgICAgc3RydWN0IHNvY2thZGRyICpsb2NhbEFkZHIgPSBtSXNJUHY2ID8KKyAgICAgICAgKHN0cnVjdCBzb2NrYWRkciopJm1Mb2NhbEFkZHI2IDogKHN0cnVjdCBzb2NrYWRkciopJm1Mb2NhbEFkZHI7CisKKyAgICBpbnQgc2l6ZVNvY2tTdCA9IG1Jc0lQdjYgPyBzaXplb2YobUxvY2FsQWRkcjYpIDogc2l6ZW9mKG1Mb2NhbEFkZHIpOworCisgICAgaWYgKGJpbmQobVJUUFNvY2tldCwgbG9jYWxBZGRyLCBzaXplU29ja1N0KSA9PSAtMSkgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGJpbmQgcnRwICVzOiVkIGVycj0lcyIsIGxvY2FsSXAuc3RyaW5nKCksIGxvY2FsUG9ydCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgic3VjY2VlZCB0byBiaW5kIHJ0cCAlczolZCIsIGxvY2FsSXAuc3RyaW5nKCksIGxvY2FsUG9ydCk7CisgICAgfQorCisgICAgaWYgKG1Jc0lQdjYpCisgICAgICAgIG1Mb2NhbEFkZHI2LnNpbjZfcG9ydCA9IGh0b25zKCh1aW50MTZfdCkobG9jYWxQb3J0ICsgMSkpOworICAgIGVsc2UKKyAgICAgICAgbUxvY2FsQWRkci5zaW5fcG9ydCA9IGh0b25zKCh1aW50MTZfdCkobG9jYWxQb3J0ICsgMSkpOworCisgICAgaWYgKGJpbmQobVJUQ1BTb2NrZXQsIGxvY2FsQWRkciwgc2l6ZVNvY2tTdCkgPT0gLTEpIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBiaW5kIHJ0Y3AgJXM6JWQgZXJyPSVzIiwgbG9jYWxJcC5zdHJpbmcoKSwgbG9jYWxQb3J0ICsgMSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgic3VjY2VlZCB0byBiaW5kIHJ0Y3AgJXM6JWQiLCBsb2NhbElwLnN0cmluZygpLCBsb2NhbFBvcnQgKyAxKTsKKyAgICB9Cit9CisKKy8vIFRPRE8gOiBEZXZlbG9wIG1vcmUgYWR2YW5jZWQgbW9kZXJhdG9yIGJhc2VkIG9uIEFTICYgVE1NQlIgdmFsdWUKK3ZvaWQgQVJUUFdyaXRlcjo6TW9kZXJhdGVJbnN0YW50VHJhZmZpYyh1aW50MzJfdCBzYW1wbGVQZXJpb2QsIHVpbnQzMl90IGxpbWl0Qnl0ZXMpIHsKKyAgICB1bnNpZ25lZCBpbnQgYnl0ZXMgPSAgbVRyYWZmaWNSZWMtPnJlYWRCeXRlc0Zvckxhc3RQZXJpb2Qoc2FtcGxlUGVyaW9kKTsKKyAgICBpZiAoYnl0ZXMgPiBsaW1pdEJ5dGVzKSB7CisgICAgICAgIEFMT0dJKCJOdWNsZWFyIG1vZGVyYXRvci4gI3NlcSA9ICVkIFx0XHQgJWQgYml0cyAvIDEwbXMiLAorICAgICAgICAgICAgICBtU2VxTm8sIGJ5dGVzICogOCk7CisgICAgICAgIHVzbGVlcCg0MDAwKTsKKyAgICAgICAgbVRyYWZmaWNSZWMtPnVwZGF0ZUNsb2NrKEFMb29wZXI6OkdldE5vd1VzKCkgLyAxMDAwKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oCmluZGV4IDJmMTM0ODYuLjI4ZDZlYzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oCkBAIC0yNyw2ICsyNyw5IEBACiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9tdWx0aW5ldHdvcmsuaD4KKyNpbmNsdWRlICJUcmFmZmljUmVjb3JkZXIuaCIKKwogI2RlZmluZSBMT0dfVE9fRklMRVMgICAgMAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0zNiwxNCArMzksMjQgQEAKIAogc3RydWN0IEFSVFBXcml0ZXIgOiBwdWJsaWMgTWVkaWFXcml0ZXIgewogICAgIGV4cGxpY2l0IEFSVFBXcml0ZXIoaW50IGZkKTsKKyAgICBleHBsaWNpdCBBUlRQV3JpdGVyKGludCBmZCwgU3RyaW5nOCYgbG9jYWxJcCwgaW50IGxvY2FsUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCYgcmVtb3RlSXAsIGludCByZW1vdGVQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZXFObyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CiAgICAgdmlydHVhbCBib29sIHJlYWNoZWRFT1MoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKyAgICB2b2lkIHVwZGF0ZUNWT0RlZ3JlZXMoaW50MzJfdCBjdm9EZWdyZWVzKTsKKyAgICB2b2lkIHVwZGF0ZVBheWxvYWRUeXBlKGludDMyX3QgcGF5bG9hZFR5cGUpOworICAgIHZvaWQgdXBkYXRlU29ja2V0RHNjcChpbnQzMl90IGRzY3ApOworICAgIHZvaWQgdXBkYXRlU29ja2V0TmV0d29yayhpbnQ2NF90IHNvY2tldE5ldHdvcmspOworICAgIHVpbnQzMl90IGdldFNlcXVlbmNlTnVtKCk7CisgICAgdmlydHVhbCB1aW50NjRfdCBnZXRBY2N1bXVsYXRpdmVCeXRlcygpIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0VE1NQk5JbmZvKHVpbnQzMl90IG9wcG9uZW50SUQsIHVpbnQzMl90IGJpdHJhdGUpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QVJUUFdyaXRlcigpOwpAQCAtNzYsMTUgKzg5LDI3IEBACiAgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKICAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxBUlRQV3JpdGVyPiA+IG1SZWZsZWN0b3I7CiAKLSAgICBpbnQgbVNvY2tldDsKKyAgICBib29sIG1Jc0lQdjY7CisgICAgaW50IG1SVFBTb2NrZXQsIG1SVENQU29ja2V0OworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBtTG9jYWxBZGRyOwogICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBtUlRQQWRkcjsKICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbVJUQ1BBZGRyOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgbUxvY2FsQWRkcjY7CisgICAgc3RydWN0IHNvY2thZGRyX2luNiBtUlRQQWRkcjY7CisgICAgc3RydWN0IHNvY2thZGRyX2luNiBtUlRDUEFkZHI2OworICAgIGludDMyX3QgbVJ0cExheWVyM0RzY3A7CisgICAgbmV0X2hhbmRsZV90IG1SVFBTb2NrTmV0d29yazsKIAogICAgIEFTdHJpbmcgbVByb2ZpbGVMZXZlbDsKICAgICBBU3RyaW5nIG1TZXFQYXJhbVNldDsKICAgICBBU3RyaW5nIG1QaWNQYXJhbVNldDsKIAorICAgIE1lZGlhQnVmZmVyQmFzZSAqbVZQU0J1ZjsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKm1TUFNCdWY7CisgICAgTWVkaWFCdWZmZXJCYXNlICptUFBTQnVmOworCiAgICAgdWludDMyX3QgbVNvdXJjZUlEOworICAgIHVpbnQzMl90IG1QYXlsb2FkVHlwZTsKICAgICB1aW50MzJfdCBtU2VxTm87CiAgICAgdWludDMyX3QgbVJUUFRpbWVCYXNlOwogICAgIHVpbnQzMl90IG1OdW1SVFBTZW50OwpAQCAtOTIsMTAgKzExNywxOCBAQAogICAgIHVpbnQzMl90IG1MYXN0UlRQVGltZTsKICAgICB1aW50NjRfdCBtTGFzdE5UUFRpbWU7CiAKKyAgICB1aW50MzJfdCBtT3Bwb25lbnRJRDsKKyAgICB1aW50MzJfdCBtQml0cmF0ZTsKKyAgICB0eXBlZGVmIHVpbnQ2NF90IEJ5dGVzOworICAgIHNwPFRyYWZmaWNSZWNvcmRlcjx1aW50MzJfdCAvKiBUaW1lICovLCBCeXRlcz4gPiBtVHJhZmZpY1JlYzsKKwogICAgIGludDMyX3QgbU51bVNSc1NlbnQ7CisgICAgaW50MzJfdCBtUlRQQ1ZPRXh0TWFwOworICAgIGludDMyX3QgbVJUUENWT0RlZ3JlZXM7CiAKICAgICBlbnVtIHsKICAgICAgICAgSU5WQUxJRCwKKyAgICAgICAgSDI2NSwKICAgICAgICAgSDI2NCwKICAgICAgICAgSDI2MywKICAgICAgICAgQU1SX05CLApAQCAtMTA0LDIyICsxMzcsMjkgQEAKIAogICAgIHN0YXRpYyB1aW50NjRfdCBHZXROb3dOVFAoKTsKIAorICAgIHZvaWQgaW5pdFN0YXRlKCk7CiAgICAgdm9pZCBvblJlYWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgb25TZW5kU1IoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgdm9pZCBhZGRTUihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKICAgICB2b2lkIGFkZFNERVMoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisgICAgdm9pZCBhZGRUTU1CTihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKIAogICAgIHZvaWQgbWFrZUgyNjRTUHJvcFBhcmFtU2V0cyhNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CiAgICAgdm9pZCBkdW1wU2Vzc2lvbkRlc2MoKTsKIAogICAgIHZvaWQgc2VuZEJ5ZSgpOworICAgIHZvaWQgc2VuZFZQU1NQU1BQU0lmSUZyYW1lKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWYsIGludDY0X3QgdGltZVVzKTsKKyAgICB2b2lkIHNlbmRTUFNQUFNJZklGcmFtZShNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmLCBpbnQ2NF90IHRpbWVVcyk7CisgICAgdm9pZCBzZW5kSEVWQ0RhdGEoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1Zik7CiAgICAgdm9pZCBzZW5kQVZDRGF0YShNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmKTsKICAgICB2b2lkIHNlbmRIMjYzRGF0YShNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmKTsKICAgICB2b2lkIHNlbmRBTVJEYXRhKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWYpOwogCiAgICAgdm9pZCBzZW5kKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIGJvb2wgaXNSVENQKTsKKyAgICB2b2lkIG1ha2VTb2NrZXRQYWlyQW5kQmluZChTdHJpbmc4JiBsb2NhbElwLCBpbnQgbG9jYWxQb3J0LCBTdHJpbmc4JiByZW1vdGVJcCwgaW50IHJlbW90ZVBvcnQpOwogCisgICAgdm9pZCBNb2RlcmF0ZUluc3RhbnRUcmFmZmljKHVpbnQzMl90IHNhbXBsZVBlcmlvZCwgdWludDMyX3QgbGltaXRCeXRlcyk7CiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQVJUUFdyaXRlcik7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKaW5kZXggYmI2NmY0Yy4uYzMzYmYzZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcApAQCAtMzI5LDYgKzMyOSw3IEBACiAgICAgbVBhc3MuY2xlYXIoKTsKICAgICBtQXV0aFR5cGUgPSBOT05FOwogICAgIG1Ob25jZS5jbGVhcigpOworICAgIG1SZWFsbS5jbGVhcigpOwogCiAgICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOwogfQpAQCAtOTExLDYgKzkxMiwxNCBAQAogICAgICAgICBDSEVDS19HRShqLCAwKTsKIAogICAgICAgICBtTm9uY2Uuc2V0VG8odmFsdWUsIGkgKyA3LCBqIC0gaSAtIDcpOworCisgICAgICAgIGkgPSB2YWx1ZS5maW5kKCJyZWFsbT0iKTsKKyAgICAgICAgQ0hFQ0tfR0UoaSwgMCk7CisgICAgICAgIENIRUNLX0VRKHZhbHVlLmNfc3RyKClbaSArIDZdLCAnXCInKTsKKyAgICAgICAgaiA9IHZhbHVlLmZpbmQoIlwiIiwgaSArIDcpOworICAgICAgICBDSEVDS19HRShqLCAwKTsKKworICAgICAgICBtUmVhbG0uc2V0VG8odmFsdWUsIGkgKyA3LCBqIC0gaSAtIDcpOwogICAgIH0KIAogICAgIHJldHVybiB0cnVlOwpAQCAtOTkzLDcgKzEwMDIsNyBAQAogICAgIEFTdHJpbmcgQTE7CiAgICAgQTEuYXBwZW5kKG1Vc2VyKTsKICAgICBBMS5hcHBlbmQoIjoiKTsKLSAgICBBMS5hcHBlbmQoIlN0cmVhbWluZyBTZXJ2ZXIiKTsKKyAgICBBMS5hcHBlbmQobVJlYWxtKTsKICAgICBBMS5hcHBlbmQoIjoiKTsKICAgICBBMS5hcHBlbmQobVBhc3MpOwogCkBAIC0xMDI5LDYgKzEwMzgsOSBAQAogICAgIGZyYWdtZW50LmFwcGVuZCgiXCIsICIpOwogICAgIGZyYWdtZW50LmFwcGVuZCgicmVzcG9uc2U9XCIiKTsKICAgICBmcmFnbWVudC5hcHBlbmQoZGlnZXN0KTsKKyAgICBmcmFnbWVudC5hcHBlbmQoIlwiLCAiKTsKKyAgICBmcmFnbWVudC5hcHBlbmQoInJlYWxtPVwiIik7CisgICAgZnJhZ21lbnQuYXBwZW5kKG1SZWFsbSk7CiAgICAgZnJhZ21lbnQuYXBwZW5kKCJcIiIpOwogICAgIGZyYWdtZW50LmFwcGVuZCgiXHJcbiIpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uaAppbmRleCA1NmI2MDRkLi43Y2RkNGMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmgKQEAgLTg0LDYgKzg0LDcgQEAKICAgICBBU3RyaW5nIG1Vc2VyLCBtUGFzczsKICAgICBBdXRoVHlwZSBtQXV0aFR5cGU7CiAgICAgQVN0cmluZyBtTm9uY2U7CisgICAgQVN0cmluZyBtUmVhbG07CiAgICAgaW50IG1Tb2NrZXQ7CiAgICAgaW50MzJfdCBtQ29ubmVjdGlvbklEOwogICAgIGludDMyX3QgbU5leHRDU2VxOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKaW5kZXggMmI0MjA0MC4uNWI1YjRiMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCkBAIC0yNyw2ICsyNyw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY29uc3RleHByIHVuc2lnbmVkIGtEZWZhdWx0QXMgPSA5NjA7IC8vIGticHM/CisKIEFTZXNzaW9uRGVzY3JpcHRpb246OkFTZXNzaW9uRGVzY3JpcHRpb24oKQogICAgIDogbUlzVmFsaWQoZmFsc2UpIHsKIH0KQEAgLTEwMyw3ICsxMDUsNyBAQAogICAgICAgICAgICAgICAgICAgICBrZXkuc2V0VG8obGluZSwgMCwgY29sb25Qb3MpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gImE9Zm10cCIgfHwga2V5ID09ICJhPXJ0cG1hcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBrZXkgPT0gImE9ZnJhbWVzaXplIikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGtleSA9PSAiYT1mcmFtZXNpemUiIHx8IGtleSA9PSAiYT1leHRtYXAiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IHNwYWNlUG9zID0gbGluZS5maW5kKCIgIiwgY29sb25Qb3MgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFjZVBvcyA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0yMDEsNiArMjAzLDMzIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgQVNlc3Npb25EZXNjcmlwdGlvbjo6Z2V0Q3ZvRXh0TWFwKAorICAgICAgICBzaXplX3QgaW5kZXgsIGludDMyX3QgKmN2b0V4dE1hcCkgY29uc3QgeworICAgIENIRUNLX0dFKGluZGV4LCAwdSk7CisgICAgQ0hFQ0tfTFQoaW5kZXgsIG1UcmFja3Muc2l6ZSgpKTsKKworICAgIEFTdHJpbmcga2V5LCB2YWx1ZTsKKyAgICAqY3ZvRXh0TWFwID0gMDsKKworICAgIGNvbnN0IEF0dHJpYnMgJnRyYWNrID0gbVRyYWNrcy5pdGVtQXQoaW5kZXgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdHJhY2suc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgdmFsdWUgPSB0cmFjay52YWx1ZUF0KGkpOworICAgICAgICBpZiAodmFsdWUuc2l6ZSgpID4gMCAmJiBzdHJjbXAodmFsdWUuY19zdHIoKSwgInVybjozZ3BwOnZpZGVvLW9yaWVudGF0aW9uIikgPT0gMCkgeworICAgICAgICAgICAga2V5ID0gdHJhY2sua2V5QXQoaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChrZXkuc2l6ZSgpID4gMCkgeworICAgICAgICBjb25zdCBjaGFyICpjb2xvblBvcyA9IHN0cnJjaHIoa2V5LmNfc3RyKCksICc6Jyk7CisgICAgICAgIGNvbG9uUG9zKys7CisgICAgICAgICpjdm9FeHRNYXAgPSBhdG9pKGNvbG9uUG9zKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCiB2b2lkIEFTZXNzaW9uRGVzY3JpcHRpb246OmdldEZvcm1hdFR5cGUoCiAgICAgICAgIHNpemVfdCBpbmRleCwgdW5zaWduZWQgbG9uZyAqUFQsCiAgICAgICAgIEFTdHJpbmcgKmRlc2MsIEFTdHJpbmcgKnBhcmFtcykgY29uc3QgewpAQCAtMzQ1LDUgKzM3NCw3NCBAQAogICAgIHJldHVybiAqbnB0MiA+ICpucHQxOwogfQogCisvLyBzdGF0aWMKK3ZvaWQgQVNlc3Npb25EZXNjcmlwdGlvbjo6U0RQU3RyaW5nRmFjdG9yeShBU3RyaW5nICZzZHAsCisgICAgICAgIGNvbnN0IGNoYXIgKmlwLCBib29sIGlzQXVkaW8sIHVuc2lnbmVkIHBvcnQsIHVuc2lnbmVkIHBheWxvYWRUeXBlLAorICAgICAgICB1bnNpZ25lZCBhcywgY29uc3QgY2hhciAqY29kZWMsIGNvbnN0IGNoYXIgKmZtdHAsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGN2b0V4dE1hcCkKK3sKKyAgICBib29sIGlzSVB2NCA9IChBU3RyaW5nKGlwKS5maW5kKCI6OiIpID09IC0xKSA/IHRydWUgOiBmYWxzZTsKKyAgICBzZHAuY2xlYXIoKTsKKyAgICBzZHAuYXBwZW5kKCJ2PTBcclxuIik7CisKKyAgICBzZHAuYXBwZW5kKCJhPXJhbmdlOm5wdD1ub3ctXHJcbiIpOworCisgICAgc2RwLmFwcGVuZCgibT0iKTsKKyAgICBzZHAuYXBwZW5kKGlzQXVkaW8gPyAiYXVkaW8gIiA6ICJ2aWRlbyAiKTsKKyAgICBzZHAuYXBwZW5kKHBvcnQpOworICAgIHNkcC5hcHBlbmQoIiBSVFAvQVZQICIpOworICAgIHNkcC5hcHBlbmQocGF5bG9hZFR5cGUpOworICAgIHNkcC5hcHBlbmQoIlxyXG4iKTsKKworICAgIHNkcC5hcHBlbmQoImM9IElOIElQIik7CisgICAgaWYgKGlzSVB2NCkgeworICAgICAgICBzZHAuYXBwZW5kKCI0ICIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNkcC5hcHBlbmQoIjYgIik7CisgICAgfQorICAgIHNkcC5hcHBlbmQoaXApOworICAgIHNkcC5hcHBlbmQoIlxyXG4iKTsKKworICAgIHNkcC5hcHBlbmQoImI9QVM6Iik7CisgICAgc2RwLmFwcGVuZChhcyA+IDAgPyBhcyA6IGtEZWZhdWx0QXMpOworICAgIHNkcC5hcHBlbmQoIlxyXG4iKTsKKworICAgIHNkcC5hcHBlbmQoImE9cnRwbWFwOiIpOworICAgIHNkcC5hcHBlbmQocGF5bG9hZFR5cGUpOworICAgIHNkcC5hcHBlbmQoIiAiKTsKKyAgICBzZHAuYXBwZW5kKGNvZGVjKTsKKyAgICBzZHAuYXBwZW5kKCIvIik7CisgICAgc2RwLmFwcGVuZChpc0F1ZGlvID8gIjgwMDAiIDogIjkwMDAwIik7CisgICAgc2RwLmFwcGVuZCgiXHJcbiIpOworCisgICAgaWYgKGZtdHAgIT0gTlVMTCkgeworICAgICAgICBzZHAuYXBwZW5kKCJhPWZtdHA6Iik7CisgICAgICAgIHNkcC5hcHBlbmQocGF5bG9hZFR5cGUpOworICAgICAgICBzZHAuYXBwZW5kKCIgIik7CisgICAgICAgIHNkcC5hcHBlbmQoZm10cCk7CisgICAgICAgIHNkcC5hcHBlbmQoIlxyXG4iKTsKKyAgICB9CisKKyAgICBpZiAoIWlzQXVkaW8gJiYgd2lkdGggPiAwICYmIGhlaWdodCA+IDApIHsKKyAgICAgICAgc2RwLmFwcGVuZCgiYT1mcmFtZXNpemU6Iik7CisgICAgICAgIHNkcC5hcHBlbmQocGF5bG9hZFR5cGUpOworICAgICAgICBzZHAuYXBwZW5kKCIgIik7CisgICAgICAgIHNkcC5hcHBlbmQod2lkdGgpOworICAgICAgICBzZHAuYXBwZW5kKCItIik7CisgICAgICAgIHNkcC5hcHBlbmQoaGVpZ2h0KTsKKyAgICAgICAgc2RwLmFwcGVuZCgiXHJcbiIpOworICAgIH0KKworICAgIGlmIChjdm9FeHRNYXAgPiAwKSB7CisgICAgICAgIHNkcC5hcHBlbmQoImE9ZXh0bWFwOiIpOworICAgICAgICBzZHAuYXBwZW5kKGN2b0V4dE1hcCk7CisgICAgICAgIHNkcC5hcHBlbmQoIiAiKTsKKyAgICAgICAgc2RwLmFwcGVuZCgidXJuOjNncHA6dmlkZW8tb3JpZW50YXRpb24iKTsKKyAgICAgICAgc2RwLmFwcGVuZCgiXHJcbiIpOworICAgIH0KKworICAgIEFMT0dWKCJTRFBTdHJpbmdGYWN0b3J5ID0+ICVzIiwgc2RwLmNfc3RyKCkpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5oCmluZGV4IGI0NjI5ODMuLjkxZjU0NDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5oCkBAIC00MCw2ICs0MCw4IEBACiAgICAgc2l6ZV90IGNvdW50VHJhY2tzKCkgY29uc3Q7CiAgICAgdm9pZCBnZXRGb3JtYXQoc2l6ZV90IGluZGV4LCBBU3RyaW5nICp2YWx1ZSkgY29uc3Q7CiAKKyAgICBib29sIGdldEN2b0V4dE1hcChzaXplX3QgaW5kZXgsIGludDMyX3QgKmN2b0V4dE1hcCkgY29uc3Q7CisKICAgICB2b2lkIGdldEZvcm1hdFR5cGUoCiAgICAgICAgICAgICBzaXplX3QgaW5kZXgsIHVuc2lnbmVkIGxvbmcgKlBULAogICAgICAgICAgICAgQVN0cmluZyAqZGVzYywgQVN0cmluZyAqcGFyYW1zKSBjb25zdDsKQEAgLTYzLDYgKzY1LDkgQEAKICAgICAvLyBpLmUuIHdlIGhhdmUgYSBmaXhlZCBkdXJhdGlvbiwgb3RoZXJ3aXNlIHRoaXMgaXMgbGl2ZSBzdHJlYW1pbmcuCiAgICAgc3RhdGljIGJvb2wgcGFyc2VOVFBSYW5nZShjb25zdCBjaGFyICpzLCBmbG9hdCAqbnB0MSwgZmxvYXQgKm5wdDIpOwogCisgICAgc3RhdGljIHZvaWQgU0RQU3RyaW5nRmFjdG9yeShBU3RyaW5nICZzZHAsIGNvbnN0IGNoYXIgKmlwLCBib29sIGlzQXVkaW8sIHVuc2lnbmVkIHBvcnQsCisgICAgICAgIHVuc2lnbmVkIHBheWxvYWRUeXBlLCB1bnNpZ25lZCBhcywgY29uc3QgY2hhciAqY29kZWMsIGNvbnN0IGNoYXIgKmZtdHAgPSBOVUxMLAorICAgICAgICBpbnQzMl90IHdpZHRoID0gMCwgaW50MzJfdCBoZWlnaHQgPSAwLCBpbnQzMl90IGN2b0V4dE1hcCA9IDApOwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFTZXNzaW9uRGVzY3JpcHRpb24oKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLmJwCmluZGV4IGE1YTg5NWUuLmRjYWRiYWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAKQEAgLTEsOSArMSwyOSBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X3J0c3BfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfcnRzcF9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19kZWZhdWx0cyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3J0c3BfZGVmYXVsdHMiLAogCiAgICAgc3JjczogWwogICAgICAgICAiQUFNUkFzc2VtYmxlci5jcHAiLAogICAgICAgICAiQUFWQ0Fzc2VtYmxlci5jcHAiLAorICAgICAgICAiQUhFVkNBc3NlbWJsZXIuY3BwIiwKICAgICAgICAgIkFIMjYzQXNzZW1ibGVyLmNwcCIsCiAgICAgICAgICJBTVBFRzJUU0Fzc2VtYmxlci5jcHAiLAogICAgICAgICAiQU1QRUc0QXVkaW9Bc3NlbWJsZXIuY3BwIiwKQEAgLTIwLDYgKzQwLDcgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFuZHJvaWRfbmV0IiwKICAgICAgICAgImxpYmNyeXB0byIsCiAgICAgICAgICJsaWJkYXRhc291cmNlIiwKICAgICAgICAgImxpYm1lZGlhIiwKQEAgLTI4LDYgKzQ5LDcgQEAKICAgICBpbmNsdWRlX2RpcnM6IFsKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKKyAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZCIsCiAgICAgXSwKIAogICAgIGFyY2g6IHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCmluZGV4IDdmMDI1YTUuLjBmZGY0MzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaApAQCAtMTAzMiw2ICsxMDMyLDExIEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGludDMyX3QgcnRjcEV2ZW50OworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigicnRjcC1ldmVudCIsICZydGNwRXZlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICsrbU51bUFjY2Vzc1VuaXRzUmVjZWl2ZWQ7CiAgICAgICAgICAgICAgICAgcG9zdEFjY2Vzc1VuaXRUaW1lb3V0Q2hlY2soKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwCmluZGV4IGNjMzZiNzguLmMwNTNiZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5jcHAKQEAgLTE0LDYgKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKwogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJOZXR3b3JrVXRpbHMiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1F1YWxNYW5hZ2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvUXVhbE1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YWEzMjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1F1YWxNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiUXVhbE1hbmFnZXIiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlF1YWxNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworUXVhbE1hbmFnZXI6OldhdGNoZXI6OldhdGNoZXIoaW50MzJfdCB0aW1lTGltaXQpCisgICAgOiBUaHJlYWQoZmFsc2UpLCBtV2F0Y2hpbmcoZmFsc2UpLCBtU3dpdGNoKGZhbHNlKSwKKyAgICAgIG1UaW1lTGltaXQodGltZUxpbWl0ICogMTAwMDAwMExMKSAgICAgLy8gdGltZUxpbWl0IG1zCit7Cit9CisKK2Jvb2wgUXVhbE1hbmFnZXI6OldhdGNoZXI6OmlzRXhwaXJlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Td2l0Y2g7Cit9CisKK3ZvaWQgUXVhbE1hbmFnZXI6OldhdGNoZXI6OnNldHVwKCkgeworICAgIEF1dG9NdXRleCBfbChtTXlMb2NrKTsKKyAgICBpZiAobVdhdGNoaW5nID09IGZhbHNlKSB7CisgICAgICAgIG1XYXRjaGluZyA9IHRydWU7CisgICAgICAgIG1NeUNvbmQuc2lnbmFsKCk7CisgICAgfQorfQorCit2b2lkIFF1YWxNYW5hZ2VyOjpXYXRjaGVyOjpyZWxlYXNlKCkgeworICAgIEF1dG9NdXRleCBfbChtTXlMb2NrKTsKKyAgICBpZiAobVN3aXRjaCkgeworICAgICAgICBBTE9HVygiJXMgRElTQVJNRUQiLCBuYW1lKTsKKyAgICAgICAgbVN3aXRjaCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAobVdhdGNoaW5nID09IHRydWUpIHsKKyAgICAgICAgQUxPR1coIiVzIERJU0FSTUVEIiwgbmFtZSk7CisgICAgICAgIG1XYXRjaGluZyA9IGZhbHNlOworICAgICAgICBtTXlDb25kLnNpZ25hbCgpOworICAgIH0KK30KKwordm9pZCBRdWFsTWFuYWdlcjo6V2F0Y2hlcjo6ZXhpdCgpIHsKKyAgICBBdXRvTXV0ZXggX2wobU15TG9jayk7CisgICAgLy8gVGhlIG9yZGVyIGlzIGltcG9ydGFudCB0byBhdm9pZCBkZWFkIGxvY2suCisgICAgVGhyZWFkOjpyZXF1ZXN0RXhpdCgpOworICAgIG1NeUNvbmQuc2lnbmFsKCk7Cit9CisKK1F1YWxNYW5hZ2VyOjpXYXRjaGVyOjp+V2F0Y2hlcigpIHsKKyAgICBBTE9HSSgiJXMgdGhyZWFkIGRlYWQiLCBuYW1lKTsKK30KKworYm9vbCBRdWFsTWFuYWdlcjo6V2F0Y2hlcjo6dGhyZWFkTG9vcCgpIHsKKyAgICBBdXRvTXV0ZXggX2wobU15TG9jayk7CisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisgICAgcHJjdGwoUFJfR0VUX05BTUUsIG5hbWUsIDAsIDAsIDApOworI2VuZGlmCisgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKSB7CisgICAgICAgIEFMT0dXKCIlcyBUaW1lciBpbml0IiwgbmFtZSk7CisgICAgICAgIG1NeUNvbmQud2FpdChtTXlMb2NrKTsgICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdHMgYXMgbm9uLXdhdGNoaW5nIHN0YXRlCisgICAgICAgIGlmIChleGl0UGVuZGluZygpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBBTE9HVygiJXMgdGltZXIgQk9PTSBhZnRlciAlZCBtc2VjIiwgbmFtZSwgKGludCkobVRpbWVMaW1pdCAvIDEwMDAwMDBMTCkpOworICAgICAgICBtTXlDb25kLndhaXRSZWxhdGl2ZShtTXlMb2NrLCBtVGltZUxpbWl0KTsgIC8vIHdhaXRzIGFzIHdhdGNoaW5nIHNhdHRlCisgICAgICAgIGlmIChtV2F0Y2hpbmcgPT0gdHJ1ZSkgeworICAgICAgICAgICAgbVN3aXRjaCA9IHRydWU7CisgICAgICAgICAgICBBTE9HVygiJXMgQk9PTSEhISEiLCBuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBtV2F0Y2hpbmcgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisKK1F1YWxNYW5hZ2VyOjpRdWFsTWFuYWdlcigpCisgICAgOiBtTWluQml0cmF0ZSgtMSksIG1NYXhCaXRyYXRlKC0xKSwKKyAgICAgIG1UYXJnZXRCaXRyYXRlKDUxMjAwMCksIG1MYXN0VGFyZ2V0Qml0cmF0ZSgtMSksCisgICAgICBtTGFzdFNldEJpdHJhdGVUaW1lKDApLCBtSXNOZXdUYXJnZXRCaXRyYXRlKGZhbHNlKQoreworICAgIFZGUFdhdGNoZXIgPSBuZXcgV2F0Y2hlcigzMDAwKTsgICAgIC8vVmVyeSBGZXcgUGFja2V0IFdhdGNoZXIKKyAgICBWRlBXYXRjaGVyLT5ydW4oIlZlcnlGZXdQdGsiKTsKKyAgICBMQlJXYXRjaGVyID0gbmV3IFdhdGNoZXIoMTAwMDApOyAgICAvL0xvdyBCaXQgUmF0ZSBXYXRjaGVyCisgICAgTEJSV2F0Y2hlci0+cnVuKCJMb3dCaXRSYXRlIik7Cit9CisKK1F1YWxNYW5hZ2VyOjp+UXVhbE1hbmFnZXIoKSB7CisgICAgVkZQV2F0Y2hlci0+ZXhpdCgpOworICAgIExCUldhdGNoZXItPmV4aXQoKTsKK30KKworaW50MzJfdCBRdWFsTWFuYWdlcjo6Z2V0VGFyZ2V0Qml0cmF0ZSgpIHsKKyAgICBpZiAobUlzTmV3VGFyZ2V0Qml0cmF0ZSkgeworICAgICAgICBtSXNOZXdUYXJnZXRCaXRyYXRlID0gZmFsc2U7CisgICAgICAgIG1MYXN0VGFyZ2V0Qml0cmF0ZSA9IGNsYW1waW5nQml0cmF0ZShtVGFyZ2V0Qml0cmF0ZSk7CisgICAgICAgIG1UYXJnZXRCaXRyYXRlID0gbUxhc3RUYXJnZXRCaXRyYXRlOworICAgICAgICByZXR1cm4gbVRhcmdldEJpdHJhdGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworYm9vbCBRdWFsTWFuYWdlcjo6aXNOZWVkVG9Eb3duZ3JhZGUoKSB7CisgICAgcmV0dXJuIExCUldhdGNoZXItPmlzRXhwaXJlZCgpOworfQorCit2b2lkIFF1YWxNYW5hZ2VyOjpzZXRUYXJnZXRCaXRyYXRlKHVpbnQ4X3QgZnJhY3Rpb24sIGludDY0X3Qgbm93VXMsIGJvb2wgaXNUb29Mb3dQa3RzKSB7CisgICAgLyogVG9vIExvdyBQYWNrZXQuIE1heWJlIG9wcG9uZW50IGlzIHN3aXRjaGluZyBjYW1lcmEuCisgICAgICogSWYgdGhpcyBjb25kaXRpb24gZ29lcyBsb25nZXIsIHdlIHNob3VsZCBkb3duIGJpdHJhdGUuCisgICAgICovCisgICAgaWYgKGlzVG9vTG93UGt0cykgeworICAgICAgICBWRlBXYXRjaGVyLT5zZXR1cCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIFZGUFdhdGNoZXItPnJlbGVhc2UoKTsKKyAgICB9CisKKyAgICBpZiAoKGZyYWN0aW9uID4gKDI1NiAqIDUgLyAxMDApICYmICFpc1Rvb0xvd1BrdHMpIHx8IFZGUFdhdGNoZXItPmlzRXhwaXJlZCgpKSB7CisgICAgICAgIC8vIGxvc3MgbW9yZSB0aGFuIDUlICAgICAgICAgICAgICAgICAgICAgICAgICBvciAgVkZQV2F0Y2hlciBCT09NRUQKKyAgICAgICAgbVRhcmdldEJpdHJhdGUgLT0gbUJpdHJhdGVTdGVwICogMzsKKyAgICB9IGVsc2UgaWYgKGZyYWN0aW9uIDw9ICgyNTYgKiAyIC8xMDApKSB7CisgICAgICAgIC8vIGxvc3MgbGVzcyB0aGFuIDIlCisgICAgICAgIG1UYXJnZXRCaXRyYXRlICs9IG1CaXRyYXRlU3RlcDsKKyAgICB9CisKKyAgICBpZiAobVRhcmdldEJpdHJhdGUgPiBtTWF4Qml0cmF0ZSkgeworICAgICAgICBtVGFyZ2V0Qml0cmF0ZSA9IG1NYXhCaXRyYXRlICsgbUJpdHJhdGVTdGVwOworICAgIH0gZWxzZSBpZiAobVRhcmdldEJpdHJhdGUgPCBtTWluQml0cmF0ZSkgeworICAgICAgICBMQlJXYXRjaGVyLT5zZXR1cCgpOworICAgICAgICBtVGFyZ2V0Qml0cmF0ZSA9IG1NaW5CaXRyYXRlIC0gbUJpdHJhdGVTdGVwOworICAgIH0KKworICAgIGlmIChtTGFzdFRhcmdldEJpdHJhdGUgIT0gY2xhbXBpbmdCaXRyYXRlKG1UYXJnZXRCaXRyYXRlKSB8fAorICAgICAgICBub3dVcyAtIG1MYXN0U2V0Qml0cmF0ZVRpbWUgPiA1MDAwMDAwbGwpIHsKKyAgICAgICAgbUlzTmV3VGFyZ2V0Qml0cmF0ZSA9IHRydWU7CisgICAgICAgIG1MYXN0U2V0Qml0cmF0ZVRpbWUgPSBub3dVczsKKyAgICB9Cit9CisKK3ZvaWQgUXVhbE1hbmFnZXI6OnNldE1pbk1heEJpdHJhdGUoaW50MzJfdCBtaW4sIGludDMyX3QgbWF4KSB7CisgICAgbU1pbkJpdHJhdGUgPSBtaW47CisgICAgbU1heEJpdHJhdGUgPSBtYXg7CisgICAgbUJpdHJhdGVTdGVwID0gKG1heCAtIG1pbikgLyA4OworfQorCit2b2lkIFF1YWxNYW5hZ2VyOjpzZXRCaXRyYXRlRGF0YShpbnQzMl90IGJpdHJhdGUsIGludDY0X3QgLypub3cqLykgeworICAgIC8vIEEgYml0cmF0ZSB0aGF0IGlzIGNvbnNpZGVyZWQgcGFja2V0bG9zcyBhbHNvIHNob3VsZCBiZSBnb29kLgorICAgIGlmIChiaXRyYXRlID49IG1NaW5CaXRyYXRlICYmIG1UYXJnZXRCaXRyYXRlID49IG1NaW5CaXRyYXRlKSB7CisgICAgICAgIExCUldhdGNoZXItPnJlbGVhc2UoKTsKKyAgICB9IGVsc2UgaWYgKGJpdHJhdGUgPCBtTWluQml0cmF0ZSl7CisgICAgICAgIExCUldhdGNoZXItPnNldHVwKCk7CisgICAgfQorfQorCitpbnQzMl90IFF1YWxNYW5hZ2VyOjpjbGFtcGluZ0JpdHJhdGUoaW50MzJfdCBiaXRyYXRlKSB7CisgICAgcmV0dXJuIHN0ZDo6bWluKHN0ZDo6bWF4KG1NaW5CaXRyYXRlLCBiaXRyYXRlKSwgbU1heEJpdHJhdGUpOworfQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9RdWFsTWFuYWdlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9RdWFsTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZGM5MjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1F1YWxNYW5hZ2VyLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUVVBTF9NQU5BR0VSX0hfCisKKyNkZWZpbmUgUVVBTF9NQU5BR0VSX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworY2xhc3MgUXVhbE1hbmFnZXIgeworcHVibGljOgorICAgIFF1YWxNYW5hZ2VyKCk7CisgICAgflF1YWxNYW5hZ2VyKCk7CisKKyAgICBpbnQzMl90IGdldFRhcmdldEJpdHJhdGUoKTsKKyAgICBib29sIGlzTmVlZFRvRG93bmdyYWRlKCk7CisKKyAgICB2b2lkIHNldFRhcmdldEJpdHJhdGUodWludDhfdCBmcmFjdGlvbiwgaW50NjRfdCBub3dVcywgYm9vbCBpc1Rvb0xvd1BrdHMpOworICAgIHZvaWQgc2V0TWluTWF4Qml0cmF0ZShpbnQzMl90IG1pbiwgaW50MzJfdCBtYXgpOworICAgIHZvaWQgc2V0Qml0cmF0ZURhdGEoaW50MzJfdCBiaXRyYXRlLCBpbnQ2NF90IG5vdyk7Citwcml2YXRlOgorICAgIGNsYXNzIFdhdGNoZXIgOiBwdWJsaWMgVGhyZWFkCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgV2F0Y2hlcihpbnQzMl90IHRpbWVMaW1pdCk7CisKKyAgICAgICAgdm9pZCBzZXR1cCgpOworICAgICAgICB2b2lkIHJlbGVhc2UoKTsKKyAgICAgICAgdm9pZCBleGl0KCk7CisgICAgICAgIGJvb2wgaXNFeHBpcmVkKCkgY29uc3Q7CisgICAgcHJpdmF0ZToKKyAgICAgICAgdmlydHVhbCB+V2F0Y2hlcigpOworICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOworCisgICAgICAgIGNoYXIgbmFtZVszMl0gPSB7MCx9OworCisgICAgICAgIENvbmRpdGlvbiBtTXlDb25kOworICAgICAgICBNdXRleCBtTXlMb2NrOworCisgICAgICAgIGJvb2wgbVdhdGNoaW5nOworICAgICAgICBib29sIG1Td2l0Y2g7CisgICAgICAgIGNvbnN0IG5zZWNzX3QgbVRpbWVMaW1pdDsKKyAgICB9OworICAgIHNwPFdhdGNoZXI+IFZGUFdhdGNoZXI7CisgICAgc3A8V2F0Y2hlcj4gTEJSV2F0Y2hlcjsKKyAgICBpbnQzMl90IG1NaW5CaXRyYXRlOworICAgIGludDMyX3QgbU1heEJpdHJhdGU7CisgICAgaW50MzJfdCBtQml0cmF0ZVN0ZXA7CisKKyAgICBpbnQzMl90IG1UYXJnZXRCaXRyYXRlOworICAgIGludDMyX3QgbUxhc3RUYXJnZXRCaXRyYXRlOworICAgIGludDY0X3QgbUxhc3RTZXRCaXRyYXRlVGltZTsKKworICAgIGJvb2wgbUlzTmV3VGFyZ2V0Qml0cmF0ZTsKKworICAgIGludDMyX3QgY2xhbXBpbmdCaXRyYXRlKGludDMyX3QgYml0cmF0ZSk7Cit9OworfSAvL25hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gUVVBTF9NQU5BR0VSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1RyYWZmaWNSZWNvcmRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9UcmFmZmljUmVjb3JkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmE4ZjkwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9UcmFmZmljUmVjb3JkZXIuaApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9UUkFGRklDX1JFQ09SREVSX0hfCisKKyNkZWZpbmUgQV9UUkFGRklDX1JFQ09SREVSX0hfCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBDaXJjdWxhciBhcnJheSB0byBzYXZlIHJlY2VudCBhbW91bnQgb2YgYnl0ZXMKK3RlbXBsYXRlIDxjbGFzcyBUaW1lLCBjbGFzcyBCeXRlcz4KK2NsYXNzIFRyYWZmaWNSZWNvcmRlciA6IHB1YmxpYyBSZWZCYXNlIHsKK3ByaXZhdGU6CisgICAgY29uc3RleHByIHN0YXRpYyBzaXplX3Qga01pbk51bUVudHJpZXMgPSA0OworICAgIGNvbnN0ZXhwciBzdGF0aWMgc2l6ZV90IGtNYXhOdW1FbnRyaWVzID0gMTAyNDsKKworICAgIHNpemVfdCBtU2l6ZTsKKyAgICBzaXplX3QgbVNpemVNYXNrOworICAgIFRpbWUgKm1UaW1lQXJyYXkgPSBOVUxMOworICAgIEJ5dGVzICptQnl0ZXNBcnJheSA9IE5VTEw7CisgICAgc2l6ZV90IG1IZWFkSWR4OworICAgIHNpemVfdCBtVGFpbElkeDsKKworICAgIGludCBtTGFzdFJlYWRJZHg7CisKKyAgICBjb25zdCBUaW1lIG1SZWNvcmRMaW1pdDsKKyAgICBUaW1lIG1DbG9jazsKKyAgICBUaW1lIG1MYXN0VGltZU9mUHJpbnQ7CisgICAgQnl0ZXMgbUFjY3VCeXRlczsKKworcHVibGljOgorICAgIFRyYWZmaWNSZWNvcmRlcihzaXplX3Qgc2l6ZSwgVGltZSBhY2N1VGltZUxpbWl0KTsKKyAgICB2aXJ0dWFsIH5UcmFmZmljUmVjb3JkZXIoKTsKKworICAgIHZvaWQgaW5pdCgpOworICAgIHZvaWQgdXBkYXRlQ2xvY2soVGltZSBub3cpOworICAgIEJ5dGVzIHJlYWRCeXRlc0ZvclRvdGFsKCk7CisgICAgQnl0ZXMgcmVhZEJ5dGVzRm9yTGFzdFBlcmlvZChUaW1lIHBlcmlvZCk7CisgICAgdm9pZCB3cml0ZUJ5dGVzKEJ5dGVzIGJ5dGVzKTsKKyAgICB2b2lkIHByaW50QWNjdUJpdHNGb3JMYXN0UGVyaW9kKFRpbWUgcGVyaW9kLCBUaW1lIHVuaXQpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFRpbWUsIGNsYXNzIEJ5dGVzPgorVHJhZmZpY1JlY29yZGVyPFRpbWUsIEJ5dGVzPjo6VHJhZmZpY1JlY29yZGVyKHNpemVfdCBzaXplLCBUaW1lIHJlY29yZExpbWl0KQorICAgIDogbVJlY29yZExpbWl0KHJlY29yZExpbWl0KSB7CisgICAgaWYgKHNpemUgPiBrTWF4TnVtRW50cmllcykgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIkxpbWl0aW5nIFRyYWZmaWNSZWNvcmRlciBzaXplIHRvICIgPDwga01heE51bUVudHJpZXM7CisgICAgICAgIHNpemUgPSBrTWF4TnVtRW50cmllczsKKyAgICB9IGVsc2UgaWYgKHNpemUgPCBrTWluTnVtRW50cmllcykgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIkxpbWl0aW5nIFRyYWZmaWNSZWNvcmRlciBzaXplIHRvICIgPDwga01heE51bUVudHJpZXM7CisgICAgICAgIHNpemUgPSBrTWluTnVtRW50cmllczsKKyAgICB9CisKKyAgICBzaXplX3QgZXhwID0gKChzaXplb2Yoc2l6ZV90KSA9PSA4KSA/CisgICAgICAgICAgICAgICAgICA2NCAtIF9fYnVpbHRpbl9jbHpsKHNpemUgLSAxKSA6CisgICAgICAgICAgICAgICAgICAzMiAtIF9fYnVpbHRpbl9jbHooc2l6ZSAtIDEpKTsKKyAgICBtU2l6ZSA9ICgxdWwgPDwgZXhwKTsgICAgICAgICAvLyBzaXplID0gMl5leHAKKyAgICBtU2l6ZU1hc2sgPSBtU2l6ZSAtIDE7CisKKyAgICBMT0coVkVSQk9TRSkgPDwgIlRyYWZmaWNSZWNvcmRlciBJbml0IHNpemUgIiA8PCBtU2l6ZTsKKyAgICBtVGltZUFycmF5ID0gbmV3IFRpbWVbbVNpemVdOworICAgIG1CeXRlc0FycmF5ID0gbmV3IEJ5dGVzW21TaXplXTsKKworICAgIGluaXQoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRpbWUsIGNsYXNzIEJ5dGVzPgorVHJhZmZpY1JlY29yZGVyPFRpbWUsIEJ5dGVzPjo6flRyYWZmaWNSZWNvcmRlcigpIHsKKyAgICBkZWxldGVbXSBtVGltZUFycmF5OworICAgIGRlbGV0ZVtdIG1CeXRlc0FycmF5OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVGltZSwgY2xhc3MgQnl0ZXM+Cit2b2lkIFRyYWZmaWNSZWNvcmRlcjxUaW1lLCBCeXRlcz46OmluaXQoKSB7CisgICAgbUhlYWRJZHggPSAwOworICAgIG1UYWlsSWR4ID0gbVNpemVNYXNrOworICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG1TaXplIDsgaSsrKSB7CisgICAgICAgIG1UaW1lQXJyYXlbaV0gPSAwOworICAgICAgICBtQnl0ZXNBcnJheVtpXSA9IDA7CisgICAgfQorICAgIG1DbG9jayA9IDA7CisgICAgbUxhc3RSZWFkSWR4ID0gMDsKKyAgICBtTGFzdFRpbWVPZlByaW50ID0gMDsKKyAgICBtQWNjdUJ5dGVzID0gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRpbWUsIGNsYXNzIEJ5dGVzPgordm9pZCBUcmFmZmljUmVjb3JkZXI8VGltZSwgQnl0ZXM+Ojp1cGRhdGVDbG9jayhUaW1lIG5vdykgeworICAgIG1DbG9jayA9IG5vdzsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRpbWUsIGNsYXNzIEJ5dGVzPgorQnl0ZXMgVHJhZmZpY1JlY29yZGVyPFRpbWUsIEJ5dGVzPjo6cmVhZEJ5dGVzRm9yVG90YWwoKSB7CisgICAgcmV0dXJuIG1BY2N1Qnl0ZXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUaW1lLCBjbGFzcyBCeXRlcz4KK0J5dGVzIFRyYWZmaWNSZWNvcmRlcjxUaW1lLCBCeXRlcz46OnJlYWRCeXRlc0Zvckxhc3RQZXJpb2QoVGltZSBwZXJpb2QpIHsKKyAgICAvLyBOb3QgZW5vdWdoIGRhdGEKKyAgICBpZiAocGVyaW9kID4gbUNsb2NrKQorICAgICAgICByZXR1cm4gMDsKKworICAgIEJ5dGVzIGJ5dGVzID0gMDsKKyAgICBpbnQgaSA9IG1IZWFkSWR4OworICAgIHdoaWxlIChpICE9IG1UYWlsSWR4KSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiUkVBRCAiIDw8IGkgPDwgIiB0aW1lICIgPDwgbVRpbWVBcnJheVtpXQorICAgICAgICAgICAgICAgIDw8ICIgXHQgRW5kT2ZQZXJpb2QgIiA8PCBtQ2xvY2sgLSBwZXJpb2QKKyAgICAgICAgICAgICAgICA8PCAiXHRcdCBCeXRlczoiIDw8IG1CeXRlc0FycmF5W2ldIDw8ICJcdFx0IEFjY3U6ICIgPDwgYnl0ZXM7CisgICAgICAgIGlmIChtVGltZUFycmF5W2ldIDwgbUNsb2NrIC0gcGVyaW9kKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBieXRlcyArPSBtQnl0ZXNBcnJheVtpXTsKKyAgICAgICAgaSA9IChpIC0gMSkgJiBtU2l6ZU1hc2s7CisgICAgfQorICAgIG1MYXN0UmVhZElkeCA9IChpICsgMSkgJiBtU2l6ZU1hc2s7CisKKyAgICByZXR1cm4gYnl0ZXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUaW1lLCBjbGFzcyBCeXRlcz4KK3ZvaWQgVHJhZmZpY1JlY29yZGVyPFRpbWUsIEJ5dGVzPjo6d3JpdGVCeXRlcyhCeXRlcyBieXRlcykgeworICAgIGludCB3cml0ZUlkeDsKKyAgICBpZiAobUNsb2NrID09IG1UaW1lQXJyYXlbbUhlYWRJZHhdKSB7CisgICAgICAgIHdyaXRlSWR4ID0gbUhlYWRJZHg7CisgICAgICAgIG1CeXRlc0FycmF5W3dyaXRlSWR4XSArPSBieXRlczsKKyAgICB9IGVsc2UgeworICAgICAgICB3cml0ZUlkeCA9IChtSGVhZElkeCArIDEpICYgbVNpemVNYXNrOworICAgICAgICBtVGltZUFycmF5W3dyaXRlSWR4XSA9IG1DbG9jazsKKyAgICAgICAgbUJ5dGVzQXJyYXlbd3JpdGVJZHhdID0gYnl0ZXM7CisgICAgfQorCisgICAgTE9HKFZFUkJPU0UpIDw8ICJXUklURSAiIDw8IHdyaXRlSWR4IDw8ICIgdGltZSAiIDw8IG1DbG9jazsKKyAgICBpZiAod3JpdGVJZHggPT0gbVRhaWxJZHgpIHsKKyAgICAgICAgbVRhaWxJZHggPSAobVRhaWxJZHggKyAxKSAmIG1TaXplTWFzazsKKyAgICB9CisKKyAgICBtSGVhZElkeCA9IHdyaXRlSWR4OworICAgIG1BY2N1Qnl0ZXMgKz0gYnl0ZXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUaW1lLCBjbGFzcyBCeXRlcz4KK3ZvaWQgVHJhZmZpY1JlY29yZGVyPFRpbWUsIEJ5dGVzPjo6cHJpbnRBY2N1Qml0c0Zvckxhc3RQZXJpb2QoVGltZSBwZXJpb2QsIFRpbWUgdW5pdCkgeworICAgIFRpbWUgdGltZVNpbmNlTGFzdFByaW50ID0gbUNsb2NrIC0gbUxhc3RUaW1lT2ZQcmludDsKKyAgICBpZiAodGltZVNpbmNlTGFzdFByaW50IDwgcGVyaW9kKQorICAgICAgICByZXR1cm47CisKKyAgICBCeXRlcyBzdW0gPSByZWFkQnl0ZXNGb3JMYXN0UGVyaW9kKHBlcmlvZCk7CisgICAgVGltZSByZWFkUGVyaW9kID0gbUNsb2NrIC0gbVRpbWVBcnJheVttTGFzdFJlYWRJZHhdOworCisgICAgZmxvYXQgbnVtT2ZVbml0ID0gKGZsb2F0KShyZWFkUGVyaW9kKSAvICh1bml0ICsgRkxUX01JTik7CisgICAgQUxPR0QoIkFjdHVhbCBUeCBwZXJpb2QgJS4zZiB1bml0IFx0ICUuMGYgYnl0ZXMgKCUuMGYgS2JpdHMpL1VuaXQiLAorICAgICAgICAgIG51bU9mVW5pdCwgc3VtIC8gbnVtT2ZVbml0LCBzdW0gKiA4LmYgLyBudW1PZlVuaXQgLyAxMDAwLmYpOworICAgIG1MYXN0VGltZU9mUHJpbnQgPSBtQ2xvY2s7CisKKyAgICBpZiAobUNsb2NrIC0gbVRpbWVBcnJheVttVGFpbElkeF0gPCBtUmVjb3JkTGltaXQpIHsKKyAgICAgICAgLy8gU2l6ZSBpcyBub3QgZW5vdWdoIHRvIHJlY29yZCBieXRlcyBmb3IgbVJlY29yZExpbWl0IHBlcmlvZAorICAgICAgICBBTE9HVygiVHJhZmZpYyByZWNvcmRlciBzaXplIGlzIG5vdCBlbm91Z2guIG1SZWNvcmRMaW1pdCAlZCIsIG1SZWNvcmRMaW1pdCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfVFJBRkZJQ19SRUNPUkRFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggYTdmOTRjMS4uYTc5OWExMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsMjQgQEAKIC8vIEJ1aWxkIHRoZSB1bml0IHRlc3RzLgogCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfdGVzdHNfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfdGVzdHNfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogIk1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzX3Rlc3QiLAogCkBAIC05LDcgKzI4LDYgQEAKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKQEAgLTE3LDExICszNSw4IEBACiAgICAgaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAogICAgIF0sCiAKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAotCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKQEAgLTQ0LDQgKzU5LDQgQEAKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0FuZHJvaWQuYnAKc2ltaWxhcml0eSBpbmRleCA2MiUKY29weSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9BbmRyb2lkLmJwCmNvcHkgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9BbmRyb2lkLmJwCmluZGV4IDY1NTQ5MWEuLjA0ZTliMjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0VTRFMvQW5kcm9pZC5icApAQCAtMTQsMjEgKzE0LDM3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF90ZXN0c19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfdGVzdHNfbGljZW5zZSIsCisgICAgXSwKK30KKwogY2NfdGVzdCB7Ci0gICAgbmFtZTogIk1wZWc0SDI2M0RlY29kZXJUZXN0IiwKKyAgICBuYW1lOiAiRVNEU1Rlc3QiLAogICAgIGd0ZXN0OiB0cnVlLAogCiAgICAgc3JjczogWwotICAgICAgICAiTXBlZzRIMjYzRGVjb2RlclRlc3QuY3BwIiwKKyAgICAgICAgIkVTRFNUZXN0LmNwcCIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliZGF0YXNvdXJjZSIsCiAgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpAQCAtMzcsMTAgKzUzLDEwIEBACiAgICAgXSwKIAogICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCi0gICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0VTRFMvQW5kcm9pZFRlc3QueG1sCnNpbWlsYXJpdHkgaW5kZXggNzIlCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCmNvcHkgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9BbmRyb2lkVGVzdC54bWwKaW5kZXggN2ZmOTczMi4uYTRmYmM3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0FuZHJvaWRUZXN0LnhtbApAQCAtMTMsMTkgKzEzLDE5IEBACiAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIE1wMyBEZWNvZGVyIHVuaXQgdGVzdCI+Ci0gICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9Ik1wM0RlY29kZXJUZXN0IiAvPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgRVNEUyB1bml0IHRlc3QiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJFU0RTVGVzdCIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJNcDNEZWNvZGVyVGVzdC0+L2RhdGEvbG9jYWwvdG1wL01wM0RlY29kZXJUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJFU0RTVGVzdC0+L2RhdGEvbG9jYWwvdG1wL0VTRFNUZXN0IiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKLSAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDNkZWMvdGVzdC9NcDNEZWNvZGVyVGVzdC56aXA/dW56aXA9dHJ1ZSIKLSAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvTXAzRGVjb2RlclRlc3RSZXMvIiAvPgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0VTRFMvRVNEU1Rlc3RSZXMtMS4wLnppcD91bnppcD10cnVlIgorICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC9FU0RTVGVzdFJlcy8iIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAKICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9Ik1wM0RlY29kZXJUZXN0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWZsYWciIHZhbHVlPSItUCAvZGF0YS9sb2NhbC90bXAvTXAzRGVjb2RlclRlc3RSZXMvIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iRVNEU1Rlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9FU0RTVGVzdFJlcy8iIC8+CiAgICAgPC90ZXN0PgogPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9FU0RTVGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDFlMDBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9FU0RTVGVzdC5jcHAKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkVTRFNUZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8RVNEUy5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxkYXRhc291cmNlL0ZpbGVTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCisjaW5jbHVkZSAiRVNEU1Rlc3RFbnZpcm9ubWVudC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdGljIEVTRFNUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCitzdHJ1Y3QgRVNEU1BhcmFtcyB7CisgICAgY29uc3QgY2hhciAqaW5wdXRGaWxlOworICAgIGludDMyX3Qgb2JqZWN0VHlwZUluZGljYXRpb247CisgICAgY29uc3QgY2hhciAqY29kZWNTcGVjaWZpY0luZm9EYXRhOworICAgIGludDMyX3QgY29kZWNTcGVjaWZpY0luZm9EYXRhU2l6ZTsKKyAgICBpbnQzMl90IGJpdHJhdGVNYXg7CisgICAgaW50MzJfdCBiaXRyYXRlQXZnOworfTsKKworY2xhc3MgRVNEU1VuaXRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5wdXRGaWxlICovIGNvbnN0IGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT2JqZWN0VHlwZUluZGljYXRpb24gKi8gaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZWNTcGVjaWZpY0luZm9EYXRhICovIGNvbnN0IGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZWNTcGVjaWZpY0luZm9EYXRhU2l6ZSAqLyBpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXRyYXRlTWF4ICovIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJpdHJhdGVBdmcgKi8gaW50MzJfdD4+IHsKKyAgcHVibGljOgorICAgIEVTRFNVbml0VGVzdCgpIDogbUVTRFNEYXRhKG51bGxwdHIpIHsKKyAgICAgICAgbUVTRFNQYXJhbXMuaW5wdXRGaWxlID0gZ2V0PDA+KEdldFBhcmFtKCkpOworICAgICAgICBtRVNEU1BhcmFtcy5vYmplY3RUeXBlSW5kaWNhdGlvbiA9IGdldDwxPihHZXRQYXJhbSgpKTsKKyAgICAgICAgbUVTRFNQYXJhbXMuY29kZWNTcGVjaWZpY0luZm9EYXRhID0gZ2V0PDI+KEdldFBhcmFtKCkpOworICAgICAgICBtRVNEU1BhcmFtcy5jb2RlY1NwZWNpZmljSW5mb0RhdGFTaXplID0gZ2V0PDM+KEdldFBhcmFtKCkpOworICAgICAgICBtRVNEU1BhcmFtcy5iaXRyYXRlTWF4ID0gZ2V0PDQ+KEdldFBhcmFtKCkpOworICAgICAgICBtRVNEU1BhcmFtcy5iaXRyYXRlQXZnID0gZ2V0PDU+KEdldFBhcmFtKCkpOworICAgIH07CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtRGF0YVNvdXJjZSkgbURhdGFTb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgaWYgKG1JbnB1dEZwKSB7CisgICAgICAgICAgICBmY2xvc2UobUlucHV0RnApOworICAgICAgICAgICAgbUlucHV0RnAgPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShyZWFkRVNEU0RhdGEoKSk7IH0KKyAgICBjb25zdCB2b2lkICptRVNEU0RhdGE7CisgICAgc2l6ZV90IG1FU0RTU2l6ZTsKKyAgICBFU0RTUGFyYW1zIG1FU0RTUGFyYW1zOworCisgIHByaXZhdGU6CisgICAgdm9pZCByZWFkRVNEU0RhdGEoKSB7CisgICAgICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKSArIG1FU0RTUGFyYW1zLmlucHV0RmlsZTsKKyAgICAgICAgbUlucHV0RnAgPSBmb3BlbihpbnB1dEZpbGUuY19zdHIoKSwgInJiIik7CisgICAgICAgIEFTU0VSVF9ORShtSW5wdXRGcCwgbnVsbHB0cikgPDwgIkZpbGUgb3BlbiBmYWlsZWQgZm9yIGZpbGU6ICIgPDwgaW5wdXRGaWxlOworICAgICAgICBpbnQzMl90IGZkID0gZmlsZW5vKG1JbnB1dEZwKTsKKyAgICAgICAgQVNTRVJUX0dFKGZkLCAwKSA8PCAiRmlsZSBkZXNjcmlwdG9yIGludmFsaWQgZm9yIGZpbGU6ICIgPDwgaW5wdXRGaWxlOworCisgICAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhdChpbnB1dEZpbGUuY19zdHIoKSwgJmJ1Zik7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IHByb3BlcnRpZXMgb2YgaW5wdXQgZmlsZTogIiA8PCBtRVNEU1BhcmFtcy5pbnB1dEZpbGU7CisgICAgICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworCisgICAgICAgIG1EYXRhU291cmNlID0gbmV3IEZpbGVTb3VyY2UoZHVwKGZkKSwgMCwgZmlsZVNpemUpOworICAgICAgICBBU1NFUlRfTkUobURhdGFTb3VyY2UsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gY3JlYXRlIGRhdGEgc291cmNlIGZvciBmaWxlOiAiIDw8IGlucHV0RmlsZTsKKworICAgICAgICBzcDxJTWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlKG1EYXRhU291cmNlKTsKKyAgICAgICAgaWYgKGV4dHJhY3RvciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtRGF0YVNvdXJjZS5jbGVhcigpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJVbmFibGUgdG8gY3JlYXRlIGV4dHJhY3RvciBmb3IgZmlsZTogIiA8PCBpbnB1dEZpbGU7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgbnVtVHJhY2tzID0gZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICAgICAgICBBU1NFUlRfR1QobnVtVHJhY2tzLCAwKSA8PCAiTm8gdHJhY2tzIGluIGZpbGU6ICIgPDwgaW5wdXRGaWxlOworICAgICAgICBBU1NFUlRfVFJVRShlc2RzRGF0YVByZXNlbnQobnVtVHJhY2tzLCBleHRyYWN0b3IpKQorICAgICAgICAgICAgICAgIDw8ICJVbmFibGUgdG8gZmluZCBlc2RzIGluIGFueSB0cmFjayBpbiBmaWxlOiAiIDw8IGlucHV0RmlsZTsKKyAgICB9CisKKyAgICBib29sIGVzZHNEYXRhUHJlc2VudChzaXplX3QgbnVtVHJhY2tzLCBzcDxJTWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvcikgeworICAgICAgICBib29sIGZvdW5kRVNEUyA9IGZhbHNlOworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVRyYWNrczsgKytpKSB7CisgICAgICAgICAgICBzcDxNZXRhRGF0YT4gdHJhY2tNZXRhID0gZXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKGkpOworICAgICAgICAgICAgaWYgKHRyYWNrTWV0YSAhPSBudWxscHRyICYmCisgICAgICAgICAgICAgICAgdHJhY2tNZXRhLT5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZtRVNEU0RhdGEsICZtRVNEU1NpemUpKSB7CisgICAgICAgICAgICAgICAgdHJhY2tNZXRhLT5jbGVhcigpOworICAgICAgICAgICAgICAgIGZvdW5kRVNEUyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZvdW5kRVNEUzsKKyAgICB9CisKKyAgICBGSUxFICptSW5wdXRGcDsKKyAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKK307CisKK1RFU1RfUChFU0RTVW5pdFRlc3QsIEludmFsaWREYXRhVGVzdCkgeworICAgIHZvaWQgKmludmFsaWREYXRhID0gY2FsbG9jKG1FU0RTU2l6ZSwgMSk7CisgICAgQVNTRVJUX05FKGludmFsaWREYXRhLCBudWxscHRyKSA8PCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSI7CisgICAgRVNEUyBlc2RzKGludmFsaWREYXRhLCBtRVNEU1NpemUpOworICAgIGZyZWUoaW52YWxpZERhdGEpOworICAgIEFTU0VSVF9ORShlc2RzLkluaXRDaGVjaygpLCBPSykgPDwgImludmFsaWQgRVNEUyBkYXRhIGFjY2VwdGVkIjsKK30KKworVEVTVChFU0RTU2FuaXR5VW5pdFRlc3QsIENvbnN0cnVjdG9yU2FuaXR5VGVzdCkgeworICAgIHZvaWQgKmludmFsaWREYXRhID0gbWFsbG9jKDEpOworICAgIEFTU0VSVF9ORShpbnZhbGlkRGF0YSwgbnVsbHB0cikgPDwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiOworICAgIEVTRFMgZXNkc196ZXJvKGludmFsaWREYXRhLCAwKTsKKyAgICBmcmVlKGludmFsaWREYXRhKTsKKyAgICBBU1NFUlRfTkUoZXNkc196ZXJvLkluaXRDaGVjaygpLCBPSykgPDwgImludmFsaWQgRVNEUyBkYXRhIGFjY2VwdGVkIjsKKworICAgIEVTRFMgZXNkc19udWxsKE5VTEwsIDApOworICAgIEFTU0VSVF9ORShlc2RzX251bGwuSW5pdENoZWNrKCksIE9LKSA8PCAiaW52YWxpZCBFU0RTIGRhdGEgYWNjZXB0ZWQiOworfQorCitURVNUX1AoRVNEU1VuaXRUZXN0LCBDcmVhdGVBbmREZXN0cm95VGVzdCkgeworICAgIEVTRFMgZXNkcyhtRVNEU0RhdGEsIG1FU0RTU2l6ZSk7CisgICAgQVNTRVJUX0VRKGVzZHMuSW5pdENoZWNrKCksIE9LKSA8PCAiRVNEUyBkYXRhIGludmFsaWQiOworfQorCitURVNUX1AoRVNEU1VuaXRUZXN0LCBPYmplY3RUeXBlSW5kaWNhdGlvblRlc3QpIHsKKyAgICBFU0RTIGVzZHMobUVTRFNEYXRhLCBtRVNEU1NpemUpOworICAgIEFTU0VSVF9FUShlc2RzLkluaXRDaGVjaygpLCBPSykgPDwgIkVTRFMgZGF0YSBpbnZhbGlkIjsKKyAgICB1aW50OF90IG9iamVjdFR5cGVJbmRpY2F0aW9uOworICAgIHN0YXR1c190IHN0YXR1cyA9IGVzZHMuZ2V0T2JqZWN0VHlwZUluZGljYXRpb24oJm9iamVjdFR5cGVJbmRpY2F0aW9uKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkVTRFMgb2JqZWN0VHlwZUluZGljYXRpb24gZGF0YSBpbnZhbGlkIjsKKyAgICBBU1NFUlRfRVEob2JqZWN0VHlwZUluZGljYXRpb24sIG1FU0RTUGFyYW1zLm9iamVjdFR5cGVJbmRpY2F0aW9uKQorICAgICAgICAgICAgPDwgIkVTRFMgb2JqZWN0VHlwZUluZGljYXRpb24gZGF0YSBkb2Vzbid0IG1hdGNoIjsKK30KKworVEVTVF9QKEVTRFNVbml0VGVzdCwgQ29kZWNTcGVjaWZpY0luZm9UZXN0KSB7CisgICAgRVNEUyBlc2RzKG1FU0RTRGF0YSwgbUVTRFNTaXplKTsKKyAgICBBU1NFUlRfRVEoZXNkcy5Jbml0Q2hlY2soKSwgT0spIDw8ICJFU0RTIGRhdGEgaW52YWxpZCI7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGNvbnN0IHZvaWQgKmNvZGVjU3BlY2lmaWNJbmZvOworICAgIHNpemVfdCBjb2RlY1NwZWNpZmljSW5mb1NpemU7CisgICAgc3RhdHVzID0gZXNkcy5nZXRDb2RlY1NwZWNpZmljSW5mbygmY29kZWNTcGVjaWZpY0luZm8sICZjb2RlY1NwZWNpZmljSW5mb1NpemUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRVNEUyBnZXRDb2RlY1NwZWNpZmljSW5mbyBkYXRhIGludmFsaWQiOworICAgIEFTU0VSVF9FUShtRVNEU1BhcmFtcy5jb2RlY1NwZWNpZmljSW5mb0RhdGFTaXplLCBjb2RlY1NwZWNpZmljSW5mb1NpemUpCisgICAgICAgICAgICA8PCAiQ29kZWNTcGVjaWZpY0luZm8gZGF0YSBkb2Vzbid0IG1hdGNoIjsKKyAgICBzdGF0dXMgPSBtZW1jbXAoY29kZWNTcGVjaWZpY0luZm8sIG1FU0RTUGFyYW1zLmNvZGVjU3BlY2lmaWNJbmZvRGF0YSwgY29kZWNTcGVjaWZpY0luZm9TaXplKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiQ29kZWNTcGVjaWZpY0luZm8gZGF0YSBkb2Vzbid0IG1hdGNoIjsKK30KKworVEVTVF9QKEVTRFNVbml0VGVzdCwgR2V0Qml0cmF0ZVRlc3QpIHsKKyAgICBFU0RTIGVzZHMobUVTRFNEYXRhLCBtRVNEU1NpemUpOworICAgIEFTU0VSVF9FUShlc2RzLkluaXRDaGVjaygpLCBPSykgPDwgIkVTRFMgZGF0YSBpbnZhbGlkIjsKKyAgICB1aW50MzJfdCBiaXRyYXRlTWF4OworICAgIHVpbnQzMl90IGJpdHJhdGVBdmc7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZXNkcy5nZXRCaXRSYXRlKCZiaXRyYXRlTWF4LCAmYml0cmF0ZUF2Zyk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJFU0RTIGJpdFJhdGUgZGF0YSBpbnZhbGlkIjsKKyAgICBBU1NFUlRfRVEoYml0cmF0ZU1heCwgbUVTRFNQYXJhbXMuYml0cmF0ZU1heCkgPDwgIkVTRFMgYml0cmF0ZU1heCBkb2Vzbid0IG1hdGNoIjsKKyAgICBBU1NFUlRfRVEoYml0cmF0ZUF2ZywgbUVTRFNQYXJhbXMuYml0cmF0ZUF2ZykgPDwgIkVTRFMgYml0cmF0ZUF2ZyBkb2Vzbid0IG1hdGNoIjsKKyAgICBBU1NFUlRfTEUoYml0cmF0ZUF2ZywgYml0cmF0ZU1heCkgPDwgIkVTRFMgYml0cmF0ZU1heCBpcyBsZXNzIHRoYW4gYml0cmF0ZUF2ZyI7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgRVNEU1VuaXRUZXN0QWxsLCBFU0RTVW5pdFRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIC8vIElucHV0RmlsZSwgT2JqZWN0VHlwZUluZGljYXRpb24sIENvZGVjU3BlY2lmaWNJbmZvRGF0YSwKKyAgICAgICAgICAgICAgICAvLyBDb2RlY1NwZWNpZmljSW5mb0RhdGFTaXplLCBCaXRyYXRlTWF4LCBCaXRyYXRlQXZnCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgidmlkZW9fMTc2eDE0NF8zZ3BfaDI2M181NmticHNfMTJmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzIyMDUwaHouM2dwIiwgNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgxM1x4OTAiLCAyLCAxMzEwNzIsIDApLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInZpZGVvXzEyODB4NzIwX21wNF9tcGVnMl8zMDAwa2Jwc18zMGZwc19hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwMFx4MDBceDAxXHhCM1x4NTBceDAyXHhEMFx4MzVceEZGXHhGRlx4RTFceEEwXHgwMFx4MDBceDAxXHhCNVx4MTUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHg2QVx4MDBceDAxXHgwMFx4MDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIsIDM0MTU0NTIsIDM0MTU0NTIpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInZpZGVvXzE3NngxNDRfM2dwX2gyNjNfNTZrYnBzXzI1ZnBzX2FhY19tb25vXzI0a2Jwc18xMTAyNWh6LjNncCIsIDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MTVceDA4IiwgMiwgMjQ1NzYsIDApKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIC8vIE1lZGlhRXh0cmFjdG9yIG5lZWRzIGJpbmRlciB0aHJlYWQgcG9vbAorICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKyAgICBnRW52ID0gbmV3IEVTRFNUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIEFMT0dWKCJUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9FU0RTVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0RW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2EyMzAzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9FU0RTVGVzdEVudmlyb25tZW50LmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19FU0RTX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisjZGVmaW5lIF9fRVNEU19URVNUX0VOVklST05NRU5UX0hfXworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGdldG9wdC5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjbGFzcyBFU0RTVGVzdEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgRVNEU1Rlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvIikge30KKworICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIgKl9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQorCisgIHByaXZhdGU6CisgICAgc3RyaW5nIHJlczsKK307CisKK2ludCBFU0RTVGVzdEVudmlyb25tZW50Ojppbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0ge3sicmVzIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdQJ30sIHswLCAwLCAwLCAwfX07CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJQOiIsIG9wdGlvbnMsICZpbmRleCk7CisgICAgICAgIGlmIChjID09IC0xKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnUCc6CisgICAgICAgICAgICAgICAgc2V0UmVzKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdGluZCA8IGFyZ2MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBvcHRpb246ICVzXG5cbiIKKyAgICAgICAgICAgICAgICAidXNhZ2U6ICVzIDxndGVzdCBvcHRpb25zPiA8dGVzdCBvcHRpb25zPlxuXG4iCisgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKKyAgICAgICAgICAgICAgICAiLVAsIC0tcGF0aDogUmVzb3VyY2UgZmlsZXMgZGlyZWN0b3J5IGxvY2F0aW9uXG4iLAorICAgICAgICAgICAgICAgIGFyZ3Zbb3B0aW5kID86IDFdLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYgIC8vIF9fRVNEU19URVNUX0VOVklST05NRU5UX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDBmYjg2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9SRUFETUUubWQKQEAgLTAsMCArMSw0MCBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIEVTRFMgVW5pdCBUZXN0IDoKK1RoZSBFU0RTIFVuaXQgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIEVTRFMgY2xhc3MgYXZhaWxhYmxlIGluIGxpYnN0YWdlZnJpZ2h0LgorCitSdW4gdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB0aGUgdGVzdCBzdWl0ZToKK2BgYAorbSBFU0RTVGVzdAorYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9FU0RTVGVzdC9FU0RTVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L0VTRFNUZXN0L0VTRFNUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9FU0RTVGVzdFJlcy0xLjAuemlwKQorRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgorCitgYGAKK2FkYiBwdXNoIEVTRFNUZXN0UmVzIC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCit1c2FnZTogRVNEU1Rlc3QgLVAgXDxwYXRoX3RvX2ZvbGRlclw+CitgYGAKK2FkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvRVNEU1Rlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL0VTRFNUZXN0UmVzLworYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBFU0RTVGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9BbmRyb2lkLmJwCnNpbWlsYXJpdHkgaW5kZXggNjIlCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZC5icApjb3B5IHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0hFVkMvQW5kcm9pZC5icAppbmRleCA2NTU0OTFhLi41MDE0NzhjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0FuZHJvaWQuYnAKQEAgLTE0LDMzICsxNCw0OSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfdGVzdHNfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X3Rlc3RzX2xpY2Vuc2UiLAorICAgIF0sCit9CisKIGNjX3Rlc3QgewotICAgIG5hbWU6ICJNcGVnNEgyNjNEZWNvZGVyVGVzdCIsCisgICAgbmFtZTogIkhFVkNVdGlsc1VuaXRUZXN0IiwKICAgICBndGVzdDogdHJ1ZSwKIAogICAgIHNyY3M6IFsKLSAgICAgICAgIk1wZWc0SDI2M0RlY29kZXJUZXN0LmNwcCIsCisgICAgICAgICJIRVZDVXRpbHNVbml0VGVzdC5jcHAiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgXSwKIAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCisgICAgXSwKKwogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV2FsbCIsCiAgICAgXSwKIAogICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCi0gICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0hFVkMvQW5kcm9pZFRlc3QueG1sCnNpbWlsYXJpdHkgaW5kZXggNjclCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCmNvcHkgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9BbmRyb2lkVGVzdC54bWwKaW5kZXggN2ZmOTczMi4uZmY4NTBhMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0FuZHJvaWRUZXN0LnhtbApAQCAtMTMsMTkgKzEzLDE5IEBACiAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIE1wMyBEZWNvZGVyIHVuaXQgdGVzdCI+Ci0gICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9Ik1wM0RlY29kZXJUZXN0IiAvPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgSEVWQyBVdGlscyB1bml0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iSEVWQ1V0aWxzVW5pdFRlc3QiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iTXAzRGVjb2RlclRlc3QtPi9kYXRhL2xvY2FsL3RtcC9NcDNEZWNvZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkhFVkNVdGlsc1VuaXRUZXN0LT4vZGF0YS9sb2NhbC90bXAvSEVWQ1V0aWxzVW5pdFRlc3QiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgotICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0LnppcD91bnppcD10cnVlIgotICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC9NcDNEZWNvZGVyVGVzdFJlcy8iIC8+CisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9IRVZDVXRpbHMvSEVWQ1V0aWxzVW5pdFRlc3QuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL0hFVkNVdGlsc1VuaXRUZXN0LyIgLz4KICAgICA8L3RhcmdldF9wcmVwYXJlcj4KIAogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgogICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iTXAzRGVjb2RlclRlc3QiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9NcDNEZWNvZGVyVGVzdFJlcy8iIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJIRVZDVXRpbHNVbml0VGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL0hFVkNVdGlsc1VuaXRUZXN0LyIgLz4KICAgICA8L3Rlc3Q+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0hFVkNVdGlsc1Rlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9IRVZDVXRpbHNUZXN0RW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDQ4MWUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9IRVZDVXRpbHNUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0hFVkNfVVRJTFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KKyNkZWZpbmUgX19IRVZDX1VUSUxTX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIEhFVkNVdGlsc1Rlc3RFbnZpcm9ubWVudCA6IHB1YmxpYzo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgSEVWQ1V0aWxzVGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSB7fQorCisgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisgICAgdm9pZCBzZXRSZXMoY29uc3QgY2hhciAqX3JlcykgeyByZXMgPSBfcmVzOyB9CisKKyAgICBjb25zdCBzdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJpbmcgcmVzOworfTsKKworaW50IEhFVkNVdGlsc1Rlc3RFbnZpcm9ubWVudDo6aW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHt7InBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzogeworICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCisgICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBfX0hFVkNfVVRJTFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0hFVkMvSEVWQ1V0aWxzVW5pdFRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9IRVZDVXRpbHNVbml0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0YTA0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0hFVkMvSEVWQ1V0aWxzVW5pdFRlc3QuY3BwCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJIZXZjVXRpbGl0eVRlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CisjaW5jbHVkZSAiaW5jbHVkZS9IZXZjVXRpbHMuaCIKKworI2luY2x1ZGUgIkhFVkNVdGlsc1Rlc3RFbnZpcm9ubWVudC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLy8gbWF4IHNpemUgb2YgaHZjYyBib3ggaXMgMiBLQgorY29uc3RleHByIHVpbnQzMl90IGtIdmNjQm94TWF4U2l6ZSA9IDIwNDg7Citjb25zdGV4cHIgdWludDMyX3Qga0h2Y2NCb3hNaW5TaXplID0gMjA7Citjb25zdGV4cHIgdWludDMyX3Qga1ZQU0NvZGUgPSAzMjsKK2NvbnN0ZXhwciB1aW50MzJfdCBrU1BTQ29kZSA9IDMzOworY29uc3RleHByIHVpbnQzMl90IGtQUFNDb2RlID0gMzQ7Citjb25zdGV4cHIgdWludDMyX3Qga05BTFNpemVMZW5ndGggPSAyOworCitzdGF0aWMgSEVWQ1V0aWxzVGVzdEVudmlyb25tZW50ICpnRW52ID0gbnVsbHB0cjsKKworY2xhc3MgSEVWQ1V0aWxzVW5pdFRlc3QKKyAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08CisgICAgICAgICAgICAgIHR1cGxlPC8qZmlsZU5hbWUqLyBzdHJpbmcsIC8qaW5mb0ZpbGVOYW1lKi8gc3RyaW5nLCAvKm51bVZQU05hbHMqLyBzaXplX3QsCisgICAgICAgICAgICAgICAgICAgIC8qbnVtU1BTTmFscyovIHNpemVfdCwgLypudW1QUFNOYWxzKi8gc2l6ZV90LCAvKmZyYW1lUmF0ZSovIGludDE2X3QsCisgICAgICAgICAgICAgICAgICAgIC8qaXNIZHIqLyBib29sPj4geworICBwdWJsaWM6CisgICAgfkhFVkNVdGlsc1VuaXRUZXN0KCkgeworICAgICAgICBpZiAobU1lZGlhRmlsZVN0cmVhbS5pc19vcGVuKCkpIG1NZWRpYUZpbGVTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgaWYgKG1JbmZvRmlsZVN0cmVhbS5pc19vcGVuKCkpIG1JbmZvRmlsZVN0cmVhbS5jbG9zZSgpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgdHVwbGU8c3RyaW5nLCBzdHJpbmcsIHNpemVfdCwgc2l6ZV90LCBzaXplX3QsIGludDE2X3QsIGJvb2w+IHBhcmFtcyA9IEdldFBhcmFtKCk7CisgICAgICAgIHN0cmluZyBpbnB1dE1lZGlhRmlsZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDA+KHBhcmFtcyk7CisgICAgICAgIG1NZWRpYUZpbGVTdHJlYW0ub3BlbihpbnB1dE1lZGlhRmlsZSwgaWZzdHJlYW06OmluKTsKKyAgICAgICAgQVNTRVJUX1RSVUUobU1lZGlhRmlsZVN0cmVhbS5pc19vcGVuKCkpIDw8ICJGYWlsZWQgdG8gb3BlbiBtZWRpYSBmaWxlOiAiIDw8IGlucHV0TWVkaWFGaWxlOworCisgICAgICAgIHN0cmluZyBpbnB1dEluZm9GaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MT4ocGFyYW1zKTsKKyAgICAgICAgbUluZm9GaWxlU3RyZWFtLm9wZW4oaW5wdXRJbmZvRmlsZSwgaWZzdHJlYW06OmluKTsKKyAgICAgICAgQVNTRVJUX1RSVUUobUluZm9GaWxlU3RyZWFtLmlzX29wZW4oKSkgPDwgIkZhaWxlZCB0byBvcGVuIGluZm8gZmlsZTogIiA8PCBpbnB1dEluZm9GaWxlOworCisgICAgICAgIG1OdW1WUFNOYWxzID0gZ2V0PDI+KHBhcmFtcyk7CisgICAgICAgIG1OdW1TUFNOYWxzID0gZ2V0PDM+KHBhcmFtcyk7CisgICAgICAgIG1OdW1QUFNOYWxzID0gZ2V0PDQ+KHBhcmFtcyk7CisgICAgICAgIG1GcmFtZVJhdGUgPSBnZXQ8NT4ocGFyYW1zKTsKKyAgICAgICAgbUlzSERSID0gZ2V0PDY+KHBhcmFtcyk7CisgICAgfQorCisgICAgc2l6ZV90IG1OdW1WUFNOYWxzOworICAgIHNpemVfdCBtTnVtU1BTTmFsczsKKyAgICBzaXplX3QgbU51bVBQU05hbHM7CisgICAgaW50MTZfdCBtRnJhbWVSYXRlOworICAgIGJvb2wgbUlzSERSOworICAgIGlmc3RyZWFtIG1NZWRpYUZpbGVTdHJlYW07CisgICAgaWZzdHJlYW0gbUluZm9GaWxlU3RyZWFtOworfTsKKworVEVTVF9QKEhFVkNVdGlsc1VuaXRUZXN0LCBOQUxVbml0VGVzdCkgeworICAgIEhldmNQYXJhbWV0ZXJTZXRzIGhldmNQYXJhbXM7CisKKyAgICBzdHJpbmcgbGluZTsKKyAgICBpbnQzMl90IGluZGV4ID0gMDsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgd2hpbGUgKGdldGxpbmUobUluZm9GaWxlU3RyZWFtLCBsaW5lKSkgeworICAgICAgICBzdHJpbmcgdHlwZTsKKyAgICAgICAgaW50MzJfdCBjaHVua0xlbmd0aDsKKworICAgICAgICBpc3RyaW5nc3RyZWFtIHN0cmluZ0xpbmUobGluZSk7CisgICAgICAgIHN0cmluZ0xpbmUgPj4gdHlwZSA+PiBjaHVua0xlbmd0aDsKKyAgICAgICAgQVNTRVJUX0dUKGNodW5rTGVuZ3RoLCAwKSA8PCAiTGVuZ3RoIG9mIGRhdGEgY2h1bmsgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCI7CisKKyAgICAgICAgY2hhciAqZGF0YSA9IChjaGFyICopbWFsbG9jKGNodW5rTGVuZ3RoKTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgZGF0YSBidWZmZXIgb2Ygc2l6ZTogIiA8PCBjaHVua0xlbmd0aDsKKworICAgICAgICBtTWVkaWFGaWxlU3RyZWFtLnJlYWQoZGF0YSwgY2h1bmtMZW5ndGgpOworICAgICAgICBBU1NFUlRfRVEobU1lZGlhRmlsZVN0cmVhbS5nY291bnQoKSwgY2h1bmtMZW5ndGgpCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byByZWFkIGNvbXBsZXRlIGZpbGUsIGJ5dGVzIHJlYWQ6ICIgPDwgbU1lZGlhRmlsZVN0cmVhbS5nY291bnQoKTsKKworICAgICAgICAvLyBBIHZhbGlkIHN0YXJ0Y29kZSBjb25zaXN0cyBvZiBhdCBsZWFzdCB0d28gMHgwMCBieXRlcyBmb2xsb3dlZCBieSAweDAxLgorICAgICAgICBpbnQzMl90IG9mZnNldCA9IDA7CisgICAgICAgIGZvciAoOyBvZmZzZXQgKyAyIDwgY2h1bmtMZW5ndGg7ICsrb2Zmc2V0KSB7CisgICAgICAgICAgICBpZiAoZGF0YVtvZmZzZXQgKyAyXSA9PSAweDAxICYmIGRhdGFbb2Zmc2V0ICsgMV0gPT0gMHgwMCAmJiBkYXRhW29mZnNldF0gPT0gMHgwMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSAzOworICAgICAgICBBU1NFUlRfTEUob2Zmc2V0LCBjaHVua0xlbmd0aCkgPDwgIk5BTCB1bml0IG9mZnNldCBtdXN0IG5vdCBleGNlZWQgdGhlIGNodW5rIGxlbmd0aCI7CisKKyAgICAgICAgdWludDhfdCAqbmFsVW5pdCA9ICh1aW50OF90ICopKGRhdGEgKyBvZmZzZXQpOworICAgICAgICBzaXplX3QgbmFsVW5pdExlbmd0aCA9IGNodW5rTGVuZ3RoIC0gb2Zmc2V0OworCisgICAgICAgIC8vIEFkZCBOQUwgdW5pdHMgb25seSBpZiB0aGV5J3JlIG9mIHR5cGU6IFZQUy9TUFMvUFBTL1NFSQorICAgICAgICBpZiAoISgodHlwZS5jb21wYXJlKCJWUFMiKSAmJiB0eXBlLmNvbXBhcmUoIlNQUyIpICYmIHR5cGUuY29tcGFyZSgiUFBTIikgJiYKKyAgICAgICAgICAgICAgIHR5cGUuY29tcGFyZSgiU0VJIikpKSkgeworICAgICAgICAgICAgZXJyID0gaGV2Y1BhcmFtcy5hZGROYWxVbml0KG5hbFVuaXQsIG5hbFVuaXRMZW5ndGgpOworICAgICAgICAgICAgQVNTRVJUX0VRKGVyciwgKHN0YXR1c190KU9LKQorICAgICAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFkZCBOQUwgVW5pdCB0eXBlOiAiIDw8IHR5cGUgPDwgIiBTaXplOiAiIDw8IG5hbFVuaXRMZW5ndGg7CisKKyAgICAgICAgICAgIHNpemVfdCBzaXplTmFsVW5pdCA9IGhldmNQYXJhbXMuZ2V0U2l6ZShpbmRleCk7CisgICAgICAgICAgICBBU1NFUlRfRVEoc2l6ZU5hbFVuaXQsIG5hbFVuaXRMZW5ndGgpIDw8ICJJbnZhbGlkIHNpemUgcmV0dXJuZWQgZm9yIE5BTDogIiA8PCB0eXBlOworCisgICAgICAgICAgICB1aW50OF90ICpkZXN0aW5hdGlvbiA9ICh1aW50OF90ICopbWFsbG9jKG5hbFVuaXRMZW5ndGgpOworICAgICAgICAgICAgQVNTRVJUX05FKGRlc3RpbmF0aW9uLCBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBvZiBzaXplOiAiIDw8IG5hbFVuaXRMZW5ndGg7CisKKyAgICAgICAgICAgIGJvb2wgc3RhdHVzID0gaGV2Y1BhcmFtcy53cml0ZShpbmRleCwgZGVzdGluYXRpb24sIG5hbFVuaXRMZW5ndGgpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiVW5hYmxlIHRvIHdyaXRlIE5BTCBVbml0IGRhdGEiOworCisgICAgICAgICAgICBmcmVlKGRlc3RpbmF0aW9uKTsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnIgPSBoZXZjUGFyYW1zLmFkZE5hbFVuaXQobmFsVW5pdCwgbmFsVW5pdExlbmd0aCk7CisgICAgICAgICAgICBBU1NFUlRfTkUoZXJyLCAoc3RhdHVzX3QpT0spIDw8ICJJbnZhbGlkIE5BTCBVbml0IGFkZGVkLCB0eXBlOiAiIDw8IHR5cGU7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShkYXRhKTsKKyAgICB9CisKKyAgICBzaXplX3QgbnVtTmFsVW5pdHMgPSBoZXZjUGFyYW1zLmdldE51bU5hbFVuaXRzT2ZUeXBlKGtWUFNDb2RlKTsKKyAgICBBU1NFUlRfRVEobnVtTmFsVW5pdHMsIG1OdW1WUFNOYWxzKSA8PCAiV3JvbmcgbnVtYmVyIG9mIFZQUyBOQUwgVW5pdHMiOworCisgICAgbnVtTmFsVW5pdHMgPSBoZXZjUGFyYW1zLmdldE51bU5hbFVuaXRzT2ZUeXBlKGtTUFNDb2RlKTsKKyAgICBBU1NFUlRfRVEobnVtTmFsVW5pdHMsIG1OdW1TUFNOYWxzKSA8PCAiV3JvbmcgbnVtYmVyIG9mIFNQUyBOQUwgVW5pdHMiOworCisgICAgbnVtTmFsVW5pdHMgPSBoZXZjUGFyYW1zLmdldE51bU5hbFVuaXRzT2ZUeXBlKGtQUFNDb2RlKTsKKyAgICBBU1NFUlRfRVEobnVtTmFsVW5pdHMsIG1OdW1QUFNOYWxzKSA8PCAiV3JvbmcgbnVtYmVyIG9mIFBQUyBOQUwgVW5pdHMiOworCisgICAgSGV2Y1BhcmFtZXRlclNldHM6OkluZm8gaW5mbyA9IGhldmNQYXJhbXMuZ2V0SW5mbygpOworICAgIEFTU0VSVF9FUShpbmZvICYgSGV2Y1BhcmFtZXRlclNldHM6OmtJbmZvSXNIZHIsCisgICAgICAgICAgICAgIChtSXNIRFIgPyBIZXZjUGFyYW1ldGVyU2V0czo6a0luZm9Jc0hkciA6IEhldmNQYXJhbWV0ZXJTZXRzOjprSW5mb05vbmUpKQorICAgICAgICAgICAgPDwgIldyb25nIGluZm8gYWJvdXQgSERSIjsKKworICAgIEFTU0VSVF9FUShpbmZvICYgSGV2Y1BhcmFtZXRlclNldHM6OmtJbmZvSGFzQ29sb3JEZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgKG1Jc0hEUiA/IEhldmNQYXJhbWV0ZXJTZXRzOjprSW5mb0hhc0NvbG9yRGVzY3JpcHRpb24gOiBIZXZjUGFyYW1ldGVyU2V0czo6a0luZm9Ob25lKSkKKyAgICAgICAgICAgIDw8ICJXcm9uZyBpbmZvIGFib3V0IGNvbG9yIGRlc2NyaXB0aW9uIjsKKworICAgIC8vIGFuIEhFVkMgZmlsZSBzdGFydHMgd2l0aCBWUFMsIFNQUyBhbmQgUFBTIE5BTCB1bml0cyBpbiBzZXF1ZW5jZS4KKyAgICB1aW50OF90IHR5cGVOYWxVbml0ID0gaGV2Y1BhcmFtcy5nZXRUeXBlKDApOworICAgIEFTU0VSVF9FUSh0eXBlTmFsVW5pdCwga0hldmNOYWxVbml0VHlwZVZwcykKKyAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBOQUwgdHlwZTogMzIoVlBTKSwgZm91bmQ6ICIgPDwgdHlwZU5hbFVuaXQ7CisKKyAgICB0eXBlTmFsVW5pdCA9IGhldmNQYXJhbXMuZ2V0VHlwZSgxKTsKKyAgICBBU1NFUlRfRVEodHlwZU5hbFVuaXQsIGtIZXZjTmFsVW5pdFR5cGVTcHMpCisgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgTkFMIHR5cGU6IDMzKFNQUyksIGZvdW5kOiAiIDw8IHR5cGVOYWxVbml0OworCisgICAgdHlwZU5hbFVuaXQgPSBoZXZjUGFyYW1zLmdldFR5cGUoMik7CisgICAgQVNTRVJUX0VRKHR5cGVOYWxVbml0LCBrSGV2Y05hbFVuaXRUeXBlUHBzKQorICAgICAgICAgICAgPDwgIkV4cGVjdGVkIE5BTCB0eXBlOiAzNChQUFMpLCBmb3VuZDogIiA8PCB0eXBlTmFsVW5pdDsKKworICAgIHNpemVfdCBodmNjQm94U2l6ZSA9IGtIdmNjQm94TWF4U2l6ZTsKKyAgICB1aW50OF90ICpodmNjID0gKHVpbnQ4X3QgKiltYWxsb2Moa0h2Y2NCb3hNYXhTaXplKTsKKyAgICBBU1NFUlRfTkUoaHZjYywgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGh2Y2MgYnVmZmVyIG9mIHNpemU6ICIgPDwga0h2Y2NCb3hNYXhTaXplOworCisgICAgZXJyID0gaGV2Y1BhcmFtcy5tYWtlSHZjYyhodmNjLCAmaHZjY0JveFNpemUsIGtOQUxTaXplTGVuZ3RoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCAoc3RhdHVzX3QpT0spIDw8ICJVbmFibGUgdG8gY3JlYXRlIGh2Y2MgYm94IjsKKworICAgIEFTU0VSVF9HVChodmNjQm94U2l6ZSwga0h2Y2NCb3hNaW5TaXplKQorICAgICAgICAgICAgPDwgIkh2Y2MgYm94IHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gIiA8PCBrSHZjY0JveE1pblNpemU7CisKKyAgICBpbnQxNl90IGZyYW1lUmF0ZSA9IGh2Y2Nba0h2Y2NCb3hNaW5TaXplIC0gMV0gfCAoaHZjY1trSHZjY0JveE1pblNpemVdIDw8IDgpOworICAgIGlmIChmcmFtZVJhdGUgIT0gbUZyYW1lUmF0ZSkKKyAgICAgICAgY291dCA8PCAiWyAgIFdBUk4gICBdIEV4cGVjdGVkIGZyYW1lIHJhdGU6ICIgPDwgbUZyYW1lUmF0ZSA8PCAiIEZvdW5kOiAiIDw8IGZyYW1lUmF0ZQorICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICBmcmVlKGh2Y2MpOworfQorCisvLyBJbmZvIEZpbGUgY29udGFpbnMgdGhlIHR5cGUgYW5kIGxlbmd0aCBmb3IgZWFjaCBjaHVuay9mcmFtZQorSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBIRVZDVXRpbHNVbml0VGVzdEFsbCwgSEVWQ1V0aWxzVW5pdFRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoImNyb3dkXzM4NDB4MjE2MHA1MGYzMDBfMzI1MDBrYnBzLmhldmMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF8zODQweDIxNjBwNTBmMzAwXzMyNTAwa2Jwcy5pbmZvIiwgMSwgMSwgMSwgNTAsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTkyMHgxMDgwcDI0ZjMwMF80NTAwa2Jwcy5oZXZjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfMTkyMHgxMDgwcDI0ZjMwMF80NTAwa2Jwcy5pbmZvIiwgMSwgMSwgMSwgMjQsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTI4MHg3MjBwMjRmMzAwXzMwMDBrYnBzLmhldmMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF8xMjgweDcyMHAyNGYzMDBfMzAwMGticHMuaW5mbyIsIDEsIDEsIDEsIDI0LCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzY0MHgzNjBwMjRmMzAwXzUwMGticHMuaGV2YyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzY0MHgzNjBwMjRmMzAwXzUwMGticHMuaW5mbyIsIDEsIDEsIDEsIDI0LCBmYWxzZSkpKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgZ0VudiA9IG5ldyBIRVZDVXRpbHNUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIEFMT0dWKCJUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTBlOTljCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9SRUFETUUubWQKQEAgLTAsMCArMSwzOSBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIEhFVkMgVXRpbHMgVGVzdAorVGhlIEhFVkMgVXRpbGl0eSBVbml0IFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBIZXZjVXRpbHMgbGlicmFyeSBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIEhFVkNVdGlsc1VuaXRUZXN0CitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0L0hFVkNVdGlsc1VuaXRUZXN0L0hFVkNVdGlsc1VuaXRUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvSEVWQ1V0aWxzVW5pdFRlc3QvSEVWQ1V0aWxzVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0hFVkNVdGlscy9IRVZDVXRpbHNVbml0VGVzdC56aXApLiBEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCisKK2BgYAorYWRiIHB1c2ggSEVWQ1V0aWxzVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK3VzYWdlOiBIRVZDVXRpbHNVbml0VGVzdCAtUCBcPHBhdGhfdG9fZm9sZGVyXD4KK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9IRVZDVXRpbHNVbml0VGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvSEVWQ1V0aWxzVW5pdFRlc3QvCitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IEhFVkNVdGlsc1VuaXRUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZXh0cmFjdG9yRmFjdG9yeS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZXh0cmFjdG9yRmFjdG9yeS9BbmRyb2lkLmJwCmluZGV4IGUzZTYxZDcuLjE3MTc1NWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2V4dHJhY3RvckZhY3RvcnkvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9leHRyYWN0b3JGYWN0b3J5L0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF90ZXN0c19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfdGVzdHNfbGljZW5zZSIsCisgICAgXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogIkV4dHJhY3RvckZhY3RvcnlUZXN0IiwKICAgICBndGVzdDogdHJ1ZSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWU3NGU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsOTMgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X3Rlc3RzX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF90ZXN0c19saWNlbnNlIiwKKyAgICBdLAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2Z1enplcl9kZWZhdWx0cyIsCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2NvZGVjYmFzZSIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tZWRpYWNsb2NrX2Z1enplciIsCisgICAgc3JjczogWworICAgICAgICAiTWVkaWFDbG9ja0Z1enplci5jcHAiLAorICAgIF0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfZnV6emVyX2RlZmF1bHRzIl0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tZWRpYXNjYW5uZXJfZnV6emVyIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJTdGFnZWZyaWdodE1lZGlhU2Nhbm5lckZ1enplci5jcHAiLAorICAgIF0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfZnV6emVyX2RlZmF1bHRzIl0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9za2lwY3V0YnVmZmVyX2Z1enplciIsCisgICAgc3JjczogWworICAgICAgICAiU2tpcEN1dEJ1ZmZlckZ1enplci5jcHAiLAorICAgIF0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfZnV6emVyX2RlZmF1bHRzIl0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tZWRpYW11eGVyX2Z1enplciIsCisgICAgc3JjczogWworICAgICAgICAiTWVkaWFNdXhlckZ1enplci5jcHAiLAorICAgIF0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfZnV6emVyX2RlZmF1bHRzIl0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mcmFtZURlY29kZXJfZnV6emVyIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJGcmFtZURlY29kZXJGdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X2Z1enplcl9kZWZhdWx0cyJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfd3JpdGVyX2Z1enplciIsCisgICAgc3JjczogWworICAgICAgICAiRnV6emVyTWVkaWFVdGlsaXR5LmNwcCIsCisgICAgICAgICJXcml0ZXJGdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIGRpY3Rpb25hcnk6ICJkaWN0aW9uYXJpZXMvZm9ybWF0cy5kaWN0IiwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9mdXp6ZXJfZGVmYXVsdHMiXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfd2VibSIsCisgICAgICAgICJsaWJkYXRhc291cmNlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAorICAgICAgICAibGlib2dnIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9GcmFtZURlY29kZXJGdXp6ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9GcmFtZURlY29kZXJGdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MjhjNzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0ZyYW1lRGVjb2RlckZ1enplci5jcHAKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlL0ZyYW1lRGVjb2Rlci5oIgorI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgIkZyYW1lRGVjb2RlckhlbHBlcnMuaCIKKyNpbmNsdWRlICJJTWVkaWFTb3VyY2VGdXp6SW1wbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgTUFYX01FRElBX0JVRkZFUl9TSVpFIDIwNDgKKworLy8gRnV6emVyIGVudHJ5IHBvaW50LgorZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIC8vIEluaXQgb3VyIHdyYXBwZXIKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgZmRwKGRhdGEsIHNpemUpOworCisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGZkcC5yZW1haW5pbmdfYnl0ZXMoKSk7CisgICAgQVN0cmluZyBjb21wb25lbnROYW1lKG5hbWUuY19zdHIoKSk7CisgICAgc3A8TWV0YURhdGE+IHRyYWNrTWV0YSA9IGdlbmVyYXRlTWV0YURhdGEoJmZkcCk7CisgICAgc3A8SU1lZGlhU291cmNlPiBzb3VyY2UgPSBuZXcgSU1lZGlhU291cmNlRnV6ekltcGwoJmZkcCwgTUFYX01FRElBX0JVRkZFUl9TSVpFKTsKKworICAgIC8vIEltYWdlIG9yIHZpZGVvIERlY29kZXI/CisgICAgc3A8RnJhbWVEZWNvZGVyPiBkZWNvZGVyOworICAgIGJvb2wgaXNWaWRlb0RlY29kZXIgPSBmZHAuQ29uc3VtZUJvb2woKTsKKyAgICBpZiAoaXNWaWRlb0RlY29kZXIpIHsKKyAgICAgICAgZGVjb2RlciA9IG5ldyBWaWRlb0ZyYW1lRGVjb2Rlcihjb21wb25lbnROYW1lLCB0cmFja01ldGEsIHNvdXJjZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVjb2RlciA9IG5ldyBJbWFnZURlY29kZXIoY29tcG9uZW50TmFtZSwgdHJhY2tNZXRhLCBzb3VyY2UpOworICAgIH0KKworICAgIHdoaWxlIChmZHAucmVtYWluaW5nX2J5dGVzKCkpIHsKKyAgICAgICAgc3dpdGNoIChmZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50OF90PigwLCAzKSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGRlY29kZXItPmluaXQoLypmcmFtZVRpbWVVcyovIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3B0aW9uKi8gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvbG9yRm9ybWF0Ki8gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGRlY29kZXItPmV4dHJhY3RGcmFtZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiB7CisgICAgICAgICAgICAgICAgRnJhbWVSZWN0IHJlY3Q7CisgICAgICAgICAgICAgICAgcmVjdC5sZWZ0ID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgICAgICAgICAgICAgIHJlY3QudG9wID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgICAgICAgICAgICAgIHJlY3QucmlnaHQgPSBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgICAgICAgICAgICAgcmVjdC5ib3R0b20gPSBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgICAgICAgICAgICAgZGVjb2Rlci0+ZXh0cmFjdEZyYW1lKCZyZWN0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgMzogeworICAgICAgICAgICAgICAgIHNwPE1ldGFEYXRhPiB0cmFja01ldGEgPSBnZW5lcmF0ZU1ldGFEYXRhKCZmZHApOworICAgICAgICAgICAgICAgIGRlY29kZXItPmdldE1ldGFkYXRhT25seSh0cmFja01ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29sb3JGb3JtYXQqLyBmZHAuQ29uc3VtZUludGVncmFsPGludD4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aHVtYm5haWwqLyBmZHAuQ29uc3VtZUJvb2woKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBnZW5lcmF0ZWRfbWltZV90eXBlcy5jbGVhcigpOworCisgICAgcmV0dXJuIDA7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvRnJhbWVEZWNvZGVySGVscGVycy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9GcmFtZURlY29kZXJIZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI4YzA0YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvRnJhbWVEZWNvZGVySGVscGVycy5oCkBAIC0wLDAgKzEsOTAgQEAKKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlICJNZWRpYU1pbWVUeXBlcy5oIgorCisjZGVmaW5lIE1BWF9NRVRBREFUQV9CVUZfU0laRSA1MTIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y2hhcj4+IGdlbmVyYXRlZF9taW1lX3R5cGVzOworCitzcDxNZXRhRGF0YT4gZ2VuZXJhdGVNZXRhRGF0YShGdXp6ZWREYXRhUHJvdmlkZXIgKmZkcCkgeworICAgIHNwPE1ldGFEYXRhPiBuZXdNZXRhID0gbmV3IE1ldGFEYXRhKCk7CisKKyAgICAvLyByYW5kb20gTUlNRSBUeXBlCisgICAgY29uc3QgY2hhciAqbWltZV90eXBlOworICAgIHNpemVfdCBpbmRleCA9IGZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIGtNaW1lVHlwZXMuc2l6ZSgpKTsKKyAgICAvLyBMZXQgdGhlcmUgYmUgYSBjaGFuY2Ugb2YgYSB0cnVlIHJhbmRvbSBzdHJpbmcKKyAgICBpZiAoaW5kZXggPT0ga01pbWVUeXBlcy5zaXplKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbWltZV9zdHIgPSBmZHAtPkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoNjQpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y2hhcj4gbWltZV9jc3RyKG5ldyBjaGFyW21pbWVfc3RyLmxlbmd0aCgpKzFdKTsKKyAgICAgICAgZ2VuZXJhdGVkX21pbWVfdHlwZXMucHVzaF9iYWNrKG1pbWVfY3N0cik7CisgICAgICAgIHN0cm5jcHkobWltZV9jc3RyLmdldCgpLCBtaW1lX3N0ci5jX3N0cigpLCBtaW1lX3N0ci5sZW5ndGgoKSsxKTsKKyAgICAgICAgbWltZV90eXBlID0gbWltZV9jc3RyLmdldCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1pbWVfdHlwZSA9IGtNaW1lVHlwZXNbaW5kZXhdOworICAgIH0KKyAgICBuZXdNZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZV90eXBlKTsKKworICAgIC8vIFRodW1ibmFpbCB0aW1lCisgICAgbmV3TWV0YS0+c2V0SW50NjQoa0tleVRodW1ibmFpbFRpbWUsIGZkcC0+Q29uc3VtZUludGVncmFsPGludDY0X3Q+KCkpOworCisgICAgLy8gVmFsdWVzIHVzZWQgYnkgYWxsb2NWaWRlb0ZyYW1lCisgICAgbmV3TWV0YS0+c2V0SW50MzIoa0tleVJvdGF0aW9uLCBmZHAtPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICBzaXplX3QgcHJvZmlsZV9zaXplID0KKyAgICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgTUFYX01FVEFEQVRBX0JVRl9TSVpFKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwcm9maWxlX2J5dGVzID0KKyAgICAgICAgZmRwLT5Db25zdW1lQnl0ZXM8dWludDhfdD4ocHJvZmlsZV9zaXplKTsKKyAgICBuZXdNZXRhLT5zZXREYXRhKGtLZXlJY2NQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSwKKyAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfYnl0ZXMuZW1wdHkoKSA/IG51bGxwdHIgOiBwcm9maWxlX2J5dGVzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfYnl0ZXMuc2l6ZSgpKTsKKyAgICBuZXdNZXRhLT5zZXRJbnQzMihrS2V5U0FSV2lkdGgsIGZkcC0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgIG5ld01ldGEtPnNldEludDMyKGtLZXlTQVJIZWlnaHQsIGZkcC0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgIG5ld01ldGEtPnNldEludDMyKGtLZXlEaXNwbGF5V2lkdGgsIGZkcC0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgIG5ld01ldGEtPnNldEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCBmZHAtPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKworICAgIC8vIFZhbHVlcyB1c2VkIGJ5IGZpbmRUaHVtYm5haWxJbmZvCisgICAgbmV3TWV0YS0+c2V0SW50MzIoa0tleVRodW1ibmFpbFdpZHRoLCBmZHAtPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICBuZXdNZXRhLT5zZXRJbnQzMihrS2V5VGh1bWJuYWlsSGVpZ2h0LCBmZHAtPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICBzaXplX3QgdGh1bWJuYWlsX3NpemUgPQorICAgICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBNQVhfTUVUQURBVEFfQlVGX1NJWkUpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHRodW1iX2J5dGVzID0KKyAgICAgICAgZmRwLT5Db25zdW1lQnl0ZXM8dWludDhfdD4odGh1bWJuYWlsX3NpemUpOworICAgIG5ld01ldGEtPnNldERhdGEoa0tleVRodW1ibmFpbEhWQ0MsCisgICAgICAgICAgICAgICAgICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpLAorICAgICAgICAgICAgICAgICAgICAgdGh1bWJfYnl0ZXMuZW1wdHkoKSA/IG51bGxwdHIgOiB0aHVtYl9ieXRlcy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICB0aHVtYl9ieXRlcy5zaXplKCkpOworCisgICAgLy8gVmFsdWVzIHVzZWQgYnkgZmluZEdyaWRJbmZvCisgICAgbmV3TWV0YS0+c2V0SW50MzIoa0tleVRpbGVXaWR0aCwgZmRwLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgbmV3TWV0YS0+c2V0SW50MzIoa0tleVRpbGVIZWlnaHQsIGZkcC0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgIG5ld01ldGEtPnNldEludDMyKGtLZXlHcmlkUm93cywgZmRwLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgbmV3TWV0YS0+c2V0SW50MzIoa0tleUdyaWRDb2xzLCBmZHAtPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKworICAgIC8vIEEgZmV3IGZ1bmN0aW9ucyBwZXJmb3JtIGEgQ0hFQ0soKSB0aGF0IGhlaWdodC93aWR0aCBhcmUgc2V0CisgICAgbmV3TWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgZmRwLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgbmV3TWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBmZHAtPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKworICAgIHJldHVybiBuZXdNZXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9GdXp6ZXJNZWRpYVV0aWxpdHkuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9GdXp6ZXJNZWRpYVV0aWxpdHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMGFlOTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0Z1enplck1lZGlhVXRpbGl0eS5jcHAKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJGdXp6ZXJNZWRpYVV0aWxpdHkuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FBQ1dyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FNUldyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oPgorCisjaW5jbHVkZSAiTWVkaWFNaW1lVHlwZXMuaCIKKyNpbmNsdWRlICJ3ZWJtL1dlYm1Xcml0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworc3RkOjpzdHJpbmcgZ2VuTWltZVR5cGUoRnV6emVkRGF0YVByb3ZpZGVyICpkYXRhUHJvdmlkZXIpIHsKKyAgICB1aW50OF90IGlkeCA9IGRhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50OF90PigwLCBrTWltZVR5cGVzLnNpemUoKSAtIDEpOworICAgIHJldHVybiBzdGQ6OnN0cmluZyhrTWltZVR5cGVzW2lkeF0pOworfQorCitzcDxJTWVkaWFFeHRyYWN0b3I+IGdlbk1lZGlhRXh0cmFjdG9yKEZ1enplZERhdGFQcm92aWRlciAqZGF0YVByb3ZpZGVyLCBzdGQ6OnN0cmluZyBtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4RGF0YUFtb3VudCkgeworICAgIHVpbnQzMl90IGRhdGFCbG9iU2l6ZSA9IGRhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MTZfdD4oMCwgbWF4RGF0YUFtb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSA9IGRhdGFQcm92aWRlci0+Q29uc3VtZUJ5dGVzPHVpbnQ4X3Q+KGRhdGFCbG9iU2l6ZSk7CisgICAgLy8gZGF0YTpbPG1lZGlhdHlwZT5dWztiYXNlNjRdLDxkYXRhPgorICAgIHN0ZDo6c3RyaW5nIHVyaSgiZGF0YToiKTsKKyAgICB1cmkgKz0gbWltZVR5cGU7CisgICAgLy8gQ3VycmVudGx5IGxpYnN0YWdlZnJpZ2h0IG9ubHkgYWNjZXB0cyBiYXNlNjQgdXJpcworICAgIHVyaSArPSAiO2Jhc2U2NCwiOworICAgIGFuZHJvaWQ6OkFTdHJpbmcgb3V0OworICAgIGFuZHJvaWQ6OmVuY29kZUJhc2U2NChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCksICZvdXQpOworICAgIHVyaSArPSBvdXQuY19zdHIoKTsKKworICAgIHNwPERhdGFTb3VyY2U+IHNvdXJjZSA9CisgICAgICAgIERhdGFTb3VyY2VGYWN0b3J5OjpnZXRJbnN0YW5jZSgpLT5DcmVhdGVGcm9tVVJJKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIHVyaS5jX3N0cigpKTsKKworICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGUoc291cmNlKTsKK30KKworc3A8TWVkaWFTb3VyY2U+IGdlbk1lZGlhU291cmNlKEZ1enplZERhdGFQcm92aWRlciAqZGF0YVByb3ZpZGVyLCB1aW50MTZfdCBtYXhNZWRpYUJsb2JTaXplKSB7CisgICAgc3RkOjpzdHJpbmcgbWltZSA9IGdlbk1pbWVUeXBlKGRhdGFQcm92aWRlcik7CisgICAgc3A8SU1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBnZW5NZWRpYUV4dHJhY3RvcihkYXRhUHJvdmlkZXIsIG1pbWUsIG1heE1lZGlhQmxvYlNpemUpOworCisgICAgaWYgKGV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOyArK2kpIHsKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBleHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7CisKKyAgICAgICAgY29uc3QgY2hhciAqdHJhY2tNaW1lOworICAgICAgICBpZiAoIXN0cmNhc2VjbXAobWltZS5jX3N0cigpLCB0cmFja01pbWUpKSB7CisgICAgICAgICAgICBzcDxJTWVkaWFTb3VyY2U+IHRyYWNrID0gZXh0cmFjdG9yLT5nZXRUcmFjayhpKTsKKyAgICAgICAgICAgIGlmICh0cmFjayA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IENhbGxiYWNrTWVkaWFTb3VyY2UodHJhY2spOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3NwPE1lZGlhV3JpdGVyPiBjcmVhdGVXcml0ZXIoaW50IGZkLCBTdGFuZGFyZFdyaXRlcnMgd3JpdGVyVHlwZSwgc3A8TWV0YURhdGE+IGZpbGVNZXRhKSB7CisgICAgc3A8TWVkaWFXcml0ZXI+IHdyaXRlcjsKKyAgICBzd2l0Y2ggKHdyaXRlclR5cGUpIHsKKyAgICAgICAgY2FzZSBPR0c6CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgT2dnV3JpdGVyKGZkKTsKKyAgICAgICAgICAgIGZpbGVNZXRhLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG91dHB1dF9mb3JtYXQ6Ok9VVFBVVF9GT1JNQVRfT0dHKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFBQzoKKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBBQUNXcml0ZXIoZmQpOworICAgICAgICAgICAgZmlsZU1ldGEtPnNldEludDMyKGtLZXlGaWxlVHlwZSwgb3V0cHV0X2Zvcm1hdDo6T1VUUFVUX0ZPUk1BVF9BQUNfQURJRik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQUNfQURUUzoKKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBBQUNXcml0ZXIoZmQpOworICAgICAgICAgICAgZmlsZU1ldGEtPnNldEludDMyKGtLZXlGaWxlVHlwZSwgb3V0cHV0X2Zvcm1hdDo6T1VUUFVUX0ZPUk1BVF9BQUNfQURUUyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXRUJNOgorICAgICAgICAgICAgd3JpdGVyID0gbmV3IFdlYm1Xcml0ZXIoZmQpOworICAgICAgICAgICAgZmlsZU1ldGEtPnNldEludDMyKGtLZXlGaWxlVHlwZSwgb3V0cHV0X2Zvcm1hdDo6T1VUUFVUX0ZPUk1BVF9XRUJNKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1QRUc0OgorICAgICAgICAgICAgd3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKGZkKTsKKyAgICAgICAgICAgIGZpbGVNZXRhLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG91dHB1dF9mb3JtYXQ6Ok9VVFBVVF9GT1JNQVRfTVBFR180KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFNUl9OQjoKKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBBTVJXcml0ZXIoZmQpOworICAgICAgICAgICAgZmlsZU1ldGEtPnNldEludDMyKGtLZXlGaWxlVHlwZSwgb3V0cHV0X2Zvcm1hdDo6T1VUUFVUX0ZPUk1BVF9BTVJfTkIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQU1SX1dCOgorICAgICAgICAgICAgd3JpdGVyID0gbmV3IEFNUldyaXRlcihmZCk7CisgICAgICAgICAgICBmaWxlTWV0YS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBvdXRwdXRfZm9ybWF0OjpPVVRQVVRfRk9STUFUX0FNUl9XQik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNUEVHMlRTOgorICAgICAgICAgICAgd3JpdGVyID0gbmV3IE1QRUcyVFNXcml0ZXIoZmQpOworICAgICAgICAgICAgZmlsZU1ldGEtPnNldEludDMyKGtLZXlGaWxlVHlwZSwgb3V0cHV0X2Zvcm1hdDo6T1VUUFVUX0ZPUk1BVF9NUEVHMlRTKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmICh3cml0ZXIgIT0gbnVsbHB0cikgeworICAgICAgICBmaWxlTWV0YS0+c2V0SW50MzIoa0tleVJlYWxUaW1lUmVjb3JkaW5nLCBmYWxzZSk7CisgICAgfQorICAgIHJldHVybiB3cml0ZXI7Cit9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvRnV6emVyTWVkaWFVdGlsaXR5LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0Z1enplck1lZGlhVXRpbGl0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YmZiOTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0Z1enplck1lZGlhVXRpbGl0eS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorI2luY2x1ZGUgPGRhdGFzb3VyY2UvRGF0YVNvdXJjZUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9JTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DYWxsYmFja01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CitlbnVtIFN0YW5kYXJkV3JpdGVycyB7CisgICAgT0dHLAorICAgIEFBQywKKyAgICBBQUNfQURUUywKKyAgICBXRUJNLAorICAgIE1QRUc0LAorICAgIEFNUl9OQiwKKyAgICBBTVJfV0IsCisgICAgTVBFRzJUUywKKyAgICAvLyBBbGxvd3MgRnV6emVkRGF0YVByb3ZpZGVyIHRvIGZpbmQgdGhlIGVuZCBvZiB0aGlzIGVudW0uCisgICAga01heFZhbHVlID0gTVBFRzJUUywKK307CisKK3N0ZDo6c3RyaW5nIGdlbk1pbWVUeXBlKEZ1enplZERhdGFQcm92aWRlciAqZGF0YVByb3ZpZGVyKTsKK3NwPElNZWRpYUV4dHJhY3Rvcj4gZ2VuTWVkaWFFeHRyYWN0b3IoRnV6emVkRGF0YVByb3ZpZGVyICpkYXRhUHJvdmlkZXIsIHVpbnQxNl90IGRhdGFBbW91bnQpOworc3A8TWVkaWFTb3VyY2U+IGdlbk1lZGlhU291cmNlKEZ1enplZERhdGFQcm92aWRlciAqZGF0YVByb3ZpZGVyLCB1aW50MTZfdCBtYXhNZWRpYUJsb2JTaXplKTsKKworc3A8TWVkaWFXcml0ZXI+IGNyZWF0ZVdyaXRlcihpbnQzMl90IGZkLCBTdGFuZGFyZFdyaXRlcnMgd3JpdGVyVHlwZSwgc3A8TWV0YURhdGE+IGZpbGVNZXRhKTsKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0lNZWRpYVNvdXJjZUZ1enpJbXBsLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0lNZWRpYVNvdXJjZUZ1enpJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc2OTk1MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvSU1lZGlhU291cmNlRnV6ekltcGwuaApAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUVESUFTT1VSQ0VGVVpaSU1QTF9ICisjZGVmaW5lIElNRURJQVNPVVJDRUZVWlpJTVBMX0gKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSU1lZGlhU291cmNlRnV6ekltcGwgOiBwdWJsaWMgSU1lZGlhU291cmNlIHsKKyBwdWJsaWM6CisgICAgSU1lZGlhU291cmNlRnV6ekltcGwoRnV6emVkRGF0YVByb3ZpZGVyICpfZmRwLCBzaXplX3QgX21heF9idWZmZXJfc2l6ZSkgOgorICAgICAgICBmZHAoX2ZkcCksCisgICAgICAgIG1heF9idWZmZXJfc2l6ZShfbWF4X2J1ZmZlcl9zaXplKSB7fQorICAgIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhKikgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorICAgIHN0YXR1c190IHN0b3AoKSBvdmVycmlkZSB7IHJldHVybiAwOyB9CisgICAgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpIG92ZXJyaWRlIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgICBzdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVyQmFzZSoqLAorICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMqKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCByZWFkTXVsdGlwbGUoVmVjdG9yPE1lZGlhQnVmZmVyQmFzZSo+KiwgdWludDMyX3QsCisgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyopIG92ZXJyaWRlOworICAgIGJvb2wgc3VwcG9ydFJlYWRNdWx0aXBsZSgpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgICBib29sIHN1cHBvcnROb25ibG9ja2luZ1JlYWQoKSBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisgICAgc3RhdHVzX3QgcGF1c2UoKSBvdmVycmlkZSB7IHJldHVybiAwOyB9CisKKyBwcm90ZWN0ZWQ6CisgICAgSUJpbmRlciogb25Bc0JpbmRlcigpIHsgcmV0dXJuIG51bGxwdHI7IH0KKworIHByaXZhdGU6CisgICAgRnV6emVkRGF0YVByb3ZpZGVyICpmZHA7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPE1lZGlhQnVmZmVyQmFzZT4+IGJ1ZmZlcl9iYXNlczsKKyAgICBjb25zdCBzaXplX3QgbWF4X2J1ZmZlcl9zaXplOworfTsKKworLy8gVGhpcyBjbGFzcyBpcyBzaW1wbHkgdG8gZXhwb3NlIHRoZSBkZXN0cnVjdG9yCitjbGFzcyBNZWRpYUJ1ZmZlckZ1enpJbXBsIDogcHVibGljIE1lZGlhQnVmZmVyIHsKKyBwdWJsaWM6CisgICAgTWVkaWFCdWZmZXJGdXp6SW1wbCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgOiBNZWRpYUJ1ZmZlcihkYXRhLCBzaXplKSB7fQorICAgIH5NZWRpYUJ1ZmZlckZ1enpJbXBsKCkge30KK307CisKK3N0YXR1c190IElNZWRpYVNvdXJjZUZ1enpJbXBsOjpyZWFkKE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwKKyAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgVmVjdG9yPE1lZGlhQnVmZmVyQmFzZSo+IGJ1ZmZlcnM7CisgICAgc3RhdHVzX3QgcmV0ID0gcmVhZE11bHRpcGxlKCZidWZmZXJzLCAxLCBvcHRpb25zKTsKKyAgICAqYnVmZmVyID0gYnVmZmVycy5lbXB0eSgpID8gbnVsbHB0ciA6IGJ1ZmZlcnNbMF07CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBJTWVkaWFTb3VyY2VGdXp6SW1wbDo6cmVhZE11bHRpcGxlKFZlY3RvcjxNZWRpYUJ1ZmZlckJhc2UqPiogYnVmZmVycywKKyAgICAgICAgdWludDMyX3QgbWF4TnVtQnVmZmVycywgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zKikgeworICAgIHVpbnQzMl90IG51bV9idWZmZXJzID0KKyAgICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PigwLCBtYXhOdW1CdWZmZXJzKTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBudW1fYnVmZmVyczsgaSsrKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZiA9IGZkcC0+Q29uc3VtZUJ5dGVzPHVpbnQ4X3Q+KAorICAgICAgICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgbWF4X2J1ZmZlcl9zaXplKSk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhQnVmZmVyQmFzZT4gbWJiKAorICAgICAgICAgICAgbmV3IE1lZGlhQnVmZmVyRnV6ekltcGwoYnVmLmRhdGEoKSwgYnVmLnNpemUoKSkpOworCisgICAgICAgIGJ1ZmZlcl9iYXNlcy5wdXNoX2JhY2sobWJiKTsKKyAgICAgICAgYnVmZmVycy0+cHVzaF9iYWNrKG1iYi5nZXQoKSk7CisgICAgfQorCisgICAgLy8gU1RBVFVTX09LCisgICAgcmV0dXJuIDA7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIElNRURJQVNPVVJDRUZVWlpJTVBMX0gKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9NZWRpYUNsb2NrRnV6emVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvTWVkaWFDbG9ja0Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyNmYwYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvTWVkaWFDbG9ja0Z1enplci5jcHAKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8vIEF1dGhvcnM6IGNvcmJpbi5zb3VmZnJhbnRAbGV2aWF0aGFuc2VjdXJpdHkuY29tCisvLyAgICAgICAgICBkeWxhbi5rYXR6QGxldmlhdGhhbnNlY3VyaXR5LmNvbQorCisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgZmRwID0gRnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOworICAgIHNwPE1lZGlhQ2xvY2s+IG1DbG9jayhuZXcgTWVkaWFDbG9jayk7CisKKyAgICBib29sIHJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgICB3aGlsZSAoZmRwLnJlbWFpbmluZ19ieXRlcygpID4gMCkgeworICAgICAgICBzd2l0Y2ggKGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIDUpKSB7CisgICAgICAgICAgICBjYXNlIDA6IHsKKyAgICAgICAgICAgICAgICBpZiAocmVnaXN0ZXJlZCA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICBtQ2xvY2stPmluaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgMTogeworICAgICAgICAgICAgICAgIGludDY0X3Qgc3RhcnRpbmdUaW1lTWVkaWFVcyA9IGZkcC5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKTsKKyAgICAgICAgICAgICAgICBtQ2xvY2stPnNldFN0YXJ0aW5nVGltZU1lZGlhKHN0YXJ0aW5nVGltZU1lZGlhVXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAyOiB7CisgICAgICAgICAgICAgICAgbUNsb2NrLT5jbGVhckFuY2hvcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAzOiB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBhbmNob3JUaW1lUmVhbFVzID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpOworICAgICAgICAgICAgICAgIGludDY0X3QgYW5jaG9yVGltZU1lZGlhVXMgPSBmZHAuQ29uc3VtZUludGVncmFsPGludDY0X3Q+KCk7CisgICAgICAgICAgICAgICAgaW50NjRfdCBtYXhUaW1lTWVkaWFVcyA9IGZkcC5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKTsKKyAgICAgICAgICAgICAgICBtQ2xvY2stPnVwZGF0ZUFuY2hvcihhbmNob3JUaW1lTWVkaWFVcywgYW5jaG9yVGltZVJlYWxVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhUaW1lTWVkaWFVcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDQ6IHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG1heFRpbWVNZWRpYVVzID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpOworICAgICAgICAgICAgICAgIG1DbG9jay0+dXBkYXRlTWF4VGltZU1lZGlhKG1heFRpbWVNZWRpYVVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDU6IHsKKyAgICAgICAgICAgICAgICB3cDxBTWVzc2FnZT4gbXNnKG5ldyBBTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgbUNsb2NrLT5zZXROb3RpZmljYXRpb25NZXNzYWdlKG1zZy5wcm9tb3RlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9NZWRpYU1pbWVUeXBlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9NZWRpYU1pbWVUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMzM3YWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL01lZGlhTWltZVR5cGVzLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGVVpaRVJfTUVESUFNSU1FVFlQRVNfSF8KKyNkZWZpbmUgRlVaWkVSX01FRElBTUlNRVRZUEVTX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4ga01pbWVUeXBlcyB7CisgICAgTUVESUFfTUlNRVRZUEVfSU1BR0VfSlBFRywKKyAgICBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMsCisgICAgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4LAorICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSwKKyAgICBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEsCisgICAgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLAorICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsCisgICAgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsCisgICAgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywKKyAgICBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMiwKKyAgICBNRURJQV9NSU1FVFlQRV9WSURFT19SQVcsCisgICAgTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OLAorICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1NDUkFNQkxFRCwKKyAgICBNRURJQV9NSU1FVFlQRV9WSURFT19ESVZYLAorICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0RJVlgzLAorICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1hWSUQsCisgICAgTUVESUFfTUlNRVRZUEVfVklERU9fTUpQRUcsCisgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLAorICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwKKyAgICBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHLAorICAgIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSSwKKyAgICBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJLAorICAgIE1FRElBX01JTUVUWVBFX0FVRElPX01JREksCisgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLAorICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQLAorICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywKKyAgICBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLAorICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVywKKyAgICBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcsCisgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXLAorICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMsCisgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFMsCisgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00sCisgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzLAorICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzMsCisgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDM19KT0MsCisgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0LAorICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1NDUkFNQkxFRCwKKyAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDLAorICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1dNQSwKKyAgICBNRURJQV9NSU1FVFlQRV9BVURJT19NU19BRFBDTSwKKyAgICBNRURJQV9NSU1FVFlQRV9BVURJT19EVklfSU1BX0FEUENNLAorICAgIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCwKKyAgICBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV0FWLAorICAgIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0csCisgICAgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01BVFJPU0tBLAorICAgIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTLAorICAgIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9BVkksCisgICAgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyUFMsCisgICAgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0hFSUYsCisgICAgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQLAorICAgIE1FRElBX01JTUVUWVBFX1RFWFRfU1VCUklQLAorICAgIE1FRElBX01JTUVUWVBFX1RFWFRfVlRULAorICAgIE1FRElBX01JTUVUWVBFX1RFWFRfQ0VBXzYwOCwKKyAgICBNRURJQV9NSU1FVFlQRV9URVhUX0NFQV83MDgsCisgICAgTUVESUFfTUlNRVRZUEVfREFUQV9USU1FRF9JRDMKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gRlVaWkVSX01FRElBTUlNRVRZUEVTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL01lZGlhTXV4ZXJGdXp6ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9NZWRpYU11eGVyRnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGYzMjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9NZWRpYU11eGVyRnV6emVyLmNwcApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8vIEF1dGhvcnM6IGNvcmJpbi5zb3VmZnJhbnRAbGV2aWF0aGFuc2VjdXJpdHkuY29tCisvLyAgICAgICAgICBkeWxhbi5rYXR6QGxldmlhdGhhbnNlY3VyaXR5LmNvbQorCisjaW5jbHVkZSA8TWVkaWFNdXhlckZ1enplci5oPgorI2luY2x1ZGUgPGN1dGlscy9hc2htZW0uaD4KKyNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBDYW4ndCBzZWVtIHRvIGdldCBzZXRCdWZmZXIgb3Igc2V0U3RyaW5nIHdvcmtpbmcuIEl0IGFsd2F5cyBzZWdmYXVsdHMgb24gYQorLy8gbnVsbCBwb2ludGVyIHJlYWQgb3IgbWVtbGVha3MuIFNvIHRoYXQgZnVuY3Rpb25hbGl0eSBpcyBtaXNzaW5nLgordm9pZCBjcmVhdGVNZXNzYWdlKEFNZXNzYWdlICptc2csIEZ1enplZERhdGFQcm92aWRlciAqZmRwKSB7CisgIHNpemVfdCBjb3VudCA9IGZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIDMyKTsKKyAgd2hpbGUgKGZkcC0+cmVtYWluaW5nX2J5dGVzKCkgPiAwICYmIGNvdW50ID4gMCkgeworICAgIHVpbnQ4X3QgZnVuY3Rpb25faWQgPQorICAgICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgYW1lc3NhZ2Vfc2V0dmFscy5zaXplKCkgLSAxKTsKKyAgICBhbWVzc2FnZV9zZXR2YWxzW2Z1bmN0aW9uX2lkXShtc2csIGZkcCk7CisgICAgY291bnQtLTsKKyAgfQorfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIEZ1enplZERhdGFQcm92aWRlciBmZHAgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisKKyAgc2l6ZV90IGRhdGFfc2l6ZSA9IGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgc2l6ZSk7CisgIGludCBmZCA9IGFzaG1lbV9jcmVhdGVfcmVnaW9uKCJtZWRpYW11eGVyX2Z1enpfcmVnaW9uIiwgZGF0YV9zaXplKTsKKyAgaWYgKGZkIDwgMCkKKyAgICByZXR1cm4gMDsKKworICB1aW50OF90ICpzaF9kYXRhID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPigKKyAgICAgIG1tYXAoTlVMTCwgZGF0YV9zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZCwgMCkpOworICBpZiAoc2hfZGF0YSA9PSBNQVBfRkFJTEVEKQorICAgIHJldHVybiAwOworCisgIE1lZGlhTXV4ZXI6Ok91dHB1dEZvcm1hdCBmb3JtYXQgPQorICAgICAgKE1lZGlhTXV4ZXI6Ok91dHB1dEZvcm1hdClmZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PigwLCA0KTsKKyAgc3A8TWVkaWFNdXhlcj4gbU11eGVyKG5ldyBNZWRpYU11eGVyKGZkLCBmb3JtYXQpKTsKKworICB3aGlsZSAoZmRwLnJlbWFpbmluZ19ieXRlcygpID4gMSkgeworICAgIHN3aXRjaCAoZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgNCkpIHsKKyAgICBjYXNlIDA6IHsKKyAgICAgIC8vIEZvciBzb21lIHJlYXNvbiBpdCBvbmx5IGxpa2VzIG1wNHMgaGVyZS4uLgorICAgICAgaWYgKGZvcm1hdCA9PSAxIHx8IGZvcm1hdCA9PSA0KQorICAgICAgICBicmVhazsKKworICAgICAgc3A8QU1lc3NhZ2U+IGFfZm9ybWF0KG5ldyBBTWVzc2FnZSk7CisgICAgICBjcmVhdGVNZXNzYWdlKGFfZm9ybWF0LmdldCgpLCAmZmRwKTsKKyAgICAgIG1NdXhlci0+YWRkVHJhY2soYV9mb3JtYXQpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMTogeworICAgICAgbU11eGVyLT5zdGFydCgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMjogeworICAgICAgaW50IGRlZ3JlZXMgPSBmZHAuQ29uc3VtZUludGVncmFsPGludD4oKTsKKyAgICAgIG1NdXhlci0+c2V0T3JpZW50YXRpb25IaW50KGRlZ3JlZXMpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMzogeworICAgICAgaW50IGxhdGl0dWRlID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCk7CisgICAgICBpbnQgbG9uZ2l0dWRlID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCk7CisgICAgICBtTXV4ZXItPnNldExvY2F0aW9uKGxhdGl0dWRlLCBsb25naXR1ZGUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgNDogeworICAgICAgc2l6ZV90IGJ1Zl9zaXplID0gZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBkYXRhX3NpemUpOworICAgICAgc3A8QUJ1ZmZlcj4gYV9idWZmZXIobmV3IEFCdWZmZXIoYnVmX3NpemUpKTsKKworICAgICAgc2l6ZV90IHRyYWNrSW5kZXggPSBmZHAuQ29uc3VtZUludGVncmFsPHNpemVfdD4oKTsKKyAgICAgIGludDY0X3QgdGltZVVzID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpOworICAgICAgdWludDMyX3QgZmxhZ3MgPSBmZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICAgICAgbU11eGVyLT53cml0ZVNhbXBsZURhdGEoYV9idWZmZXIsIHRyYWNrSW5kZXgsIHRpbWVVcywgZmxhZ3MpOworICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoZmRwLkNvbnN1bWVCb29sKCkpCisgICAgbU11eGVyLT5zdG9wKCk7CisKKyAgbXVubWFwKHNoX2RhdGEsIGRhdGFfc2l6ZSk7CisgIGNsb3NlKGZkKTsKKyAgcmV0dXJuIDA7Cit9Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL01lZGlhTXV4ZXJGdXp6ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvTWVkaWFNdXhlckZ1enplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNDQyMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL01lZGlhTXV4ZXJGdXp6ZXIuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8vIEF1dGhvcnM6IGNvcmJpbi5zb3VmZnJhbnRAbGV2aWF0aGFuc2VjdXJpdHkuY29tCisvLyAgICAgICAgICBkeWxhbi5rYXR6QGxldmlhdGhhbnNlY3VyaXR5LmNvbQorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gTWFwcGluZ3MgdmVjdG9ycyBhcmUgdGhlIGxpc3Qgb2YgYXR0cmlidXRlcyB0aGF0IHRoZSBNZWRpYU11eGVyCisvLyBjbGFzcyBsb29rcyBmb3IgaW4gdGhlIG1lc3NhZ2UuCitzdGF0aWMgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiBmbG9hdE1hcHBpbmdzeworICAgICJjYXB0dXJlLXJhdGUiLAorICAgICJ0aW1lLWxhcHNlLWZwcyIsCisgICAgImZyYW1lLXJhdGUiLAorfTsKKworc3RhdGljIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gaW50NjRNYXBwaW5nc3sKKyAgICAiZXhpZi1vZmZzZXQiLCAgICAiZXhpZi1zaXplIiwgInRhcmdldC10aW1lIiwKKyAgICAidGh1bWJuYWlsLXRpbWUiLCAidGltZVVzIiwgICAgImR1cmF0aW9uVXMiLAorfTsKKworc3RhdGljIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gaW50MzJNYXBwaW5nc3sibG9vcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lLXNjYWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyeXB0by1tb2RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyeXB0by1kZWZhdWx0LWl2LXNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3J5cHRvLWVuY3J5cHRlZC1ieXRlLWJsb2NrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyeXB0by1za2lwLWJ5dGUtYmxvY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWUtY291bnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4LWJpdHJhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNtLWJpZy1lbmRpYW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVtcG9yYWwtbGF5ZXItY291bnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVtcG9yYWwtbGF5ZXItaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGh1bWJuYWlsLXdpZHRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRodW1ibmFpbC1oZWlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhY2staWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsaWQtc2FtcGxlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvci1mb3JtYXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Etc3lzdGVtLWlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzLXN5bmMtZnJhbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYml0cmF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXgtYml0cmF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2FyLXdpZHRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhci1oZWlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlzcGxheS13aWR0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXNwbGF5LWhlaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcy1kZWZhdWx0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbGUtd2lkdGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGlsZS1oZWlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3JpZC1yb3dzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyaWQtY29scyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyb3RhdGlvbi1kZWdyZWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWwtY291bnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2FtcGxlLXJhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYml0cy1wZXItc2FtcGxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWwtbWFzayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmNvZGVyLWRlbGF5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuY29kZXItcGFkZGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcy1hZHRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyYW1lLXJhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4LWhlaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXgtd2lkdGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4LWlucHV0LXNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFwdGljLWNoYW5uZWwtY291bnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNtLWVuY29kaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFhYy1wcm9maWxlIn07CisKK3N0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoQU1lc3NhZ2UgKiwgRnV6emVkRGF0YVByb3ZpZGVyICopPj4KKyAgICBhbWVzc2FnZV9zZXR2YWxzID0geworICAgICAgICBbXShBTWVzc2FnZSAqbXNnLCBGdXp6ZWREYXRhUHJvdmlkZXIgKmZkcCkgLT4gdm9pZCB7CisgICAgICAgICAgbXNnLT5zZXRSZWN0KCJjcm9wIiwgZmRwLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgICAgIH0sCisgICAgICAgIFtdKEFNZXNzYWdlICptc2csIEZ1enplZERhdGFQcm92aWRlciAqZmRwKSAtPiB2b2lkIHsKKyAgICAgICAgICBtc2ctPnNldEZsb2F0KGZsb2F0TWFwcGluZ3NbZmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZmxvYXRNYXBwaW5ncy5zaXplKCkgLSAxKV0sCisgICAgICAgICAgICAgICAgICAgICAgICBmZHAtPkNvbnN1bWVGbG9hdGluZ1BvaW50PGZsb2F0PigpKTsKKyAgICAgICAgfSwKKyAgICAgICAgW10oQU1lc3NhZ2UgKm1zZywgRnV6emVkRGF0YVByb3ZpZGVyICpmZHApIC0+IHZvaWQgeworICAgICAgICAgIG1zZy0+c2V0SW50NjQoaW50NjRNYXBwaW5nc1tmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBpbnQ2NE1hcHBpbmdzLnNpemUoKSAtIDEpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkcC0+Q29uc3VtZUludGVncmFsPGludDY0X3Q+KCkpOworICAgICAgICB9LAorICAgICAgICBbXShBTWVzc2FnZSAqbXNnLCBGdXp6ZWREYXRhUHJvdmlkZXIgKmZkcCkgLT4gdm9pZCB7CisgICAgICAgICAgbXNnLT5zZXRJbnQzMihpbnQzMk1hcHBpbmdzW2ZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGludDMyTWFwcGluZ3Muc2l6ZSgpIC0gMSldLAorICAgICAgICAgICAgICAgICAgICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgICAgIH19OworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9Ta2lwQ3V0QnVmZmVyRnV6emVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvU2tpcEN1dEJ1ZmZlckZ1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3OGU2ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvU2tpcEN1dEJ1ZmZlckZ1enplci5jcHAKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8vIEF1dGhvcnM6IGNvcmJpbi5zb3VmZnJhbnRAbGV2aWF0aGFuc2VjdXJpdHkuY29tCisvLyAgICAgICAgICBkeWxhbi5rYXR6QGxldmlhdGhhbnNlY3VyaXR5LmNvbQorCisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBGdXp6ZWREYXRhUHJvdmlkZXIgZmRwID0gRnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOworICBzaXplX3Qgc2tpcCA9IGZkcC5Db25zdW1lSW50ZWdyYWw8c2l6ZV90PigpOworICBzaXplX3QgY3V0ID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxzaXplX3Q+KCk7CisgIHNpemVfdCBudW0xNkNoYW5uZWxzID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxzaXplX3Q+KCk7CisgIHNwPFNraXBDdXRCdWZmZXI+IHNCdWZmZXIobmV3IFNraXBDdXRCdWZmZXIoc2tpcCwgY3V0LCBudW0xNkNoYW5uZWxzKSk7CisKKyAgd2hpbGUgKGZkcC5yZW1haW5pbmdfYnl0ZXMoKSA+IDApIHsKKyAgICAvLyBDYXAgc2l6ZSB0byAxMDI0IHRvIGxpbWl0IG1heCBhbW91bnQgYWxsb2NhdGVkLgorICAgIHNpemVfdCBidWZfc2l6ZSA9IGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgMTAyNCk7CisgICAgc2l6ZV90IHJhbmdlID0gZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBidWZfc2l6ZSk7CisgICAgc2l6ZV90IGxlbmd0aCA9IGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgYnVmX3NpemUgLSByYW5nZSk7CisKKyAgICBzd2l0Y2ggKGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIDQpKSB7CisgICAgY2FzZSAwOiB7CisgICAgICBzcDxBQnVmZmVyPiBhX2J1ZmZlcihuZXcgQUJ1ZmZlcihidWZfc2l6ZSkpOworICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdChuZXcgQU1lc3NhZ2UpOworICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gc19idWZmZXIobmV3IE1lZGlhQ29kZWNCdWZmZXIoZm9ybWF0LCBhX2J1ZmZlcikpOworICAgICAgc19idWZmZXItPnNldFJhbmdlKHJhbmdlLCBsZW5ndGgpOworICAgICAgc0J1ZmZlci0+c3VibWl0KHNfYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDE6IHsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUJ1ZmZlckJhc2U+IG1fYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihidWZfc2l6ZSkpOworICAgICAgbV9idWZmZXItPnNldF9yYW5nZShyYW5nZSwgbGVuZ3RoKTsKKyAgICAgIHNCdWZmZXItPnN1Ym1pdChyZWludGVycHJldF9jYXN0PE1lZGlhQnVmZmVyICo+KG1fYnVmZmVyLmdldCgpKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAyOiB7CisgICAgICBzcDxBQnVmZmVyPiBhX2J1ZmZlcihuZXcgQUJ1ZmZlcihidWZfc2l6ZSkpOworICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdChuZXcgQU1lc3NhZ2UpOworICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gc19idWZmZXIobmV3IE1lZGlhQ29kZWNCdWZmZXIoZm9ybWF0LCBhX2J1ZmZlcikpOworICAgICAgYV9idWZmZXItPnNldFJhbmdlKHJhbmdlLCBsZW5ndGgpOworICAgICAgc0J1ZmZlci0+c3VibWl0KGFfYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDM6IHsKKyAgICAgIHNCdWZmZXItPmNsZWFyKCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA0OiB7CisgICAgICBzQnVmZmVyLT5zaXplKCk7CisgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXJGdXp6ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lckZ1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwYzk1MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXJGdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvLyBBdXRob3JzOiBjb3JiaW4uc291ZmZyYW50QGxldmlhdGhhbnNlY3VyaXR5LmNvbQorLy8gICAgICAgICAgZHlsYW4ua2F0ekBsZXZpYXRoYW5zZWN1cml0eS5jb20KKworI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5oPgorCisjaW5jbHVkZSA8Y3N0ZGlvPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CitjbGFzcyBGdXp6TWVkaWFTY2FubmVyQ2xpZW50IDogcHVibGljIE1lZGlhU2Nhbm5lckNsaWVudCB7CisgcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2NhbkZpbGUoY29uc3QgY2hhciosIGxvbmcgbG9uZywgbG9uZyBsb25nLCBib29sLCBib29sKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlU3RyaW5nVGFnKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKikgeyByZXR1cm4gMDsgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaW1lVHlwZShjb25zdCBjaGFyKikgeyByZXR1cm4gMDsgfQorfTsKKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBmZHAgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisgICAgU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIgbVNjYW5uZXIgPSBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcigpOworICAgIC8vIFdpdGhvdXQgdGhpcywgdGhlIGZ1enplciBjcmFzaGVzIGZvciBzb21lIHJlYXNvbi4KKyAgICBtU2Nhbm5lci5zZXRMb2NhbGUoIiIpOworCisgICAgd2hpbGUgKGZkcC5yZW1haW5pbmdfYnl0ZXMoKSA+IDApIHsKKyAgICAgICAgc3dpdGNoIChmZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50OF90PigwLCAxKSkgeworICAgICAgICAgICAgY2FzZSAwOiB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcGF0aCA9IGZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGZkcC5yZW1haW5pbmdfYnl0ZXMoKSk7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWltZVR5cGUgPQorICAgICAgICAgICAgICAgICAgICBmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhmZHAucmVtYWluaW5nX2J5dGVzKCkpOworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNjYW5uZXJDbGllbnQ+IGNsaWVudChuZXcgRnV6ek1lZGlhU2Nhbm5lckNsaWVudCgpKTsKKyAgICAgICAgICAgICAgICBtU2Nhbm5lci5wcm9jZXNzRmlsZShwYXRoLmNfc3RyKCksIG1pbWVUeXBlLmNfc3RyKCksICpjbGllbnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAxOiB7CisgICAgICAgICAgICAgICAgaW50IGZkID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCk7CisgICAgICAgICAgICAgICAgaWYgKGZkID49IDAgJiYgZmQgPD0gMikgZmQgPSAzOworICAgICAgICAgICAgICAgIG1TY2FubmVyLmV4dHJhY3RBbGJ1bUFydChmZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9Xcml0ZXJGdXp6ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9Xcml0ZXJGdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZTliNDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL1dyaXRlckZ1enplci5jcHAKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvLyBBdXRob3JzOiBjb3JiaW4uc291ZmZyYW50QGxldmlhdGhhbnNlY3VyaXR5LmNvbQorLy8gICAgICAgICAgZHlsYW4ua2F0ekBsZXZpYXRoYW5zZWN1cml0eS5jb20KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgIkZ1enplck1lZGlhVXRpbGl0eS5oIgorI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKKworc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBrTWF4T3BlcmF0aW9ucyA9IDUwMDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga01heFBhY2thZ2VOYW1lTGVuID0gNTA7CisvLyBGb3Igb3RoZXIgc3RyaW5ncyBpbiBtcGVnIHdlIHdhbnQgYSBoaWdoZXIgbGltaXQuCitzdGF0aWMgY29uc3RleHByIHVpbnQxNl90IGtNYXhNUEVHU3RyTGVuID0gMTAwMDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDE2X3Qga01heE1lZGlhQmxvYlNpemUgPSAxMDAwOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0ZDo6c3RyaW5nIGdldEZvdXJDQyhGdXp6ZWREYXRhUHJvdmlkZXIgKmZkcCkgeworICAgIHN0ZDo6c3RyaW5nIGZvdXJDQyA9IGZkcC0+Q29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyg0KTsKKyAgICAvLyBSZXBsYWNlIGFueSBleGlzdGluZyBudWxscworICAgIGZvciAoc2l6ZV90IHBvcyA9IDA7IHBvcyA8IGZvdXJDQy5sZW5ndGgoKTsgcG9zKyspIHsKKyAgICAgICAgaWYgKGZvdXJDQy5hdChwb3MpID09ICdcMCcpIHsKKyAgICAgICAgICAgIGZvdXJDQy5yZXBsYWNlKHBvcywgMSwgImEiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElmIG91ciBzdHJpbmcgaXMgdG9vIHNob3J0LCBmaWxsIHRoZSByZW1haW5kZXIgd2l0aCAiYSJzLgorICAgIHdoaWxlIChmb3VyQ0MubGVuZ3RoKCkgPCA0KSB7CisgICAgICAgIGZvdXJDQyArPSAnYSc7CisgICAgfQorICAgIHJldHVybiBmb3VyQ0M7Cit9CisKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKEZ1enplZERhdGFQcm92aWRlciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxNZWRpYVdyaXRlcj4sIHNwPE1ldGFEYXRhPiwgaW50IHRtcEZpbGVGZCk+PiBPcGVyYXRpb25WZWM7Cit0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6ZnVuY3Rpb248dm9pZChGdXp6ZWREYXRhUHJvdmlkZXIqLCBNUEVHNFdyaXRlciopPj4gTVBFRzRPcGVyYXRpb25WZWM7CitzdGF0aWMgY29uc3QgT3BlcmF0aW9uVmVjIG9wZXJhdGlvbnMgPSB7CisgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiwgc3A8TWVkaWFXcml0ZXI+IG1lZGlhV3JpdGVyLCBzcDxNZXRhRGF0YT4sIGludCkgeworICAgICAgICBtZWRpYVdyaXRlci0+cGF1c2UoKTsKKyAgICB9LAorICAgIFtdKEZ1enplZERhdGFQcm92aWRlciAqZGF0YVByb3ZpZGVyLCBzcDxNZWRpYVdyaXRlcj4gbWVkaWFXcml0ZXIsIHNwPE1ldGFEYXRhPiwgaW50IHRtcEZkKSB7CisgICAgICAgIGJvb2wgdmFsaWRfZmQgPSBkYXRhUHJvdmlkZXItPkNvbnN1bWVCb29sKCk7CisgICAgICAgIGludCBmZCA9IC0xOworICAgICAgICBpZiAodmFsaWRfZmQpIHsKKyAgICAgICAgICAgIGZkID0gdG1wRmQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gQXJncyBkb24ndCBzZWVtIHRvIGJlIHVzZWQKKyAgICAgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOworICAgICAgICBtZWRpYVdyaXRlci0+ZHVtcChmZCwgYXJncyk7CisgICAgfSwKKyAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIgKmRhdGFQcm92aWRlciwgc3A8TWVkaWFXcml0ZXI+IG1lZGlhV3JpdGVyLCBzcDxNZXRhRGF0YT4sIGludCB0bXBGZCkgeworICAgICAgICBib29sIHZhbGlkX2ZkID0gZGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpOworICAgICAgICBpbnQgZmQgPSAtMTsKKyAgICAgICAgaWYgKHZhbGlkX2ZkKSB7CisgICAgICAgICAgICBmZCA9IHRtcEZkOworICAgICAgICB9CisgICAgICAgIG1lZGlhV3JpdGVyLT5zZXROZXh0RmQoZmQpOworICAgIH0sCisgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyICpkYXRhUHJvdmlkZXIsIHNwPE1lZGlhV3JpdGVyPiBtZWRpYVdyaXRlciwgc3A8TWV0YURhdGE+LCBpbnQpIHsKKyAgICAgICAgbWVkaWFXcml0ZXItPnNldENhcHR1cmVSYXRlKGRhdGFQcm92aWRlci0+Q29uc3VtZUZsb2F0aW5nUG9pbnQ8ZmxvYXQ+KCkpOworICAgIH0sCisgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyICpkYXRhUHJvdmlkZXIsIHNwPE1lZGlhV3JpdGVyPiBtZWRpYVdyaXRlciwgc3A8TWV0YURhdGE+LCBpbnQpIHsKKyAgICAgICAgbWVkaWFXcml0ZXItPnNldE1heEZpbGVEdXJhdGlvbihkYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpKTsKKyAgICB9LAorICAgIFtdKEZ1enplZERhdGFQcm92aWRlciAqZGF0YVByb3ZpZGVyLCBzcDxNZWRpYVdyaXRlcj4gbWVkaWFXcml0ZXIsIHNwPE1ldGFEYXRhPiwgaW50KSB7CisgICAgICAgIG1lZGlhV3JpdGVyLT5zZXRTdGFydFRpbWVPZmZzZXRNcyhkYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCkpOworCisgICAgICAgIC8vIExpa2VseSB3b24ndCBkbyBtdWNoLCBidXQgbWlnaHQgYXMgd2VsbCBhcyBkbyBhIHF1aWNrIGNoZWNrCisgICAgICAgIC8vIHdoaWxlIHdlJ3JlIGhlcmUuCisgICAgICAgIG1lZGlhV3JpdGVyLT5nZXRTdGFydFRpbWVPZmZzZXRNcygpOworICAgIH0sCisgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyICpkYXRhUHJvdmlkZXIsIHNwPE1lZGlhV3JpdGVyPiBtZWRpYVdyaXRlciwgc3A8TWV0YURhdGE+LCBpbnQpIHsKKyAgICAgICAgbWVkaWFXcml0ZXItPnNldE1heEZpbGVEdXJhdGlvbihkYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpKTsKKyAgICB9LAorICAgIFtdKEZ1enplZERhdGFQcm92aWRlciAqZGF0YVByb3ZpZGVyLCBzcDxNZWRpYVdyaXRlcj4gbWVkaWFXcml0ZXIsIHNwPE1ldGFEYXRhPiwgaW50KSB7CisgICAgICAgIG1lZGlhV3JpdGVyLT5zZXRNYXhGaWxlRHVyYXRpb24oZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKSk7CisgICAgfSwKK307CisKK3N0YXRpYyBjb25zdCBNUEVHNE9wZXJhdGlvblZlYyBtcGVnNE9wZXJhdGlvbnMgPSB7CisgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiwgTVBFRzRXcml0ZXIgKm1lZGlhV3JpdGVyKSB7IG1lZGlhV3JpdGVyLT5ub3RpZnlBcHByb2FjaGluZ0xpbWl0KCk7IH0sCisgICAgLy8gTG93ZXIgbGV2ZWwgd3JpdGUgbWV0aG9kcy4KKyAgICAvLyBIaWdoLWxldmVsIHN0YXJ0Qm94L2VuZEJveC9ldGMgYXJlIGFsbCBjYWxsZWQgZWxzZXdoZXJlLAorICAgIFtdKEZ1enplZERhdGFQcm92aWRlciAqZGF0YVByb3ZpZGVyLCBNUEVHNFdyaXRlciAqbWVkaWFXcml0ZXIpIHsKKyAgICAgICAgdWludDhfdCB2YWwgPSBkYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDx1aW50OF90PigpOworICAgICAgICBtZWRpYVdyaXRlci0+d3JpdGVJbnQ4KHZhbCk7CisgICAgfSwKKyAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIgKmRhdGFQcm92aWRlciwgTVBFRzRXcml0ZXIgKm1lZGlhV3JpdGVyKSB7CisgICAgICAgIHVpbnQxNl90IHZhbCA9IGRhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPHVpbnQxNl90PigpOworICAgICAgICBtZWRpYVdyaXRlci0+d3JpdGVJbnQxNih2YWwpOworICAgIH0sCisgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyICpkYXRhUHJvdmlkZXIsIE1QRUc0V3JpdGVyICptZWRpYVdyaXRlcikgeworICAgICAgICB1aW50MzJfdCB2YWwgPSBkYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgICAgICAgbWVkaWFXcml0ZXItPndyaXRlSW50MzIodmFsKTsKKyAgICB9LAorICAgIFtdKEZ1enplZERhdGFQcm92aWRlciAqZGF0YVByb3ZpZGVyLCBNUEVHNFdyaXRlciAqbWVkaWFXcml0ZXIpIHsKKyAgICAgICAgdWludDY0X3QgdmFsID0gZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8dWludDY0X3Q+KCk7CisgICAgICAgIG1lZGlhV3JpdGVyLT53cml0ZUludDY0KHZhbCk7CisgICAgfSwKKyAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIgKmRhdGFQcm92aWRlciwgTVBFRzRXcml0ZXIgKm1lZGlhV3JpdGVyKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0clZhbCA9IGRhdGFQcm92aWRlci0+Q29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4TVBFR1N0ckxlbik7CisgICAgICAgIG1lZGlhV3JpdGVyLT53cml0ZUNTdHJpbmcoc3RyVmFsLmNfc3RyKCkpOworICAgIH0sCisgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyICpkYXRhUHJvdmlkZXIsIE1QRUc0V3JpdGVyICptZWRpYVdyaXRlcikgeworICAgICAgICBzdGQ6OnN0cmluZyBmb3VyQ0MgPSBnZXRGb3VyQ0MoZGF0YVByb3ZpZGVyKTsKKyAgICAgICAgbWVkaWFXcml0ZXItPndyaXRlRm91cmNjKGZvdXJDQy5jX3N0cigpKTsKKyAgICB9LAorCisgICAgLy8gTWlzYyBzZXR0ZXJzCisgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyICpkYXRhUHJvdmlkZXIsIE1QRUc0V3JpdGVyICptZWRpYVdyaXRlcikgeworICAgICAgICB1aW50MzJfdCBsYXllcnMgPSBkYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgICAgICAgbWVkaWFXcml0ZXItPnNldFRlbXBvcmFsTGF5ZXJDb3VudChsYXllcnMpOworICAgIH0sCisgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyICpkYXRhUHJvdmlkZXIsIE1QRUc0V3JpdGVyICptZWRpYVdyaXRlcikgeworICAgICAgICB1aW50MzJfdCBkdXJhdGlvbiA9IGRhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICAgICAgICBtZWRpYVdyaXRlci0+c2V0SW50ZXJsZWF2ZUR1cmF0aW9uKGR1cmF0aW9uKTsKKyAgICB9LAorICAgIFtdKEZ1enplZERhdGFQcm92aWRlciAqZGF0YVByb3ZpZGVyLCBNUEVHNFdyaXRlciAqbWVkaWFXcml0ZXIpIHsKKyAgICAgICAgaW50IGxhdCA9IGRhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPGludD4oKTsKKyAgICAgICAgaW50IGxvbiA9IGRhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPGludD4oKTsKKyAgICAgICAgbWVkaWFXcml0ZXItPnNldEdlb0RhdGEobGF0LCBsb24pOworICAgIH0sCit9OworCisvLyBOb3QgYWxsIHdyaXRlcnMgY2FuIGFsd2F5cyBhZGQgbmV3IHNvdXJjZXMsIHNvIHdlJ2xsIG5lZWQgYWRkaXRpb25hbCBjaGVja3MuCit2b2lkIGFkZFNvdXJjZShGdXp6ZWREYXRhUHJvdmlkZXIgKmRhdGFQcm92aWRlciwgc3A8TWVkaWFXcml0ZXI+IG1lZGlhV3JpdGVyKSB7CisgICAgc3A8TWVkaWFTb3VyY2U+IG1lZGlhU291cmNlID0gZ2VuTWVkaWFTb3VyY2UoZGF0YVByb3ZpZGVyLCBrTWF4TWVkaWFCbG9iU2l6ZSk7CisgICAgaWYgKG1lZGlhU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgLy8gVGhlcmUncyBhIHN0YXRpYyBjaGVjayBwcmV2ZW50aW5nIE5VTExzIGluIGFkZFNvdXJjZS4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtZWRpYVdyaXRlci0+YWRkU291cmNlKG1lZGlhU291cmNlKTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBkYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisgICAgVGVtcG9yYXJ5RmlsZSB0ZjsKKyAgICBzcDxNZXRhRGF0YT4gZmlsZU1ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgU3RhbmRhcmRXcml0ZXJzIHdyaXRlclR5cGUgPSBkYXRhUHJvdmlkZXIuQ29uc3VtZUVudW08U3RhbmRhcmRXcml0ZXJzPigpOworICAgIHNwPE1lZGlhV3JpdGVyPiB3cml0ZXIgPSBjcmVhdGVXcml0ZXIodGYuZmQsIHdyaXRlclR5cGUsIGZpbGVNZXRhKTsKKworICAgIHN0ZDo6c3RyaW5nIHBhY2thZ2VOYW1lID0gZGF0YVByb3ZpZGVyLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heFBhY2thZ2VOYW1lTGVuKTsKKworICAgIHNwPE1lZGlhUmVjb3JkZXI+IG1yID0gbmV3IE1lZGlhUmVjb3JkZXIoU3RyaW5nMTYocGFja2FnZU5hbWUuY19zdHIoKSkpOworICAgIHdyaXRlci0+c2V0TGlzdGVuZXIobXIpOworCisgICAgdWludDhfdCBiYXNlT3BMZW4gPSBvcGVyYXRpb25zLnNpemUoKTsKKyAgICB1aW50OF90IHRvdGFsTGVuID0gYmFzZU9wTGVuOworICAgIHVpbnQ4X3QgbWF4U291cmNlczsKKyAgICAvLyBEaWZmZXJlbnQgd3JpdGVycyBzdXBwb3J0IGRpZmZlcmVudCBhbW91bnRzIG9mIHNvdXJjZXMuCisgICAgc3dpdGNoICh3cml0ZXJUeXBlKSB7CisgICAgICAgIGNhc2UgU3RhbmRhcmRXcml0ZXJzOjpBQUM6CisgICAgICAgIGNhc2UgU3RhbmRhcmRXcml0ZXJzOjpBQUNfQURUUzoKKyAgICAgICAgY2FzZSBTdGFuZGFyZFdyaXRlcnM6OkFNUl9OQjoKKyAgICAgICAgY2FzZSBTdGFuZGFyZFdyaXRlcnM6OkFNUl9XQjoKKyAgICAgICAgY2FzZSBTdGFuZGFyZFdyaXRlcnM6Ok9HRzoKKyAgICAgICAgICAgIG1heFNvdXJjZXMgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhbmRhcmRXcml0ZXJzOjpXRUJNOgorICAgICAgICAgICAgbWF4U291cmNlcyA9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1heFNvdXJjZXMgPSBVSU5UOF9NQVg7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgLy8gSW5pdGlhbGl6ZSBzb21lIG51bWJlciBvZiBzb3VyY2VzIGFuZCBhZGQgdGhlbSB0byBvdXIgd3JpdGVyLgorICAgIHVpbnQ4X3Qgc291cmNlQ291bnQgPSBkYXRhUHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50OF90PigwLCBtYXhTb3VyY2VzKTsKKyAgICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBzb3VyY2VDb3VudDsgaSsrKSB7CisgICAgICAgIGFkZFNvdXJjZSgmZGF0YVByb3ZpZGVyLCB3cml0ZXIpOworICAgIH0KKworICAgIC8vIEluY3JlYXNlIG91ciByYW5nZSBpZiBhZGRpdGlvbmFsIG9wZXJhdGlvbnMgYXJlIGltcGxlbWVudGVkLgorICAgIC8vIEN1cnJlbnRseSBvbmx5IE1QRUc0IGhhcyBhZGRpdGlvbmEgcHVibGljIG9wZXJhdGlvbnMgb24gdGhlaXIgd3JpdGVyLgorICAgIGlmICh3cml0ZXJUeXBlID09IFN0YW5kYXJkV3JpdGVyczo6TVBFRzQpIHsKKyAgICAgICAgdG90YWxMZW4gKz0gbXBlZzRPcGVyYXRpb25zLnNpemUoKTsKKyAgICB9CisKKyAgICAvLyBNYW55IG9wZXJhdGlvbnMgcmVxdWlyZSB0aGUgd3JpdGVyIHRvIGJlIHN0YXJ0ZWQuCisgICAgd3JpdGVyLT5zdGFydChmaWxlTWV0YS5nZXQoKSk7CisgICAgZm9yIChzaXplX3Qgb3BzX3J1biA9IDA7IGRhdGFQcm92aWRlci5yZW1haW5pbmdfYnl0ZXMoKSA+IDAgJiYgb3BzX3J1biA8IGtNYXhPcGVyYXRpb25zIC0gMTsKKyAgICAgICAgICAgIG9wc19ydW4rKykgeworICAgICAgICB1aW50OF90IG9wID0gZGF0YVByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgdG90YWxMZW4gLSAxKTsKKyAgICAgICAgaWYgKG9wIDwgYmFzZU9wTGVuKSB7CisgICAgICAgICAgICBvcGVyYXRpb25zW29wXSgmZGF0YVByb3ZpZGVyLCB3cml0ZXIsIGZpbGVNZXRhLCB0Zi5mZCk7CisgICAgICAgIH0gZWxzZSBpZiAod3JpdGVyVHlwZSA9PSBTdGFuZGFyZFdyaXRlcnM6Ok1QRUc0KSB7CisgICAgICAgICAgICBtcGVnNE9wZXJhdGlvbnNbb3AgLSBiYXNlT3BMZW5dKCZkYXRhUHJvdmlkZXIsIChNUEVHNFdyaXRlciopd3JpdGVyLmdldCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEhlcmUganVzdCBpbiBjYXNlLCB3aWxsIGVycm9yIG91dC4KKyAgICAgICAgICAgIG9wZXJhdGlvbnNbb3BdKCZkYXRhUHJvdmlkZXIsIHdyaXRlciwgZmlsZU1ldGEsIHRmLmZkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB3cml0ZXItPnN0b3AoKTsKKworICAgIHdyaXRlci5jbGVhcigpOworICAgIHdyaXRlciA9IG51bGxwdHI7CisgICAgcmV0dXJuIDA7Cit9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9kaWN0aW9uYXJpZXMvZm9ybWF0cy5kaWN0IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9kaWN0aW9uYXJpZXMvZm9ybWF0cy5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYjIyZGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL2RpY3Rpb25hcmllcy9mb3JtYXRzLmRpY3QKQEAgLTAsMCArMSwyOTkgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUaGlzIGZpbGUgaXMgYSBjb21iaW5hdGlvbiBvZiB0aGVzZSBkaWN0aW9uYXJpZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZnV6emluZy9ibG9iLzBjNDg1MzFjNGQzMTdjZWE5NDc5YjNlYzFiMGRkYjllZGM0MzhjM2EvZGljdGlvbmFyaWVzL21wNC5kaWN0ICAgICMKKyMgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9mdXp6aW5nL2Jsb2IvMGM0ODUzMWM0ZDMxN2NlYTk0NzliM2VjMWIwZGRiOWVkYzQzOGMzYS9kaWN0aW9uYXJpZXMvd2VibS5kaWN0ICAgIworIyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Z1enppbmcvYmxvYi8wYzQ4NTMxYzRkMzE3Y2VhOTQ3OWIzZWMxYjBkZGI5ZWRjNDM4YzNhL2RpY3Rpb25hcmllcy9vZ2cuZGljdCAgICAjCisjIE1QRUc0LCBPR0csIGFuZCBXRUJNIGFyZSBhbGwgZm9ybWF0cyB1c2VkIGJ5IE1lZGlhV3JpdGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBtcDQuZGljdAorIyBUYWtlbiBmcm9tIGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMvKy9tYXN0ZXIvbWVkaWEvdGVzdC9tcDQuZGljdAorRk9VUkNDX05VTEw9Ilx4MDBceDAwXHgwMFx4MDAiCitGT1VSQ0NfQUMzID0iXHg2MVx4NjNceDJkXHgzMyIKK0ZPVVJDQ19FQUMzPSJceDY1XHg2M1x4MmRceDMzIgorRk9VUkNDX0FWQzE9Ilx4NjFceDc2XHg2M1x4MzEiCitGT1VSQ0NfQVZDMz0iXHg2MVx4NzZceDYzXHgzMyIKK0ZPVVJDQ19BVkNDPSJceDYxXHg3Nlx4NjNceDQzIgorRk9VUkNDX0JMT0M9Ilx4NjJceDZDXHg2Rlx4NjMiCitGT1VSQ0NfQ0VOQz0iXHg2M1x4NjVceDZlXHg2MyIKK0ZPVVJDQ19DTzY0PSJceDYzXHg2Zlx4MzZceDM0IgorRk9VUkNDX0NUVFM9Ilx4NjNceDc0XHg3NFx4NzMiCitGT1VSQ0NfRElORj0iXHg2NFx4NjlceDZlXHg2NiIKK0ZPVVJDQ19FRFRTPSJceDY1XHg2NFx4NzRceDczIgorRk9VUkNDX0VNU0c9Ilx4NjVceDZkXHg3M1x4NjciCitGT1VSQ0NfRUxTVD0iXHg2NVx4NmNceDczXHg3NCIKK0ZPVVJDQ19FTkNBPSJceDY1XHg2ZVx4NjNceDYxIgorRk9VUkNDX0VOQ1Y9Ilx4NjVceDZlXHg2M1x4NzYiCitGT1VSQ0NfRVNEUz0iXHg2NVx4NzNceDY0XHg3MyIKK0ZPVVJDQ19GUkVFPSJceDY2XHg3Mlx4NjVceDY1IgorRk9VUkNDX0ZSTUE9Ilx4NjZceDcyXHg2ZFx4NjEiCitGT1VSQ0NfRlRZUD0iXHg2Nlx4NzRceDc5XHg3MCIKK0ZPVVJDQ19IRExSPSJceDY4XHg2NFx4NmNceDcyIgorRk9VUkNDX0hJTlQ9Ilx4NjhceDY5XHg2ZVx4NzQiCitGT1VSQ0NfSFZDMT0iXHg2OFx4NzZceDYzXHgzMSIKK0ZPVVJDQ19IVkNDPSJceDY4XHg3Nlx4NjNceDQzIgorRk9VUkNDX0lPRFM9Ilx4NjlceDZmXHg2NFx4NzMiCitGT1VSQ0NfTURBVD0iXHg2ZFx4NjRceDYxXHg3NCIKK0ZPVVJDQ19NREhEPSJceDZkXHg2NFx4NjhceDY0IgorRk9VUkNDX01ESUE9Ilx4NmRceDY0XHg2OVx4NjEiCitGT1VSQ0NfTUVDTz0iXHg2ZFx4NjVceDYzXHg2ZiIKK0ZPVVJDQ19NRUhEPSJceDZkXHg2NVx4NjhceDY0IgorRk9VUkNDX01FVEE9Ilx4NmRceDY1XHg3NFx4NjEiCitGT1VSQ0NfTUZIRD0iXHg2ZFx4NjZceDY4XHg2NCIKK0ZPVVJDQ19NRlJBPSJceDZkXHg2Nlx4NzJceDYxIgorRk9VUkNDX01JTkY9Ilx4NmRceDY5XHg2ZVx4NjYiCitGT1VSQ0NfTU9PRj0iXHg2ZFx4NmZceDZmXHg2NiIKK0ZPVVJDQ19NT09WPSJceDZkXHg2Zlx4NmZceDc2IgorRk9VUkNDX01QNEE9Ilx4NmRceDcwXHgzNFx4NjEiCitGT1VSQ0NfTVA0Vj0iXHg2ZFx4NzBceDM0XHg3NiIKK0ZPVVJDQ19NVkVYPSJceDZkXHg3Nlx4NjVceDc4IgorRk9VUkNDX01WSEQ9Ilx4NmRceDc2XHg2OFx4NjQiCitGT1VSQ0NfUEFTUD0iXHg3MFx4NjFceDczXHg3MCIKK0ZPVVJDQ19QRElOPSJceDcwXHg2NFx4NjlceDZlIgorRk9VUkNDX1BSRlQ9Ilx4NzBceDcyXHg2Nlx4NzQiCitGT1VSQ0NfUFNTSD0iXHg3MFx4NzNceDczXHg2OCIKK0ZPVVJDQ19TQUlPPSJceDczXHg2MVx4NjlceDZmIgorRk9VUkNDX1NBSVo9Ilx4NzNceDYxXHg2OVx4N2EiCitGT1VSQ0NfU0JHUD0iXHg3M1x4NjJceDY3XHg3MCIKK0ZPVVJDQ19TQ0hJPSJceDczXHg2M1x4NjhceDY5IgorRk9VUkNDX1NDSE09Ilx4NzNceDYzXHg2OFx4NmQiCitGT1VSQ0NfU0RUUD0iXHg3M1x4NjRceDc0XHg3MCIKK0ZPVVJDQ19TRUlHPSJceDczXHg2NVx4NjlceDY3IgorRk9VUkNDX1NFTkM9Ilx4NzNceDY1XHg2ZVx4NjMiCitGT1VSQ0NfU0dQRD0iXHg3M1x4NjdceDcwXHg2NCIKK0ZPVVJDQ19TSURYPSJceDczXHg2OVx4NjRceDc4IgorRk9VUkNDX1NJTkY9Ilx4NzNceDY5XHg2ZVx4NjYiCitGT1VSQ0NfU0tJUD0iXHg3M1x4NmJceDY5XHg3MCIKK0ZPVVJDQ19TTUhEPSJceDczXHg2ZFx4NjhceDY0IgorRk9VUkNDX1NPVU49Ilx4NzNceDZmXHg3NVx4NmUiCitGT1VSQ0NfU1NJWD0iXHg3M1x4NzNceDY5XHg3OCIKK0ZPVVJDQ19TVEJMPSJceDczXHg3NFx4NjJceDZjIgorRk9VUkNDX1NUQ089Ilx4NzNceDc0XHg2M1x4NmYiCitGT1VSQ0NfU1RTQz0iXHg3M1x4NzRceDczXHg2MyIKK0ZPVVJDQ19TVFNEPSJceDczXHg3NFx4NzNceDY0IgorRk9VUkNDX1NUU1M9Ilx4NzNceDc0XHg3M1x4NzMiCitGT1VSQ0NfU1RTWj0iXHg3M1x4NzRceDczXHg3YSIKK0ZPVVJDQ19TVFRTPSJceDczXHg3NFx4NzRceDczIgorRk9VUkNDX1NUWVA9Ilx4NzNceDc0XHg3OVx4NzAiCitGT1VSQ0NfVEVOQz0iXHg3NFx4NjVceDZlXHg2MyIKK0ZPVVJDQ19URkRUPSJceDc0XHg2Nlx4NjRceDc0IgorRk9VUkNDX1RGSEQ9Ilx4NzRceDY2XHg2OFx4NjQiCitGT1VSQ0NfVEtIRD0iXHg3NFx4NmJceDY4XHg2NCIKK0ZPVVJDQ19UUkFGPSJceDc0XHg3Mlx4NjFceDY2IgorRk9VUkNDX1RSQUs9Ilx4NzRceDcyXHg2MVx4NmIiCitGT1VSQ0NfVFJFWD0iXHg3NFx4NzJceDY1XHg3OCIKK0ZPVVJDQ19UUlVOPSJceDc0XHg3Mlx4NzVceDZlIgorRk9VUkNDX1VEVEE9Ilx4NzVceDY0XHg3NFx4NjEiCitGT1VSQ0NfVVVJRD0iXHg3NVx4NzVceDY5XHg2NCIKK0ZPVVJDQ19WSURFPSJceDc2XHg2OVx4NjRceDY1IgorRk9VUkNDX1ZNSEQ9Ilx4NzZceDZkXHg2OFx4NjQiCitGT1VSQ0NfV0lERT0iXHg3N1x4NjlceDY0XHg2NSIKKworIyBvZ2cuZGljdAorIyBodHRwczovL3hpcGgub3JnL3ZvcmJpcy9kb2MvVm9yYmlzX0lfc3BlYy5odG1sCisKK2hlYWRlcj0iT2dnUyIKKworIyBDb2RlY3MKKyJCQkNEXHgwMCIKKyJceDdmRkxBQyIKKyJceDgwdGhlb3JhIgorIlx4MDF2b3JiaXMiCisiQ0VMVCAgICAiCisiQ01NTFx4MDBceDAwXHgwMFx4MDAiCisiXHg4YkpOR1x4MGRceDBhXHgxYVx4MGEiCisiXHg4MGthdGVceDAwXHgwMFx4MDAiCisiT2dnTUlESVx4MDAiCisiXHg4YU1OR1x4MGRceDBhXHgxYVx4MGEiCisiUENNICAgICAiCisiXHg4OVBOR1x4MGRceDBhXHgxYVx4MGEiCisiU3BlZXggICAiCisiWVVWNE1QRUciCisKKyMgTWV0YWRhdGEKKyJUSVRMRT0iCisiVkVSU0lPTj0iCisiQUxCVU09IgorIlRSQUNLTlVNQkVSPSIKKyJBUlRJU1Q9IgorIlBFUkZPUk1FUj0iCisiQ09QWVJJR0hUPSIKKyJMSUNFTlNFPSIKKyJPUkdBTklaQVRJT049IgorIkRFU0NSSVBUSU9OPSIKKyJHRU5SRT0iCisiREFURT0iCisiTE9DQVRJT049IgorIkNPTlRBQ1Q9IgorIklTUkM9IgorCisjIHdlYm0uZGljdAorIyBFbGVtZW50IElEcy4KK0lkQWVzU2V0dGluZ3NDaXBoZXJNb2RlID0gIlx4NDdceEU4IgorSWRBbHBoYU1vZGUgPSAiXHg1M1x4QzAiCitJZEFzcGVjdFJhdGlvVHlwZSA9ICJceDU0XHhCMyIKK0lkQXVkaW8gPSAiXHhFMSIKK0lkQml0RGVwdGggPSAiXHg2Mlx4NjQiCitJZEJpdHNQZXJDaGFubmVsID0gIlx4NTVceEIyIgorSWRCbG9jayA9ICJceEExIgorSWRCbG9ja0FkZElkID0gIlx4RUUiCitJZEJsb2NrQWRkaXRpb25hbCA9ICJceEE1IgorSWRCbG9ja0FkZGl0aW9ucyA9ICJceDc1XHhBMSIKK0lkQmxvY2tEdXJhdGlvbiA9ICJceDlCIgorSWRCbG9ja0dyb3VwID0gIlx4QTAiCitJZEJsb2NrTW9yZSA9ICJceEE2IgorSWRCbG9ja1ZpcnR1YWwgPSAiXHhBMiIKK0lkQ2JTdWJzYW1wbGluZ0hvcnogPSAiXHg1NVx4QjUiCitJZENiU3Vic2FtcGxpbmdWZXJ0ID0gIlx4NTVceEI2IgorSWRDaGFubmVscyA9ICJceDlGIgorSWRDaGFwQ291bnRyeSA9ICJceDQzXHg3RSIKK0lkQ2hhcExhbmd1YWdlID0gIlx4NDNceDdDIgorSWRDaGFwU3RyaW5nID0gIlx4ODUiCitJZENoYXB0ZXJBdG9tID0gIlx4QjYiCitJZENoYXB0ZXJEaXNwbGF5ID0gIlx4ODAiCitJZENoYXB0ZXJTdHJpbmdVSUQgPSAiXHg1Nlx4NTQiCitJZENoYXB0ZXJTdHJpbmdVaWQgPSAiXHg1Nlx4NTQiCitJZENoYXB0ZXJUaW1lRW5kID0gIlx4OTIiCitJZENoYXB0ZXJUaW1lU3RhcnQgPSAiXHg5MSIKK0lkQ2hhcHRlclVJRCA9ICJceDczXHhDNCIKK0lkQ2hhcHRlclVpZCA9ICJceDczXHhDNCIKK0lkQ2hhcHRlcnMgPSAiXHgxMFx4NDNceEE3XHg3MCIKK0lkQ2hyb21hU2l0aW5nSG9yeiA9ICJceDU1XHhCNyIKK0lkQ2hyb21hU2l0aW5nVmVydCA9ICJceDU1XHhCOCIKK0lkQ2hyb21hU3Vic2FtcGxpbmdIb3J6ID0gIlx4NTVceEIzIgorSWRDaHJvbWFTdWJzYW1wbGluZ1ZlcnQgPSAiXHg1NVx4QjQiCitJZENsdXN0ZXIgPSAiXHgxRlx4NDNceEI2XHg3NSIKK0lkQ29kZWNEZWxheSA9ICJceDU2XHhBQSIKK0lkQ29kZWNJRCA9ICJceDg2IgorSWRDb2RlY05hbWUgPSAiXHgyNVx4ODZceDg4IgorSWRDb2RlY1ByaXZhdGUgPSAiXHg2M1x4QTIiCitJZENvbG91ciA9ICJceDU1XHhCMCIKK0lkQ29udGVudEVuY0FFU1NldHRpbmdzID0gIlx4NDdceEU3IgorSWRDb250ZW50RW5jQWVzU2V0dGluZ3MgPSAiXHg0N1x4RTciCitJZENvbnRlbnRFbmNBbGdvID0gIlx4NDdceEUxIgorSWRDb250ZW50RW5jS2V5SWQgPSAiXHg0N1x4RTIiCitJZENvbnRlbnRFbmNvZGluZyA9ICJceDYyXHg0MCIKK0lkQ29udGVudEVuY29kaW5nT3JkZXIgPSAiXHg1MFx4MzEiCitJZENvbnRlbnRFbmNvZGluZ1Njb3BlID0gIlx4NTBceDMyIgorSWRDb250ZW50RW5jb2RpbmdUeXBlID0gIlx4NTBceDMzIgorSWRDb250ZW50RW5jb2RpbmdzID0gIlx4NkRceDgwIgorSWRDb250ZW50RW5jcnlwdGlvbiA9ICJceDUwXHgzNSIKK0lkQ3VlQmxvY2tOdW1iZXIgPSAiXHg1M1x4NzgiCitJZEN1ZUNsdXN0ZXJQb3NpdGlvbiA9ICJceEYxIgorSWRDdWVEdXJhdGlvbiA9ICJceEIyIgorSWRDdWVQb2ludCA9ICJceEJCIgorSWRDdWVSZWxhdGl2ZVBvc2l0aW9uID0gIlx4RjAiCitJZEN1ZVRpbWUgPSAiXHhCMyIKK0lkQ3VlVHJhY2sgPSAiXHhGNyIKK0lkQ3VlVHJhY2tQb3NpdGlvbnMgPSAiXHhCNyIKK0lkQ3VlcyA9ICJceDFDXHg1M1x4QkJceDZCIgorSWREYXRlVVRDID0gIlx4NDRceDYxIgorSWREYXRlVXRjID0gIlx4NDRceDYxIgorSWREZWZhdWx0RHVyYXRpb24gPSAiXHgyM1x4RTNceDgzIgorSWREaXNjYXJkUGFkZGluZyA9ICJceDc1XHhBMiIKK0lkRGlzcGxheUhlaWdodCA9ICJceDU0XHhCQSIKK0lkRGlzcGxheVVuaXQgPSAiXHg1NFx4QjIiCitJZERpc3BsYXlXaWR0aCA9ICJceDU0XHhCMCIKK0lkRG9jVHlwZSA9ICJceDQyXHg4MiIKK0lkRG9jVHlwZVJlYWRWZXJzaW9uID0gIlx4NDJceDg1IgorSWREb2NUeXBlVmVyc2lvbiA9ICJceDQyXHg4NyIKK0lkRHVyYXRpb24gPSAiXHg0NFx4ODkiCitJZEVCTUwgPSAiXHgxQVx4NDVceERGXHhBMyIKK0lkRUJNTE1heElETGVuZ3RoID0gIlx4NDJceEYyIgorSWRFQk1MTWF4U2l6ZUxlbmd0aCA9ICJceDQyXHhGMyIKK0lkRUJNTFJlYWRWZXJzaW9uID0gIlx4NDJceEY3IgorSWRFQk1MVmVyc2lvbiA9ICJceDQyXHg4NiIKK0lkRWJtbCA9ICJceDFBXHg0NVx4REZceEEzIgorSWRFYm1sTWF4SWRMZW5ndGggPSAiXHg0Mlx4RjIiCitJZEVibWxNYXhTaXplTGVuZ3RoID0gIlx4NDJceEYzIgorSWRFYm1sUmVhZFZlcnNpb24gPSAiXHg0Mlx4RjciCitJZEVibWxWZXJzaW9uID0gIlx4NDJceDg2IgorSWRFZGl0aW9uRW50cnkgPSAiXHg0NVx4QjkiCitJZEZpbGVVc2VkRW5kVGltZSA9ICJceDQ2XHg2MiIKK0lkRmlsZVVzZWRTdGFydFRpbWUgPSAiXHg0Nlx4NjEiCitJZEZsYWdEZWZhdWx0ID0gIlx4ODgiCitJZEZsYWdFbmFibGVkID0gIlx4QjkiCitJZEZsYWdGb3JjZWQgPSAiXHg1NVx4QUEiCitJZEZsYWdJbnRlcmxhY2VkID0gIlx4OUEiCitJZEZsYWdMYWNpbmcgPSAiXHg5QyIKK0lkRnJhbWVSYXRlID0gIlx4MjNceDgzXHhFMyIKK0lkSW5mbyA9ICJceDE1XHg0OVx4QTlceDY2IgorSWRMYWNlTnVtYmVyID0gIlx4Q0MiCitJZExhbmd1YWdlID0gIlx4MjJceEI1XHg5QyIKK0lkTHVtaW5hbmNlTWF4ID0gIlx4NTVceEQ5IgorSWRMdW1pbmFuY2VNaW4gPSAiXHg1NVx4REEiCitJZE1hc3RlcmluZ01ldGFkYXRhID0gIlx4NTVceEQwIgorSWRNYXRyaXhDb2VmZmljaWVudHMgPSAiXHg1NVx4QjEiCitJZE1heENsbCA9ICJceDU1XHhCQyIKK0lkTWF4RmFsbCA9ICJceDU1XHhCRCIKK0lkTXV4aW5nQXBwID0gIlx4NERceDgwIgorSWROYW1lID0gIlx4NTNceDZFIgorSWRPdXRwdXRTYW1wbGluZ0ZyZXF1ZW5jeSA9ICJceDc4XHhCNSIKK0lkUGl4ZWxDcm9wQm90dG9tID0gIlx4NTRceEFBIgorSWRQaXhlbENyb3BMZWZ0ID0gIlx4NTRceENDIgorSWRQaXhlbENyb3BSaWdodCA9ICJceDU0XHhERCIKK0lkUGl4ZWxDcm9wVG9wID0gIlx4NTRceEJCIgorSWRQaXhlbEhlaWdodCA9ICJceEJBIgorSWRQaXhlbFdpZHRoID0gIlx4QjAiCitJZFByZXZTaXplID0gIlx4QUIiCitJZFByaW1hcmllcyA9ICJceDU1XHhCQiIKK0lkUHJpbWFyeUJDaHJvbWF0aWNpdHlYID0gIlx4NTVceEQ1IgorSWRQcmltYXJ5QkNocm9tYXRpY2l0eVkgPSAiXHg1NVx4RDYiCitJZFByaW1hcnlHQ2hyb21hdGljaXR5WCA9ICJceDU1XHhEMyIKK0lkUHJpbWFyeUdDaHJvbWF0aWNpdHlZID0gIlx4NTVceEQ0IgorSWRQcmltYXJ5UkNocm9tYXRpY2l0eVggPSAiXHg1NVx4RDEiCitJZFByaW1hcnlSQ2hyb21hdGljaXR5WSA9ICJceDU1XHhEMiIKK0lkUHJvamVjdGlvbiA9ICJceDc2XHg3MCIKK0lkUHJvamVjdGlvblBvc2VQaXRjaCA9ICJceDc2XHg3NCIKK0lkUHJvamVjdGlvblBvc2VSb2xsID0gIlx4NzZceDc1IgorSWRQcm9qZWN0aW9uUG9zZVlhdyA9ICJceDc2XHg3MyIKK0lkUHJvamVjdGlvblByaXZhdGUgPSAiXHg3Nlx4NzIiCitJZFByb2plY3Rpb25UeXBlID0gIlx4NzZceDcxIgorSWRSYW5nZSA9ICJceDU1XHhCOSIKK0lkUmVmZXJlbmNlQmxvY2sgPSAiXHhGQiIKK0lkU2FtcGxpbmdGcmVxdWVuY3kgPSAiXHhCNSIKK0lkU2VlayA9ICJceDREXHhCQiIKK0lkU2Vla0hlYWQgPSAiXHgxMVx4NERceDlCXHg3NCIKK0lkU2Vla0lEID0gIlx4NTNceEFCIgorSWRTZWVrUG9zaXRpb24gPSAiXHg1M1x4QUMiCitJZFNlZWtQcmVSb2xsID0gIlx4NTZceEJCIgorSWRTZWdtZW50ID0gIlx4MThceDUzXHg4MFx4NjciCitJZFNpbXBsZUJsb2NrID0gIlx4QTMiCitJZFNpbXBsZVRhZyA9ICJceDY3XHhDOCIKK0lkU2xpY2VEdXJhdGlvbiA9ICJceENGIgorSWRTbGljZXMgPSAiXHg4RSIKK0lkU3RlcmVvTW9kZSA9ICJceDUzXHhCOCIKK0lkVGFnID0gIlx4NzNceDczIgorSWRUYWdCaW5hcnkgPSAiXHg0NFx4ODUiCitJZFRhZ0RlZmF1bHQgPSAiXHg0NFx4ODQiCitJZFRhZ0xhbmd1YWdlID0gIlx4NDRceDdBIgorSWRUYWdOYW1lID0gIlx4NDVceEEzIgorSWRUYWdTdHJpbmcgPSAiXHg0NFx4ODciCitJZFRhZ1RyYWNrVWlkID0gIlx4NjNceEM1IgorSWRUYWdzID0gIlx4MTJceDU0XHhDM1x4NjciCitJZFRhcmdldFR5cGUgPSAiXHg2M1x4Q0EiCitJZFRhcmdldFR5cGVWYWx1ZSA9ICJceDY4XHhDQSIKK0lkVGFyZ2V0cyA9ICJceDYzXHhDMCIKK0lkVGltZVNsaWNlID0gIlx4RTgiCitJZFRpbWVjb2RlID0gIlx4RTciCitJZFRpbWVjb2RlU2NhbGUgPSAiXHgyQVx4RDdceEIxIgorSWRUaXRsZSA9ICJceDdCXHhBOSIKK0lkVHJhY2tFbnRyeSA9ICJceEFFIgorSWRUcmFja051bWJlciA9ICJceEQ3IgorSWRUcmFja1R5cGUgPSAiXHg4MyIKK0lkVHJhY2tVSUQgPSAiXHg3M1x4QzUiCitJZFRyYWNrcyA9ICJceDE2XHg1NFx4QUVceDZCIgorSWRUcmFuc2ZlckNoYXJhY3RlcmlzdGljcyA9ICJceDU1XHhCQSIKK0lkVHJpY2tNYXN0ZXJUcmFja1NlZ21lbnRVSUQgPSAiXHhDNCIKK0lkVHJpY2tNYXN0ZXJUcmFja1VJRCA9ICJceEM3IgorSWRUcmlja1RyYWNrRmxhZyA9ICJceEM2IgorSWRUcmlja1RyYWNrU2VnbWVudFVJRCA9ICJceEMxIgorSWRUcmlja1RyYWNrVUlEID0gIlx4QzAiCitJZFZpZGVvID0gIlx4RTAiCitJZFZvaWQgPSAiXHhFQyIKK0lkV2hpdGVQb2ludENocm9tYXRpY2l0eVggPSAiXHg1NVx4RDciCitJZFdoaXRlUG9pbnRDaHJvbWF0aWNpdHlZID0gIlx4NTVceEQ4IgorSWRXcml0aW5nQXBwID0gIlx4NTdceDQxIgorCisjIEludGVyZXN0aW5nIHNpemVzLgorU2l6ZVVua25vd24gPSAiXHhGRiIKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwCmluZGV4IDBiZDA2MzkuLjljZGM2ZDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21lZGlhY29kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZWRpYWNvZGVjL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF90ZXN0c19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfdGVzdHNfbGljZW5zZSIsCisgICAgXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogIm1lZGlhY29kZWNUZXN0IiwKICAgICBndGVzdDogdHJ1ZSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21lZGlhY29kZWMvTWVkaWFDb2RlY1Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjVGVzdC5jcHAKaW5kZXggZDAwYTUwZi4uYWMxZTliMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjVGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjVGVzdC5jcHAKQEAgLTI4NSwxNyArMjg1LDIwIEBACiAgICAgLy8gMSkgQ2xpZW50IHRocmVhZCBjYWxscyBzdG9wKCk7IE1lZGlhQ29kZWMgbG9vcGVyIHRocmVhZCBjYWxscwogICAgIC8vICAgIGluaXRpYXRlU2h1dGRvd24oKTsgc2h1dGRvd24gaXMgYmVpbmcgaGFuZGxlZCBhdCB0aGUgY29tcG9uZW50IHRocmVhZC4KICAgICAvLyAyKSBFcnJvciBvY2N1cnJlZCwgYnV0IHRoZSBzaHV0ZG93biBvcGVyYXRpb24gaXMgc3RpbGwgYmVpbmcgZG9uZS4KLSAgICAvLyAzKSBNZWRpYUNvZGVjIGxvb3BlciB0aHJlYWQgaGFuZGxlcyB0aGUgZXJyb3IuCi0gICAgLy8gNCkgQ29tcG9uZW50IHRocmVhZCBjb21wbGV0ZXMgc2h1dGRvd24gYW5kIHBvc3RzIG9uU3RvcENvbXBsZXRlZCgpCisgICAgLy8gMykgQW5vdGhlciBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIHNodXRkb3duIG9wZXJhdGlvbi4KKyAgICAvLyA0KSBNZWRpYUNvZGVjIGxvb3BlciB0aHJlYWQgaGFuZGxlcyB0aGUgZXJyb3IuCisgICAgLy8gNSkgQ2xpZW50IHJlbGVhc2VzIHRoZSBjb2RlYyB1cG9uIHRoZSBlcnJvcjsgcHJldmlvdXMgc2h1dGRvd24gaXMgc3RpbGwKKyAgICAvLyAgICBnb2luZyBvbi4KKyAgICAvLyA2KSBDb21wb25lbnQgdGhyZWFkIGNvbXBsZXRlcyBzaHV0ZG93biBhbmQgcG9zdHMgb25TdG9wQ29tcGxldGVkKCk7CisgICAgLy8gICAgU2h1dGRvd24gZnJvbSByZWxlYXNlIGFsc28gY29tcGxldGVzLgogCiAgICAgc3RhdGljIGNvbnN0IEFTdHJpbmcga0NvZGVjTmFtZXsidGVzdC5jb2RlYyJ9OwogICAgIHN0YXRpYyBjb25zdCBBU3RyaW5nIGtDb2RlY093bmVyeyJub2JvZHkifTsKICAgICBzdGF0aWMgY29uc3QgQVN0cmluZyBrTWVkaWFUeXBleyJ2aWRlby94LXRlc3QifTsKIAotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBlcnJvck9jY3VycmVkOwogICAgIHNwPE1vY2tDb2RlYz4gbW9ja0NvZGVjOwogICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWNCYXNlPihjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBjaGFyICpvd25lcik+IGdldENvZGVjQmFzZSA9Ci0gICAgICAgIFsmbW9ja0NvZGVjLCAmZXJyb3JPY2N1cnJlZF0oY29uc3QgQVN0cmluZyAmLCBjb25zdCBjaGFyICopIHsKKyAgICAgICAgWyZtb2NrQ29kZWNdKGNvbnN0IEFTdHJpbmcgJiwgY29uc3QgY2hhciAqKSB7CiAgICAgICAgICAgICBtb2NrQ29kZWMgPSBuZXcgTW9ja0NvZGVjKFtdKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNb2NrQnVmZmVyQ2hhbm5lbD4gJikgewogICAgICAgICAgICAgICAgIC8vIE5vIG1vY2sgc2V0dXAsIGFzIHdlIGRvbid0IGV4cGVjdCBhbnkgYnVmZmVyIG9wZXJhdGlvbnMKICAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIHNjZW5hcmlvLgpAQCAtMzE0LDEzICszMTcsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgbW9ja0NvZGVjLT5jYWxsYmFjaygpLT5vblN0YXJ0Q29tcGxldGVkKCk7CiAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICBPTl9DQUxMKCptb2NrQ29kZWMsIGluaXRpYXRlU2h1dGRvd24odHJ1ZSkpCi0gICAgICAgICAgICAgICAgLldpbGxCeURlZmF1bHQoW21vY2tDb2RlYywgJmVycm9yT2NjdXJyZWRdKGJvb2wpIHsKKyAgICAgICAgICAgICAgICAuV2lsbEJ5RGVmYXVsdChbbW9ja0NvZGVjXShib29sKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIDIpCiAgICAgICAgICAgICAgICAgICAgIG1vY2tDb2RlYy0+Y2FsbGJhY2soKS0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgdGhhdCAxKSBhbmQgMikgYXJlIGNvbXBsZXRlLgotICAgICAgICAgICAgICAgICAgICBlcnJvck9jY3VycmVkLnNldF92YWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAvLyAzKQorICAgICAgICAgICAgICAgICAgICBtb2NrQ29kZWMtPmNhbGxiYWNrKCktPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOwogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgT05fQ0FMTCgqbW9ja0NvZGVjLCBpbml0aWF0ZVNodXRkb3duKGZhbHNlKSkKICAgICAgICAgICAgICAgICAuV2lsbEJ5RGVmYXVsdChbbW9ja0NvZGVjXShib29sKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFByZXZpb3VzIHN0b3AgZmluaXNoZWQgbm93LgorICAgICAgICAgICAgICAgICAgICBtb2NrQ29kZWMtPmNhbGxiYWNrKCktPm9uU3RvcENvbXBsZXRlZCgpOworICAgICAgICAgICAgICAgICAgICAvLyBSZWxlYXNlIGFsc28gZmluaXNoZWQuCiAgICAgICAgICAgICAgICAgICAgIG1vY2tDb2RlYy0+Y2FsbGJhY2soKS0+b25SZWxlYXNlQ29tcGxldGVkKCk7CiAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICByZXR1cm4gbW9ja0NvZGVjOwpAQCAtMzMyLDE5ICszMzksNTcgQEAKICAgICBBU1NFUlRfTkUobnVsbHB0ciwgY29kZWMpIDw8ICJDb2RlYyBtdXN0IG5vdCBiZSBudWxsIjsKICAgICBBU1NFUlRfTkUobnVsbHB0ciwgbW9ja0NvZGVjKSA8PCAiTW9ja0NvZGVjIG11c3Qgbm90IGJlIG51bGwiOwogCi0gICAgc3RkOjp0aHJlYWQoW21vY2tDb2RlYywgJmVycm9yT2NjdXJyZWRdewotICAgICAgICAvLyBTaW11bGF0ZSBjb21wb25lbnQgdGhyZWFkIHRoYXQgaGFuZGxlcyBzdG9wKCkKLSAgICAgICAgZXJyb3JPY2N1cnJlZC5nZXRfZnV0dXJlKCkud2FpdCgpOwotICAgICAgICAvLyBFcnJvciBvY2N1cnJlZCBidXQgc2h1dGRvd24gcmVxdWVzdCBzdGlsbCBnb3QgcHJvY2Vzc2VkLgotICAgICAgICBtb2NrQ29kZWMtPmNhbGxiYWNrKCktPm9uU3RvcENvbXBsZXRlZCgpOwotICAgIH0pLmRldGFjaCgpOwotCiAgICAgY29kZWMtPmNvbmZpZ3VyZShuZXcgQU1lc3NhZ2UsIG51bGxwdHIsIG51bGxwdHIsIDApOwogICAgIGNvZGVjLT5zdGFydCgpOwotICAgIGNvZGVjLT5zdG9wKCk7Ci0gICAgLy8gU2xlZXAgaGVyZSB0byBnaXZlIHRpbWUgZm9yIHRoZSBNZWRpYUNvZGVjIGxvb3BlciB0aHJlYWQKLSAgICAvLyB0byBwcm9jZXNzIHRoZSBtZXNzYWdlcy4KKyAgICAvLyBzdG9wKCkgd2lsbCBmYWlsIGJlY2F1c2Ugb2YgdGhlIGVycm9yCisgICAgRVhQRUNUX05FKE9LLCBjb2RlYy0+c3RvcCgpKTsKKyAgICAvLyBzbGVlcCBoZXJlIHNvIHRoYXQgdGhlIGxvb3BlciB0aHJlYWQgY2FuIGhhbmRsZSBhbGwgdGhlIGVycm9ycy4KICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDApKTsKKyAgICAvLyB1cG9uIHJlY2VpdmluZyB0aGUgZXJyb3IsIGNsaWVudCB0cmllcyB0byByZWxlYXNlIHRoZSBjb2RlYy4KICAgICBjb2RlYy0+cmVsZWFzZSgpOwogICAgIGxvb3Blci0+c3RvcCgpOwogfQorCitURVNUKE1lZGlhQ29kZWNUZXN0LCBEZWFkV2hpbGVBc3luY1JlbGVhc2luZykgeworICAgIC8vIFRlc3Qgc2NlbmFyaW86CisgICAgLy8KKyAgICAvLyAxKSBDbGllbnQgdGhyZWFkIGNhbGxzIHJlbGVhc2UoKTsgTWVkaWFDb2RlYyBsb29wZXIgdGhyZWFkIGNhbGxzCisgICAgLy8gICAgaW5pdGlhdGVTaHV0ZG93bigpOyBzaHV0ZG93biBpcyBiZWluZyBoYW5kbGVkIGF0IHRoZSBjb21wb25lbnQgdGhyZWFkLgorICAgIC8vIDIpIENvZGVjIHNlcnZpY2UgZGllZCBkdXJpbmcgdGhlIHNodXRkb3duIG9wZXJhdGlvbi4KKyAgICAvLyAzKSBNZWRpYUNvZGVjIGxvb3BlciB0aHJlYWQgaGFuZGxlcyB0aGUgZGVhdGguCisKKyAgICBzdGF0aWMgY29uc3QgQVN0cmluZyBrQ29kZWNOYW1leyJ0ZXN0LmNvZGVjIn07CisgICAgc3RhdGljIGNvbnN0IEFTdHJpbmcga0NvZGVjT3duZXJ7Im5vYm9keSJ9OworICAgIHN0YXRpYyBjb25zdCBBU3RyaW5nIGtNZWRpYVR5cGV7InZpZGVvL3gtdGVzdCJ9OworCisgICAgc3A8TW9ja0NvZGVjPiBtb2NrQ29kZWM7CisgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlY0Jhc2U+KGNvbnN0IEFTdHJpbmcgJm5hbWUsIGNvbnN0IGNoYXIgKm93bmVyKT4gZ2V0Q29kZWNCYXNlID0KKyAgICAgICAgWyZtb2NrQ29kZWNdKGNvbnN0IEFTdHJpbmcgJiwgY29uc3QgY2hhciAqKSB7CisgICAgICAgICAgICBtb2NrQ29kZWMgPSBuZXcgTW9ja0NvZGVjKFtdKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNb2NrQnVmZmVyQ2hhbm5lbD4gJikgeworICAgICAgICAgICAgICAgIC8vIE5vIG1vY2sgc2V0dXAsIGFzIHdlIGRvbid0IGV4cGVjdCBhbnkgYnVmZmVyIG9wZXJhdGlvbnMKKyAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIHNjZW5hcmlvLgorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBPTl9DQUxMKCptb2NrQ29kZWMsIGluaXRpYXRlQWxsb2NhdGVDb21wb25lbnQoXykpCisgICAgICAgICAgICAgICAgLldpbGxCeURlZmF1bHQoW21vY2tDb2RlY10oY29uc3Qgc3A8QU1lc3NhZ2U+ICYpIHsKKyAgICAgICAgICAgICAgICAgICAgbW9ja0NvZGVjLT5jYWxsYmFjaygpLT5vbkNvbXBvbmVudEFsbG9jYXRlZChrQ29kZWNOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgT05fQ0FMTCgqbW9ja0NvZGVjLCBpbml0aWF0ZVNodXRkb3duKF8pKQorICAgICAgICAgICAgICAgIC5XaWxsQnlEZWZhdWx0KFttb2NrQ29kZWNdKGJvb2wpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gMikKKyAgICAgICAgICAgICAgICAgICAgbW9ja0NvZGVjLT5jYWxsYmFjaygpLT5vbkVycm9yKERFQURfT0JKRUNULCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgICAgICAgICAgICAgIC8vIENvZGVjIHNlcnZpY2UgaGFzIGRpZWQsIG5vIGNhbGxiYWNrLgorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIG1vY2tDb2RlYzsKKyAgICAgICAgfTsKKworICAgIHNwPEFMb29wZXI+IGxvb3BlcntuZXcgQUxvb3Blcn07CisgICAgc3A8TWVkaWFDb2RlYz4gY29kZWMgPSBTZXR1cE1lZGlhQ29kZWMoCisgICAgICAgICAgICBrQ29kZWNPd25lciwga0NvZGVjTmFtZSwga01lZGlhVHlwZSwgbG9vcGVyLCBnZXRDb2RlY0Jhc2UpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBjb2RlYykgPDwgIkNvZGVjIG11c3Qgbm90IGJlIG51bGwiOworICAgIEFTU0VSVF9ORShudWxscHRyLCBtb2NrQ29kZWMpIDw8ICJNb2NrQ29kZWMgbXVzdCBub3QgYmUgbnVsbCI7CisKKyAgICBjb2RlYy0+cmVsZWFzZUFzeW5jKG5ldyBBTWVzc2FnZSk7CisgICAgLy8gc2xlZXAgaGVyZSBzbyB0aGF0IHRoZSBsb29wZXIgdGhyZWFkIGNhbiBoYW5kbGUgdGhlIGVycm9yCisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwKSk7CisgICAgbG9vcGVyLT5zdG9wKCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvQW5kcm9pZC5icApzaW1pbGFyaXR5IGluZGV4IDYyJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L0FuZHJvaWQuYnAKY29weSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL0FuZHJvaWQuYnAKaW5kZXggNjU1NDkxYS4uZWNkZjg5YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9BbmRyb2lkLmJwCkBAIC0xNCwyMCArMTQsMzUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X3Rlc3RzX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF90ZXN0c19saWNlbnNlIiwKKyAgICBdLAorfQorCiBjY190ZXN0IHsKLSAgICBuYW1lOiAiTXBlZzRIMjYzRGVjb2RlclRlc3QiLAorICAgIG5hbWU6ICJNZXRhRGF0YVV0aWxzVGVzdCIsCiAgICAgZ3Rlc3Q6IHRydWUsCiAKICAgICBzcmNzOiBbCi0gICAgICAgICJNcGVnNEgyNjNEZWNvZGVyVGVzdC5jcHAiLAorICAgICAgICAiTWV0YURhdGFVdGlsc1Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICBdLAogCkBAIC0zNywxMCArNTIsMTAgQEAKICAgICBdLAogCiAgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKLSAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9BbmRyb2lkVGVzdC54bWwKc2ltaWxhcml0eSBpbmRleCA2NyUKY29weSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwKY29weSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL0FuZHJvaWRUZXN0LnhtbAppbmRleCA3ZmY5NzMyLi5kNjQ5N2YzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvQW5kcm9pZFRlc3QueG1sCkBAIC0xMywxOSArMTMsMTggQEAKICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgTXAzIERlY29kZXIgdW5pdCB0ZXN0Ij4KLSAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iTXAzRGVjb2RlclRlc3QiIC8+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBNZXRhRGF0YVV0aWxzIHVuaXQgdGVzdCI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9Ik1ldGFEYXRhVXRpbHNUZXN0IiAvPgogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9Ik1wM0RlY29kZXJUZXN0LT4vZGF0YS9sb2NhbC90bXAvTXAzRGVjb2RlclRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJNZXRhRGF0YVV0aWxzVGVzdC0+L2RhdGEvbG9jYWwvdG1wL01ldGFEYXRhVXRpbHNUZXN0IiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKLSAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDNkZWMvdGVzdC9NcDNEZWNvZGVyVGVzdC56aXA/dW56aXA9dHJ1ZSIKLSAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvTXAzRGVjb2RlclRlc3RSZXMvIiAvPgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvTWV0YURhdGFVdGlsc1Rlc3RSZXMtMS4wLnppcD91bnppcD10cnVlIgorICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC9NZXRhRGF0YVV0aWxzVGVzdFJlcy8iIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+Ci0KICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9Ik1wM0RlY29kZXJUZXN0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWZsYWciIHZhbHVlPSItUCAvZGF0YS9sb2NhbC90bXAvTXAzRGVjb2RlclRlc3RSZXMvIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iTWV0YURhdGFVdGlsc1Rlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9NZXRhRGF0YVV0aWxzVGVzdFJlcy8iIC8+CiAgICAgPC90ZXN0PgogPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9NZXRhRGF0YVV0aWxzVGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL01ldGFEYXRhVXRpbHNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmQ1ZmRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9NZXRhRGF0YVV0aWxzVGVzdC5jcHAKQEAgLTAsMCArMSw0OTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1ldGFEYXRhVXRpbHNUZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxFU0RTLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgorCisjaW5jbHVkZSAiTWV0YURhdGFVdGlsc1Rlc3RFbnZpcm9ubWVudC5oIgorCitjb25zdGV4cHIgdWludDhfdCBrQWR0c0NzZFNpemUgPSA3OworLy8gZnJvbSBBQUMgc3BlY3M6IGh0dHBzOi8vd3d3Lmlzby5vcmcvc3RhbmRhcmQvNDMzNDUuaHRtbAorY29uc3RleHByIGludDMyX3Qga1NhbXBsaW5nRnJlcVtdID0gezk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsIDIyMDUwLCAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwfTsKK2NvbnN0ZXhwciB1aW50OF90IGtNYXhTYW1wbGluZ0ZyZXFJbmRleCA9IHNpemVvZihrU2FtcGxpbmdGcmVxKSAvIHNpemVvZihrU2FtcGxpbmdGcmVxWzBdKTsKKworc3RhdGljIE1ldGFEYXRhVXRpbHNUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgTWV0YURhdGFWYWxpZGF0ZSB7CisgIHB1YmxpYzoKKyAgICBNZXRhRGF0YVZhbGlkYXRlKCkgOiBtSW5wdXRCdWZmZXIobnVsbHB0cikge30KKworICAgIH5NZXRhRGF0YVZhbGlkYXRlKCkgeworICAgICAgICBpZiAobUlucHV0QnVmZmVyKSB7CisgICAgICAgICAgICBkZWxldGVbXSBtSW5wdXRCdWZmZXI7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBTZXRVcE1ldGFEYXRhVmFsaWRhdGUoc3RyaW5nIGZpbGVOYW1lKSB7CisgICAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICAgICAgaW50OF90IGVyciA9IHN0YXQoZmlsZU5hbWUuY19zdHIoKSwgJmJ1Zik7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IGZpbGUgaW5mb3JtYXRpb24gZm9yIGZpbGU6ICIgPDwgZmlsZU5hbWU7CisKKyAgICAgICAgbUlucHV0QnVmZmVyU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgICAgICBGSUxFICppbnB1dEZpbGVQdHIgPSBmb3BlbihmaWxlTmFtZS5jX3N0cigpLCAicmIrIik7CisgICAgICAgIEFTU0VSVF9ORShpbnB1dEZpbGVQdHIsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gb3BlbiBmaWxlOiAiIDw8IGZpbGVOYW1lOworCisgICAgICAgIG1JbnB1dEJ1ZmZlciA9IG5ldyB1aW50OF90W21JbnB1dEJ1ZmZlclNpemVdOworICAgICAgICBBU1NFUlRfTkUobUlucHV0QnVmZmVyLCBudWxscHRyKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IG9mIHNpemU6ICIgPDwgbUlucHV0QnVmZmVyU2l6ZTsKKworICAgICAgICBpbnQzMl90IG51bUJ5dGVzID0KKyAgICAgICAgICAgICAgICBmcmVhZCgoY2hhciAqKW1JbnB1dEJ1ZmZlciwgc2l6ZW9mKHVpbnQ4X3QpLCBtSW5wdXRCdWZmZXJTaXplLCBpbnB1dEZpbGVQdHIpOworICAgICAgICBBU1NFUlRfRVEobnVtQnl0ZXMsIG1JbnB1dEJ1ZmZlclNpemUpIDw8IG51bUJ5dGVzIDw8ICIgb2YgIiA8PCBtSW5wdXRCdWZmZXJTaXplIDw8ICIgcmVhZCI7CisKKyAgICAgICAgZmNsb3NlKGlucHV0RmlsZVB0cik7CisgICAgfQorCisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlclNpemU7CisgICAgY29uc3QgdWludDhfdCAqbUlucHV0QnVmZmVyOworfTsKKworY2xhc3MgQXZjQ1NEVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08CisgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXBsZTxzdHJpbmcgLyppbnB1dEZpbGUqLywgc2l6ZV90IC8qYXZjV2lkdGgqLywgc2l6ZV90IC8qYXZjSGVpZ2h0Ki8+PiB7CisgIHB1YmxpYzoKKyAgICBBdmNDU0RUZXN0KCkgOiBtSW5wdXRCdWZmZXIobnVsbHB0cikge30KKworICAgIH5BdmNDU0RUZXN0KCkgeworICAgICAgICBpZiAobUlucHV0QnVmZmVyKSB7CisgICAgICAgICAgICBkZWxldGVbXSBtSW5wdXRCdWZmZXI7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgdHVwbGU8c3RyaW5nLCBzaXplX3QsIHNpemVfdD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICAgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDA+KHBhcmFtcyk7CisgICAgICAgIG1GcmFtZVdpZHRoID0gZ2V0PDE+KHBhcmFtcyk7CisgICAgICAgIG1GcmFtZUhlaWdodCA9IGdldDwyPihwYXJhbXMpOworCisgICAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICAgICAgaW50OF90IGVyciA9IHN0YXQoaW5wdXRGaWxlLmNfc3RyKCksICZidWYpOworICAgICAgICBBU1NFUlRfRVEoZXJyLCAwKSA8PCAiRmFpbGVkIHRvIGdldCBpbmZvcm1hdGlvbiBmb3IgZmlsZTogIiA8PCBpbnB1dEZpbGU7CisKKyAgICAgICAgbUlucHV0QnVmZmVyU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgICAgICBGSUxFICppbnB1dEZpbGVQdHIgPSBmb3BlbihpbnB1dEZpbGUuY19zdHIoKSwgInJiKyIpOworICAgICAgICBBU1NFUlRfTkUoaW5wdXRGaWxlUHRyLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIG9wZW4gZmlsZTogIiA8PCBpbnB1dEZpbGU7CisKKyAgICAgICAgbUlucHV0QnVmZmVyID0gbmV3IHVpbnQ4X3RbbUlucHV0QnVmZmVyU2l6ZV07CisgICAgICAgIEFTU0VSVF9ORShtSW5wdXRCdWZmZXIsIG51bGxwdHIpCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBjcmVhdGUgYSBidWZmZXIgb2Ygc2l6ZTogIiA8PCBtSW5wdXRCdWZmZXJTaXplOworCisgICAgICAgIGludDMyX3QgbnVtQnl0ZXMgPQorICAgICAgICAgICAgICAgIGZyZWFkKChjaGFyICopbUlucHV0QnVmZmVyLCBzaXplb2YodWludDhfdCksIG1JbnB1dEJ1ZmZlclNpemUsIGlucHV0RmlsZVB0cik7CisgICAgICAgIEFTU0VSVF9FUShudW1CeXRlcywgbUlucHV0QnVmZmVyU2l6ZSkgPDwgbnVtQnl0ZXMgPDwgIiBvZiAiIDw8IG1JbnB1dEJ1ZmZlclNpemUgPDwgIiByZWFkIjsKKworICAgICAgICBmY2xvc2UoaW5wdXRGaWxlUHRyKTsKKyAgICB9CisKKyAgICBzaXplX3QgbUZyYW1lV2lkdGg7CisgICAgc2l6ZV90IG1GcmFtZUhlaWdodDsKKyAgICBzaXplX3QgbUlucHV0QnVmZmVyU2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICptSW5wdXRCdWZmZXI7Cit9OworCitjbGFzcyBBdmNDU0RWYWxpZGF0ZVRlc3QgOiBwdWJsaWMgTWV0YURhdGFWYWxpZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RyaW5nIC8qaW5wdXRGaWxlKi8+IHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKTsKKworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTZXRVcE1ldGFEYXRhVmFsaWRhdGUoaW5wdXRGaWxlKSk7CisgICAgfQorfTsKKworY2xhc3MgQWFjQ1NEVGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTx1aW50MzJfdCAvKnByb2ZpbGUqLywgdWludDMyX3QgLypzYW1wbGluZ0ZyZXFJbmRleCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAvKmNoYW5uZWxDb25maWcqLz4+IHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgdHVwbGU8dWludDMyX3QsIHVpbnQzMl90LCB1aW50MzJfdD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICAgICAgbUFhY1Byb2ZpbGUgPSBnZXQ8MD4ocGFyYW1zKTsKKyAgICAgICAgbUFhY1NhbXBsaW5nRnJlcUluZGV4ID0gZ2V0PDE+KHBhcmFtcyk7CisgICAgICAgIG1BYWNDaGFubmVsQ29uZmlnID0gZ2V0PDI+KHBhcmFtcyk7CisgICAgfQorCisgICAgdWludDMyX3QgbUFhY1Byb2ZpbGU7CisgICAgdWludDMyX3QgbUFhY1NhbXBsaW5nRnJlcUluZGV4OworICAgIHVpbnQzMl90IG1BYWNDaGFubmVsQ29uZmlnOworfTsKKworY2xhc3MgQWFjQURUU1Rlc3QKKyAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08CisgICAgICAgICAgICAgIHR1cGxlPHN0cmluZyAvKmFkdHNGaWxlKi8sIHVpbnQzMl90IC8qY2hhbm5lbENvdW50Ki8sIHVpbnQzMl90IC8qc2FtcGxlUmF0ZSovPj4geworICBwdWJsaWM6CisgICAgQWFjQURUU1Rlc3QoKSA6IG1JbnB1dEJ1ZmZlcihudWxscHRyKSB7fQorCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICB0dXBsZTxzdHJpbmcsIHVpbnQzMl90LCB1aW50MzJfdD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICAgICAgc3RyaW5nIGZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MD4ocGFyYW1zKTsKKyAgICAgICAgbUFhY0NoYW5uZWxDb3VudCA9IGdldDwxPihwYXJhbXMpOworICAgICAgICBtQWFjU2FtcGxlUmF0ZSA9IGdldDwyPihwYXJhbXMpOworCisgICAgICAgIEZJTEUgKmZpbGVQdHIgPSBmb3BlbihmaWxlTmFtZS5jX3N0cigpLCAiciIpOworICAgICAgICBBU1NFUlRfTkUoZmlsZVB0ciwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBvcGVuIGZpbGU6ICIgPDwgZmlsZU5hbWU7CisKKyAgICAgICAgbUlucHV0QnVmZmVyID0gbmV3IHVpbnQ4X3Rba0FkdHNDc2RTaXplXTsKKyAgICAgICAgQVNTRVJUX05FKG1JbnB1dEJ1ZmZlciwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBhIG1lbW9yeSBvZiBzaXplOiAiIDw8IGtBZHRzQ3NkU2l6ZTsKKworICAgICAgICBpbnQzMl90IG51bUJ5dGVzID0gZnJlYWQoKHZvaWQgKiltSW5wdXRCdWZmZXIsIHNpemVvZih1aW50OF90KSwga0FkdHNDc2RTaXplLCBmaWxlUHRyKTsKKyAgICAgICAgQVNTRVJUX0VRKG51bUJ5dGVzLCBrQWR0c0NzZFNpemUpCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byByZWFkIGNvbXBsZXRlIGZpbGUsIGJ5dGVzIHJlYWQ6ICIgPDwgbnVtQnl0ZXM7CisKKyAgICAgICAgZmNsb3NlKGZpbGVQdHIpOworICAgIH0KKyAgICBpbnQzMl90IG1BYWNDaGFubmVsQ291bnQ7CisgICAgaW50MzJfdCBtQWFjU2FtcGxlUmF0ZTsKKyAgICBjb25zdCB1aW50OF90ICptSW5wdXRCdWZmZXI7Cit9OworCitjbGFzcyBBYWNDU0RWYWxpZGF0ZVRlc3QgOiBwdWJsaWMgTWV0YURhdGFWYWxpZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RyaW5nIC8qaW5wdXRGaWxlKi8+IHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKTsKKworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTZXRVcE1ldGFEYXRhVmFsaWRhdGUoaW5wdXRGaWxlKSk7CisgICAgfQorfTsKKworY2xhc3MgVm9yYmlzVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08cGFpcjxzdHJpbmcgLypmaWxlTmFtZSovLCBzdHJpbmcgLyppbmZvRmlsZSovPj4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPiBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgICAgICBzdHJpbmcgaW5wdXRNZWRpYUZpbGUgPSBnRW52LT5nZXRSZXMoKSArIHBhcmFtcy5maXJzdDsKKyAgICAgICAgbUlucHV0RmlsZVN0cmVhbS5vcGVuKGlucHV0TWVkaWFGaWxlLCBpZnN0cmVhbTo6aW4pOworICAgICAgICBBU1NFUlRfVFJVRShtSW5wdXRGaWxlU3RyZWFtLmlzX29wZW4oKSkgPDwgIkZhaWxlZCB0byBvcGVuIGRhdGEgZmlsZTogIiA8PCBpbnB1dE1lZGlhRmlsZTsKKworICAgICAgICBzdHJpbmcgaW5wdXRJbmZvRmlsZSA9IGdFbnYtPmdldFJlcygpICsgcGFyYW1zLnNlY29uZDsKKyAgICAgICAgbUluZm9GaWxlU3RyZWFtLm9wZW4oaW5wdXRJbmZvRmlsZSwgaWZzdHJlYW06OmluKTsKKyAgICAgICAgQVNTRVJUX1RSVUUobUlucHV0RmlsZVN0cmVhbS5pc19vcGVuKCkpIDw8ICJGYWlsZWQgdG8gb3BlbiBkYXRhIGZpbGU6ICIgPDwgaW5wdXRJbmZvRmlsZTsKKyAgICAgICAgQVNTRVJUX0ZBTFNFKGlucHV0SW5mb0ZpbGUuZW1wdHkoKSkgPDwgIkVtcHR5IGluZm8gZmlsZTogIiA8PCBpbnB1dEluZm9GaWxlOworICAgIH0KKworICAgIH5Wb3JiaXNUZXN0KCkgeworICAgICAgICBpZiAobUlucHV0RmlsZVN0cmVhbS5pc19vcGVuKCkpIG1JbnB1dEZpbGVTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgaWYgKG1JbmZvRmlsZVN0cmVhbS5pc19vcGVuKCkpIG1JbmZvRmlsZVN0cmVhbS5jbG9zZSgpOworICAgIH0KKworICAgIGlmc3RyZWFtIG1JbnB1dEZpbGVTdHJlYW07CisgICAgaWZzdHJlYW0gbUluZm9GaWxlU3RyZWFtOworfTsKKworVEVTVF9QKEF2Y0NTRFRlc3QsIEF2Y0NTRFZhbGlkYXRpb25UZXN0KSB7CisgICAgQU1lZGlhRm9ybWF0ICpjc2REYXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIEFTU0VSVF9ORShjc2REYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBBTWVkaWEgZm9ybWF0IjsKKworICAgIGJvb2wgc3RhdHVzID0gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKGNzZERhdGEsIG1JbnB1dEJ1ZmZlciwgbUlucHV0QnVmZmVyU2l6ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIG1ha2UgQVZDIENTRCBmcm9tIEFNZWRpYUZvcm1hdCI7CisKKyAgICBpbnQzMl90IGF2Y1dpZHRoID0gLTE7CisgICAgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2dldEludDMyKGNzZERhdGEsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsICZhdmNXaWR0aCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCBhdmMgd2lkdGgiOworICAgIEFTU0VSVF9FUShhdmNXaWR0aCwgbUZyYW1lV2lkdGgpOworCisgICAgaW50MzJfdCBhdmNIZWlnaHQgPSAtMTsKKyAgICBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoY3NkRGF0YSwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsICZhdmNIZWlnaHQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgYXZjIGhlaWdodCI7CisgICAgQVNTRVJUX0VRKGF2Y0hlaWdodCwgbUZyYW1lSGVpZ2h0KTsKKworICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlID0gIiI7CisgICAgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2dldFN0cmluZyhjc2REYXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lVHlwZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgbWltZSB0eXBlIjsKKyAgICBBU1NFUlRfU1RSRVEobWltZVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisKKyAgICBNZXRhRGF0YUJhc2UgKm1ldGFEYXRhID0gbmV3IE1ldGFEYXRhQmFzZSgpOworICAgIEFTU0VSVF9ORShtZXRhRGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgTWV0YURhdGEgQmFzZSI7CisKKyAgICBzdGF0dXMgPSBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoKm1ldGFEYXRhLCBtSW5wdXRCdWZmZXIsIG1JbnB1dEJ1ZmZlclNpemUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBtYWtlIEFWQyBDU0QgZnJvbSBNZXRhRGF0YUJhc2UiOworCisgICAgYXZjV2lkdGggPSAtMTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJmF2Y1dpZHRoKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZmluZCB0aGUgd2lkdGgiOworICAgIEFTU0VSVF9FUShhdmNXaWR0aCwgbUZyYW1lV2lkdGgpOworCisgICAgYXZjSGVpZ2h0ID0gLTE7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmYXZjSGVpZ2h0KTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZmluZCB0aGUgaGVpZ2h0IjsKKyAgICBBU1NFUlRfRVEoYXZjSGVpZ2h0LCBtRnJhbWVIZWlnaHQpOworCisgICAgdm9pZCAqY3NkQU1lZGlhRm9ybWF0QnVmZmVyID0gbnVsbHB0cjsKKyAgICBzaXplX3QgY3NkQU1lZGlhRm9ybWF0U2l6ZTsKKyAgICBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKGNzZERhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgJmNzZEFNZWRpYUZvcm1hdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjc2RBTWVkaWFGb3JtYXRTaXplKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBDU0QgZnJvbSBBTWVkaWFGb3JtYXQiOworICAgIEFTU0VSVF9ORShjc2RBTWVkaWFGb3JtYXRCdWZmZXIsIG51bGxwdHIpIDw8ICJJbnZhbGlkIENTRCBmcm9tIEFNZWRpYUZvcm1hdCI7CisKKyAgICBjb25zdCB2b2lkICpjc2RNZXRhRGF0YUJhc2VCdWZmZXIgPSBudWxscHRyOworICAgIHNpemVfdCBjc2RNZXRhRGF0YUJhc2VTaXplID0gMDsKKyAgICB1aW50MzJfdCBtZWRpYVR5cGU7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmREYXRhKGtLZXlBVkNDLCAmbWVkaWFUeXBlLCAmY3NkTWV0YURhdGFCYXNlQnVmZmVyLCAmY3NkTWV0YURhdGFCYXNlU2l6ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgQ1NEIGZyb20gTWV0YURhdGFCYXNlIjsKKyAgICBBU1NFUlRfTkUoY3NkTWV0YURhdGFCYXNlQnVmZmVyLCBudWxscHRyKSA8PCAiSW52YWxpZCBDU0QgZnJvbSBNZXRhRGF0YUJhc2UiOworICAgIEFTU0VSVF9HVChjc2RNZXRhRGF0YUJhc2VTaXplLCAwKSA8PCAiQ1NEIHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCI7CisgICAgQVNTRVJUX0VRKGNzZE1ldGFEYXRhQmFzZVNpemUsIGNzZEFNZWRpYUZvcm1hdFNpemUpCisgICAgICAgICAgICA8PCAiQ1NEIHNpemUgb2YgTWV0YURhdGEgdHlwZSBhbmQgQU1lZGlhRm9ybWF0IHR5cGUgbXVzdCBiZSBzYW1lIjsKKworICAgIGludDMyX3QgcmVzdWx0ID0gbWVtY21wKGNzZEFNZWRpYUZvcm1hdEJ1ZmZlciwgY3NkTWV0YURhdGFCYXNlQnVmZmVyLCBjc2RBTWVkaWFGb3JtYXRTaXplKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCAwKSA8PCAiQ1NEIGZyb20gQU1lZGlhRm9ybWF0IGFuZCBNZXRhRGF0YUJhc2UgZG8gbm90IG1hdGNoIjsKKworICAgIGRlbGV0ZSBtZXRhRGF0YTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGNzZERhdGEpOworfQorCitURVNUX1AoQXZjQ1NEVmFsaWRhdGVUZXN0LCBBdmNWYWxpZGF0ZVRlc3QpIHsKKyAgICBBTWVkaWFGb3JtYXQgKmNzZERhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgQVNTRVJUX05FKGNzZERhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIEFNZWRpYSBmb3JtYXQiOworCisgICAgYm9vbCBzdGF0dXMgPSBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoY3NkRGF0YSwgbUlucHV0QnVmZmVyLCBtSW5wdXRCdWZmZXJTaXplKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhIHdpdGggQU1lZGlhRm9ybWF0IHN1Y2NlZWRzIHdpdGggaW52YWxpZCBkYXRhIjsKKworICAgIE1ldGFEYXRhQmFzZSAqbWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCk7CisgICAgQVNTRVJUX05FKG1ldGFEYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBNZXRhRGF0YSBCYXNlIjsKKworICAgIHN0YXR1cyA9IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgqbWV0YURhdGEsIG1JbnB1dEJ1ZmZlciwgbUlucHV0QnVmZmVyU2l6ZSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIk1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSB3aXRoIE1ldGFEYXRhQmFzZSBzdWNjZWVkcyB3aXRoIGludmFsaWQgZGF0YSI7Cit9CisKK1RFU1RfUChBYWNDU0RUZXN0LCBBYWNDU0RWYWxpZGF0aW9uVGVzdCkgeworICAgIEFNZWRpYUZvcm1hdCAqY3NkRGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBBU1NFUlRfTkUoY3NkRGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgQU1lZGlhIGZvcm1hdCI7CisKKyAgICBBU1NFUlRfR0UobUFhY1NhbXBsaW5nRnJlcUluZGV4LCAwKTsKKyAgICBBU1NFUlRfTFQobUFhY1NhbXBsaW5nRnJlcUluZGV4LCBrTWF4U2FtcGxpbmdGcmVxSW5kZXgpOworICAgIGJvb2wgc3RhdHVzID0gTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKGNzZERhdGEsIG1BYWNQcm9maWxlLCBtQWFjU2FtcGxpbmdGcmVxSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFhY0NoYW5uZWxDb25maWcpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBtYWtlIEFBQyBDU0QgZnJvbSBBTWVkaWFGb3JtYXQiOworCisgICAgaW50MzJfdCBzYW1wbGVSYXRlID0gLTE7CisgICAgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2dldEludDMyKGNzZERhdGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZzYW1wbGVSYXRlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHNhbXBsZSByYXRlIjsKKyAgICBBU1NFUlRfRVEoa1NhbXBsaW5nRnJlcVttQWFjU2FtcGxpbmdGcmVxSW5kZXhdLCBzYW1wbGVSYXRlKTsKKworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gLTE7CisgICAgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2dldEludDMyKGNzZERhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgJmNoYW5uZWxDb3VudCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCBjaGFubmVsIGNvdW50IjsKKyAgICBBU1NFUlRfRVEoY2hhbm5lbENvdW50LCBtQWFjQ2hhbm5lbENvbmZpZyk7CisKKyAgICBjb25zdCBjaGFyICptaW1lVHlwZSA9ICIiOworICAgIHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoY3NkRGF0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZVR5cGUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdGhlIG1pbWUgdHlwZSI7CisgICAgQVNTRVJUX1NUUkVRKG1pbWVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworCisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIE1ldGFEYXRhIEJhc2UiOworCisgICAgc3RhdHVzID0gTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKCptZXRhRGF0YSwgbUFhY1Byb2ZpbGUsIG1BYWNTYW1wbGluZ0ZyZXFJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFhY0NoYW5uZWxDb25maWcpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBtYWtlIEFBQyBDU0QgZnJvbSBNZXRhRGF0YUJhc2UiOworCisgICAgc2FtcGxlUmF0ZSA9IC0xOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHNhbXBsaW5nIHJhdGUiOworICAgIEFTU0VSVF9FUShrU2FtcGxpbmdGcmVxW21BYWNTYW1wbGluZ0ZyZXFJbmRleF0sIHNhbXBsZVJhdGUpOworCisgICAgY2hhbm5lbENvdW50ID0gLTE7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmY2hhbm5lbENvdW50KTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IGNoYW5uZWwgY291bnQiOworICAgIEFTU0VSVF9FUShjaGFubmVsQ291bnQsIG1BYWNDaGFubmVsQ29uZmlnKTsKKworICAgIG1pbWVUeXBlID0gIiI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWVUeXBlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IG1pbWUgdHlwZSI7CisgICAgQVNTRVJUX1NUUkVRKG1pbWVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworCisgICAgdm9pZCAqY3NkQU1lZGlhRm9ybWF0QnVmZmVyID0gbnVsbHB0cjsKKyAgICBzaXplX3QgY3NkQU1lZGlhRm9ybWF0U2l6ZSA9IDA7CisgICAgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihjc2REYXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCAmY3NkQU1lZGlhRm9ybWF0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNzZEFNZWRpYUZvcm1hdFNpemUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdGhlIEFNZWRpYUZvcm1hdCBDU0QiOworICAgIEFTU0VSVF9HVChjc2RBTWVkaWFGb3JtYXRTaXplLCAwKSA8PCAiQ1NEIHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCI7CisgICAgQVNTRVJUX05FKGNzZEFNZWRpYUZvcm1hdEJ1ZmZlciwgbnVsbHB0cikgPDwgIkludmFsaWQgQ1NEIGZvdW5kIjsKKworICAgIGNvbnN0IHZvaWQgKmNzZE1ldGFEYXRhQmFzZUJ1ZmZlcjsKKyAgICBzaXplX3QgY3NkTWV0YURhdGFCYXNlU2l6ZSA9IDA7CisgICAgdWludDMyX3QgbWVkaWFUeXBlOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kRGF0YShrS2V5RVNEUywgJm1lZGlhVHlwZSwgJmNzZE1ldGFEYXRhQmFzZUJ1ZmZlciwgJmNzZE1ldGFEYXRhQmFzZVNpemUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdGhlIEVTRFMgZGF0YSBmcm9tIE1ldGFEYXRhQmFzZSI7CisgICAgQVNTRVJUX0dUKGNzZE1ldGFEYXRhQmFzZVNpemUsIDApIDw8ICJDU0Qgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIjsKKworICAgIEVTRFMgZXNkcyhjc2RNZXRhRGF0YUJhc2VCdWZmZXIsIGNzZE1ldGFEYXRhQmFzZVNpemUpOworICAgIHN0YXR1c190IHJlc3VsdCA9IGVzZHMuZ2V0Q29kZWNTcGVjaWZpY0luZm8oJmNzZE1ldGFEYXRhQmFzZUJ1ZmZlciwgJmNzZE1ldGFEYXRhQmFzZVNpemUpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIChzdGF0dXNfdClPSykgPDwgIkZhaWxlZCB0byBnZXQgQ1NEIGZyb20gRVNEUyBkYXRhIjsKKyAgICBBU1NFUlRfTkUoY3NkTWV0YURhdGFCYXNlQnVmZmVyLCBudWxscHRyKSA8PCAiSW52YWxpZCBDU0QgZm91bmQiOworICAgIEFTU0VSVF9FUShjc2RBTWVkaWFGb3JtYXRTaXplLCBjc2RNZXRhRGF0YUJhc2VTaXplKQorICAgICAgICAgICAgPDwgIkNTRCBzaXplIGRvIG5vdCBtYXRjaCBiZXR3ZWVuIEFNZWRpYUZvcm1hdCB0eXBlIGFuZCBNZXRhRGF0YUJhc2UgdHlwZSI7CisKKyAgICBpbnQzMl90IG1lbWNtcFJlc3VsdCA9CisgICAgICAgICAgICBtZW1jbXAoY3NkQU1lZGlhRm9ybWF0QnVmZmVyLCBjc2RNZXRhRGF0YUJhc2VCdWZmZXIsIGNzZEFNZWRpYUZvcm1hdFNpemUpOworICAgIEFTU0VSVF9FUShtZW1jbXBSZXN1bHQsIDApIDw8ICJBTWVkaWFGb3JtYXQgYW5kIE1ldGFEYXRhQmFzZSBDU0RzIGRvIG5vdCBtYXRjaCI7CisKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGNzZERhdGEpOworICAgIGRlbGV0ZSBtZXRhRGF0YTsKK30KKworVEVTVF9QKEFhY0FEVFNUZXN0LCBBYWNBRFRTVmFsaWRhdGlvblRlc3QpIHsKKyAgICBNZXRhRGF0YUJhc2UgKm1ldGFEYXRhID0gbmV3IE1ldGFEYXRhQmFzZSgpOworICAgIEFTU0VSVF9ORShtZXRhRGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgbWV0YSBkYXRhIjsKKworICAgIGJvb2wgc3RhdHVzID0gTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKCptZXRhRGF0YSwgbUlucHV0QnVmZmVyLCBrQWR0c0NzZFNpemUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBtYWtlIEFBQyBDU0QgZnJvbSBNZXRhRGF0YUJhc2UiOworCisgICAgaW50MzJfdCBzYW1wbGVSYXRlID0gLTE7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgc2FtcGxpbmcgcmF0ZSI7CisgICAgQVNTRVJUX0VRKHNhbXBsZVJhdGUsIG1BYWNTYW1wbGVSYXRlKTsKKworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gLTE7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmY2hhbm5lbENvdW50KTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IGNoYW5uZWwgY291bnQiOworICAgIEFTU0VSVF9FUShjaGFubmVsQ291bnQsIG1BYWNDaGFubmVsQ291bnQpOworCisgICAgY29uc3QgY2hhciAqbWltZVR5cGUgPSAiIjsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZVR5cGUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgbWltZSB0eXBlIjsKKyAgICBBU1NFUlRfU1RSRVEobWltZVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisKKyAgICBkZWxldGUgbWV0YURhdGE7Cit9CisKK1RFU1RfUChBYWNDU0RWYWxpZGF0ZVRlc3QsIEFhY0ludmFsaWRJbnB1dFRlc3QpIHsKKyAgICBNZXRhRGF0YUJhc2UgKm1ldGFEYXRhID0gbmV3IE1ldGFEYXRhQmFzZSgpOworICAgIEFTU0VSVF9ORShtZXRhRGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgbWV0YSBkYXRhIjsKKworICAgIGJvb2wgc3RhdHVzID0gTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKCptZXRhRGF0YSwgbUlucHV0QnVmZmVyLCBrQWR0c0NzZFNpemUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEgc3VjY2VlZHMgd2l0aCBpbnZhbGlkIGRhdGEiOworfQorCitURVNUX1AoVm9yYmlzVGVzdCwgVm9yYmlzQ29tbWVudFRlc3QpIHsKKyAgICBzdHJpbmcgbGluZTsKKyAgICBzdHJpbmcgdGFnOworICAgIHN0cmluZyBrZXk7CisgICAgc3RyaW5nIHZhbHVlOworICAgIHNpemVfdCBjb21tZW50TGVuZ3RoOworICAgIGJvb2wgc3RhdHVzOworCisgICAgd2hpbGUgKGdldGxpbmUobUluZm9GaWxlU3RyZWFtLCBsaW5lKSkgeworICAgICAgICBpc3RyaW5nc3RyZWFtIHN0cmluZ0xpbmUobGluZSk7CisgICAgICAgIHN0cmluZ0xpbmUgPj4gdGFnID4+IGtleSA+PiB2YWx1ZSA+PiBjb21tZW50TGVuZ3RoOworICAgICAgICBBU1NFUlRfR1QoY29tbWVudExlbmd0aCwgMCkgPDwgIlZvcmJpcyBjb21tZW50IHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCI7CisKKyAgICAgICAgc3RyaW5nIGNvbW1lbnQ7CisgICAgICAgIHN0cmluZyBkYXRhTGluZTsKKworICAgICAgICBnZXRsaW5lKG1JbnB1dEZpbGVTdHJlYW0sIGRhdGFMaW5lKTsKKyAgICAgICAgaXN0cmluZ3N0cmVhbSBkYXRhU3RyaW5nTGluZShkYXRhTGluZSk7CisgICAgICAgIGRhdGFTdHJpbmdMaW5lID4+IGNvbW1lbnQ7CisKKyAgICAgICAgY2hhciAqYnVmZmVyID0gc3RybmR1cChjb21tZW50LmNfc3RyKCksIGNvbW1lbnRMZW5ndGgpOworICAgICAgICBBU1NFUlRfTkUoYnVmZmVyLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBvZiBzaXplOiAiIDw8IGNvbW1lbnRMZW5ndGg7CisKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgQVNTRVJUX05FKGZpbGVNZXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBBTWVkaWEgZm9ybWF0IjsKKworICAgICAgICBwYXJzZVZvcmJpc0NvbW1lbnQoZmlsZU1ldGEsIGJ1ZmZlciwgY29tbWVudExlbmd0aCk7CisgICAgICAgIGZyZWUoYnVmZmVyKTsKKworICAgICAgICBpZiAoIXN0cm5jYXNlY21wKHRhZy5jX3N0cigpLCAiQU5EUk9JRF9IQVBUSUMiLCBzaXplb2YodGFnKSkpIHsKKyAgICAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbEV4cGVjdGVkID0gc3RvaSh2YWx1ZSk7CisgICAgICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxGb3VuZCA9IC0xOworICAgICAgICAgICAgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2dldEludDMyKGZpbGVNZXRhLCBrZXkuY19zdHIoKSwgJm51bUNoYW5uZWxGb3VuZCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBjaGFubmVsIGNvdW50IjsKKyAgICAgICAgICAgIEFTU0VSVF9FUShudW1DaGFubmVsRXhwZWN0ZWQsIG51bUNoYW5uZWxGb3VuZCk7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKHRhZy5jX3N0cigpLCAiQU5EUk9JRF9MT09QIiwgc2l6ZW9mKHRhZykpKSB7CisgICAgICAgICAgICBpbnQzMl90IGxvb3BFeHBlY3RlZCA9ICF2YWx1ZS5jb21wYXJlKCJ0cnVlIik7CisgICAgICAgICAgICBpbnQzMl90IGxvb3BGb3VuZCA9IC0xOworCisgICAgICAgICAgICBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZmlsZU1ldGEsICJsb29wIiwgJmxvb3BGb3VuZCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBsb29wIGNvdW50IjsKKyAgICAgICAgICAgIEFTU0VSVF9FUShsb29wRXhwZWN0ZWQsIGxvb3BGb3VuZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICp0YWdWYWx1ZSA9ICIiOworICAgICAgICAgICAgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2dldFN0cmluZyhmaWxlTWV0YSwga2V5LmNfc3RyKCksICZ0YWdWYWx1ZSk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSB0YWcgdmFsdWUiOworICAgICAgICAgICAgQVNTRVJUX1NUUkVRKHZhbHVlLmNfc3RyKCksIHRhZ1ZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZpbGVNZXRhKTsKKyAgICB9Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChNZXRhRGF0YVV0aWxzVGVzdEFsbCwgQXZjQ1NEVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3R1cGxlKCJzcHNfcHBzX3VzZXJkYXRhLmgyNjQiLCA4LCA4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJzcHNfdXNlcmRhdGFfcHBzLmgyNjQiLCA4LCA4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJzcHNfcHBzX3Nwc19wcHMuaDI2NCIsIDgsIDgpKSk7CisKKy8vIFRPRE8oYi8xNTgwNjc2OTEpOiBBZGQgaW52YWxpZCB0ZXN0IHZlY3RvcnMgd2l0aCBpbmNvbXBsZXRlIFBQUyBvciBubyBQUFMKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChNZXRhRGF0YVV0aWxzVGVzdEFsbCwgQXZjQ1NEVmFsaWRhdGVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKCJzcHNfcHBzX29ubHlfc3RhcnRjb2RlLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcHNfaW5jb21wbGV0ZV9wcHMuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzE1ODA2NzY5MSkgInNwc19wcHNfaW5jb21wbGV0ZS5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmFuZG9tZGF0YS5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMTU4MDY3NjkxKSAic3BzLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcHMuaDI2NCIpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKE1ldGFEYXRhVXRpbHNUZXN0QWxsLCBBYWNDU0RUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoQUFDT2JqZWN0TWFpbiwgMSwgMSkpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKE1ldGFEYXRhVXRpbHNUZXN0QWxsLCBBYWNBRFRTVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3R1cGxlKCJsb3Vkc29mdGFhY2FkdHMiLCAxLCA0NDEwMCkpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKE1ldGFEYXRhVXRpbHNUZXN0QWxsLCBBYWNDU0RWYWxpZGF0ZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoImxvdWRzb2Z0YWFjYWR0c19pbnZhbGlkaGVhZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG91ZHNvZnRhYWNhZHRzX2ludmFsaWRwcm9maWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG91ZHNvZnRhYWNhZHRzX2ludmFsaWRjaGFubmVsY29uZmlnIikpOworCisvLyBUT0RPKGIvMTU3OTc0NTA4KSBBZGQgdGVzdCB2ZWN0b3IgZm9yIHZvcmJpcyB0aHVtYm5haWwgdGFnCisvLyBJbmZvIGZpbGUgY29udGFpbnMgVEFHLCBLZXksIFZhbHVlIGFuZCBzaXplIG9mIHRoZSB2b3JiaXMgY29tbWVudAorSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBNZXRhRGF0YVV0aWxzVGVzdEFsbCwgVm9yYmlzVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJ2b3JiaXNjb21tZW50X3NpbnRlbC5kYXQiLCAidm9yYmlzY29tbWVudF9zaW50ZWwuaW5mbyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInZvcmJpc2NvbW1lbnRfYWxidW0uZGF0IiwgInZvcmJpc2NvbW1lbnRfYWxidW0uaW5mbyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInZvcmJpc2NvbW1lbnRfbG9vcC5kYXQiLCAidm9yYmlzY29tbWVudF9sb29wLmluZm8iKSkpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IE1ldGFEYXRhVXRpbHNUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIEFMT0dWKCJUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9NZXRhRGF0YVV0aWxzVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL01ldGFEYXRhVXRpbHNUZXN0RW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDY0MmJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9NZXRhRGF0YVV0aWxzVGVzdEVudmlyb25tZW50LmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19NRVRBREFUQV9VVElMU19URVNUX0VOVklST05NRU5UX0hfXworI2RlZmluZSBfX01FVEFEQVRBX1VUSUxTX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIE1ldGFEYXRhVXRpbHNUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWM6OnRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyAgcHVibGljOgorICAgIE1ldGFEYXRhVXRpbHNUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL2RhdGEvbG9jYWwvdG1wLyIpIHt9CisKKyAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyICpfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IHN0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KKworICBwcml2YXRlOgorICAgIHN0cmluZyByZXM7Cit9OworCitpbnQgTWV0YURhdGFVdGlsc1Rlc3RFbnZpcm9ubWVudDo6aW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHt7InBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzogeworICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCisgICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBfX01FVEFEQVRBX1VUSUxTX1RFU1RfRU5WSVJPTk1FTlRfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NjJhMDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL1JFQURNRS5tZApAQCAtMCwwICsxLDM5IEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgTWV0YURhdGFVdGlscyBUZXN0CitUaGUgTWV0YURhdGFVdGlscyBVbml0IFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIGxpYnJhcnkgYXZhaWxhYmxlIGluIGxpYnN0YWdlZnJpZ2h0LgorCitSdW4gdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB0aGUgdGVzdCBzdWl0ZToKK2BgYAorbSBNZXRhRGF0YVV0aWxzVGVzdAorYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9NZXRhRGF0YVV0aWxzVGVzdC9NZXRhRGF0YVV0aWxzVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L01ldGFEYXRhVXRpbHNUZXN0L01ldGFEYXRhVXRpbHNUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9NZXRhRGF0YVV0aWxzVGVzdFJlcy0xLjAuemlwKS4gRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgorCitgYGAKK2FkYiBwdXNoIE1ldGFEYXRhVXRpbHNUZXN0UmVzLTEuMCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKwordXNhZ2U6IE1ldGFEYXRhVXRpbHNUZXN0IC1QIFw8cGF0aF90b19mb2xkZXJcPgorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL01ldGFEYXRhVXRpbHNUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9NZXRhRGF0YVV0aWxzVGVzdFJlcy0xLjAvCitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IE1ldGFEYXRhVXRpbHNUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvQW5kcm9pZC5icAppbmRleCA3ZTE2OWNiLi4zOGQ1ZWNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X3Rlc3RzX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF90ZXN0c19saWNlbnNlIiwKKyAgICBdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAid3JpdGVyVGVzdCIsCiAgICAgZ3Rlc3Q6IHRydWUsCkBAIC0yOCwxMyArMzksMTUgQEAKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfd2VibSIsCi0gICAgICAgICJsaWJkYXRhc291cmNlIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliZGF0YXNvdXJjZSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKICAgICAgICAgImxpYm9nZyIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvQW5kcm9pZFRlc3QueG1sCmluZGV4IGQ4MzE1NTUuLmNjODkwZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9BbmRyb2lkVGVzdC54bWwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWRUZXN0LnhtbApAQCAtMTksMTIgKzE5LDEzIEBACiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IndyaXRlclRlc3QtPi9kYXRhL2xvY2FsL3RtcC93cml0ZXJUZXN0IiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKLSAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyLnppcD91bnppcD10cnVlIgotICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC93cml0ZXJUZXN0UmVzLyIgLz4KKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdFJlcy0xLjEuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL1dyaXRlclRlc3RSZXMvIiAvPgogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgogICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0id3JpdGVyVGVzdCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL3dyaXRlclRlc3RSZXMvIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWZsYWciIHZhbHVlPSItUCAvZGF0YS9sb2NhbC90bXAvV3JpdGVyVGVzdFJlcy8iIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1DIHRydWUiIC8+CiAgICAgPC90ZXN0PgogPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9SRUFETUUubWQKaW5kZXggYWUwNzkxNy4uMGU1NGNhNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1JFQURNRS5tZAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvUkVBRE1FLm1kCkBAIC0xOSwxMyArMTksMTggQEAKIAogYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC93cml0ZXJUZXN0L3dyaXRlclRlc3QgL2RhdGEvbG9jYWwvdG1wLwogCi1UaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL3dyaXRlclRlc3RSZXMuemlwKS4KK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdFJlcy0xLjEuemlwKS4KIERvd25sb2FkIGFuZCBleHRyYWN0IHRoZSBmb2xkZXIuIFB1c2ggYWxsIHRoZSBmaWxlcyBpbiB0aGlzIGZvbGRlciB0byAvZGF0YS9sb2NhbC90bXAvIG9uIHRoZSBkZXZpY2UuCiBgYGAKLWFkYiBwdXNoIHdyaXRlclRlc3RSZXMgL2RhdGEvbG9jYWwvdG1wLworYWRiIHB1c2ggV3JpdGVyVGVzdFJlcy0xLjEvLiAvZGF0YS9sb2NhbC90bXAvV3JpdGVyVGVzdFJlcy8KIGBgYAogCi11c2FnZTogd3JpdGVyVGVzdCAtUCBcPHBhdGhfdG9fcmVzX2ZvbGRlclw+Cit1c2FnZTogd3JpdGVyVGVzdCAtUCBcPHBhdGhfdG9fcmVzX2ZvbGRlclw+IC1DIDxyZW1vdmVfb3V0cHV0X2ZpbGU+CiBgYGAKLWFkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvd3JpdGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL3dyaXRlclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL1dyaXRlclRlc3RSZXMvIC1DIHRydWUKK2BgYAorQWx0ZXJuYXRpdmVseSwgdGhlIHRlc3QgY2FuIGFsc28gYmUgcnVuIHVzaW5nIGF0ZXN0IGNvbW1hbmQuCisKK2BgYAorYXRlc3Qgd3JpdGVyVGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCiBgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJMaXN0ZW5lci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlckxpc3RlbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmMGE3YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJMaXN0ZW5lci5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFdSSVRFUl9MSVNURU5FUl9IXworI2RlZmluZSBXUklURVJfTElTVEVORVJfSF8KKworI2luY2x1ZGUgPG11dGV4PgorCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXJDbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgV3JpdGVyTGlzdGVuZXIgOiBwdWJsaWMgQm5NZWRpYVJlY29yZGVyQ2xpZW50IHsKKyAgcHVibGljOgorICAgIFdyaXRlckxpc3RlbmVyKCkgOiBtU2lnbmFsZWRTaXplKGZhbHNlKSwgbVNpZ25hbGVkRHVyYXRpb24oZmFsc2UpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludDMyX3QgbXNnLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0MikgeworICAgICAgICBBTE9HVigibXNnIDogJWQsIGV4dDEgOiAlZCwgZXh0MiA6ICVkIiwgbXNnLCBleHQxLCBleHQyKTsKKyAgICAgICAgaWYgKGV4dDEgPT0gTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRklMRVNJWkVfUkVBQ0hFRCkgeworICAgICAgICAgICAgbVNpZ25hbGVkU2l6ZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoZXh0MSA9PSBNRURJQV9SRUNPUkRFUl9JTkZPX01BWF9EVVJBVElPTl9SRUFDSEVEKSB7CisgICAgICAgICAgICBtU2lnbmFsZWREdXJhdGlvbiA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2xhdGlsZSBib29sIG1TaWduYWxlZFNpemU7CisgICAgdm9sYXRpbGUgYm9vbCBtU2lnbmFsZWREdXJhdGlvbjsKK307CisKKyNlbmRpZiAgLy8gV1JJVEVSX0xJU1RFTkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdC5jcHAKaW5kZXggZmYwNjNlMy4uZDE3MGU3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclRlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0LmNwcApAQCAtMTgsOSArMTgsMTMgQEAKICNkZWZpbmUgTE9HX1RBRyAiV3JpdGVyVGVzdCIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8ZnN0cmVhbT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KIAorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgpAQCAtMzksMTggKzQzLDQwIEBACiAKICNkZWZpbmUgT1VUUFVUX0ZJTEVfTkFNRSAiL2RhdGEvbG9jYWwvdG1wL3dyaXRlci5vdXQiCiAKKy8vIFN0dHMgdmFsdWVzIHdpdGhpbiAwLjFtcygxMDB1cykgZGlmZmVyZW5jZSBhcmUgZnVkZ2VkIHRvIHNhdmUgdG9vCisvLyBtYW55IHN0dHMgZW50cmllcyBpbiBNUEVHNFdyaXRlci4KK2NvbnN0ZXhwciBpbnQzMl90IGtNcGVnNE11eFRvbGVyYW5jZVRpbWVVcyA9IDEwMDsKKy8vIFRvbGVyYW5jZSB2YWx1ZSBmb3Igb3RoZXIgd3JpdGVycworY29uc3RleHByIGludDMyX3Qga011eFRvbGVyYW5jZVRpbWVVcyA9IDE7CisKIHN0YXRpYyBXcml0ZXJUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOwogCi1zdHJ1Y3QgY29uZmlnRm9ybWF0IHsKLSAgICBjaGFyIG1pbWVbMTI4XTsKLSAgICBpbnQzMl90IHdpZHRoOwotICAgIGludDMyX3QgaGVpZ2h0OwotICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKLSAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKK2VudW0gaW5wdXRJZCB7CisgICAgLy8gYXVkaW8gc3RyZWFtcworICAgIEFBQ18xLAorICAgIEFBQ19BRFRTXzEsCisgICAgQU1SX05CXzEsCisgICAgQU1SX1dCXzEsCisgICAgRkxBQ18xLAorICAgIE9QVVNfMSwKKyAgICBWT1JCSVNfMSwKKyAgICAvLyB2aWRlbyBzdHJlYW1zCisgICAgQVYxXzEsCisgICAgQVZDXzEsCisgICAgSDI2M18xLAorICAgIEhFVkNfMSwKKyAgICBNUEVHNF8xLAorICAgIFZQOF8xLAorICAgIFZQOV8xLAorICAgIC8vIGhlaWYgc3RyZWFtCisgICAgSEVJQ18xLAorICAgIFVOVVNFRF9JRCwKKyAgICBVTktOT1dOX0lELAogfTsKIAogLy8gTG9va1VwVGFibGUgb2YgY2xpcHMgYW5kIG1ldGFkYXRhIGZvciBjb21wb25lbnQgdGVzdGluZwogc3RhdGljIGNvbnN0IHN0cnVjdCBJbnB1dERhdGEgeworICAgIGlucHV0SWQgaW5wSWQ7CiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBzdHJpbmcgaW5wdXRGaWxlOwogICAgIHN0cmluZyBpbmZvOwpAQCAtNTgsNjUgKzg0LDczIEBACiAgICAgaW50MzJfdCBzZWNvbmRQYXJhbTsKICAgICBib29sIGlzQXVkaW87CiB9IGtJbnB1dERhdGFbXSA9IHsKLSAgICAgICAge01FRElBX01JTUVUWVBFX0FVRElPX09QVVMsICJiYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm9wdXMiLAotICAgICAgICAgImJiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyIsIDQ4MDAwLCAyLCB0cnVlfSwKLSAgICAgICAge01FRElBX01JTUVUWVBFX0FVRElPX0FBQywgImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMiLAotICAgICAgICAgImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIiwgNDgwMDAsIDIsIHRydWV9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFMsICJNcHNfMl9jMl9mcjFfU2MxX0RjMl8weDAzX3Jhdy5hZHRzIiwKKyAgICAgICAge0FBQ18xLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJhdWRpb19hYWNfc3RlcmVvXzhrYnBzXzExMDI1aHouYWFjIiwKKyAgICAgICAgICJhdWRpb19hYWNfc3RlcmVvXzhrYnBzXzExMDI1aHouaW5mbyIsIDExMDI1LCAyLCB0cnVlfSwKKyAgICAgICAge0FBQ19BRFRTXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTLCAiTXBzXzJfYzJfZnIxX1NjMV9EYzJfMHgwM19yYXcuYWR0cyIsCiAgICAgICAgICAiTXBzXzJfYzJfZnIxX1NjMV9EYzJfMHgwM19yYXcuaW5mbyIsIDQ4MDAwLCAyLCB0cnVlfSwKLSAgICAgICAge01FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgInNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouYW1ybmIiLAorICAgICAgICB7QU1SX05CXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgInNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouYW1ybmIiLAogICAgICAgICAgInNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouaW5mbyIsIDgwMDAsIDEsIHRydWV9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCAiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YiIsCisgICAgICAgIHtBTVJfV0JfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCAiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YiIsCiAgICAgICAgICAiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5pbmZvIiwgMTYwMDAsIDEsIHRydWV9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLCAiYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LnZvcmJpcyIsCi0gICAgICAgICAiYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLCA0ODAwMCwgMiwgdHJ1ZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDLCAiYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5mbGFjIiwKKyAgICAgICAge0ZMQUNfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQywgImJiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouZmxhYyIsCiAgICAgICAgICAiYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5pbmZvIiwgNDgwMDAsIDIsIHRydWV9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfVklERU9fVlA5LCAiYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMudnA5IiwKLSAgICAgICAgICJiYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy5pbmZvIiwgMTc2LCAxNDQsIGZhbHNlfSwKLSAgICAgICAge01FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCwgImJiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLnZwOCIsCi0gICAgICAgICAiYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMuaW5mbyIsIDE3NiwgMTQ0LCBmYWxzZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJiYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5oMjY0IiwKLSAgICAgICAgICJiYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5pbmZvIiwgMTc2LCAxNDQsIGZhbHNlfSwKLSAgICAgICAge01FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsICJiYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaGV2YyIsCi0gICAgICAgICAiYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmluZm8iLCAxNzYsIDE0NCwgZmFsc2V9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfVklERU9fQVYxLCAiYmJiX2F2MV8xNzZfMTQ0LmF2MSIsICJiYmJfYXYxXzE3Nl8xNDQuaW5mbyIsIDE3NiwgMTQ0LCBmYWxzZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmgyNjMiLAorICAgICAgICB7T1BVU18xLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCAiYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5vcHVzIiwKKyAgICAgICAgICJiYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLCA0ODAwMCwgMiwgdHJ1ZX0sCisgICAgICAgIHtWT1JCSVNfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLCAiYmJiX3ZvcmJpc18xY2hfNjRrYnBzXzE2a0h6LnZvcmJpcyIsCisgICAgICAgICAiYmJiX3ZvcmJpc18xY2hfNjRrYnBzXzE2a0h6LmluZm8iLCAxNjAwMCwgMSwgdHJ1ZX0sCisKKyAgICAgICAge0FWMV8xLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEsICJiYmJfYXYxXzE3Nl8xNDQuYXYxIiwgImJiYl9hdjFfMTc2XzE0NC5pbmZvIiwgMTc2LCAxNDQsCisgICAgICAgICBmYWxzZX0sCisgICAgICAgIHtBVkNfMSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiYmJiX2F2Y18zNTJ4Mjg4Xzc2OGticHNfMzBmcHMuYXZjIiwKKyAgICAgICAgICJiYmJfYXZjXzM1MngyODhfNzY4a2Jwc18zMGZwcy5pbmZvIiwgMzUyLCAyODgsIGZhbHNlfSwKKyAgICAgICAge0gyNjNfMSwgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgImJiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5oMjYzIiwKICAgICAgICAgICJiYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaW5mbyIsIDM1MiwgMjg4LCBmYWxzZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgImJiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMubTR2IiwKKyAgICAgICAge0hFVkNfMSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywgImJiYl9oZXZjXzM0MHgyODBfNzY4a2Jwc18zMGZwcy5oZXZjIiwKKyAgICAgICAgICJiYmJfaGV2Y18zNDB4MjgwXzc2OGticHNfMzBmcHMuaW5mbyIsIDM0MCwgMjgwLCBmYWxzZX0sCisgICAgICAgIHtNUEVHNF8xLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgImJiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMubTR2IiwKICAgICAgICAgICJiYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLmluZm8iLCAzNTIsIDI4OCwgZmFsc2V9LAorICAgICAgICB7VlA4XzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCwgImJiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLnZwOCIsCisgICAgICAgICAiYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMuaW5mbyIsIDE3NiwgMTQ0LCBmYWxzZX0sCisgICAgICAgIHtWUDlfMSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5LCAiYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMudnA5IiwKKyAgICAgICAgICJiYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy5pbmZvIiwgMTc2LCAxNDQsIGZhbHNlfSwKKworICAgICAgICB7SEVJQ18xLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMsICJiYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaGV2YyIsCisgICAgICAgICAiYmJiX2hlaWNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmluZm8iLCAxNzYsIDE0NCwgZmFsc2V9LAogfTsKIAotY2xhc3MgV3JpdGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08cGFpcjxzdHJpbmcsIGludDMyX3Q+PiB7CitjbGFzcyBXcml0ZXJUZXN0IHsKICAgcHVibGljOgotICAgIFdyaXRlclRlc3QoKSA6IG1Xcml0ZXIobnVsbHB0ciksIG1GaWxlTWV0YShudWxscHRyKSwgbUN1cnJlbnRUcmFjayhudWxscHRyKSB7fQorICAgIFdyaXRlclRlc3QoKSA6IG1Xcml0ZXIobnVsbHB0ciksIG1GaWxlTWV0YShudWxscHRyKSB7fQogCiAgICAgfldyaXRlclRlc3QoKSB7Ci0gICAgICAgIGlmIChtV3JpdGVyKSB7Ci0gICAgICAgICAgICBtV3JpdGVyLmNsZWFyKCk7Ci0gICAgICAgICAgICBtV3JpdGVyID0gbnVsbHB0cjsKLSAgICAgICAgfQogICAgICAgICBpZiAobUZpbGVNZXRhKSB7CiAgICAgICAgICAgICBtRmlsZU1ldGEuY2xlYXIoKTsKICAgICAgICAgICAgIG1GaWxlTWV0YSA9IG51bGxwdHI7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1DdXJyZW50VHJhY2spIHsKLSAgICAgICAgICAgIG1DdXJyZW50VHJhY2suY2xlYXIoKTsKLSAgICAgICAgICAgIG1DdXJyZW50VHJhY2sgPSBudWxscHRyOworICAgICAgICBpZiAobVdyaXRlcikgeworICAgICAgICAgICAgbVdyaXRlci5jbGVhcigpOworICAgICAgICAgICAgbVdyaXRlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdFbnYtPmNsZWFuVXAoKSkgcmVtb3ZlKE9VVFBVVF9GSUxFX05BTUUpOworCisgICAgICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBrTWF4VHJhY2tDb3VudDsgaWR4KyspIHsKKyAgICAgICAgICAgIG1CdWZmZXJJbmZvW2lkeF0uY2xlYXIoKTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFRyYWNrW2lkeF0pIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrW2lkeF0tPnN0b3AoKTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrW2lkeF0uY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrW2lkeF0gPSBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1JbnB1dFN0cmVhbVtpZHhdLmlzX29wZW4oKSkgbUlucHV0U3RyZWFtW2lkeF0uY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICAgICAgbU51bUNzZHMgPSAwOwotICAgICAgICBtSW5wdXRGcmFtZUlkID0gMDsKKyAgICB2b2lkIHNldHVwV3JpdGVyVHlwZShzdHJpbmcgd3JpdGVyRm9ybWF0KSB7CiAgICAgICAgIG1Xcml0ZXJOYW1lID0gdW5rbm93bl9jb21wOwogICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKLQogICAgICAgICBzdGF0aWMgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0YW5kYXJkV3JpdGVycz4gbWFwV3JpdGVyID0gewogICAgICAgICAgICAgICAgIHsib2dnIiwgT0dHfSwgICAgIHsiYWFjIiwgQUFDfSwgICAgICB7ImFhY19hZHRzIiwgQUFDX0FEVFN9LCB7IndlYm0iLCBXRUJNfSwKICAgICAgICAgICAgICAgICB7Im1wZWc0IiwgTVBFRzR9LCB7ImFtcm5iIiwgQU1SX05CfSwgeyJhbXJ3YiIsIEFNUl9XQn0sICAgICAgeyJtcGVnMlRzIiwgTVBFRzJUU319OwogICAgICAgICAvLyBGaW5kIHRoZSBjb21wb25lbnQgdHlwZQotICAgICAgICBzdHJpbmcgd3JpdGVyRm9ybWF0ID0gR2V0UGFyYW0oKS5maXJzdDsKICAgICAgICAgaWYgKG1hcFdyaXRlci5maW5kKHdyaXRlckZvcm1hdCkgIT0gbWFwV3JpdGVyLmVuZCgpKSB7CiAgICAgICAgICAgICBtV3JpdGVyTmFtZSA9IG1hcFdyaXRlci5hdCh3cml0ZXJGb3JtYXQpOwogICAgICAgICB9CkBAIC0xMjYsMTYgKzE2MCwxOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgICAgICBtQnVmZmVySW5mby5jbGVhcigpOwotICAgICAgICBpZiAobUlucHV0U3RyZWFtLmlzX29wZW4oKSkgbUlucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBnZXRJbnB1dEJ1ZmZlckluZm8oc3RyaW5nIGlucHV0RmlsZU5hbWUsIHN0cmluZyBpbnB1dEluZm8pOworICAgIHZvaWQgZ2V0SW5wdXRCdWZmZXJJbmZvKHN0cmluZyBpbnB1dEZpbGVOYW1lLCBzdHJpbmcgaW5wdXRJbmZvLCBpbnQzMl90IGlkeCA9IDApOwogCiAgICAgaW50MzJfdCBjcmVhdGVXcml0ZXIoaW50MzJfdCBmZCk7CiAKLSAgICBpbnQzMl90IGFkZFdyaXRlclNvdXJjZShib29sIGlzQXVkaW8sIGNvbmZpZ0Zvcm1hdCBwYXJhbXMpOworICAgIGludDMyX3QgYWRkV3JpdGVyU291cmNlKGJvb2wgaXNBdWRpbywgY29uZmlnRm9ybWF0IHBhcmFtcywgaW50MzJfdCBpZHggPSAwKTsKKworICAgIHZvaWQgc2V0dXBFeHRyYWN0b3IoQU1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IsIHN0cmluZyBpbnB1dEZpbGVOYW1lLCBpbnQzMl90ICZ0cmFja0NvdW50KTsKKworICAgIHZvaWQgZXh0cmFjdChBTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciwgY29uZmlnRm9ybWF0ICZwYXJhbXMsIHZlY3RvcjxCdWZmZXJJbmZvPiAmYnVmZmVySW5mbywKKyAgICAgICAgICAgICAgICAgdWludDhfdCAqYnVmZmVyLCBzaXplX3QgYnVmU2l6ZSwgc2l6ZV90ICpieXRlc0V4dHJhY3RlZCwgaW50MzJfdCBpZHgpOworCisgICAgdm9pZCBjb21wYXJlUGFyYW1zKGNvbmZpZ0Zvcm1hdCBzcmNQYXJhbSwgY29uZmlnRm9ybWF0IGRzdFBhcmFtLCB2ZWN0b3I8QnVmZmVySW5mbz4gZHN0QnVmSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleCk7CiAKICAgICBlbnVtIHN0YW5kYXJkV3JpdGVycyB7CiAgICAgICAgIE9HRywKQEAgLTE1MiwzMiArMTg5LDQyIEBACiAgICAgc3RhbmRhcmRXcml0ZXJzIG1Xcml0ZXJOYW1lOwogICAgIHNwPE1lZGlhV3JpdGVyPiBtV3JpdGVyOwogICAgIHNwPE1ldGFEYXRhPiBtRmlsZU1ldGE7Ci0gICAgc3A8TWVkaWFBZGFwdGVyPiBtQ3VycmVudFRyYWNrOworICAgIHNwPE1lZGlhQWRhcHRlcj4gbUN1cnJlbnRUcmFja1trTWF4VHJhY2tDb3VudF17fTsKIAogICAgIGJvb2wgbURpc2FibGVUZXN0OwotICAgIGludDMyX3QgbU51bUNzZHM7Ci0gICAgaW50MzJfdCBtSW5wdXRGcmFtZUlkOwotICAgIGlmc3RyZWFtIG1JbnB1dFN0cmVhbTsKLSAgICB2ZWN0b3I8QnVmZmVySW5mbz4gbUJ1ZmZlckluZm87CisgICAgaW50MzJfdCBtTnVtQ3Nkc1trTWF4VHJhY2tDb3VudF17fTsKKyAgICBpbnQzMl90IG1JbnB1dEZyYW1lSWRba01heFRyYWNrQ291bnRde307CisgICAgaWZzdHJlYW0gbUlucHV0U3RyZWFtW2tNYXhUcmFja0NvdW50XXt9OworICAgIHZlY3RvcjxCdWZmZXJJbmZvPiBtQnVmZmVySW5mb1trTWF4VHJhY2tDb3VudF07CiB9OwogCi12b2lkIFdyaXRlclRlc3Q6OmdldElucHV0QnVmZmVySW5mbyhzdHJpbmcgaW5wdXRGaWxlTmFtZSwgc3RyaW5nIGlucHV0SW5mbykgeworY2xhc3MgV3JpdGVGdW5jdGlvbmFsaXR5VGVzdAorICAgIDogcHVibGljIFdyaXRlclRlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPHN0cmluZyAvKiB3cml0ZXJGb3JtYXQqLywgaW5wdXRJZCAvKiBpbnB1dElkMCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dElkIC8qIGlucHV0SWQxKi8sIGZsb2F0IC8qIEJ1ZmZlckludGVydmFsKi8+PiB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IHNldHVwV3JpdGVyVHlwZShnZXQ8MD4oR2V0UGFyYW0oKSkpOyB9Cit9OworCit2b2lkIFdyaXRlclRlc3Q6OmdldElucHV0QnVmZmVySW5mbyhzdHJpbmcgaW5wdXRGaWxlTmFtZSwgc3RyaW5nIGlucHV0SW5mbywgaW50MzJfdCBpZHgpIHsKICAgICBzdGQ6Omlmc3RyZWFtIGVsZUluZm87CiAgICAgZWxlSW5mby5vcGVuKGlucHV0SW5mby5jX3N0cigpKTsKICAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpOwogICAgIGludDMyX3QgYnl0ZXNDb3VudCA9IDA7CiAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwogICAgIGludDY0X3QgdGltZXN0YW1wID0gMDsKKyAgICBpbnQzMl90IG51bUNzZHMgPSAwOwogICAgIHdoaWxlICgxKSB7CiAgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOwogICAgICAgICBlbGVJbmZvID4+IGZsYWdzOwogICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKLSAgICAgICAgbUJ1ZmZlckluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7Ci0gICAgICAgIGlmIChmbGFncyA9PSBDT0RFQ19DT05GSUdfRkxBRykgbU51bUNzZHMrKzsKKyAgICAgICAgbUJ1ZmZlckluZm9baWR4XS5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICAgICAgaWYgKGZsYWdzID09IENPREVDX0NPTkZJR19GTEFHKSBudW1Dc2RzKys7CiAgICAgfQogICAgIGVsZUluZm8uY2xvc2UoKTsKLSAgICBtSW5wdXRTdHJlYW0ub3BlbihpbnB1dEZpbGVOYW1lLmNfc3RyKCksIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7Ci0gICAgQVNTRVJUX0VRKG1JbnB1dFN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIG1OdW1Dc2RzW2lkeF0gPSBudW1Dc2RzOworICAgIG1JbnB1dFN0cmVhbVtpZHhdLm9wZW4oaW5wdXRGaWxlTmFtZS5jX3N0cigpLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShtSW5wdXRTdHJlYW1baWR4XS5pc19vcGVuKCksIHRydWUpOwogfQogCiBpbnQzMl90IFdyaXRlclRlc3Q6OmNyZWF0ZVdyaXRlcihpbnQzMl90IGZkKSB7CkBAIC0yMjMsMTAgKzI3MCwxMCBAQAogICAgIHJldHVybiAwOwogfQogCi1pbnQzMl90IFdyaXRlclRlc3Q6OmFkZFdyaXRlclNvdXJjZShib29sIGlzQXVkaW8sIGNvbmZpZ0Zvcm1hdCBwYXJhbXMpIHsKLSAgICBpZiAobUlucHV0RnJhbWVJZCkgcmV0dXJuIC0xOworaW50MzJfdCBXcml0ZXJUZXN0OjphZGRXcml0ZXJTb3VyY2UoYm9vbCBpc0F1ZGlvLCBjb25maWdGb3JtYXQgcGFyYW1zLCBpbnQzMl90IGlkeCkgeworICAgIGlmIChtSW5wdXRGcmFtZUlkW2lkeF0pIHJldHVybiAtMTsKICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlOwotICAgIGlmIChtSW5wdXRTdHJlYW0uaXNfb3BlbigpKSB7CisgICAgaWYgKG1JbnB1dFN0cmVhbVtpZHhdLmlzX29wZW4oKSkgewogICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIHBhcmFtcy5taW1lKTsKICAgICAgICAgaWYgKGlzQXVkaW8pIHsKICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMuY2hhbm5lbENvdW50KTsKQEAgLTIzNSwyNSArMjgyLDM0IEBACiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJ3aWR0aCIsIHBhcmFtcy53aWR0aCk7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJoZWlnaHQiLCBwYXJhbXMuaGVpZ2h0KTsKICAgICAgICAgfQotCi0gICAgICAgIGludDMyX3Qgc3RhdHVzID0KLSAgICAgICAgICAgICAgICB3cml0ZUhlYWRlckJ1ZmZlcnMobUlucHV0U3RyZWFtLCBtQnVmZmVySW5mbywgbUlucHV0RnJhbWVJZCwgZm9ybWF0LCBtTnVtQ3Nkcyk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gMCkgcmV0dXJuIC0xOworICAgICAgICBpZiAobU51bUNzZHNbaWR4XSkgeworICAgICAgICAgICAgaW50MzJfdCBzdGF0dXMgPSB3cml0ZUhlYWRlckJ1ZmZlcnMobUlucHV0U3RyZWFtW2lkeF0sIG1CdWZmZXJJbmZvW2lkeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGcmFtZUlkW2lkeF0sIGZvcm1hdCwgbU51bUNzZHNbaWR4XSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IDApIHJldHVybiAtMTsKKyAgICAgICAgfQogICAgIH0KKwogICAgIHNwPE1ldGFEYXRhPiB0cmFja01ldGEgPSBuZXcgTWV0YURhdGE7CiAgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKGZvcm1hdCwgdHJhY2tNZXRhKTsKLSAgICBtQ3VycmVudFRyYWNrID0gbmV3IE1lZGlhQWRhcHRlcih0cmFja01ldGEpOwotICAgIGlmIChtQ3VycmVudFRyYWNrID09IG51bGxwdHIpIHsKKyAgICBtQ3VycmVudFRyYWNrW2lkeF0gPSBuZXcgTWVkaWFBZGFwdGVyKHRyYWNrTWV0YSk7CisgICAgaWYgKG1DdXJyZW50VHJhY2tbaWR4XSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJNZWRpYUFkYXB0ZXIgcmV0dXJuZWQgbnVsbHB0ciIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIHN0YXR1c190IHJlc3VsdCA9IG1Xcml0ZXItPmFkZFNvdXJjZShtQ3VycmVudFRyYWNrKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtV3JpdGVyLT5hZGRTb3VyY2UobUN1cnJlbnRUcmFja1tpZHhdKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCiB2b2lkIGdldEZpbGVEZXRhaWxzKHN0cmluZyAmaW5wdXRGaWxlUGF0aCwgc3RyaW5nICZpbmZvLCBjb25maWdGb3JtYXQgJnBhcmFtcywgYm9vbCAmaXNBdWRpbywKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJlYW1JbmRleCA9IDApIHsKLSAgICBpZiAoc3RyZWFtSW5kZXggPj0gc2l6ZW9mKGtJbnB1dERhdGEpIC8gc2l6ZW9mKGtJbnB1dERhdGFbMF0pKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0SWQgaW5wSWQpIHsKKyAgICBpbnQzMl90IGlucHV0RGF0YVNpemUgPSBzaXplb2Yoa0lucHV0RGF0YSkgLyBzaXplb2Yoa0lucHV0RGF0YVswXSk7CisgICAgaW50MzJfdCBzdHJlYW1JbmRleCA9IDA7CisgICAgZm9yICg7IHN0cmVhbUluZGV4IDwgaW5wdXREYXRhU2l6ZTsgc3RyZWFtSW5kZXgrKykgeworICAgICAgICBpZiAoaW5wSWQgPT0ga0lucHV0RGF0YVtzdHJlYW1JbmRleF0uaW5wSWQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdHJlYW1JbmRleCA9PSBpbnB1dERhdGFTaXplKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgaW5wdXRGaWxlUGF0aCArPSBrSW5wdXREYXRhW3N0cmVhbUluZGV4XS5pbnB1dEZpbGU7CkBAIC0yNzAsNyArMzI2LDE0NyBAQAogICAgIHJldHVybjsKIH0KIAotVEVTVF9QKFdyaXRlclRlc3QsIENyZWF0ZVdyaXRlclRlc3QpIHsKK3ZvaWQgV3JpdGVyVGVzdDo6c2V0dXBFeHRyYWN0b3IoQU1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IsIHN0cmluZyBpbnB1dEZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICZ0cmFja0NvdW50KSB7CisgICAgQUxPR1YoIklucHV0IGZpbGUgZm9yIGV4dHJhY3RvcjogJXMiLCBpbnB1dEZpbGVOYW1lLmNfc3RyKCkpOworCisgICAgaW50MzJfdCBmZCA9IG9wZW4oaW5wdXRGaWxlTmFtZS5jX3N0cigpLCBPX1JET05MWSk7CisgICAgQVNTRVJUX0dFKGZkLCAwKSA8PCAiRmFpbGVkIHRvIG9wZW4gd3JpdGVyJ3Mgb3V0cHV0IGZpbGUgdG8gdmFsaWRhdGUiOworCisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIGludDMyX3Qgc3RhdHVzID0gZnN0YXQoZmQsICZidWYpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IHByb3BlcnRpZXMgb2YgaW5wdXQgZmlsZSBmb3IgZXh0cmFjdG9yIjsKKworICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgIEFMT0dWKCJTaXplIG9mIGlucHV0IGZpbGUgdG8gZXh0cmFjdG9yOiAlenUiLCBmaWxlU2l6ZSk7CisKKyAgICBzdGF0dXMgPSBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkKGV4dHJhY3RvciwgZmQsIDAsIGZpbGVTaXplKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBBTUVESUFfT0spIDw8ICJGYWlsZWQgdG8gc2V0IGRhdGEgc291cmNlIGZvciBleHRyYWN0b3IiOworCisgICAgdHJhY2tDb3VudCA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0NvdW50KGV4dHJhY3Rvcik7CisgICAgQVNTRVJUX0dUKHRyYWNrQ291bnQsIDApIDw8ICJObyB0cmFja3MgcmVwb3J0ZWQgYnkgZXh0cmFjdG9yIjsKKyAgICBBTE9HVigiTnVtYmVyIG9mIHRyYWNrcyByZXBvcnRlZCBieSBleHRyYWN0b3IgOiAlZCIsIHRyYWNrQ291bnQpOworICAgIHJldHVybjsKK30KKwordm9pZCBXcml0ZXJUZXN0OjpleHRyYWN0KEFNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yLCBjb25maWdGb3JtYXQgJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8QnVmZmVySW5mbz4gJmJ1ZmZlckluZm8sIHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IGJ1ZlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpieXRlc0V4dHJhY3RlZCwgaW50MzJfdCBpZHgpIHsKKyAgICBBTWVkaWFFeHRyYWN0b3Jfc2VsZWN0VHJhY2soZXh0cmFjdG9yLCBpZHgpOworICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0ID0gQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrRm9ybWF0KGV4dHJhY3RvciwgaWR4KTsKKyAgICBBU1NFUlRfTkUoZm9ybWF0LCBudWxscHRyKSA8PCAiVHJhY2sgZm9ybWF0IGlzIE5VTEwiOworICAgIEFMT0dJKCJUcmFjayBmb3JtYXQgPSAlcyIsIEFNZWRpYUZvcm1hdF90b1N0cmluZyhmb3JtYXQpKTsKKworICAgIGNvbnN0IGNoYXIgKm1pbWUgPSBudWxscHRyOworICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKKyAgICBBU1NFUlRfTkUobWltZSwgbnVsbHB0cikgPDwgIlRyYWNrIG1pbWUgaXMgTlVMTCI7CisgICAgQUxPR0koIlRyYWNrIG1pbWUgPSAlcyIsIG1pbWUpOworICAgIHN0cmxjcHkocGFyYW1zLm1pbWUsIG1pbWUsIGtNaW1lU2l6ZSk7CisKKyAgICBpZiAoIXN0cm5jbXAobWltZSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKAorICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgJnBhcmFtcy5jaGFubmVsQ291bnQpKQorICAgICAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgZGlkIG5vdCByZXBvcnQgY2hhbm5lbCBjb3VudCI7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZwYXJhbXMuc2FtcGxlUmF0ZSkpCisgICAgICAgICAgICAgICAgPDwgIkV4dHJhY3RvciBkaWQgbm90IHJlcG9ydCBzYW1wbGUgcmF0ZSI7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChtaW1lLCAidmlkZW8vIiwgNikgfHwgIXN0cm5jbXAobWltZSwgImltYWdlLyIsIDYpKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsICZwYXJhbXMud2lkdGgpKQorICAgICAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgZGlkIG5vdCByZXBvcnQgd2lkdGgiOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgJnBhcmFtcy5oZWlnaHQpKQorICAgICAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgZGlkIG5vdCByZXBvcnQgaGVpZ2h0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIkludmFsaWQgbWltZSAiIDw8IG1pbWU7CisgICAgfQorCisgICAgaW50MzJfdCBidWZmZXJPZmZzZXQgPSAwOworICAgIC8vIEdldCBDU0QgZGF0YQorICAgIGludCBpbmRleCA9IDA7CisgICAgdm9pZCAqY3NkQnVmOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGNzZEJ1ZiA9IG51bGxwdHI7CisgICAgICAgIGNoYXIgY3NkTmFtZVsxNl07CisgICAgICAgIHNucHJpbnRmKGNzZE5hbWUsIDE2LCAiY3NkLSVkIiwgaW5kZXgpOworICAgICAgICBzaXplX3QgY3NkU2l6ZSA9IDA7CisgICAgICAgIGJvb2wgY3NkRm91bmQgPSBBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKGZvcm1hdCwgY3NkTmFtZSwgJmNzZEJ1ZiwgJmNzZFNpemUpOworICAgICAgICBpZiAoIWNzZEZvdW5kIHx8ICFjc2RCdWYgfHwgIWNzZFNpemUpIGJyZWFrOworCisgICAgICAgIGJ1ZmZlckluZm8ucHVzaF9iYWNrKHtzdGF0aWNfY2FzdDxpbnQzMl90Pihjc2RTaXplKSwgQ09ERUNfQ09ORklHX0ZMQUcsIDB9KTsKKyAgICAgICAgbWVtY3B5KGJ1ZmZlciArIGJ1ZmZlck9mZnNldCwgY3NkQnVmLCBjc2RTaXplKTsKKyAgICAgICAgYnVmZmVyT2Zmc2V0ICs9IGNzZFNpemU7CisgICAgICAgIGluZGV4Kys7CisgICAgfQorCisgICAgLy8gR2V0IGZyYW1lIGRhdGEKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBzc2l6ZV90IHNhbXBsZVNpemUgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlU2l6ZShleHRyYWN0b3IpOworICAgICAgICBpZiAoc2FtcGxlU2l6ZSA8IDApIGJyZWFrOworCisgICAgICAgIHVpbnQ4X3QgKnNhbXBsZUJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKHNhbXBsZVNpemUpOworICAgICAgICBBU1NFUlRfTkUoc2FtcGxlQnVmZmVyLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIHRoZSBidWZmZXIgb2Ygc2l6ZSAiIDw8IHNhbXBsZVNpemU7CisKKyAgICAgICAgaW50IGJ5dGVzUmVhZCA9IEFNZWRpYUV4dHJhY3Rvcl9yZWFkU2FtcGxlRGF0YShleHRyYWN0b3IsIHNhbXBsZUJ1ZmZlciwgc2FtcGxlU2l6ZSk7CisgICAgICAgIEFTU0VSVF9FUShieXRlc1JlYWQsIHNhbXBsZVNpemUpCisgICAgICAgICAgICAgICAgPDwgIk51bWJlciBvZiBieXRlcyBleHRyYWN0ZWQgZG9lcyBub3QgbWF0Y2ggd2l0aCBzYW1wbGUgc2l6ZSI7CisgICAgICAgIGludDY0X3QgcHRzID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRpbWUoZXh0cmFjdG9yKTsKKyAgICAgICAgdWludDMyX3QgZmxhZyA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVGbGFncyhleHRyYWN0b3IpOworCisgICAgICAgIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykgeworICAgICAgICAgICAgLy8gUmVtb3ZpbmcgNCBieXRlcyBvZiBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMgZnJvbSBzYW1wbGUgc2l6ZQorICAgICAgICAgICAgYnl0ZXNSZWFkID0gYnl0ZXNSZWFkIC0gNDsKKyAgICAgICAgfQorCisgICAgICAgIEFTU0VSVF9MRShidWZmZXJPZmZzZXQgKyBieXRlc1JlYWQsIGJ1ZlNpemUpCisgICAgICAgICAgICAgICAgPDwgIlNpemUgb2YgdGhlIGJ1ZmZlciBpcyBpbnN1ZmZpY2llbnQgdG8gc3RvcmUgdGhlIGV4dHJhY3RlZCBkYXRhIjsKKyAgICAgICAgYnVmZmVySW5mby5wdXNoX2JhY2soe2J5dGVzUmVhZCwgZmxhZywgcHRzfSk7CisgICAgICAgIG1lbWNweShidWZmZXIgKyBidWZmZXJPZmZzZXQsIHNhbXBsZUJ1ZmZlciwgYnl0ZXNSZWFkKTsKKyAgICAgICAgYnVmZmVyT2Zmc2V0ICs9IGJ5dGVzUmVhZDsKKworICAgICAgICBBTWVkaWFFeHRyYWN0b3JfYWR2YW5jZShleHRyYWN0b3IpOworICAgICAgICBmcmVlKHNhbXBsZUJ1ZmZlcik7CisgICAgfQorICAgICpieXRlc0V4dHJhY3RlZCA9IGJ1ZmZlck9mZnNldDsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgV3JpdGVyVGVzdDo6Y29tcGFyZVBhcmFtcyhjb25maWdGb3JtYXQgc3JjUGFyYW0sIGNvbmZpZ0Zvcm1hdCBkc3RQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8QnVmZmVySW5mbz4gZHN0QnVmSW5mbywgaW50MzJfdCBpbmRleCkgeworICAgIEFTU0VSVF9TVFJFUShzcmNQYXJhbS5taW1lLCBkc3RQYXJhbS5taW1lKQorICAgICAgICAgICAgPDwgIkV4dHJhY3RlZCBtaW1lIHR5cGUgZG9lcyBub3QgbWF0Y2ggd2l0aCBpbnB1dCBtaW1lIHR5cGUiOworCisgICAgaWYgKCFzdHJuY21wKHNyY1BhcmFtLm1pbWUsICJhdWRpby8iLCA2KSkgeworICAgICAgICBBU1NFUlRfRVEoc3JjUGFyYW0uY2hhbm5lbENvdW50LCBkc3RQYXJhbS5jaGFubmVsQ291bnQpCisgICAgICAgICAgICAgICAgPDwgIkV4dHJhY3RlZCBjaGFubmVsIGNvdW50IGRvZXMgbm90IG1hdGNoIHdpdGggaW5wdXQgY2hhbm5lbCBjb3VudCI7CisgICAgICAgIEFTU0VSVF9FUShzcmNQYXJhbS5zYW1wbGVSYXRlLCBkc3RQYXJhbS5zYW1wbGVSYXRlKQorICAgICAgICAgICAgICAgIDw8ICJFeHRyYWN0ZWQgc2FtcGxlIHJhdGUgZG9lcyBub3QgbWF0Y2ggd2l0aCBpbnB1dCBzYW1wbGUgcmF0ZSI7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChzcmNQYXJhbS5taW1lLCAidmlkZW8vIiwgNikgfHwgIXN0cm5jbXAoc3JjUGFyYW0ubWltZSwgImltYWdlLyIsIDYpKSB7CisgICAgICAgIEFTU0VSVF9FUShzcmNQYXJhbS53aWR0aCwgZHN0UGFyYW0ud2lkdGgpCisgICAgICAgICAgICAgICAgPDwgIkV4dHJhY3RlZCB3aWR0aCBkb2VzIG5vdCBtYXRjaCB3aXRoIGlucHV0IHdpZHRoIjsKKyAgICAgICAgQVNTRVJUX0VRKHNyY1BhcmFtLmhlaWdodCwgZHN0UGFyYW0uaGVpZ2h0KQorICAgICAgICAgICAgICAgIDw8ICJFeHRyYWN0ZWQgaGVpZ2h0IGRvZXMgbm90IG1hdGNoIHdpdGggaW5wdXQgaGVpZ2h0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIkludmFsaWQgbWltZSB0eXBlIiA8PCBzcmNQYXJhbS5taW1lOworICAgIH0KKworICAgIGludDMyX3QgdG9sZXJhbmNlVmFsdWVVcyA9IGtNdXhUb2xlcmFuY2VUaW1lVXM7CisgICAgaWYgKG1Xcml0ZXJOYW1lID09IE1QRUc0KSB7CisgICAgICAgIHRvbGVyYW5jZVZhbHVlVXMgPSBrTXBlZzRNdXhUb2xlcmFuY2VUaW1lVXM7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGRzdEJ1ZkluZm8uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQVNTRVJUX0VRKG1CdWZmZXJJbmZvW2luZGV4XVtpXS5zaXplLCBkc3RCdWZJbmZvW2ldLnNpemUpCisgICAgICAgICAgICAgICAgPDwgIklucHV0IHNpemUgIiA8PCBtQnVmZmVySW5mb1tpbmRleF1baV0uc2l6ZSA8PCAiIG1pc21hdGNoZWQgd2l0aCBleHRyYWN0ZWQgc2l6ZSAiCisgICAgICAgICAgICAgICAgPDwgZHN0QnVmSW5mb1tpXS5zaXplOworICAgICAgICBBU1NFUlRfRVEobUJ1ZmZlckluZm9baW5kZXhdW2ldLmZsYWdzLCBkc3RCdWZJbmZvW2ldLmZsYWdzKQorICAgICAgICAgICAgICAgIDw8ICJJbnB1dCBmbGFnICIgPDwgbUJ1ZmZlckluZm9baW5kZXhdW2ldLmZsYWdzCisgICAgICAgICAgICAgICAgPDwgIiBtaXNtYXRjaGVkIHdpdGggZXh0cmFjdGVkIHNpemUgIiA8PCBkc3RCdWZJbmZvW2ldLmZsYWdzOworICAgICAgICBBU1NFUlRfTEUoYWJzKG1CdWZmZXJJbmZvW2luZGV4XVtpXS50aW1lVXMgLSBkc3RCdWZJbmZvW2ldLnRpbWVVcyksIHRvbGVyYW5jZVZhbHVlVXMpCisgICAgICAgICAgICAgICAgPDwgIkRpZmZlcmVuY2UgYmV0d2VlbiBvcmlnaW5hbCB0aW1lc3RhbXAgIiA8PCBtQnVmZmVySW5mb1tpbmRleF1baV0udGltZVVzCisgICAgICAgICAgICAgICAgPDwgIiBhbmQgZXh0cmFjdGVkIHRpbWVzdGFtcCAiIDw8IGRzdEJ1ZkluZm9baV0udGltZVVzCisgICAgICAgICAgICAgICAgPDwgImlzIGdyZWF0ZXIgdGhhbiB0b2xlcmFuY2UgdmFsdWUgPSAiIDw8IHRvbGVyYW5jZVZhbHVlVXMgPDwgIiBtaWNybyBzZWNvbmRzIjsKKyAgICB9CisgICAgcmV0dXJuOworfQorCitURVNUX1AoV3JpdGVGdW5jdGlvbmFsaXR5VGVzdCwgQ3JlYXRlV3JpdGVyVGVzdCkgewogICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKICAgICBBTE9HVigiVGVzdHMgdGhlIGNyZWF0aW9uIG9mIHdyaXRlcnMiKTsKIApAQCAtMjgxLDE0ICs0NzcsMTQgQEAKIAogICAgIC8vIENyZWF0aW5nIHdyaXRlciB3aXRoaW4gYSB0ZXN0IHNjb3BlLiBEZXN0cnVjdG9yIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgdGVzdCBlbmRzCiAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgY3JlYXRlV3JpdGVyKGZkKSkKLSAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gY3JlYXRlIHdyaXRlciBmb3Igb3V0cHV0IGZvcm1hdDoiIDw8IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGNyZWF0ZSB3cml0ZXIgZm9yIG91dHB1dCBmb3JtYXQ6IiA8PCBnZXQ8MD4oR2V0UGFyYW0oKSk7CiB9CiAKLVRFU1RfUChXcml0ZXJUZXN0LCBXcml0ZXJUZXN0KSB7CitURVNUX1AoV3JpdGVGdW5jdGlvbmFsaXR5VGVzdCwgV3JpdGVyVGVzdCkgewogICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKICAgICBBTE9HVigiQ2hlY2tzIGlmIGZvciBhIGdpdmVuIGlucHV0LCBhIHZhbGlkIG11eGVkIGZpbGUgaGFzIGJlZW4gY3JlYXRlZCBvciBub3QiKTsKIAotICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBHZXRQYXJhbSgpLmZpcnN0OworICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBnZXQ8MD4oR2V0UGFyYW0oKSk7CiAgICAgc3RyaW5nIG91dHB1dEZpbGUgPSBPVVRQVVRfRklMRV9OQU1FOwogICAgIGludDMyX3QgZmQgPQogICAgICAgICAgICAgb3BlbihvdXRwdXRGaWxlLmNfc3RyKCksIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNSKTsKQEAgLTI5NywzNSArNDkzLDExMCBAQAogICAgIGludDMyX3Qgc3RhdHVzID0gY3JlYXRlV3JpdGVyKGZkKTsKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIHdyaXRlciBmb3Igb3V0cHV0IGZvcm1hdDoiIDw8IHdyaXRlckZvcm1hdDsKIAotICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKTsKLSAgICBzdHJpbmcgaW5wdXRJbmZvID0gZ0Vudi0+Z2V0UmVzKCk7Ci0gICAgY29uZmlnRm9ybWF0IHBhcmFtOwotICAgIGJvb2wgaXNBdWRpbzsKLSAgICBpbnQzMl90IGlucHV0RmlsZUlkeCA9IEdldFBhcmFtKCkuc2Vjb25kOwotICAgIGdldEZpbGVEZXRhaWxzKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBwYXJhbSwgaXNBdWRpbywgaW5wdXRGaWxlSWR4KTsKLSAgICBBU1NFUlRfTkUoaW5wdXRGaWxlLmNvbXBhcmUoZ0Vudi0+Z2V0UmVzKCkpLCAwKSA8PCAiTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiOworICAgIGlucHV0SWQgaW5wSWRbXSA9IHtnZXQ8MT4oR2V0UGFyYW0oKSksIGdldDwyPihHZXRQYXJhbSgpKX07CisgICAgQVNTRVJUX05FKGlucElkWzBdLCBVTlVTRURfSUQpIDw8ICJUZXN0IGV4cGVjdHMgZmlyc3QgaW5wdXRJZCB0byBiZSBhIHZhbGlkIGlkIjsKIAotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0QnVmZmVySW5mbyhpbnB1dEZpbGUsIGlucHV0SW5mbykpOwotICAgIHN0YXR1cyA9IGFkZFdyaXRlclNvdXJjZShpc0F1ZGlvLCBwYXJhbSk7Ci0gICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGFkZCBzb3VyY2UgZm9yICIgPDwgd3JpdGVyRm9ybWF0IDw8ICJXcml0ZXIiOworICAgIGludDMyX3QgbnVtVHJhY2tzID0gMTsKKyAgICBpZiAoaW5wSWRbMV0gIT0gVU5VU0VEX0lEKSB7CisgICAgICAgIG51bVRyYWNrcysrOworICAgIH0KKworICAgIHNpemVfdCBmaWxlU2l6ZVtudW1UcmFja3NdOworICAgIGNvbmZpZ0Zvcm1hdCBwYXJhbVtudW1UcmFja3NdOworICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBudW1UcmFja3M7IGlkeCsrKSB7CisgICAgICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKTsKKyAgICAgICAgc3RyaW5nIGlucHV0SW5mbyA9IGdFbnYtPmdldFJlcygpOworICAgICAgICBib29sIGlzQXVkaW87CisgICAgICAgIGdldEZpbGVEZXRhaWxzKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBwYXJhbVtpZHhdLCBpc0F1ZGlvLCBpbnBJZFtpZHhdKTsKKyAgICAgICAgQVNTRVJUX05FKGlucHV0RmlsZS5jb21wYXJlKGdFbnYtPmdldFJlcygpKSwgMCkgPDwgIk5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIjsKKworICAgICAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgICAgIHN0YXR1cyA9IHN0YXQoaW5wdXRGaWxlLmNfc3RyKCksICZidWYpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRmFpbGVkIHRvIGdldCBwcm9wZXJ0aWVzIG9mIGlucHV0IGZpbGU6IiA8PCBpbnB1dEZpbGU7CisgICAgICAgIGZpbGVTaXplW2lkeF0gPSBidWYuc3Rfc2l6ZTsKKworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dEJ1ZmZlckluZm8oaW5wdXRGaWxlLCBpbnB1dEluZm8sIGlkeCkpOworICAgICAgICBzdGF0dXMgPSBhZGRXcml0ZXJTb3VyY2UoaXNBdWRpbywgcGFyYW1baWR4XSwgaWR4KTsKKyAgICAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGFkZCBzb3VyY2UgZm9yICIgPDwgd3JpdGVyRm9ybWF0IDw8ICJXcml0ZXIiOworICAgIH0KIAogICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7CiAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKTsKLSAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbSwgbUJ1ZmZlckluZm8sIG1JbnB1dEZyYW1lSWQsIG1DdXJyZW50VHJhY2ssIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVySW5mby5zaXplKCkpOwotICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIGZhaWxlZCI7Ci0gICAgbUN1cnJlbnRUcmFjay0+c3RvcCgpOworICAgIGZsb2F0IGludGVydmFsID0gZ2V0PDM+KEdldFBhcmFtKCkpOworICAgIEFTU0VSVF9MRShpbnRlcnZhbCwgMS4wZikgPDwgIkJ1ZmZlciBpbnRlcnZhbCBpbnZhbGlkLiBTaG91bGQgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDEuMCI7CiAKKyAgICBzaXplX3QgcmFuZ2UgPSAwOworICAgIGludDMyX3QgbG9vcENvdW50ID0gMDsKKyAgICBpbnQzMl90IG9mZnNldFtrTWF4VHJhY2tDb3VudF17fTsKKyAgICB3aGlsZSAobG9vcENvdW50IDwgY2VpbCgxLjAgLyBpbnRlcnZhbCkpIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IG51bVRyYWNrczsgaWR4KyspIHsKKyAgICAgICAgICAgIHJhbmdlID0gbUJ1ZmZlckluZm9baWR4XS5zaXplKCkgKiBpbnRlcnZhbDsKKyAgICAgICAgICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtW2lkeF0sIG1CdWZmZXJJbmZvW2lkeF0sIG1JbnB1dEZyYW1lSWRbaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1tpZHhdLCBvZmZzZXRbaWR4XSwgcmFuZ2UpOworICAgICAgICAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIgZmFpbGVkIjsKKyAgICAgICAgICAgIG9mZnNldFtpZHhdICs9IHJhbmdlOworICAgICAgICB9CisgICAgICAgIGxvb3BDb3VudCsrOworICAgIH0KKyAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwga01heFRyYWNrQ291bnQ7IGlkeCsrKSB7CisgICAgICAgIGlmIChtQ3VycmVudFRyYWNrW2lkeF0pIHsKKyAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbaWR4XS0+c3RvcCgpOworICAgICAgICB9CisgICAgfQogICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0b3AoKTsKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgd3JpdGVyIjsKICAgICBjbG9zZShmZCk7CisKKyAgICAvLyBWYWxpZGF0ZSB0aGUgb3V0cHV0IG11eGVkIGZpbGUgY3JlYXRlZCBieSB3cml0ZXIKKyAgICAvLyBUT0RPKGIvMTQ2NDIzMDIyKTogU2tpcCB2YWxpZGF0aW5nIG91dHB1dCBmb3Igd2VibSB3cml0ZXIKKyAgICAvLyBUT0RPKGIvMTQ2NDIxMDE4KTogU2tpcCB2YWxpZGF0aW5nIG91dHB1dCBmb3Igb2dnIHdyaXRlcgorICAgIGlmIChtV3JpdGVyTmFtZSAhPSBPR0cgJiYgbVdyaXRlck5hbWUgIT0gV0VCTSkgeworICAgICAgICBjb25maWdGb3JtYXQgZXh0cmFjdG9yUGFyYW1zW251bVRyYWNrc107CisgICAgICAgIHZlY3RvcjxCdWZmZXJJbmZvPiBleHRyYWN0b3JCdWZmZXJJbmZvW251bVRyYWNrc107CisgICAgICAgIGludDMyX3QgdHJhY2tDb3VudCA9IC0xOworCisgICAgICAgIEFNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yID0gQU1lZGlhRXh0cmFjdG9yX25ldygpOworICAgICAgICBBU1NFUlRfTkUoZXh0cmFjdG9yLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBleHRyYWN0b3IiOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzZXR1cEV4dHJhY3RvcihleHRyYWN0b3IsIG91dHB1dEZpbGUsIHRyYWNrQ291bnQpKTsKKyAgICAgICAgQVNTRVJUX0VRKHRyYWNrQ291bnQsIG51bVRyYWNrcykKKyAgICAgICAgICAgICAgICA8PCAiVHJhY2tzIHJlcG9ydGVkIGJ5IGV4dHJhY3RvciBkb2VzIG5vdCBtYXRjaCB3aXRoIGlucHV0IG51bWJlciBvZiB0cmFja3MiOworCisgICAgICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBudW1UcmFja3M7IGlkeCsrKSB7CisgICAgICAgICAgICBjaGFyICppbnB1dEJ1ZmZlciA9IChjaGFyICopbWFsbG9jKGZpbGVTaXplW2lkeF0pOworICAgICAgICAgICAgQVNTRVJUX05FKGlucHV0QnVmZmVyLCBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIHRoZSBidWZmZXIgb2Ygc2l6ZSAiIDw8IGZpbGVTaXplW2lkeF07CisgICAgICAgICAgICBtSW5wdXRTdHJlYW1baWR4XS5zZWVrZygwLCBtSW5wdXRTdHJlYW1baWR4XS5iZWcpOworICAgICAgICAgICAgbUlucHV0U3RyZWFtW2lkeF0ucmVhZChpbnB1dEJ1ZmZlciwgZmlsZVNpemVbaWR4XSk7CisgICAgICAgICAgICBBU1NFUlRfRVEobUlucHV0U3RyZWFtW2lkeF0uZ2NvdW50KCksIGZpbGVTaXplW2lkeF0pOworCisgICAgICAgICAgICB1aW50OF90ICpleHRyYWN0ZWRCdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhmaWxlU2l6ZVtpZHhdKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShleHRyYWN0ZWRCdWZmZXIsIG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgdGhlIGJ1ZmZlciBvZiBzaXplICIgPDwgZmlsZVNpemVbaWR4XTsKKyAgICAgICAgICAgIHNpemVfdCBieXRlc0V4dHJhY3RlZCA9IDA7CisKKyAgICAgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGV4dHJhY3QoZXh0cmFjdG9yLCBleHRyYWN0b3JQYXJhbXNbaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yQnVmZmVySW5mb1tpZHhdLCBleHRyYWN0ZWRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTaXplW2lkeF0sICZieXRlc0V4dHJhY3RlZCwgaWR4KSk7CisgICAgICAgICAgICBBU1NFUlRfR1QoYnl0ZXNFeHRyYWN0ZWQsIDApIDw8ICJUb3RhbCBieXRlcyBleHRyYWN0ZWQgYnkgZXh0cmFjdG9yIGNhbm5vdCBiZSB6ZXJvIjsKKworICAgICAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVQYXJhbXMocGFyYW1baWR4XSwgZXh0cmFjdG9yUGFyYW1zW2lkeF0sIGV4dHJhY3RvckJ1ZmZlckluZm9baWR4XSwgaWR4KSk7CisKKyAgICAgICAgICAgIEFTU0VSVF9FUShtZW1jbXAoZXh0cmFjdGVkQnVmZmVyLCAodWludDhfdCAqKWlucHV0QnVmZmVyLCBieXRlc0V4dHJhY3RlZCksIDApCisgICAgICAgICAgICAgICAgICAgIDw8ICJFeHRyYWN0ZWQgYml0IHN0cmVhbSBkb2VzIG5vdCBtYXRjaCB3aXRoIGlucHV0IGJpdCBzdHJlYW0iOworCisgICAgICAgICAgICBmcmVlKGlucHV0QnVmZmVyKTsKKyAgICAgICAgICAgIGZyZWUoZXh0cmFjdGVkQnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBBTWVkaWFFeHRyYWN0b3JfZGVsZXRlKGV4dHJhY3Rvcik7CisgICAgfQogfQogCi1URVNUX1AoV3JpdGVyVGVzdCwgUGF1c2VXcml0ZXJUZXN0KSB7CitURVNUX1AoV3JpdGVGdW5jdGlvbmFsaXR5VGVzdCwgUGF1c2VXcml0ZXJUZXN0KSB7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOwogICAgIEFMT0dWKCJWYWxpZGF0ZXMgdGhlIHBhdXNlKCkgYXBpIG9mIHdyaXRlcnMiKTsKIAotICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBHZXRQYXJhbSgpLmZpcnN0OworICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBnZXQ8MD4oR2V0UGFyYW0oKSk7CiAgICAgc3RyaW5nIG91dHB1dEZpbGUgPSBPVVRQVVRfRklMRV9OQU1FOwogICAgIGludDMyX3QgZmQgPQogICAgICAgICAgICAgb3BlbihvdXRwdXRGaWxlLmNfc3RyKCksIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNSKTsKQEAgLTMzOCw4ICs2MDksMTAgQEAKICAgICBzdHJpbmcgaW5wdXRJbmZvID0gZ0Vudi0+Z2V0UmVzKCk7CiAgICAgY29uZmlnRm9ybWF0IHBhcmFtOwogICAgIGJvb2wgaXNBdWRpbzsKLSAgICBpbnQzMl90IGlucHV0RmlsZUlkeCA9IEdldFBhcmFtKCkuc2Vjb25kOwotICAgIGdldEZpbGVEZXRhaWxzKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBwYXJhbSwgaXNBdWRpbywgaW5wdXRGaWxlSWR4KTsKKyAgICBpbnB1dElkIGlucElkID0gZ2V0PDE+KEdldFBhcmFtKCkpOworICAgIEFTU0VSVF9ORShpbnBJZCwgVU5VU0VEX0lEKSA8PCAiVGVzdCBleHBlY3RzIGZpcnN0IGlucHV0SWQgdG8gYmUgYSB2YWxpZCBpZCI7CisKKyAgICBnZXRGaWxlRGV0YWlscyhpbnB1dEZpbGUsIGlucHV0SW5mbywgcGFyYW0sIGlzQXVkaW8sIGlucElkKTsKICAgICBBU1NFUlRfTkUoaW5wdXRGaWxlLmNvbXBhcmUoZ0Vudi0+Z2V0UmVzKCkpLCAwKSA8PCAiTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiOwogCiAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRCdWZmZXJJbmZvKGlucHV0RmlsZSwgaW5wdXRJbmZvKSk7CkBAIC0zNDgsOCArNjIxLDggQEAKIAogICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7CiAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKTsKLSAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbSwgbUJ1ZmZlckluZm8sIG1JbnB1dEZyYW1lSWQsIG1DdXJyZW50VHJhY2ssIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVySW5mby5zaXplKCkgLyA0KTsKKyAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbVswXSwgbUJ1ZmZlckluZm9bMF0sIG1JbnB1dEZyYW1lSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrWzBdLCAwLCBtQnVmZmVySW5mb1swXS5zaXplKCkgLyA0KTsKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciBmYWlsZWQiOwogCiAgICAgYm9vbCBpc1BhdXNlZCA9IGZhbHNlOwpAQCAtMzU5LDI2ICs2MzIsMjYgQEAKICAgICAgICAgaXNQYXVzZWQgPSB0cnVlOwogICAgIH0KICAgICAvLyBJbiB0aGUgcGF1c2Ugc3RhdGUsIHdyaXRlcnMgc2hvdWxkbid0IHdyaXRlIGFueXRoaW5nLiBUZXN0aW5nIHRoZSB3cml0ZXJzIGZvciB0aGUgc2FtZQotICAgIGludDMyX3QgbnVtRnJhbWVzUGF1c2VkID0gbUJ1ZmZlckluZm8uc2l6ZSgpIC8gNDsKLSAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbSwgbUJ1ZmZlckluZm8sIG1JbnB1dEZyYW1lSWQsIG1DdXJyZW50VHJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RnJhbWVJZCwgbnVtRnJhbWVzUGF1c2VkLCBpc1BhdXNlZCk7CisgICAgaW50MzJfdCBudW1GcmFtZXNQYXVzZWQgPSBtQnVmZmVySW5mb1swXS5zaXplKCkgLyA0OworICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtWzBdLCBtQnVmZmVySW5mb1swXSwgbUlucHV0RnJhbWVJZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbMF0sIG1JbnB1dEZyYW1lSWRbMF0sIG51bUZyYW1lc1BhdXNlZCwgaXNQYXVzZWQpOwogICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIGZhaWxlZCI7CiAKICAgICBpZiAoaXNQYXVzZWQpIHsKICAgICAgICAgc3RhdHVzID0gbVdyaXRlci0+c3RhcnQobUZpbGVNZXRhLmdldCgpKTsKICAgICAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKTsKICAgICB9Ci0gICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW0sIG1CdWZmZXJJbmZvLCBtSW5wdXRGcmFtZUlkLCBtQ3VycmVudFRyYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEZyYW1lSWQsIG1CdWZmZXJJbmZvLnNpemUoKSk7CisgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW1bMF0sIG1CdWZmZXJJbmZvWzBdLCBtSW5wdXRGcmFtZUlkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1swXSwgbUlucHV0RnJhbWVJZFswXSwgbUJ1ZmZlckluZm9bMF0uc2l6ZSgpKTsKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciBmYWlsZWQiOwotICAgIG1DdXJyZW50VHJhY2stPnN0b3AoKTsKKyAgICBtQ3VycmVudFRyYWNrWzBdLT5zdG9wKCk7CiAKICAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdG9wKCk7CiAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgdGhlIHdyaXRlciI7CiAgICAgY2xvc2UoZmQpOwogfQogCi1URVNUX1AoV3JpdGVyVGVzdCwgTXVsdGlTdGFydFN0b3BQYXVzZVRlc3QpIHsKK1RFU1RfUChXcml0ZUZ1bmN0aW9uYWxpdHlUZXN0LCBNdWx0aVN0YXJ0U3RvcFBhdXNlVGVzdCkgewogICAgIC8vIFRPRE86IChiLzE0NDgyMTgwNCkKICAgICAvLyBFbmFibGUgdGhlIHRlc3QgZm9yIE1QRTJUUyB3cml0ZXIKICAgICBpZiAobURpc2FibGVUZXN0IHx8IG1Xcml0ZXJOYW1lID09IHN0YW5kYXJkV3JpdGVyczo6TVBFRzJUUykgcmV0dXJuOwpAQCAtMzg5LDcgKzY2Miw3IEBACiAgICAgICAgICAgICBvcGVuKG91dHB1dEZpbGUuY19zdHIoKSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUiwgU19JUlVTUiB8IFNfSVdVU1IpOwogICAgIEFTU0VSVF9HRShmZCwgMCkgPDwgIkZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlIHRvIGR1bXAgd3JpdGVyJ3MgZGF0YSI7CiAKLSAgICBzdHJpbmcgd3JpdGVyRm9ybWF0ID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICBzdHJpbmcgd3JpdGVyRm9ybWF0ID0gZ2V0PDA+KEdldFBhcmFtKCkpOwogICAgIGludDMyX3Qgc3RhdHVzID0gY3JlYXRlV3JpdGVyKGZkKTsKICAgICBBU1NFUlRfRVEoc3RhdHVzLCAoc3RhdHVzX3QpT0spIDw8ICJGYWlsZWQgdG8gY3JlYXRlIHdyaXRlciBmb3Igb3V0cHV0IGZvcm1hdDoiIDw8IHdyaXRlckZvcm1hdDsKIApAQCAtMzk3LDggKzY3MCwxMCBAQAogICAgIHN0cmluZyBpbnB1dEluZm8gPSBnRW52LT5nZXRSZXMoKTsKICAgICBjb25maWdGb3JtYXQgcGFyYW07CiAgICAgYm9vbCBpc0F1ZGlvOwotICAgIGludDMyX3QgaW5wdXRGaWxlSWR4ID0gR2V0UGFyYW0oKS5zZWNvbmQ7Ci0gICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtLCBpc0F1ZGlvLCBpbnB1dEZpbGVJZHgpOworICAgIGlucHV0SWQgaW5wSWQgPSBnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgQVNTRVJUX05FKGlucElkLCBVTlVTRURfSUQpIDw8ICJUZXN0IGV4cGVjdHMgZmlyc3QgaW5wdXRJZCB0byBiZSBhIHZhbGlkIGlkIjsKKworICAgIGdldEZpbGVEZXRhaWxzKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBwYXJhbSwgaXNBdWRpbywgaW5wSWQpOwogICAgIEFTU0VSVF9ORShpbnB1dEZpbGUuY29tcGFyZShnRW52LT5nZXRSZXMoKSksIDApIDw8ICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZCI7CiAKICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dEJ1ZmZlckluZm8oaW5wdXRGaWxlLCBpbnB1dEluZm8pKTsKQEAgLTQxNSw4ICs2OTAsOCBAQAogICAgICAgICBtV3JpdGVyLT5zdGFydChtRmlsZU1ldGEuZ2V0KCkpOwogICAgIH0KIAotICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtLCBtQnVmZmVySW5mbywgbUlucHV0RnJhbWVJZCwgbUN1cnJlbnRUcmFjaywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJJbmZvLnNpemUoKSAvIDQpOworICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtWzBdLCBtQnVmZmVySW5mb1swXSwgbUlucHV0RnJhbWVJZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbMF0sIDAsIG1CdWZmZXJJbmZvWzBdLnNpemUoKSAvIDQpOwogICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIGZhaWxlZCI7CiAKICAgICBmb3IgKGludDMyX3QgY291bnQgPSAwOyBjb3VudCA8IGtNYXhDb3VudDsgY291bnQrKykgewpAQCAtNDI1LDIwICs3MDAsMjAgQEAKICAgICB9CiAKICAgICBtV3JpdGVyLT5wYXVzZSgpOwotICAgIGludDMyX3QgbnVtRnJhbWVzUGF1c2VkID0gbUJ1ZmZlckluZm8uc2l6ZSgpIC8gNDsKLSAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbSwgbUJ1ZmZlckluZm8sIG1JbnB1dEZyYW1lSWQsIG1DdXJyZW50VHJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGcmFtZUlkLCBudW1GcmFtZXNQYXVzZWQsIHRydWUpOworICAgIGludDMyX3QgbnVtRnJhbWVzUGF1c2VkID0gbUJ1ZmZlckluZm9bMF0uc2l6ZSgpIC8gNDsKKyAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbVswXSwgbUJ1ZmZlckluZm9bMF0sIG1JbnB1dEZyYW1lSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrWzBdLCBtSW5wdXRGcmFtZUlkWzBdLCBudW1GcmFtZXNQYXVzZWQsIHRydWUpOwogICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIGZhaWxlZCI7CiAKICAgICBmb3IgKGludDMyX3QgY291bnQgPSAwOyBjb3VudCA8IGtNYXhDb3VudDsgY291bnQrKykgewogICAgICAgICBtV3JpdGVyLT5zdGFydChtRmlsZU1ldGEuZ2V0KCkpOwogICAgIH0KIAotICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtLCBtQnVmZmVySW5mbywgbUlucHV0RnJhbWVJZCwgbUN1cnJlbnRUcmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEZyYW1lSWQsIG1CdWZmZXJJbmZvLnNpemUoKSk7CisgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW1bMF0sIG1CdWZmZXJJbmZvWzBdLCBtSW5wdXRGcmFtZUlkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1swXSwgbUlucHV0RnJhbWVJZFswXSwgbUJ1ZmZlckluZm9bMF0uc2l6ZSgpKTsKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciBmYWlsZWQiOwogCi0gICAgbUN1cnJlbnRUcmFjay0+c3RvcCgpOworICAgIG1DdXJyZW50VHJhY2tbMF0tPnN0b3AoKTsKIAogICAgIC8vIGZpcnN0IHN0b3Agc2hvdWxkIHN1Y2NlZWQuCiAgICAgc3RhdHVzID0gbVdyaXRlci0+c3RvcCgpOwpAQCAtNDUxLDE5ICs3MjYsMzgwIEBACiAgICAgY2xvc2UoZmQpOwogfQogCitjbGFzcyBXcml0ZXJWYWxpZGl0eVRlc3QKKyAgICA6IHB1YmxpYyBXcml0ZXJUZXN0LAorICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTwKKyAgICAgICAgICAgICAgdHVwbGU8c3RyaW5nIC8qIHdyaXRlckZvcm1hdCovLCBpbnB1dElkIC8qIGlucHV0SWQwKi8sIGJvb2wgLyogYWRkU291cmNlRmFpbCovPj4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBzZXR1cFdyaXRlclR5cGUoZ2V0PDA+KEdldFBhcmFtKCkpKTsgfQorfTsKKworVEVTVF9QKFdyaXRlclZhbGlkaXR5VGVzdCwgSW52YWxpZElucHV0VGVzdCkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBTE9HVigiVmFsaWRhdGVzIHdyaXRlcidzIGJlaGF2aW9yIGZvciBpbnZhbGlkIGlucHV0cyIpOworCisgICAgc3RyaW5nIHdyaXRlckZvcm1hdCA9IGdldDwwPihHZXRQYXJhbSgpKTsKKyAgICBpbnB1dElkIGlucElkID0gZ2V0PDE+KEdldFBhcmFtKCkpOworICAgIGJvb2wgYWRkU291cmNlRmFpbEV4cGVjdGVkID0gZ2V0PDI+KEdldFBhcmFtKCkpOworCisgICAgLy8gVGVzdCB3cml0ZXJzIGZvciBpbnZhbGlkIEZEIHZhbHVlCisgICAgaW50MzJfdCBmZCA9IC0xOworICAgIGludDMyX3Qgc3RhdHVzID0gY3JlYXRlV3JpdGVyKGZkKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIEFMT0dWKCJjcmVhdGVXcml0ZXIgZmFpbGVkIGZvciBpbnZhbGlkIEZELCB0aGlzIGlzIGV4cGVjdGVkIGJlaGF2aW9yIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJZiB3cml0ZXIgd2FzIGNyZWF0ZWQgZm9yIGludmFsaWQgZmQsIHRlc3QgaXQgZnVydGhlci4KKyAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgc3RyaW5nIGlucHV0SW5mbyA9IGdFbnYtPmdldFJlcygpOworICAgIGNvbmZpZ0Zvcm1hdCBwYXJhbTsKKyAgICBib29sIGlzQXVkaW87CisgICAgQVNTRVJUX05FKGlucElkLCBVTlVTRURfSUQpIDw8ICJUZXN0IGV4cGVjdHMgZmlyc3QgaW5wdXRJZCB0byBiZSBhIHZhbGlkIGlkIjsKKworICAgIGdldEZpbGVEZXRhaWxzKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBwYXJhbSwgaXNBdWRpbywgaW5wSWQpOworICAgIEFTU0VSVF9ORShpbnB1dEZpbGUuY29tcGFyZShnRW52LT5nZXRSZXMoKSksIDApIDw8ICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZCI7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dEJ1ZmZlckluZm8oaW5wdXRGaWxlLCBpbnB1dEluZm8pKTsKKyAgICBzdGF0dXMgPSBhZGRXcml0ZXJTb3VyY2UoaXNBdWRpbywgcGFyYW0pOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoYWRkU291cmNlRmFpbEV4cGVjdGVkKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gYWRkIHNvdXJjZSBmb3IgIiA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIiOworICAgICAgICBBTE9HVigiYWRkV3JpdGVyU291cmNlIGZhaWxlZCBmb3IgaW52YWxpZCBGRCwgdGhpcyBpcyBleHBlY3RlZCBiZWhhdmlvciIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gc3RhcnQgdGhlIHdyaXRlciB3aXRoIHZhbGlkIGFyZ3VtZW50IGJ1dCBpbnZhbGlkIEZECisgICAgc3RhdHVzID0gbVdyaXRlci0+c3RhcnQobUZpbGVNZXRhLmdldCgpKTsKKyAgICBBU1NFUlRfTkUoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJXcml0ZXIgZGlkIG5vdCBmYWlsIGZvciBpbnZhbGlkIEZEIjsKKworICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtWzBdLCBtQnVmZmVySW5mb1swXSwgbUlucHV0RnJhbWVJZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbMF0sIDAsIG1CdWZmZXJJbmZvWzBdLnNpemUoKSk7CisgICAgQVNTRVJUX05FKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiV3JpdGVyIGRpZCBub3QgcmVwb3J0IGVycm9yIGZvciBpbnZhbGlkIEZEIjsKKworICAgIHN0YXR1cyA9IG1DdXJyZW50VHJhY2tbMF0tPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgdHJhY2siOworCisgICAgc3RhdHVzID0gbVdyaXRlci0+c3RvcCgpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wICIgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIjsKK30KKworVEVTVF9QKFdyaXRlclZhbGlkaXR5VGVzdCwgTWFsRm9ybWVkRGF0YVRlc3QpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgLy8gRW5hYmxlIHRlc3QgZm9yIE9nZyB3cml0ZXIKKyAgICBBU1NFUlRfTkUobVdyaXRlck5hbWUsIE9HRykgPDwgIlRPRE8oYi8xNjAxMDU2NDYpIjsKKyAgICBBTE9HVigiVGVzdCB3cml0ZXIgZm9yIG1hbGZvcm1lZCBpbnB1dHMiKTsKKworICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgaW5wdXRJZCBpbnBJZCA9IGdldDwxPihHZXRQYXJhbSgpKTsKKyAgICBib29sIGFkZFNvdXJjZUZhaWxFeHBlY3RlZCA9IGdldDwyPihHZXRQYXJhbSgpKTsKKyAgICBpbnQzMl90IGZkID0KKyAgICAgICAgICAgIG9wZW4oT1VUUFVUX0ZJTEVfTkFNRSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUiwgU19JUlVTUiB8IFNfSVdVU1IpOworICAgIEFTU0VSVF9HRShmZCwgMCkgPDwgIkZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlIHRvIGR1bXAgd3JpdGVyJ3MgZGF0YSI7CisKKyAgICBpbnQzMl90IHN0YXR1cyA9IGNyZWF0ZVdyaXRlcihmZCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgKHN0YXR1c190KU9LKQorICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBjcmVhdGUgd3JpdGVyIGZvciAiIDw8IHdyaXRlckZvcm1hdCA8PCAiIG91dHB1dCBmb3JtYXQiOworCisgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpOworICAgIHN0cmluZyBpbnB1dEluZm8gPSBnRW52LT5nZXRSZXMoKTsKKyAgICBjb25maWdGb3JtYXQgcGFyYW07CisgICAgYm9vbCBpc0F1ZGlvOworICAgIEFTU0VSVF9ORShpbnBJZCwgVU5VU0VEX0lEKSA8PCAiVGVzdCBleHBlY3RzIGZpcnN0IGlucHV0SWQgdG8gYmUgYSB2YWxpZCBpZCI7CisKKyAgICBnZXRGaWxlRGV0YWlscyhpbnB1dEZpbGUsIGlucHV0SW5mbywgcGFyYW0sIGlzQXVkaW8sIGlucElkKTsKKyAgICBBU1NFUlRfTkUoaW5wdXRGaWxlLmNvbXBhcmUoZ0Vudi0+Z2V0UmVzKCkpLCAwKSA8PCAiTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRCdWZmZXJJbmZvKGlucHV0RmlsZSwgaW5wdXRJbmZvKSk7CisgICAgLy8gUmVtb3ZlIENTRCBkYXRhIGZyb20gaW5wdXQKKyAgICBtTnVtQ3Nkc1swXSA9IDA7CisgICAgc3RhdHVzID0gYWRkV3JpdGVyU291cmNlKGlzQXVkaW8sIHBhcmFtKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGFkZFNvdXJjZUZhaWxFeHBlY3RlZCkKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFkZCBzb3VyY2UgZm9yICIgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIjsKKyAgICAgICAgQUxPR1YoIiVzIHdyaXRlciBmYWlsZWQgdG8gYWRkU291cmNlIGFmdGVyIHJlbW92aW5nIENTRCBmcm9tIGlucHV0Iiwgd3JpdGVyRm9ybWF0LmNfc3RyKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RhdHVzID0gbVdyaXRlci0+c3RhcnQobUZpbGVNZXRhLmdldCgpKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJDb3VsZCBub3Qgc3RhcnQgIiA8PCB3cml0ZXJGb3JtYXQgPDwgIndyaXRlciI7CisKKyAgICAvLyBTa2lwIGZpcnN0IGZldyBmcmFtZXMuIFRoZXNlIG1heSBjb250YWluIHN5bmMgZnJhbWVzIGFsc28uCisgICAgaW50MzJfdCBmcmFtZUlEID0gbUlucHV0RnJhbWVJZFswXSArIG1CdWZmZXJJbmZvWzBdLnNpemUoKSAvIDQ7CisgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW1bMF0sIG1CdWZmZXJJbmZvWzBdLCBmcmFtZUlELCBtQ3VycmVudFRyYWNrWzBdLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlckluZm9bMF0uc2l6ZSgpKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciBmYWlsZWQiOworCisgICAgc3RhdHVzID0gbUN1cnJlbnRUcmFja1swXS0+c3RvcCgpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSB0cmFjayI7CisKKyAgICBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7CisgICAgc3RhdHVzID0gbVdyaXRlci0+ZHVtcChmZCwgYXJncyk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGR1bXAgc3RhdGlzdGljcyBmcm9tIHdyaXRlciI7CisKKyAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgIiA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIiOworICAgIGNsb3NlKGZkKTsKK30KKworLy8gVGhpcyB0ZXN0IGlzIHNwZWNpZmljIHRvIE1QRUc0V3JpdGVyIHRvIHRlc3QgbW9yZSBBUElzCitURVNUX1AoV3JpdGVGdW5jdGlvbmFsaXR5VGVzdCwgTXBlZzRXcml0ZXJUZXN0KSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIGlmIChtV3JpdGVyTmFtZSAhPSBzdGFuZGFyZFdyaXRlcnM6Ok1QRUc0KSByZXR1cm47CisgICAgQUxPR1YoIlRlc3QgTVBFRzQgd3JpdGVyIHNwZWNpZmljIEFQSXMiKTsKKworICAgIGlucHV0SWQgaW5wSWQgPSBnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgaW50MzJfdCBmZCA9CisgICAgICAgICAgICBvcGVuKE9VVFBVVF9GSUxFX05BTUUsIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNSKTsKKyAgICBBU1NFUlRfR0UoZmQsIDApIDw8ICJGYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSB0byBkdW1wIHdyaXRlcidzIGRhdGEiOworCisgICAgaW50MzJfdCBzdGF0dXMgPSBjcmVhdGVXcml0ZXIoZmQpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIChzdGF0dXNfdClPSykgPDwgIkZhaWxlZCB0byBjcmVhdGUgd3JpdGVyIGZvciBtcGVnNCBvdXRwdXQgZm9ybWF0IjsKKworICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKTsKKyAgICBzdHJpbmcgaW5wdXRJbmZvID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgY29uZmlnRm9ybWF0IHBhcmFtOworICAgIGJvb2wgaXNBdWRpbzsKKyAgICBBU1NFUlRfTkUoaW5wSWQsIFVOVVNFRF9JRCkgPDwgIlRlc3QgZXhwZWN0cyBmaXJzdCBpbnB1dElkIHRvIGJlIGEgdmFsaWQgaWQiOworCisgICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtLCBpc0F1ZGlvLCBpbnBJZCk7CisgICAgQVNTRVJUX05FKGlucHV0RmlsZS5jb21wYXJlKGdFbnYtPmdldFJlcygpKSwgMCkgPDwgIk5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIjsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0QnVmZmVySW5mbyhpbnB1dEZpbGUsIGlucHV0SW5mbykpOworICAgIHN0YXR1cyA9IGFkZFdyaXRlclNvdXJjZShpc0F1ZGlvLCBwYXJhbSk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGFkZCBzb3VyY2UgZm9yIG1wZWc0IFdyaXRlciI7CisKKyAgICAvLyBzaWduYWwgbWV0YSBkYXRhIGZvciB0aGUgd3JpdGVyCisgICAgc3A8TVBFRzRXcml0ZXI+IG1wNHdyaXRlciA9IHN0YXRpY19jYXN0PE1QRUc0V3JpdGVyICo+KG1Xcml0ZXIuZ2V0KCkpOworICAgIHN0YXR1cyA9IG1wNHdyaXRlci0+c2V0SW50ZXJsZWF2ZUR1cmF0aW9uKGtEZWZhdWx0SW50ZXJsZWF2ZUR1cmF0aW9uKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJzZXRJbnRlcmxlYXZlRHVyYXRpb24gZmFpbGVkIjsKKworICAgIHN0YXR1cyA9IG1wNHdyaXRlci0+c2V0R2VvRGF0YShrRGVmYXVsdExhdGl0dWRleDEwMDAwLCBrRGVmYXVsdExvbmdpdHVkZXgxMDAwMCk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAic2V0R2VvRGF0YSBmYWlsZWQiOworCisgICAgc3RhdHVzID0gbXA0d3JpdGVyLT5zZXRDYXB0dXJlUmF0ZShrRGVmYXVsdEZQUyk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAic2V0Q2FwdHVyZVJhdGUgZmFpbGVkIjsKKworICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiQ291bGQgbm90IHN0YXJ0IHRoZSB3cml0ZXIiOworCisgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW1bMF0sIG1CdWZmZXJJbmZvWzBdLCBtSW5wdXRGcmFtZUlkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1swXSwgMCwgbUJ1ZmZlckluZm9bMF0uc2l6ZSgpKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJtcGVnNCB3cml0ZXIgZmFpbGVkIjsKKworICAgIHN0YXR1cyA9IG1DdXJyZW50VHJhY2tbMF0tPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgdHJhY2siOworCisgICAgc3RhdHVzID0gbVdyaXRlci0+c3RvcCgpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSB3cml0ZXIiOworICAgIG1wNHdyaXRlci5jbGVhcigpOworICAgIGNsb3NlKGZkKTsKK30KKworY2xhc3MgTGlzdGVuZXJUZXN0CisgICAgOiBwdWJsaWMgV3JpdGVyVGVzdCwKKyAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGU8CisgICAgICAgICAgICAgIHN0cmluZyAvKiB3cml0ZXJGb3JtYXQqLywgaW5wdXRJZCAvKiBpbnB1dElkMCovLCBpbnB1dElkIC8qIGlucHV0SWQxKi8sCisgICAgICAgICAgICAgIGZsb2F0IC8qIEZpbGVTaXplTGltaXQqLywgZmxvYXQgLyogRmlsZUR1cmF0aW9uTGltaXQqLywgZmxvYXQgLyogQnVmZmVySW50ZXJ2YWwqLz4+IHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsgc2V0dXBXcml0ZXJUeXBlKGdldDwwPihHZXRQYXJhbSgpKSk7IH0KK307CisKK1RFU1RfUChMaXN0ZW5lclRlc3QsIFNldE1heEZpbGVMaW1pdHNUZXN0KSB7CisgICAgLy8gVE9ETyhiLzE1MTg5MjQxNCk6IEVuYWJsZSB0ZXN0IGZvciBvdGhlciB3cml0ZXJzCisgICAgaWYgKG1EaXNhYmxlVGVzdCB8fCBtV3JpdGVyTmFtZSAhPSBNUEVHNCkgcmV0dXJuOworICAgIEFMT0dWKCJWYWxpZGF0ZXMgd3JpdGVyIHdoZW4gbWF4IGZpbGUgbGltaXRzIGFyZSBzZXQiKTsKKworICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgc3RyaW5nIG91dHB1dEZpbGUgPSBPVVRQVVRfRklMRV9OQU1FOworICAgIGludDMyX3QgZmQgPQorICAgICAgICAgICAgb3BlbihvdXRwdXRGaWxlLmNfc3RyKCksIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNSKTsKKyAgICBBU1NFUlRfR0UoZmQsIDApIDw8ICJGYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSB0byBkdW1wIHdyaXRlcidzIGRhdGEiOworCisgICAgaW50MzJfdCBzdGF0dXMgPSBjcmVhdGVXcml0ZXIoZmQpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBjcmVhdGUgd3JpdGVyIGZvciBvdXRwdXQgZm9ybWF0OiIgPDwgd3JpdGVyRm9ybWF0OworCisgICAgaW5wdXRJZCBpbnBJZFtdID0ge2dldDwxPihHZXRQYXJhbSgpKSwgZ2V0PDI+KEdldFBhcmFtKCkpfTsKKyAgICBBU1NFUlRfTkUoaW5wSWRbMF0sIFVOVVNFRF9JRCkgPDwgIlRlc3QgZXhwZWN0cyBmaXJzdCBpbnB1dElkIHRvIGJlIGEgdmFsaWQgaWQiOworCisgICAgc2l6ZV90IGlucHV0RmlsZVNpemUgPSAwOworICAgIGludDY0X3QgbGFzdEZyYW1lVGltZVN0YW1wVXMgPSBJTlRfTUFYOworICAgIGludDMyX3QgbnVtVHJhY2tzID0gMTsKKyAgICBpZiAoaW5wSWRbMV0gIT0gVU5VU0VEX0lEKSB7CisgICAgICAgIG51bVRyYWNrcysrOworICAgIH0KKyAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgbnVtVHJhY2tzOyBpZHgrKykgeworICAgICAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgICAgIHN0cmluZyBpbnB1dEluZm8gPSBnRW52LT5nZXRSZXMoKTsKKyAgICAgICAgY29uZmlnRm9ybWF0IHBhcmFtOworICAgICAgICBib29sIGlzQXVkaW87CisgICAgICAgIGdldEZpbGVEZXRhaWxzKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBwYXJhbSwgaXNBdWRpbywgaW5wSWRbaWR4XSk7CisgICAgICAgIEFTU0VSVF9ORShpbnB1dEZpbGUuY29tcGFyZShnRW52LT5nZXRSZXMoKSksIDApIDw8ICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZCI7CisKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRCdWZmZXJJbmZvKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBpZHgpKTsKKyAgICAgICAgc3RhdHVzID0gYWRkV3JpdGVyU291cmNlKGlzQXVkaW8sIHBhcmFtLCBpZHgpOworICAgICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gYWRkIHNvdXJjZSBmb3IgIiA8PCB3cml0ZXJGb3JtYXQgPDwgIldyaXRlciI7CisKKyAgICAgICAgLy8gUmVhZCBmaWxlIHByb3BlcnRpZXMKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBzdGF0dXMgPSBzdGF0KGlucHV0RmlsZS5jX3N0cigpLCAmYnVmKTsKKyAgICAgICAgQVNTRVJUX0VRKDAsIHN0YXR1cyk7CisKKyAgICAgICAgaW5wdXRGaWxlU2l6ZSArPSBidWYuc3Rfc2l6ZTsKKyAgICAgICAgaWYgKGxhc3RGcmFtZVRpbWVTdGFtcFVzID4gbUJ1ZmZlckluZm9baWR4XVttQnVmZmVySW5mb1tpZHhdLnNpemUoKSAtIDFdLnRpbWVVcykgeworICAgICAgICAgICAgbGFzdEZyYW1lVGltZVN0YW1wVXMgPSBtQnVmZmVySW5mb1tpZHhdW21CdWZmZXJJbmZvW2lkeF0uc2l6ZSgpIC0gMV0udGltZVVzOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgZmlsZVNpemVMaW1pdCA9IGdldDwzPihHZXRQYXJhbSgpKTsKKyAgICBmbG9hdCBmaWxlRHVyYXRpb25MaW1pdCA9IGdldDw0PihHZXRQYXJhbSgpKTsKKyAgICBpbnQ2NF90IG1heEZpbGVTaXplID0gMDsKKyAgICBpbnQ2NF90IG1heEZpbGVEdXJhdGlvbiA9IDA7CisgICAgaWYgKGZpbGVTaXplTGltaXQgPiAwKSB7CisgICAgICAgIG1heEZpbGVTaXplID0gKGludDY0X3QpKGZpbGVTaXplTGltaXQgKiBpbnB1dEZpbGVTaXplKTsKKyAgICAgICAgbVdyaXRlci0+c2V0TWF4RmlsZVNpemUobWF4RmlsZVNpemUpOworICAgIH0KKyAgICBpZiAoZmlsZUR1cmF0aW9uTGltaXQgPiAwKSB7CisgICAgICAgIG1heEZpbGVEdXJhdGlvbiA9IChpbnQ2NF90KShmaWxlRHVyYXRpb25MaW1pdCAqIGxhc3RGcmFtZVRpbWVTdGFtcFVzKTsKKyAgICAgICAgbVdyaXRlci0+c2V0TWF4RmlsZUR1cmF0aW9uKG1heEZpbGVEdXJhdGlvbik7CisgICAgfQorCisgICAgc3A8V3JpdGVyTGlzdGVuZXI+IGxpc3RlbmVyID0gbmV3IFdyaXRlckxpc3RlbmVyKCk7CisgICAgQVNTRVJUX05FKGxpc3RlbmVyLCBudWxscHRyKSA8PCAidW5hYmxlIHRvIGFsbG9jYXRlIGxpc3RlbmVyIjsKKworICAgIG1Xcml0ZXItPnNldExpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdGFydChtRmlsZU1ldGEuZ2V0KCkpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cyk7CisKKyAgICBmbG9hdCBpbnRlcnZhbCA9IGdldDw1PihHZXRQYXJhbSgpKTsKKyAgICBBU1NFUlRfTEUoaW50ZXJ2YWwsIDEuMGYpIDw8ICJCdWZmZXIgaW50ZXJ2YWwgaW52YWxpZC4gU2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxLjAiOworCisgICAgc2l6ZV90IHJhbmdlID0gMDsKKyAgICBpbnQzMl90IGxvb3BDb3VudCA9IDA7CisgICAgaW50MzJfdCBvZmZzZXRba01heFRyYWNrQ291bnRde307CisgICAgd2hpbGUgKGxvb3BDb3VudCA8IGNlaWwoMS4wIC8gaW50ZXJ2YWwpKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBudW1UcmFja3M7IGlkeCsrKSB7CisgICAgICAgICAgICByYW5nZSA9IG1CdWZmZXJJbmZvW2lkeF0uc2l6ZSgpICogaW50ZXJ2YWw7CisgICAgICAgICAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbVtpZHhdLCBtQnVmZmVySW5mb1tpZHhdLCBtSW5wdXRGcmFtZUlkW2lkeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbaWR4XSwgb2Zmc2V0W2lkeF0sIHJhbmdlLCBmYWxzZSwgbGlzdGVuZXIpOworICAgICAgICAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIgZmFpbGVkIjsKKyAgICAgICAgICAgIG9mZnNldFtpZHhdICs9IHJhbmdlOworICAgICAgICB9CisgICAgICAgIGxvb3BDb3VudCsrOworICAgIH0KKworICAgIEFTU0VSVF9UUlVFKG1Xcml0ZXItPnJlYWNoZWRFT1MoKSkgPDwgIkVPUyBub3Qgc2lnbmFsbGVkLiI7CisKKyAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwga01heFRyYWNrQ291bnQ7IGlkeCsrKSB7CisgICAgICAgIGlmIChtQ3VycmVudFRyYWNrW2lkeF0pIHsKKyAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbaWR4XS0+c3RvcCgpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzID0gbVdyaXRlci0+c3RvcCgpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSB3cml0ZXIiOworICAgIGNsb3NlKGZkKTsKKworICAgIGlmIChtYXhGaWxlU2l6ZSA8PSAwKSB7CisgICAgICAgIEFTU0VSVF9GQUxTRShsaXN0ZW5lci0+bVNpZ25hbGVkU2l6ZSk7CisgICAgfSBlbHNlIGlmIChtYXhGaWxlRHVyYXRpb24gPD0gMCkgeworICAgICAgICBBU1NFUlRfRkFMU0UobGlzdGVuZXItPm1TaWduYWxlZER1cmF0aW9uKTsKKyAgICB9IGVsc2UgaWYgKG1heEZpbGVTaXplID4gMCAmJiBtYXhGaWxlRHVyYXRpb24gPD0gMCkgeworICAgICAgICBBU1NFUlRfVFJVRShsaXN0ZW5lci0+bVNpZ25hbGVkU2l6ZSk7CisgICAgfSBlbHNlIGlmIChtYXhGaWxlRHVyYXRpb24gPiAwICYmIG1heEZpbGVTaXplIDw9IDApIHsKKyAgICAgICAgQVNTRVJUX1RSVUUobGlzdGVuZXItPm1TaWduYWxlZER1cmF0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfVFJVRShsaXN0ZW5lci0+bVNpZ25hbGVkU2l6ZSB8fCBsaXN0ZW5lci0+bVNpZ25hbGVkRHVyYXRpb24pOworICAgIH0KKworICAgIGlmIChtYXhGaWxlU2l6ZSA+IDApIHsKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBzdGF0dXMgPSBzdGF0KG91dHB1dEZpbGUuY19zdHIoKSwgJmJ1Zik7CisgICAgICAgIEFTU0VSVF9FUSgwLCBzdGF0dXMpOworICAgICAgICBBU1NFUlRfTEUoYnVmLnN0X3NpemUsIG1heEZpbGVTaXplKTsKKyAgICB9Cit9CisKKy8vIFRPRE86IChiLzE1MDkyMzM4NykKKy8vIEFkZCBXRUJNIGlucHV0CitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoTGlzdGVuZXJUZXN0QWxsLCBMaXN0ZW5lclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgiYWFjIiwgQUFDXzEsIFVOVVNFRF9JRCwgMC42LCAwLjcsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFtcm5iIiwgQU1SX05CXzEsIFVOVVNFRF9JRCwgMC4yLCAwLjYsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFtcndiIiwgQU1SX1dCXzEsIFVOVVNFRF9JRCwgMC41LCAwLjUsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWcyVHMiLCBBQUNfMSwgVU5VU0VEX0lELCAwLjIsIDEsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQUFDXzEsIFVOVVNFRF9JRCwgMC40LCAwLjMsIDAuMjUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQUFDXzEsIFVOVVNFRF9JRCwgMC4zLCAxLCAwLjUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm9nZyIsIE9QVVNfMSwgVU5VU0VEX0lELCAwLjcsIDAuMywgMSkpKTsKKwogLy8gVE9ETzogKGIvMTQ0NDc2MTY0KQogLy8gQWRkIEFBQ19BRFRTLCBGTEFDLCBBVjEgaW5wdXQKLUlOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChXcml0ZXJUZXN0QWxsLCBXcml0ZXJUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfcGFpcigib2dnIiwgMCksIG1ha2VfcGFpcigid2VibSIsIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYWFjIiwgMSksIG1ha2VfcGFpcigibXBlZzQiLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImFtcm5iIiwgMyksIG1ha2VfcGFpcigiYW1yd2IiLCA0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIndlYm0iLCA1KSwgbWFrZV9wYWlyKCJ3ZWJtIiwgNyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ3ZWJtIiwgOCksIG1ha2VfcGFpcigibXBlZzQiLCA5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWc0IiwgMTApLCBtYWtlX3BhaXIoIm1wZWc0IiwgMTIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzQiLCAxMyksIG1ha2VfcGFpcigibXBlZzJUcyIsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzJUcyIsIDkpKSk7CitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIFdyaXRlclRlc3RBbGwsIFdyaXRlRnVuY3Rpb25hbGl0eVRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFhYyIsIEFBQ18xLCBVTlVTRURfSUQsIDEpLAorCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYW1ybmIiLCBBTVJfTkJfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJhbXJ3YiIsIEFNUl9XQl8xLCBVTlVTRURfSUQsIDEpLAorCisgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzE0NDkwMjAxOCk6IEVuYWJsZSB0ZXN0IGZvciBtcGVnMnRzCisgICAgICAgICAgICAgICAgLy8gbWFrZV90dXBsZSgibXBlZzJUcyIsIEFBQ18xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIC8vIG1ha2VfdHVwbGUoIm1wZWcyVHMiLCBBVkNfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMTU2MzU1ODU3KTogQWRkIG11bHRpdHJhY2sgZm9yIG1wZWcydHMKKyAgICAgICAgICAgICAgICAvLyBtYWtlX3R1cGxlKCJtcGVnMlRzIiwgQUFDXzEsIEFWQ18xLCAwLjUwKSwKKyAgICAgICAgICAgICAgICAvLyBtYWtlX3R1cGxlKCJtcGVnMlRzIiwgQVZDXzEsIEFBQ18xLCAwLjI1KSwKKworICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQUFDXzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBTVJfTkJfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEFNUl9XQl8xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQVZDXzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBIMjYzXzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBIRUlDXzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBIRVZDXzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBNUEVHNF8xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQUFDXzEsIEFWQ18xLCAwLjI1KSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEFWQ18xLCBBQUNfMSwgMC43NSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBTVJfV0JfMSwgQUFDXzEsIDAuNzUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgSEVWQ18xLCBBTVJfV0JfMSwgMC4yNSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBIMjYzXzEsIEFNUl9OQl8xLCAwLjUwKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIE1QRUc0XzEsIEFBQ18xLCAwLjc1KSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEFNUl9OQl8xLCBBTVJfV0JfMSwgMC4yNSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBIMjYzXzEsIEFNUl9OQl8xLCAwLjUwKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIE1QRUc0XzEsIEhFVkNfMSwgMC43NSksCisKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJvZ2ciLCBPUFVTXzEsIFVOVVNFRF9JRCwgMSksCisKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3ZWJtIiwgT1BVU18xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndlYm0iLCBWT1JCSVNfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3ZWJtIiwgVlA4XzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2VibSIsIFZQOV8xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndlYm0iLCBWUDhfMSwgT1BVU18xLCAwLjUwKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3ZWJtIiwgVk9SQklTXzEsIFZQOF8xLCAwLjI1KSkpOworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIFdyaXRlclZhbGlkaXR5VGVzdCwgV3JpdGVyVmFsaWRpdHlUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJhYWMiLCBBQUNfMSwgdHJ1ZSksCisKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJhbXJuYiIsIEFNUl9OQl8xLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJhbXJ3YiIsIEFNUl9XQl8xLCB0cnVlKSwKKworICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQUFDXzEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEFNUl9OQl8xLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBVkNfMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgSDI2M18xLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBIRUlDXzEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEhFVkNfMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgTVBFRzRfMSwgZmFsc2UpLAorCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgib2dnIiwgT1BVU18xLCB0cnVlKSwKKworICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndlYm0iLCBPUFVTXzEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3ZWJtIiwgVk9SQklTXzEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndlYm0iLCBWUDhfMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndlYm0iLCBWUDlfMSwgZmFsc2UpKSk7CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKICAgICBnRW52ID0gbmV3IFdyaXRlclRlc3RFbnZpcm9ubWVudCgpOwogICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOwogICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclRlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclRlc3RFbnZpcm9ubWVudC5oCmluZGV4IDk5ZTY4NmYuLjdkYTBhNjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0RW52aXJvbm1lbnQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdEVudmlyb25tZW50LmgKQEAgLTI1LDcgKzI1LDcgQEAKIAogY2xhc3MgV3JpdGVyVGVzdEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgewogICBwdWJsaWM6Ci0gICAgV3JpdGVyVGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSB7fQorICAgIFdyaXRlclRlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvIiksIGRlbGV0ZU91dHB1dCh0cnVlKSB7fQogCiAgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCiAgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwpAQCAtMzQsMTYgKzM0LDIxIEBACiAKICAgICBjb25zdCBzdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CiAKKyAgICBib29sIGNsZWFuVXAoKSBjb25zdCB7IHJldHVybiBkZWxldGVPdXRwdXQ7IH0KKwogICBwcml2YXRlOgogICAgIHN0cmluZyByZXM7CisgICAgYm9vbCBkZWxldGVPdXRwdXQ7CiB9OwogCiBpbnQgV3JpdGVyVGVzdEVudmlyb25tZW50Ojppbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0ge3sicmVzIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdQJ30sIHswLCAwLCAwLCAwfX07CisgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0ge3sicmVzIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdQJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiY2xlYW5VcCIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAnQyd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMCwgMCwgMH19OwogCiAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiUDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJQOkM6Iiwgb3B0aW9ucywgJmluZGV4KTsKICAgICAgICAgaWYgKGMgPT0gLTEpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC01Miw2ICs1NywxMSBAQAogICAgICAgICAgICAgY2FzZSAnUCc6CiAgICAgICAgICAgICAgICAgc2V0UmVzKG9wdGFyZyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChvcHRhcmcsICJmYWxzZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZU91dHB1dCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTYyLDcgKzcyLDggQEAKICAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgogICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKICAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgotICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIgorICAgICAgICAgICAgICAgICItQywgZGVmYXVsdDp0cnVlLiBEZWxldGUgb3V0cHV0IGZpbGUgYWZ0ZXIgdGVzdCBjb21wbGV0ZXNcbiIsCiAgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOwogICAgICAgICByZXR1cm4gMjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVXRpbGl0eS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVXRpbGl0eS5jcHAKaW5kZXggZjI0Y2NiNi4uYTMwNDNmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclV0aWxpdHkuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJVdGlsaXR5LmNwcApAQCAtMjQsOSArMjQsMTYgQEAKIAogaW50MzJfdCBzZW5kQnVmZmVyc1RvV3JpdGVyKGlmc3RyZWFtICZpbnB1dFN0cmVhbSwgdmVjdG9yPEJ1ZmZlckluZm8+ICZidWZmZXJJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgJmlucHV0RnJhbWVJZCwgc3A8TWVkaWFBZGFwdGVyPiAmY3VycmVudFRyYWNrLCBpbnQzMl90IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJhbmdlLCBib29sIGlzUGF1c2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByYW5nZSwgYm9vbCBpc1BhdXNlZCwgc3A8V3JpdGVyTGlzdGVuZXI+IGxpc3RlbmVyKSB7CiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgaWYgKGlucHV0RnJhbWVJZCA+PSAoaW50KWJ1ZmZlckluZm8uc2l6ZSgpIHx8IGlucHV0RnJhbWVJZCA+PSAob2Zmc2V0ICsgcmFuZ2UpKSBicmVhazsKKyAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lci0+bVNpZ25hbGVkRHVyYXRpb24gfHwgbGlzdGVuZXItPm1TaWduYWxlZFNpemUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiTWF4IEZpbGUgbGltaXQgcmVhY2hlZC4gTm8gbW9yZSBidWZmZXJzIHdpbGwgYmUgc2VudCB0byB0aGUgd3JpdGVyIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBpbnQzMl90IHNpemUgPSBidWZmZXJJbmZvW2lucHV0RnJhbWVJZF0uc2l6ZTsKICAgICAgICAgY2hhciAqZGF0YSA9IChjaGFyICopbWFsbG9jKHNpemUpOwogICAgICAgICBpZiAoIWRhdGEpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJVdGlsaXR5LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVXRpbGl0eS5oCmluZGV4IGNkZDYyNDYuLjZiNDU2ZmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJVdGlsaXR5LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclV0aWxpdHkuaApAQCAtMjcsMTMgKzI3LDE5IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuaD4KIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci11c2luZyBuYW1lc3BhY2Ugc3RkOworI2luY2x1ZGUgIldyaXRlckxpc3RlbmVyLmgiCiAKICNkZWZpbmUgQ09ERUNfQ09ORklHX0ZMQUcgMzIKIAorY29uc3RleHByIHVpbnQzMl90IGtNYXhUcmFja0NvdW50ID0gMjsKIGNvbnN0ZXhwciB1aW50MzJfdCBrTWF4Q1NEU3RybGVuID0gMTY7CiBjb25zdGV4cHIgdWludDMyX3Qga01heENvdW50ID0gMjA7Citjb25zdGV4cHIgaW50MzJfdCBrTWltZVNpemUgPSAxMjg7Citjb25zdGV4cHIgaW50MzJfdCBrRGVmYXVsdEludGVybGVhdmVEdXJhdGlvbiA9IDA7CisvLyBHZW9kYXRhIGlzIHNldCBhY2NvcmRpbmcgdG8gSVNPLTY3MDkgc3RhbmRhcmQuCitjb25zdGV4cHIgaW50MzJfdCBrRGVmYXVsdExhdGl0dWRleDEwMDAwID0gNTAwMDAwOworY29uc3RleHByIGludDMyX3Qga0RlZmF1bHRMb25naXR1ZGV4MTAwMDAgPSAxMDAwMDAwOworY29uc3RleHByIGZsb2F0IGtEZWZhdWx0RlBTID0gMzAuMGY7CiAKIHN0cnVjdCBCdWZmZXJJbmZvIHsKICAgICBpbnQzMl90IHNpemU7CkBAIC00MSw5ICs0NywxOCBAQAogICAgIGludDY0X3QgdGltZVVzOwogfTsKIAorc3RydWN0IGNvbmZpZ0Zvcm1hdCB7CisgICAgY2hhciBtaW1lW2tNaW1lU2l6ZV07CisgICAgaW50MzJfdCB3aWR0aDsKKyAgICBpbnQzMl90IGhlaWdodDsKKyAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQ7Cit9OworCiBpbnQzMl90IHNlbmRCdWZmZXJzVG9Xcml0ZXIoaWZzdHJlYW0gJmlucHV0U3RyZWFtLCB2ZWN0b3I8QnVmZmVySW5mbz4gJmJ1ZmZlckluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAmaW5wdXRGcmFtZUlkLCBzcDxNZWRpYUFkYXB0ZXI+ICZjdXJyZW50VHJhY2ssIGludDMyX3Qgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmFuZ2UsIGJvb2wgaXNQYXVzZWQgPSBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByYW5nZSwgYm9vbCBpc1BhdXNlZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFdyaXRlckxpc3RlbmVyPiBsaXN0ZW5lciA9IG51bGxwdHIpOwogCiBpbnQzMl90IHdyaXRlSGVhZGVyQnVmZmVycyhpZnN0cmVhbSAmaW5wdXRTdHJlYW0sIHZlY3RvcjxCdWZmZXJJbmZvPiAmYnVmZmVySW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgJmlucHV0RnJhbWVJZCwgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGludDMyX3QgbnVtQ3Nkcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwCmluZGV4IDRmNGNlYjEuLjY1OTBlZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMjIgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF90aW1lZHRleHRfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0X2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKIApAQCAtMjIsNSArNDEsMyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsibGlibWVkaWEiXSwKIH0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQuYnAKc2ltaWxhcml0eSBpbmRleCA2MCUKY29weSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9BbmRyb2lkLmJwCmNvcHkgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5icAppbmRleCA2NTU0OTFhLi5lOGVlMmVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkLmJwCkBAIC0xNCwzMyArMTQsNTEgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0X2xpY2Vuc2UiLAorICAgIF0sCit9CisKIGNjX3Rlc3QgewotICAgIG5hbWU6ICJNcGVnNEgyNjNEZWNvZGVyVGVzdCIsCisgICAgbmFtZTogIlRpbWVkVGV4dFVuaXRUZXN0IiwKICAgICBndGVzdDogdHJ1ZSwKIAogICAgIHNyY3M6IFsKLSAgICAgICAgIk1wZWc0SDI2M0RlY29kZXJUZXN0LmNwcCIsCisgICAgICAgICJUaW1lZFRleHRVbml0VGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICBdLAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJiaW5kZXIiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1Xbm8tbXVsdGljaGFyIiwKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCiAKICAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAotICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkVGVzdC54bWwKc2ltaWxhcml0eSBpbmRleCA3MSUKY29weSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwKY29weSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkVGVzdC54bWwKaW5kZXggN2ZmOTczMi4uMzY1NGUyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkVGVzdC54bWwKQEAgLTEzLDE5ICsxMywxOSBAQAogICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBNcDMgRGVjb2RlciB1bml0IHRlc3QiPgotICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJNcDNEZWNvZGVyVGVzdCIgLz4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIFRpbWVkVGV4dCB1bml0IHRlc3QiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJUaW1lZFRleHRVbml0VGVzdCIgLz4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJNcDNEZWNvZGVyVGVzdC0+L2RhdGEvbG9jYWwvdG1wL01wM0RlY29kZXJUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJUaW1lZFRleHRVbml0VGVzdC0+L2RhdGEvbG9jYWwvdG1wL1RpbWVkVGV4dFVuaXRUZXN0IiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKLSAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDNkZWMvdGVzdC9NcDNEZWNvZGVyVGVzdC56aXA/dW56aXA9dHJ1ZSIKLSAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvTXAzRGVjb2RlclRlc3RSZXMvIiAvPgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFVuaXRUZXN0LnppcD91bnppcD10cnVlIgorICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC9UaW1lZFRleHRVbml0VGVzdFJlcy8iIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAKICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9Ik1wM0RlY29kZXJUZXN0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWZsYWciIHZhbHVlPSItUCAvZGF0YS9sb2NhbC90bXAvTXAzRGVjb2RlclRlc3RSZXMvIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iVGltZWRUZXh0VW5pdFRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9UaW1lZFRleHRVbml0VGVzdFJlcy8iIC8+CiAgICAgPC90ZXN0PgogPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNzc0YmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9SRUFETUUubWQKQEAgLTAsMCArMSw0MCBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIFRpbWVkVGV4dCBVbml0IFRlc3QgOgorVGhlIFRpbWVkVGV4dCBVbml0IFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBUZXh0RGVzY3JpcHRpb24gY2xhc3MgYXZhaWxhYmxlIGluIGxpYnN0YWdlZnJpZ2h0LgorCitSdW4gdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB0aGUgdGVzdCBzdWl0ZToKK2BgYAorbSBUaW1lZFRleHRVbml0VGVzdAorYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9UaW1lZFRleHRVbml0VGVzdC9UaW1lZFRleHRVbml0VGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L1RpbWVkVGV4dFVuaXRUZXN0L1RpbWVkVGV4dFVuaXRUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VW5pdFRlc3QuemlwKS4KK0Rvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KKworYGBgCithZGIgcHVzaCBUaW1lZFRleHRVbml0VGVzdFJlcy8uIC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCit1c2FnZTogVGltZWRUZXh0VW5pdFRlc3QgLVAgXDxwYXRoX3RvX2ZvbGRlclw+CitgYGAKK2FkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvVGltZWRUZXh0VW5pdFRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL1RpbWVkVGV4dFVuaXRUZXN0UmVzLworYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBUaW1lZFRleHRVbml0VGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFRlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VGVzdEVudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyODBjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFRlc3RFbnZpcm9ubWVudC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fVElNRURURVhUX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisjZGVmaW5lIF9fVElNRURURVhUX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIFRpbWVkVGV4dFRlc3RFbnZpcm9ubWVudCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyAgcHVibGljOgorICAgIFRpbWVkVGV4dFRlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvIikge30KKworICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIgKl9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQorCisgIHByaXZhdGU6CisgICAgc3RyaW5nIHJlczsKK307CisKK2ludCBUaW1lZFRleHRUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJyZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgorICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gX19USU1FRFRFWFRfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFVuaXRUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFVuaXRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODVhZTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VW5pdFRlc3QuY3BwCkBAIC0wLDAgKzEsMzc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJUaW1lZFRleHRVbml0VGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisKKyNpbmNsdWRlICJ0aW1lZHRleHQvVGV4dERlc2NyaXB0aW9ucy5oIgorCisjaW5jbHVkZSAiVGltZWRUZXh0VGVzdEVudmlyb25tZW50LmgiCisKK2NvbnN0ZXhwciBpbnQzMl90IGtTdGFydFRpbWVNcyA9IDEwMDAwOworCitlbnVtIHsKKyAgICAvLyBUaGVzZSBrZXlzIG11c3QgYmUgaW4gc3luYyB3aXRoIHRoZSBrZXlzIGluCisgICAgLy8gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9ucy5oCisgICAgS0VZX0RJU1BMQVlfRkxBR1MgPSAxLAorICAgIEtFWV9TVFlMRV9GTEFHUyA9IDIsCisgICAgS0VZX0JBQ0tHUk9VTkRfQ09MT1JfUkdCQSA9IDMsCisgICAgS0VZX0hJR0hMSUdIVF9DT0xPUl9SR0JBID0gNCwKKyAgICBLRVlfU0NST0xMX0RFTEFZID0gNSwKKyAgICBLRVlfV1JBUF9URVhUID0gNiwKKyAgICBLRVlfU1RBUlRfVElNRSA9IDcsCisgICAgS0VZX1NUUlVDVF9CTElOS0lOR19URVhUX0xJU1QgPSA4LAorICAgIEtFWV9TVFJVQ1RfRk9OVF9MSVNUID0gOSwKKyAgICBLRVlfU1RSVUNUX0hJR0hMSUdIVF9MSVNUID0gMTAsCisgICAgS0VZX1NUUlVDVF9IWVBFUl9URVhUX0xJU1QgPSAxMSwKKyAgICBLRVlfU1RSVUNUX0tBUkFPS0VfTElTVCA9IDEyLAorICAgIEtFWV9TVFJVQ1RfU1RZTEVfTElTVCA9IDEzLAorICAgIEtFWV9TVFJVQ1RfVEVYVF9QT1MgPSAxNCwKKyAgICBLRVlfU1RSVUNUX0pVU1RJRklDQVRJT04gPSAxNSwKKyAgICBLRVlfU1RSVUNUX1RFWFQgPSAxNiwKKworICAgIEtFWV9HTE9CQUxfU0VUVElORyA9IDEwMSwKKyAgICBLRVlfTE9DQUxfU0VUVElORyA9IDEwMiwKKyAgICBLRVlfU1RBUlRfQ0hBUiA9IDEwMywKKyAgICBLRVlfRU5EX0NIQVIgPSAxMDQsCisgICAgS0VZX0ZPTlRfSUQgPSAxMDUsCisgICAgS0VZX0ZPTlRfU0laRSA9IDEwNiwKKyAgICBLRVlfVEVYVF9DT0xPUl9SR0JBID0gMTA3LAorfTsKKworc3RydWN0IEZvbnRJbmZvIHsKKyAgICBpbnQzMl90IGRpc3BsYXlGbGFnID0gLTE7CisgICAgaW50MzJfdCBob3Jpem9udGFsSnVzdGlmaWNhdGlvbiA9IC0xOworICAgIGludDMyX3QgdmVydGljYWxKdXN0aWZpY2F0aW9uID0gLTE7CisgICAgaW50MzJfdCByZ2JhQmFja2dyb3VuZCA9IC0xOworICAgIGludDMyX3QgbGVmdFBvcyA9IC0xOworICAgIGludDMyX3QgdG9wUG9zID0gLTE7CisgICAgaW50MzJfdCBib3R0b21Qb3MgPSAtMTsKKyAgICBpbnQzMl90IHJpZ2h0UG9zID0gLTE7CisgICAgaW50MzJfdCBzdGFydGNoYXIgPSAtMTsKKyAgICBpbnQzMl90IGVuZENoYXIgPSAtMTsKKyAgICBpbnQzMl90IGZvbnRJZCA9IC0xOworICAgIGludDMyX3QgZmFjZVN0eWxlID0gLTE7CisgICAgaW50MzJfdCBmb250U2l6ZSA9IC0xOworICAgIGludDMyX3QgcmdiYVRleHQgPSAtMTsKKyAgICBpbnQzMl90IGVudHJ5Q291bnQgPSAtMTsKK307CisKK3N0cnVjdCBGb250UmVjb3JkIHsKKyAgICBpbnQzMl90IGZvbnRJRCA9IC0xOworICAgIGludDMyX3QgZm9udE5hbWVMZW5ndGggPSAtMTsKKyAgICBjb25zdCB1aW50OF90ICpmb250ID0gbnVsbHB0cjsKK307CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0aWMgVGltZWRUZXh0VGVzdEVudmlyb25tZW50ICpnRW52ID0gbnVsbHB0cjsKKworY2xhc3MgVGltZWRUZXh0VW5pdFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPC8qZmlsZW5hbWUqLyBzdHJpbmc+IHsKKyAgcHVibGljOgorICAgIFRpbWVkVGV4dFVuaXRUZXN0KCl7fTsKKworICAgIH5UaW1lZFRleHRVbml0VGVzdCgpIHsKKyAgICAgICAgaWYgKG1FbGVTdHJlYW0pIG1FbGVTdHJlYW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIG1JbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpOworICAgICAgICBtRWxlU3RyZWFtLm9wZW4obUlucHV0RmlsZU5hbWUsIGlmc3RyZWFtOjpiaW5hcnkpOworICAgICAgICBBU1NFUlRfRVEobUVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpIDw8ICJGYWlsZWQgdG8gb3BlbiAiIDw8IEdldFBhcmFtKCk7CisKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGF0KG1JbnB1dEZpbGVOYW1lLmNfc3RyKCksICZidWYpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRmFpbGVkIHRvIGdldCBwcm9wZXJ0aWVzIG9mIGlucHV0IGZpbGU6ICIgPDwgR2V0UGFyYW0oKTsKKyAgICAgICAgbUZpbGVTaXplID0gYnVmLnN0X3NpemU7CisgICAgICAgIEFMT0dJKCJTaXplIG9mIHRoZSBpbnB1dCBmaWxlICVzID0gJXp1IiwgR2V0UGFyYW0oKS5jX3N0cigpLCBtRmlsZVNpemUpOworICAgIH0KKworICAgIHN0cmluZyBtSW5wdXRGaWxlTmFtZTsKKyAgICBzaXplX3QgbUZpbGVTaXplOworICAgIGlmc3RyZWFtIG1FbGVTdHJlYW07Cit9OworCitjbGFzcyBTUlREZXNjcmlwdGlvblRlc3QgOiBwdWJsaWMgVGltZWRUZXh0VW5pdFRlc3QgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBUaW1lZFRleHRVbml0VGVzdDo6U2V0VXAoKTsgfQorfTsKKworY2xhc3MgVGV4dDNHUFBEZXNjcmlwdGlvblRlc3QgOiBwdWJsaWMgVGltZWRUZXh0VW5pdFRlc3QgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBUaW1lZFRleHRVbml0VGVzdDo6U2V0VXAoKTsgfQorfTsKKworVEVTVF9QKFNSVERlc2NyaXB0aW9uVGVzdCwgZXh0cmFjdFNSVERlc2NyaXB0aW9uVGVzdCkgeworICAgIGNoYXIgZGF0YVttRmlsZVNpemVdOworICAgIG1FbGVTdHJlYW0ucmVhZChkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmdjb3VudCgpLCBtRmlsZVNpemUpOworCisgICAgUGFyY2VsIHBhcmNlbDsKKyAgICBpbnQzMl90IGZsYWcgPSBUZXh0RGVzY3JpcHRpb25zOjpPVVRfT0ZfQkFORF9URVhUX1NSVCB8IFRleHREZXNjcmlwdGlvbnM6OkxPQ0FMX0RFU0NSSVBUSU9OUzsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBUZXh0RGVzY3JpcHRpb25zOjpnZXRQYXJjZWxPZkRlc2NyaXB0aW9ucygoY29uc3QgdWludDhfdCAqKWRhdGEsIG1GaWxlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnLCBrU3RhcnRUaW1lTXMsICZwYXJjZWwpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJnZXRQYXJjZWxPZkRlc2NyaXB0aW9ucyByZXR1cm5lZCBlcnJvciI7CisgICAgQUxPR0koIlNpemUgb2YgdGhlIFBhcmNlbDogJXp1IiwgcGFyY2VsLmRhdGFTaXplKCkpOworICAgIEFTU0VSVF9HVChwYXJjZWwuZGF0YVNpemUoKSwgMCkgPDwgIlBhcmNlbCBpcyBlbXB0eSI7CisKKyAgICBwYXJjZWwuc2V0RGF0YVBvc2l0aW9uKDApOworICAgIGludDMyX3Qga2V5ID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShrZXksIEtFWV9MT0NBTF9TRVRUSU5HKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIGtleSI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUQVJUX1RJTUUpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgc3RhcnQgdGltZSBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGtTdGFydFRpbWVNcykgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB0aW1pbmdzIjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfU1RSVUNUX1RFWFQpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgc3RydWN0IHRleHQga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBtRmlsZVNpemUpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdGV4dCBkYXRhIjsKKyAgICBpbnQzMl90IGZpbGVTaXplID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShmaWxlU2l6ZSwgbUZpbGVTaXplKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIGZpbGUgc2l6ZSB2YWx1ZSI7CisgICAgdWludDhfdCB0bXBEYXRhW2ZpbGVTaXplXTsKKyAgICBzdGF0dXMgPSBwYXJjZWwucmVhZCgodm9pZCAqKXRtcERhdGEsIGZpbGVTaXplKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRmFpbGVkIHRvIHJlYWQgdGhlIGRhdGEgZnJvbSBwYXJjZWwiOworICAgIC8vIFRvIG1ha2Ugc3VyZSBlbmQgb2YgcGFyY2VsIGlzIHJlYWNoZWQKKyAgICBBU1NFUlRfRVEocGFyY2VsLmRhdGFBdmFpbCgpLCAwKSA8PCAiUGFyY2VsIGhhcyBzb21lIGRhdGEgbGVmdCB0byByZWFkIjsKK30KKworLy8gVGhpcyB0ZXN0IHVzZXMgdGhlIHByb3BlcnRpZXMgb2YgdHgzZyBib3ggbWVudGlvbmVkIGluIDNHUFAgVGltZWQgVGV4dCBGb3JtYXQKKy8vIFNwZWNpZmljYXRpb24jOiAyNi4yNDUgLyBTZWN0aW9uOiA1LjE2KFNhbXBsZSBEZXNjcmlwdGlvbiBGb3JtYXQpCisvLyBodHRwczovL3d3dy4zZ3BwLm9yZy9mdHAvU3BlY3MvYXJjaGl2ZS8yNl9zZXJpZXMvMjYuMjQ1LworCitURVNUX1AoVGV4dDNHUFBEZXNjcmlwdGlvblRlc3QsIFRleHQzR1BQR2xvYmFsRGVzY3JpcHRpb25UZXN0KSB7CisgICAgY2hhciBkYXRhW21GaWxlU2l6ZV07CisgICAgbUVsZVN0cmVhbS5yZWFkKGRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uZ2NvdW50KCksIG1GaWxlU2l6ZSk7CisKKyAgICBjb25zdCB1aW50OF90ICp0bXBEYXRhID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworICAgIGludDMyX3QgcmVtYWluaW5nID0gbUZpbGVTaXplOworICAgIEZvbnRJbmZvIGZvbnRJbmZvOworICAgIHZlY3RvcjxGb250UmVjb3JkPiBmb250UmVjb3JkRW50cmllczsKKworICAgIC8vIFNraXBwaW5nIHRoZSBieXRlcyBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIHN1YmJveCh0eDNnKQorICAgIHRtcERhdGEgKz0gMTY7CisgICAgcmVtYWluaW5nIC09IDE2OworCisgICAgZm9udEluZm8uZGlzcGxheUZsYWcgPSBVMzJfQVQodG1wRGF0YSk7CisgICAgQUxPR0koIkRpc3BsYXkgZmxhZzogJWQiLCBmb250SW5mby5kaXNwbGF5RmxhZyk7CisgICAgZm9udEluZm8uaG9yaXpvbnRhbEp1c3RpZmljYXRpb24gPSB0bXBEYXRhWzRdOworICAgIEFMT0dJKCJIb3Jpem9udGFsIEp1c3RpZmljYXRpb246ICVkIiwgZm9udEluZm8uaG9yaXpvbnRhbEp1c3RpZmljYXRpb24pOworICAgIGZvbnRJbmZvLnZlcnRpY2FsSnVzdGlmaWNhdGlvbiA9IHRtcERhdGFbNV07CisgICAgQUxPR0koIlZlcnRpY2FsIEp1c3RpZmljYXRpb246ICVkIiwgZm9udEluZm8udmVydGljYWxKdXN0aWZpY2F0aW9uKTsKKyAgICBmb250SW5mby5yZ2JhQmFja2dyb3VuZCA9CisgICAgICAgICAgICAqKHRtcERhdGEgKyA2KSA8PCAyNCB8ICoodG1wRGF0YSArIDcpIDw8IDE2IHwgKih0bXBEYXRhICsgOCkgPDwgOCB8ICoodG1wRGF0YSArIDkpOworICAgIEFMT0dJKCJyZ2JhIHZhbHVlIG9mIGJhY2tncm91bmQ6ICVkIiwgZm9udEluZm8ucmdiYUJhY2tncm91bmQpOworCisgICAgdG1wRGF0YSArPSAxMDsKKyAgICByZW1haW5pbmcgLT0gMTA7CisKKyAgICBpZiAocmVtYWluaW5nID49IDgpIHsKKyAgICAgICAgZm9udEluZm8ubGVmdFBvcyA9IFUxNl9BVCh0bXBEYXRhKTsKKyAgICAgICAgQUxPR0koIkxlZnQ6ICVkIiwgZm9udEluZm8ubGVmdFBvcyk7CisgICAgICAgIGZvbnRJbmZvLnRvcFBvcyA9IFUxNl9BVCh0bXBEYXRhICsgMik7CisgICAgICAgIEFMT0dJKCJUb3A6ICVkIiwgZm9udEluZm8udG9wUG9zKTsKKyAgICAgICAgZm9udEluZm8uYm90dG9tUG9zID0gVTE2X0FUKHRtcERhdGEgKyA0KTsKKyAgICAgICAgQUxPR0koIkJvdHRvbTogJWQiLCBmb250SW5mby5ib3R0b21Qb3MpOworICAgICAgICBmb250SW5mby5yaWdodFBvcyA9IFUxNl9BVCh0bXBEYXRhICsgNik7CisgICAgICAgIEFMT0dJKCJSaWdodDogJWQiLCBmb250SW5mby5yaWdodFBvcyk7CisKKyAgICAgICAgdG1wRGF0YSArPSA4OworICAgICAgICByZW1haW5pbmcgLT0gODsKKworICAgICAgICBpZiAocmVtYWluaW5nID49IDEyKSB7CisgICAgICAgICAgICBmb250SW5mby5zdGFydGNoYXIgPSBVMTZfQVQodG1wRGF0YSk7CisgICAgICAgICAgICBBTE9HSSgiU3RhcnQgY2hhcmFjdGVyOiAlZCIsIGZvbnRJbmZvLnN0YXJ0Y2hhcik7CisgICAgICAgICAgICBmb250SW5mby5lbmRDaGFyID0gVTE2X0FUKHRtcERhdGEgKyAyKTsKKyAgICAgICAgICAgIEFMT0dJKCJFbmQgY2hhcmFjdGVyOiAlZCIsIGZvbnRJbmZvLmVuZENoYXIpOworICAgICAgICAgICAgZm9udEluZm8uZm9udElkID0gVTE2X0FUKHRtcERhdGEgKyA0KTsKKyAgICAgICAgICAgIEFMT0dJKCJWYWx1ZSBvZiBmb250IElkZW50aWZpZXI6ICVkIiwgZm9udEluZm8uZm9udElkKTsKKyAgICAgICAgICAgIGZvbnRJbmZvLmZhY2VTdHlsZSA9ICoodG1wRGF0YSArIDYpOworICAgICAgICAgICAgQUxPR0koIkZhY2Ugc3R5bGUgZmxhZyA6ICVkIiwgZm9udEluZm8uZmFjZVN0eWxlKTsKKyAgICAgICAgICAgIGZvbnRJbmZvLmZvbnRTaXplID0gKih0bXBEYXRhICsgNyk7CisgICAgICAgICAgICBBTE9HSSgiU2l6ZSBvZiB0aGUgZm9udDogJWQiLCBmb250SW5mby5mb250U2l6ZSk7CisgICAgICAgICAgICBmb250SW5mby5yZ2JhVGV4dCA9ICoodG1wRGF0YSArIDgpIDw8IDI0IHwgKih0bXBEYXRhICsgOSkgPDwgMTYgfCAqKHRtcERhdGEgKyAxMCkgPDwgOCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoodG1wRGF0YSArIDExKTsKKyAgICAgICAgICAgIEFMT0dJKCJyZ2JhIHZhbHVlIG9mIHRoZSB0ZXh0OiAlZCIsIGZvbnRJbmZvLnJnYmFUZXh0KTsKKworICAgICAgICAgICAgdG1wRGF0YSArPSAxMjsKKyAgICAgICAgICAgIHJlbWFpbmluZyAtPSAxMjsKKworICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA+PSAxMCkgeworICAgICAgICAgICAgICAgIC8vIFNraXBwaW5nIHRoZSBieXRlcyBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIHN1YmJveChmdGFiKQorICAgICAgICAgICAgICAgIGZvbnRJbmZvLmVudHJ5Q291bnQgPSBVMTZfQVQodG1wRGF0YSArIDgpOworICAgICAgICAgICAgICAgIEFMT0dJKCJWYWx1ZSBvZiBlbnRyeSBjb3VudDogJWQiLCBmb250SW5mby5lbnRyeUNvdW50KTsKKworICAgICAgICAgICAgICAgIHRtcERhdGEgKz0gMTA7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IDEwOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZm9udEluZm8uZW50cnlDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCAzKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0ZW1wRm9udElEID0gVTE2X0FUKHRtcERhdGEpOworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiRm9udCBJZDogJWQiLCB0ZW1wRm9udElEKTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0ZW1wRm9udE5hbWVMZW5ndGggPSAqKHRtcERhdGEgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIkxlbmd0aCBvZiBmb250IG5hbWU6ICVkIiwgdGVtcEZvbnROYW1lTGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICB0bXBEYXRhICs9IDM7CisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSAzOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCB0ZW1wRm9udE5hbWVMZW5ndGgpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp0bXBGb250ID0gdG1wRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqdG1wRm9udE5hbWUgPSBzdHJuZHVwKChjb25zdCBjaGFyICopdG1wRm9udCwgdGVtcEZvbnROYW1lTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUX05FKHRtcEZvbnROYW1lLCBudWxscHRyKSA8PCAiRm9udCBOYW1lIGlzIG51bGwiOworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiRm9udE5hbWUgPSAlcyIsIHRtcEZvbnROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZSh0bXBGb250TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHRtcERhdGEgKz0gdGVtcEZvbnROYW1lTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gdGVtcEZvbnROYW1lTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBmb250UmVjb3JkRW50cmllcy5wdXNoX2JhY2soe3RlbXBGb250SUQsIHRlbXBGb250TmFtZUxlbmd0aCwgdG1wRm9udH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFBhcmNlbCBwYXJjZWw7CisgICAgaW50MzJfdCBmbGFnID0gVGV4dERlc2NyaXB0aW9uczo6SU5fQkFORF9URVhUXzNHUFAgfCBUZXh0RGVzY3JpcHRpb25zOjpHTE9CQUxfREVTQ1JJUFRJT05TOworICAgIHN0YXR1c190IHN0YXR1cyA9IFRleHREZXNjcmlwdGlvbnM6OmdldFBhcmNlbE9mRGVzY3JpcHRpb25zKChjb25zdCB1aW50OF90ICopZGF0YSwgbUZpbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcsIGtTdGFydFRpbWVNcywgJnBhcmNlbCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgImdldFBhcmNlbE9mRGVzY3JpcHRpb25zIHJldHVybmVkIGVycm9yIjsKKyAgICBBTE9HSSgiU2l6ZSBvZiB0aGUgUGFyY2VsOiAlenUiLCBwYXJjZWwuZGF0YVNpemUoKSk7CisgICAgQVNTRVJUX0dUKHBhcmNlbC5kYXRhU2l6ZSgpLCAwKSA8PCAiUGFyY2VsIGlzIGVtcHR5IjsKKworICAgIHBhcmNlbC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgaW50MzJfdCBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX0dMT0JBTF9TRVRUSU5HKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIGtleSI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX0RJU1BMQVlfRkxBR1MpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgRElTUExBWSBGTEFHUyBLZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLmRpc3BsYXlGbGFnKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB2YWx1ZSBvZiBkaXNwbGF5IGZsYWciOworCisgICAga2V5ID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShrZXksIEtFWV9TVFJVQ1RfSlVTVElGSUNBVElPTikgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBTVFJVQ1QgSlVTVElGSUNBVElPTiBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLmhvcml6b250YWxKdXN0aWZpY2F0aW9uKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB2YWx1ZSBvZiBIb3Jpem9udGFsIGp1c3RpZmljYXRpb24iOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLnZlcnRpY2FsSnVzdGlmaWNhdGlvbikKKyAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2YgVmVydGljYWwganVzdGlmaWNhdGlvbiI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX0JBQ0tHUk9VTkRfQ09MT1JfUkdCQSkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBCQUNLR1JPVU5EIENPTE9SIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8ucmdiYUJhY2tncm91bmQpCisgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHJnYmEgYmFja2dyb3VuZCBjb2xvciB2YWx1ZSI7CisKKyAgICBpZiAocGFyY2VsLmRhdGFBdmFpbCgpID09IDApIHsKKyAgICAgICAgQUxPR1YoIkNvbXBsZXRlZCByZWFkaW5nIHRoZSBwYXJjZWwiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfU1RSVUNUX1RFWFRfUE9TKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIFNUUlVDVCBURVhUIFBPU0lUSU9OIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8ubGVmdFBvcykKKyAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgcmdiYSBiYWNrZ3JvdW5kIGNvbG9yIHZhbHVlIjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby50b3BQb3MpCisgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHJnYmEgYmFja2dyb3VuZCBjb2xvciB2YWx1ZSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8uYm90dG9tUG9zKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCByZ2JhIGJhY2tncm91bmQgY29sb3IgdmFsdWUiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLnJpZ2h0UG9zKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCByZ2JhIGJhY2tncm91bmQgY29sb3IgdmFsdWUiOworCisgICAgaWYgKHBhcmNlbC5kYXRhQXZhaWwoKSA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJDb21wbGV0ZWQgcmVhZGluZyB0aGUgcGFyY2VsIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUUlVDVF9TVFlMRV9MSVNUKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIFNUUlVDVCBTVFlMRSBMSVNUIGtleSI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUQVJUX0NIQVIpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgU1RBUlQgQ0hBUiBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLnN0YXJ0Y2hhcikKKyAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2Ygc3RhcnQgY2hhcmFjdGVyIjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfRU5EX0NIQVIpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgRU5EIENIQVIga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby5lbmRDaGFyKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIGVuZCBjaGFyYWN0ZXIiOworCisgICAga2V5ID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShrZXksIEtFWV9GT05UX0lEKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIEZPTlQgSUQga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby5mb250SWQpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2YgZm9udCBJZCI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUWUxFX0ZMQUdTKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIFNUWUxFIEZMQUdTIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8uZmFjZVN0eWxlKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIHN0eWxlIGZsYWdzIjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfRk9OVF9TSVpFKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIEZPTlQgU0laRSBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLmZvbnRTaXplKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIGZvbnQgc2l6ZSI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1RFWFRfQ09MT1JfUkdCQSkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBURVhUIENPTE9SIFJHQkEga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby5yZ2JhVGV4dCkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCByZ2JhIHRleHQgY29sb3IgdmFsdWUiOworCisgICAgaWYgKHBhcmNlbC5kYXRhQXZhaWwoKSA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJDb21wbGV0ZWQgcmVhZGluZyB0aGUgcGFyY2VsIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUUlVDVF9GT05UX0xJU1QpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgU1RSVUNUIEZPTlQgTElTVCBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLmVudHJ5Q291bnQpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2YgZW50cnkgY291bnQiOworICAgIEFTU0VSVF9FUShmb250SW5mby5lbnRyeUNvdW50LCBmb250UmVjb3JkRW50cmllcy5zaXplKCkpCisgICAgICAgICAgICA8PCAiQXJyYXkgc2l6ZSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBudW1iZXIgb2YgZW50cmllcyI7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZm9udEluZm8uZW50cnlDb3VudDsgaSsrKSB7CisgICAgICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRSZWNvcmRFbnRyaWVzW2ldLmZvbnRJRCkKKyAgICAgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIGZvbnQgSWQiOworICAgICAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250UmVjb3JkRW50cmllc1tpXS5mb250TmFtZUxlbmd0aCkKKyAgICAgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIGZvbnQgbmFtZSBsZW5ndGgiOworICAgICAgICB1aW50OF90IGZvbnROYW1lW2ZvbnRSZWNvcmRFbnRyaWVzW2ldLmZvbnROYW1lTGVuZ3RoXTsKKyAgICAgICAgLy8gd3JpdHRlbiB3aXRoIHdyaXRlQnl0ZUFycmF5KCkgd3JpdGVzIGNvdW50LCB0aGVuIHRoZSBhY3R1YWwgZGF0YQorICAgICAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250UmVjb3JkRW50cmllc1tpXS5mb250TmFtZUxlbmd0aCk7CisgICAgICAgIHN0YXR1cyA9IHBhcmNlbC5yZWFkKCh2b2lkICopZm9udE5hbWUsIGZvbnRSZWNvcmRFbnRyaWVzW2ldLmZvbnROYW1lTGVuZ3RoKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkZhaWxlZCB0byByZWFkIHRoZSBmb250IG5hbWUgZnJvbSBwYXJjZWwiOworICAgICAgICBBU1NFUlRfRVEobWVtY21wKGZvbnROYW1lLCBmb250UmVjb3JkRW50cmllc1tpXS5mb250LCBmb250UmVjb3JkRW50cmllc1tpXS5mb250TmFtZUxlbmd0aCksCisgICAgICAgICAgICAgICAgICAwKQorICAgICAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgZm9udCI7CisgICAgfQorICAgIC8vIFRvIG1ha2Ugc3VyZSBlbmQgb2YgcGFyY2VsIGlzIHJlYWNoZWQKKyAgICBBU1NFUlRfRVEocGFyY2VsLmRhdGFBdmFpbCgpLCAwKSA8PCAiUGFyY2VsIGhhcyBzb21lIGRhdGEgbGVmdCB0byByZWFkIjsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFRpbWVkVGV4dFVuaXRUZXN0QWxsLCBTUlREZXNjcmlwdGlvblRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoKCJzYW1wbGVUZXN0MS5zcnQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInNhbXBsZVRlc3QyLnNydCIpKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChUaW1lZFRleHRVbml0VGVzdEFsbCwgVGV4dDNHUFBEZXNjcmlwdGlvblRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoKCJ0eDNnQm94MSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgidHgzZ0JveDIiKSkpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IFRpbWVkVGV4dFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR1YoIlRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQuYnAKaW5kZXggMmNlYmU4Zi4uNjg3NTJjZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfd2VibSIsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vdGVzdHMvQW5kcm9pZC5icAppbmRleCA1MTgzYTQ5Li40NDQzNzY2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiV2VibUZyYW1lVGhyZWFkVW5pdFRlc3QiLAogICAgIGd0ZXN0OiB0cnVlLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dyaXRlcl9mdXp6ZXJzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMzYjg4OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dyaXRlcl9mdXp6ZXJzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSJdLAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogIndyaXRlci1mdXp6ZXJiYXNlLWRlZmF1bHRzIiwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAid3JpdGVyLWZ1enplci1kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsid3JpdGVyLWZ1enplcmJhc2UtZGVmYXVsdHMiXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlid3JpdGVyZnV6emVyYmFzZSIsCisgICAgXSwKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAorICAgIH0sCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlid3JpdGVyZnV6emVyYmFzZSIsCisgICAgZGVmYXVsdHM6IFsid3JpdGVyLWZ1enplcmJhc2UtZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJXcml0ZXJGdXp6ZXJCYXNlLmNwcCIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImFtcm5iX3dyaXRlcl9mdXp6ZXIiLAorICAgIGRlZmF1bHRzOiBbIndyaXRlci1mdXp6ZXItZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhbXJfd3JpdGVyX2Z1enplci5jcHAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREFNUk5CIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiYW1yd2Jfd3JpdGVyX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsid3JpdGVyLWZ1enplci1kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFtcl93cml0ZXJfZnV6emVyLmNwcCIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZSA6ICJtcGVnNF93cml0ZXJfZnV6emVyIiwKKyAgICBkZWZhdWx0cyA6IFsid3JpdGVyLWZ1enplci1kZWZhdWx0cyJdLAorICAgIHNyY3MgOiBbCisgICAgICAgICJtcGVnNF93cml0ZXJfZnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZSA6ICJvZ2dfd3JpdGVyX2Z1enplciIsCisgICAgZGVmYXVsdHMgOiBbIndyaXRlci1mdXp6ZXItZGVmYXVsdHMiXSwKKyAgICBzcmNzIDogWworICAgICAgICAib2dnX3dyaXRlcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJvZ2ciLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWUgOiAid2VibV93cml0ZXJfZnV6emVyIiwKKyAgICBkZWZhdWx0cyA6IFsid3JpdGVyLWZ1enplci1kZWZhdWx0cyJdLAorICAgIHNyY3MgOiBbCisgICAgICAgICJ3ZWJtX3dyaXRlcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF93ZWJtIiwKKyAgICAgICAgImxpYmRhdGFzb3VyY2UiLAorICAgIF0sCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmOTVlY2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9SRUFETUUubWQKQEAgLTAsMCArMSwxMDAgQEAKKyMgRnV6emVyIGZvciB3cml0ZXJzCisKKyMjIFRhYmxlIG9mIGNvbnRlbnRzCisrICBbbGlid3JpdGVyZnV6emVyYmFzZV0oI1dyaXRlckZ1enplckJhc2UpCisrICBbQW1yIFdyaXRlcl0oI2FtcldyaXRlckZ1enplcikKKysgIFtNUEVHNCBXcml0ZXJdKCNtcGVnNFdyaXRlckZ1enplcikKKysgIFtPR0cgV3JpdGVyXSgjb2dnV3JpdGVyRnV6emVyKQorKyAgW1dFQk0gV3JpdGVyXSgjd2VibVdyaXRlckZ1enplcikKKworIyA8YSBuYW1lPSJXcml0ZXJGdXp6ZXJCYXNlIj48L2E+IEZ1enplciBmb3IgbGlid3JpdGVyZnV6emVyYmFzZQorQWxsIHRoZSB3cml0ZXJzIGhhdmUgYSBjb21tb24gQVBJIC0gY3JlYXRpbmcgYSB3cml0ZXIsIGFkZGluZyBhIHNvdXJjZSBmb3IKK2FsbCB0aGUgdHJhY2tzLCBldGMuIFRoZXNlIGNvbW1vbiBBUElzIGhhdmUgYmVlbiBhYnN0cmFjdGVkIGluIGEgYmFzZSBjbGFzcworY2FsbGVkIGBXcml0ZXJGdXp6ZXJCYXNlYCB0byBlbnN1cmUgY29kZSBpcyByZXVzZWQgYmV0d2VlbiBmdXp6ZXIgcGx1Z2lucy4KKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIHdyaXRlcnMgaXMgZGVzaWduZWQgYmFzZWQgb24gdGhlIHVuZGVyc3RhbmRpbmcgb2YgdGhlCit3cml0ZXIgYW5kIHRyaWVzIHRvIGFjaGlldmUgdGhlIGZvbGxvd2luZzoKKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgbm90IGhhcmRjb2RlZCwgYnV0IGluc3RlYWQgc2VsZWN0ZWQgYmFzZWQgb24KK2luY29taW5nIGRhdGEuIFRoaXMgZW5zdXJlcyBtb3JlIGNvZGUgcGF0aHMgYXJlIHJlYWNoZWQgYnkgdGhlIGZ1enplci4KKworRnV6emVyIGZvciB3cml0ZXJzIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKzEuIFRyYWNrIE1pbWUgKHBhcmFtZXRlciBuYW1lOiBgbWltZWApCisyLiBDaGFubmVsIENvdW50IChwYXJhbWV0ZXIgbmFtZTogYGNoYW5uZWwtY291bnRgKQorMy4gU2FtcGxlIFJhdGUgKHBhcmFtZXRlciBuYW1lOiBgc2FtcGxlLXJhdGVgKQorNC4gRnJhbWUgSGVpZ2h0IChwYXJhbWV0ZXIgbmFtZTogYGhlaWdodGApCis1LiBGcmFtZSBXaWR0aCAocGFyYW1ldGVyIG5hbWU6IGB3aWR0aGApCisKK3wgUGFyYW1ldGVyfCBWYWxpZCBWYWx1ZXN8IENvbmZpZ3VyZWQgVmFsdWV8Cit8LS0tLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLXwgLS0tLS0gfAorfCBgbWltZWAgfCAwLiBgYXVkaW8vM2dwcGAgMS4gYGF1ZGlvL2Ftci13YmAgMi4gYGF1ZGlvL3ZvcmJpc2AgMy4gYGF1ZGlvL29wdXNgIDQuIGBhdWRpby9tcDRhLWxhdG1gIDUuIGBhdWRpby9tcGVnYCA2LiBgYXVkaW8vbXBlZy1MMWAgNy4gYGF1ZGlvL21wZWctTDJgIDguIGBhdWRpby9taWRpYCA5LiBgYXVkaW8vcWNlbHBgIDEwLiBgYXVkaW8vZzcxMS1hbGF3YCAxMS4gYGF1ZGlvL2c3MTEtbWxhd2AgMTIuIGBhdWRpby9mbGFjYCAxMy4gYGF1ZGlvL2FhYy1hZHRzYCAxNC4gYGF1ZGlvL2dzbWAgMTUuIGBhdWRpby9hYzNgIDE2LiBgYXVkaW8vZWFjM2AgMTcuIGBhdWRpby9lYWMzLWpvY2AgMTguIGBhdWRpby9hYzRgIDE5LiBgYXVkaW8vc2NyYW1ibGVkYCAyMC4gYGF1ZGlvL2FsYWNgIDIxLiBgYXVkaW8veC1tcy13bWFgIDIyLiBgYXVkaW8veC1hZHBjbS1tc2AgMjMuIGBhdWRpby94LWFkcGNtLWR2aS1pbWFgIDI0LiBgdmlkZW8vYXZjYCAyNS4gYHZpZGVvL2hldmNgIDI2LiBgdmlkZW8vbXA0di1lc2AgMjcuIGB2aWRlby8zZ3BwYCAyOC4gYHZpZGVvL3gtdm5kLm9uMi52cDhgIDI5LiBgdmlkZW8veC12bmQub24yLnZwOWAgMzAuIGB2aWRlby9hdjAxYCAzMS4gYHZpZGVvL21wZWcyYCAzMi4gYHZpZGVvL2RvbGJ5LXZpc2lvbmAgMzMuIGB2aWRlby9zY3JhbWJsZWRgIDM0LiBgdmlkZW8vZGl2eGAgMzUuIGB2aWRlby9kaXZ4M2AgMzYuIGB2aWRlby94dmlkYCAzNy4gYHZpZGVvL3gtbW90aW9uLWpwZWdgIDM4LiBgdGV4dC8zZ3BwLXR0YCAzOS4gYGFwcGxpY2F0aW9uL3gtc3VicmlwYCA0MC4gYHRleHQvdnR0YCA0MS4gYHRleHQvY2VhLTYwOGAgNDIuIGB0ZXh0L2NlYS03MDhgIDQzLiBgYXBwbGljYXRpb24veC1pZDN2NGAgfCBBbGwgdGhlIGJpdHMgb2YgMm5kIGJ5dGUgb2YgZGF0YSBmb3IgZmlyc3QgdHJhY2sgYW5kIDExdGggYnl0ZSBvZiBkYXRhIGZvciBzZWNvbmQgdHJhY2sgYW5kIDIwdGggYnl0ZSBvZiBkYXRhIGZvciB0aGlyZCB0cmFjayhpZiBwcmVzZW50KSBtb2R1bHVzIDQ0IHwKK3wgYGNoYW5uZWwtY291bnRgIHwgSW4gdGhlIHJhbmdlIGAwIHRvIElOVDMyX01BWGAgfCBBbGwgdGhlIGJpdHMgb2YgM3JkIGJ5dGUgdG8gNnRoIGJ5dGVzIG9mIGRhdGEgaWYgZmlyc3QgdHJhY2sgaXMgYXVkaW8gYW5kIDEydGggdG8gMTV0aCBieXRlcyBvZiBkYXRhIGlmIHNlY29uZCB0cmFjayBpcyBhdWRpbyB8Cit8IGBzYW1wbGUtcmF0ZWAgfCBJbiB0aGUgcmFuZ2UgYDEgdG8gSU5UMzJfTUFYYCB8IEFsbCB0aGUgYml0cyBvZiA3dGggYnl0ZSB0byAxMHRoIGJ5dGVzIG9mIGRhdGEgaWYgZmlyc3QgdHJhY2sgaXMgYXVkaW8gYW5kIDE2dGggdG8gMTl0aCBieXRlcyBvZiBkYXRhIGlmIHNlY29uZCB0cmFjayBpcyBhdWRpbyB8Cit8IGBoZWlnaHRgIHwgSW4gdGhlIHJhbmdlIGAwIHRvIElOVDMyX01BWGAgfCBBbGwgdGhlIGJpdHMgb2YgM3JkIGJ5dGUgdG8gNnRoIGJ5dGVzIG9mIGRhdGEgaWYgZmlyc3QgdHJhY2sgaXMgdmlkZW8gYW5kIDEydGggdG8gMTV0aCBieXRlcyBvZiBkYXRhIGlmIHNlY29uZCB0cmFjayBpcyB2aWRlbyB8Cit8IGB3aWR0aGAgfCBJbiB0aGUgcmFuZ2UgYDAgdG8gSU5UMzJfTUFYYCB8IEFsbCB0aGUgYml0cyBvZiA3dGggYnl0ZSB0byAxMHRoIGJ5dGVzIG9mIGRhdGEgaWYgZmlyc3QgdHJhY2sgaXMgdmlkZW8gYW5kIDE2dGggdG8gMTl0aCBieXRlcyBvZiBkYXRhIGlmIHNlY29uZCB0cmFjayBpcyB2aWRlbyB8CisKK1RoaXMgYWxzbyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiBpcyBhbHdheXMgZGV0ZXJtaW5pc3RpYyBmb3IgYW55IGdpdmVuIGlucHV0LgorCisjIyMjIyBNYXhpbWl6ZSB1dGlsaXphdGlvbiBvZiBpbnB1dCBkYXRhCitUaGUgcGx1Z2luIGRpdmlkZXMgdGhlIGVudGlyZSBpbnB1dCBkYXRhIGludG8gZnJhbWVzIGJhc2VkIG9uIGZyYW1lIG1hcmtlcnMuCitJZiBubyBmcmFtZSBtYXJrZXIgaXMgZm91bmQgdGhlbiB0aGUgZW50aXJlIGlucHV0IGRhdGEgaXMgdHJlYXRlZCBhcyBzaW5nbGUgZnJhbWUuCisKK1RoaXMgZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gdG9sZXJhdGVzIGFueSBraW5kIG9mIGlucHV0IChodWdlLAorbWFsZm9ybWVkLCBldGMpIGFuZCB0aGVyZWJ5IGluY3JlYXNpbmcgdGhlIGNoYW5jZSBvZiBpZGVudGlmeWluZyB2dWxuZXJhYmlsaXRpZXMuCisKKyMgPGEgbmFtZT0iYW1yV3JpdGVyRnV6emVyIj48L2E+IEZ1enplciBmb3IgQW1yIFdyaXRlcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgQU1SIHdyaXRlciB1c2VzIHRoZSBgV3JpdGVyRnV6emVyQmFzZWAgY2xhc3MgYW5kCitpbXBsZW1lbnRzIG9ubHkgdGhlIGBjcmVhdGVXcml0ZXJgIHRvIGNyZWF0ZSB0aGUgQU1SIHdyaXRlciBjbGFzcy4KKworIyMjIyMgT3RoZXIgY29uc2lkZXJhdGlvbnMKKyAqIFR3byBmdXp6ZXIgYmluYXJpZXMgLSBhbXJuYl93cml0ZXJfZnV6emVyIGFuZCBhbXJ3Yl93cml0ZXJfZnV6emVyIGFyZSBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIGEgZmxhZyAtICdBTVJOQicKKworIyA8YSBuYW1lPSJtcGVnNFdyaXRlckZ1enplciI+PC9hPiBGdXp6ZXIgZm9yIE1QRUc0IFdyaXRlcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgTVBFRzQgd3JpdGVyIHVzZXMgdGhlIGBXcml0ZXJGdXp6ZXJCYXNlYCBjbGFzcyBhbmQKK2ltcGxlbWVudHMgb25seSB0aGUgYGNyZWF0ZVdyaXRlcmAgdG8gY3JlYXRlIHRoZSBNUEVHNCB3cml0ZXIgY2xhc3MuCisKKyMgPGEgbmFtZT0ib2dnV3JpdGVyRnV6emVyIj48L2E+IEZ1enplciBmb3IgT0dHIFdyaXRlcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgT0dHIHdyaXRlciB1c2VzIHRoZSBgV3JpdGVyRnV6emVyQmFzZWAgY2xhc3MgYW5kCitpbXBsZW1lbnRzIG9ubHkgdGhlIGBjcmVhdGVXcml0ZXJgIHRvIGNyZWF0ZSB0aGUgT0dHIHdyaXRlciBjbGFzcy4KKworIyA8YSBuYW1lPSJ3ZWJtV3JpdGVyRnV6emVyIj48L2E+IEZ1enplciBmb3IgV0VCTSBXcml0ZXIKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIFdFQk0gd3JpdGVyIHVzZXMgdGhlIGBXcml0ZXJGdXp6ZXJCYXNlYCBjbGFzcyBhbmQKK2ltcGxlbWVudHMgb25seSB0aGUgYGNyZWF0ZVdyaXRlcmAgdG8gY3JlYXRlIHRoZSBXRUJNIHdyaXRlciBjbGFzcy4KKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgd3JpdGVyIGZ1enplciBiaW5hcmllcy4KKworIyMjIEFuZHJvaWQKKworYCpgID0gYW1ybmIvYW1yd2IvbXBlZzQvb2dnL3dlYm0KKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgKl93cml0ZXJfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgbWVkaWEgZmlsZXMgdG8gdGhhdCBmb2xkZXIKK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvKl93cml0ZXJfZnV6emVyLypfd3JpdGVyX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworCisjIyBSZWZlcmVuY2VzOgorICogaHR0cDovL2xsdm0ub3JnL2RvY3MvTGliRnV6emVyLmh0bWwKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvb3NzLWZ1enoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dyaXRlcl9mdXp6ZXJzL1dyaXRlckZ1enplckJhc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvV3JpdGVyRnV6emVyQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3YWY3MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dyaXRlcl9mdXp6ZXJzL1dyaXRlckZ1enplckJhc2UuY3BwCkBAIC0wLDAgKzEsMjkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIldyaXRlckZ1enplckJhc2UuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8qKgorICogQnVmZmVyIHNvdXJjZSBpbXBsZW1lbnRhdGlvbnMgdG8gcGFyc2UgaW5wdXQgZmlsZQorICovCisKK3VpbnQzMl90IFdyaXRlckZ1enplckJhc2U6OkJ1ZmZlclNvdXJjZTo6Z2V0TnVtVHJhY2tzKCkgeworICAgIHVpbnQzMl90IG51bVRyYWNrcyA9IDA7CisgICAgaWYgKG1TaXplID4gc2l6ZW9mKHVpbnQ4X3QpKSB7CisgICAgICAgIG51bVRyYWNrcyA9IG1pbihtRGF0YVswXSwga01heFRyYWNrQ291bnQpOworICAgICAgICBtUmVhZEluZGV4ICs9IHNpemVvZih1aW50OF90KTsKKyAgICB9CisgICAgcmV0dXJuIG51bVRyYWNrczsKK30KKworYm9vbCBXcml0ZXJGdXp6ZXJCYXNlOjpCdWZmZXJTb3VyY2U6OnNlYXJjaEZvck1hcmtlcihzaXplX3Qgc3RhcnRJbmRleCkgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChpc01hcmtlcigpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAtLW1SZWFkSW5kZXg7CisgICAgICAgIGlmIChtUmVhZEluZGV4IDwgc3RhcnRJbmRleCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitDb25maWdGb3JtYXQgV3JpdGVyRnV6emVyQmFzZTo6QnVmZmVyU291cmNlOjpnZXRDb25maWdGb3JtYXQoaW50MzJfdCB0cmFja0luZGV4KSB7CisgICAgcmV0dXJuIG1QYXJhbXNbdHJhY2tJbmRleF07Cit9CisKK2ludDMyX3QgV3JpdGVyRnV6emVyQmFzZTo6QnVmZmVyU291cmNlOjpnZXROdW1Dc2RzKGludDMyX3QgdHJhY2tJbmRleCkgeworICAgIHJldHVybiBtTnVtQ3Nkc1t0cmFja0luZGV4XTsKK30KKwordmVjdG9yPEZyYW1lRGF0YT4gJldyaXRlckZ1enplckJhc2U6OkJ1ZmZlclNvdXJjZTo6Z2V0RnJhbWVMaXN0KGludDMyX3QgdHJhY2tJbmRleCkgeworICAgIHJldHVybiBtRnJhbWVMaXN0W3RyYWNrSW5kZXhdOworfQorCit2b2lkIFdyaXRlckZ1enplckJhc2U6OkJ1ZmZlclNvdXJjZTo6Z2V0RnJhbWVJbmZvKCkgeworICAgIHNpemVfdCByZWFkSW5kZXhTdGFydCA9IG1SZWFkSW5kZXg7CisgICAgaWYgKG1TaXplIC0gbVJlYWRJbmRleCA+IGtNYXJrZXJTaXplICsga01hcmtlclN1ZmZpeFNpemUpIHsKKyAgICAgICAgYm9vbCBpc0ZyYW1lQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgc2l6ZV90IGJ5dGVzUmVtYWluaW5nID0gbVNpemU7CisgICAgICAgIG1SZWFkSW5kZXggPSBtU2l6ZSAtIGtNYXJrZXJTaXplOworICAgICAgICB3aGlsZSAoaXNGcmFtZUF2YWlsYWJsZSkgeworICAgICAgICAgICAgaXNGcmFtZUF2YWlsYWJsZSA9IHNlYXJjaEZvck1hcmtlcihyZWFkSW5kZXhTdGFydCk7CisgICAgICAgICAgICBpZiAoaXNGcmFtZUF2YWlsYWJsZSkgeworICAgICAgICAgICAgICAgIHNpemVfdCBsb2NhdGlvbiA9IG1SZWFkSW5kZXggKyBrTWFya2VyU2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gKyBrTWFya2VyU3VmZml4U2l6ZSA+PSBieXRlc1JlbWFpbmluZykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYm9vbCBpc0NTRCA9IGlzQ1NETWFya2VyKGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICBsb2NhdGlvbiArPSBrTWFya2VyU3VmZml4U2l6ZTsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpmcmFtZVB0ciA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPigmbURhdGFbbG9jYXRpb25dKTsKKyAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVTaXplID0gYnl0ZXNSZW1haW5pbmcgLSBsb2NhdGlvbiwgYnVmZmVyU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgdWludDhfdCB0cmFja0luZGV4ID0gZnJhbWVQdHJbMF0gJSBrTWF4VHJhY2tDb3VudDsKKyAgICAgICAgICAgICAgICArK2ZyYW1lUHRyOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgZmxhZ3MgPSAwOworICAgICAgICAgICAgICAgIGludDY0X3QgcHRzID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoaXNDU0QgJiYgZnJhbWVTaXplID4gMSkgeworICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBrQ29kZWNDb25maWdGbGFnOworICAgICAgICAgICAgICAgICAgICBwdHMgPSAwOworICAgICAgICAgICAgICAgICAgICArK21OdW1Dc2RzW3RyYWNrSW5kZXhdOworICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplID0gZnJhbWVTaXplIC0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZyYW1lU2l6ZSA+IHNpemVvZih1aW50OF90KSArIHNpemVvZihpbnQ2NF90KSArIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBmbGFnVHlwZXNbZnJhbWVQdHJbMF0gJSBzaXplKGZsYWdUeXBlcyldOworICAgICAgICAgICAgICAgICAgICArK2ZyYW1lUHRyOworICAgICAgICAgICAgICAgICAgICBjb3B5KGZyYW1lUHRyLCBmcmFtZVB0ciArIHNpemVvZihpbnQ2NF90KSwgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KCZwdHMpKTsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVQdHIgKz0gc2l6ZW9mKGludDY0X3QpOworICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplID0gZnJhbWVTaXplIC0gKHNpemVvZih1aW50OF90KSArIHNpemVvZihpbnQ2NF90KSkgLSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtRnJhbWVMaXN0W3RyYWNrSW5kZXhdLmluc2VydChtRnJhbWVMaXN0W3RyYWNrSW5kZXhdLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVEYXRhe2J1ZmZlclNpemUsIGZsYWdzLCBwdHMsIGZyYW1lUHRyfSk7CisgICAgICAgICAgICAgICAgYnl0ZXNSZW1haW5pbmcgLT0gKGZyYW1lU2l6ZSArIGtNYXJrZXJTaXplICsga01hcmtlclN1ZmZpeFNpemUpOworICAgICAgICAgICAgICAgIC0tbVJlYWRJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUZyYW1lTGlzdFswXS5lbXB0eSgpICYmIG1GcmFtZUxpc3RbMV0uZW1wdHkoKSkgeworICAgICAgICAvKioKKyAgICAgICAgICogU2NlbmFyaW8gd2hlcmUgaW5wdXQgZGF0YSBkb2VzIG5vdCBjb250YWluIHRoZSBjdXN0b20gZnJhbWUgbWFya2Vycy4KKyAgICAgICAgICogSGVuY2UgZmVlZCB0aGUgZW50aXJlIGRhdGEgYXMgc2luZ2xlIGZyYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgbUZyYW1lTGlzdFswXS5lbXBsYWNlX2JhY2soRnJhbWVEYXRhe21TaXplIC0gcmVhZEluZGV4U3RhcnQsIDAsIDAsIG1EYXRhICsgcmVhZEluZGV4U3RhcnR9KTsKKyAgICB9Cit9Citib29sIFdyaXRlckZ1enplckJhc2U6OkJ1ZmZlclNvdXJjZTo6Z2V0VHJhY2tJbmZvKGludDMyX3QgdHJhY2tJbmRleCkgeworICAgIGlmIChtU2l6ZSA8PSBtUmVhZEluZGV4ICsgc2l6ZW9mKHVpbnQ4X3QpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc2l6ZV90IG1pbWVUeXBlSWR4ID0gbURhdGFbbVJlYWRJbmRleF0gJSBrU3VwcG9ydGVkTWltZVR5cGVzOworICAgIGNoYXIgKm1pbWUgPSAoY2hhciAqKXN1cHBvcnRlZE1pbWVUeXBlc1ttaW1lVHlwZUlkeF0uY19zdHIoKTsKKyAgICBtUGFyYW1zW3RyYWNrSW5kZXhdLm1pbWUgPSBtaW1lOworICAgIG1SZWFkSW5kZXggKz0gc2l6ZW9mKHVpbnQ4X3QpOworCisgICAgaWYgKG1TaXplID4gbVJlYWRJbmRleCArIDIgKiBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgaWYgKCFzdHJuY21wKG1pbWUsICJhdWRpby8iLCA2KSkgeworICAgICAgICAgICAgY29weShtRGF0YSArIG1SZWFkSW5kZXgsIG1EYXRhICsgbVJlYWRJbmRleCArIHNpemVvZihpbnQzMl90KSwKKyAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KCZtUGFyYW1zW3RyYWNrSW5kZXhdLmNoYW5uZWxDb3VudCkpOworICAgICAgICAgICAgY29weShtRGF0YSArIG1SZWFkSW5kZXggKyBzaXplb2YoaW50MzJfdCksIG1EYXRhICsgbVJlYWRJbmRleCArIDIgKiBzaXplb2YoaW50MzJfdCksCisgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPigmbVBhcmFtc1t0cmFja0luZGV4XS5zYW1wbGVSYXRlKSk7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAobWltZSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgICAgICBjb3B5KG1EYXRhICsgbVJlYWRJbmRleCwgbURhdGEgKyBtUmVhZEluZGV4ICsgc2l6ZW9mKGludDMyX3QpLAorICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIgKj4oJm1QYXJhbXNbdHJhY2tJbmRleF0uaGVpZ2h0KSk7CisgICAgICAgICAgICBjb3B5KG1EYXRhICsgbVJlYWRJbmRleCArIHNpemVvZihpbnQzMl90KSwgbURhdGEgKyBtUmVhZEluZGV4ICsgMiAqIHNpemVvZihpbnQzMl90KSwKKyAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KCZtUGFyYW1zW3RyYWNrSW5kZXhdLndpZHRoKSk7CisgICAgICAgIH0KKyAgICAgICAgbVJlYWRJbmRleCArPSAyICogc2l6ZW9mKGludDMyX3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzdHJuY21wKG1pbWUsICJ0ZXh0LyIsIDUpICYmIHN0cm5jbXAobWltZSwgImFwcGxpY2F0aW9uLyIsIDEyKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIHdyaXRlSGVhZGVyQnVmZmVycyh2ZWN0b3I8RnJhbWVEYXRhPiAmYnVmZmVySW5mbywgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGludDMyX3QgbnVtQ3NkcykgeworICAgIGNoYXIgY3NkTmFtZVtrTWF4Q1NEU3RybGVuXTsKKyAgICBmb3IgKGludCBjc2RJZCA9IDA7IGNzZElkIDwgbnVtQ3NkczsgKytjc2RJZCkgeworICAgICAgICBpbnQzMl90IGZsYWdzID0gYnVmZmVySW5mb1tjc2RJZF0uZmxhZ3M7CisgICAgICAgIGlmIChmbGFncyA9PSBrQ29kZWNDb25maWdGbGFnKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBjc2RCdWZmZXIgPQorICAgICAgICAgICAgICAgIEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgodm9pZCAqKWJ1ZmZlckluZm9bY3NkSWRdLmJ1ZiwgYnVmZmVySW5mb1tjc2RJZF0uc2l6ZSk7CisgICAgICAgICAgICBpZiAoY3NkQnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgY3NkQnVmZmVyLT5iYXNlKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNucHJpbnRmKGNzZE5hbWUsIHNpemVvZihjc2ROYW1lKSwgImNzZC0lZCIsIGNzZElkKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0QnVmZmVyKGNzZE5hbWUsIGNzZEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgV3JpdGVyRnV6emVyQmFzZTo6Y3JlYXRlT3V0cHV0RmlsZSgpIHsKKyAgICBtRmQgPSBtZW1mZF9jcmVhdGUobU91dHB1dEZpbGVOYW1lLmNfc3RyKCksIE1GRF9BTExPV19TRUFMSU5HKTsKKyAgICBpZiAobUZkID09IC0xKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgV3JpdGVyRnV6emVyQmFzZTo6YWRkV3JpdGVyU291cmNlKGludDMyX3QgdHJhY2tJbmRleCkgeworICAgIENvbmZpZ0Zvcm1hdCBwYXJhbXMgPSBtQnVmZmVyU291cmNlLT5nZXRDb25maWdGb3JtYXQodHJhY2tJbmRleCk7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKKyAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIHBhcmFtcy5taW1lKTsKKyAgICBpZiAoIXN0cm5jbXAocGFyYW1zLm1pbWUsICJhdWRpby8iLCA2KSkgeworICAgICAgICBpZiAoIXN0cm5jbXAocGFyYW1zLm1pbWUsICJhdWRpby8zZ3BwIiwgMTApKSB7CisgICAgICAgICAgICBwYXJhbXMuY2hhbm5lbENvdW50ID0gMTsKKyAgICAgICAgICAgIHBhcmFtcy5zYW1wbGVSYXRlID0gODAwMDsKKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChwYXJhbXMubWltZSwgImF1ZGlvL2Ftci13YiIsIDEyKSkgeworICAgICAgICAgICAgcGFyYW1zLmNoYW5uZWxDb3VudCA9IDE7CisgICAgICAgICAgICBwYXJhbXMuc2FtcGxlUmF0ZSA9IDE2MDAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyYW1zLnNhbXBsZVJhdGUgPSBtYXgoMSwgcGFyYW1zLnNhbXBsZVJhdGUpOworICAgICAgICB9CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMuY2hhbm5lbENvdW50KTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBwYXJhbXMuc2FtcGxlUmF0ZSk7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChwYXJhbXMubWltZSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoIndpZHRoIiwgcGFyYW1zLndpZHRoKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiaGVpZ2h0IiwgcGFyYW1zLmhlaWdodCk7CisgICAgfQorICAgIGludDMyX3QgbnVtQ3NkcyA9IG1CdWZmZXJTb3VyY2UtPmdldE51bUNzZHModHJhY2tJbmRleCk7CisgICAgaWYgKG51bUNzZHMpIHsKKyAgICAgICAgdmVjdG9yPEZyYW1lRGF0YT4gbUZyYW1lcyA9IG1CdWZmZXJTb3VyY2UtPmdldEZyYW1lTGlzdCh0cmFja0luZGV4KTsKKyAgICAgICAgd3JpdGVIZWFkZXJCdWZmZXJzKG1GcmFtZXMsIGZvcm1hdCwgbnVtQ3Nkcyk7CisgICAgfQorICAgIHNwPE1ldGFEYXRhPiB0cmFja01ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKGZvcm1hdCwgdHJhY2tNZXRhKTsKKyAgICBtQ3VycmVudFRyYWNrW3RyYWNrSW5kZXhdID0gbmV3IE1lZGlhQWRhcHRlcih0cmFja01ldGEpOworICAgIG1Xcml0ZXItPmFkZFNvdXJjZShtQ3VycmVudFRyYWNrW3RyYWNrSW5kZXhdKTsKK30KKwordm9pZCBXcml0ZXJGdXp6ZXJCYXNlOjpzdGFydCgpIHsKKyAgICBtRmlsZU1ldGEtPnNldEludDMyKGtLZXlSZWFsVGltZVJlY29yZGluZywgZmFsc2UpOworICAgIG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7Cit9CisKK3ZvaWQgV3JpdGVyRnV6emVyQmFzZTo6c2VuZEJ1ZmZlcnNUb1dyaXRlcihzcDxNZWRpYUFkYXB0ZXI+ICZjdXJyZW50VHJhY2ssIGludDMyX3QgdHJhY2tJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0RnJhbWVJbmRleCwgaW50MzJfdCBlbmRGcmFtZUluZGV4KSB7CisgICAgdmVjdG9yPEZyYW1lRGF0YT4gYnVmZmVySW5mbyA9IG1CdWZmZXJTb3VyY2UtPmdldEZyYW1lTGlzdCh0cmFja0luZGV4KTsKKyAgICBmb3IgKGludCBpZHggPSBzdGFydEZyYW1lSW5kZXg7IGlkeCA8IGVuZEZyYW1lSW5kZXg7ICsraWR4KSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKCh2b2lkICopYnVmZmVySW5mb1tpZHhdLmJ1ZiwgYnVmZmVySW5mb1tpZHhdLnNpemUpOworICAgICAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYnVmZmVyKTsKKworICAgICAgICAvLyBSZWxlYXNlZCBpbiBNZWRpYUFkYXB0ZXI6OnNpZ25hbEJ1ZmZlclJldHVybmVkKCkuCisgICAgICAgIG1lZGlhQnVmZmVyLT5hZGRfcmVmKCk7CisgICAgICAgIG1lZGlhQnVmZmVyLT5zZXRfcmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSwgYnVmZmVyLT5zaXplKCkpOworICAgICAgICBNZXRhRGF0YUJhc2UgJnNhbXBsZU1ldGFEYXRhID0gbWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICBzYW1wbGVNZXRhRGF0YS5zZXRJbnQ2NChrS2V5VGltZSwgYnVmZmVySW5mb1tpZHhdLnRpbWVVcyk7CisKKyAgICAgICAgLy8gSnVzdCBzZXQgdGhlIGtLZXlEZWNvZGluZ1RpbWUgYXMgdGhlIHByZXNlbnRhdGlvbiB0aW1lIGZvciBub3cuCisgICAgICAgIHNhbXBsZU1ldGFEYXRhLnNldEludDY0KGtLZXlEZWNvZGluZ1RpbWUsIGJ1ZmZlckluZm9baWR4XS50aW1lVXMpOworICAgICAgICBpZiAoYnVmZmVySW5mb1tpZHhdLmZsYWdzID09IFNhbXBsZUZsYWc6OlNZTkNfRkxBRykgeworICAgICAgICAgICAgc2FtcGxlTWV0YURhdGEuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoaXMgcHVzaEJ1ZmZlciB3aWxsIHdhaXQgdW50aWwgdGhlIG1lZGlhQnVmZmVyIGlzIGNvbnN1bWVkLgorICAgICAgICBjdXJyZW50VHJhY2stPnB1c2hCdWZmZXIobWVkaWFCdWZmZXIpOworICAgIH0KK30KKwordm9pZCBXcml0ZXJGdXp6ZXJCYXNlOjpzZW5kQnVmZmVyc0ludGVybGVhdmUoaW50MzJfdCBudW1UcmFja3MsIHVpbnQ4X3QgbnVtQnVmZmVyc0ludGVybGVhdmUpIHsKKyAgICBpbnQzMl90IGN1cnJlbnRGcmFtZUluZGV4W251bVRyYWNrc10sIHJlbWFpbmluZ051bUZyYW1lc1tudW1UcmFja3NdLCBudW1UcmFja0ZyYW1lc0RvbmU7CisgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IG51bVRyYWNrczsgKytpZHgpIHsKKyAgICAgICAgY3VycmVudEZyYW1lSW5kZXhbaWR4XSA9IG1CdWZmZXJTb3VyY2UtPmdldE51bUNzZHMoaWR4KTsKKyAgICAgICAgcmVtYWluaW5nTnVtRnJhbWVzW2lkeF0gPSBtQnVmZmVyU291cmNlLT5nZXRGcmFtZUxpc3QoaWR4KS5zaXplKCkgLSBjdXJyZW50RnJhbWVJbmRleFtpZHhdOworICAgIH0KKyAgICBkbyB7CisgICAgICAgIG51bVRyYWNrRnJhbWVzRG9uZSA9IG51bVRyYWNrczsKKyAgICAgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IG51bVRyYWNrczsgKytpZHgpIHsKKyAgICAgICAgICAgIGlmIChyZW1haW5pbmdOdW1GcmFtZXNbaWR4XSA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lc0ludGVybGVhdmUgPQorICAgICAgICAgICAgICAgICAgICBtaW4ocmVtYWluaW5nTnVtRnJhbWVzW2lkeF0sIHN0YXRpY19jYXN0PGludDMyX3Q+KG51bUJ1ZmZlcnNJbnRlcmxlYXZlKSk7CisgICAgICAgICAgICAgICAgc2VuZEJ1ZmZlcnNUb1dyaXRlcihtQ3VycmVudFRyYWNrW2lkeF0sIGlkeCwgY3VycmVudEZyYW1lSW5kZXhbaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGcmFtZUluZGV4W2lkeF0gKyBudW1GcmFtZXNJbnRlcmxlYXZlKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50RnJhbWVJbmRleFtpZHhdICs9IG51bUZyYW1lc0ludGVybGVhdmU7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nTnVtRnJhbWVzW2lkeF0gLT0gbnVtRnJhbWVzSW50ZXJsZWF2ZTsKKyAgICAgICAgICAgICAgICAtLW51bVRyYWNrRnJhbWVzRG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKG51bVRyYWNrRnJhbWVzRG9uZSA8IG51bVRyYWNrcyk7Cit9CisKK3ZvaWQgV3JpdGVyRnV6emVyQmFzZTo6aW5pdEZpbGVXcml0ZXJBbmRQcm9jZXNzRGF0YShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmICghY3JlYXRlT3V0cHV0RmlsZSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFjcmVhdGVXcml0ZXIoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHNpemUgPCAxKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdWludDhfdCBudW1CdWZmZXJzSW50ZXJsZWF2ZSA9IChkYXRhWzBdID09IDAgPyAxIDogZGF0YVswXSk7CisgICAgKytkYXRhOworICAgIC0tc2l6ZTsKKworICAgIG1CdWZmZXJTb3VyY2UgPSBuZXcgQnVmZmVyU291cmNlKGRhdGEsIHNpemUpOworICAgIGlmICghbUJ1ZmZlclNvdXJjZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1OdW1UcmFja3MgPSBtQnVmZmVyU291cmNlLT5nZXROdW1UcmFja3MoKTsKKyAgICBpZiAobU51bVRyYWNrcyA+IDApIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IG1OdW1UcmFja3M7ICsraWR4KSB7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJTb3VyY2UtPmdldFRyYWNrSW5mbyhpZHgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGlkeCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtQnVmZmVyU291cmNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1OdW1UcmFja3MgPSBpZHg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUJ1ZmZlclNvdXJjZS0+Z2V0RnJhbWVJbmZvKCk7CisgICAgICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBtTnVtVHJhY2tzOyArK2lkeCkgeworICAgICAgICAgICAgYWRkV3JpdGVyU291cmNlKGlkeCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhcnQoKTsKKyAgICAgICAgc2VuZEJ1ZmZlcnNJbnRlcmxlYXZlKG1OdW1UcmFja3MsIG51bUJ1ZmZlcnNJbnRlcmxlYXZlKTsKKyAgICAgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IG1OdW1UcmFja3M7ICsraWR4KSB7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRUcmFja1tpZHhdKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1tpZHhdLT5zdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZGVsZXRlIG1CdWZmZXJTb3VyY2U7CisgICAgbVdyaXRlci0+c3RvcCgpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvYW1yX3dyaXRlcl9mdXp6ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvYW1yX3dyaXRlcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYjZmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9hbXJfd3JpdGVyX2Z1enplci5jcHAKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpbmNsdWRlICJXcml0ZXJGdXp6ZXJCYXNlLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BTVJXcml0ZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIEFtcldyaXRlckZ1enplciA6IHB1YmxpYyBXcml0ZXJGdXp6ZXJCYXNlIHsKKyAgIHB1YmxpYzoKKyAgICBib29sIGNyZWF0ZVdyaXRlcigpOworfTsKKworYm9vbCBBbXJXcml0ZXJGdXp6ZXI6OmNyZWF0ZVdyaXRlcigpIHsKKyAgICBtV3JpdGVyID0gbmV3IEFNUldyaXRlcihtRmQpOworICAgIGlmICghbVdyaXRlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1GaWxlTWV0YSA9IG5ldyBNZXRhRGF0YTsKKyNpZmRlZiBBTVJOQgorICAgIG1GaWxlTWV0YS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBvdXRwdXRfZm9ybWF0OjpPVVRQVVRfRk9STUFUX0FNUl9OQik7CisjZWxzZQorICAgIG1GaWxlTWV0YS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBvdXRwdXRfZm9ybWF0OjpPVVRQVVRfRk9STUFUX0FNUl9XQik7CisjZW5kaWYKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFtcldyaXRlckZ1enplciB3cml0ZXJGdXp6ZXI7CisgICAgd3JpdGVyRnV6emVyLmluaXRGaWxlV3JpdGVyQW5kUHJvY2Vzc0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9pbmNsdWRlL1dyaXRlckZ1enplckJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dyaXRlcl9mdXp6ZXJzL2luY2x1ZGUvV3JpdGVyRnV6emVyQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMTUzMjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9pbmNsdWRlL1dyaXRlckZ1enplckJhc2UuaApAQCAtMCwwICsxLDIxMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpZm5kZWYgX19XUklURVJfRlVaWkVSX0JBU0VfSF9fCisjZGVmaW5lIF9fV1JJVEVSX0ZVWlpFUl9CQVNFX0hfXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFBZGFwdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY29uc3RleHByIHVpbnQzMl90IGtNaW1lU2l6ZSA9IDEyODsKK2NvbnN0ZXhwciB1aW50OF90IGtNYXhUcmFja0NvdW50ID0gMzsKK2NvbnN0ZXhwciB1aW50MzJfdCBrTWF4Q1NEU3RybGVuID0gMTY7Citjb25zdGV4cHIgdWludDMyX3Qga0NvZGVjQ29uZmlnRmxhZyA9IDMyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDb25maWdGb3JtYXQgeworICAgIGNoYXIqIG1pbWU7CisgICAgaW50MzJfdCB3aWR0aDsKKyAgICBpbnQzMl90IGhlaWdodDsKKyAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQ7Cit9OworCitzdHJ1Y3QgRnJhbWVEYXRhIHsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICB1aW50OF90IGZsYWdzOworICAgIGludDY0X3QgdGltZVVzOworICAgIGNvbnN0IHVpbnQ4X3QqIGJ1ZjsKK307CisKK3N0YXRpYyBzdHJpbmcgc3VwcG9ydGVkTWltZVR5cGVzW10gPSB7ImF1ZGlvLzNncHAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8vYW1yLXdiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvL3ZvcmJpcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby9vcHVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvL21wNGEtbGF0bSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby9tcGVnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvL21wZWctTDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8vbXBlZy1MMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby9taWRpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvL3FjZWxwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvL2c3MTEtYWxhdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby9nNzExLW1sYXciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8vZmxhYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby9hYWMtYWR0cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby9nc20iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8vYWMzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvL2VhYzMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8vZWFjMy1qb2MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8vYWM0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvL3NjcmFtYmxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby9hbGFjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvL3gtbXMtd21hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvL3gtYWRwY20tbXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8veC1hZHBjbS1kdmktaW1hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvL2F2YyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlby9oZXZjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvL21wNHYtZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW8vM2dwcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlby94LXZuZC5vbjIudnA4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvL3gtdm5kLm9uMi52cDkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW8vYXYwMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlby9tcGVnMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlby9kb2xieS12aXNpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW8vc2NyYW1ibGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvL2RpdngiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW8vZGl2eDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW8veHZpZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlby94LW1vdGlvbi1qcGVnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQvM2dwcC10dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi94LXN1YnJpcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0L3Z0dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0L2NlYS02MDgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dC9jZWEtNzA4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gtaWQzdjQifTsKKworZW51bSBTYW1wbGVGbGFnIHsKKyAgICBERUZBVUxUX0ZMQUcgPSAwLAorICAgIFNZTkNfRkxBRyA9IDEsCisgICAgRU5DUllQVEVEX0ZMQUcgPSAyLAorfTsKKworc3RhdGljIHVpbnQ4X3QgZmxhZ1R5cGVzW10gPSB7U2FtcGxlRmxhZzo6REVGQVVMVF9GTEFHLCBTYW1wbGVGbGFnOjpTWU5DX0ZMQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVGbGFnOjpFTkNSWVBURURfRkxBR307CisKK2NsYXNzIFdyaXRlckZ1enplckJhc2UgeworICAgcHVibGljOgorICAgIFdyaXRlckZ1enplckJhc2UoKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCB+V3JpdGVyRnV6emVyQmFzZSgpIHsKKyAgICAgICAgaWYgKG1GaWxlTWV0YSkgeworICAgICAgICAgICAgbUZpbGVNZXRhLmNsZWFyKCk7CisgICAgICAgICAgICBtRmlsZU1ldGEgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGlmIChtV3JpdGVyKSB7CisgICAgICAgICAgICBtV3JpdGVyLmNsZWFyKCk7CisgICAgICAgICAgICBtV3JpdGVyID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwga01heFRyYWNrQ291bnQ7ICsraWR4KSB7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRUcmFja1tpZHhdKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1tpZHhdLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1tpZHhdLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1tpZHhdID0gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjbG9zZShtRmQpOworICAgIH07CisKKyAgICAvKiogRnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBtZWRpYSB3cml0ZXIgY29tcG9uZW50LgorICAgICAqIFRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkZXJpdmVkIGNsYXNzLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBjcmVhdGVXcml0ZXIoKSA9IDA7CisKKyAgICAvKiogUGFyZW50IGNsYXNzIGZ1bmN0aW9ucyB0byBiZSByZXVzZWQgYnkgZGVyaXZlZCBjbGFzcy4KKyAgICAgKiBUaGVzZSBhcmUgY29tbW9uIGZvciBhbGwgbWVkaWEgd3JpdGVyIGNvbXBvbmVudHMuCisgICAgICovCisgICAgYm9vbCBjcmVhdGVPdXRwdXRGaWxlKCk7CisKKyAgICB2b2lkIGFkZFdyaXRlclNvdXJjZShpbnQzMl90IHRyYWNrSW5kZXgpOworCisgICAgdm9pZCBzdGFydCgpOworCisgICAgdm9pZCBzZW5kQnVmZmVyc1RvV3JpdGVyKHNwPE1lZGlhQWRhcHRlcj4mIGN1cnJlbnRUcmFjaywgaW50MzJfdCB0cmFja0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0RnJhbWVJbmRleCwgaW50MzJfdCBlbmRGcmFtZUluZGV4KTsKKworICAgIHZvaWQgc2VuZEJ1ZmZlcnNJbnRlcmxlYXZlKGludDMyX3QgbnVtVHJhY2tzLCB1aW50OF90IG51bUJ1ZmZlcnNJbnRlcmxlYXZlKTsKKworICAgIHZvaWQgaW5pdEZpbGVXcml0ZXJBbmRQcm9jZXNzRGF0YShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgIHByb3RlY3RlZDoKKyAgICBjbGFzcyBCdWZmZXJTb3VyY2UgeworICAgICAgIHB1YmxpYzoKKyAgICAgICAgQnVmZmVyU291cmNlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSA6IG1EYXRhKGRhdGEpLCBtU2l6ZShzaXplKSwgbVJlYWRJbmRleCgwKSB7fQorICAgICAgICB+QnVmZmVyU291cmNlKCkgeworICAgICAgICAgICAgbURhdGEgPSBudWxscHRyOworICAgICAgICAgICAgbVNpemUgPSAwOworICAgICAgICAgICAgbVJlYWRJbmRleCA9IDA7CisgICAgICAgICAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwga01heFRyYWNrQ291bnQ7ICsraWR4KSB7CisgICAgICAgICAgICAgICAgbUZyYW1lTGlzdFtpZHhdLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdWludDMyX3QgZ2V0TnVtVHJhY2tzKCk7CisgICAgICAgIGJvb2wgZ2V0VHJhY2tJbmZvKGludDMyX3QgdHJhY2tJbmRleCk7CisgICAgICAgIHZvaWQgZ2V0RnJhbWVJbmZvKCk7CisgICAgICAgIENvbmZpZ0Zvcm1hdCBnZXRDb25maWdGb3JtYXQoaW50MzJfdCB0cmFja0luZGV4KTsKKyAgICAgICAgaW50MzJfdCBnZXROdW1Dc2RzKGludDMyX3QgdHJhY2tJbmRleCk7CisgICAgICAgIHZlY3RvcjxGcmFtZURhdGE+JiBnZXRGcmFtZUxpc3QoaW50MzJfdCB0cmFja0luZGV4KTsKKworICAgICAgIHByaXZhdGU6CisgICAgICAgIGJvb2wgaXNNYXJrZXIoKSB7IHJldHVybiAobWVtY21wKCZtRGF0YVttUmVhZEluZGV4XSwga01hcmtlciwga01hcmtlclNpemUpID09IDApOyB9CisKKyAgICAgICAgYm9vbCBpc0NTRE1hcmtlcihzaXplX3QgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAobWVtY21wKCZtRGF0YVtwb3NpdGlvbl0sIGtDc2RNYXJrZXJTdWZmaXgsIGtNYXJrZXJTdWZmaXhTaXplKSA9PSAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgc2VhcmNoRm9yTWFya2VyKHNpemVfdCBzdGFydEluZGV4KTsKKworICAgICAgICBjb25zdCB1aW50OF90KiBtRGF0YSA9IG51bGxwdHI7CisgICAgICAgIHNpemVfdCBtU2l6ZSA9IDA7CisgICAgICAgIHNpemVfdCBtUmVhZEluZGV4ID0gMDsKKyAgICAgICAgQ29uZmlnRm9ybWF0IG1QYXJhbXNba01heFRyYWNrQ291bnRdID0ge307CisgICAgICAgIGludDMyX3QgbU51bUNzZHNba01heFRyYWNrQ291bnRdID0gezB9OworICAgICAgICB2ZWN0b3I8RnJhbWVEYXRhPiBtRnJhbWVMaXN0W2tNYXhUcmFja0NvdW50XTsKKworICAgICAgICBzdGF0aWMgY29uc3RleHByIGludCBrU3VwcG9ydGVkTWltZVR5cGVzID0gc2l6ZShzdXBwb3J0ZWRNaW1lVHlwZXMpOworICAgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga01hcmtlcltdID0gIl9NQVJLIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtDc2RNYXJrZXJTdWZmaXhbXSA9ICJfSF8iOworICAgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0ZyYW1lTWFya2VyU3VmZml4W10gPSAiX0ZfIjsKKyAgICAgICAgLy8gQWxsIG1hcmtlcnMgc2hvdWxkIGJlIDUgYnl0ZXMgbG9uZyAoIHNpemVvZiAnX01BUksnIHdoaWNoIGlzIDUpCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXJrZXJTaXplID0gKHNpemVvZihrTWFya2VyKSAtIDEpOworICAgICAgICAvLyBBbGwgbWFya2VyIHR5cGVzIHNob3VsZCBiZSAzIGJ5dGVzIGxvbmcgKCdfSF8nLCAnX0ZfJykKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01hcmtlclN1ZmZpeFNpemUgPSAzOworICAgIH07CisKKyAgICBCdWZmZXJTb3VyY2UqIG1CdWZmZXJTb3VyY2UgPSBudWxscHRyOworICAgIGludDMyX3QgbUZkID0gLTE7CisgICAgdWludDMyX3QgbU51bVRyYWNrcyA9IDA7CisgICAgc3RyaW5nIG1PdXRwdXRGaWxlTmFtZSA9ICJ3cml0ZXIub3V0IjsKKyAgICBzcDxNZWRpYVdyaXRlcj4gbVdyaXRlciA9IG51bGxwdHI7CisgICAgc3A8TWV0YURhdGE+IG1GaWxlTWV0YSA9IG51bGxwdHI7CisgICAgc3A8TWVkaWFBZGFwdGVyPiBtQ3VycmVudFRyYWNrW2tNYXhUcmFja0NvdW50XSA9IHt9OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBfX1dSSVRFUl9GVVpaRVJfQkFTRV9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dyaXRlcl9mdXp6ZXJzL21wZWc0X3dyaXRlcl9mdXp6ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvbXBlZzRfd3JpdGVyX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliZDJiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dyaXRlcl9mdXp6ZXJzL21wZWc0X3dyaXRlcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiV3JpdGVyRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIE1wZWc0V3JpdGVyRnV6emVyIDogcHVibGljIFdyaXRlckZ1enplckJhc2UgeworICAgcHVibGljOgorICAgIGJvb2wgY3JlYXRlV3JpdGVyKCk7Cit9OworCitib29sIE1wZWc0V3JpdGVyRnV6emVyOjpjcmVhdGVXcml0ZXIoKSB7CisgICAgbVdyaXRlciA9IG5ldyBNUEVHNFdyaXRlcihtRmQpOworICAgIGlmICghbVdyaXRlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1GaWxlTWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBtRmlsZU1ldGEtPnNldEludDMyKGtLZXlGaWxlVHlwZSwgb3V0cHV0X2Zvcm1hdDo6T1VUUFVUX0ZPUk1BVF9NUEVHXzQpOworICAgIHJldHVybiB0cnVlOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTXBlZzRXcml0ZXJGdXp6ZXIgd3JpdGVyRnV6emVyOworICAgIHdyaXRlckZ1enplci5pbml0RmlsZVdyaXRlckFuZFByb2Nlc3NEYXRhKGRhdGEsIHNpemUpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvb2dnX3dyaXRlcl9mdXp6ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvb2dnX3dyaXRlcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOWM5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9vZ2dfd3JpdGVyX2Z1enplci5jcHAKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpbmNsdWRlICJXcml0ZXJGdXp6ZXJCYXNlLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIE9HR1dyaXRlckZ1enplciA6IHB1YmxpYyBXcml0ZXJGdXp6ZXJCYXNlIHsKKyAgIHB1YmxpYzoKKyAgICBib29sIGNyZWF0ZVdyaXRlcigpOworfTsKKworYm9vbCBPR0dXcml0ZXJGdXp6ZXI6OmNyZWF0ZVdyaXRlcigpIHsKKyAgICBtV3JpdGVyID0gbmV3IE9nZ1dyaXRlcihtRmQpOworICAgIGlmICghbVdyaXRlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1GaWxlTWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBtRmlsZU1ldGEtPnNldEludDMyKGtLZXlGaWxlVHlwZSwgb3V0cHV0X2Zvcm1hdDo6T1VUUFVUX0ZPUk1BVF9PR0cpOworICAgIHJldHVybiB0cnVlOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgT0dHV3JpdGVyRnV6emVyIHdyaXRlckZ1enplcjsKKyAgICB3cml0ZXJGdXp6ZXIuaW5pdEZpbGVXcml0ZXJBbmRQcm9jZXNzRGF0YShkYXRhLCBzaXplKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dyaXRlcl9mdXp6ZXJzL3dlYm1fd3JpdGVyX2Z1enplci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy93ZWJtX3dyaXRlcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOTFiNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy93ZWJtX3dyaXRlcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiV3JpdGVyRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSA8d2VibS9XZWJtV3JpdGVyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBXRUJNV3JpdGVyRnV6emVyIDogcHVibGljIFdyaXRlckZ1enplckJhc2UgeworICAgcHVibGljOgorICAgIGJvb2wgY3JlYXRlV3JpdGVyKCk7Cit9OworCitib29sIFdFQk1Xcml0ZXJGdXp6ZXI6OmNyZWF0ZVdyaXRlcigpIHsKKyAgICBtV3JpdGVyID0gbmV3IFdlYm1Xcml0ZXIobUZkKTsKKyAgICBpZiAoIW1Xcml0ZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtRmlsZU1ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgbUZpbGVNZXRhLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG91dHB1dF9mb3JtYXQ6Ok9VVFBVVF9GT1JNQVRfV0VCTSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBXRUJNV3JpdGVyRnV6emVyIHdyaXRlckZ1enplcjsKKyAgICB3cml0ZXJGdXp6ZXIuaW5pdEZpbGVXcml0ZXJBbmRQcm9jZXNzRGF0YShkYXRhLCBzaXplKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKaW5kZXggN2VkMGU4OC4uMDU1ZGQ4MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X2hlYWRlcnMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXJfaGVhZGVycyIsCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCkBAIC00OSw0ICs1OCwzIEBACiAgICAgc3JjczogWyJtZWRpYV9jb2RlY3MueHNkIl0sCiAgICAgcGFja2FnZV9uYW1lOiAibWVkaWEuY29kZWNzIiwKIH0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAKaW5kZXggYTIzMjE1MC4uZGJkYjQzYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCkBAIC00OTMsNyArNDkzLDcgQEAKICAgICAgIG1QYXRoKHBhdGgpLAogICAgICAgbVN0YXR1cyhOT19JTklUKSB7CiAgICAgLy8gZGV0ZXJtaW5lIGhyZWZfYmFzZQotICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZW5kID0gcGF0aC5yZmluZCgiLyIpOworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZW5kID0gcGF0aC5yZmluZCgnLycpOwogICAgIGlmIChlbmQgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKICAgICAgICAgbUhyZWZCYXNlID0gcGF0aC5zdWJzdHIoMCwgZW5kICsgMSk7CiAgICAgfQpAQCAtMTUyNSw3ICsxNTI1LDcgQEAKICAgICAgICAgICAgICAgICBub2RlSW5mby5hdHRyaWJ1dGVMaXN0LnB1c2hfYmFjayhBdHRyaWJ1dGV7InJhbmsiLCByYW5rfSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBub2RlTGlzdC0+aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAotICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUob3JkZXIpLCBzdGQ6Om1vdmUobm9kZUluZm8pKSk7CisgICAgICAgICAgICAgICAgICAgIG9yZGVyLCBzdGQ6Om1vdmUobm9kZUluZm8pKSk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmQ1NzdjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvQW5kcm9pZC5icApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSJdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiWE1MUGFyc2VyVGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJYTUxQYXJzZXJUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgZGF0YTogWyI6eG1scGFyc2VydGVzdF90ZXN0X2ZpbGVzIixdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorfQorCitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJ4bWxwYXJzZXJ0ZXN0X3Rlc3RfZmlsZXMiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RkYXRhL21lZGlhX2NvZGVjc191bml0X3Rlc3QueG1sIiwKKyAgICAgICAgInRlc3RkYXRhL21lZGlhX2NvZGVjc191bml0X3Rlc3RfY2FsbGVyLnhtbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTExYjFiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciB4bWwgcGFyc2VyIHVuaXQgdGVzdCI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9IlhNTFBhcnNlclRlc3QiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0ibWVkaWFfY29kZWNzX3VuaXRfdGVzdC54bWwtPi9kYXRhL2xvY2FsL3RtcC9tZWRpYV9jb2RlY3NfdW5pdF90ZXN0LnhtbCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0ibWVkaWFfY29kZWNzX3VuaXRfdGVzdF9jYWxsZXIueG1sLT4vZGF0YS9sb2NhbC90bXAvbWVkaWFfY29kZWNzX3VuaXRfdGVzdF9jYWxsZXIueG1sIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJYTUxQYXJzZXJUZXN0LT4vZGF0YS9sb2NhbC90bXAvWE1MUGFyc2VyVGVzdCIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iWE1MUGFyc2VyVGVzdCIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkzNjNmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L1JFQURNRS5tZApAQCAtMCwwICsxLDMzIEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgWE1MIFBhcnNlcgorVGhlIFhNTFBhcnNlciBUZXN0IFN1aXRlIHZhbGlkYXRlcyB0aGUgWE1MUGFyc2VyIGF2YWlsYWJsZSBpbiBsaWJzdGFnZWZyaWdodC4KKworUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6CitgYGAKK20gWE1MUGFyc2VyVGVzdAorYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9YTUxQYXJzZXJUZXN0L1hNTFBhcnNlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9YTUxQYXJzZXJUZXN0L1hNTFBhcnNlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK3VzYWdlOiBYTUxQYXJzZXJUZXN0CitgYGAKK2FkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvWE1MUGFyc2VyVGVzdAorYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBYTUxQYXJzZXJUZXN0CitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L1hNTFBhcnNlclRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvWE1MUGFyc2VyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkZDM3NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L1hNTFBhcnNlclRlc3QuY3BwCkBAIC0wLDAgKzEsMzkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJYTUxQYXJzZXJUZXN0IgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmg+CisKKyNpbmNsdWRlICJYTUxQYXJzZXJUZXN0RW52aXJvbm1lbnQuaCIKKworI2RlZmluZSBYTUxfRklMRV9OQU1FICJtZWRpYV9jb2RlY3NfdW5pdF90ZXN0X2NhbGxlci54bWwiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0aWMgWE1MUGFyc2VyVGVzdEVudmlyb25tZW50ICpnRW52ID0gbnVsbHB0cjsKKworc3RydWN0IENvZGVjUHJvcGVydGllcyB7CisgICAgc3RyaW5nIGNvZGVjTmFtZTsKKyAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Q29kZWNQcm9wZXJ0aWVzIGNvZGVjUHJvcDsKK307CisKK3N0cnVjdCBSb2xlUHJvcGVydGllcyB7CisgICAgc3RyaW5nIHJvbGVOYW1lOworICAgIHN0cmluZyB0eXBlTmFtZTsKKyAgICBzdHJpbmcgY29kZWNOYW1lOworICAgIGJvb2wgaXNFbmNvZGVyOworICAgIHNpemVfdCBvcmRlcjsKKyAgICB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4+IGF0dHJpYnV0ZU1hcDsKK307CisKK2NsYXNzIFhNTFBhcnNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICBwdWJsaWM6CisgICAgflhNTFBhcnNlVGVzdCgpIHsKKyAgICAgICAgaWYgKG1FbGVTdHJlYW0uaXNfb3BlbigpKSBtRWxlU3RyZWFtLmNsb3NlKCk7CisgICAgICAgIG1JbnB1dERhdGFWZWN0b3IuY2xlYXIoKTsKKyAgICAgICAgbUlucHV0Um9sZVZlY3Rvci5jbGVhcigpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsgc2V0VXBEYXRhYmFzZSgpOyB9CisKKyAgICB2b2lkIHNldFVwRGF0YWJhc2UoKTsKKworICAgIHZvaWQgc2V0Q29kZWNQcm9wZXJ0aWVzKHN0cmluZyBjb2RlY05hbWUsIGJvb2wgaXNFbmNvZGVyLCBpbnQzMl90IG9yZGVyLCBzZXQ8c3RyaW5nPiBxdWlya1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ8c3RyaW5nPiBkb21haW5TZXQsIHNldDxzdHJpbmc+IHZhcmlhbnRTZXQsIHN0cmluZyB0eXBlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4+IGRvbWFpbiwgdmVjdG9yPHN0cmluZz4gYWxpYXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcmFuayk7CisKKyAgICB2b2lkIHNldFJvbGVQcm9wZXJ0aWVzKHN0cmluZyByb2xlTmFtZSwgYm9vbCBpc0VuY29kZXIsIGludDMyX3Qgb3JkZXIsIHN0cmluZyB0eXBlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb2RlY05hbWUsIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPj4gZG9tYWluKTsKKworICAgIHZvaWQgc2V0U2VydmljZUF0dHJpYnV0ZShtYXA8c3RyaW5nLCBzdHJpbmc+IHNlcnZpY2VBdHRyaWJ1dGVOYW1lVmFsdWVQYWlyKTsKKworICAgIHZvaWQgcHJpbnRDb2RlY01hcChjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Q29kZWMgbWNvZGVjKTsKKworICAgIHZvaWQgY2hlY2tSb2xlTWFwKGludDMyX3QgaW5kZXgsIGJvb2wgaXNFbmNvZGVyLCBzdHJpbmcgdHlwZU5hbWUsIHN0cmluZyBjb2RlY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+PiBhdHRyTWFwKTsKKworICAgIGJvb2wgY29tcGFyZU1hcChjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+ICZsaHMsIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4gJnJocyk7CisKKyAgICBpZnN0cmVhbSBtRWxlU3RyZWFtOworICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyIG1QYXJzZXI7CisgICAgdmVjdG9yPENvZGVjUHJvcGVydGllcz4gbUlucHV0RGF0YVZlY3RvcjsKKyAgICB2ZWN0b3I8Um9sZVByb3BlcnRpZXM+IG1JbnB1dFJvbGVWZWN0b3I7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBtSW5wdXRTZXJ2aWNlQXR0cmlidXRlTWFwOworfTsKKwordm9pZCBYTUxQYXJzZVRlc3Q6OnNldFVwRGF0YWJhc2UoKSB7CisgICAgLy8gVGhlIHZhbHVlcyBzZXQgYmVsb3cgYXJlIHNwZWNpZmljIHRvIHRlc3QgdmVjdG9yIHRlc3RkYXRhL21lZGlhX2NvZGVjc191bml0X3Rlc3QueG1sCisgICAgc2V0Q29kZWNQcm9wZXJ0aWVzKCJ0ZXN0MS5kZWNvZGVyIiwgZmFsc2UsIDEsIHsiYXR0cmlidXRlOjpkaXNhYmxlZCIsICJxdWlyazo6cXVpcmsxIn0sCisgICAgICAgICAgICAgICAgICAgICAgIHsidGVsZXBob255In0sIHt9LCAiYXVkaW8vbXBlZyIsIHt9LCB7ImFsaWFzMS5kZWNvZGVyIn0sICI0Iik7CisKKyAgICBzZXRDb2RlY1Byb3BlcnRpZXMoInRlc3QyLmRlY29kZXIiLCBmYWxzZSwgMiwgeyJxdWlyazo6cXVpcmsxIn0sIHt9LCB7fSwgImF1ZGlvLzNncHAiLCB7fSwge30sCisgICAgICAgICAgICAgICAgICAgICAgICIiKTsKKworICAgIHNldENvZGVjUHJvcGVydGllcygidGVzdDMuZGVjb2RlciIsIGZhbHNlLCAzLCB7fSwge30sIHt9LCAiYXVkaW8vYW1yLXdiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJmZWF0dXJlLWZlYXR1cmUxIiwgImZlYXR1cmUxVmFsIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oImZlYXR1cmUtZmVhdHVyZTIiLCAiMCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJmZWF0dXJlLWZlYXR1cmUzIiwgIjAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAge30sICIiKTsKKworICAgIHNldENvZGVjUHJvcGVydGllcygidGVzdDQuZGVjb2RlciIsIGZhbHNlLCA0LCB7fSwge30sIHt9LCAiYXVkaW8vZmxhYyIsCisgICAgICAgICAgICAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigiZmVhdHVyZS1mZWF0dXJlMSIsICJmZWF0dXJlMVZhbCIpfSwge30sICIiKTsKKworICAgIHNldENvZGVjUHJvcGVydGllcygidGVzdDUuZGVjb2RlciIsIGZhbHNlLCA1LCB7ImF0dHJpYnV0ZTo6YXR0cmlidXRlUXVpcmsxIn0sIHt9LCB7fSwKKyAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvL2c3MTEtbWxhdyIsIHt9LCB7fSwgIiIpOworCisgICAgc2V0Q29kZWNQcm9wZXJ0aWVzKCJ0ZXN0Ni5kZWNvZGVyIiwgZmFsc2UsIDYsIHt9LCB7fSwgeyJ2YXJpYW50MSIsICJ2YXJpYW50MiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8vbXA0YS1sYXRtIiwKKyAgICAgICAgICAgICAgICAgICAgICAge3BhaXI8c3RyaW5nLCBzdHJpbmc+KCJ2YXJpYW50MTo6OnZhcmlhbnQxTGltaXQxLXJhbmdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXJpYW50MUxpbWl0MU1pbi12YXJpYW50MUxpbWl0MU1heCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oInZhcmlhbnQxOjo6dmFyaWFudDFMaW1pdDItcmFuZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhcmlhbnQxTGltaXQyTG93LXZhcmlhbnQxTGltaXQySGlnaCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oInZhcmlhbnQyOjo6dmFyaWFudDJMaW1pdDEiLCAidmFyaWFudDJMaW1pdDFWYWx1ZSIpfSwKKyAgICAgICAgICAgICAgICAgICAgICAge30sICIiKTsKKworICAgIHNldENvZGVjUHJvcGVydGllcygKKyAgICAgICAgICAgICJ0ZXN0Ny5kZWNvZGVyIiwgZmFsc2UsIDcsIHt9LCB7fSwge30sICJhdWRpby92b3JiaXMiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigiLW1pbi1saW1pdDEiLCAibGltaXQxTWluIiksCisgICAgICAgICAgICAgICAgICAgIC8qcGFpcjxzdHJpbmcsIHN0cmluZz4oImxpbWl0MS1pbiIsICJsaW1pdDFJbiIpLCovCisgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJsaW1pdDItcmFuZ2UiLCAibGltaXQyTWluLWxpbWl0Mk1heCIpLAorICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigibGltaXQyLXNjYWxlIiwgImxpbWl0MlNjYWxlIiksCisgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJsaW1pdDMtZGVmYXVsdCIsICJsaW1pdDNWYWwzIiksCisgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJsaW1pdDMtcmFuZ2VzIiwgImxpbWl0M1ZhbDEsbGltaXQzVmFsMixsaW1pdDNWYWwzIiksCisgICAgICAgICAgICB9LAorICAgICAgICAgICAge30sICIiKTsKKworICAgIHNldENvZGVjUHJvcGVydGllcygidGVzdDguZW5jb2RlciIsIHRydWUsIDgsIHt9LCB7fSwge30sICJhdWRpby9vcHVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAge3BhaXI8c3RyaW5nLCBzdHJpbmc+KCJtYXgtbGltaXQxIiwgImxpbWl0MU1heCIpfSwge30sICIiKTsKKworICAgIHNldFJvbGVQcm9wZXJ0aWVzKCJhdWRpb19kZWNvZGVyLm1wMyIsIGZhbHNlLCAxLCAiYXVkaW8vbXBlZyIsICJ0ZXN0MS5kZWNvZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFpcjxzdHJpbmcsIHN0cmluZz4oImF0dHJpYnV0ZTo6ZGlzYWJsZWQiLCAicHJlc2VudCIpLAorICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigicmFuayIsICI0Iil9KTsKKworICAgIHNldFJvbGVQcm9wZXJ0aWVzKCJhdWRpb19kZWNvZGVyLmFtcm5iIiwgZmFsc2UsIDIsICJhdWRpby8zZ3BwIiwgInRlc3QyLmRlY29kZXIiLCB7fSk7CisKKyAgICBzZXRSb2xlUHJvcGVydGllcygiYXVkaW9fZGVjb2Rlci5hbXJ3YiIsIGZhbHNlLCAzLCAiYXVkaW8vYW1yLXdiIiwgInRlc3QzLmRlY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigiZmVhdHVyZS1mZWF0dXJlMSIsICJmZWF0dXJlMVZhbCIpLAorICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigiZmVhdHVyZS1mZWF0dXJlMiIsICIwIiksCisgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJmZWF0dXJlLWZlYXR1cmUzIiwgIjAiKX0pOworCisgICAgc2V0Um9sZVByb3BlcnRpZXMoImF1ZGlvL2ZsYWMiLCBmYWxzZSwgNCwgImF1ZGlvL2ZsYWMiLCAidGVzdDQuZGVjb2RlciIsCisgICAgICAgICAgICAgICAgICAgICAge3BhaXI8c3RyaW5nLCBzdHJpbmc+KCJmZWF0dXJlLWZlYXR1cmUxIiwgImZlYXR1cmUxVmFsIil9KTsKKworICAgIHNldFJvbGVQcm9wZXJ0aWVzKCJhdWRpb19kZWNvZGVyLmc3MTFtbGF3IiwgZmFsc2UsIDUsICJhdWRpby9nNzExLW1sYXciLCAidGVzdDUuZGVjb2RlciIsCisgICAgICAgICAgICAgICAgICAgICAge3BhaXI8c3RyaW5nLCBzdHJpbmc+KCJhdHRyaWJ1dGU6OmF0dHJpYnV0ZVF1aXJrMSIsICJwcmVzZW50Iil9KTsKKworICAgIHNldFJvbGVQcm9wZXJ0aWVzKCJhdWRpb19kZWNvZGVyLmFhYyIsIGZhbHNlLCA2LCAiYXVkaW8vbXA0YS1sYXRtIiwgInRlc3Q2LmRlY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigidmFyaWFudDE6Ojp2YXJpYW50MUxpbWl0MS1yYW5nZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXJpYW50MUxpbWl0MU1pbi12YXJpYW50MUxpbWl0MU1heCIpLAorICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigidmFyaWFudDE6Ojp2YXJpYW50MUxpbWl0Mi1yYW5nZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXJpYW50MUxpbWl0Mkxvdy12YXJpYW50MUxpbWl0MkhpZ2giKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oInZhcmlhbnQyOjo6dmFyaWFudDJMaW1pdDEiLCAidmFyaWFudDJMaW1pdDFWYWx1ZSIpfSk7CisKKyAgICBzZXRSb2xlUHJvcGVydGllcygiYXVkaW9fZGVjb2Rlci52b3JiaXMiLCBmYWxzZSwgNywgImF1ZGlvL3ZvcmJpcyIsICJ0ZXN0Ny5kZWNvZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFpcjxzdHJpbmcsIHN0cmluZz4oIi1taW4tbGltaXQxIiwgImxpbWl0MU1pbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAvKnBhaXI8c3RyaW5nLCBzdHJpbmc+KCJsaW1pdDEtaW4iLCAibGltaXQxSW4iKSwqLworICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigibGltaXQyLXJhbmdlIiwgImxpbWl0Mk1pbi1saW1pdDJNYXgiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oImxpbWl0Mi1zY2FsZSIsICJsaW1pdDJTY2FsZSIpLAorICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigibGltaXQzLWRlZmF1bHQiLCAibGltaXQzVmFsMyIpLAorICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigibGltaXQzLXJhbmdlcyIsICJsaW1pdDNWYWwxLGxpbWl0M1ZhbDIsbGltaXQzVmFsMyIpfSk7CisKKyAgICBzZXRSb2xlUHJvcGVydGllcygiYXVkaW9fZW5jb2Rlci5vcHVzIiwgdHJ1ZSwgOCwgImF1ZGlvL29wdXMiLCAidGVzdDguZW5jb2RlciIsCisgICAgICAgICAgICAgICAgICAgICAge3BhaXI8c3RyaW5nLCBzdHJpbmc+KCJtYXgtbGltaXQxIiwgImxpbWl0MU1heCIpfSk7CisKKyAgICBzZXRTZXJ2aWNlQXR0cmlidXRlKAorICAgICAgICAgICAge3BhaXI8c3RyaW5nLCBzdHJpbmc+KCJkb21haW4tdGVsZXBob255IiwgIjAiKSwgcGFpcjxzdHJpbmcsIHN0cmluZz4oImRvbWFpbi10diIsICIwIiksCisgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oInNldHRpbmcyIiwgIjAiKSwgcGFpcjxzdHJpbmcsIHN0cmluZz4oInZhcmlhbnQtdmFyaWFudDEiLCAiMCIpfSk7Cit9CisKK2Jvb2wgWE1MUGFyc2VUZXN0Ojpjb21wYXJlTWFwKGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4gJmxocywgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiAmcmhzKSB7CisgICAgcmV0dXJuIGxocy5zaXplKCkgPT0gcmhzLnNpemUoKSAmJiBlcXVhbChsaHMuYmVnaW4oKSwgbGhzLmVuZCgpLCByaHMuYmVnaW4oKSk7Cit9CisKK3ZvaWQgWE1MUGFyc2VUZXN0OjpzZXRDb2RlY1Byb3BlcnRpZXMoc3RyaW5nIGNvZGVjTmFtZSwgYm9vbCBpc0VuY29kZXIsIGludDMyX3Qgb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDxzdHJpbmc+IHF1aXJrU2V0LCBzZXQ8c3RyaW5nPiBkb21haW5TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDxzdHJpbmc+IHZhcmlhbnRTZXQsIHN0cmluZyB0eXBlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+PiBkb21haW4sIHZlY3RvcjxzdHJpbmc+IGFsaWFzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyByYW5rKSB7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBBdHRyaWJ1dGVNYXBEQjsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkF0dHJTdHIgOiBkb21haW4pIHsKKyAgICAgICAgQXR0cmlidXRlTWFwREIuaW5zZXJ0KEF0dHJTdHIpOworICAgIH0KKyAgICBtYXA8c3RyaW5nLCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwPiBUeXBlTWFwRGF0YUJhc2U7CisgICAgVHlwZU1hcERhdGFCYXNlLmluc2VydCgKKyAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwPih0eXBlTmFtZSwgQXR0cmlidXRlTWFwREIpKTsKKyAgICBDb2RlY1Byb3BlcnRpZXMgY29kZWNQcm9wZXJ0eTsKKyAgICBjb2RlY1Byb3BlcnR5LmNvZGVjTmFtZSA9IGNvZGVjTmFtZTsKKyAgICBjb2RlY1Byb3BlcnR5LmNvZGVjUHJvcC5pc0VuY29kZXIgPSBpc0VuY29kZXI7CisgICAgY29kZWNQcm9wZXJ0eS5jb2RlY1Byb3Aub3JkZXIgPSBvcmRlcjsKKyAgICBjb2RlY1Byb3BlcnR5LmNvZGVjUHJvcC5xdWlya1NldCA9IHF1aXJrU2V0OworICAgIGNvZGVjUHJvcGVydHkuY29kZWNQcm9wLmRvbWFpblNldCA9IGRvbWFpblNldDsKKyAgICBjb2RlY1Byb3BlcnR5LmNvZGVjUHJvcC52YXJpYW50U2V0ID0gdmFyaWFudFNldDsKKyAgICBjb2RlY1Byb3BlcnR5LmNvZGVjUHJvcC50eXBlTWFwID0gVHlwZU1hcERhdGFCYXNlOworICAgIGNvZGVjUHJvcGVydHkuY29kZWNQcm9wLmFsaWFzZXMgPSBhbGlhc2VzOworICAgIGNvZGVjUHJvcGVydHkuY29kZWNQcm9wLnJhbmsgPSByYW5rOworICAgIG1JbnB1dERhdGFWZWN0b3IucHVzaF9iYWNrKGNvZGVjUHJvcGVydHkpOworfQorCit2b2lkIFhNTFBhcnNlVGVzdDo6c2V0Um9sZVByb3BlcnRpZXMoc3RyaW5nIHJvbGVOYW1lLCBib29sIGlzRW5jb2RlciwgaW50MzJfdCBvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdHlwZU5hbWUsIHN0cmluZyBjb2RlY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+PiBhdHRyaWJ1dGVOYW1lVmFsdWVQYWlyKSB7CisgICAgc3RydWN0IFJvbGVQcm9wZXJ0aWVzIHJvbGVQcm9wZXJ0eTsKKyAgICByb2xlUHJvcGVydHkucm9sZU5hbWUgPSByb2xlTmFtZTsKKyAgICByb2xlUHJvcGVydHkudHlwZU5hbWUgPSB0eXBlTmFtZTsKKyAgICByb2xlUHJvcGVydHkuY29kZWNOYW1lID0gY29kZWNOYW1lOworICAgIHJvbGVQcm9wZXJ0eS5pc0VuY29kZXIgPSBpc0VuY29kZXI7CisgICAgcm9sZVByb3BlcnR5Lm9yZGVyID0gb3JkZXI7CisgICAgcm9sZVByb3BlcnR5LmF0dHJpYnV0ZU1hcCA9IGF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXI7CisgICAgbUlucHV0Um9sZVZlY3Rvci5wdXNoX2JhY2socm9sZVByb3BlcnR5KTsKK30KKwordm9pZCBYTUxQYXJzZVRlc3Q6OnNldFNlcnZpY2VBdHRyaWJ1dGUobWFwPHN0cmluZywgc3RyaW5nPiBzZXJ2aWNlQXR0cmlidXRlTmFtZVZhbHVlUGFpcikgeworICAgIGZvciAoY29uc3QgYXV0byAmc2VydmljZUF0dHJTdHIgOiBzZXJ2aWNlQXR0cmlidXRlTmFtZVZhbHVlUGFpcikgeworICAgICAgICBtSW5wdXRTZXJ2aWNlQXR0cmlidXRlTWFwLmluc2VydChzZXJ2aWNlQXR0clN0cik7CisgICAgfQorfQorCit2b2lkIFhNTFBhcnNlVGVzdDo6cHJpbnRDb2RlY01hcChjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Q29kZWMgbWNvZGVjKSB7CisgICAgY29uc3Qgc3RyaW5nICZuYW1lID0gbWNvZGVjLmZpcnN0OworICAgIEFMT0dWKCJjb2RlYyBuYW1lID0gJXNcbiIsIG5hbWUuY19zdHIoKSk7CisgICAgY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjUHJvcGVydGllcyAmcHJvcGVydGllcyA9IG1jb2RlYy5zZWNvbmQ7CisgICAgYm9vbCBpc0VuY29kZXIgPSBwcm9wZXJ0aWVzLmlzRW5jb2RlcjsKKyAgICBBTE9HVigiaXNFbmNvZGVyID0gJWRcbiIsIGlzRW5jb2Rlcik7CisgICAgc2l6ZV90IG9yZGVyID0gcHJvcGVydGllcy5vcmRlcjsKKyAgICBBTE9HVigib3JkZXIgPSAlenVcbiIsIG9yZGVyKTsKKyAgICBzdHJpbmcgcmFuayA9IHByb3BlcnRpZXMucmFuazsKKyAgICBBTE9HVigicmFuayA9ICVzXG4iLCByYW5rLmNfc3RyKCkpOworCisgICAgZm9yIChhdXRvICZpdHJRdWlya1NldCA6IHByb3BlcnRpZXMucXVpcmtTZXQpIHsKKyAgICAgICAgQUxPR1YoInF1aXJrU2V0PSAlcyIsIGl0clF1aXJrU2V0LmNfc3RyKCkpOworICAgIH0KKworICAgIGZvciAoYXV0byAmaXRyRG9tYWluU2V0IDogcHJvcGVydGllcy5kb21haW5TZXQpIHsKKyAgICAgICAgQUxPR1YoImRvbWFpblNldD0gJXMiLCBpdHJEb21haW5TZXQuY19zdHIoKSk7CisgICAgfQorCisgICAgZm9yIChhdXRvICZpdHJWYXJpYW50U2V0IDogcHJvcGVydGllcy52YXJpYW50U2V0KSB7CisgICAgICAgIEFMT0dWKCJ2YXJpYW50U2V0PSAlcyIsIGl0clZhcmlhbnRTZXQuY19zdHIoKSk7CisgICAgfQorCisgICAgbWFwPHN0cmluZywgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcD4gVHlwZU1hcCA9IHByb3BlcnRpZXMudHlwZU1hcDsKKyAgICBBTE9HVigiVGhlIFR5cGVNYXAgaXMgOiIpOworCisgICAgZm9yIChhdXRvICZpdHJUeXBlTWFwIDogVHlwZU1hcCkgeworICAgICAgICBBTE9HVigiaXRyVHlwZU1hcC0+Zmlyc3RcdCVzXHQiLCBpdHJUeXBlTWFwLmZpcnN0LmNfc3RyKCkpOworCisgICAgICAgIGZvciAoYXV0byAmaXRyQXR0cmlidXRlTWFwIDogaXRyVHlwZU1hcC5zZWNvbmQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJBdHRyaWJ1dGVNYXAtPmZpcnN0ID0gJXMiLCBpdHJBdHRyaWJ1dGVNYXAuZmlyc3QuY19zdHIoKSk7CisgICAgICAgICAgICBBTE9HVigiQXR0cmlidXRlTWFwLT5zZWNvbmQgPSAlcyIsIGl0ckF0dHJpYnV0ZU1hcC5zZWNvbmQuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgWE1MUGFyc2VUZXN0OjpjaGVja1JvbGVNYXAoaW50MzJfdCBpbmRleCwgYm9vbCBpc0VuY29kZXIsIHN0cmluZyB0eXBlTmFtZSwgc3RyaW5nIGNvZGVjTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+PiBBdHRyaWJ1dGVQYWlyTWFwKSB7CisgICAgQVNTRVJUX0VRKGlzRW5jb2RlciwgbUlucHV0Um9sZVZlY3Rvci5hdChpbmRleCkuaXNFbmNvZGVyKQorICAgICAgICAgICAgPDwgIkludmFsaWQgUm9sZU1hcCBkYXRhLiBJc0VuY29kZXIgbWlzbWF0Y2giOworICAgIEFTU0VSVF9FUSh0eXBlTmFtZSwgbUlucHV0Um9sZVZlY3Rvci5hdChpbmRleCkudHlwZU5hbWUpCisgICAgICAgICAgICA8PCAiSW52YWxpZCBSb2xlTWFwIGRhdGEuIHR5cGVOYW1lIG1pc21hdGNoIjsKKyAgICBBU1NFUlRfRVEoY29kZWNOYW1lLCBtSW5wdXRSb2xlVmVjdG9yLmF0KGluZGV4KS5jb2RlY05hbWUpCisgICAgICAgICAgICA8PCAiSW52YWxpZCBSb2xlTWFwIGRhdGEuIGNvZGVjTmFtZSBtaXNtYXRjaCI7CisKKyAgICB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4+OjppdGVyYXRvciBpdHJfYXR0cmlidXRlTWFwREIgPQorICAgICAgICAgICAgKG1JbnB1dFJvbGVWZWN0b3IuYXQoaW5kZXgpLmF0dHJpYnV0ZU1hcCkuYmVnaW4oKTsKKyAgICB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4+OjppdGVyYXRvciBpdHJfYXR0cmlidXRlTWFwID0gQXR0cmlidXRlUGFpck1hcC5iZWdpbigpOworICAgIGZvciAoOyBpdHJfYXR0cmlidXRlTWFwICE9IEF0dHJpYnV0ZVBhaXJNYXAuZW5kKCkgJiYKKyAgICAgICAgICAgaXRyX2F0dHJpYnV0ZU1hcERCICE9IG1JbnB1dFJvbGVWZWN0b3IuYXQoaW5kZXgpLmF0dHJpYnV0ZU1hcC5lbmQoKTsKKyAgICAgICAgICsraXRyX2F0dHJpYnV0ZU1hcCwgKytpdHJfYXR0cmlidXRlTWFwREIpIHsKKyAgICAgICAgc3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBpdHJfYXR0cmlidXRlTWFwLT5maXJzdDsKKyAgICAgICAgc3RyaW5nIGF0dHJpYnV0ZU5hbWVEQiA9IGl0cl9hdHRyaWJ1dGVNYXBEQi0+Zmlyc3Q7CisgICAgICAgIHN0cmluZyBhdHRyaWJ1dGV2YWx1ZSA9IGl0cl9hdHRyaWJ1dGVNYXAtPnNlY29uZDsKKyAgICAgICAgc3RyaW5nIGF0dHJpYnV0ZVZhbHVlREIgPSBpdHJfYXR0cmlidXRlTWFwREItPnNlY29uZDsKKyAgICAgICAgQVNTRVJUX0VRKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWVEQikKKyAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBSb2xlTWFwIGRhdGEuIEF0dHJpYnV0ZSBuYW1lIG1pc21hdGNoXHQiIDw8IGF0dHJpYnV0ZU5hbWUgPDwgIiAhPSAiCisgICAgICAgICAgICAgICAgPDwgImF0dHJpYnV0ZU5hbWVEQiI7CisgICAgICAgIEFTU0VSVF9FUShhdHRyaWJ1dGV2YWx1ZSwgYXR0cmlidXRlVmFsdWVEQikKKyAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBSb2xlTWFwIGRhdGEuIEF0dHJpYnV0ZSB2YWx1ZSBtaXNtYXRjaFx0IiA8PCBhdHRyaWJ1dGV2YWx1ZSA8PCAiICE9ICIKKyAgICAgICAgICAgICAgICA8PCAiYXR0cmlidXRlVmFsdWVEQiI7CisgICAgfQorfQorCitURVNUX0YoWE1MUGFyc2VUZXN0LCBDb2RlY01hcFBhcnNlVGVzdCkgeworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBYTUxfRklMRV9OQU1FOworICAgIG1FbGVTdHJlYW0ub3BlbihpbnB1dEZpbGVOYW1lLCBpZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEobUVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpIDw8ICJGYWlsZWQgdG8gb3BlbiBpbnB1dGZpbGUgIiA8PCBpbnB1dEZpbGVOYW1lOworCisgICAgbVBhcnNlci5wYXJzZVhtbFBhdGgoaW5wdXRGaWxlTmFtZSk7CisgICAgZm9yIChjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Q29kZWMgJm1jb2RlYyA6IG1QYXJzZXIuZ2V0Q29kZWNNYXAoKSkgeworICAgICAgICBwcmludENvZGVjTWFwKG1jb2RlYyk7CisgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpDb2RlY1Byb3BlcnRpZXMgJnByb3BlcnRpZXMgPSBtY29kZWMuc2Vjb25kOworICAgICAgICBpbnQzMl90IGluZGV4ID0gcHJvcGVydGllcy5vcmRlciAtIDE7CisgICAgICAgIEFTU0VSVF9HRShpbmRleCwgMCkgPDwgIkludmFsaWQgb3JkZXIiOworICAgICAgICBBU1NFUlRfRVEobUlucHV0RGF0YVZlY3Rvci5hdChpbmRleCkuY29kZWNOYW1lLCBtY29kZWMuZmlyc3QuY19zdHIoKSkKKyAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBDb2RlY01hcCBkYXRhLiBjb2RlY05hbWUgbWlzbWF0Y2giOworICAgICAgICBBU1NFUlRfRVEocHJvcGVydGllcy5pc0VuY29kZXIsIG1JbnB1dERhdGFWZWN0b3IuYXQoaW5kZXgpLmNvZGVjUHJvcC5pc0VuY29kZXIpCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgQ29kZWNNYXAgZGF0YS4gaXNFbmNvZGVyIG1pc21hdGNoIjsKKyAgICAgICAgQVNTRVJUX0VRKHByb3BlcnRpZXMub3JkZXIsIG1JbnB1dERhdGFWZWN0b3IuYXQoaW5kZXgpLmNvZGVjUHJvcC5vcmRlcikKKyAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBDb2RlY01hcCBkYXRhLiBvcmRlciBtaXNtYXRjaCI7CisKKyAgICAgICAgc2V0PHN0cmluZz4gcXVpcmtTZXREQiA9IG1JbnB1dERhdGFWZWN0b3IuYXQoaW5kZXgpLmNvZGVjUHJvcC5xdWlya1NldDsKKyAgICAgICAgc2V0PHN0cmluZz4gcXVpcmtTZXQgPSBwcm9wZXJ0aWVzLnF1aXJrU2V0OworICAgICAgICBzZXQ8c3RyaW5nPiBxdWlya0RpZmZlcmVuY2U7CisgICAgICAgIHNldF9kaWZmZXJlbmNlKHF1aXJrU2V0REIuYmVnaW4oKSwgcXVpcmtTZXREQi5lbmQoKSwgcXVpcmtTZXQuYmVnaW4oKSwgcXVpcmtTZXQuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGVyKHF1aXJrRGlmZmVyZW5jZSwgcXVpcmtEaWZmZXJlbmNlLmVuZCgpKSk7CisgICAgICAgIEFTU0VSVF9FUShxdWlya0RpZmZlcmVuY2Uuc2l6ZSgpLCAwKSA8PCAiQ29kZWNNYXA6cXVpcmsgbWlzbWF0Y2giOworCisgICAgICAgIG1hcDxzdHJpbmcsIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpBdHRyaWJ1dGVNYXA+IFR5cGVNYXBEQiA9CisgICAgICAgICAgICAgICAgbUlucHV0RGF0YVZlY3Rvci5hdChpbmRleCkuY29kZWNQcm9wLnR5cGVNYXA7CisgICAgICAgIG1hcDxzdHJpbmcsIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpBdHRyaWJ1dGVNYXA+IFR5cGVNYXAgPSBwcm9wZXJ0aWVzLnR5cGVNYXA7CisgICAgICAgIG1hcDxzdHJpbmcsIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpBdHRyaWJ1dGVNYXA+OjppdGVyYXRvciBpdHJfVHlwZU1hcERCID0gVHlwZU1hcERCLmJlZ2luKCk7CisgICAgICAgIG1hcDxzdHJpbmcsIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpBdHRyaWJ1dGVNYXA+OjppdGVyYXRvciBpdHJfVHlwZU1hcCA9IFR5cGVNYXAuYmVnaW4oKTsKKworICAgICAgICBBU1NFUlRfRVEoVHlwZU1hcERCLnNpemUoKSwgVHlwZU1hcC5zaXplKCkpCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgQ29kZWNNYXAgZGF0YS4gVHlwZW1hcCBzaXplIG1pc21hdGNoIjsKKworICAgICAgICBmb3IgKDsgaXRyX1R5cGVNYXAgIT0gVHlwZU1hcC5lbmQoKSAmJiBpdHJfVHlwZU1hcERCICE9IFR5cGVNYXBEQi5lbmQoKTsKKyAgICAgICAgICAgICArK2l0cl9UeXBlTWFwLCArK2l0cl9UeXBlTWFwREIpIHsKKyAgICAgICAgICAgIEFTU0VSVF9FUShpdHJfVHlwZU1hcC0+Zmlyc3QsIGl0cl9UeXBlTWFwREItPmZpcnN0KQorICAgICAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBDb2RlY01hcCBkYXRhLiB0eXBlIG1pc21hdGNoIjsKKyAgICAgICAgICAgIGJvb2wgZmxhZyA9IGNvbXBhcmVNYXAoaXRyX1R5cGVNYXAtPnNlY29uZCwgaXRyX1R5cGVNYXBEQi0+c2Vjb25kKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZsYWcpIDw8ICJ0eXBlTWFwIG1pc21hdGNoIjsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlRfRVEobUlucHV0RGF0YVZlY3Rvci5hdChpbmRleCkuY29kZWNQcm9wLnJhbmssIHByb3BlcnRpZXMucmFuaykKKyAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBDb2RlY01hcCBkYXRhLiByYW5rIG1pc21hdGNoIjsKKyAgICB9Cit9CisKK1RFU1RfRihYTUxQYXJzZVRlc3QsIFJvbGVNYXBQYXJzZVRlc3QpIHsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgWE1MX0ZJTEVfTkFNRTsKKyAgICBtRWxlU3RyZWFtLm9wZW4oaW5wdXRGaWxlTmFtZSwgaWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKSA8PCAiRmFpbGVkIHRvIG9wZW4gaW5wdXRmaWxlICIgPDwgaW5wdXRGaWxlTmFtZTsKKworICAgIG1QYXJzZXIucGFyc2VYbWxQYXRoKGlucHV0RmlsZU5hbWUpOworCisgICAgZm9yIChhdXRvICZtUm9sZSA6IG1QYXJzZXIuZ2V0Um9sZU1hcCgpKSB7CisgICAgICAgIHR5cGVkZWYgcGFpcjxzdHJpbmcsIHN0cmluZz4gQXR0cmlidXRlOworICAgICAgICBjb25zdCBzdHJpbmcgJnJvbGVOYW1lID0gbVJvbGUuZmlyc3Q7CisgICAgICAgIEFMT0dWKCJSb2xlIG1hcDpuYW1lID0gJXNcbiIsIHJvbGVOYW1lLmNfc3RyKCkpOworICAgICAgICBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Um9sZVByb3BlcnRpZXMgJnByb3BlcnRpZXMgPSBtUm9sZS5zZWNvbmQ7CisgICAgICAgIHN0cmluZyB0eXBlID0gcHJvcGVydGllcy50eXBlOworICAgICAgICBBTE9HVigiUm9sZSBtYXA6IHR5cGUgPSAlc1xuIiwgdHlwZS5jX3N0cigpKTsKKworICAgICAgICBib29sIGlzRW5jb2RlciA9IHByb3BlcnRpZXMuaXNFbmNvZGVyOworICAgICAgICBBTE9HVigiUm9sZSBtYXA6IGlzRW5jb2RlciA9ICVkXG4iLCBpc0VuY29kZXIpOworCisgICAgICAgIG11bHRpbWFwPHNpemVfdCwgTWVkaWFDb2RlY3NYbWxQYXJzZXI6Ok5vZGVJbmZvPiBub2RlTGlzdCA9IHByb3BlcnRpZXMubm9kZUxpc3Q7CisgICAgICAgIG11bHRpbWFwPHNpemVfdCwgTWVkaWFDb2RlY3NYbWxQYXJzZXI6Ok5vZGVJbmZvPjo6aXRlcmF0b3IgaXRyX05vZGU7CisgICAgICAgIEFMT0dWKCJcblRoZSBtdWx0aW1hcCBub2RlTGlzdCBpcyA6IFxuIik7CisgICAgICAgIGZvciAoaXRyX05vZGUgPSBub2RlTGlzdC5iZWdpbigpOyBpdHJfTm9kZSAhPSBub2RlTGlzdC5lbmQoKTsgKytpdHJfTm9kZSkgeworICAgICAgICAgICAgQUxPR1YoIml0cl9Ob2RlLT5maXJzdD1PUkRFUj1cdCV6dVx0IiwgaXRyX05vZGUtPmZpcnN0KTsKKyAgICAgICAgICAgIGludDMyX3QgaW5kZXggPSBpdHJfTm9kZS0+Zmlyc3QgLSAxOworICAgICAgICAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6Ok5vZGVJbmZvIG5vZGVQdHIgPSBpdHJfTm9kZS0+c2Vjb25kOworICAgICAgICAgICAgQUxPR1YoIlJvbGUgbWFwOml0cl9Ob2RlLT5zZWNvbmQubmFtZSA9ICVzXG4iLCBub2RlUHRyLm5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICB2ZWN0b3I8QXR0cmlidXRlPiBhdHRyTGlzdCA9IG5vZGVQdHIuYXR0cmlidXRlTGlzdDsKKyAgICAgICAgICAgIGZvciAoYXV0byBhdHRyTmFtZVZhbHVlTGlzdCA9IGF0dHJMaXN0LmJlZ2luKCk7IGF0dHJOYW1lVmFsdWVMaXN0ICE9IGF0dHJMaXN0LmVuZCgpOworICAgICAgICAgICAgICAgICArK2F0dHJOYW1lVmFsdWVMaXN0KSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlJvbGUgbWFwOm5vZGVQdHIuYXR0cmlidXRlTGlzdC0+Zmlyc3QgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZVZhbHVlTGlzdC0+Zmlyc3QuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIlJvbGUgbWFwOm5vZGVQdHIuYXR0cmlidXRlTGlzdC0+c2Vjb25kID0gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVWYWx1ZUxpc3QtPnNlY29uZC5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoZWNrUm9sZU1hcChpbmRleCwgaXNFbmNvZGVyLCBwcm9wZXJ0aWVzLnR5cGUsIG5vZGVQdHIubmFtZS5jX3N0cigpLCBhdHRyTGlzdCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1RfRihYTUxQYXJzZVRlc3QsIFNlcnZpY2VBdHRyaWJ1dGVNYXBQYXJzZVRlc3QpIHsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgWE1MX0ZJTEVfTkFNRTsKKyAgICBtRWxlU3RyZWFtLm9wZW4oaW5wdXRGaWxlTmFtZSwgaWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKSA8PCAiRmFpbGVkIHRvIG9wZW4gaW5wdXRmaWxlICIgPDwgaW5wdXRGaWxlTmFtZTsKKworICAgIG1QYXJzZXIucGFyc2VYbWxQYXRoKGlucHV0RmlsZU5hbWUpOworICAgIGNvbnN0IGF1dG8gc2VydmljZUF0dHJpYnV0ZU1hcCA9IG1QYXJzZXIuZ2V0U2VydmljZUF0dHJpYnV0ZU1hcCgpOworICAgIGZvciAoY29uc3QgYXV0byAmYXR0cmlidXRlUGFpciA6IHNlcnZpY2VBdHRyaWJ1dGVNYXApIHsKKyAgICAgICAgQUxPR1YoInNlcnZpY2VBdHRyaWJ1dGUua2V5ID0gJXMgXHQgc2VydmljZUF0dHJpYnV0ZS52YWx1ZSA9ICVzIiwKKyAgICAgICAgICAgICAgYXR0cmlidXRlUGFpci5maXJzdC5jX3N0cigpLCBhdHRyaWJ1dGVQYWlyLnNlY29uZC5jX3N0cigpKTsKKyAgICB9CisgICAgYm9vbCBmbGFnID0gY29tcGFyZU1hcChtSW5wdXRTZXJ2aWNlQXR0cmlidXRlTWFwLCBzZXJ2aWNlQXR0cmlidXRlTWFwKTsKKyAgICBBU1NFUlRfVFJVRShmbGFnKSA8PCAiU2VydmljZU1hcFBhcnNlVGVzdDogdHlwZU1hcCBtaXNtYXRjaCI7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGdFbnYgPSBuZXcgWE1MUGFyc2VyVGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HRCgiWE1MIFBhcnNlciBUZXN0IFJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvWE1MUGFyc2VyVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9YTUxQYXJzZXJUZXN0RW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWEwOWU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvWE1MUGFyc2VyVGVzdEVudmlyb25tZW50LmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19YTUxfUEFSU0VSX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisjZGVmaW5lIF9fWE1MX1BBUlNFUl9URVNUX0VOVklST05NRU5UX0hfXworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGdldG9wdC5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjbGFzcyBYTUxQYXJzZXJUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgIHB1YmxpYzoKKyAgICBYTUxQYXJzZXJUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL2RhdGEvbG9jYWwvdG1wLyIpIHt9CisKKyAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyICpfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IHN0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KKworICBwcml2YXRlOgorICAgIHN0cmluZyByZXM7Cit9OworCitpbnQgWE1MUGFyc2VyVGVzdEVudmlyb25tZW50Ojppbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0ge3sicGF0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LCB7MCwgMCwgMCwgMH19OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiUDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ1AnOiB7CisgICAgICAgICAgICAgICAgc2V0UmVzKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdGluZCA8IGFyZ2MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBvcHRpb246ICVzXG5cbiIKKyAgICAgICAgICAgICAgICAidXNhZ2U6ICVzIDxndGVzdCBvcHRpb25zPiA8dGVzdCBvcHRpb25zPlxuXG4iCisgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKKyAgICAgICAgICAgICAgICAiLVAsIC0tcGF0aDogUmVzb3VyY2UgZmlsZXMgZGlyZWN0b3J5IGxvY2F0aW9uXG4iLAorICAgICAgICAgICAgICAgIGFyZ3Zbb3B0aW5kID86IDFdLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYgIC8vIF9fWE1MX1BBUlNFUl9URVNUX0VOVklST05NRU5UX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvdGVzdGRhdGEvbWVkaWFfY29kZWNzX3VuaXRfdGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC90ZXN0ZGF0YS9tZWRpYV9jb2RlY3NfdW5pdF90ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzI5OWQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvdGVzdGRhdGEvbWVkaWFfY29kZWNzX3VuaXRfdGVzdC54bWwKQEAgLTAsMCArMSw4MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gUkVGRVJFTkNFIDogZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvbWVkaWFfY29kZWNzLnhzZCAtLT4KKzxJbmNsdWRlZD4KKyAgICA8U2V0dGluZ3M+CisgICAgICAgIDxEb21haW4gbmFtZT0idGVsZXBob255IiBlbmFibGVkPSJmYWxzZSIgLz4KKyAgICAgICAgPERvbWFpbiBuYW1lPSJ0diIgZW5hYmxlZD0iZmFsc2UiIC8+CisgICAgICAgIDxWYXJpYW50IG5hbWU9InZhcmlhbnQxIiBlbmFibGVkPSJmYWxzZSIgLz4KKyAgICAgICAgPFNldHRpbmcgbmFtZT0ic2V0dGluZzEiIHZhbHVlPSJzZXR0aW5nVmFsdWUxIiB1cGRhdGU9InRydWUiIC8+CisgICAgICAgIDxTZXR0aW5nIG5hbWU9InNldHRpbmcyIiBlbmFibGVkPSJmYWxzZSIgLz4KKyAgICA8L1NldHRpbmdzPgorICAgIDxEZWNvZGVycz4KKyAgICAgICAgPCEtLSBlbnRyeSBmb3IgZW5hYmxlZCwgZG9tYWluLCByYW5rIGFuZCB1cGRhdGUgcHJvcGVydGllcyAtLT4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0idGVzdDEuZGVjb2RlciIgdHlwZT0iYXVkaW8vbXBlZyIgdXBkYXRlPSJmYWxzZSIgZG9tYWluPSJ0ZWxlcGhvbnkiIGVuYWJsZWQ9ImZhbHNlIiByYW5rPSI0Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJhbGlhczEuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDxRdWlyayBuYW1lPSJxdWlyazEiIHZhbHVlPSJxdWlyazFWYWx1ZSIvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDwhLS0gZW50cnkgZm9yIHRlc3RpbmcgUXVpcmsgLS0+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9InRlc3QyLmRlY29kZXIiIHR5cGU9ImF1ZGlvLzNncHAiIGVuYWJsZWQ9InRydWUiID4KKyAgICAgICAgICAgIDxRdWlyayBuYW1lPSJxdWlyazEiIHZhbHVlPSJxdWlyazFWYWx1ZSIvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDwhLS0gZW50cnkgZm9yIHRlc3RpbmcgRmVhdHVyZSAtLT4KKyAgICAgICAgPCEtLSBmZWF0dXJlMiB0YWtlcyB2YWx1ZSAwIChmZWF0dXJlIHdpdGggc2FtZSBuYW1lIHRha2VzIGxvd2VyIGZlYXR1cmUncyB2YWx1ZSkgLS0+CisgICAgICAgIDwhLS0gZmVhdHVyZTMgZ2l2ZXMgdmFsdWUgYXMgMCBzaW5jZSBpdCdzIG9wdGlvbmFsIC0tPgorICAgICAgICA8IS0tIG9wdGlvbmFsPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIgaXMgbm90IGEgdmFsaWQgY29tYmluYXRpb24uIC0tPgorICAgICAgICA8IS0tIG9wdGlvbmFsPSJmYWxzZSIgcmVxdWlyZWQ9ImZhbHNlIiBpcyBub3QgYSB2YWxpZCBjb21iaW5hdGlvbi4gLS0+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9InRlc3QzLmRlY29kZXIiIHR5cGU9ImF1ZGlvL2Ftci13YiIgPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iZmVhdHVyZTEiIHZhbHVlPSJmZWF0dXJlMVZhbCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImZlYXR1cmUyIiB2YWx1ZT0iZmVhdHVyZTJWYWwiLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImZlYXR1cmUyIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iZmVhdHVyZTMiIG9wdGlvbmFsPSJ0cnVlIiByZXF1aXJlZD0iZmFsc2UiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPCEtLSBlbnRyeSBmb3IgdGVzdGluZyBUeXBlIC0tPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJ0ZXN0NC5kZWNvZGVyIj4KKyAgICAgICAgICAgIDxUeXBlIG5hbWU9ImF1ZGlvL2ZsYWMiPgorICAgICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImZlYXR1cmUxIiB2YWx1ZT0iZmVhdHVyZTFWYWwiIC8+CisgICAgICAgICAgICA8L1R5cGU+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPCEtLSBlbnRyeSBmb3IgdGVzdGluZyBBdHRyaWJ1dGUgLS0+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9InRlc3Q1LmRlY29kZXIiIHR5cGU9ImF1ZGlvL2c3MTEtbWxhdyIgPgorICAgICAgICAgICAgPEF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGVRdWlyazEiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPCEtLSBlbnRyeSBmb3IgdGVzdGluZyBWYXJpYW50IC0tPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJ0ZXN0Ni5kZWNvZGVyIiB0eXBlPSJhdWRpby9tcDRhLWxhdG0iIHZhcmlhbnQ9InZhcmlhbnQxLHZhcmlhbnQyIiA+CisgICAgICAgICAgICA8VmFyaWFudCBuYW1lPSJ2YXJpYW50MSI+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9InZhcmlhbnQxTGltaXQxIiBtaW49InZhcmlhbnQxTGltaXQxTWluIiBtYXg9InZhcmlhbnQxTGltaXQxTWF4IiAvPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJ2YXJpYW50MUxpbWl0MiIgcmFuZ2U9InZhcmlhbnQxTGltaXQyTG93LXZhcmlhbnQxTGltaXQySGlnaCIgLz4KKyAgICAgICAgICAgIDwvVmFyaWFudD4KKyAgICAgICAgICAgIDxWYXJpYW50IG5hbWU9InZhcmlhbnQyIj4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0idmFyaWFudDJMaW1pdDEiIHZhbHVlPSJ2YXJpYW50MkxpbWl0MVZhbHVlIiAvPgorICAgICAgICAgICAgPC9WYXJpYW50PgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDwhLS0gZW50cnkgZm9yIHRlc3RpbmcgTGltaXQgLS0+CisgICAgICAgIDwhLS0gJ2luJyBpcyBwcmVzZW50IGluIHhzZCBmaWxlIGJ1dCBub3QgaGFuZGxlZCBpbiBNZWRpYUNvZGVjc1htbFBhcnNlciAtLT4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0idGVzdDcuZGVjb2RlciIgdHlwZT0iYXVkaW8vdm9yYmlzIiA+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ibGltaXQxIiBpbj0ibGltaXQxSW4iIG1pbj0ibGltaXQxTWluIi8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ibGltaXQyIiBtaW49ImxpbWl0Mk1pbiIgbWF4PSJsaW1pdDJNYXgiIHNjYWxlPSJsaW1pdDJTY2FsZSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJsaW1pdDMiIHJhbmdlcz0ibGltaXQzVmFsMSxsaW1pdDNWYWwyLGxpbWl0M1ZhbDMiIGRlZmF1bHQ9ImxpbWl0M1ZhbDMiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICA8L0RlY29kZXJzPgorICAgIDxFbmNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0idGVzdDguZW5jb2RlciIgdHlwZT0iYXVkaW8vb3B1cyI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ibGltaXQxIiBtYXg9ImxpbWl0MU1heCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRW5jb2RlcnM+Cis8L0luY2x1ZGVkPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvdGVzdGRhdGEvbWVkaWFfY29kZWNzX3VuaXRfdGVzdF9jYWxsZXIueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvdGVzdGRhdGEvbWVkaWFfY29kZWNzX3VuaXRfdGVzdF9jYWxsZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NjRjZTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC90ZXN0ZGF0YS9tZWRpYV9jb2RlY3NfdW5pdF90ZXN0X2NhbGxlci54bWwKQEAgLTAsMCArMSw0IEBACis8IS0tIGVudHJ5IGZvciB0ZXN0aW5nIEluY2x1ZGUgLS0+Cis8TWVkaWFDb2RlY3M+CisgICAgPEluY2x1ZGUgaHJlZj0ibWVkaWFfY29kZWNzX3VuaXRfdGVzdC54bWwiIC8+Cis8L01lZGlhQ29kZWNzPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Z0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Z0cy9BbmRyb2lkLmJwCmluZGV4IDEzMmNlODIuLjFlMzZjOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci92dHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdnRzL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogInZ0c19tZWRpYUNvZGVjc192YWxpZGF0ZV90ZXN0IiwKICAgICBzcmNzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdnRzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdnRzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MjkwYmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Z0cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IFZ0c1ZhbGlkYXRlTWVkaWFDb2RlY3MKLWluY2x1ZGUgdGVzdC92dHMvdG9vbHMvYnVpbGQvQW5kcm9pZC5ob3N0X2NvbmZpZy5tawpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Z0cy9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdnRzL0FuZHJvaWRUZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdlZTEwNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdnRzL0FuZHJvaWRUZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBWVFMgVnRzVmFsaWRhdGVNZWRpYUNvZGVjcy4iPgotICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0icGxhbiIgdmFsdWU9InZ0cy10cmVibGUiIC8+Ci0gICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5WdHNGaWxlUHVzaGVyIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJhYm9ydC1vbi1wdXNoLWZhaWx1cmUiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZ3JvdXAiIHZhbHVlPSJIb3N0RHJpdmVuVGVzdC5wdXNoIi8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkRBVEEvZXRjL21lZGlhX2NvZGVjcy54c2QtPi9kYXRhL2xvY2FsL3RtcC9tZWRpYV9jb2RlY3MueHNkIi8+Ci0gICAgPC90YXJnZXRfcHJlcGFyZXI+Ci0gICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLlZ0c011bHRpRGV2aWNlVGVzdCI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1tb2R1bGUtbmFtZSIgdmFsdWU9IlZ0c1ZhbGlkYXRlTWVkaWFDb2RlY3MiLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJiaW5hcnktdGVzdC1zb3VyY2UiIHZhbHVlPSJfMzJiaXQ6OkRBVEEvbmF0aXZldGVzdC92dHNfbWVkaWFDb2RlY3NfdmFsaWRhdGVfdGVzdC92dHNfbWVkaWFDb2RlY3NfdmFsaWRhdGVfdGVzdCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJiaW5hcnktdGVzdC1zb3VyY2UiIHZhbHVlPSJfNjRiaXQ6OkRBVEEvbmF0aXZldGVzdDY0L3Z0c19tZWRpYUNvZGVjc192YWxpZGF0ZV90ZXN0L3Z0c19tZWRpYUNvZGVjc192YWxpZGF0ZV90ZXN0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImJpbmFyeS10ZXN0LXR5cGUiIHZhbHVlPSJndGVzdCIvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtdGltZW91dCIgdmFsdWU9IjMwcyIvPgotICAgIDwvdGVzdD4KLTwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYndhdGNoZG9nL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJ3YXRjaGRvZy9BbmRyb2lkLmJwCmluZGV4IDFhODc4MjQuLmZlNzE3YjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYndhdGNoZG9nL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlid2F0Y2hkb2cvQW5kcm9pZC5icApAQCAtMTIsNiArMTIsMTUgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJ3YXRjaGRvZyIsCiAgICAgc3JjczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5icCBiL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQuYnAKaW5kZXggYWZjYTdjNC4uMzhiYjc5MSAxMDA2NDQKLS0tIGEvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsMjEgQEAKIAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbWVkaWFzZXJ2ZXJfbGljZW5zZSJdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9tZWRpYXNlcnZlcl9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnJlZ2lzdGVybXNleHQiLAogICAgIHNyY3M6IFsicmVnaXN0ZXIuY3BwIl0sCkBAIC0zNCw4ICs1MSwxMCBAQAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlciIsCiAgICAgXSwKIAotICAgIC8vIGJhY2sgdG8gMzItYml0LCBiLzEyNjUwMjYxMwotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCisgICAgLy8gbWVkaWFzZXJ2ZXIgaGFzIG9ubHkgYmVlbiB2ZXJpZmllZCBvbiAzMi1iaXQsIHNlZSBiLzEyNjUwMjYxMworICAgIC8vIHVzZSAicHJlZmVyMzIiIHRvICpvbmx5KiBlbmFibGUgNjQtYml0IGJ1aWxkcyBvbiA2NC1iaXQtb25seSBsdW5jaAorICAgIC8vIHRhcmdldHMsIHdoaWNoIGFsbG93cyB0aGVtIHRvIHJlYWNoICdib290X2NvbXBsZXRlJy4KKyAgICBjb21waWxlX211bHRpbGliOiAicHJlZmVyMzIiLAogCiAgICAgaW5pdF9yYzogWyJtZWRpYXNlcnZlci5yYyJdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcCBiL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwCmluZGV4IDMxNjczMmIuLjU4ZTJkMmEgMTAwNjQ0Ci0tLSBhL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwCisrKyBiL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwCkBAIC0xOCw3ICsxOCw2IEBACiAjZGVmaW5lIExPR19UQUcgIm1lZGlhc2VydmVyIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0jaW5jbHVkZSA8YWljdS9BSWN1Lmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KQEAgLTM5LDcgKzM4LDYgQEAKICAgICBzcDxQcm9jZXNzU3RhdGU+IHByb2MoUHJvY2Vzc1N0YXRlOjpzZWxmKCkpOwogICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20oZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCkpOwogICAgIEFMT0dJKCJTZXJ2aWNlTWFuYWdlcjogJXAiLCBzbS5nZXQoKSk7Ci0gICAgQUljdV9pbml0aWFsaXplSWN1T3JEaWUoKTsKICAgICBNZWRpYVBsYXllclNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICByZWdpc3RlckV4dGVuc2lvbnMoKTsKZGlmZiAtLWdpdCBhL21lZGlhL210cC9BbmRyb2lkLmJwIGIvbWVkaWEvbXRwL0FuZHJvaWQuYnAKaW5kZXggNjZhMzEzOS4uOTdlMmEyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbXRwL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDIzIEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX210cF9saWNlbnNlIl0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX210cF9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYm10cCIsCiAgICAgc3JjczogWwpAQCAtNTIsNSArNjksNSBAQAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnVzYmhvc3QiLAogICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsibGliY3V0aWxzX2hlYWRlcnMiXSwKIH0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAgYi9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcAppbmRleCBiZDZhNmM2Li5jOGI0YTAzIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcApAQCAtMTE0LDExICsxMTQsMTEgQEAKIHZvaWQgTXRwRmZzSGFuZGxlOjphZHZpc2UoaW50IGZkKSB7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE5VTV9JT19CVUZTOyBpKyspIHsKICAgICAgICAgaWYgKHBvc2l4X21hZHZpc2UobUlvYnVmW2ldLmJ1ZnMuZGF0YSgpLCBNQVhfRklMRV9DSFVOS19TSVpFLAotICAgICAgICAgICAgICAgIFBPU0lYX01BRFZfU0VRVUVOVElBTCB8IFBPU0lYX01BRFZfV0lMTE5FRUQpIDwgMCkKKyAgICAgICAgICAgICAgICBQT1NJWF9NQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9NQURWX1dJTExORUVEKSAhPSAwKQogICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBtYWR2aXNlIjsKICAgICB9CiAgICAgaWYgKHBvc2l4X2ZhZHZpc2UoZmQsIDAsIDAsCi0gICAgICAgICAgICAgICAgUE9TSVhfRkFEVl9TRVFVRU5USUFMIHwgUE9TSVhfRkFEVl9OT1JFVVNFIHwgUE9TSVhfRkFEVl9XSUxMTkVFRCkgPCAwKQorICAgICAgICAgICAgICAgIFBPU0lYX0ZBRFZfU0VRVUVOVElBTCB8IFBPU0lYX0ZBRFZfTk9SRVVTRSB8IFBPU0lYX0ZBRFZfV0lMTE5FRUQpICE9IDApCiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZmFkdmlzZSI7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL210cC90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbXRwL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggMDc1MDIwOC4uNmVkOTRhYyAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbXRwL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX210cF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9tdHBfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAibXRwX2Zmc19oYW5kbGVfdGVzdCIsCiAgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvQW5kcm9pZC5icCBiL21lZGlhL25kay9BbmRyb2lkLmJwCmluZGV4IDQzOTg5YmIuLjA1ZjZlZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9BbmRyb2lkLmJwCisrKyBiL21lZGlhL25kay9BbmRyb2lkLmJwCkBAIC0xNiw2ICsxNiwzNyBAQAogLy8gdG8gcmVmZXIgdG8gaGVhZGVycyBpbiBwYXJlbnQgZGlyZWN0b3JpZXMgYW5kIHRoZSBoZWFkZXJzIGxpdmUgaW4KIC8vIGZyYW1ld29ya3MvYXYvaW5jbHVkZS4KIAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbmRrX2xpY2Vuc2UiXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZSB0aGF0IHRvb2sgdGhlIGFwcHJvYWNoIG9mCisvLyAnYXBwbHkgZXZlcnkgbGljZW5zZSBmb3VuZCB0byBldmVyeSB0YXJnZXQnLiBXaGlsZSB0aGlzIG1ha2VzIHN1cmUgd2UgcmVzcGVjdAorLy8gZXZlcnkgbGljZW5zZSByZXN0cmljdGlvbiwgaXQgbWF5IG5vdCBiZSBlbnRpcmVseSBjb3JyZWN0LgorLy8KKy8vIGUuZy4gR1BMIGluIGFuIE1JVCBwcm9qZWN0IG1pZ2h0IG9ubHkgYXBwbHkgdG8gdGhlIGNvbnRyaWIvIGRpcmVjdG9yeS4KKy8vCisvLyBQbGVhc2UgY29uc2lkZXIgc3BsaXR0aW5nIHRoZSBzaW5nbGUgbGljZW5zZSBiZWxvdyBpbnRvIG11bHRpcGxlIGxpY2Vuc2VzLAorLy8gdGFraW5nIGNhcmUgbm90IHRvIGxvc2UgYW55IGxpY2Vuc2Vfa2luZCBpbmZvcm1hdGlvbiwgYW5kIG92ZXJyaWRpbmcgdGhlCisvLyBkZWZhdWx0IGxpY2Vuc2UgdXNpbmcgdGhlICdsaWNlbnNlczogWy4uLl0nIHByb3BlcnR5IG9uIHRhcmdldHMgYXMgbmVlZGVkLgorLy8KKy8vIEZvciB1bnVzZWQgZmlsZXMsIGNvbnNpZGVyIGNyZWF0aW5nIGEgJ2ZpbGVHcm91cCcgd2l0aCAiLy92aXNpYmlsaXR5OnByaXZhdGUiCisvLyB0byBhdHRhY2ggdGhlIGxpY2Vuc2UgdG8sIGFuZCBpbmNsdWRpbmcgYSBjb21tZW50IHdoZXRoZXIgdGhlIGZpbGVzIG1heSBiZQorLy8gdXNlZCBpbiB0aGUgY3VycmVudCBwcm9qZWN0LgorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbmRrX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItTUlUIiwKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLVVuaWNvZGUtREZTIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBuZGtfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm1lZGlhbmRrIiwKICAgICBzeW1ib2xfZmlsZTogImxpYm1lZGlhbmRrLm1hcC50eHQiLApAQCAtNDMsMTEgKzc0LDIwIEBACiAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKICAgICBdLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXQorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlibWVkaWFuZGsiLAorICAgIGxsbmRrOiB7CisgICAgICAgIHN5bWJvbF9maWxlOiAibGlibWVkaWFuZGsubWFwLnR4dCIsCisgICAgfSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIk5ka0phdmFWTUhlbHBlci5jcHAiLApAQCAtNzYsOSArMTE2LDExIEBACiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGliZ3JhbGxvY3VzYWdlIiwKKyAgICAgICAgImxpYm5hdGl2ZWhlbHBlcl9sYXp5IiwKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImpuaV9oZWFkZXJzIiwKICAgICAgICAgImxpYm1lZGlhZHJtX2hlYWRlcnMiLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAogICAgIF0sCkBAIC0xMDMsOSArMTQ1LDEwIEBACiAgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGlidWkiLAogICAgICAgICAibGlibWVkaWFuZGtfdXRpbHMiLAotICAgICAgICAibGlibmF0aXZlaGVscGVyIiwKICAgICBdLAogCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJqbmlfaGVhZGVycyJdLAorCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCkBAIC0xMjQsMTQgKzE2Nyw2IEBACiAgICAgfSwKIH0KIAotbGxuZGtfbGlicmFyeSB7Ci0gICAgbmFtZTogImxpYm1lZGlhbmRrIiwKLSAgICBzeW1ib2xfZmlsZTogImxpYm1lZGlhbmRrLm1hcC50eHQiLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImluY2x1ZGUiLAotICAgIF0sCi19Ci0KIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtZWRpYW5ka191dGlscyIsCiAKQEAgLTE5NSwzICsyMzAsNDEgQEAKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbmRrLyIsCiAgICAgXSwKIH0KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJtZWRpYW5ka19mb3JtYXQiLAorCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJOZGtNZWRpYUZvcm1hdC5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREVYUE9SVD1fX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KFwiZGVmYXVsdFwiKSkpIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBhcGV4X2F2YWlsYWJsZTogWyJjb20uYW5kcm9pZC5tZWRpYSJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka0ltYWdlLmNwcCBiL21lZGlhL25kay9OZGtJbWFnZS5jcHAKaW5kZXggMTE0NWI3Yi4uNWZkZDQ1YSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka0ltYWdlLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrSW1hZ2UuY3BwCkBAIC01OCw3ICs1OCw3IEBACiAgICAgaWYgKG1Jc0Nsb3NlZCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGlmICghbVJlYWRlci0+bUlzQ2xvc2VkKSB7CisgICAgaWYgKG1SZWFkZXItPm1Jc09wZW4pIHsKICAgICAgICAgbVJlYWRlci0+cmVsZWFzZUltYWdlTG9ja2VkKHRoaXMsIHJlbGVhc2VGZW5jZUZkKTsKICAgICB9CiAgICAgLy8gU2hvdWxkIGhhdmUgYmVlbiBzZXQgdG8gbnVsbHB0ciBpbiByZWxlYXNlSW1hZ2VMb2NrZWQKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAgYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwCmluZGV4IGMwY2ViM2QuLjA1MTQ2NmEgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAKKysrIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcApAQCAtMjc0LDcgKzI3NCw3IEBACiAKIEFJbWFnZVJlYWRlcjo6fkFJbWFnZVJlYWRlcigpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIExPR19GQVRBTF9JRigiQUltYWdlUmVhZGVyIG5vdCBjbG9zZWQgYmVmb3JlIGRlc3RydWN0aW9uIiwgbUlzQ2xvc2VkICE9IHRydWUpOworICAgIExPR19GQVRBTF9JRihtSXNPcGVuLCAiQUltYWdlUmVhZGVyIG5vdCBjbG9zZWQgYmVmb3JlIGRlc3RydWN0aW9uIik7CiB9CiAKIG1lZGlhX3N0YXR1c190CkBAIC0zNDgsMTYgKzM0OCwxNiBAQAogICAgIH0KICAgICBtSGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXIodGhpcyk7CiAgICAgbUNiTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOwotCisgICAgbUlzT3BlbiA9IHRydWU7CiAgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogdm9pZCBBSW1hZ2VSZWFkZXI6OmNsb3NlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1Jc0Nsb3NlZCkgeworICAgIGlmICghbUlzT3BlbikgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1Jc0Nsb3NlZCA9IHRydWU7CisgICAgbUlzT3BlbiA9IGZhbHNlOwogICAgIEFJbWFnZVJlYWRlcl9JbWFnZUxpc3RlbmVyIG51bGxMaXN0ZW5lciA9IHtudWxscHRyLCBudWxscHRyfTsKICAgICBzZXRJbWFnZUxpc3RlbmVyTG9ja2VkKCZudWxsTGlzdGVuZXIpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXJQcml2LmggYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXJQcml2LmgKaW5kZXggMDc3OWE3MS4uMzdjNjA2ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyUHJpdi5oCisrKyBiL21lZGlhL25kay9OZGtJbWFnZVJlYWRlclByaXYuaApAQCAtMTY2LDcgKzE2Niw3IEBACiAgICAgbmF0aXZlX2hhbmRsZV90KiAgICAgICAgICAgbVdpbmRvd0hhbmRsZSA9IG51bGxwdHI7CiAKICAgICBMaXN0PEFJbWFnZSo+ICAgICAgICAgICAgICBtQWNxdWlyZWRJbWFnZXM7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbUlzQ2xvc2VkID0gZmFsc2U7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbUlzT3BlbiA9IGZhbHNlOwogCiAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKaW5kZXggYWIwY2I2My4uODY4MDY0MSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCkBAIC0yNiw5ICsyNiw2IEBACiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkX3V0aWxfQmluZGVyLmg+Ci0KLSNpbmNsdWRlIDxqbmkuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZS5oCmluZGV4IDYyYjg2MjQuLmUxOWRkM2EgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaApAQCAtNTU5LDggKzU1OSw2IEBACiAgICAgaW50MzJfdCBib3R0b207CiB9IEFJbWFnZUNyb3BSZWN0OwogCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI0Ci0KIC8qKgogICogUmV0dXJuIHRoZSBpbWFnZSBiYWNrIHRoZSB0aGUgc3lzdGVtIGFuZCBkZWxldGUgdGhlIEFJbWFnZSBvYmplY3QgZnJvbSBtZW1vcnkuCiAgKgpAQCAtNzc3LDEwICs3NzUsNiBAQAogICAgICAgICBjb25zdCBBSW1hZ2UqIGltYWdlLCBpbnQgcGxhbmVJZHgsCiAgICAgICAgIC8qb3V0Ki91aW50OF90KiogZGF0YSwgLypvdXQqL2ludCogZGF0YUxlbmd0aCkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwotCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI2Ci0KIC8qKgogICogUmV0dXJuIHRoZSBpbWFnZSBiYWNrIHRoZSB0aGUgc3lzdGVtIGFuZCBkZWxldGUgdGhlIEFJbWFnZSBvYmplY3QgZnJvbSBtZW1vcnkgYXN5bmNocm9ub3VzbHkuCiAgKgpAQCAtODI5LDggKzgyMyw2IEBACiAgKi8KIG1lZGlhX3N0YXR1c190IEFJbWFnZV9nZXRIYXJkd2FyZUJ1ZmZlcihjb25zdCBBSW1hZ2UqIGltYWdlLCAvKm91dCovQUhhcmR3YXJlQnVmZmVyKiogYnVmZmVyKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI2ICovCi0KIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvL19OREtfSU1BR0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmgKaW5kZXggNjAwZmZjOS4uZDg2ZjNjNyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oCkBAIC01Myw4ICs1Myw2IEBACiAgKi8KIHR5cGVkZWYgc3RydWN0IEFJbWFnZVJlYWRlciBBSW1hZ2VSZWFkZXI7CiAKLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjQKLQogLyoqCiAgKiBDcmVhdGUgYSBuZXcgcmVhZGVyIGZvciBpbWFnZXMgb2YgdGhlIGRlc2lyZWQgc2l6ZSBhbmQgZm9ybWF0LgogICoKQEAgLTMyMCwxMCArMzE4LDYgQEAKIG1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9zZXRJbWFnZUxpc3RlbmVyKAogICAgICAgICBBSW1hZ2VSZWFkZXIqIHJlYWRlciwgQUltYWdlUmVhZGVyX0ltYWdlTGlzdGVuZXIqIGxpc3RlbmVyKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI0ICovCi0KLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjYKLQogLyoqCiAgKiBBSW1hZ2VSZWFkZXIgY29uc3RydWN0b3Igc2ltaWxhciB0byB7QGxpbmsgQUltYWdlUmVhZGVyX25ld30gdGhhdCB0YWtlcyBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlcgogICogZm9yIHRoZSBjb25zdW1lciB1c2FnZS4gQWxsIG90aGVyIHBhcmFtZXRlcnMgYW5kIHRoZSByZXR1cm4gdmFsdWVzIGFyZSBpZGVudGljYWwgdG8gdGhvc2UgcGFzc2VkCkBAIC01MTAsOCArNTA0LDYgQEAKICAgICBBSW1hZ2VSZWFkZXIgKnJlYWRlciwgLyogb3V0ICovbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKICNlbmRpZgogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI2ICovCi0KIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvL19OREtfSU1BR0VfUkVBREVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaAppbmRleCA4ZmI2YTg3Li42MGNkZDMyIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDb2RlYy5oCkBAIC0xMTQsMTQgKzExNCwxMiBAQAogICAgICAgICBpbnQzMl90IGFjdGlvbkNvZGUsCiAgICAgICAgIGNvbnN0IGNoYXIgKmRldGFpbCk7CiAKLXN0cnVjdCBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjayB7Cit0eXBlZGVmIHN0cnVjdCBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjayB7CiAgICAgICBBTWVkaWFDb2RlY09uQXN5bmNJbnB1dEF2YWlsYWJsZSAgb25Bc3luY0lucHV0QXZhaWxhYmxlOwogICAgICAgQU1lZGlhQ29kZWNPbkFzeW5jT3V0cHV0QXZhaWxhYmxlIG9uQXN5bmNPdXRwdXRBdmFpbGFibGU7CiAgICAgICBBTWVkaWFDb2RlY09uQXN5bmNGb3JtYXRDaGFuZ2VkICAgb25Bc3luY0Zvcm1hdENoYW5nZWQ7CiAgICAgICBBTWVkaWFDb2RlY09uQXN5bmNFcnJvciAgICAgICAgICAgb25Bc3luY0Vycm9yOwotfTsKLQotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQorfSBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjazsKIAogLyoqCiAgKiBDcmVhdGUgY29kZWMgYnkgbmFtZS4gVXNlIHRoaXMgaWYgeW91IGtub3cgdGhlIGV4YWN0IGNvZGVjIHlvdSB3YW50IHRvIHVzZS4KQEAgLTMxMSw4ICszMDksNiBAQAogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlckF0VGltZSgKICAgICAgICAgQU1lZGlhQ29kZWMgKm1EYXRhLCBzaXplX3QgaWR4LCBpbnQ2NF90IHRpbWVzdGFtcE5zKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI2Ci0KIC8qKgogICogQ3JlYXRlcyBhIFN1cmZhY2UgdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgaW5wdXQgdG8gZW5jb2RlciwgaW4gcGxhY2Ugb2YgaW5wdXQgYnVmZmVycwogICoKQEAgLTM5MywxMCArMzg5LDYgQEAKICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbShBTWVkaWFDb2RlYyAqbURhdGEpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKLSNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjYgKi8KLQotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOAotCiAvKioKICAqIEdldCBmb3JtYXQgb2YgdGhlIGJ1ZmZlci4gVGhlIHNwZWNpZmllZCBidWZmZXIgaW5kZXggbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBvYnRhaW5lZCBmcm9tCiAgKiBkZXF1ZXVlT3V0cHV0QnVmZmVyLgpAQCAtNDgyLDggKzQ3NCw2IEBACiAgKi8KIGJvb2wgQU1lZGlhQ29kZWNBY3Rpb25Db2RlX2lzVHJhbnNpZW50KGludDMyX3QgYWN0aW9uQ29kZSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwotCiB0eXBlZGVmIGVudW0gewogICAgIEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQ0xFQVIgPSAwLAogICAgIEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQUVTX0NUUiA9IDEsCkBAIC01ODAsOCArNTcwLDYgQEAKICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldEVuY3J5cHRlZEJ5dGVzKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyosIHNpemVfdCAqZHN0KSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDIxICovCi0KIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvL19OREtfTUVESUFfQ09ERUNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDcnlwdG8uaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ3J5cHRvLmgKaW5kZXggM2ZhMDdjNy4uNTkwZDUxZCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDcnlwdG8uaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNyeXB0by5oCkBAIC00Nyw4ICs0Nyw2IEBACiAKIHR5cGVkZWYgdWludDhfdCBBTWVkaWFVVUlEWzE2XTsKIAotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQotCiAvKioKICAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KQEAgLTY5LDggKzY3LDYgQEAKICAqLwogdm9pZCBBTWVkaWFDcnlwdG9fZGVsZXRlKEFNZWRpYUNyeXB0byogY3J5cHRvKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDIxICovCi0KIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvLyBfTkRLX01FRElBX0NSWVBUT19ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCmluZGV4IDA1NzdkZjIuLjQxNThhOTcgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCkBAIC0zOCw4ICszOCw2IEBACiBzdHJ1Y3QgQU1lZGlhRGF0YVNvdXJjZTsKIHR5cGVkZWYgc3RydWN0IEFNZWRpYURhdGFTb3VyY2UgQU1lZGlhRGF0YVNvdXJjZTsKIAotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOAotCiAvKgogICogQU1lZGlhRGF0YVNvdXJjZSdzIGNhbGxiYWNrcyB3aWxsIGJlIGludm9rZWQgb24gYW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZCB0aHJlYWQKICAqIG9yIHRocmVhZCBwb29sLiBObyBndWFyYW50ZWVzIGFyZSBwcm92aWRlZCBhYm91dCB3aGljaCB0aHJlYWQocykgd2lsbCBiZSB1c2VkIGZvcgpAQCAtOTMsOCArOTEsNiBAQAogICovCiBBTWVkaWFEYXRhU291cmNlKiBBTWVkaWFEYXRhU291cmNlX25ldygpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKLQogLyoqCiAgKiBDYWxsZWQgdG8gZ2V0IGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgZGF0YSBzb3VyY2UKICAqIHN0YXJ0aW5nIGF0IHxvZmZzZXR8IHdpdGhvdXQgYmxvY2tpbmcgZm9yIEkvTy4KQEAgLTEyNCw4ICsxMjAsNiBAQAogICAgICAgICBpbnQgbnVtaGVhZGVycywKICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICprZXlfdmFsdWVzKSBfX0lOVFJPRFVDRURfSU4oMjkpOwogCi0jZW5kaWYgIC8qX19BTkRST0lEX0FQSV9fID49IDI5ICovCi0KIC8qKgogICogRGVsZXRlIGEgcHJldmlvdXNseSBjcmVhdGVkIG1lZGlhIGRhdGEgc291cmNlLgogICoKQEAgLTE4NSwxMCArMTc5LDYgQEAKICAgICAgICAgQU1lZGlhRGF0YVNvdXJjZSosCiAgICAgICAgIEFNZWRpYURhdGFTb3VyY2VDbG9zZSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAotI2VuZGlmICAvKl9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwotCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI5Ci0KIC8qKgogICogQ2xvc2UgdGhlIGRhdGEgc291cmNlLCB1bmJsb2NrIHJlYWRzLCBhbmQgcmVsZWFzZSBhc3NvY2lhdGVkIHJlc291cmNlcy4KICAqCkBAIC0yMTMsOCArMjAzLDYgQEAKICAgICAgICAgQU1lZGlhRGF0YVNvdXJjZSosCiAgICAgICAgIEFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplKSBfX0lOVFJPRFVDRURfSU4oMjkpOwogCi0jZW5kaWYgIC8qX19BTkRST0lEX0FQSV9fID49IDI5ICovCi0KIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvLyBfTkRLX01FRElBX0RBVEFTT1VSQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEcm0uaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRHJtLmgKaW5kZXggMzFmNWM3ZC4uODQ5YThmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEcm0uaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURybS5oCkBAIC0xNjUsOCArMTY1LDYgQEAKICAgICAgICAgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsIGNvbnN0IEFNZWRpYURybUtleVN0YXR1cyAqa2V5U3RhdHVzLAogICAgICAgICBzaXplX3QgbnVtS2V5cywgYm9vbCBoYXNOZXdVc2FibGVLZXkpOwogCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDIxCi0KIC8qKgogICogUXVlcnkgaWYgdGhlIGdpdmVuIHNjaGVtZSBpZGVudGlmaWVkIGJ5IGl0cyBVVUlEIGlzIHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZSwgYW5kCiAgKiB3aGV0aGVyIHRoZSBkcm0gcGx1Z2luIGlzIGFibGUgdG8gaGFuZGxlIHRoZSBtZWRpYSBjb250YWluZXIgZm9ybWF0IHNwZWNpZmllZCBieSBtaW1lVHlwZS4KQEAgLTU3Niw4ICs1NzQsNiBAQAogICAgICAgICBjb25zdCBjaGFyICptYWNBbGdvcml0aG0sIHVpbnQ4X3QgKmtleUlkLCBjb25zdCB1aW50OF90ICptZXNzYWdlLCBzaXplX3QgbWVzc2FnZVNpemUsCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNpZ25hdHVyZSwgc2l6ZV90IHNpZ25hdHVyZVNpemUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKLSNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjEgKi8KLQogX19FTkRfREVDTFMKIAogI2VuZGlmIC8vX05ES19NRURJQV9EUk1fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmgKaW5kZXggMTQzMTljNC4uZTQyOTgyMCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oCkBAIC0zNiw2ICszNiw3IEBACiAjaWZuZGVmIF9OREtfTUVESUFfRVhUUkFDVE9SX0gKICNkZWZpbmUgX05ES19NRURJQV9FWFRSQUNUT1JfSAogCisjaW5jbHVkZSA8c3RkYm9vbC5oPgogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCkBAIC00OSw4ICs1MCw2IEBACiBzdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yOwogdHlwZWRlZiBzdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yIEFNZWRpYUV4dHJhY3RvcjsKIAotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQotCiAvKioKICAqIENyZWF0ZSBuZXcgbWVkaWEgZXh0cmFjdG9yLgogICoKQEAgLTgxLDggKzgwLDYgQEAKIG1lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlKEFNZWRpYUV4dHJhY3RvciosCiAgICAgICAgIGNvbnN0IGNoYXIgKmxvY2F0aW9uKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI4Ci0KIC8qKgogICogU2V0IHRoZSBjdXN0b20gZGF0YSBzb3VyY2UgaW1wbGVtZW50YXRpb24gZnJvbSB3aGljaCB0aGUgZXh0cmFjdG9yIHdpbGwgcmVhZC4KICAqCkBAIC05MSw4ICs4OCw2IEBACiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUN1c3RvbShBTWVkaWFFeHRyYWN0b3IqLAogICAgICAgICBBTWVkaWFEYXRhU291cmNlICpzcmMpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKLSNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjggKi8KLQogLyoqCiAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB0cmFja3MgaW4gdGhlIHByZXZpb3VzbHkgc3BlY2lmaWVkIG1lZGlhIGZpbGUKICAqCkBAIC0yMTAsOCArMjA1LDYgQEAKICAgICBBTUVESUFFWFRSQUNUT1JfU0FNUExFX0ZMQUdfRU5DUllQVEVEID0gMiwKIH07CiAKLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjgKLQogLyoqCiAgKiBSZXR1cm5zIHRoZSBmb3JtYXQgb2YgdGhlIGV4dHJhY3Rvci4gVGhlIGNhbGxlciBtdXN0IGZyZWUgdGhlIHJldHVybmVkIGZvcm1hdAogICogdXNpbmcgQU1lZGlhRm9ybWF0X2RlbGV0ZShmb3JtYXQpLgpAQCAtMjY1LDEwICsyNTgsNiBAQAogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUZvcm1hdChBTWVkaWFFeHRyYWN0b3IgKmV4LAogICAgICAgICBBTWVkaWFGb3JtYXQgKmZtdCkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwotCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDIxICovCi0KIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvLyBfTkRLX01FRElBX0VYVFJBQ1RPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaAppbmRleCA0OWQ4YjRhLi4wY2UwOGMxIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmgKQEAgLTM2LDkgKzM2LDE0IEBACiAjaWZuZGVmIF9OREtfTUVESUFfRk9STUFUX0gKICNkZWZpbmUgX05ES19NRURJQV9GT1JNQVRfSAogCisjaW5jbHVkZSA8c3RkYm9vbC5oPgogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCisjaWYgIWRlZmluZWQoX19JTlRST0RVQ0VEX0lOKQorI2RlZmluZSBfX0lOVFJPRFVDRURfSU4oX19hcGlfbGV2ZWwpIC8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCiAjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgogCiBfX0JFR0lOX0RFQ0xTCkBAIC00Niw4ICs1MSw2IEBACiBzdHJ1Y3QgQU1lZGlhRm9ybWF0OwogdHlwZWRlZiBzdHJ1Y3QgQU1lZGlhRm9ybWF0IEFNZWRpYUZvcm1hdDsKIAotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQotCiAvKioKICAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KQEAgLTE5MCw5ICsxOTMsNyBAQAogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQgX19JTlRST0RVQ0VEX0lOKDI4KTsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lOREVYIF9fSU5UUk9EVUNFRF9JTigyOCk7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9XSURUSCBfX0lOVFJPRFVDRURfSU4oMjEpOwotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyMSAqLwogCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI4CiAvKioKICAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjguCiAgKi8KQEAgLTIxNiw5ICsyMTcsNyBAQAogICovCiB2b2lkIEFNZWRpYUZvcm1hdF9zZXRSZWN0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsCiAgICAgICAgIGludDMyX3QgbGVmdCwgaW50MzJfdCB0b3AsIGludDMyX3QgcmlnaHQsIGludDMyX3QgYm90dG9tKSBfX0lOVFJPRFVDRURfSU4oMjgpOwotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwogCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI5CiAvKioKICAqIFJlbW92ZSBhbGwga2V5L3ZhbHVlIHBhaXJzIGZyb20gdGhlIGdpdmVuIEFNZWRpYUZvcm1hdC4KICAqCkBAIC0yOTIsOSArMjkxLDYgQEAKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMgX19JTlRST0RVQ0VEX0lOKDI5KTsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1lFQVIgX19JTlRST0RVQ0VEX0lOKDI5KTsKIAotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLwotCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDMwCiAvKioKICAqIEFuIG9wdGlvbmFsIGtleSBkZXNjcmliaW5nIHRoZSBsb3cgbGF0ZW5jeSBkZWNvZGluZyBtb2RlLiBUaGlzIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlcgogICogdGhhdCBhcHBsaWVzIG9ubHkgdG8gZGVjb2RlcnMuIElmIGVuYWJsZWQsIHRoZSBkZWNvZGVyIGRvZXNuJ3QgaG9sZCBpbnB1dCBhbmQgb3V0cHV0CkBAIC0zMDUsNyArMzAxLDYgQEAKICAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMzAuCiAgKi8KIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xPV19MQVRFTkNZIF9fSU5UUk9EVUNFRF9JTigzMCk7Ci0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDMwICovCiAKIF9fRU5EX0RFQ0xTCiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhTXV4ZXIuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhTXV4ZXIuaAppbmRleCA5ZGUzZmJmLi41MTllMjQ5IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYU11eGVyLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFNdXhlci5oCkBAIC01NCw4ICs1NCw2IEBACiAgICAgQU1FRElBTVVYRVJfT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFAgICA9IDIsCiB9IE91dHB1dEZvcm1hdDsKIAotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQotCiAvKioKICAqIENyZWF0ZSBuZXcgbWVkaWEgbXV4ZXIuCiAgKgpAQCAtMTQwLDggKzEzOCw2IEBACiAgICAgICAgIHNpemVfdCB0cmFja0lkeCwgY29uc3QgdWludDhfdCAqZGF0YSwKICAgICAgICAgY29uc3QgQU1lZGlhQ29kZWNCdWZmZXJJbmZvICppbmZvKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDIxICovCi0KIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvLyBfTkRLX01FRElBX01VWEVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9SRUFETUUubWQgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMjc1YzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTYgQEAKKyMgQi1GcmFtZXMgRW5jb2RpbmcgQXBwCisKK1RoaXMgaXMgYSBzYW1wbGUgYW5kcm9pZCBhcHBsaWNhdGlvbiBmb3IgZW5jb2RpbmcgQVZDL0hFVkMgc3RyZWFtcyB3aXRoIEItRnJhbWVzIGVuYWJsZWQuIEl0IHVzZXMgTWVkaWFSZWNvcmRlciBBUElzIHRvIHJlY29yZCBCLWZyYW1lcyBlbmFibGVkIHZpZGVvIGZyb20gY2FtZXJhMiBpbnB1dCBhbmQgTWVkaWFDb2RlYyBBUElzIHRvIGVuY29kZSByZWZlcmVuY2UgdGVzdCB2ZWN0b3IgdXNpbmcgaW5wdXQgc3VyZmFjZS4KKworVGhpcyBwYWdlIGRlc2NyaWJlcyBob3cgdG8gZ2V0IHN0YXJ0ZWQgd2l0aCB0aGUgRW5jb2RlciBBcHAgYW5kIGhvdyB0byBydW4gdGhlIHRlc3RzIGZvciBpdC4KKworCisjIEdldHRpbmcgU3RhcnRlZAorCitUaGlzIGFwcCB1c2VzIHRoZSBHcmFkbGUgYnVpbGQgc3lzdGVtIGFzIHdlbGwgYXMgU29vbmcgQnVpbGQgU3lzdGVtLgorCitUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgR3JhZGxlIGJ1aWxkLCB1c2UgdGhlICJncmFkbGV3IGJ1aWxkIiBjb21tYW5kIG9yIHVzZSAiSW1wb3J0IFByb2plY3QiIGluIEFuZHJvaWQgU3R1ZGlvLgorCitUbyBidWlsZCB0aGUgYXBwIHVzaW5nIFNvb25nIEJ1aWxkIFN5c3RlbSwgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKK2BgYAorbW1tIGZyYW1ld29ya3MvYXYvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyLworYGBgCisKK1RoZSBhcGsgaXMgZ2VuZXJhdGVkIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb246CitgYGAKK291dFx0YXJnZXRccHJvZHVjdFxzYXJnb1x0ZXN0Y2FzZXNcU2FtcGxlVmlkZW9FbmNvZGVyXGFybTY0XFNhbXBsZVZpZGVvRW5jb2Rlci5hcGsKK2BgYAorCitDb21tYW5kIHRvIGluc3RhbGwgdGhlIGFwazoKK2BgYAorYWRiIGluc3RhbGwgU2FtcGxlVmlkZW9FbmNvZGVyLmFwaworYGBgCisKK0NvbW1hbmQgdG8gbGF1bmNoIHRoZSBhcHA6CitgYGAKK2FkYiBzaGVsbCBhbSBzdGFydCAtbiAiY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyL2NvbS5hbmRyb2lkLm1lZGlhLnNhbXBsZXZpZGVvZW5jb2Rlci5NYWluQWN0aXZpdHkiCitgYGAKKworQWZ0ZXIgaW5zdGFsbGluZyB0aGUgYXBwLCBhIFRleHR1cmVWaWV3IHNob3dpbmcgY2FtZXJhIHByZXZpZXcgaXMgZGlzcGFseWVkIG9uIG9uZSB0aGlyZCBvZiB0aGUgc2NyZWVuLiBJdCBhbHNvIGZlYXR1cmVzIGNoZWNrYm94ZXMgdG8gc2VsZWN0IGVpdGhlciBhdmMvaGV2YyBhbmQgaHcvc3cgY29kZWNzLiBJdCBhbHNvIGhhcyBhbiBvcHRpb24gdG8gc2VsZWN0IGVpdGhlciBNZWRpYVJlY29yZGVyIEFQSXMgb3IgTWVkaWFDb2RlYywgYWxvbmcgd2l0aCB0aGUgJ1N0YXJ0JyBidXR0b24gdG8gc3RhcnQvc3RvcCByZWNvcmRpbmcuCisKKyMgUnVubmluZyBUZXN0cworCitUaGUgYXBwIGFsc28gY29udGFpbnMgYSB0ZXN0LCB3aGljaCB3aWxsIHRlc3QgdGhlIE1lZGlhQ29kZWMgQVBJcyBmb3IgZW5jb2RpbmcgYXZjL2hldmMgc3RyZWFtcyB3aXRoIEItZnJhbWVzIGVuYWJsZWQuIFRoaXMgZG9lcyBub3QgcmVxdWlyZSB1cyB0byB1c2UgYXBwbGljYXRpb24gVUkuCisKKyMjIFJ1bm5pbmcgdGhlIHRlc3RzIHVzaW5nIGF0ZXN0CitOb3RlIHRoYXQgYXRlc3QgY29tbWFuZCB3aWxsIGluc3RhbGwgdGhlIFNhbXBsZVZpZGVvRW5jb2RlciBhcHAgb24gdGhlIGRldmljZS4KKworQ29tbWFuZCB0byBydW4gdGhlIHRlc3RzOgorYGBgCithdGVzdCBTYW1wbGVWaWRlb0VuY29kZXIKK2BgYAorCisjIE91cHV0CisKK1RoZSBtdXhlZCBvdXB0cHV0IHZpZGVvIGlzIHNhdmVkIGluIHRoZSBhcHAgZGF0YSBhdDoKK2BgYAorL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyL2ZpbGVzLworYGBgCisKK1RoZSB0b3RhbCBudW1iZXIgb2YgSS1mcmFtZXMsIFAtZnJhbWVzIGFuZCBCLWZyYW1lcyBhZnRlciBlbmNvZGluZyBoYXMgYmVlbiBkb25lIHVzaW5nIE1lZGlhQ29kZWMgQVBJcyBhcmUgZGlzcGxheWVkIG9uIHRoZSBzY3JlZW4uCitUaGUgcmVzdWx0cyBvZiB0aGUgdGVzdHMgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIGxvZ2NhdHMgb2YgdGhlIHRlc3QuCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL0FuZHJvaWQuYnAgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThiMjE5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvQW5kcm9pZC5icApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCithbmRyb2lkX3Rlc3QgeworICAgIG5hbWU6ICJTYW1wbGVWaWRlb0VuY29kZXIiLAorCisgICAgbWFuaWZlc3Q6ICJzcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sIiwKKworICAgIHNyY3M6IFsic3JjLyoqLyouamF2YSJdLAorCisgICAgc2RrX3ZlcnNpb246ICJjdXJyZW50IiwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyNCIsIC8vIE4KKworICAgIHJlc291cmNlX2RpcnM6IFsKKyAgICAgICAgInNyYy9tYWluL3JlcyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkeC5hbm5vdGF0aW9uX2Fubm90YXRpb24iLAorICAgICAgICAiYW5kcm9pZHguYXBwY29tcGF0X2FwcGNvbXBhdCIsCisgICAgICAgICJhbmRyb2lkeC1jb25zdHJhaW50bGF5b3V0X2NvbnN0cmFpbnRsYXlvdXQiLAorICAgICAgICAianVuaXQiLAorICAgICAgICAiYW5kcm9pZHgudGVzdC5jb3JlIiwKKyAgICAgICAgImFuZHJvaWR4LnRlc3QucnVubmVyIiwKKyAgICAgICAgImhhbWNyZXN0LWxpYnJhcnkiLAorICAgIF0sCisKKyAgICBqYXZhY2ZsYWdzOiBbCisgICAgICAgICItWGxpbnQ6ZGVwcmVjYXRpb24iLAorICAgICAgICAiLVhsaW50OnVuY2hlY2tlZCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFmNDMwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iUnVucyBTYW1wbGVWaWRlb0VuY29kZXIgVGVzdHMiPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuVGVzdEFwcEluc3RhbGxTZXR1cCI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJTYW1wbGVWaWRlb0VuY29kZXIuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXRhZyIgdmFsdWU9IlNhbXBsZVZpZGVvRW5jb2RlciIgLz4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJjb20uYW5kcm9pZC5tZWRpYS5zYW1wbGV2aWRlb2VuY29kZXIiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVubmVyIiB2YWx1ZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImhpZGRlbi1hcGktY2hlY2tzIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL2J1aWxkLmdyYWRsZSBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvYnVpbGQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNTQ5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworYXBwbHkgcGx1Z2luOiAnY29tLmFuZHJvaWQuYXBwbGljYXRpb24nCisKK2FuZHJvaWQgeworICAgIGNvbXBpbGVTZGtWZXJzaW9uIDMwCisgICAgYnVpbGRUb29sc1ZlcnNpb24gIjMwLjAuMiIKKworICAgIGRlZmF1bHRDb25maWcgeworICAgICAgICBhcHBsaWNhdGlvbklkICJjb20uYW5kcm9pZC5tZWRpYS5zYW1wbGV2aWRlb2VuY29kZXIiCisgICAgICAgIG1pblNka1ZlcnNpb24gMjQKKyAgICAgICAgdGFyZ2V0U2RrVmVyc2lvbiAzMAorICAgICAgICB2ZXJzaW9uQ29kZSAxCisgICAgICAgIHZlcnNpb25OYW1lICIxLjAiCisgICAgICAgIHRlc3RJbnN0cnVtZW50YXRpb25SdW5uZXIgImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICB9CisKKyAgICBidWlsZFR5cGVzIHsKKyAgICAgICAgcmVsZWFzZSB7CisgICAgICAgICAgICBtaW5pZnlFbmFibGVkIGZhbHNlCisgICAgICAgICAgICBwcm9ndWFyZEZpbGVzIGdldERlZmF1bHRQcm9ndWFyZEZpbGUoJ3Byb2d1YXJkLWFuZHJvaWQtb3B0aW1pemUudHh0JyksICdwcm9ndWFyZC1ydWxlcy5wcm8nCisgICAgICAgIH0KKyAgICB9Cit9CisKK2RlcGVuZGVuY2llcyB7CisgICAgaW1wbGVtZW50YXRpb24gZmlsZVRyZWUoZGlyOiAibGlicyIsIGluY2x1ZGU6IFsiKi5qYXIiXSkKKyAgICBpbXBsZW1lbnRhdGlvbiAnYW5kcm9pZHguYXBwY29tcGF0OmFwcGNvbXBhdDoxLjIuMCcKKyAgICBpbXBsZW1lbnRhdGlvbiAnYW5kcm9pZHguY29uc3RyYWludGxheW91dDpjb25zdHJhaW50bGF5b3V0OjIuMC40JworICAgIHRlc3RJbXBsZW1lbnRhdGlvbiAnanVuaXQ6anVuaXQ6NC4xMy4xJworICAgIGFuZHJvaWRUZXN0SW1wbGVtZW50YXRpb24gJ2FuZHJvaWR4LnRlc3Q6cnVubmVyOjEuMy4wJworICAgIGFuZHJvaWRUZXN0SW1wbGVtZW50YXRpb24gJ2FuZHJvaWR4LnRlc3QuZXh0Omp1bml0OjEuMS4yJworICAgIGFuZHJvaWRUZXN0SW1wbGVtZW50YXRpb24gJ2FuZHJvaWR4LnRlc3QuZXNwcmVzc286ZXNwcmVzc28tY29yZTozLjMuMCcKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9hbmRyb2lkVGVzdC9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL3NhbXBsZXZpZGVvZW5jb2Rlci90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXJUZXN0LmphdmEgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9hbmRyb2lkVGVzdC9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL3NhbXBsZXZpZGVvZW5jb2Rlci90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVmMzMyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL2FuZHJvaWRUZXN0L2phdmEvY29tL2FuZHJvaWQvbWVkaWEvc2FtcGxldmlkZW9lbmNvZGVyL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2RlclRlc3QuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyLnRlc3RzOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5wbGF0Zm9ybS5hcHAuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zYW1wbGV2aWRlb2VuY29kZXIuTWVkaWFDb2RlY1N1cmZhY2VFbmNvZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnNhbXBsZXZpZGVvZW5jb2Rlci5SOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgU2FtcGxlVmlkZW9FbmNvZGVyVGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IFNhbXBsZVZpZGVvRW5jb2RlclRlc3QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIGludCBtTWF4QkZyYW1lczsKKyAgICBwcml2YXRlIGludCBtSW5wdXRSZXNJZDsKKyAgICBwcml2YXRlIFN0cmluZyBtTWltZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzU29mdHdhcmVFbmNvZGVyOworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gaW5wdXRGaWxlcygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CisgICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVyczogTWltZVR5cGUsIGlzU29mdHdhcmVFbmNvZGVyLCBtYXhCRnJhbWVzCisgICAgICAgICAgICAgICAge01lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0FWQywgZmFsc2UsIDF9LAorICAgICAgICAgICAgICAgIHtNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19BVkMsIHRydWUsIDF9LAorICAgICAgICAgICAgICAgIHtNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19IRVZDLCBmYWxzZSwgMX0sCisgICAgICAgICAgICAgICAge01lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0hFVkMsIHRydWUsIDF9fSk7CisgICAgfQorCisgICAgcHVibGljIFNhbXBsZVZpZGVvRW5jb2RlclRlc3QoU3RyaW5nIG1pbWVUeXBlLCBib29sZWFuIGlzU29mdHdhcmVFbmNvZGVyLCBpbnQgbWF4QkZyYW1lcykgeworICAgICAgICB0aGlzLm1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgICAgICB0aGlzLm1JbnB1dFJlc0lkID0gUi5yYXcuY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2gyNjU7CisgICAgICAgIHRoaXMubU1pbWUgPSBtaW1lVHlwZTsKKyAgICAgICAgdGhpcy5tSXNTb2Z0d2FyZUVuY29kZXIgPSBpc1NvZnR3YXJlRW5jb2RlcjsKKyAgICAgICAgdGhpcy5tTWF4QkZyYW1lcyA9IG1heEJGcmFtZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0T3V0cHV0UGF0aCgpIHsKKyAgICAgICAgRmlsZSBkaXIgPSBtQ29udGV4dC5nZXRFeHRlcm5hbEZpbGVzRGlyKG51bGwpOworICAgICAgICBpZiAoZGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkNhbm5vdCBnZXQgZXh0ZXJuYWwgZGlyZWN0b3J5IHBhdGggdG8gc2F2ZSBvdXRwdXQgdmlkZW8iKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZyB2aWRlb1BhdGggPSBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiL1ZpZGVvLSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIubXA0IjsKKyAgICAgICAgTG9nLmkoVEFHLCAiT3V0cHV0IHZpZGVvIGlzIHNhdmVkIGF0OiAiICsgdmlkZW9QYXRoKTsKKyAgICAgICAgcmV0dXJuIHZpZGVvUGF0aDsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZWRpYVN1cmZhY2VFbmNvZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBvdXRwdXRGaWxlUGF0aCA9IGdldE91dHB1dFBhdGgoKTsKKyAgICAgICAgTWVkaWFDb2RlY1N1cmZhY2VFbmNvZGVyIHN1cmZhY2VFbmNvZGVyID0KKyAgICAgICAgICAgICAgICBuZXcgTWVkaWFDb2RlY1N1cmZhY2VFbmNvZGVyKG1Db250ZXh0LCBtSW5wdXRSZXNJZCwgbU1pbWUsIG1Jc1NvZnR3YXJlRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGVQYXRoLCBtTWF4QkZyYW1lcyk7CisgICAgICAgIGludCBlbmNvZGluZ1N0YXR1cyA9IHN1cmZhY2VFbmNvZGVyLnN0YXJ0RW5jb2RpbmdTdXJmYWNlKCk7CisgICAgICAgIGFzc2VydFRoYXQoZW5jb2RpbmdTdGF0dXMsIGlzKGVxdWFsVG8oMCkpKTsKKyAgICAgICAgaW50W10gZnJhbWVOdW1BcnJheSA9IHN1cmZhY2VFbmNvZGVyLmdldEZyYW1lVHlwZXMoKTsKKyAgICAgICAgTG9nLmkoVEFHLCAiUmVzdWx0czogSS1GcmFtZXM6ICIgKyBmcmFtZU51bUFycmF5WzBdICsgIjsgUC1GcmFtZXM6ICIgKyBmcmFtZU51bUFycmF5WzFdICsKKyAgICAgICAgICAgICAgICAiXG4gIiArICI7IEItRnJhbWVzOiIgKyBmcmFtZU51bUFycmF5WzJdKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKCJFbmNvZGVyIG1pbWU6ICIgKyBtTWltZSArICIgaXNTb2Z0d2FyZTogIiArIG1Jc1NvZnR3YXJlRW5jb2RlciArCisgICAgICAgICAgICAgICAgIiBmYWlsZWQgdG8gZ2VuZXJhdGUgQiBGcmFtZXMiLCBmcmFtZU51bUFycmF5WzJdLCAwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE3NTQxZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyIj4KKworICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBIi8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUNPUkRfQVVESU8iLz4KKworICAgIDxhcHBsaWNhdGlvbgorICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9uIgorICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCIKKyAgICAgICAgYW5kcm9pZDphbGxvd0JhY2t1cD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDppY29uPSJAbWlwbWFwL2ljX2xhdW5jaGVyIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIgorICAgICAgICBhbmRyb2lkOnJvdW5kSWNvbj0iQG1pcG1hcC9pY19sYXVuY2hlcl9yb3VuZCIKKyAgICAgICAgYW5kcm9pZDpzdXBwb3J0c1J0bD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL0FwcFRoZW1lIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyLk1haW5BY3Rpdml0eSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJTYW1wbGVWaWRlb0VuY29kZXIgVGVzdCIvPgorCis8L21hbmlmZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9zYW1wbGV2aWRlb2VuY29kZXIvQXV0b0ZpdFRleHR1cmVWaWV3LmphdmEgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvc2FtcGxldmlkZW9lbmNvZGVyL0F1dG9GaXRUZXh0dXJlVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZWE0YzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvc2FtcGxldmlkZW9lbmNvZGVyL0F1dG9GaXRUZXh0dXJlVmlldy5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5zYW1wbGV2aWRlb2VuY29kZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5UZXh0dXJlVmlldzsKKworcHVibGljIGNsYXNzIEF1dG9GaXRUZXh0dXJlVmlldyBleHRlbmRzIFRleHR1cmVWaWV3IHsKKworICAgIHB1YmxpYyBBdXRvRml0VGV4dHVyZVZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIEF1dG9GaXRUZXh0dXJlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXV0b0ZpdFRleHR1cmVWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBc3BlY3RSYXRpbyhpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgaWYgKHdpZHRoIDwgMCB8fCBoZWlnaHQgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTaXplIGNhbm5vdCBiZSBuZWdhdGl2ZS4iKTsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL3NhbXBsZXZpZGVvZW5jb2Rlci9NYWluQWN0aXZpdHkuamF2YSBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9zYW1wbGV2aWRlb2VuY29kZXIvTWFpbkFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdhMzUzYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9zYW1wbGV2aWRlb2VuY29kZXIvTWFpbkFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw2NzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5zYW1wbGV2aWRlb2VuY29kZXI7CisKK2ltcG9ydCBhbmRyb2lkeC5hcHBjb21wYXQuYXBwLkFwcENvbXBhdEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWR4LmNvcmUuYXBwLkFjdGl2aXR5Q29tcGF0OworCitpbXBvcnQgYW5kcm9pZC5NYW5pZmVzdDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhQ2FwdHVyZVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYUNoYXJhY3RlcmlzdGljczsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhRGV2aWNlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FwdHVyZVJlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLnBhcmFtcy5TdHJlYW1Db25maWd1cmF0aW9uTWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU3VyZmFjZVRleHR1cmU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFSZWNvcmRlcjsKKworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVGV4dHVyZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNoZWNrQm94OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5TaXplOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJhZGlvR3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5Cb29sZWFuLkZBTFNFOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFOworCitwdWJsaWMgY2xhc3MgTWFpbkFjdGl2aXR5IGV4dGVuZHMgQXBwQ29tcGF0QWN0aXZpdHkKKyAgICAgICAgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciwgQWN0aXZpdHlDb21wYXQuT25SZXF1ZXN0UGVybWlzc2lvbnNSZXN1bHRDYWxsYmFjayB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNhbXBsZVZpZGVvRW5jb2RlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUkVDT1JEX1BFUk1JU1NJT05TID0KKyAgICAgICAgICAgIHtNYW5pZmVzdC5wZXJtaXNzaW9uLkNBTUVSQSwgTWFuaWZlc3QucGVybWlzc2lvbi5SRUNPUkRfQVVESU99OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX1JFQ09SRF9QRVJNSVNTSU9OUyA9IDE7CisgICAgcHJpdmF0ZSBmaW5hbCBTZW1hcGhvcmUgbUNhbWVyYU9wZW5DbG9zZUxvY2sgPSBuZXcgU2VtYXBob3JlKDEpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWSURFT19CSVRSQVRFID0gODAwMDAwMCAvKiA4IE1icHMgKi87CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZJREVPX0ZSQU1FUkFURSA9IDMwOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgdmFsdWVzIHRvIGZyYW1lIHR5cGVzIGFzc2lnbmVkIGhlcmUgYXJlIGludGVybmFsIHRvIHRoaXMgYXBwLgorICAgICAqIFRoZXNlIHZhbHVlcyBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBhY3R1YWwgdmFsdWVzIGRlZmluZWQgaW4gYXZjL2hldmMgc3BlY2lmaWNhdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlJBTUVfVFlQRV9JID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGUkFNRV9UWVBFX1AgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZSQU1FX1RZUEVfQiA9IDI7CisKKyAgICBwcml2YXRlIFN0cmluZyBtTWltZSA9IE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0FWQzsKKyAgICBwcml2YXRlIFN0cmluZyBtT3V0cHV0VmlkZW9QYXRoID0gbnVsbDsKKworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNGcm9udENhbWVyYSA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0NvZGVjU29mdHdhcmUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzTWVkaWFSZWNvcmRlciA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1JlY29yZGluZzsKKworICAgIHByaXZhdGUgQXV0b0ZpdFRleHR1cmVWaWV3IG1UZXh0dXJlVmlldzsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1UZXh0VmlldzsKKyAgICBwcml2YXRlIENhbWVyYURldmljZSBtQ2FtZXJhRGV2aWNlOworICAgIHByaXZhdGUgQ2FtZXJhQ2FwdHVyZVNlc3Npb24gbVByZXZpZXdTZXNzaW9uOworICAgIHByaXZhdGUgQ2FwdHVyZVJlcXVlc3QuQnVpbGRlciBtUHJldmlld0J1aWxkZXI7CisgICAgcHJpdmF0ZSBNZWRpYVJlY29yZGVyIG1NZWRpYVJlY29yZGVyOworICAgIHByaXZhdGUgU2l6ZSBtVmlkZW9TaXplOworICAgIHByaXZhdGUgU2l6ZSBtUHJldmlld1NpemU7CisKKyAgICBwcml2YXRlIEhhbmRsZXIgbUJhY2tncm91bmRIYW5kbGVyOworICAgIHByaXZhdGUgSGFuZGxlclRocmVhZCBtQmFja2dyb3VuZFRocmVhZDsKKworICAgIHByaXZhdGUgQnV0dG9uIG1TdGFydEJ1dHRvbjsKKworICAgIHByaXZhdGUgaW50W10gbUZyYW1lVHlwZU9jY3VycmVuY2VzOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5hY3Rpdml0eV9tYWluKTsKKworICAgICAgICBmaW5hbCBSYWRpb0dyb3VwIHJhZGlvR3JvdXBfbWltZSA9IGZpbmRWaWV3QnlJZChSLmlkLnJhZGlvX2dyb3VwX21pbWUpOworICAgICAgICByYWRpb0dyb3VwX21pbWUuc2V0T25DaGVja2VkQ2hhbmdlTGlzdGVuZXIobmV3IFJhZGlvR3JvdXAuT25DaGVja2VkQ2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hlY2tlZENoYW5nZWQoUmFkaW9Hcm91cCBncm91cCwgaW50IGNoZWNrZWRJZCkgeworICAgICAgICAgICAgICAgIGlmIChjaGVja2VkSWQgPT0gUi5pZC5hdmMpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1pbWUgPSBNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19BVkM7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbU1pbWUgPSBNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19IRVZDOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgZmluYWwgUmFkaW9Hcm91cCByYWRpb0dyb3VwX2NvZGVjID0gZmluZFZpZXdCeUlkKFIuaWQucmFkaW9fZ3JvdXBfY29kZWMpOworICAgICAgICByYWRpb0dyb3VwX2NvZGVjLnNldE9uQ2hlY2tlZENoYW5nZUxpc3RlbmVyKG5ldyBSYWRpb0dyb3VwLk9uQ2hlY2tlZENoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoZWNrZWRDaGFuZ2VkKFJhZGlvR3JvdXAgZ3JvdXAsIGludCBjaGVja2VkSWQpIHsKKyAgICAgICAgICAgICAgICBtSXNDb2RlY1NvZnR3YXJlID0gY2hlY2tlZElkID09IFIuaWQuc3c7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGZpbmFsIENoZWNrQm94IGNoZWNrQm94X21yID0gZmluZFZpZXdCeUlkKFIuaWQuY2hlY2tCb3hfbWVkaWFfcmVjb3JkZXIpOworICAgICAgICBmaW5hbCBDaGVja0JveCBjaGVja0JveF9tYyA9IGZpbmRWaWV3QnlJZChSLmlkLmNoZWNrQm94X21lZGlhX2NvZGVjKTsKKyAgICAgICAgbVRleHR1cmVWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQudGV4dHVyZSk7CisgICAgICAgIG1UZXh0VmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLnRleHRWaWV3UmVzdWx0cyk7CisKKyAgICAgICAgY2hlY2tCb3hfbXIuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGNoZWNrZWQgPSAoKENoZWNrQm94KSB2KS5pc0NoZWNrZWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZCkgeworICAgICAgICAgICAgICAgICAgICBjaGVja0JveF9tYy5zZXRDaGVja2VkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgbUlzTWVkaWFSZWNvcmRlciA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmFkaW9Hcm91cF9jb2RlYy5nZXRDaGlsZENvdW50KCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmFkaW9Hcm91cF9jb2RlYy5nZXRDaGlsZEF0KGkpLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgY2hlY2tCb3hfbWMuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGNoZWNrZWQgPSAoKENoZWNrQm94KSB2KS5pc0NoZWNrZWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZCkgeworICAgICAgICAgICAgICAgICAgICBjaGVja0JveF9tci5zZXRDaGVja2VkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgbUlzTWVkaWFSZWNvcmRlciA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJhZGlvR3JvdXBfY29kZWMuZ2V0Q2hpbGRDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhZGlvR3JvdXBfY29kZWMuZ2V0Q2hpbGRBdChpKS5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgbVN0YXJ0QnV0dG9uID0gZmluZFZpZXdCeUlkKFIuaWQuc3RhcnRfYnV0dG9uKTsKKyAgICAgICAgbVN0YXJ0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICBpZiAodi5nZXRJZCgpID09IFIuaWQuc3RhcnRfYnV0dG9uKSB7CisgICAgICAgICAgICBtVGV4dFZpZXcuc2V0VGV4dChudWxsKTsKKyAgICAgICAgICAgIGlmIChtSXNNZWRpYVJlY29yZGVyKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Jc1JlY29yZGluZykgeworICAgICAgICAgICAgICAgICAgICBzdG9wUmVjb3JkaW5nVmlkZW8oKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtU3RhcnRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0UmVjb3JkaW5nVmlkZW8oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TdGFydEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtT3V0cHV0VmlkZW9QYXRoID0gZ2V0VmlkZW9QYXRoKE1haW5BY3Rpdml0eS50aGlzKTsKKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjU3VyZmFjZUFzeW5jIGNvZGVjQXN5bmNUYXNrID0gbmV3IE1lZGlhQ29kZWNTdXJmYWNlQXN5bmModGhpcyk7CisgICAgICAgICAgICAgICAgY29kZWNBc3luY1Rhc2suZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJFbmNvZGluZyByZWZlcmVuY2UgdGVzdCB2ZWN0b3Igd2l0aCBNZWRpYUNvZGVjIEFQSXMgdXNpbmcgc3VyZmFjZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWVkaWFDb2RlY1N1cmZhY2VBc3luYyBleHRlbmRzIEFzeW5jVGFzazxTdHJpbmcsIFN0cmluZywgSW50ZWdlcj4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNYWluQWN0aXZpdHk+IGFjdGl2aXR5UmVmZXJlbmNlOworCisgICAgICAgIE1lZGlhQ29kZWNTdXJmYWNlQXN5bmMoTWFpbkFjdGl2aXR5IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGFjdGl2aXR5UmVmZXJlbmNlID0gbmV3IFdlYWtSZWZlcmVuY2U8Pihjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgSW50ZWdlciBkb0luQmFja2dyb3VuZChTdHJpbmcuLi4gc3RyaW5ncykgeworICAgICAgICAgICAgTWFpbkFjdGl2aXR5IG1haW5BY3Rpdml0eSA9IGFjdGl2aXR5UmVmZXJlbmNlLmdldCgpOworICAgICAgICAgICAgaW50IHJlc0lkID0gUi5yYXcuY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2gyNjU7CisgICAgICAgICAgICBpbnQgZW5jb2RpbmdTdGF0dXMgPSAxOworICAgICAgICAgICAgTWVkaWFDb2RlY1N1cmZhY2VFbmNvZGVyIGNvZGVjU3VyZmFjZUVuY29kZXIgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFDb2RlY1N1cmZhY2VFbmNvZGVyKG1haW5BY3Rpdml0eS5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKSwgcmVzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkFjdGl2aXR5Lm1NaW1lLCBtYWluQWN0aXZpdHkubUlzQ29kZWNTb2Z0d2FyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluQWN0aXZpdHkubU91dHB1dFZpZGVvUGF0aCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGVuY29kaW5nU3RhdHVzID0gY29kZWNTdXJmYWNlRW5jb2Rlci5zdGFydEVuY29kaW5nU3VyZmFjZSgpOworICAgICAgICAgICAgICAgIG1haW5BY3Rpdml0eS5tRnJhbWVUeXBlT2NjdXJyZW5jZXMgPSBjb2RlY1N1cmZhY2VFbmNvZGVyLmdldEZyYW1lVHlwZXMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZW5jb2RpbmdTdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShJbnRlZ2VyIGVuY29kaW5nU3RhdHVzKSB7CisgICAgICAgICAgICBNYWluQWN0aXZpdHkgbWFpbkFjdGl2aXR5ID0gYWN0aXZpdHlSZWZlcmVuY2UuZ2V0KCk7CisgICAgICAgICAgICBtYWluQWN0aXZpdHkubVN0YXJ0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICBpZiAoZW5jb2RpbmdTdGF0dXMgPT0gMCkgeworICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KG1haW5BY3Rpdml0eS5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKSwgIkVuY29kaW5nIENvbXBsZXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgICAgICAgICBtYWluQWN0aXZpdHkubVRleHRWaWV3LmFwcGVuZCgiXG4gRW5jb2RlZCBzdHJlYW0gY29udGFpbnM6ICIpOworICAgICAgICAgICAgICAgIG1haW5BY3Rpdml0eS5tVGV4dFZpZXcuYXBwZW5kKCJcbiBOdW1iZXIgb2YgSS1GcmFtZXM6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkFjdGl2aXR5Lm1GcmFtZVR5cGVPY2N1cnJlbmNlc1tGUkFNRV9UWVBFX0ldKTsKKyAgICAgICAgICAgICAgICBtYWluQWN0aXZpdHkubVRleHRWaWV3LmFwcGVuZCgiXG4gTnVtYmVyIG9mIFAtRnJhbWVzOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1haW5BY3Rpdml0eS5tRnJhbWVUeXBlT2NjdXJyZW5jZXNbRlJBTUVfVFlQRV9QXSk7CisgICAgICAgICAgICAgICAgbWFpbkFjdGl2aXR5Lm1UZXh0Vmlldy5hcHBlbmQoIlxuIE51bWJlciBvZiBCLUZyYW1lczogIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtYWluQWN0aXZpdHkubUZyYW1lVHlwZU9jY3VycmVuY2VzW0ZSQU1FX1RZUEVfQl0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChtYWluQWN0aXZpdHkuZ2V0QXBwbGljYXRpb25Db250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igb2NjdXJyZWQgd2hpbGUgIiArICJlbmNvZGluZyIsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFpbkFjdGl2aXR5Lm1PdXRwdXRWaWRlb1BhdGggPSBudWxsOworICAgICAgICAgICAgc3VwZXIub25Qb3N0RXhlY3V0ZShlbmNvZGluZ1N0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFRleHR1cmVWaWV3LlN1cmZhY2VUZXh0dXJlTGlzdGVuZXIgbVN1cmZhY2VUZXh0dXJlTGlzdGVuZXIgPQorICAgICAgICAgICAgbmV3IFRleHR1cmVWaWV3LlN1cmZhY2VUZXh0dXJlTGlzdGVuZXIoKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUZXh0dXJlQXZhaWxhYmxlKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2UsIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BlbkNhbWVyYSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUZXh0dXJlU2l6ZUNoYW5nZWQoU3VyZmFjZVRleHR1cmUgc3VyZmFjZSwgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZVRyYW5zZm9ybSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiS2VlcGluZyBjYW1lcmEgcHJldmlldyBzaXplIGZpeGVkIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25TdXJmYWNlVGV4dHVyZURlc3Ryb3llZChTdXJmYWNlVGV4dHVyZSBzdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVVcGRhdGVkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisKKyAgICBwcml2YXRlIGZpbmFsIENhbWVyYURldmljZS5TdGF0ZUNhbGxiYWNrIG1TdGF0ZUNhbGxiYWNrID0gbmV3IENhbWVyYURldmljZS5TdGF0ZUNhbGxiYWNrKCkgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbk9wZW5lZChDYW1lcmFEZXZpY2UgY2FtZXJhRGV2aWNlKSB7CisgICAgICAgICAgICBtQ2FtZXJhRGV2aWNlID0gY2FtZXJhRGV2aWNlOworICAgICAgICAgICAgc3RhcnRQcmV2aWV3KCk7CisgICAgICAgICAgICBtQ2FtZXJhT3BlbkNsb3NlTG9jay5yZWxlYXNlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25EaXNjb25uZWN0ZWQoQ2FtZXJhRGV2aWNlIGNhbWVyYURldmljZSkgeworICAgICAgICAgICAgbUNhbWVyYU9wZW5DbG9zZUxvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgY2FtZXJhRGV2aWNlLmNsb3NlKCk7CisgICAgICAgICAgICBtQ2FtZXJhRGV2aWNlID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKENhbWVyYURldmljZSBjYW1lcmFEZXZpY2UsIGludCBlcnJvcikgeworICAgICAgICAgICAgbUNhbWVyYU9wZW5DbG9zZUxvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgY2FtZXJhRGV2aWNlLmNsb3NlKCk7CisgICAgICAgICAgICBtQ2FtZXJhRGV2aWNlID0gbnVsbDsKKyAgICAgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gTWFpbkFjdGl2aXR5LnRoaXM7CisgICAgICAgICAgICBhY3Rpdml0eS5maW5pc2goKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkU2hvd1JlcXVlc3RQZXJtaXNzaW9uUmF0aW9uYWxlKFN0cmluZ1tdIHJlY29yZFBlcm1pc3Npb25zKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHBlcm1pc3Npb24gOiByZWNvcmRQZXJtaXNzaW9ucykgeworICAgICAgICAgICAgaWYgKEFjdGl2aXR5Q29tcGF0LnNob3VsZFNob3dSZXF1ZXN0UGVybWlzc2lvblJhdGlvbmFsZSh0aGlzLCBwZXJtaXNzaW9uKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVxdWVzdFJlY29yZFBlcm1pc3Npb25zKCkgeworICAgICAgICBpZiAoIXNob3VsZFNob3dSZXF1ZXN0UGVybWlzc2lvblJhdGlvbmFsZShSRUNPUkRfUEVSTUlTU0lPTlMpKSB7CisgICAgICAgICAgICBBY3Rpdml0eUNvbXBhdC5yZXF1ZXN0UGVybWlzc2lvbnModGhpcywgUkVDT1JEX1BFUk1JU1NJT05TLCBSRVFVRVNUX1JFQ09SRF9QRVJNSVNTSU9OUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlcXVlc3RQZXJtaXNzaW9uc1Jlc3VsdChpbnQgcmVxdWVzdENvZGUsIFN0cmluZ1tdIHBlcm1pc3Npb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIGdyYW50UmVzdWx0cykgeworICAgICAgICBpZiAocmVxdWVzdENvZGUgPT0gUkVRVUVTVF9SRUNPUkRfUEVSTUlTU0lPTlMpIHsKKyAgICAgICAgICAgIGlmIChncmFudFJlc3VsdHMubGVuZ3RoID09IFJFQ09SRF9QRVJNSVNTSU9OUy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCByZXN1bHQgOiBncmFudFJlc3VsdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlBlcm1pc3Npb24gaXMgbm90IGdyYW50ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VwZXIub25SZXF1ZXN0UGVybWlzc2lvbnNSZXN1bHQocmVxdWVzdENvZGUsIHBlcm1pc3Npb25zLCBncmFudFJlc3VsdHMpOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoIk1pc3NpbmdQZXJtaXNzaW9uIikKKyAgICBwcml2YXRlIHZvaWQgb3BlbkNhbWVyYShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgaWYgKCFoYXNQZXJtaXNzaW9uR3JhbnRlZChSRUNPUkRfUEVSTUlTU0lPTlMpKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDYW1lcmEgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHJlY29yZCB2aWRlbyIpOworICAgICAgICAgICAgcmVxdWVzdFJlY29yZFBlcm1pc3Npb25zKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQWN0aXZpdHkgYWN0aXZpdHkgPSBNYWluQWN0aXZpdHkudGhpczsKKyAgICAgICAgaWYgKGFjdGl2aXR5ID09IG51bGwgfHwgYWN0aXZpdHkuaXNGaW5pc2hpbmcoKSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQWN0aXZpdHkgbm90IGZvdW5kIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ2FtZXJhTWFuYWdlciBtYW5hZ2VyID0gKENhbWVyYU1hbmFnZXIpIGFjdGl2aXR5LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DQU1FUkFfU0VSVklDRSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJBY3F1aXJlIENhbWVyYSIpOworICAgICAgICAgICAgaWYgKCFtQ2FtZXJhT3BlbkNsb3NlTG9jay50cnlBY3F1aXJlKDI1MDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGltZWQgb3V0IHdhaXRpbmcgdG8gbG9jayBjYW1lcmEgb3BlbmluZyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ2FtZXJhIEFjcXVpcmVkIik7CisKKyAgICAgICAgICAgIFN0cmluZyBjYW1lcmFJZCA9IG1hbmFnZXIuZ2V0Q2FtZXJhSWRMaXN0KClbMF07CisgICAgICAgICAgICBpZiAobUlzRnJvbnRDYW1lcmEpIHsKKyAgICAgICAgICAgICAgICBjYW1lcmFJZCA9IG1hbmFnZXIuZ2V0Q2FtZXJhSWRMaXN0KClbMV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcyBjaGFyYWN0ZXJpc3RpY3MgPSBtYW5hZ2VyLmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCk7CisgICAgICAgICAgICBTdHJlYW1Db25maWd1cmF0aW9uTWFwIG1hcCA9CisgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcmlzdGljcy5nZXQoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlNDQUxFUl9TVFJFQU1fQ09ORklHVVJBVElPTl9NQVApOworICAgICAgICAgICAgbVZpZGVvU2l6ZSA9IGNob29zZVZpZGVvU2l6ZShtYXAuZ2V0T3V0cHV0U2l6ZXMoTWVkaWFSZWNvcmRlci5jbGFzcykpOworICAgICAgICAgICAgbVByZXZpZXdTaXplID0KKyAgICAgICAgICAgICAgICAgICAgY2hvb3NlT3B0aW1hbFNpemUobWFwLmdldE91dHB1dFNpemVzKFN1cmZhY2VUZXh0dXJlLmNsYXNzKSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9TaXplKTsKKyAgICAgICAgICAgIG1UZXh0dXJlVmlldy5zZXRBc3BlY3RSYXRpbyhtUHJldmlld1NpemUuZ2V0SGVpZ2h0KCksIG1QcmV2aWV3U2l6ZS5nZXRXaWR0aCgpKTsKKyAgICAgICAgICAgIGNvbmZpZ3VyZVRyYW5zZm9ybSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIG1NZWRpYVJlY29yZGVyID0gbmV3IE1lZGlhUmVjb3JkZXIoKTsKKyAgICAgICAgICAgIG1hbmFnZXIub3BlbkNhbWVyYShjYW1lcmFJZCwgbVN0YXRlQ2FsbGJhY2ssIG51bGwpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB8IENhbWVyYUFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNsb3NlQ2FtZXJhKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUNhbWVyYU9wZW5DbG9zZUxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgY2xvc2VQcmV2aWV3U2Vzc2lvbigpOworICAgICAgICAgICAgaWYgKG51bGwgIT0gbUNhbWVyYURldmljZSkgeworICAgICAgICAgICAgICAgIG1DYW1lcmFEZXZpY2UuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBtQ2FtZXJhRGV2aWNlID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudWxsICE9IG1NZWRpYVJlY29yZGVyKSB7CisgICAgICAgICAgICAgICAgbU1lZGlhUmVjb3JkZXIucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1NZWRpYVJlY29yZGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVycnVwdGVkIHdoaWxlIHRyeWluZyB0byBsb2NrIGNhbWVyYSBjbG9zaW5nLiIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbUNhbWVyYU9wZW5DbG9zZUxvY2sucmVsZWFzZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU2l6ZSBjaG9vc2VWaWRlb1NpemUoU2l6ZVtdIGNob2ljZXMpIHsKKyAgICAgICAgZm9yIChTaXplIHNpemUgOiBjaG9pY2VzKSB7CisgICAgICAgICAgICBpZiAoc2l6ZS5nZXRXaWR0aCgpID09IHNpemUuZ2V0SGVpZ2h0KCkgKiAxNiAvIDkgJiYgc2l6ZS5nZXRXaWR0aCgpIDw9IDE5MjApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBMb2cuZShUQUcsICJDb3VsZG4ndCBmaW5kIGFueSBzdWl0YWJsZSB2aWRlbyBzaXplIik7CisgICAgICAgIHJldHVybiBjaG9pY2VzW2Nob2ljZXMubGVuZ3RoIC0gMV07CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU2l6ZSBjaG9vc2VPcHRpbWFsU2l6ZShTaXplW10gY2hvaWNlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBTaXplIGFzcGVjdFJhdGlvKSB7CisgICAgICAgIExpc3Q8U2l6ZT4gYmlnRW5vdWdoID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGludCB3ID0gYXNwZWN0UmF0aW8uZ2V0V2lkdGgoKTsKKyAgICAgICAgaW50IGggPSBhc3BlY3RSYXRpby5nZXRIZWlnaHQoKTsKKyAgICAgICAgZm9yIChTaXplIG9wdGlvbiA6IGNob2ljZXMpIHsKKyAgICAgICAgICAgIGlmIChvcHRpb24uZ2V0SGVpZ2h0KCkgPT0gb3B0aW9uLmdldFdpZHRoKCkgKiBoIC8gdyAmJiBvcHRpb24uZ2V0V2lkdGgoKSA+PSB3aWR0aCAmJgorICAgICAgICAgICAgICAgICAgICBvcHRpb24uZ2V0SGVpZ2h0KCkgPj0gaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgYmlnRW5vdWdoLmFkZChvcHRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUGljayB0aGUgc21hbGxlc3Qgb2YgdGhvc2UsIGFzc3VtaW5nIHdlIGZvdW5kIGFueQorICAgICAgICBpZiAoYmlnRW5vdWdoLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5taW4oYmlnRW5vdWdoLCBuZXcgQ29tcGFyZVNpemVzQnlBcmVhKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGRuJ3QgZmluZCBhbnkgc3VpdGFibGUgcHJldmlldyBzaXplIik7CisgICAgICAgICAgICByZXR1cm4gY2hvaWNlc1swXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNQZXJtaXNzaW9uR3JhbnRlZChTdHJpbmdbXSByZWNvcmRQZXJtaXNzaW9ucykgeworICAgICAgICBmb3IgKFN0cmluZyBwZXJtaXNzaW9uIDogcmVjb3JkUGVybWlzc2lvbnMpIHsKKyAgICAgICAgICAgIGlmIChBY3Rpdml0eUNvbXBhdC5jaGVja1NlbGZQZXJtaXNzaW9uKE1haW5BY3Rpdml0eS50aGlzLCBwZXJtaXNzaW9uKSAhPQorICAgICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIHN0YXJ0QmFja2dyb3VuZFRocmVhZCgpOworICAgICAgICBpZiAobVRleHR1cmVWaWV3LmlzQXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgIG9wZW5DYW1lcmEobVRleHR1cmVWaWV3LmdldFdpZHRoKCksIG1UZXh0dXJlVmlldy5nZXRIZWlnaHQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVGV4dHVyZVZpZXcuc2V0U3VyZmFjZVRleHR1cmVMaXN0ZW5lcihtU3VyZmFjZVRleHR1cmVMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgeworICAgICAgICBjbG9zZUNhbWVyYSgpOworICAgICAgICBzdG9wQmFja2dyb3VuZFRocmVhZCgpOworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0QmFja2dyb3VuZFRocmVhZCgpIHsKKyAgICAgICAgbUJhY2tncm91bmRUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiQ2FtZXJhQmFja2dyb3VuZCIpOworICAgICAgICBtQmFja2dyb3VuZFRocmVhZC5zdGFydCgpOworICAgICAgICBtQmFja2dyb3VuZEhhbmRsZXIgPSBuZXcgSGFuZGxlcihtQmFja2dyb3VuZFRocmVhZC5nZXRMb29wZXIoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0b3BCYWNrZ3JvdW5kVGhyZWFkKCkgeworICAgICAgICBtQmFja2dyb3VuZFRocmVhZC5xdWl0U2FmZWx5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmFja2dyb3VuZFRocmVhZC5qb2luKCk7CisgICAgICAgICAgICBtQmFja2dyb3VuZFRocmVhZCA9IG51bGw7CisgICAgICAgICAgICBtQmFja2dyb3VuZEhhbmRsZXIgPSBudWxsOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0UmVjb3JkaW5nVmlkZW8oKSB7CisgICAgICAgIGlmIChudWxsID09IG1DYW1lcmFEZXZpY2UgfHwgIW1UZXh0dXJlVmlldy5pc0F2YWlsYWJsZSgpIHx8IG51bGwgPT0gbVByZXZpZXdTaXplKSB7CisgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChNYWluQWN0aXZpdHkudGhpcywgIkNhbm5vdCBzdGFydCByZWNvcmRpbmcuIiwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDYW5ub3Qgc3RhcnQgcmVjb3JkaW5nLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbG9zZVByZXZpZXdTZXNzaW9uKCk7CisgICAgICAgICAgICBzZXRVcE1lZGlhUmVjb3JkZXIoKTsKKyAgICAgICAgICAgIFN1cmZhY2VUZXh0dXJlIHRleHR1cmUgPSBtVGV4dHVyZVZpZXcuZ2V0U3VyZmFjZVRleHR1cmUoKTsKKyAgICAgICAgICAgIGFzc2VydCB0ZXh0dXJlICE9IG51bGw7CisgICAgICAgICAgICB0ZXh0dXJlLnNldERlZmF1bHRCdWZmZXJTaXplKG1QcmV2aWV3U2l6ZS5nZXRXaWR0aCgpLCBtUHJldmlld1NpemUuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgbVByZXZpZXdCdWlsZGVyID0gbUNhbWVyYURldmljZS5jcmVhdGVDYXB0dXJlUmVxdWVzdChDYW1lcmFEZXZpY2UuVEVNUExBVEVfUkVDT1JEKTsKKyAgICAgICAgICAgIExpc3Q8U3VyZmFjZT4gc3VyZmFjZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICAgICAgLy8gU2V0IHVwIFN1cmZhY2UgZm9yIHRoZSBjYW1lcmEgcHJldmlldworICAgICAgICAgICAgU3VyZmFjZSBwcmV2aWV3U3VyZmFjZSA9IG5ldyBTdXJmYWNlKHRleHR1cmUpOworICAgICAgICAgICAgc3VyZmFjZXMuYWRkKHByZXZpZXdTdXJmYWNlKTsKKyAgICAgICAgICAgIG1QcmV2aWV3QnVpbGRlci5hZGRUYXJnZXQocHJldmlld1N1cmZhY2UpOworCisgICAgICAgICAgICAvLyBTZXQgdXAgU3VyZmFjZSBmb3IgdGhlIE1lZGlhUmVjb3JkZXIKKyAgICAgICAgICAgIFN1cmZhY2UgcmVjb3JkZXJTdXJmYWNlID0gbU1lZGlhUmVjb3JkZXIuZ2V0U3VyZmFjZSgpOworICAgICAgICAgICAgc3VyZmFjZXMuYWRkKHJlY29yZGVyU3VyZmFjZSk7CisgICAgICAgICAgICBtUHJldmlld0J1aWxkZXIuYWRkVGFyZ2V0KHJlY29yZGVyU3VyZmFjZSk7CisKKyAgICAgICAgICAgIC8vU3RhcnQgYSBjYXB0dXJlIHNlc3Npb24KKyAgICAgICAgICAgIG1DYW1lcmFEZXZpY2UuY3JlYXRlQ2FwdHVyZVNlc3Npb24oc3VyZmFjZXMsIG5ldyBDYW1lcmFDYXB0dXJlU2Vzc2lvbi5TdGF0ZUNhbGxiYWNrKCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db25maWd1cmVkKENhbWVyYUNhcHR1cmVTZXNzaW9uIHNlc3Npb24pIHsKKyAgICAgICAgICAgICAgICAgICAgbVByZXZpZXdTZXNzaW9uID0gc2Vzc2lvbjsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlUHJldmlldygpOworICAgICAgICAgICAgICAgICAgICBNYWluQWN0aXZpdHkudGhpcy5ydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1JlY29yZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhUmVjb3JkZXIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRCdXR0b24uc2V0VGV4dChSLnN0cmluZy5zdG9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db25maWd1cmVGYWlsZWQoQ2FtZXJhQ2FwdHVyZVNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gY29uZmlndXJlLiBDYW5ub3Qgc3RhcnQgUmVjb3JkaW5nIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgbUJhY2tncm91bmRIYW5kbGVyKTsKKyAgICAgICAgfSBjYXRjaCAoQ2FtZXJhQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0VXBNZWRpYVJlY29yZGVyKCkgeworICAgICAgICBmaW5hbCBBY3Rpdml0eSBhY3Rpdml0eSA9IE1haW5BY3Rpdml0eS50aGlzOworICAgICAgICBpZiAoYWN0aXZpdHkgPT0gbnVsbCkgeworICAgICAgICAgICAgVG9hc3QubWFrZVRleHQoTWFpbkFjdGl2aXR5LnRoaXMsICJFcnJvciBvY2N1cnJlZCB3aGlsZSBzZXR0aW5nIHVwIHRoZSBNZWRpYVJlY29yZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBvY2N1cnJlZCB3aGlsZSBzZXR0aW5nIHVwIHRoZSBNZWRpYVJlY29yZGVyIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1NZWRpYVJlY29yZGVyLnNldEF1ZGlvU291cmNlKE1lZGlhUmVjb3JkZXIuQXVkaW9Tb3VyY2UuTUlDKTsKKyAgICAgICAgICAgIG1NZWRpYVJlY29yZGVyLnNldFZpZGVvU291cmNlKE1lZGlhUmVjb3JkZXIuVmlkZW9Tb3VyY2UuU1VSRkFDRSk7CisgICAgICAgICAgICBtTWVkaWFSZWNvcmRlci5zZXRPdXRwdXRGb3JtYXQoTWVkaWFSZWNvcmRlci5PdXRwdXRGb3JtYXQuTVBFR180KTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1PdXRwdXRWaWRlb1BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgbU91dHB1dFZpZGVvUGF0aCA9IGdldFZpZGVvUGF0aChNYWluQWN0aXZpdHkudGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgbU1lZGlhUmVjb3JkZXIuc2V0T3V0cHV0RmlsZShtT3V0cHV0VmlkZW9QYXRoKTsKKyAgICAgICAgbU1lZGlhUmVjb3JkZXIuc2V0VmlkZW9FbmNvZGluZ0JpdFJhdGUoVklERU9fQklUUkFURSk7CisgICAgICAgIG1NZWRpYVJlY29yZGVyLnNldFZpZGVvRnJhbWVSYXRlKFZJREVPX0ZSQU1FUkFURSk7CisgICAgICAgIG1NZWRpYVJlY29yZGVyLnNldFZpZGVvU2l6ZShtVmlkZW9TaXplLmdldFdpZHRoKCksIG1WaWRlb1NpemUuZ2V0SGVpZ2h0KCkpOworICAgICAgICBtTWVkaWFSZWNvcmRlci5zZXRPcmllbnRhdGlvbkhpbnQoMjcwKTsKKyAgICAgICAgaWYgKG1NaW1lLmVxdWFscyhNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19IRVZDKSkgeworICAgICAgICAgICAgbU1lZGlhUmVjb3JkZXIuc2V0VmlkZW9FbmNvZGVyKE1lZGlhUmVjb3JkZXIuVmlkZW9FbmNvZGVyLkhFVkMpOworICAgICAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSBCdWlsZC5WRVJTSU9OX0NPREVTLk8pIHsKKyAgICAgICAgICAgICAgICBtTWVkaWFSZWNvcmRlci5zZXRWaWRlb0VuY29kaW5nUHJvZmlsZUxldmVsKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0luZm8uQ29kZWNQcm9maWxlTGV2ZWwuSEVWQ1Byb2ZpbGVNYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0luZm8uQ29kZWNQcm9maWxlTGV2ZWwuSEVWQ01haW5UaWVyTGV2ZWw0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NZWRpYVJlY29yZGVyLnNldFZpZGVvRW5jb2RlcihNZWRpYVJlY29yZGVyLlZpZGVvRW5jb2Rlci5IMjY0KTsKKyAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gQnVpbGQuVkVSU0lPTl9DT0RFUy5PKSB7CisgICAgICAgICAgICAgICAgbU1lZGlhUmVjb3JkZXIuc2V0VmlkZW9FbmNvZGluZ1Byb2ZpbGVMZXZlbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29kZWNJbmZvLkNvZGVjUHJvZmlsZUxldmVsLkFWQ1Byb2ZpbGVNYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0luZm8uQ29kZWNQcm9maWxlTGV2ZWwuQVZDTGV2ZWw0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtTWVkaWFSZWNvcmRlci5zZXRBdWRpb0VuY29kZXIoTWVkaWFSZWNvcmRlci5BdWRpb0VuY29kZXIuQUFDKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1NZWRpYVJlY29yZGVyLnByZXBhcmUoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldFZpZGVvUGF0aChBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICBGaWxlIGRpciA9IGFjdGl2aXR5LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpLmdldEV4dGVybmFsRmlsZXNEaXIobnVsbCk7CisgICAgICAgIGlmIChkaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2Fubm90IGdldCBleHRlcm5hbCBkaXJlY3RvcnkgcGF0aCB0byBzYXZlIG91dHB1dCB2aWRlbyIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHZpZGVvUGF0aCA9IGRpci5nZXRBYnNvbHV0ZVBhdGgoKSArICIvVmlkZW8tIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIi5tcDQiOworICAgICAgICBMb2cuZChUQUcsICJPdXRwdXQgdmlkZW8gaXMgc2F2ZWQgYXQ6ICIgKyB2aWRlb1BhdGgpOworICAgICAgICByZXR1cm4gdmlkZW9QYXRoOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjbG9zZVByZXZpZXdTZXNzaW9uKCkgeworICAgICAgICBpZiAobVByZXZpZXdTZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1QcmV2aWV3U2Vzc2lvbi5jbG9zZSgpOworICAgICAgICAgICAgbVByZXZpZXdTZXNzaW9uID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdG9wUmVjb3JkaW5nVmlkZW8oKSB7CisgICAgICAgIG1Jc1JlY29yZGluZyA9IGZhbHNlOworICAgICAgICBtU3RhcnRCdXR0b24uc2V0VGV4dChSLnN0cmluZy5zdGFydCk7CisgICAgICAgIG1NZWRpYVJlY29yZGVyLnN0b3AoKTsKKyAgICAgICAgbU1lZGlhUmVjb3JkZXIucmVzZXQoKTsKKyAgICAgICAgVG9hc3QubWFrZVRleHQoTWFpbkFjdGl2aXR5LnRoaXMsICJSZWNvcmRpbmcgRmluaXNoZWQiLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgbU91dHB1dFZpZGVvUGF0aCA9IG51bGw7CisgICAgICAgIHN0YXJ0UHJldmlldygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydFByZXZpZXcoKSB7CisgICAgICAgIGlmIChudWxsID09IG1DYW1lcmFEZXZpY2UgfHwgIW1UZXh0dXJlVmlldy5pc0F2YWlsYWJsZSgpIHx8IG51bGwgPT0gbVByZXZpZXdTaXplKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsb3NlUHJldmlld1Nlc3Npb24oKTsKKyAgICAgICAgICAgIFN1cmZhY2VUZXh0dXJlIHRleHR1cmUgPSBtVGV4dHVyZVZpZXcuZ2V0U3VyZmFjZVRleHR1cmUoKTsKKyAgICAgICAgICAgIGFzc2VydCB0ZXh0dXJlICE9IG51bGw7CisgICAgICAgICAgICB0ZXh0dXJlLnNldERlZmF1bHRCdWZmZXJTaXplKG1QcmV2aWV3U2l6ZS5nZXRXaWR0aCgpLCBtUHJldmlld1NpemUuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgbVByZXZpZXdCdWlsZGVyID0gbUNhbWVyYURldmljZS5jcmVhdGVDYXB0dXJlUmVxdWVzdChDYW1lcmFEZXZpY2UuVEVNUExBVEVfUFJFVklFVyk7CisKKyAgICAgICAgICAgIFN1cmZhY2UgcHJldmlld1N1cmZhY2UgPSBuZXcgU3VyZmFjZSh0ZXh0dXJlKTsKKyAgICAgICAgICAgIG1QcmV2aWV3QnVpbGRlci5hZGRUYXJnZXQocHJldmlld1N1cmZhY2UpOworCisgICAgICAgICAgICBtQ2FtZXJhRGV2aWNlLmNyZWF0ZUNhcHR1cmVTZXNzaW9uKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocHJldmlld1N1cmZhY2UpLAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2FtZXJhQ2FwdHVyZVNlc3Npb24uU3RhdGVDYWxsYmFjaygpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyZWQoQ2FtZXJhQ2FwdHVyZVNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aWV3U2Vzc2lvbiA9IHNlc3Npb247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUHJldmlldygpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJlRmFpbGVkKENhbWVyYUNhcHR1cmVTZXNzaW9uIHNlc3Npb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChNYWluQWN0aXZpdHkudGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb25maWd1cmUgRmFpbGVkOyBDYW5ub3Qgc3RhcnQgIiArICJwcmV2aWV3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvbmZpZ3VyZSBmYWlsZWQ7IENhbm5vdCBzdGFydCBwcmV2aWV3Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0sIG1CYWNrZ3JvdW5kSGFuZGxlcik7CisgICAgICAgIH0gY2F0Y2ggKENhbWVyYUFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVByZXZpZXcoKSB7CisgICAgICAgIGlmIChtQ2FtZXJhRGV2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KE1haW5BY3Rpdml0eS50aGlzLCAiQ2FtZXJhIG5vdCBmb3VuZDsgQ2Fubm90IHVwZGF0ZSAiICsgInByZXZpZXciLAorICAgICAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkNhbWVyYSBub3QgZm91bmQ7IENhbm5vdCB1cGRhdGUgcHJldmlldyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtUHJldmlld0J1aWxkZXIuc2V0KENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfTU9ERSwgQ2FtZXJhTWV0YWRhdGEuQ09OVFJPTF9NT0RFX0FVVE8pOworICAgICAgICAgICAgSGFuZGxlclRocmVhZCB0aHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiQ2FtZXJhIHByZXZpZXciKTsKKyAgICAgICAgICAgIHRocmVhZC5zdGFydCgpOworICAgICAgICAgICAgbVByZXZpZXdTZXNzaW9uLnNldFJlcGVhdGluZ1JlcXVlc3QobVByZXZpZXdCdWlsZGVyLmJ1aWxkKCksIG51bGwsIG1CYWNrZ3JvdW5kSGFuZGxlcik7CisgICAgICAgIH0gY2F0Y2ggKENhbWVyYUFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVRyYW5zZm9ybShpbnQgdmlld1dpZHRoLCBpbnQgdmlld0hlaWdodCkgeworICAgICAgICBBY3Rpdml0eSBhY3Rpdml0eSA9IE1haW5BY3Rpdml0eS50aGlzOworICAgICAgICBpZiAobnVsbCA9PSBtVGV4dHVyZVZpZXcgfHwgbnVsbCA9PSBtUHJldmlld1NpemUgfHwgbnVsbCA9PSBhY3Rpdml0eSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE1hdHJpeCBtYXRyaXggPSBuZXcgTWF0cml4KCk7CisgICAgICAgIFJlY3RGIHZpZXdSZWN0ID0gbmV3IFJlY3RGKDAsIDAsIHZpZXdXaWR0aCwgdmlld0hlaWdodCk7CisgICAgICAgIFJlY3RGIGJ1ZmZlclJlY3QgPSBuZXcgUmVjdEYoMCwgMCwgbVByZXZpZXdTaXplLmdldEhlaWdodCgpLCBtUHJldmlld1NpemUuZ2V0V2lkdGgoKSk7CisgICAgICAgIGZsb2F0IGNlbnRlclggPSB2aWV3UmVjdC5jZW50ZXJYKCk7CisgICAgICAgIGZsb2F0IGNlbnRlclkgPSB2aWV3UmVjdC5jZW50ZXJZKCk7CisgICAgICAgIGJ1ZmZlclJlY3Qub2Zmc2V0KGNlbnRlclggLSBidWZmZXJSZWN0LmNlbnRlclgoKSwgY2VudGVyWSAtIGJ1ZmZlclJlY3QuY2VudGVyWSgpKTsKKyAgICAgICAgbWF0cml4LnNldFJlY3RUb1JlY3Qodmlld1JlY3QsIGJ1ZmZlclJlY3QsIE1hdHJpeC5TY2FsZVRvRml0LkZJTEwpOworICAgICAgICBmbG9hdCBzY2FsZSA9IE1hdGgubWF4KChmbG9hdCkgdmlld0hlaWdodCAvIG1QcmV2aWV3U2l6ZS5nZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAoZmxvYXQpIHZpZXdXaWR0aCAvIG1QcmV2aWV3U2l6ZS5nZXRXaWR0aCgpKTsKKyAgICAgICAgbWF0cml4LnBvc3RTY2FsZShzY2FsZSwgc2NhbGUsIGNlbnRlclgsIGNlbnRlclkpOworICAgICAgICBtVGV4dHVyZVZpZXcuc2V0VHJhbnNmb3JtKG1hdHJpeCk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIENvbXBhcmVTaXplc0J5QXJlYSBpbXBsZW1lbnRzIENvbXBhcmF0b3I8U2l6ZT4geworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKFNpemUgbGhzLCBTaXplIHJocykgeworICAgICAgICAgICAgcmV0dXJuIExvbmcuc2lnbnVtKChsb25nKSBsaHMuZ2V0V2lkdGgoKSAqIGxocy5nZXRIZWlnaHQoKSAtCisgICAgICAgICAgICAgICAgICAgIChsb25nKSByaHMuZ2V0V2lkdGgoKSAqIHJocy5nZXRIZWlnaHQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvc2FtcGxldmlkZW9lbmNvZGVyL01lZGlhQ29kZWNCYXNlLmphdmEgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvc2FtcGxldmlkZW9lbmNvZGVyL01lZGlhQ29kZWNCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjZTczYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9zYW1wbGV2aWRlb2VuY29kZXIvTWVkaWFDb2RlY0Jhc2UuamF2YQpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnNhbXBsZXZpZGVvZW5jb2RlcjsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlYzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0xpc3Q7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Mb2NrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CisKK2NsYXNzIENvZGVjQXN5bmNIYW5kbGVyIGV4dGVuZHMgTWVkaWFDb2RlYy5DYWxsYmFjayB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IENvZGVjQXN5bmNIYW5kbGVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICBwcml2YXRlIGZpbmFsIExvY2sgbUxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOworICAgIHByaXZhdGUgZmluYWwgQ29uZGl0aW9uIG1Db25kaXRpb24gPSBtTG9jay5uZXdDb25kaXRpb24oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpbmtlZExpc3Q8UGFpcjxJbnRlZ2VyLCBNZWRpYUNvZGVjLkJ1ZmZlckluZm8+PiBtQ2JJbnB1dFF1ZXVlOworICAgIHByaXZhdGUgZmluYWwgTGlua2VkTGlzdDxQYWlyPEludGVnZXIsIE1lZGlhQ29kZWMuQnVmZmVySW5mbz4+IG1DYk91dHB1dFF1ZXVlOworICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICBDb2RlY0FzeW5jSGFuZGxlcigpIHsKKyAgICAgICAgbUNiSW5wdXRRdWV1ZSA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgbUNiT3V0cHV0UXVldWUgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIH0KKworICAgIHZvaWQgY2xlYXJRdWV1ZXMoKSB7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgbUNiSW5wdXRRdWV1ZS5jbGVhcigpOworICAgICAgICBtQ2JPdXRwdXRRdWV1ZS5jbGVhcigpOworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0Q29udGV4dCgpIHsKKyAgICAgICAgY2xlYXJRdWV1ZXMoKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25JbnB1dEJ1ZmZlckF2YWlsYWJsZShNZWRpYUNvZGVjIGNvZGVjLCBpbnQgYnVmZmVySW5kZXgpIHsKKyAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICBtQ2JJbnB1dFF1ZXVlLmFkZChuZXcgUGFpcjw+KGJ1ZmZlckluZGV4LCAoTWVkaWFDb2RlYy5CdWZmZXJJbmZvKSBudWxsKSk7CisgICAgICAgIG1Db25kaXRpb24uc2lnbmFsQWxsKCk7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uT3V0cHV0QnVmZmVyQXZhaWxhYmxlKE1lZGlhQ29kZWMgY29kZWMsIGludCBidWZmZXJJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvZGVjLkJ1ZmZlckluZm8gaW5mbykgeworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIG1DYk91dHB1dFF1ZXVlLmFkZChuZXcgUGFpcjw+KGJ1ZmZlckluZGV4LCBpbmZvKSk7CisgICAgICAgIG1Db25kaXRpb24uc2lnbmFsQWxsKCk7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoTWVkaWFDb2RlYyBjb2RlYywgTWVkaWFDb2RlYy5Db2RlY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgbUNvbmRpdGlvbi5zaWduYWxBbGwoKTsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIExvZy5lKFRBRywgIlJlY2VpdmVkIG1lZGlhIGNvZGVjIGVycm9yIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbk91dHB1dEZvcm1hdENoYW5nZWQoTWVkaWFDb2RlYyBjb2RlYywgTWVkaWFGb3JtYXQgZm9ybWF0KSB7CisgICAgICAgIExvZy5pKFRBRywgIk91dHB1dCBmb3JtYXQgY2hhbmdlZDogIiArIGZvcm1hdC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICB2b2lkIHNldENhbGxCYWNrKE1lZGlhQ29kZWMgY29kZWMsIGJvb2xlYW4gaXNDb2RlY0luQXN5bmNNb2RlKSB7CisgICAgICAgIGlmIChpc0NvZGVjSW5Bc3luY01vZGUpIHsKKyAgICAgICAgICAgIGNvZGVjLnNldENhbGxiYWNrKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgUGFpcjxJbnRlZ2VyLCBNZWRpYUNvZGVjLkJ1ZmZlckluZm8+IGdldE91dHB1dCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFBhaXI8SW50ZWdlciwgTWVkaWFDb2RlYy5CdWZmZXJJbmZvPiBlbGVtZW50ID0gbnVsbDsKKyAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICB3aGlsZSAoIW1TaWduYWxsZWRFcnJvcikgeworICAgICAgICAgICAgaWYgKG1DYk91dHB1dFF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1Db25kaXRpb24uYXdhaXQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZWxlbWVudCA9IG1DYk91dHB1dFF1ZXVlLnJlbW92ZSgwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgfQorCisgICAgUGFpcjxJbnRlZ2VyLCBNZWRpYUNvZGVjLkJ1ZmZlckluZm8+IGdldFdvcmsoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBQYWlyPEludGVnZXIsIE1lZGlhQ29kZWMuQnVmZmVySW5mbz4gZWxlbWVudCA9IG51bGw7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgd2hpbGUgKCFtU2lnbmFsbGVkRXJyb3IpIHsKKyAgICAgICAgICAgIGlmIChtQ2JJbnB1dFF1ZXVlLmlzRW1wdHkoKSAmJiBtQ2JPdXRwdXRRdWV1ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtQ29uZGl0aW9uLmF3YWl0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghbUNiT3V0cHV0UXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBtQ2JPdXRwdXRRdWV1ZS5yZW1vdmUoMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW1DYklucHV0UXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBtQ2JJbnB1dFF1ZXVlLnJlbW92ZSgwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICB9CisKKyAgICBib29sZWFuIGhhc1NlZW5FcnJvcigpIHsKKyAgICAgICAgcmV0dXJuIG1TaWduYWxsZWRFcnJvcjsKKyAgICB9Cit9CisKK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBNZWRpYUNvZGVjQmFzZSB7CisgICAgc3RhdGljIEFycmF5TGlzdDxTdHJpbmc+IHNlbGVjdENvZGVjcyhTdHJpbmcgbWltZSwgQXJyYXlMaXN0PE1lZGlhRm9ybWF0PiBmb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZmVhdHVyZXMsIGJvb2xlYW4gaXNFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1NvZnR3YXJlKSB7CisKKyAgICAgICAgTWVkaWFDb2RlY0xpc3QgY29kZWNMaXN0ID0gbmV3IE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0LlJFR1VMQVJfQ09ERUNTKTsKKyAgICAgICAgTWVkaWFDb2RlY0luZm9bXSBjb2RlY0luZm9zID0gY29kZWNMaXN0LmdldENvZGVjSW5mb3MoKTsKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbGlzdE9mQ29kZWNzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoTWVkaWFDb2RlY0luZm8gY29kZWNJbmZvIDogY29kZWNJbmZvcykgeworICAgICAgICAgICAgaWYgKGlzRW5jb2RlcikgeworICAgICAgICAgICAgICAgIGlmICghY29kZWNJbmZvLmlzRW5jb2RlcigpKSBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGNvZGVjSW5mby5pc0VuY29kZXIoKSkgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IEJ1aWxkLlZFUlNJT05fQ09ERVMuUSAmJiBjb2RlY0luZm8uaXNBbGlhcygpKSBjb250aW51ZTsKKyAgICAgICAgICAgIFN0cmluZ1tdIHR5cGVzID0gY29kZWNJbmZvLmdldFN1cHBvcnRlZFR5cGVzKCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlIDogdHlwZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAodHlwZS5lcXVhbHNJZ25vcmVDYXNlKG1pbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNPayA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29kZWNJbmZvLkNvZGVjQ2FwYWJpbGl0aWVzIGNvZGVjQ2FwYWJpbGl0aWVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0luZm8uZ2V0Q2FwYWJpbGl0aWVzRm9yVHlwZSh0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChNZWRpYUZvcm1hdCBmb3JtYXQgOiBmb3JtYXRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb2RlY0NhcGFiaWxpdGllcy5pc0Zvcm1hdFN1cHBvcnRlZChmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBmZWF0dXJlIDogZmVhdHVyZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvZGVjQ2FwYWJpbGl0aWVzLmlzRmVhdHVyZVN1cHBvcnRlZChmZWF0dXJlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaXNTb2Z0d2FyZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjSW5mby5nZXROYW1lKCkuY29udGFpbnMoInNvZnR3YXJlIikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNJbmZvLmdldE5hbWUoKS5jb250YWlucygiYW5kcm9pZCIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjSW5mby5nZXROYW1lKCkuY29udGFpbnMoImdvb2dsZSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzT2spIGxpc3RPZkNvZGVjcy5hZGQoY29kZWNJbmZvLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWNJbmZvLmdldE5hbWUoKS5jb250YWlucygic29mdHdhcmUiKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0luZm8uZ2V0TmFtZSgpLmNvbnRhaW5zKCJhbmRyb2lkIikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNJbmZvLmdldE5hbWUoKS5jb250YWlucygiZ29vZ2xlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzT2spIGxpc3RPZkNvZGVjcy5hZGQoY29kZWNJbmZvLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpc3RPZkNvZGVjczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvc2FtcGxldmlkZW9lbmNvZGVyL01lZGlhQ29kZWNTdXJmYWNlRW5jb2Rlci5qYXZhIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL3NhbXBsZXZpZGVvZW5jb2Rlci9NZWRpYUNvZGVjU3VyZmFjZUVuY29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTFjMzhjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL3NhbXBsZXZpZGVvZW5jb2Rlci9NZWRpYUNvZGVjU3VyZmFjZUVuY29kZXIuamF2YQpAQCAtMCwwICsxLDM4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlYzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFFeHRyYWN0b3I7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTXV4ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5tZWRpYS5zYW1wbGV2aWRlb2VuY29kZXIuTWFpbkFjdGl2aXR5LkZSQU1FX1RZUEVfQjsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyLk1haW5BY3Rpdml0eS5GUkFNRV9UWVBFX0k7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLm1lZGlhLnNhbXBsZXZpZGVvZW5jb2Rlci5NYWluQWN0aXZpdHkuRlJBTUVfVFlQRV9QOworCitwdWJsaWMgY2xhc3MgTWVkaWFDb2RlY1N1cmZhY2VFbmNvZGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gTWVkaWFDb2RlY1N1cmZhY2VFbmNvZGVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZJREVPX0JJVFJBVEUgPSA4MDAwMDAwICAvKjggTWJwcyovOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWSURFT19GUkFNRVJBVEUgPSAzMDsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUFjdGl2aXR5Q29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtUmVzSUQ7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1heEJGcmFtZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbU1pbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbU91dHB1dFBhdGg7CisgICAgcHJpdmF0ZSBpbnQgbVRyYWNrSUQgPSAtMTsKKyAgICBwcml2YXRlIGludCBtRnJhbWVOdW0gPSAwOworICAgIHByaXZhdGUgaW50W10gbUZyYW1lVHlwZU9jY3VycmVuY2VzID0gezAsIDAsIDB9OworCisgICAgcHJpdmF0ZSBTdXJmYWNlIG1TdXJmYWNlOworICAgIHByaXZhdGUgTWVkaWFFeHRyYWN0b3IgbUV4dHJhY3RvcjsKKyAgICBwcml2YXRlIE1lZGlhQ29kZWMgbURlY29kZXI7CisgICAgcHJpdmF0ZSBNZWRpYUNvZGVjIG1FbmNvZGVyOworICAgIHByaXZhdGUgTWVkaWFNdXhlciBtTXV4ZXI7CisKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzQ29kZWNTb2Z0d2FyZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVNhd0RlY0lucHV0RU9TOworICAgIHByaXZhdGUgYm9vbGVhbiBtU2F3RGVjT3V0cHV0RU9TOworICAgIHByaXZhdGUgYm9vbGVhbiBtU2F3RW5jT3V0cHV0RU9TOworICAgIHByaXZhdGUgaW50IG1EZWNPdXRwdXRDb3VudDsKKyAgICBwcml2YXRlIGludCBtRW5jT3V0cHV0Q291bnQ7CisKKyAgICBwcml2YXRlIGZpbmFsIENvZGVjQXN5bmNIYW5kbGVyIG1Bc3luY0hhbmRsZUVuY29kZXIgPSBuZXcgQ29kZWNBc3luY0hhbmRsZXIoKTsKKyAgICBwcml2YXRlIGZpbmFsIENvZGVjQXN5bmNIYW5kbGVyIG1Bc3luY0hhbmRsZURlY29kZXIgPSBuZXcgQ29kZWNBc3luY0hhbmRsZXIoKTsKKworICAgIHB1YmxpYyBNZWRpYUNvZGVjU3VyZmFjZUVuY29kZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgcmVzSWQsIFN0cmluZyBtaW1lLCBib29sZWFuIGlzU29mdHdhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3V0cHV0UGF0aCwgaW50IG1heEJGcmFtZXMpIHsKKyAgICAgICAgbUFjdGl2aXR5Q29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1SZXNJRCA9IHJlc0lkOworICAgICAgICBtTWltZSA9IG1pbWU7CisgICAgICAgIG1Jc0NvZGVjU29mdHdhcmUgPSBpc1NvZnR3YXJlOworICAgICAgICBtT3V0cHV0UGF0aCA9IG91dHB1dFBhdGg7CisgICAgICAgIG1NYXhCRnJhbWVzID0gbWF4QkZyYW1lczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVkaWFDb2RlY1N1cmZhY2VFbmNvZGVyKENvbnRleHQgY29udGV4dCwgaW50IHJlc0lkLCBTdHJpbmcgbWltZSwgYm9vbGVhbiBpc1NvZnR3YXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG91dHB1dFBhdGgpIHsKKyAgICAgICAgLy8gRGVmYXVsdCB2YWx1ZSBvZiBNZWRpYUZvcm1hdC5LRVlfTUFYX0JfRlJBTUVTIGlzIHNldCB0byAxLCBpZiBub3QgcGFzc2VkIGFzIGEgcGFyYW1ldGVyLgorICAgICAgICB0aGlzKGNvbnRleHQsIHJlc0lkLCBtaW1lLCBpc1NvZnR3YXJlLCBvdXRwdXRQYXRoLCAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHN0YXJ0RW5jb2RpbmdTdXJmYWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIE1lZGlhRm9ybWF0IGRlY29kZXJGb3JtYXQgPSBzZXRVcFNvdXJjZSgpOworICAgICAgICBpZiAoZGVjb2RlckZvcm1hdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgZGVjb2Rlck1pbWUgPSBkZWNvZGVyRm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSk7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGxpc3RPZkRlb2NkZXJzID0KKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjQmFzZS5zZWxlY3RDb2RlY3MoZGVjb2Rlck1pbWUsIG51bGwsIG51bGwsIGZhbHNlLCBtSXNDb2RlY1NvZnR3YXJlKTsKKyAgICAgICAgaWYgKGxpc3RPZkRlb2NkZXJzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTm8gc3VpdGFibGUgZGVjb2RlciBmb3VuZCBmb3IgbWltZTogIiArIGRlY29kZXJNaW1lKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtRGVjb2RlciA9IE1lZGlhQ29kZWMuY3JlYXRlQnlDb2RlY05hbWUobGlzdE9mRGVvY2RlcnMuZ2V0KDApKTsKKworICAgICAgICBNZWRpYUZvcm1hdCBlbmNvZGVyRm9ybWF0ID0gc2V0VXBFbmNvZGVyRm9ybWF0KGRlY29kZXJGb3JtYXQpOworICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBsaXN0T2ZFbmNvZGVycyA9CisgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0Jhc2Uuc2VsZWN0Q29kZWNzKG1NaW1lLCBudWxsLCBudWxsLCB0cnVlLCBtSXNDb2RlY1NvZnR3YXJlKTsKKyAgICAgICAgaWYgKGxpc3RPZkVuY29kZXJzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTm8gc3VpdGFibGUgZW5jb2RlciBmb3VuZCBmb3IgbWltZTogIiArIG1NaW1lKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gbXV4T3V0cHV0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChTdHJpbmcgZW5jb2RlciA6IGxpc3RPZkVuY29kZXJzKSB7CisgICAgICAgICAgICBtRW5jb2RlciA9IE1lZGlhQ29kZWMuY3JlYXRlQnlDb2RlY05hbWUoZW5jb2Rlcik7CisgICAgICAgICAgICBtRXh0cmFjdG9yLnNlZWtUbygwLCBNZWRpYUV4dHJhY3Rvci5TRUVLX1RPX0NMT1NFU1RfU1lOQyk7CisgICAgICAgICAgICBpZiAobXV4T3V0cHV0KSB7CisgICAgICAgICAgICAgICAgaW50IG11eGVyRm9ybWF0ID0gTWVkaWFNdXhlci5PdXRwdXRGb3JtYXQuTVVYRVJfT1VUUFVUX01QRUdfNDsKKyAgICAgICAgICAgICAgICBtTXV4ZXIgPSBuZXcgTWVkaWFNdXhlcihtT3V0cHV0UGF0aCwgbXV4ZXJGb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uZmlndXJlQ29kZWMoZGVjb2RlckZvcm1hdCwgZW5jb2RlckZvcm1hdCk7CisgICAgICAgICAgICBtRW5jb2Rlci5zdGFydCgpOworICAgICAgICAgICAgbURlY29kZXIuc3RhcnQoKTsKKyAgICAgICAgICAgIGRvV29yayhJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgICAgICBxdWV1ZUVPUygpOworICAgICAgICAgICAgd2FpdEZvckFsbEVuY29kZXJPdXRwdXRzKCk7CisgICAgICAgICAgICBpZiAobXV4T3V0cHV0KSB7CisgICAgICAgICAgICAgICAgaWYgKG1UcmFja0lEICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIG1NdXhlci5zdG9wKCk7CisgICAgICAgICAgICAgICAgICAgIG1UcmFja0lEID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtTXV4ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtTXV4ZXIucmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICBtTXV4ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EZWNvZGVyLnJlc2V0KCk7CisgICAgICAgICAgICBtRW5jb2Rlci5yZXNldCgpOworICAgICAgICAgICAgbVN1cmZhY2UucmVsZWFzZSgpOworICAgICAgICAgICAgbVN1cmZhY2UgPSBudWxsOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiTnVtYmVyIG9mIEktZnJhbWVzID0gIiArIG1GcmFtZVR5cGVPY2N1cnJlbmNlc1tGUkFNRV9UWVBFX0ldKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIk51bWJlciBvZiBQLWZyYW1lcyA9ICIgKyBtRnJhbWVUeXBlT2NjdXJyZW5jZXNbRlJBTUVfVFlQRV9QXSk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJOdW1iZXIgb2YgQi1mcmFtZXMgPSAiICsgbUZyYW1lVHlwZU9jY3VycmVuY2VzW0ZSQU1FX1RZUEVfQl0pOworICAgICAgICB9CisgICAgICAgIG1FbmNvZGVyLnJlbGVhc2UoKTsKKyAgICAgICAgbURlY29kZXIucmVsZWFzZSgpOworICAgICAgICBtRXh0cmFjdG9yLnJlbGVhc2UoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZWRpYUZvcm1hdCBzZXRVcFNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG1FeHRyYWN0b3IgPSBuZXcgTWVkaWFFeHRyYWN0b3IoKTsKKyAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBmZCA9IG1BY3Rpdml0eUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlRmQobVJlc0lEKTsKKyAgICAgICAgbUV4dHJhY3Rvci5zZXREYXRhU291cmNlKGZkLmdldEZpbGVEZXNjcmlwdG9yKCksIGZkLmdldFN0YXJ0T2Zmc2V0KCksIGZkLmdldExlbmd0aCgpKTsKKyAgICAgICAgZm9yIChpbnQgdHJhY2tJRCA9IDA7IHRyYWNrSUQgPCBtRXh0cmFjdG9yLmdldFRyYWNrQ291bnQoKTsgdHJhY2tJRCsrKSB7CisgICAgICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSBtRXh0cmFjdG9yLmdldFRyYWNrRm9ybWF0KHRyYWNrSUQpOworICAgICAgICAgICAgU3RyaW5nIG1pbWUgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FKTsKKyAgICAgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7CisgICAgICAgICAgICAgICAgbUV4dHJhY3Rvci5zZWxlY3RUcmFjayh0cmFja0lEKTsKKyAgICAgICAgICAgICAgICBmb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQ09MT1JfRk9STUFULAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0luZm8uQ29kZWNDYXBhYmlsaXRpZXMuQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUpOworICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUV4dHJhY3Rvci5yZWxlYXNlKCk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgTWVkaWFGb3JtYXQgc2V0VXBFbmNvZGVyRm9ybWF0KE1lZGlhRm9ybWF0IGRlY29kZXJGb3JtYXQpIHsKKyAgICAgICAgTWVkaWFGb3JtYXQgZW5jb2RlckZvcm1hdCA9IG5ldyBNZWRpYUZvcm1hdCgpOworICAgICAgICBlbmNvZGVyRm9ybWF0LnNldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSwgbU1pbWUpOworICAgICAgICBlbmNvZGVyRm9ybWF0CisgICAgICAgICAgICAgICAgLnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX1dJRFRILCBkZWNvZGVyRm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX1dJRFRIKSk7CisgICAgICAgIGVuY29kZXJGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSEVJR0hULAorICAgICAgICAgICAgICAgIGRlY29kZXJGb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSEVJR0hUKSk7CisgICAgICAgIGVuY29kZXJGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfRlJBTUVfUkFURSwgVklERU9fRlJBTUVSQVRFKTsKKyAgICAgICAgZW5jb2RlckZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9CSVRfUkFURSwgVklERU9fQklUUkFURSk7CisgICAgICAgIGVuY29kZXJGb3JtYXQuc2V0RmxvYXQoTWVkaWFGb3JtYXQuS0VZX0lfRlJBTUVfSU5URVJWQUwsIDEuMGYpOworICAgICAgICBlbmNvZGVyRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0NPTE9SX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjSW5mby5Db2RlY0NhcGFiaWxpdGllcy5DT0xPUl9Gb3JtYXRTdXJmYWNlKTsKKyAgICAgICAgaWYgKG1NaW1lLmVxdWFscyhNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19IRVZDKSkgeworICAgICAgICAgICAgZW5jb2RlckZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9QUk9GSUxFLAorICAgICAgICAgICAgICAgICAgICBNZWRpYUNvZGVjSW5mby5Db2RlY1Byb2ZpbGVMZXZlbC5IRVZDUHJvZmlsZU1haW4pOworICAgICAgICAgICAgZW5jb2RlckZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0luZm8uQ29kZWNQcm9maWxlTGV2ZWwuSEVWQ01haW5UaWVyTGV2ZWw0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVuY29kZXJGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfUFJPRklMRSwKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0luZm8uQ29kZWNQcm9maWxlTGV2ZWwuQVZDUHJvZmlsZU1haW4pOworICAgICAgICAgICAgZW5jb2RlckZvcm1hdAorICAgICAgICAgICAgICAgICAgICAuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfTEVWRUwsIE1lZGlhQ29kZWNJbmZvLkNvZGVjUHJvZmlsZUxldmVsLkFWQ0xldmVsNCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSBCdWlsZC5WRVJTSU9OX0NPREVTLlEpIHsKKyAgICAgICAgICAgIGVuY29kZXJGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfTUFYX0JfRlJBTUVTLCBtTWF4QkZyYW1lcyk7CisgICAgICAgIH0gZWxzZSBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IEJ1aWxkLlZFUlNJT05fQ09ERVMuTykgeworICAgICAgICAgICAgZW5jb2RlckZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9MQVRFTkNZLCAxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZW5jb2RlckZvcm1hdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRDb250ZXh0KCkgeworICAgICAgICBtQXN5bmNIYW5kbGVEZWNvZGVyLnJlc2V0Q29udGV4dCgpOworICAgICAgICBtQXN5bmNIYW5kbGVFbmNvZGVyLnJlc2V0Q29udGV4dCgpOworICAgICAgICBtU2F3RGVjSW5wdXRFT1MgPSBmYWxzZTsKKyAgICAgICAgbVNhd0RlY091dHB1dEVPUyA9IGZhbHNlOworICAgICAgICBtU2F3RW5jT3V0cHV0RU9TID0gZmFsc2U7CisgICAgICAgIG1EZWNPdXRwdXRDb3VudCA9IDA7CisgICAgICAgIG1FbmNPdXRwdXRDb3VudCA9IDA7CisgICAgICAgIG1GcmFtZU51bSA9IDA7CisgICAgICAgIEFycmF5cy5maWxsKG1GcmFtZVR5cGVPY2N1cnJlbmNlcywgMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUNvZGVjKE1lZGlhRm9ybWF0IGRlY0Zvcm1hdCwgTWVkaWFGb3JtYXQgZW5jRm9ybWF0KSB7CisgICAgICAgIHJlc2V0Q29udGV4dCgpOworICAgICAgICBtQXN5bmNIYW5kbGVFbmNvZGVyLnNldENhbGxCYWNrKG1FbmNvZGVyLCB0cnVlKTsKKyAgICAgICAgbUVuY29kZXIuY29uZmlndXJlKGVuY0Zvcm1hdCwgbnVsbCwgbnVsbCwgTWVkaWFDb2RlYy5DT05GSUdVUkVfRkxBR19FTkNPREUpOworICAgICAgICBtU3VyZmFjZSA9IG1FbmNvZGVyLmNyZWF0ZUlucHV0U3VyZmFjZSgpOworICAgICAgICBpZiAoIW1TdXJmYWNlLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiU3VyZmFjZSBpcyBub3QgdmFsaWQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtQXN5bmNIYW5kbGVEZWNvZGVyLnNldENhbGxCYWNrKG1EZWNvZGVyLCB0cnVlKTsKKyAgICAgICAgbURlY29kZXIuY29uZmlndXJlKGRlY0Zvcm1hdCwgbVN1cmZhY2UsIG51bGwsIDApOworICAgICAgICBMb2cuZChUQUcsICJDb2RlYyBjb25maWd1cmVkIik7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiRW5jb2RlciBPdXRwdXQgZm9ybWF0OiAiICsgbUVuY29kZXIuZ2V0T3V0cHV0Rm9ybWF0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlcXVldWVEZWNvZGVyT3V0cHV0KGludCBidWZmZXJJbmRleCwgTWVkaWFDb2RlYy5CdWZmZXJJbmZvIGluZm8pIHsKKyAgICAgICAgaWYgKChpbmZvLmZsYWdzICYgTWVkaWFDb2RlYy5CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKSB7CisgICAgICAgICAgICBtU2F3RGVjT3V0cHV0RU9TID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywKKyAgICAgICAgICAgICAgICAgICAgIm91dHB1dDogaWQ6ICIgKyBidWZmZXJJbmRleCArICIgZmxhZ3M6ICIgKyBpbmZvLmZsYWdzICsgIiBzaXplOiAiICsgaW5mby5zaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRpbWVzdGFtcDogIiArIGluZm8ucHJlc2VudGF0aW9uVGltZVVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5mby5zaXplID4gMCAmJiAoaW5mby5mbGFncyAmIE1lZGlhQ29kZWMuQlVGRkVSX0ZMQUdfQ09ERUNfQ09ORklHKSA9PSAwKSB7CisgICAgICAgICAgICBtRGVjT3V0cHV0Q291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBtRGVjb2Rlci5yZWxlYXNlT3V0cHV0QnVmZmVyKGJ1ZmZlckluZGV4LCBtU3VyZmFjZSAhPSBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5xdWV1ZURlY29kZXJJbnB1dChpbnQgYnVmZmVySW5kZXgpIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBpbnB1dEJ1ZmZlciA9IG1EZWNvZGVyLmdldElucHV0QnVmZmVyKGJ1ZmZlckluZGV4KTsKKyAgICAgICAgaW50IHNpemUgPSBtRXh0cmFjdG9yLnJlYWRTYW1wbGVEYXRhKGlucHV0QnVmZmVyLCAwKTsKKyAgICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgICAgICBlbnF1ZXVlRGVjb2RlckVPUyhidWZmZXJJbmRleCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb25nIHB0cyA9IG1FeHRyYWN0b3IuZ2V0U2FtcGxlVGltZSgpOworICAgICAgICAgICAgaW50IGV4dHJhY3RvckZsYWdzID0gbUV4dHJhY3Rvci5nZXRTYW1wbGVGbGFncygpOworICAgICAgICAgICAgaW50IGNvZGVjRmxhZ3MgPSAwOworICAgICAgICAgICAgaWYgKChleHRyYWN0b3JGbGFncyAmIE1lZGlhRXh0cmFjdG9yLlNBTVBMRV9GTEFHX1NZTkMpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb2RlY0ZsYWdzIHw9IE1lZGlhQ29kZWMuQlVGRkVSX0ZMQUdfS0VZX0ZSQU1FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChleHRyYWN0b3JGbGFncyAmIE1lZGlhRXh0cmFjdG9yLlNBTVBMRV9GTEFHX1BBUlRJQUxfRlJBTUUpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb2RlY0ZsYWdzIHw9IE1lZGlhQ29kZWMuQlVGRkVSX0ZMQUdfUEFSVElBTF9GUkFNRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbUV4dHJhY3Rvci5hZHZhbmNlKCkpIHsKKyAgICAgICAgICAgICAgICBjb2RlY0ZsYWdzIHw9IE1lZGlhQ29kZWMuQlVGRkVSX0ZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICBtU2F3RGVjSW5wdXRFT1MgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW5wdXQ6IGlkOiAiICsgYnVmZmVySW5kZXggKyAiIHNpemU6ICIgKyBzaXplICsgIiBwdHM6ICIgKyBwdHMgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBmbGFnczogIiArIGNvZGVjRmxhZ3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURlY29kZXIucXVldWVJbnB1dEJ1ZmZlcihidWZmZXJJbmRleCwgMCwgc2l6ZSwgcHRzLCBjb2RlY0ZsYWdzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1dvcmsoaW50IGZyYW1lTGltaXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBmcmFtZUNvdW50ID0gMDsKKyAgICAgICAgd2hpbGUgKCFoYXNTZWVuRXJyb3IoKSAmJiAhbVNhd0RlY0lucHV0RU9TICYmIGZyYW1lQ291bnQgPCBmcmFtZUxpbWl0KSB7CisgICAgICAgICAgICBQYWlyPEludGVnZXIsIE1lZGlhQ29kZWMuQnVmZmVySW5mbz4gZWxlbWVudCA9IG1Bc3luY0hhbmRsZURlY29kZXIuZ2V0V29yaygpOworICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludCBidWZmZXJJRCA9IGVsZW1lbnQuZmlyc3Q7CisgICAgICAgICAgICAgICAgTWVkaWFDb2RlYy5CdWZmZXJJbmZvIGluZm8gPSBlbGVtZW50LnNlY29uZDsKKyAgICAgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIDxpZCwgaW5mbz4gY29ycmVzcG9uZHMgdG8gb3V0cHV0IGNhbGxiYWNrLgorICAgICAgICAgICAgICAgICAgICBkZXF1ZXVlRGVjb2Rlck91dHB1dChidWZmZXJJRCwgaW5mbyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gPGlkLCBudWxsPiBjb3JyZXNwb25kcyB0byBpbnB1dCBjYWxsYmFjay4KKyAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZURlY29kZXJJbnB1dChidWZmZXJJRCk7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjaGVjayBkZWNvZGVyIEVPUworICAgICAgICAgICAgaWYgKG1TYXdEZWNPdXRwdXRFT1MpIG1FbmNvZGVyLnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIC8vIGVuY29kZXIgb3V0cHV0CisgICAgICAgICAgICBpZiAobURlY091dHB1dENvdW50IC0gbUVuY091dHB1dENvdW50ID4gbU1heEJGcmFtZXMpIHsKKyAgICAgICAgICAgICAgICB0cnlFbmNvZGVyT3V0cHV0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcXVldWVFT1MoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICB3aGlsZSAoIW1Bc3luY0hhbmRsZURlY29kZXIuaGFzU2VlbkVycm9yKCkgJiYgIW1TYXdEZWNJbnB1dEVPUykgeworICAgICAgICAgICAgUGFpcjxJbnRlZ2VyLCBNZWRpYUNvZGVjLkJ1ZmZlckluZm8+IGVsZW1lbnQgPSBtQXN5bmNIYW5kbGVEZWNvZGVyLmdldFdvcmsoKTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgYnVmZmVySUQgPSBlbGVtZW50LmZpcnN0OworICAgICAgICAgICAgICAgIE1lZGlhQ29kZWMuQnVmZmVySW5mbyBpbmZvID0gZWxlbWVudC5zZWNvbmQ7CisgICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBkZXF1ZXVlRGVjb2Rlck91dHB1dChidWZmZXJJRCwgaW5mbyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZURlY29kZXJFT1MoZWxlbWVudC5maXJzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKCFoYXNTZWVuRXJyb3IoKSAmJiAhbVNhd0RlY091dHB1dEVPUykgeworICAgICAgICAgICAgUGFpcjxJbnRlZ2VyLCBNZWRpYUNvZGVjLkJ1ZmZlckluZm8+IGRlY09wID0gbUFzeW5jSGFuZGxlRGVjb2Rlci5nZXRPdXRwdXQoKTsKKyAgICAgICAgICAgIGlmIChkZWNPcCAhPSBudWxsKSBkZXF1ZXVlRGVjb2Rlck91dHB1dChkZWNPcC5maXJzdCwgZGVjT3Auc2Vjb25kKTsKKyAgICAgICAgICAgIGlmIChtU2F3RGVjT3V0cHV0RU9TKSBtRW5jb2Rlci5zaWduYWxFbmRPZklucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBpZiAobURlY091dHB1dENvdW50IC0gbUVuY091dHB1dENvdW50ID4gbU1heEJGcmFtZXMpIHsKKyAgICAgICAgICAgICAgICB0cnlFbmNvZGVyT3V0cHV0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdHJ5RW5jb2Rlck91dHB1dCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaGFzU2VlbkVycm9yKCkgJiYgIW1TYXdFbmNPdXRwdXRFT1MpIHsKKyAgICAgICAgICAgIFBhaXI8SW50ZWdlciwgTWVkaWFDb2RlYy5CdWZmZXJJbmZvPiBlbGVtZW50ID0gbUFzeW5jSGFuZGxlRW5jb2Rlci5nZXRPdXRwdXQoKTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXF1ZXVlRW5jb2Rlck91dHB1dChlbGVtZW50LmZpcnN0LCBlbGVtZW50LnNlY29uZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvckFsbEVuY29kZXJPdXRwdXRzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgd2hpbGUgKCFoYXNTZWVuRXJyb3IoKSAmJiAhbVNhd0VuY091dHB1dEVPUykgeworICAgICAgICAgICAgdHJ5RW5jb2Rlck91dHB1dCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVucXVldWVEZWNvZGVyRU9TKGludCBidWZmZXJJbmRleCkgeworICAgICAgICBpZiAoIW1TYXdEZWNJbnB1dEVPUykgeworICAgICAgICAgICAgbURlY29kZXIucXVldWVJbnB1dEJ1ZmZlcihidWZmZXJJbmRleCwgMCwgMCwgMCwgTWVkaWFDb2RlYy5CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgICAgIG1TYXdEZWNJbnB1dEVPUyA9IHRydWU7CisgICAgICAgICAgICBMb2cuZChUQUcsICJRdWV1ZWQgRW5kIG9mIFN0cmVhbSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlcXVldWVFbmNvZGVyT3V0cHV0KGludCBidWZmZXJJbmRleCwgTWVkaWFDb2RlYy5CdWZmZXJJbmZvIGluZm8pIHsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJlbmNvZGVyIG91dHB1dDogaWQ6ICIgKyBidWZmZXJJbmRleCArICIgZmxhZ3M6ICIgKyBpbmZvLmZsYWdzICsgIiBzaXplOiAiICsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5zaXplICsgIiB0aW1lc3RhbXA6ICIgKyBpbmZvLnByZXNlbnRhdGlvblRpbWVVcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChpbmZvLmZsYWdzICYgTWVkaWFDb2RlYy5CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKSB7CisgICAgICAgICAgICBtU2F3RW5jT3V0cHV0RU9TID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5mby5zaXplID4gMCkgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBtRW5jb2Rlci5nZXRPdXRwdXRCdWZmZXIoYnVmZmVySW5kZXgpOworICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGJ1ZmZlciB0byBnZXQgdGhlIGZyYW1lIHR5cGUKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiWyBGcmFtZSA6ICIgKyAobUZyYW1lTnVtKyspICsgIiBdIik7CisgICAgICAgICAgICBpbnQgZnJhbWVUeXBlUmVzdWx0ID0gLTE7CisgICAgICAgICAgICBpZiAobU1pbWUgPT0gTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fQVZDKSB7CisgICAgICAgICAgICAgICAgZnJhbWVUeXBlUmVzdWx0ID0gTmFsVW5pdFV0aWwuZ2V0U3RhbmRhcmRpemVkRnJhbWVUeXBlc0Zyb21BVkMoYnVmKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobU1pbWUgPT0gTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fSEVWQyl7CisgICAgICAgICAgICAgICAgZnJhbWVUeXBlUmVzdWx0ID0gTmFsVW5pdFV0aWwuZ2V0U3RhbmRhcmRpemVkRnJhbWVUeXBlc0Zyb21IRVZDKGJ1Zik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIk1pbWUgdHlwZSAiICsgbU1pbWUgKyAiIGlzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZyYW1lVHlwZVJlc3VsdCAhPSAtMSkgeworICAgICAgICAgICAgICAgIG1GcmFtZVR5cGVPY2N1cnJlbmNlc1tmcmFtZVR5cGVSZXN1bHRdKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtTXV4ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtVHJhY2tJRCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBtVHJhY2tJRCA9IG1NdXhlci5hZGRUcmFjayhtRW5jb2Rlci5nZXRPdXRwdXRGb3JtYXQoKSk7CisgICAgICAgICAgICAgICAgICAgIG1NdXhlci5zdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTXV4ZXIud3JpdGVTYW1wbGVEYXRhKG1UcmFja0lELCBidWYsIGluZm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChpbmZvLmZsYWdzICYgTWVkaWFDb2RlYy5CVUZGRVJfRkxBR19DT0RFQ19DT05GSUcpID09IDApIHsKKyAgICAgICAgICAgICAgICBtRW5jT3V0cHV0Q291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRW5jb2Rlci5yZWxlYXNlT3V0cHV0QnVmZmVyKGJ1ZmZlckluZGV4LCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc1NlZW5FcnJvcigpIHsKKyAgICAgICAgcmV0dXJuIG1Bc3luY0hhbmRsZURlY29kZXIuaGFzU2VlbkVycm9yKCkgfHwgbUFzeW5jSGFuZGxlRW5jb2Rlci5oYXNTZWVuRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50W10gZ2V0RnJhbWVUeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFtZVR5cGVPY2N1cnJlbmNlczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvc2FtcGxldmlkZW9lbmNvZGVyL05hbFVuaXRVdGlsLmphdmEgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvc2FtcGxldmlkZW9lbmNvZGVyL05hbFVuaXRVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZmZjRmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9zYW1wbGV2aWRlb2VuY29kZXIvTmFsVW5pdFV0aWwuamF2YQpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyLk1haW5BY3Rpdml0eS5GUkFNRV9UWVBFX0I7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLm1lZGlhLnNhbXBsZXZpZGVvZW5jb2Rlci5NYWluQWN0aXZpdHkuRlJBTUVfVFlQRV9JOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5tZWRpYS5zYW1wbGV2aWRlb2VuY29kZXIuTWFpbkFjdGl2aXR5LkZSQU1FX1RZUEVfUDsKKworcHVibGljIGNsYXNzIE5hbFVuaXRVdGlsIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gTWVkaWFDb2RlY1N1cmZhY2VFbmNvZGVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBmaW5kTmFsVW5pdChieXRlW10gZGF0YUFycmF5LCBpbnQgcG9zLCBpbnQgbGltaXQpIHsKKyAgICAgICAgaW50IHN0YXJ0T2Zmc2V0ID0gMDsKKyAgICAgICAgaWYgKGxpbWl0IC0gcG9zIDwgNCkgeworICAgICAgICAgICAgcmV0dXJuIHN0YXJ0T2Zmc2V0OworICAgICAgICB9CisgICAgICAgIGlmIChkYXRhQXJyYXlbcG9zXSA9PSAwICYmIGRhdGFBcnJheVtwb3MgKyAxXSA9PSAwICYmIGRhdGFBcnJheVtwb3MgKyAyXSA9PSAxKSB7CisgICAgICAgICAgICBzdGFydE9mZnNldCA9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZGF0YUFycmF5W3Bvc10gPT0gMCAmJiBkYXRhQXJyYXlbcG9zICsgMV0gPT0gMCAmJiBkYXRhQXJyYXlbcG9zICsgMl0gPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBkYXRhQXJyYXlbcG9zICsgM10gPT0gMSkgeworICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhcnRPZmZzZXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldEFWQ05hbFVuaXRUeXBlKGJ5dGVbXSBkYXRhQXJyYXksIGludCBuYWxVbml0T2Zmc2V0KSB7CisgICAgICAgIHJldHVybiBkYXRhQXJyYXlbbmFsVW5pdE9mZnNldF0gJiAweDFGOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBwYXJzZUFWQ05BTFVuaXREYXRhKGJ5dGVbXSBkYXRhQXJyYXksIGludCBvZmZzZXQsIGludCBsaW1pdCkgeworICAgICAgICBQYXJzYWJsZUJpdEFycmF5IGJpdEFycmF5ID0gbmV3IFBhcnNhYmxlQml0QXJyYXkoZGF0YUFycmF5KTsKKyAgICAgICAgYml0QXJyYXkucmVzZXQoZGF0YUFycmF5LCBvZmZzZXQsIGxpbWl0KTsKKworICAgICAgICBiaXRBcnJheS5za2lwQml0KCk7IC8vIGZvcmJpZGRlbl96ZXJvX2JpdAorICAgICAgICBiaXRBcnJheS5yZWFkQml0cygyKTsgLy8gbmFsX3JlZl9pZGMKKyAgICAgICAgYml0QXJyYXkuc2tpcEJpdHMoNSk7IC8vIG5hbF91bml0X3R5cGUKKworICAgICAgICBiaXRBcnJheS5yZWFkVUVWKCk7IC8vIGZpcnN0X21iX2luX3NsaWNlCisgICAgICAgIGlmICghYml0QXJyYXkuY2FuUmVhZFVFVigpKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaW50IHNsaWNlVHlwZSA9IGJpdEFycmF5LnJlYWRVRVYoKTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJzbGljZV90eXBlID0gIiArIHNsaWNlVHlwZSk7CisgICAgICAgIGlmIChzbGljZVR5cGUgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEZSQU1FX1RZUEVfUDsKKyAgICAgICAgfSBlbHNlIGlmIChzbGljZVR5cGUgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIEZSQU1FX1RZUEVfQjsKKyAgICAgICAgfSBlbHNlIGlmIChzbGljZVR5cGUgPT0gMikgeworICAgICAgICAgICAgcmV0dXJuIEZSQU1FX1RZUEVfSTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRIRVZDTmFsVW5pdFR5cGUoYnl0ZVtdIGRhdGFBcnJheSwgaW50IG5hbFVuaXRPZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIChkYXRhQXJyYXlbbmFsVW5pdE9mZnNldF0gJiAweDdFKSA+PiAxOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBwYXJzZUhFVkNOQUxVbml0RGF0YShieXRlW10gZGF0YUFycmF5LCBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYWxVbml0VHlwZSkgeworICAgICAgICAvLyBuYWxfdW5pdF90eXBlIHZhbHVlcyBmcm9tIEguMjY1L0hFVkMgVGFibGUgNy0xLgorICAgICAgICBmaW5hbCBpbnQgQkxBX1dfTFAgPSAxNjsKKyAgICAgICAgZmluYWwgaW50IFJTVl9JUkFQX1ZDTDIzID0gMjM7CisKKyAgICAgICAgUGFyc2FibGVCaXRBcnJheSBiaXRBcnJheSA9IG5ldyBQYXJzYWJsZUJpdEFycmF5KGRhdGFBcnJheSk7CisgICAgICAgIGJpdEFycmF5LnJlc2V0KGRhdGFBcnJheSwgb2Zmc2V0LCBsaW1pdCk7CisKKyAgICAgICAgYml0QXJyYXkuc2tpcEJpdCgpOyAvLyBmb3JiaWRkZW4gemVybyBiaXQKKyAgICAgICAgYml0QXJyYXkucmVhZEJpdHMoNik7IC8vIG5hbF91bml0X2hlYWRlcgorICAgICAgICBiaXRBcnJheS5yZWFkQml0cyg2KTsgLy8gbnVoX2xheWVyX2lkCisgICAgICAgIGJpdEFycmF5LnJlYWRCaXRzKDMpOyAvLyBudWhfdGVtcG9yYWxfaWRfcGx1czEKKworICAgICAgICAvLyBQYXJzaW5nIHNsaWNlX3NlZ21lbnRfaGVhZGVyIHZhbHVlcyBmcm9tIEguMjY1L0hFVkMgVGFibGUgNy4zLjYuMQorICAgICAgICBib29sZWFuIGZpcnN0X3NsaWNlX3NlZ21lbnQgPSBiaXRBcnJheS5yZWFkQml0KCk7IC8vIGZpcnN0X3NsaWNlX3NlZ21lbnRfaW5fcGljX2ZsYWcKKyAgICAgICAgaWYgKCFmaXJzdF9zbGljZV9zZWdtZW50KSByZXR1cm4gLTE7CisgICAgICAgIGlmIChuYWxVbml0VHlwZSA+PSBCTEFfV19MUCAmJiBuYWxVbml0VHlwZSA8PSBSU1ZfSVJBUF9WQ0wyMykgeworICAgICAgICAgICAgYml0QXJyYXkucmVhZEJpdCgpOyAgLy8gbm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZworICAgICAgICB9CisgICAgICAgIGJpdEFycmF5LnJlYWRVRVYoKTsgLy8gc2xpY2VfcGljX3BhcmFtZXRlcl9zZXRfaWQKKyAgICAgICAgLy8gQXNzdW1lIG51bV9leHRyYV9zbGljZV9oZWFkZXJfYml0cyBlbGVtZW50IG9mIFBQUyBkYXRhIHRvIGJlIDAKKyAgICAgICAgaW50IHNsaWNlVHlwZSA9IGJpdEFycmF5LnJlYWRVRVYoKTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJzbGljZV90eXBlID0gIiArIHNsaWNlVHlwZSk7CisgICAgICAgIGlmIChzbGljZVR5cGUgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEZSQU1FX1RZUEVfQjsKKyAgICAgICAgfSBlbHNlIGlmIChzbGljZVR5cGUgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIEZSQU1FX1RZUEVfUDsKKyAgICAgICAgfSBlbHNlIGlmIChzbGljZVR5cGUgPT0gMikgeworICAgICAgICAgICAgcmV0dXJuIEZSQU1FX1RZUEVfSTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFN0YW5kYXJkaXplZEZyYW1lVHlwZXNGcm9tQVZDKEJ5dGVCdWZmZXIgYnVmKSB7CisgICAgICAgIGludCBsaW1pdCA9IGJ1Zi5saW1pdCgpOworICAgICAgICBieXRlW10gZGF0YUFycmF5ID0gbmV3IGJ5dGVbYnVmLnJlbWFpbmluZygpXTsKKyAgICAgICAgYnVmLmdldChkYXRhQXJyYXkpOworICAgICAgICBpbnQgZnJhbWVUeXBlID0gLTE7CisgICAgICAgIGZvciAoaW50IHBvcyA9IDA7IHBvcyArIDMgPCBsaW1pdDsgKSB7CisgICAgICAgICAgICBpbnQgc3RhcnRPZmZzZXQgPSBOYWxVbml0VXRpbC5maW5kTmFsVW5pdChkYXRhQXJyYXksIHBvcywgbGltaXQpOworICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgbmFsVW5pdFR5cGUgPSBnZXRBVkNOYWxVbml0VHlwZShkYXRhQXJyYXksIChwb3MgKyBzdGFydE9mZnNldCkpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJOYWxVbml0T2Zmc2V0ID0gIiArIChwb3MgKyBzdGFydE9mZnNldCkpOworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJOYWxVbml0VHlwZSA9ICIgKyBuYWxVbml0VHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFNMSUNFX05BTCA9IDE7IElEUl9TTElDRV9OQUwgPSA1CisgICAgICAgICAgICAgICAgaWYgKG5hbFVuaXRUeXBlID09IDEgfHwgbmFsVW5pdFR5cGUgPT0gNSkgeworICAgICAgICAgICAgICAgICAgICBmcmFtZVR5cGUgPSBwYXJzZUFWQ05BTFVuaXREYXRhKGRhdGFBcnJheSwgKHBvcyArIHN0YXJ0T2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGltaXQgLSBwb3MgLSBzdGFydE9mZnNldCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcG9zICs9IDM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBvcysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmcmFtZVR5cGU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0U3RhbmRhcmRpemVkRnJhbWVUeXBlc0Zyb21IRVZDKEJ5dGVCdWZmZXIgYnVmKSB7CisgICAgICAgIGludCBsaW1pdCA9IGJ1Zi5saW1pdCgpOworICAgICAgICBieXRlW10gZGF0YUFycmF5ID0gbmV3IGJ5dGVbYnVmLnJlbWFpbmluZygpXTsKKyAgICAgICAgYnVmLmdldChkYXRhQXJyYXkpOworICAgICAgICBpbnQgZnJhbWVUeXBlID0gLTE7CisgICAgICAgIGZvciAoaW50IHBvcyA9IDA7IHBvcyArIDMgPCBsaW1pdDsgKSB7CisgICAgICAgICAgICBpbnQgc3RhcnRPZmZzZXQgPSBOYWxVbml0VXRpbC5maW5kTmFsVW5pdChkYXRhQXJyYXksIHBvcywgbGltaXQpOworICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgbmFsVW5pdFR5cGUgPSBOYWxVbml0VXRpbC5nZXRIRVZDTmFsVW5pdFR5cGUoZGF0YUFycmF5LCAocG9zICsgc3RhcnRPZmZzZXQpKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTmFsVW5pdE9mZnNldCA9ICIgKyAocG9zICsgc3RhcnRPZmZzZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTmFsVW5pdFR5cGUgPSAiICsgbmFsVW5pdFR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBQYXJzZSBOQUxVbml0cyBjb250YWluaW5nIHNsaWNlX2hlYWRlcnMgd2hpY2ggbGllcyBpbiB0aGUgcmFuZ2Ugb2YgMCB0byAyMQorICAgICAgICAgICAgICAgIGlmIChuYWxVbml0VHlwZSA+PSAwICYmIG5hbFVuaXRUeXBlIDw9IDIxKSB7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lVHlwZSA9IHBhcnNlSEVWQ05BTFVuaXREYXRhKGRhdGFBcnJheSwgKHBvcyArIHN0YXJ0T2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGltaXQgLSBwb3MgLSBzdGFydE9mZnNldCksIG5hbFVuaXRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBvcyArPSAzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZnJhbWVUeXBlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9zYW1wbGV2aWRlb2VuY29kZXIvUGFyc2FibGVCaXRBcnJheS5qYXZhIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL3NhbXBsZXZpZGVvZW5jb2Rlci9QYXJzYWJsZUJpdEFycmF5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiZmFhMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9zYW1wbGV2aWRlb2VuY29kZXIvUGFyc2FibGVCaXRBcnJheS5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5zYW1wbGV2aWRlb2VuY29kZXI7CisKK3B1YmxpYyBjbGFzcyBQYXJzYWJsZUJpdEFycmF5IHsKKyAgICBwdWJsaWMgYnl0ZVtdIGRhdGE7CisgICAgcHJpdmF0ZSBpbnQgYnl0ZU9mZnNldDsKKyAgICBwcml2YXRlIGludCBiaXRPZmZzZXQ7CisgICAgcHJpdmF0ZSBpbnQgYnl0ZUxpbWl0OworCisgICAgcHVibGljIFBhcnNhYmxlQml0QXJyYXkoYnl0ZVtdIGRhdGFBcnJheSkgeworICAgICAgICB0aGlzKGRhdGFBcnJheSwgZGF0YUFycmF5Lmxlbmd0aCk7CisgICAgfQorCisgICAgcHVibGljIFBhcnNhYmxlQml0QXJyYXkoYnl0ZVtdIGRhdGFBcnJheSwgaW50IGxpbWl0KSB7CisgICAgICAgIHRoaXMuZGF0YSA9IGRhdGFBcnJheTsKKyAgICAgICAgYnl0ZUxpbWl0ID0gbGltaXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXQoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsaW1pdCkgeworICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgICAgICBieXRlT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICBiaXRPZmZzZXQgPSAwOworICAgICAgICBieXRlTGltaXQgPSBsaW1pdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBza2lwQml0KCkgeworICAgICAgICBpZiAoKytiaXRPZmZzZXQgPT0gOCkgeworICAgICAgICAgICAgYml0T2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGJ5dGVPZmZzZXQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNraXBCaXRzKGludCBudW1CaXRzKSB7CisgICAgICAgIGludCBudW1CeXRlcyA9IG51bUJpdHMgLyA4OworICAgICAgICBieXRlT2Zmc2V0ICs9IG51bUJ5dGVzOworICAgICAgICBiaXRPZmZzZXQgKz0gbnVtQml0cyAtIChudW1CeXRlcyAqIDgpOworICAgICAgICBpZiAoYml0T2Zmc2V0ID4gNykgeworICAgICAgICAgICAgYnl0ZU9mZnNldCsrOworICAgICAgICAgICAgYml0T2Zmc2V0IC09IDg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZWFkQml0KCkgeworICAgICAgICBib29sZWFuIHJldHVyblZhbHVlID0gKGRhdGFbYnl0ZU9mZnNldF0gJiAoMHg4MCA+PiBiaXRPZmZzZXQpKSAhPSAwOworICAgICAgICBza2lwQml0KCk7CisgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlYWRCaXRzKGludCBudW1CaXRzKSB7CisgICAgICAgIGlmIChudW1CaXRzID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGludCByZXR1cm5WYWx1ZSA9IDA7CisgICAgICAgIGJpdE9mZnNldCArPSBudW1CaXRzOworICAgICAgICB3aGlsZSAoYml0T2Zmc2V0ID4gOCkgeworICAgICAgICAgICAgYml0T2Zmc2V0IC09IDg7CisgICAgICAgICAgICByZXR1cm5WYWx1ZSB8PSAoZGF0YVtieXRlT2Zmc2V0KytdICYgMHhGRikgPDwgYml0T2Zmc2V0OworICAgICAgICB9CisgICAgICAgIHJldHVyblZhbHVlIHw9IChkYXRhW2J5dGVPZmZzZXRdICYgMHhGRikgPj4gKDggLSBiaXRPZmZzZXQpOworICAgICAgICByZXR1cm5WYWx1ZSAmPSAweEZGRkZGRkZGID4+PiAoMzIgLSBudW1CaXRzKTsKKyAgICAgICAgaWYgKGJpdE9mZnNldCA9PSA4KSB7CisgICAgICAgICAgICBiaXRPZmZzZXQgPSAwOworICAgICAgICAgICAgYnl0ZU9mZnNldCsrOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5SZWFkVUVWKCkgeworICAgICAgICBpbnQgaW5pdGlhbEJ5dGVPZmZzZXQgPSBieXRlT2Zmc2V0OworICAgICAgICBpbnQgaW5pdGlhbEJpdE9mZnNldCA9IGJpdE9mZnNldDsKKyAgICAgICAgaW50IGxlYWRpbmdaZXJvcyA9IDA7CisgICAgICAgIHdoaWxlIChieXRlT2Zmc2V0IDwgYnl0ZUxpbWl0ICYmICFyZWFkQml0KCkpIHsKKyAgICAgICAgICAgIGxlYWRpbmdaZXJvcysrOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gaGl0TGltaXQgPSBieXRlT2Zmc2V0ID09IGJ5dGVMaW1pdDsKKyAgICAgICAgYnl0ZU9mZnNldCA9IGluaXRpYWxCeXRlT2Zmc2V0OworICAgICAgICBiaXRPZmZzZXQgPSBpbml0aWFsQml0T2Zmc2V0OworICAgICAgICByZXR1cm4gIWhpdExpbWl0ICYmIGNhblJlYWRCaXRzKGxlYWRpbmdaZXJvcyAqIDIgKyAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlYWRVRVYoKSB7CisgICAgICAgIGludCBsZWFkaW5nWmVyb3MgPSAwOworICAgICAgICB3aGlsZSAoIXJlYWRCaXQoKSkgeworICAgICAgICAgICAgbGVhZGluZ1plcm9zKys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgxIDw8IGxlYWRpbmdaZXJvcykgLSAxICsgKGxlYWRpbmdaZXJvcyA+IDAgPyByZWFkQml0cyhsZWFkaW5nWmVyb3MpIDogMCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY2FuUmVhZEJpdHMoaW50IG51bUJpdHMpIHsKKyAgICAgICAgaW50IG9sZEJ5dGVPZmZzZXQgPSBieXRlT2Zmc2V0OworICAgICAgICBpbnQgbnVtQnl0ZXMgPSBudW1CaXRzIC8gODsKKyAgICAgICAgaW50IG5ld0J5dGVPZmZzZXQgPSBieXRlT2Zmc2V0ICsgbnVtQnl0ZXM7CisgICAgICAgIGludCBuZXdCaXRPZmZzZXQgPSBiaXRPZmZzZXQgKyBudW1CaXRzIC0gKG51bUJ5dGVzICogOCk7CisgICAgICAgIGlmIChuZXdCaXRPZmZzZXQgPiA3KSB7CisgICAgICAgICAgICBuZXdCeXRlT2Zmc2V0Kys7CisgICAgICAgICAgICBuZXdCaXRPZmZzZXQgLT0gODsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gb2xkQnl0ZU9mZnNldCArIDE7IGkgPD0gbmV3Qnl0ZU9mZnNldCAmJiBuZXdCeXRlT2Zmc2V0IDwgYnl0ZUxpbWl0OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzaG91bGRTa2lwQnl0ZShpKSkgeworICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIGJ5dGUgYW5kIGNoZWNrIHRocmVlIGJ5dGVzIGFoZWFkLgorICAgICAgICAgICAgICAgIG5ld0J5dGVPZmZzZXQrKzsKKyAgICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ld0J5dGVPZmZzZXQgPCBieXRlTGltaXQgfHwgKG5ld0J5dGVPZmZzZXQgPT0gYnl0ZUxpbWl0ICYmIG5ld0JpdE9mZnNldCA9PSAwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkU2tpcEJ5dGUoaW50IG9mZnNldCkgeworICAgICAgICByZXR1cm4gKDIgPD0gb2Zmc2V0ICYmIG9mZnNldCA8IGJ5dGVMaW1pdCAmJiBkYXRhW29mZnNldF0gPT0gKGJ5dGUpIDB4MDMgJiYKKyAgICAgICAgICAgICAgICBkYXRhW29mZnNldCAtIDJdID09IChieXRlKSAweDAwICYmIGRhdGFbb2Zmc2V0IC0gMV0gPT0gKGJ5dGUpIDB4MDApOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvZHJhd2FibGUtdjI0L2ljX2xhdW5jaGVyX2ZvcmVncm91bmQueG1sIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvZHJhd2FibGUtdjI0L2ljX2xhdW5jaGVyX2ZvcmVncm91bmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMDY4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy9kcmF3YWJsZS12MjQvaWNfbGF1bmNoZXJfZm9yZWdyb3VuZC54bWwKQEAgLTAsMCArMSwzMCBAQAorPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6YWFwdD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYWFwdCIKKyAgICBhbmRyb2lkOndpZHRoPSIxMDhkcCIKKyAgICBhbmRyb2lkOmhlaWdodD0iMTA4ZHAiCisgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIxMDgiCisgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMTA4Ij4KKyAgICA8cGF0aCBhbmRyb2lkOnBhdGhEYXRhPSJNMzEsNjMuOTI4YzAsMCA2LjQsLTExIDEyLjEsLTEzLjFjNy4yLC0yLjYgMjYsLTEuNCAyNiwtMS40bDM4LjEsMzguMUwxMDcsMTA4LjkyOGwtMzIsLTFMMzEsNjMuOTI4eiI+CisgICAgICAgIDxhYXB0OmF0dHIgbmFtZT0iYW5kcm9pZDpmaWxsQ29sb3IiPgorICAgICAgICAgICAgPGdyYWRpZW50CisgICAgICAgICAgICAgICAgYW5kcm9pZDplbmRYPSI4NS44NDc1NyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmVuZFk9IjkyLjQ5NjMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzdGFydFg9IjQyLjk0OTIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzdGFydFk9IjQ5LjU5NzkzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dHlwZT0ibGluZWFyIj4KKyAgICAgICAgICAgICAgICA8aXRlbQorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbG9yPSIjNDQwMDAwMDAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b2Zmc2V0PSIwLjAiIC8+CisgICAgICAgICAgICAgICAgPGl0ZW0KKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9mZnNldD0iMS4wIiAvPgorICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgPC9hYXB0OmF0dHI+CisgICAgPC9wYXRoPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgorICAgICAgICBhbmRyb2lkOmZpbGxUeXBlPSJub25aZXJvIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNjUuMyw0NS44MjhsMy44LC02LjZjMC4yLC0wLjQgMC4xLC0wLjkgLTAuMywtMS4xYy0wLjQsLTAuMiAtMC45LC0wLjEgLTEuMSwwLjNsLTMuOSw2LjdjLTYuMywtMi44IC0xMy40LC0yLjggLTE5LjcsMGwtMy45LC02LjdjLTAuMiwtMC40IC0wLjcsLTAuNSAtMS4xLC0wLjNDMzguOCwzOC4zMjggMzguNywzOC44MjggMzguOSwzOS4yMjhsMy44LDYuNkMzNi4yLDQ5LjQyOCAzMS43LDU2LjAyOCAzMSw2My45MjhoNDZDNzYuMyw1Ni4wMjggNzEuOCw0OS40MjggNjUuMyw0NS44Mjh6TTQzLjQsNTcuMzI4Yy0wLjgsMCAtMS41LC0wLjUgLTEuOCwtMS4yYy0wLjMsLTAuNyAtMC4xLC0xLjUgMC40LC0yLjFjMC41LC0wLjUgMS40LC0wLjcgMi4xLC0wLjRjMC43LDAuMyAxLjIsMSAxLjIsMS44QzQ1LjMsNTYuNTI4IDQ0LjUsNTcuMzI4IDQzLjQsNTcuMzI4TDQzLjQsNTcuMzI4ek02NC42LDU3LjMyOGMtMC44LDAgLTEuNSwtMC41IC0xLjgsLTEuMnMtMC4xLC0xLjUgMC40LC0yLjFjMC41LC0wLjUgMS40LC0wLjcgMi4xLC0wLjRjMC43LDAuMyAxLjIsMSAxLjIsMS44QzY2LjUsNTYuNTI4IDY1LjYsNTcuMzI4IDY0LjYsNTcuMzI4TDY0LjYsNTcuMzI4eiIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMSIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzAwMDAwMDAwIiAvPgorPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvZHJhd2FibGUvaWNfbGF1bmNoZXJfYmFja2dyb3VuZC54bWwgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy9kcmF3YWJsZS9pY19sYXVuY2hlcl9iYWNrZ3JvdW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2Q1ZGE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvZHJhd2FibGUvaWNfbGF1bmNoZXJfYmFja2dyb3VuZC54bWwKQEAgLTAsMCArMSwxNzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOndpZHRoPSIxMDhkcCIKKyAgICBhbmRyb2lkOmhlaWdodD0iMTA4ZHAiCisgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIxMDgiCisgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMTA4Ij4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzNEREM4NCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAsMGgxMDh2MTA4aC0xMDh6IiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik05LDBMOSwxMDgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSwwTDE5LDEwOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMC44IgorICAgICAgICBhbmRyb2lkOnN0cm9rZUNvbG9yPSIjMzNGRkZGRkYiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTI5LDBMMjksMTA4IgorICAgICAgICBhbmRyb2lkOnN0cm9rZVdpZHRoPSIwLjgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlQ29sb3I9IiMzM0ZGRkZGRiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMzksMEwzOSwxMDgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik00OSwwTDQ5LDEwOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMC44IgorICAgICAgICBhbmRyb2lkOnN0cm9rZUNvbG9yPSIjMzNGRkZGRkYiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTU5LDBMNTksMTA4IgorICAgICAgICBhbmRyb2lkOnN0cm9rZVdpZHRoPSIwLjgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlQ29sb3I9IiMzM0ZGRkZGRiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNjksMEw2OSwxMDgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik03OSwwTDc5LDEwOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMC44IgorICAgICAgICBhbmRyb2lkOnN0cm9rZUNvbG9yPSIjMzNGRkZGRkYiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTg5LDBMODksMTA4IgorICAgICAgICBhbmRyb2lkOnN0cm9rZVdpZHRoPSIwLjgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlQ29sb3I9IiMzM0ZGRkZGRiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNOTksMEw5OSwxMDgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDlMMTA4LDkiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDE5TDEwOCwxOSIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMC44IgorICAgICAgICBhbmRyb2lkOnN0cm9rZUNvbG9yPSIjMzNGRkZGRkYiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAsMjlMMTA4LDI5IgorICAgICAgICBhbmRyb2lkOnN0cm9rZVdpZHRoPSIwLjgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlQ29sb3I9IiMzM0ZGRkZGRiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCwzOUwxMDgsMzkiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDQ5TDEwOCw0OSIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMC44IgorICAgICAgICBhbmRyb2lkOnN0cm9rZUNvbG9yPSIjMzNGRkZGRkYiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAsNTlMMTA4LDU5IgorICAgICAgICBhbmRyb2lkOnN0cm9rZVdpZHRoPSIwLjgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlQ29sb3I9IiMzM0ZGRkZGRiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCw2OUwxMDgsNjkiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDc5TDEwOCw3OSIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMC44IgorICAgICAgICBhbmRyb2lkOnN0cm9rZUNvbG9yPSIjMzNGRkZGRkYiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAsODlMMTA4LDg5IgorICAgICAgICBhbmRyb2lkOnN0cm9rZVdpZHRoPSIwLjgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlQ29sb3I9IiMzM0ZGRkZGRiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCw5OUwxMDgsOTkiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSwyOUw4OSwyOSIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMC44IgorICAgICAgICBhbmRyb2lkOnN0cm9rZUNvbG9yPSIjMzNGRkZGRkYiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LDM5TDg5LDM5IgorICAgICAgICBhbmRyb2lkOnN0cm9rZVdpZHRoPSIwLjgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlQ29sb3I9IiMzM0ZGRkZGRiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTksNDlMODksNDkiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSw1OUw4OSw1OSIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMC44IgorICAgICAgICBhbmRyb2lkOnN0cm9rZUNvbG9yPSIjMzNGRkZGRkYiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LDY5TDg5LDY5IgorICAgICAgICBhbmRyb2lkOnN0cm9rZVdpZHRoPSIwLjgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlQ29sb3I9IiMzM0ZGRkZGRiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTksNzlMODksNzkiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0yOSwxOUwyOSw4OSIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMC44IgorICAgICAgICBhbmRyb2lkOnN0cm9rZUNvbG9yPSIjMzNGRkZGRkYiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTM5LDE5TDM5LDg5IgorICAgICAgICBhbmRyb2lkOnN0cm9rZVdpZHRoPSIwLjgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlQ29sb3I9IiMzM0ZGRkZGRiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNDksMTlMNDksODkiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik01OSwxOUw1OSw4OSIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMC44IgorICAgICAgICBhbmRyb2lkOnN0cm9rZUNvbG9yPSIjMzNGRkZGRkYiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTY5LDE5TDY5LDg5IgorICAgICAgICBhbmRyb2lkOnN0cm9rZVdpZHRoPSIwLjgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlQ29sb3I9IiMzM0ZGRkZGRiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNzksMTlMNzksODkiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy9sYXlvdXQvYWN0aXZpdHlfbWFpbi54bWwgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy9sYXlvdXQvYWN0aXZpdHlfbWFpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3MDEyZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vcmVzL2xheW91dC9hY3Rpdml0eV9tYWluLnhtbApAQCAtMCwwICsxLDEzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxhbmRyb2lkeC5jb25zdHJhaW50bGF5b3V0LndpZGdldC5Db25zdHJhaW50TGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczphcHA9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMtYXV0byIKKyAgICB4bWxuczp0b29scz0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vdG9vbHMiCisgICAgYW5kcm9pZDppZD0iQCtpZC9jb250YWluZXIiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgdG9vbHM6Y29udGV4dD0iY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyLk1haW5BY3Rpdml0eSI+CisKKyAgICA8Y29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyLkF1dG9GaXRUZXh0dXJlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHR1cmUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzAwZHAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50U3RhcnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjE2ZHAiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhcHA6bGF5b3V0X2NvbnN0cmFpbnRCb3R0b21fdG9Ub3BPZj0iQCtpZC9jaGVja0JveF9tZWRpYV9yZWNvcmRlciIKKyAgICAgICAgYXBwOmxheW91dF9jb25zdHJhaW50U3RhcnRfdG9TdGFydE9mPSJwYXJlbnQiCisgICAgICAgIGFwcDpsYXlvdXRfY29uc3RyYWludFRvcF90b1RvcE9mPSJwYXJlbnQiIC8+CisKKyAgICA8Q2hlY2tCb3gKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jaGVja0JveF9tZWRpYV9yZWNvcmRlciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblN0YXJ0PSI5MGRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjEwZHAiCisgICAgICAgIGFuZHJvaWQ6Zm9udEZhbWlseT0ic2Fucy1zZXJpZi1tZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tZWRpYV9yZWNvcmRlciIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLkFwcENvbXBhdC5MYXJnZSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9Im5vcm1hbCIKKyAgICAgICAgYW5kcm9pZDpjaGVja2VkPSJ0cnVlIgorICAgICAgICBhcHA6bGF5b3V0X2NvbnN0cmFpbnRTdGFydF90b1N0YXJ0T2Y9InBhcmVudCIKKyAgICAgICAgYXBwOmxheW91dF9jb25zdHJhaW50VG9wX3RvQm90dG9tT2Y9IkAraWQvdGV4dHVyZSIvPgorCisgICAgPENoZWNrQm94CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2hlY2tCb3hfbWVkaWFfY29kZWMiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5TdGFydD0iOTBkcCIKKyAgICAgICAgYW5kcm9pZDpmb250RmFtaWx5PSJzYW5zLXNlcmlmLW1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21lZGlhX2NvZGVjIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuQXBwQ29tcGF0LkxhcmdlIgorICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0ibm9ybWFsIgorICAgICAgICBhcHA6bGF5b3V0X2NvbnN0cmFpbnRTdGFydF90b1N0YXJ0T2Y9InBhcmVudCIKKyAgICAgICAgYXBwOmxheW91dF9jb25zdHJhaW50VG9wX3RvQm90dG9tT2Y9IkAraWQvY2hlY2tCb3hfbWVkaWFfcmVjb3JkZXIiIC8+CisKKyAgICA8UmFkaW9Hcm91cAorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3JhZGlvX2dyb3VwX21pbWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5TdGFydD0iNDBkcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxMGRwIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgYXBwOmxheW91dF9jb25zdHJhaW50U3RhcnRfdG9TdGFydE9mPSJwYXJlbnQiCisgICAgICAgIGFwcDpsYXlvdXRfY29uc3RyYWludEJvdHRvbV90b1RvcE9mPSJAK2lkL2ZyYW1lTGF5b3V0MiIKKyAgICAgICAgYXBwOmxheW91dF9jb25zdHJhaW50VG9wX3RvQm90dG9tT2Y9IkAraWQvY2hlY2tCb3hfbWVkaWFfY29kZWMiPgorCisgICAgICAgIDxSYWRpb0J1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hdmMiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOmNoZWNrZWQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYXZjIiAvPgorCisgICAgICAgIDxSYWRpb0J1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9oZXZjIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2hldmMiIC8+CisgICAgPC9SYWRpb0dyb3VwPgorCisgICAgPFJhZGlvR3JvdXAKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9yYWRpb19ncm91cF9jb2RlYyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTBkcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luRW5kPSI0MGRwIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgYXBwOmxheW91dF9jb25zdHJhaW50RW5kX3RvRW5kT2Y9InBhcmVudCIKKyAgICAgICAgYXBwOmxheW91dF9jb25zdHJhaW50VG9wX3RvQm90dG9tT2Y9IkAraWQvY2hlY2tCb3hfbWVkaWFfY29kZWMiPgorCisgICAgICAgIDxSYWRpb0J1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9odyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6Y2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0iZmFsc2UiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvaGFyZHdhcmUiIC8+CisKKyAgICAgICAgPFJhZGlvQnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N3IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDplbmFibGVkPSJmYWxzZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zb2Z0d2FyZSIgLz4KKyAgICA8L1JhZGlvR3JvdXA+CisKKyAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9mcmFtZUxheW91dDIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3JhZGlvX2dyb3VwX21pbWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50U3RhcnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjEwZHAiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2NvbG9yUHJpbWFyeSIKKyAgICAgICAgYXBwOmxheW91dF9jb25zdHJhaW50VG9wX3RvQm90dG9tT2Y9IkAraWQvcmFkaW9fZ3JvdXBfbWltZSIKKyAgICAgICAgdG9vbHM6bGF5b3V0X2VkaXRvcl9hYnNvbHV0ZVg9IjgwZHAiPgorCisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhcnRfYnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwOGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zdGFydF9idXR0b24iCisgICAgICAgICAgICB0b29sczpsYXlvdXRfZWRpdG9yX2Fic29sdXRlWD0iMTU1ZHAiCisgICAgICAgICAgICB0b29sczpsYXlvdXRfZWRpdG9yX2Fic29sdXRlWT0iNDU1ZHAiIC8+CisKKyAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dFZpZXdSZXN1bHRzIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxMGRwIgorICAgICAgICBhbmRyb2lkOmZvbnRGYW1pbHk9InNhbnMtc2VyaWYtbWVkaXVtIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0ibm9ybWFsIgorICAgICAgICBhcHA6bGF5b3V0X2NvbnN0cmFpbnRTdGFydF90b1N0YXJ0T2Y9InBhcmVudCIKKyAgICAgICAgYXBwOmxheW91dF9jb25zdHJhaW50VG9wX3RvQm90dG9tT2YgPSAiQCtpZC9mcmFtZUxheW91dDIiIC8+CisKKzwvYW5kcm9pZHguY29uc3RyYWludGxheW91dC53aWRnZXQuQ29uc3RyYWludExheW91dD4KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vcmVzL21pcG1hcC1hbnlkcGktdjI2L2ljX2xhdW5jaGVyLnhtbCBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vcmVzL21pcG1hcC1hbnlkcGktdjI2L2ljX2xhdW5jaGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2E3MGNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvbWlwbWFwLWFueWRwaS12MjYvaWNfbGF1bmNoZXIueG1sCkBAIC0wLDAgKzEsNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxhZGFwdGl2ZS1pY29uIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGJhY2tncm91bmQgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2xhdW5jaGVyX2JhY2tncm91bmQiIC8+CisgICAgPGZvcmVncm91bmQgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2xhdW5jaGVyX2ZvcmVncm91bmQiIC8+Cis8L2FkYXB0aXZlLWljb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvbWlwbWFwLWFueWRwaS12MjYvaWNfbGF1bmNoZXJfcm91bmQueG1sIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvbWlwbWFwLWFueWRwaS12MjYvaWNfbGF1bmNoZXJfcm91bmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYTcwY2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy9taXBtYXAtYW55ZHBpLXYyNi9pY19sYXVuY2hlcl9yb3VuZC54bWwKQEAgLTAsMCArMSw1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPGFkYXB0aXZlLWljb24geG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8YmFja2dyb3VuZCBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbGF1bmNoZXJfYmFja2dyb3VuZCIgLz4KKyAgICA8Zm9yZWdyb3VuZCBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbGF1bmNoZXJfZm9yZWdyb3VuZCIgLz4KKzwvYWRhcHRpdmUtaWNvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy9yYXcvY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2gyNjUubXA0IGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvcmF3L2Nyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc19oMjY1Lm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjA0MDA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvcmF3L2Nyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc19oMjY1Lm1wNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy92YWx1ZXMvY29sb3JzLnhtbCBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vcmVzL3ZhbHVlcy9jb2xvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYWVjZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy92YWx1ZXMvY29sb3JzLnhtbApAQCAtMCwwICsxLDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cmVzb3VyY2VzPgorICAgIDxjb2xvciBuYW1lPSJjb2xvclByaW1hcnkiPiM2MjAwRUU8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJjb2xvclByaW1hcnlEYXJrIj4jMzcwMEIzPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iY29sb3JBY2NlbnQiPiMwM0RBQzU8L2NvbG9yPgorPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjVhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwxMyBAQAorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5TYW1wbGVWaWRlb0VuY29kZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lZGlhX3JlY29yZGVyIj5NZWRpYVJlY29yZGVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZWRpYV9jb2RlYyI+TWVkaWFDb2RlYzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic3RhcnRfYnV0dG9uIj5TdGFydDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic3RvcCI+U3RvcDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic3RhcnQiPlN0YXJ0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhdmMiPkFWQzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaGV2YyI+SEVWQzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaGFyZHdhcmUiPkgvVzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic29mdHdhcmUiPlMvVzwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbCBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHlsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYzkyOTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApAQCAtMCwwICsxLDEwIEBACis8cmVzb3VyY2VzPgorICAgIDwhLS0gQmFzZSBhcHBsaWNhdGlvbiB0aGVtZS4gLS0+CisgICAgPHN0eWxlIG5hbWU9IkFwcFRoZW1lIiBwYXJlbnQ9IlRoZW1lLkFwcENvbXBhdC5MaWdodC5EYXJrQWN0aW9uQmFyIj4KKyAgICAgICAgPCEtLSBDdXN0b21pemUgeW91ciB0aGVtZSBoZXJlLiAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iY29sb3JQcmltYXJ5Ij5AY29sb3IvY29sb3JQcmltYXJ5PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJjb2xvclByaW1hcnlEYXJrIj5AY29sb3IvY29sb3JQcmltYXJ5RGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iY29sb3JBY2NlbnQiPkBjb2xvci9jb2xvckFjY2VudDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCis8L3Jlc291cmNlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9idWlsZC5ncmFkbGUKc2ltaWxhcml0eSBpbmRleCA2NSUKcmVuYW1lIGZyb20gbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAKcmVuYW1lIHRvIG1lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9idWlsZC5ncmFkbGUKaW5kZXggNzE0YWE1Mi4uNGNhMGM3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAKKysrIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2J1aWxkLmdyYWRsZQpAQCAtMSw2ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTUsNiArMTQsMTkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJQS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCitidWlsZHNjcmlwdCB7CisgICAgcmVwb3NpdG9yaWVzIHsKKyAgICAgICAgZ29vZ2xlKCkKKyAgICAgICAgamNlbnRlcigpCisgICAgfQorICAgIGRlcGVuZGVuY2llcyB7CisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjQuMS4xJworICAgIH0KK30KIAorYWxscHJvamVjdHMgeworICAgIHJlcG9zaXRvcmllcyB7CisgICAgICAgIGdvb2dsZSgpCisgICAgICAgIGpjZW50ZXIoKQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvZ3JhZGxlLnByb3BlcnRpZXMgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvZ3JhZGxlLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFlNDQzYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9ncmFkbGUucHJvcGVydGllcwpAQCAtMCwwICsxLDQgQEAKKyMgUHJvamVjdC13aWRlIEdyYWRsZSBzZXR0aW5ncy4KK29yZy5ncmFkbGUuanZtYXJncz0tWG14MjA0OG0gLURmaWxlLmVuY29kaW5nPVVURi04CithbmRyb2lkLnVzZUFuZHJvaWRYPXRydWUKK2FuZHJvaWQuZW5hYmxlSmV0aWZpZXI9dHJ1ZQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphciBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZiOTYxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWExMmViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMKQEAgLTAsMCArMSw2IEBACisjV2VkIERlYyAxNiAxMDowNjo0NSBJU1QgMjAyMAorZGlzdHJpYnV0aW9uQmFzZT1HUkFETEVfVVNFUl9IT01FCitkaXN0cmlidXRpb25QYXRoPXdyYXBwZXIvZGlzdHMKK3ppcFN0b3JlQmFzZT1HUkFETEVfVVNFUl9IT01FCit6aXBTdG9yZVBhdGg9d3JhcHBlci9kaXN0cworZGlzdHJpYnV0aW9uVXJsPWh0dHBzXDovL3NlcnZpY2VzLmdyYWRsZS5vcmcvZGlzdHJpYnV0aW9ucy9ncmFkbGUtNi41LWJpbi56aXAKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9ncmFkbGV3IGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2dyYWRsZXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NjZGQzZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9ncmFkbGV3CkBAIC0wLDAgKzEsMTcyIEBACisjIS91c3IvYmluL2VudiBzaAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjCisjIyAgR3JhZGxlIHN0YXJ0IHVwIHNjcmlwdCBmb3IgVU4qWAorIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEF0dGVtcHQgdG8gc2V0IEFQUF9IT01FCisjIFJlc29sdmUgbGlua3M6ICQwIG1heSBiZSBhIGxpbmsKK1BSRz0iJDAiCisjIE5lZWQgdGhpcyBmb3IgcmVsYXRpdmUgc3ltbGlua3MuCit3aGlsZSBbIC1oICIkUFJHIiBdIDsgZG8KKyAgICBscz1gbHMgLWxkICIkUFJHImAKKyAgICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgICAgaWYgZXhwciAiJGxpbmsiIDogJy8uKicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgUFJHPSIkbGluayIKKyAgICBlbHNlCisgICAgICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgIi8kbGluayIKKyAgICBmaQorZG9uZQorU0FWRUQ9ImBwd2RgIgorY2QgImBkaXJuYW1lIFwiJFBSR1wiYC8iID4vZGV2L251bGwKK0FQUF9IT01FPSJgcHdkIC1QYCIKK2NkICIkU0FWRUQiID4vZGV2L251bGwKKworQVBQX05BTUU9IkdyYWRsZSIKK0FQUF9CQVNFX05BTUU9YGJhc2VuYW1lICIkMCJgCisKKyMgQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuCitERUZBVUxUX0pWTV9PUFRTPSIiCisKKyMgVXNlIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSwgb3Igc2V0IE1BWF9GRCAhPSAtMSB0byB1c2UgdGhhdCB2YWx1ZS4KK01BWF9GRD0ibWF4aW11bSIKKword2FybiAoKSB7CisgICAgZWNobyAiJCoiCit9CisKK2RpZSAoKSB7CisgICAgZWNobworICAgIGVjaG8gIiQqIgorICAgIGVjaG8KKyAgICBleGl0IDEKK30KKworIyBPUyBzcGVjaWZpYyBzdXBwb3J0IChtdXN0IGJlICd0cnVlJyBvciAnZmFsc2UnKS4KK2N5Z3dpbj1mYWxzZQorbXN5cz1mYWxzZQorZGFyd2luPWZhbHNlCitub25zdG9wPWZhbHNlCitjYXNlICJgdW5hbWVgIiBpbgorICBDWUdXSU4qICkKKyAgICBjeWd3aW49dHJ1ZQorICAgIDs7CisgIERhcndpbiogKQorICAgIGRhcndpbj10cnVlCisgICAgOzsKKyAgTUlOR1cqICkKKyAgICBtc3lzPXRydWUKKyAgICA7OworICBOT05TVE9QKiApCisgICAgbm9uc3RvcD10cnVlCisgICAgOzsKK2VzYWMKKworQ0xBU1NQQVRIPSRBUFBfSE9NRS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKKworIyBEZXRlcm1pbmUgdGhlIEphdmEgY29tbWFuZCB0byB1c2UgdG8gc3RhcnQgdGhlIEpWTS4KK2lmIFsgLW4gIiRKQVZBX0hPTUUiIF0gOyB0aGVuCisgICAgaWYgWyAteCAiJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIgXSA7IHRoZW4KKyAgICAgICAgIyBJQk0ncyBKREsgb24gQUlYIHVzZXMgc3RyYW5nZSBsb2NhdGlvbnMgZm9yIHRoZSBleGVjdXRhYmxlcworICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIgorICAgIGVsc2UKKyAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9iaW4vamF2YSIKKyAgICBmaQorICAgIGlmIFsgISAteCAiJEpBVkFDTUQiIF0gOyB0aGVuCisgICAgICAgIGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICRKQVZBX0hPTUUKKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKKyAgICBmaQorZWxzZQorICAgIEpBVkFDTUQ9ImphdmEiCisgICAgd2hpY2ggamF2YSA+L2Rldi9udWxsIDI+JjEgfHwgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4KKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKK2ZpCisKKyMgSW5jcmVhc2UgdGhlIG1heGltdW0gZmlsZSBkZXNjcmlwdG9ycyBpZiB3ZSBjYW4uCitpZiBbICIkY3lnd2luIiA9ICJmYWxzZSIgLWEgIiRkYXJ3aW4iID0gImZhbHNlIiAtYSAiJG5vbnN0b3AiID0gImZhbHNlIiBdIDsgdGhlbgorICAgIE1BWF9GRF9MSU1JVD1gdWxpbWl0IC1IIC1uYAorICAgIGlmIFsgJD8gLWVxIDAgXSA7IHRoZW4KKyAgICAgICAgaWYgWyAiJE1BWF9GRCIgPSAibWF4aW11bSIgLW8gIiRNQVhfRkQiID0gIm1heCIgXSA7IHRoZW4KKyAgICAgICAgICAgIE1BWF9GRD0iJE1BWF9GRF9MSU1JVCIKKyAgICAgICAgZmkKKyAgICAgICAgdWxpbWl0IC1uICRNQVhfRkQKKyAgICAgICAgaWYgWyAkPyAtbmUgMCBdIDsgdGhlbgorICAgICAgICAgICAgd2FybiAiQ291bGQgbm90IHNldCBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRCIKKyAgICAgICAgZmkKKyAgICBlbHNlCisgICAgICAgIHdhcm4gIkNvdWxkIG5vdCBxdWVyeSBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRF9MSU1JVCIKKyAgICBmaQorZmkKKworIyBGb3IgRGFyd2luLCBhZGQgb3B0aW9ucyB0byBzcGVjaWZ5IGhvdyB0aGUgYXBwbGljYXRpb24gYXBwZWFycyBpbiB0aGUgZG9jaworaWYgJGRhcndpbjsgdGhlbgorICAgIEdSQURMRV9PUFRTPSIkR1JBRExFX09QVFMgXCItWGRvY2s6bmFtZT0kQVBQX05BTUVcIiBcIi1YZG9jazppY29uPSRBUFBfSE9NRS9tZWRpYS9ncmFkbGUuaWNuc1wiIgorZmkKKworIyBGb3IgQ3lnd2luLCBzd2l0Y2ggcGF0aHMgdG8gV2luZG93cyBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQoraWYgJGN5Z3dpbiA7IHRoZW4KKyAgICBBUFBfSE9NRT1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJEFQUF9IT01FImAKKyAgICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRDTEFTU1BBVEgiYAorICAgIEpBVkFDTUQ9YGN5Z3BhdGggLS11bml4ICIkSkFWQUNNRCJgCisKKyAgICAjIFdlIGJ1aWxkIHRoZSBwYXR0ZXJuIGZvciBhcmd1bWVudHMgdG8gYmUgY29udmVydGVkIHZpYSBjeWdwYXRoCisgICAgUk9PVERJUlNSQVc9YGZpbmQgLUwgLyAtbWF4ZGVwdGggMSAtbWluZGVwdGggMSAtdHlwZSBkIDI+L2Rldi9udWxsYAorICAgIFNFUD0iIgorICAgIGZvciBkaXIgaW4gJFJPT1RESVJTUkFXIDsgZG8KKyAgICAgICAgUk9PVERJUlM9IiRST09URElSUyRTRVAkZGlyIgorICAgICAgICBTRVA9InwiCisgICAgZG9uZQorICAgIE9VUkNZR1BBVFRFUk49IiheKCRST09URElSUykpIgorICAgICMgQWRkIGEgdXNlci1kZWZpbmVkIHBhdHRlcm4gdG8gdGhlIGN5Z3BhdGggYXJndW1lbnRzCisgICAgaWYgWyAiJEdSQURMRV9DWUdQQVRURVJOIiAhPSAiIiBdIDsgdGhlbgorICAgICAgICBPVVJDWUdQQVRURVJOPSIkT1VSQ1lHUEFUVEVSTnwoJEdSQURMRV9DWUdQQVRURVJOKSIKKyAgICBmaQorICAgICMgTm93IGNvbnZlcnQgdGhlIGFyZ3VtZW50cyAtIGtsdWRnZSB0byBsaW1pdCBvdXJzZWx2ZXMgdG8gL2Jpbi9zaAorICAgIGk9MAorICAgIGZvciBhcmcgaW4gIiRAIiA7IGRvCisgICAgICAgIENIRUNLPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiJE9VUkNZR1BBVFRFUk4iIC1gCisgICAgICAgIENIRUNLMj1gZWNobyAiJGFyZyJ8ZWdyZXAgLWMgIl4tImAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMgRGV0ZXJtaW5lIGlmIGFuIG9wdGlvbgorCisgICAgICAgIGlmIFsgJENIRUNLIC1uZSAwIF0gJiYgWyAkQ0hFQ0syIC1lcSAwIF0gOyB0aGVuICAgICAgICAgICAgICAgICAgICAjIyMgQWRkZWQgYSBjb25kaXRpb24KKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD1gY3lncGF0aCAtLXBhdGggLS1pZ25vcmUgLS1taXhlZCAiJGFyZyJgCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD0iXCIkYXJnXCIiCisgICAgICAgIGZpCisgICAgICAgIGk9JCgoaSsxKSkKKyAgICBkb25lCisgICAgY2FzZSAkaSBpbgorICAgICAgICAoMCkgc2V0IC0tIDs7CisgICAgICAgICgxKSBzZXQgLS0gIiRhcmdzMCIgOzsKKyAgICAgICAgKDIpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiA7OworICAgICAgICAoMykgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiIDs7CisgICAgICAgICg0KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgOzsKKyAgICAgICAgKDUpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiA7OworICAgICAgICAoNikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiIDs7CisgICAgICAgICg3KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgOzsKKyAgICAgICAgKDgpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiA7OworICAgICAgICAoOSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciICIkYXJnczgiIDs7CisgICAgZXNhYworZmkKKworIyBFc2NhcGUgYXBwbGljYXRpb24gYXJncworc2F2ZSAoKSB7CisgICAgZm9yIGkgZG8gcHJpbnRmICVzXFxuICIkaSIgfCBzZWQgInMvJy8nXFxcXCcnL2c7MXMvXi8nLztcJHMvXCQvJyBcXFxcLyIgOyBkb25lCisgICAgZWNobyAiICIKK30KK0FQUF9BUkdTPSQoc2F2ZSAiJEAiKQorCisjIENvbGxlY3QgYWxsIGFyZ3VtZW50cyBmb3IgdGhlIGphdmEgY29tbWFuZCwgZm9sbG93aW5nIHRoZSBzaGVsbCBxdW90aW5nIGFuZCBzdWJzdGl0dXRpb24gcnVsZXMKK2V2YWwgc2V0IC0tICRERUZBVUxUX0pWTV9PUFRTICRKQVZBX09QVFMgJEdSQURMRV9PUFRTICJcIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSRBUFBfQkFTRV9OQU1FXCIiIC1jbGFzc3BhdGggIlwiJENMQVNTUEFUSFwiIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gIiRBUFBfQVJHUyIKKworIyBieSBkZWZhdWx0IHdlIHNob3VsZCBiZSBpbiB0aGUgY29ycmVjdCBwcm9qZWN0IGRpciwgYnV0IHdoZW4gcnVuIGZyb20gRmluZGVyIG9uIE1hYywgdGhlIGN3ZCBpcyB3cm9uZworaWYgWyAiJCh1bmFtZSkiID0gIkRhcndpbiIgXSAmJiBbICIkSE9NRSIgPSAiJFBXRCIgXTsgdGhlbgorICBjZCAiJChkaXJuYW1lICIkMCIpIgorZmkKKworZXhlYyAiJEpBVkFDTUQiICIkQCIKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9ncmFkbGV3LmJhdCBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9ncmFkbGV3LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTU1MzE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2dyYWRsZXcuYmF0CkBAIC0wLDAgKzEsODQgQEAKK0BpZiAiJURFQlVHJSIgPT0gIiIgQGVjaG8gb2ZmCitAcmVtICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitAcmVtCitAcmVtICBHcmFkbGUgc3RhcnR1cCBzY3JpcHQgZm9yIFdpbmRvd3MKK0ByZW0KK0ByZW0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQHJlbSBTZXQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBzZXRsb2NhbAorCitzZXQgRElSTkFNRT0lfmRwMAoraWYgIiVESVJOQU1FJSIgPT0gIiIgc2V0IERJUk5BTUU9Lgorc2V0IEFQUF9CQVNFX05BTUU9JX5uMAorc2V0IEFQUF9IT01FPSVESVJOQU1FJQorCitAcmVtIEFkZCBkZWZhdWx0IEpWTSBvcHRpb25zIGhlcmUuIFlvdSBjYW4gYWxzbyB1c2UgSkFWQV9PUFRTIGFuZCBHUkFETEVfT1BUUyB0byBwYXNzIEpWTSBvcHRpb25zIHRvIHRoaXMgc2NyaXB0Lgorc2V0IERFRkFVTFRfSlZNX09QVFM9CisKK0ByZW0gRmluZCBqYXZhLmV4ZQoraWYgZGVmaW5lZCBKQVZBX0hPTUUgZ290byBmaW5kSmF2YUZyb21KYXZhSG9tZQorCitzZXQgSkFWQV9FWEU9amF2YS5leGUKKyVKQVZBX0VYRSUgLXZlcnNpb24gPk5VTCAyPiYxCitpZiAiJUVSUk9STEVWRUwlIiA9PSAiMCIgZ290byBpbml0CisKK2VjaG8uCitlY2hvIEVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILgorZWNoby4KK2VjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitlY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uCisKK2dvdG8gZmFpbAorCis6ZmluZEphdmFGcm9tSmF2YUhvbWUKK3NldCBKQVZBX0hPTUU9JUpBVkFfSE9NRToiPSUKK3NldCBKQVZBX0VYRT0lSkFWQV9IT01FJS9iaW4vamF2YS5leGUKKworaWYgZXhpc3QgIiVKQVZBX0VYRSUiIGdvdG8gaW5pdAorCitlY2hvLgorZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIHNldCB0byBhbiBpbnZhbGlkIGRpcmVjdG9yeTogJUpBVkFfSE9NRSUKK2VjaG8uCitlY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQorZWNobyBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLgorCitnb3RvIGZhaWwKKworOmluaXQKK0ByZW0gR2V0IGNvbW1hbmQtbGluZSBhcmd1bWVudHMsIGhhbmRsaW5nIFdpbmRvd3MgdmFyaWFudHMKKworaWYgbm90ICIlT1MlIiA9PSAiV2luZG93c19OVCIgZ290byB3aW45eE1FX2FyZ3MKKworOndpbjl4TUVfYXJncworQHJlbSBTbHVycCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KK3NldCBDTURfTElORV9BUkdTPQorc2V0IF9TS0lQPTIKKworOndpbjl4TUVfYXJnc19zbHVycAoraWYgInglfjEiID09ICJ4IiBnb3RvIGV4ZWN1dGUKKworc2V0IENNRF9MSU5FX0FSR1M9JSoKKworOmV4ZWN1dGUKK0ByZW0gU2V0dXAgdGhlIGNvbW1hbmQgbGluZQorCitzZXQgQ0xBU1NQQVRIPSVBUFBfSE9NRSVcZ3JhZGxlXHdyYXBwZXJcZ3JhZGxlLXdyYXBwZXIuamFyCisKK0ByZW0gRXhlY3V0ZSBHcmFkbGUKKyIlSkFWQV9FWEUlIiAlREVGQVVMVF9KVk1fT1BUUyUgJUpBVkFfT1BUUyUgJUdSQURMRV9PUFRTJSAiLURvcmcuZ3JhZGxlLmFwcG5hbWU9JUFQUF9CQVNFX05BTUUlIiAtY2xhc3NwYXRoICIlQ0xBU1NQQVRIJSIgb3JnLmdyYWRsZS53cmFwcGVyLkdyYWRsZVdyYXBwZXJNYWluICVDTURfTElORV9BUkdTJQorCis6ZW5kCitAcmVtIEVuZCBsb2NhbCBzY29wZSBmb3IgdGhlIHZhcmlhYmxlcyB3aXRoIHdpbmRvd3MgTlQgc2hlbGwKK2lmICIlRVJST1JMRVZFTCUiPT0iMCIgZ290byBtYWluRW5kCisKKzpmYWlsCityZW0gU2V0IHZhcmlhYmxlIEdSQURMRV9FWElUX0NPTlNPTEUgaWYgeW91IG5lZWQgdGhlIF9zY3JpcHRfIHJldHVybiBjb2RlIGluc3RlYWQgb2YKK3JlbSB0aGUgX2NtZC5leGUgL2NfIHJldHVybiBjb2RlIQoraWYgIG5vdCAiIiA9PSAiJUdSQURMRV9FWElUX0NPTlNPTEUlIiBleGl0IDEKK2V4aXQgL2IgMQorCis6bWFpbkVuZAoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgZW5kbG9jYWwKKworOm9tZWdhCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvc2V0dGluZ3MuZ3JhZGxlIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL3NldHRpbmdzLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDNjM2E1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL3NldHRpbmdzLmdyYWRsZQpAQCAtMCwwICsxLDIgQEAKK2luY2x1ZGUgJzphcHAnCityb290UHJvamVjdC5uYW1lID0gIlNhbXBsZVZpZGVvRW5jb2RlciIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvQW5kcm9pZC5icCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9BbmRyb2lkLmJwCmluZGV4IGRlNDA4ZGQuLjg1MDNhOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9BbmRyb2lkLmJwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBzdWJkaXJzID0gWwogICAgICJzcmMiLAogICAgICJ0ZXN0cyIsCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L0FuZHJvaWQuYnAKaW5kZXggZDgwZDlhNS4uMmUwNmRhNSAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3QvQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogYW5kcm9pZF90ZXN0IHsKICAgICBuYW1lOiAiTWVkaWFCZW5jaG1hcmtUZXN0IiwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvYW5kcm9pZFRlc3QvamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvdGVzdHMvRW5jb2RlclRlc3QuamF2YSBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL2FuZHJvaWRUZXN0L2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL3Rlc3RzL0VuY29kZXJUZXN0LmphdmEKaW5kZXggNDhlMTQyMi4uNDIwMjczMiAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvYW5kcm9pZFRlc3QvamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvdGVzdHMvRW5jb2RlclRlc3QuamF2YQorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9hbmRyb2lkVGVzdC9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay90ZXN0cy9FbmNvZGVyVGVzdC5qYXZhCkBAIC0zNCw2ICszNCw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLmxpYnJhcnkuTmF0aXZlOwogaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay5saWJyYXJ5LlN0YXRzOwogCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKQEAgLTU3LDQwICs1OCw4NyBAQAogcHVibGljIGNsYXNzIEVuY29kZXJUZXN0IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb250ZXh0IG1Db250ZXh0ID0KICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbUZpbGVEaXJQYXRoID0gbUNvbnRleHQuZ2V0RmlsZXNEaXIoKSArICIvIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbUlucHV0RmlsZVBhdGggPSBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuaW5wdXRfZmlsZV9wYXRoKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbU91dHB1dEZpbGVQYXRoID0gbUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLm91dHB1dF9maWxlX3BhdGgpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtU3RhdHNGaWxlID0KICAgICAgICAgICAgIG1Db250ZXh0LmdldEV4dGVybmFsRmlsZXNEaXIobnVsbCkgKyAiL0VuY29kZXIuIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIi5jc3YiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRW5jb2RlclRlc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUEVSX1RFU1RfVElNRU9VVF9NUyA9IDEyMDAwMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBXUklURV9PVVRQVVQgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFBFUl9URVNUX1RJTUVPVVRfTVMgPSAxMjAwMDA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOQ09ERV9ERUZBVUxUX0ZSQU1FX1JBVEUgPSAyNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RFX0RFRkFVTFRfQklUX1JBVEUgPSA4MDAwMDAwIC8qIDggTWJwcyAqLzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RFX01JTl9CSVRfUkFURSA9IDYwMDAwMCAvKiA2MDAgS2JwcyAqLzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RFX0RFRkFVTFRfVklERU9fQklUX1JBVEUgPSA4MDAwMDAwIC8qIDggTWJwcyAqLzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RFX01JTl9WSURFT19CSVRfUkFURSA9IDYwMDAwMCAvKiA2MDAgS2JwcyAqLzsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RFX0RFRkFVTFRfQVVESU9fQklUX1JBVEUgPSAxMjgwMDAgLyogMTI4IEticHMgKi87CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1Db2xvckZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOworICAgIHByaXZhdGUgc3RhdGljIEZpbGUgbURlY29kZWRGaWxlUWNpZjsKKyAgICBwcml2YXRlIHN0YXRpYyBGaWxlIG1EZWNvZGVkRmlsZUZ1bGxIZDsKKyAgICBwcml2YXRlIHN0YXRpYyBGaWxlIG1EZWNvZGVkRmlsZUF1ZGlvOwogICAgIHByaXZhdGUgU3RyaW5nIG1JbnB1dEZpbGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgbU1pbWU7CisgICAgcHJpdmF0ZSBpbnQgbUJpdFJhdGU7CisgICAgcHJpdmF0ZSBpbnQgbUlGcmFtZUludGVydmFsOworICAgIHByaXZhdGUgaW50IG1XaWR0aDsKKyAgICBwcml2YXRlIGludCBtSGVpZ2h0OworICAgIHByaXZhdGUgaW50IG1Qcm9maWxlOworICAgIHByaXZhdGUgaW50IG1MZXZlbDsKKyAgICBwcml2YXRlIGludCBtU2FtcGxlUmF0ZTsKKyAgICBwcml2YXRlIGludCBtTnVtQ2hhbm5lbDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDT0RFX0ZVTExIRF9JTlBVVCA9ICJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfaDI2NS5ta3YiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUNPREVfUUNJRl9JTlBVVCA9ICJjcm93ZF8xNzZ4MTQ0XzI1ZnBzXzYwMDBrYnBzX21wZWc0Lm1wNCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ09ERV9BVURJT19JTlBVVCA9ICJiYmJfNDgwMDBoel8yY2hfMTAwa2Jwc19vcHVzXzMwc2VjLndlYm0iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUNPREVfRlVMTEhEX1VOUEFDS0VEID0gImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc19oMjY1Lnl1diI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ09ERV9RQ0lGX1VOUEFDS0VEID0gImNyb3dkXzE3NngxNDRfMjVmcHNfNjAwMGticHNfbXBlZzQueXV2IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDT0RFX0FVRElPX1VOUEFDS0VEID0gImJiYl80ODAwMGh6XzJjaF8xMDBrYnBzX29wdXNfMzBzZWMucmF3IjsKIAogICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKICAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IGlucHV0RmlsZXMoKSB7CiAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdewogICAgICAgICAgICAgICAgIC8vIEF1ZGlvIFRlc3QKLSAgICAgICAgICAgICAgICB7ImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX2FhY18zMHNlYy5tcDQifSwKLSAgICAgICAgICAgICAgICB7ImJiYl84MDAwaHpfMWNoXzhrYnBzX2Ftcm5iXzMwc2VjLjNncCJ9LAotICAgICAgICAgICAgICAgIHsiYmJiXzE2MDAwaHpfMWNoXzlrYnBzX2FtcndiXzMwc2VjLjNncCJ9LAotICAgICAgICAgICAgICAgIHsiYmJiXzQ0MTAwaHpfMmNoXzYwMGticHNfZmxhY18zMHNlYy5tcDQifSwKLSAgICAgICAgICAgICAgICB7ImJiYl80ODAwMGh6XzJjaF8xMDBrYnBzX29wdXNfMzBzZWMud2VibSJ9LAorICAgICAgICAgICAgICAgIC8vIFBhcmFtZXRlcnM6IEZpbGVuYW1lLCBtaW1lVHlwZSwgYml0cmF0ZSwgd2lkdGgsIGhlaWdodCwgaUZyYW1lSW50ZXJ2YWwsCisgICAgICAgICAgICAgICAgLy8gcHJvZmlsZSwgbGV2ZWwsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgIHtERUNPREVfQVVESU9fVU5QQUNLRUQsIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX0FVRElPX0FBQywKKyAgICAgICAgICAgICAgICAgICAgICAgIEVOQ09ERV9ERUZBVUxUX0FVRElPX0JJVF9SQVRFLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDQ0MTAwLCAyfSwKKyAgICAgICAgICAgICAgICB7REVDT0RFX0FVRElPX1VOUEFDS0VELCBNZWRpYUZvcm1hdC5NSU1FVFlQRV9BVURJT19BTVJfTkIsCisgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVfREVGQVVMVF9BVURJT19CSVRfUkFURSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA4MDAwLCAxfSwKKyAgICAgICAgICAgICAgICB7REVDT0RFX0FVRElPX1VOUEFDS0VELCBNZWRpYUZvcm1hdC5NSU1FVFlQRV9BVURJT19BTVJfV0IsCisgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVfREVGQVVMVF9BVURJT19CSVRfUkFURSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxNjAwMCwgMX0sCisgICAgICAgICAgICAgICAge0RFQ09ERV9BVURJT19VTlBBQ0tFRCwgTWVkaWFGb3JtYXQuTUlNRVRZUEVfQVVESU9fRkxBQywKKyAgICAgICAgICAgICAgICAgICAgICAgIEVOQ09ERV9ERUZBVUxUX0FVRElPX0JJVF9SQVRFLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDQ0MTAwLCAyfSwKKyAgICAgICAgICAgICAgICB7REVDT0RFX0FVRElPX1VOUEFDS0VELCBNZWRpYUZvcm1hdC5NSU1FVFlQRV9BVURJT19PUFVTLAorICAgICAgICAgICAgICAgICAgICAgICAgRU5DT0RFX0RFRkFVTFRfQVVESU9fQklUX1JBVEUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNDgwMDAsIDJ9LAorCiAgICAgICAgICAgICAgICAgLy8gVmlkZW8gVGVzdAotICAgICAgICAgICAgICAgIHsiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX3ZwOC53ZWJtIn0sCi0gICAgICAgICAgICAgICAgeyJjcm93ZF8xOTIweDEwODBfMjVmcHNfNjcwMGticHNfaDI2NC50cyJ9LAotICAgICAgICAgICAgICAgIHsiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2gyNjUubWt2In0sCi0gICAgICAgICAgICAgICAgeyJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfdnA5LndlYm0ifSwKLSAgICAgICAgICAgICAgICB7ImNyb3dkXzE3NngxNDRfMjVmcHNfNjAwMGticHNfbXBlZzQubXA0In0sCi0gICAgICAgICAgICAgICAgeyJjcm93ZF8xNzZ4MTQ0XzI1ZnBzXzYwMDBrYnBzX2gyNjMuM2dwIn19KTsKKyAgICAgICAgICAgICAgICAvLyBQYXJhbWV0ZXJzOiBGaWxlbmFtZSwgbWltZVR5cGUsIGJpdHJhdGUsIHdpZHRoLCBoZWlnaHQsIGlGcmFtZUludGVydmFsLAorICAgICAgICAgICAgICAgIC8vIHByb2ZpbGUsIGxldmVsLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICB7REVDT0RFX0ZVTExIRF9VTlBBQ0tFRCwgTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fVlA4LAorICAgICAgICAgICAgICAgICAgICAgICAgRU5DT0RFX0RFRkFVTFRfVklERU9fQklUX1JBVEUsIDE5MjAsIDEwODAsIDEsIC0xLCAtMSwgLTEsIC0xfSwKKyAgICAgICAgICAgICAgICB7REVDT0RFX0ZVTExIRF9VTlBBQ0tFRCwgTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fQVZDLAorICAgICAgICAgICAgICAgICAgICAgICAgRU5DT0RFX0RFRkFVTFRfVklERU9fQklUX1JBVEUsIDE5MjAsIDEwODAsIDEsIC0xLCAtMSwgLTEsIC0xfSwKKyAgICAgICAgICAgICAgICB7REVDT0RFX0ZVTExIRF9VTlBBQ0tFRCwgTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fSEVWQywKKyAgICAgICAgICAgICAgICAgICAgICAgIEVOQ09ERV9ERUZBVUxUX1ZJREVPX0JJVF9SQVRFLCAxOTIwLCAxMDgwLCAxLCAtMSwgLTEsIC0xLCAtMX0sCisgICAgICAgICAgICAgICAge0RFQ09ERV9GVUxMSERfVU5QQUNLRUQsIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX1ZQOSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVOQ09ERV9ERUZBVUxUX1ZJREVPX0JJVF9SQVRFLCAxOTIwLCAxMDgwLCAxLCAtMSwgLTEsIC0xLCAtMX0sCisgICAgICAgICAgICAgICAge0RFQ09ERV9RQ0lGX1VOUEFDS0VELCBNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19NUEVHNCwgRU5DT0RFX01JTl9WSURFT19CSVRfUkFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE3NiwgMTQ0LCAxLCAtMSwgLTEsIC0xLCAtMX0sCisgICAgICAgICAgICAgICAge0RFQ09ERV9RQ0lGX1VOUEFDS0VELCBNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19IMjYzLCBFTkNPREVfTUlOX1ZJREVPX0JJVF9SQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgMTc2LCAxNDQsIDEsIC0xLCAtMSwgLTEsIC0xfX0pOwogICAgIH0KIAotICAgIHB1YmxpYyBFbmNvZGVyVGVzdChTdHJpbmcgaW5wdXRGaWxlTmFtZSkgewotICAgICAgICB0aGlzLm1JbnB1dEZpbGUgPSBpbnB1dEZpbGVOYW1lOworICAgIHB1YmxpYyBFbmNvZGVyVGVzdChTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBtaW1lLCBpbnQgYml0cmF0ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVJbnRlcnZhbCwgaW50IHByb2ZpbGUsIGludCBsZXZlbCwgaW50IHNhbXBsZXJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgdGhpcy5tSW5wdXRGaWxlID0gZmlsZW5hbWU7CisgICAgICAgIHRoaXMubU1pbWUgPSBtaW1lOworICAgICAgICB0aGlzLm1CaXRSYXRlID0gYml0cmF0ZTsKKyAgICAgICAgdGhpcy5tSUZyYW1lSW50ZXJ2YWwgPSBmcmFtZUludGVydmFsOworICAgICAgICB0aGlzLm1XaWR0aCA9IHdpZHRoOworICAgICAgICB0aGlzLm1IZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIHRoaXMubVByb2ZpbGUgPSBwcm9maWxlOworICAgICAgICB0aGlzLm1MZXZlbCA9IGxldmVsOworICAgICAgICB0aGlzLm1TYW1wbGVSYXRlID0gc2FtcGxlcmF0ZTsKKyAgICAgICAgdGhpcy5tTnVtQ2hhbm5lbCA9IGNoYW5uZWxDb3VudDsKICAgICB9CiAKICAgICBAQmVmb3JlQ2xhc3MKQEAgLTEwMSwzMyArMTQ5LDM2IEBACiAgICAgICAgIExvZy5kKFRBRywgIlNhdmluZyBCZW5jaG1hcmsgcmVzdWx0cyBpbjogIiArIG1TdGF0c0ZpbGUpOwogICAgIH0KIAotICAgIEBUZXN0KHRpbWVvdXQgPSBQRVJfVEVTVF9USU1FT1VUX01TKQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBzdGF0dXM7Ci0gICAgICAgIGludCBmcmFtZVNpemU7Ci0gICAgICAgIC8vUGFyYW1ldGVycyBmb3IgdmlkZW8KLSAgICAgICAgaW50IHdpZHRoID0gMDsKLSAgICAgICAgaW50IGhlaWdodCA9IDA7Ci0gICAgICAgIGludCBwcm9maWxlID0gMDsKLSAgICAgICAgaW50IGxldmVsID0gMDsKLSAgICAgICAgaW50IGZyYW1lUmF0ZSA9IDA7CisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHByZXBhcmVJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKLSAgICAgICAgLy9QYXJhbWV0ZXJzIGZvciBhdWRpbwotICAgICAgICBpbnQgYml0UmF0ZSA9IDA7Ci0gICAgICAgIGludCBzYW1wbGVSYXRlID0gMDsKLSAgICAgICAgaW50IG51bUNoYW5uZWxzID0gMDsKLSAgICAgICAgRmlsZSBpbnB1dEZpbGUgPSBuZXcgRmlsZShtSW5wdXRGaWxlUGF0aCArIG1JbnB1dEZpbGUpOwotICAgICAgICBhc3NlcnRUcnVlKCJDYW5ub3QgZmluZCAiICsgbUlucHV0RmlsZSArICIgaW4gZGlyZWN0b3J5ICIgKyBtSW5wdXRGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICBpbnB1dEZpbGUuZXhpc3RzKCkpOworICAgICAgICBtRGVjb2RlZEZpbGVGdWxsSGQgPSBuZXcgRmlsZShtRmlsZURpclBhdGggKyBERUNPREVfRlVMTEhEX1VOUEFDS0VEKTsKKyAgICAgICAgaW50IHN0YXR1cyA9IGRlY29kZUZpbGUobUlucHV0RmlsZVBhdGggKyBERUNPREVfRlVMTEhEX0lOUFVULCBtRGVjb2RlZEZpbGVGdWxsSGQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRlY29kZXIgcmV0dXJuZWQgZXJyb3IgIiArIHN0YXR1cywgMCwgc3RhdHVzKTsKKworICAgICAgICBtRGVjb2RlZEZpbGVRY2lmID0gbmV3IEZpbGUobUZpbGVEaXJQYXRoICsgREVDT0RFX1FDSUZfVU5QQUNLRUQpOworICAgICAgICBzdGF0dXMgPSBkZWNvZGVGaWxlKG1JbnB1dEZpbGVQYXRoICsgREVDT0RFX1FDSUZfSU5QVVQsIG1EZWNvZGVkRmlsZVFjaWYpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRlY29kZXIgcmV0dXJuZWQgZXJyb3IgIiArIHN0YXR1cywgMCwgc3RhdHVzKTsKKworICAgICAgICBtRGVjb2RlZEZpbGVBdWRpbyA9IG5ldyBGaWxlKG1GaWxlRGlyUGF0aCArIERFQ09ERV9BVURJT19VTlBBQ0tFRCk7CisgICAgICAgIHN0YXR1cyA9IGRlY29kZUZpbGUobUlucHV0RmlsZVBhdGggKyBERUNPREVfQVVESU9fSU5QVVQsIG1EZWNvZGVkRmlsZUF1ZGlvKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJEZWNvZGVyIHJldHVybmVkIGVycm9yICIgKyBzdGF0dXMsIDAsIHN0YXR1cyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGRlY29kZUZpbGUoU3RyaW5nIGlucHV0RmlsZU5hbWUsIEZpbGUgb3V0cHV0RGVjb2RlRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IC0xOworICAgICAgICBGaWxlIGlucHV0RmlsZSA9IG5ldyBGaWxlKGlucHV0RmlsZU5hbWUpOworICAgICAgICBhc3NlcnRUcnVlKCJDYW5ub3Qgb3BlbiBpbnB1dCBmaWxlICIgKyBpbnB1dEZpbGVOYW1lLCBpbnB1dEZpbGUuZXhpc3RzKCkpOwogICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlsZUlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShpbnB1dEZpbGUpOwogICAgICAgICBGaWxlRGVzY3JpcHRvciBmaWxlRGVzY3JpcHRvciA9IGZpbGVJbnB1dC5nZXRGRCgpOworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGRlY29kZU91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dERlY29kZUZpbGUpOworCiAgICAgICAgIEV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRXh0cmFjdG9yKCk7CiAgICAgICAgIGludCB0cmFja0NvdW50ID0gZXh0cmFjdG9yLnNldFVwRXh0cmFjdG9yKGZpbGVEZXNjcmlwdG9yKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXh0cmFjdGlvbiBmYWlsZWQuIE5vIHRyYWNrcyBmb3IgZmlsZTogIiArIG1JbnB1dEZpbGUsICh0cmFja0NvdW50ID4gMCkpOworICAgICAgICBhc3NlcnRUcnVlKCJFeHRyYWN0aW9uIGZhaWxlZC4gTm8gdHJhY2tzIGZvciB0aGUgZ2l2ZW4gaW5wdXQgZmlsZSIsICh0cmFja0NvdW50ID4gMCkpOwogICAgICAgICBBcnJheUxpc3Q8Qnl0ZUJ1ZmZlcj4gaW5wdXRCdWZmZXIgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgQXJyYXlMaXN0PE1lZGlhQ29kZWMuQnVmZmVySW5mbz4gZnJhbWVJbmZvID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIGZvciAoaW50IGN1cnJlbnRUcmFjayA9IDA7IGN1cnJlbnRUcmFjayA8IHRyYWNrQ291bnQ7IGN1cnJlbnRUcmFjaysrKSB7Ci0gICAgICAgICAgICBpbnQgY29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKICAgICAgICAgICAgIGV4dHJhY3Rvci5zZWxlY3RFeHRyYWN0b3JUcmFjayhjdXJyZW50VHJhY2spOwogICAgICAgICAgICAgTWVkaWFGb3JtYXQgZm9ybWF0ID0gZXh0cmFjdG9yLmdldEZvcm1hdChjdXJyZW50VHJhY2spOwogICAgICAgICAgICAgLy8gR2V0IHNhbXBsZXMgZnJvbSBleHRyYWN0b3IKQEAgLTE0NiwxNjMgKzE5NywxMzUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZJbmZvLnByZXNlbnRhdGlvblRpbWVVcyArICIgc2l6ZSA9ICIgKyBidWZJbmZvLnNpemUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHNhbXBsZVNpemUgPiAwKTsKLSAgICAgICAgICAgIGludCB0aWQgPSBhbmRyb2lkLm9zLlByb2Nlc3MubXlUaWQoKTsKLSAgICAgICAgICAgIEZpbGUgZGVjb2RlZEZpbGUgPSBuZXcgRmlsZShtQ29udGV4dC5nZXRGaWxlc0RpcigpICsgIi9kZWNvZGVyXyIgKyB0aWQgKyAiLm91dCIpOwotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBkZWNvZGVPdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZWNvZGVkRmlsZSk7CiAgICAgICAgICAgICBEZWNvZGVyIGRlY29kZXIgPSBuZXcgRGVjb2RlcigpOwogICAgICAgICAgICAgZGVjb2Rlci5zZXR1cERlY29kZXIoZGVjb2RlT3V0cHV0U3RyZWFtKTsKICAgICAgICAgICAgIHN0YXR1cyA9IGRlY29kZXIuZGVjb2RlKGlucHV0QnVmZmVyLCBmcmFtZUluZm8sIGZhbHNlLCBmb3JtYXQsICIiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiRGVjb2RlciByZXR1cm5lZCBlcnJvciAiICsgc3RhdHVzICsgIiBmb3IgZmlsZTogIiArIG1JbnB1dEZpbGUsIDAsCi0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CiAgICAgICAgICAgICBNZWRpYUZvcm1hdCBkZWNvZGVyRm9ybWF0ID0gZGVjb2Rlci5nZXRGb3JtYXQoKTsKKyAgICAgICAgICAgIGlmIChkZWNvZGVyRm9ybWF0LmNvbnRhaW5zS2V5KE1lZGlhRm9ybWF0LktFWV9DT0xPUl9GT1JNQVQpKSB7CisgICAgICAgICAgICAgICAgbUNvbG9yRm9ybWF0ID0gZGVjb2RlckZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9DT0xPUl9GT1JNQVQpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZGVjb2Rlci5kZUluaXRDb2RlYygpOwogICAgICAgICAgICAgZXh0cmFjdG9yLnVuc2VsZWN0RXh0cmFjdG9yVHJhY2soY3VycmVudFRyYWNrKTsKICAgICAgICAgICAgIGlucHV0QnVmZmVyLmNsZWFyKCk7CiAgICAgICAgICAgICBmcmFtZUluZm8uY2xlYXIoKTsKLSAgICAgICAgICAgIGlmIChkZWNvZGVPdXRwdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRlY29kZU91dHB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIG1pbWUgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FKTsKLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IG1lZGlhQ29kZWNzID0gQ29kZWNVdGlscy5zZWxlY3RDb2RlY3MobWltZSwgdHJ1ZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJObyBzdWl0YWJsZSBjb2RlY3MgZm91bmQgZm9yIGZpbGU6ICIgKyBtSW5wdXRGaWxlICsgIiB0cmFjayA6ICIgKwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2sgKyAiIG1pbWU6ICIgKyBtaW1lLCAobWVkaWFDb2RlY3Muc2l6ZSgpID4gMCkpOwotICAgICAgICAgICAgQm9vbGVhbltdIGVuY29kZU1vZGUgPSB7dHJ1ZSwgZmFsc2V9OwotICAgICAgICAgICAgLyogRW5jb2RpbmcgdGhlIGRlY29kZXIncyBvdXRwdXQgKi8KLSAgICAgICAgICAgIGZvciAoQm9vbGVhbiBhc3luY01vZGUgOiBlbmNvZGVNb2RlKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgY29kZWNOYW1lIDogbWVkaWFDb2RlY3MpIHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBlbmNvZGVPdXRwdXRTdHJlYW0gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoV1JJVEVfT1VUUFVUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIG91dEVuY29kZUZpbGUgPSBuZXcgRmlsZShtT3V0cHV0RmlsZVBhdGggKyAiZW5jb2Rlci5vdXQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRFbmNvZGVGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiIFVuYWJsZSB0byBkZWxldGUgZXhpc3RpbmcgZmlsZSIgKyBvdXRFbmNvZGVGaWxlLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRFbmNvZGVGaWxlLmRlbGV0ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlVuYWJsZSB0byBjcmVhdGUgZmlsZSB0byB3cml0ZSBlbmNvZGVyIG91dHB1dDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEVuY29kZUZpbGUudG9TdHJpbmcoKSwgb3V0RW5jb2RlRmlsZS5jcmVhdGVOZXdGaWxlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlT3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0RW5jb2RlRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgRmlsZSByYXdGaWxlID0gbmV3IEZpbGUobUNvbnRleHQuZ2V0RmlsZXNEaXIoKSArICIvZGVjb2Rlcl8iICsgdGlkICsgIi5vdXQiKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2Fubm90IG9wZW4gZmlsZSB0byB3cml0ZSBkZWNvZGVkIG91dHB1dCIsIHJhd0ZpbGUuZXhpc3RzKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlBhdGggb2YgZGVjb2RlZCBpbnB1dCBmaWxlOiAiICsgcmF3RmlsZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZWxlU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShyYXdGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1pbWUuc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX1dJRFRIKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9IRUlHSFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdC5jb250YWluc0tleShNZWRpYUZvcm1hdC5LRVlfRlJBTUVfUkFURSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVJhdGUgPSBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfRlJBTUVfUkFURSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZyYW1lUmF0ZSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVSYXRlID0gRU5DT0RFX0RFRkFVTFRfRlJBTUVfUkFURTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQuY29udGFpbnNLZXkoTWVkaWFGb3JtYXQuS0VZX0JJVF9SQVRFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdFJhdGUgPSBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQklUX1JBVEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiaXRSYXRlIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWltZS5jb250YWlucygidmlkZW8vM2dwcCIpIHx8IG1pbWUuY29udGFpbnMoInZpZGVvL21wNHYtZXMiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRSYXRlID0gRU5DT0RFX01JTl9CSVRfUkFURTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRSYXRlID0gRU5DT0RFX0RFRkFVTFRfQklUX1JBVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdC5jb250YWluc0tleShNZWRpYUZvcm1hdC5LRVlfUFJPRklMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlID0gZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX1BST0ZJTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdC5jb250YWluc0tleShNZWRpYUZvcm1hdC5LRVlfUFJPRklMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9MRVZFTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckZvcm1hdC5jb250YWluc0tleShNZWRpYUZvcm1hdC5LRVlfQ09MT1JfRk9STUFUKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yRm9ybWF0ID0gZGVjb2RlckZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9DT0xPUl9GT1JNQVQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9TQU1QTEVfUkFURSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscyA9IGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9DSEFOTkVMX0NPVU5UKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGVyRm9ybWF0LmNvbnRhaW5zS2V5KE1lZGlhRm9ybWF0LktFWV9CSVRfUkFURSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRSYXRlID0gZGVjb2RlckZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9CSVRfUkFURSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdFJhdGUgPSBFTkNPREVfREVGQVVMVF9BVURJT19CSVRfUkFURTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKlNldHVwIEVuY29kZSBGb3JtYXQqLwotICAgICAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdCBlbmNvZGVGb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemUgPSB3aWR0aCAqIGhlaWdodCAqIDMgLyAyOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0ID0gTWVkaWFGb3JtYXQuY3JlYXRlVmlkZW9Gb3JtYXQobWltZSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfRlJBTUVfUkFURSwgZnJhbWVSYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9CSVRfUkFURSwgYml0UmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfUFJPRklMRSwgcHJvZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfTEVWRUwsIGxldmVsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9JX0ZSQU1FX0lOVEVSVkFMLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9NQVhfSU5QVVRfU0laRSwgZnJhbWVTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9DT0xPUl9GT1JNQVQsIGNvbG9yRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdCA9IE1lZGlhRm9ybWF0LmNyZWF0ZUF1ZGlvRm9ybWF0KG1pbWUsIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9CSVRfUkFURSwgYml0UmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemUgPSA0MDk2OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEVuY29kZXIgZW5jb2RlciA9IG5ldyBFbmNvZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZXIuc2V0dXBFbmNvZGVyKGVuY29kZU91dHB1dFN0cmVhbSwgZWxlU3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZW5jb2Rlci5lbmNvZGUoY29kZWNOYW1lLCBlbmNvZGVGb3JtYXQsIG1pbWUsIGZyYW1lUmF0ZSwgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemUsIGFzeW5jTW9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZXIuZGVJbml0RW5jb2RlcigpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNOYW1lICsgIiBlbmNvZGVyIHJldHVybmVkIGVycm9yICIgKyBzdGF0dXMgKyAiIGZvciAiICsgImZpbGU6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICIgKyBtSW5wdXRGaWxlLCAwLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLmR1bXBTdGF0aXN0aWNzKG1JbnB1dEZpbGUsIGNvZGVjTmFtZSwgKGFzeW5jTW9kZSA/ICJhc3luYyIgOiAic3luYyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3Rvci5nZXRDbGlwRHVyYXRpb24oKSwgbVN0YXRzRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkVuY29kaW5nIGNvbXBsZXRlIGZvciBmaWxlOiAiICsgbUlucHV0RmlsZSArICIgd2l0aCBjb2RlYzogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNOYW1lICsgIiBmb3IgYVN5bmNNb2RlID0gIiArIGFzeW5jTW9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZXIucmVzZXRFbmNvZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsZVN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RlT3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZU91dHB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0NsZWFudXAgdGVtcG9yYXJ5IGlucHV0IGZpbGUKLSAgICAgICAgICAgIGlmIChkZWNvZGVkRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIiBVbmFibGUgdG8gZGVsZXRlIGRlY29kZWQgZmlsZSIgKyBkZWNvZGVkRmlsZS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZEZpbGUuZGVsZXRlKCkpOwotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlN1Y2Nlc3NmdWxseSBkZWxldGVkIGRlY29kZWQgZmlsZSIpOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGV4dHJhY3Rvci5kZWluaXRFeHRyYWN0b3IoKTsKICAgICAgICAgZmlsZUlucHV0LmNsb3NlKCk7CisgICAgICAgIGRlY29kZU91dHB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAogICAgIEBUZXN0KHRpbWVvdXQgPSBQRVJfVEVTVF9USU1FT1VUX01TKQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYXRpdmVFbmNvZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgaW5wdXRGaWxlID0gbmV3IEZpbGUobUlucHV0RmlsZVBhdGggKyBtSW5wdXRGaWxlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2Fubm90IGZpbmQgIiArIG1JbnB1dEZpbGUgKyAiIGluIGRpcmVjdG9yeSAiICsgbUlucHV0RmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgaW5wdXRGaWxlLmV4aXN0cygpKTsKLSAgICAgICAgaW50IHRpZCA9IGFuZHJvaWQub3MuUHJvY2Vzcy5teVRpZCgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgbURlY29kZWRGaWxlID0gbUNvbnRleHQuZ2V0RmlsZXNEaXIoKSArICIvZGVjb2Rlcl8iICsgdGlkICsgIi5vdXQiOwotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlsZUlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShpbnB1dEZpbGUpOwotICAgICAgICBGaWxlRGVzY3JpcHRvciBmaWxlRGVzY3JpcHRvciA9IGZpbGVJbnB1dC5nZXRGRCgpOwotICAgICAgICBFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IEV4dHJhY3RvcigpOwotICAgICAgICBpbnQgdHJhY2tDb3VudCA9IGV4dHJhY3Rvci5zZXRVcEV4dHJhY3RvcihmaWxlRGVzY3JpcHRvcik7Ci0gICAgICAgIGFzc2VydFRydWUoIkV4dHJhY3Rpb24gZmFpbGVkLiBObyB0cmFja3MgZm9yIGZpbGU6ICIsIHRyYWNrQ291bnQgPiAwKTsKLSAgICAgICAgZm9yIChpbnQgY3VycmVudFRyYWNrID0gMDsgY3VycmVudFRyYWNrIDwgdHJhY2tDb3VudDsgY3VycmVudFRyYWNrKyspIHsKLSAgICAgICAgICAgIGV4dHJhY3Rvci5zZWxlY3RFeHRyYWN0b3JUcmFjayhjdXJyZW50VHJhY2spOwotICAgICAgICAgICAgTWVkaWFGb3JtYXQgZm9ybWF0ID0gZXh0cmFjdG9yLmdldEZvcm1hdChjdXJyZW50VHJhY2spOwotICAgICAgICAgICAgU3RyaW5nIG1pbWUgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FKTsKLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IG1lZGlhQ29kZWNzID0gQ29kZWNVdGlscy5zZWxlY3RDb2RlY3MobWltZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAvLyBFbmNvZGluZyB0aGUgZGVjb2RlcidzIG91dHB1dAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgIGludCBmcmFtZVNpemU7CisKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbWVkaWFDb2RlY3MgPSBDb2RlY1V0aWxzLnNlbGVjdENvZGVjcyhtTWltZSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUoIk5vIHN1aXRhYmxlIGNvZGVjcyBmb3VuZCBmb3IgbWltZXR5cGU6ICIgKyBtTWltZSwgKG1lZGlhQ29kZWNzLnNpemUoKSA+IDApKTsKKyAgICAgICAgQm9vbGVhbltdIGVuY29kZU1vZGUgPSB7dHJ1ZSwgZmFsc2V9OworICAgICAgICAvLyBFbmNvZGluZyB0aGUgZGVjb2RlZCBpbnB1dCBmaWxlCisgICAgICAgIGZvciAoQm9vbGVhbiBhc3luY01vZGUgOiBlbmNvZGVNb2RlKSB7CiAgICAgICAgICAgICBmb3IgKFN0cmluZyBjb2RlY05hbWUgOiBtZWRpYUNvZGVjcykgewotICAgICAgICAgICAgICAgIE5hdGl2ZSBuYXRpdmVFbmNvZGVyID0gbmV3IE5hdGl2ZSgpOwotICAgICAgICAgICAgICAgIGludCBzdGF0dXMgPSBuYXRpdmVFbmNvZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuRW5jb2RlKG1JbnB1dEZpbGVQYXRoLCBtSW5wdXRGaWxlLCBtRGVjb2RlZEZpbGUsIG1TdGF0c0ZpbGUsIGNvZGVjTmFtZSk7CisgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBlbmNvZGVPdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChXUklURV9PVVRQVVQpIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBvdXRFbmNvZGVGaWxlID0gbmV3IEZpbGUobU91dHB1dEZpbGVQYXRoICsgImVuY29kZXIub3V0Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRFbmNvZGVGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCIgVW5hYmxlIHRvIGRlbGV0ZSBleGlzdGluZyBmaWxlIiArIG91dEVuY29kZUZpbGUudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RW5jb2RlRmlsZS5kZWxldGUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5hYmxlIHRvIGNyZWF0ZSBmaWxlIHRvIHdyaXRlIGVuY29kZXIgb3V0cHV0OiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRFbmNvZGVGaWxlLnRvU3RyaW5nKCksIG91dEVuY29kZUZpbGUuY3JlYXRlTmV3RmlsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlT3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0RW5jb2RlRmlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZpbGUgcmF3RmlsZSA9IG5ldyBGaWxlKG1GaWxlRGlyUGF0aCArIG1JbnB1dEZpbGUpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkNhbm5vdCBvcGVuIGRlY29kZWQgaW5wdXQgZmlsZSIsIHJhd0ZpbGUuZXhpc3RzKCkpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJQYXRoIG9mIGRlY29kZWQgaW5wdXQgZmlsZTogIiArIHJhd0ZpbGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBlbGVTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHJhd0ZpbGUpOworICAgICAgICAgICAgICAgIC8vIFNldHVwIEVuY29kZSBGb3JtYXQKKyAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdCBlbmNvZGVGb3JtYXQ7CisgICAgICAgICAgICAgICAgaWYgKG1NaW1lLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSA9IG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0ID0gTWVkaWFGb3JtYXQuY3JlYXRlVmlkZW9Gb3JtYXQobU1pbWUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9GUkFNRV9SQVRFLCBFTkNPREVfREVGQVVMVF9GUkFNRV9SQVRFKTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0lfRlJBTUVfSU5URVJWQUwsIG1JRnJhbWVJbnRlcnZhbCk7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9CSVRfUkFURSwgbUJpdFJhdGUpOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQ09MT1JfRk9STUFULCBtQ29sb3JGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBpZiAobVByb2ZpbGUgIT0gLTEgJiYgbUxldmVsICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfUFJPRklMRSwgbVByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0xFVkVMLCBtTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplID0gNDA5NjsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0ID0gTWVkaWFGb3JtYXQuY3JlYXRlQXVkaW9Gb3JtYXQobU1pbWUsIG1TYW1wbGVSYXRlLCBtTnVtQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9CSVRfUkFURSwgbUJpdFJhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFbmNvZGVyIGVuY29kZXIgPSBuZXcgRW5jb2RlcigpOworICAgICAgICAgICAgICAgIGVuY29kZXIuc2V0dXBFbmNvZGVyKGVuY29kZU91dHB1dFN0cmVhbSwgZWxlU3RyZWFtKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlbmNvZGVyLmVuY29kZShjb2RlY05hbWUsIGVuY29kZUZvcm1hdCwgbU1pbWUsIEVOQ09ERV9ERUZBVUxUX0ZSQU1FX1JBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgZnJhbWVTaXplLCBhc3luY01vZGUpOworICAgICAgICAgICAgICAgIGVuY29kZXIuZGVJbml0RW5jb2RlcigpOwogICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjTmFtZSArICIgZW5jb2RlciByZXR1cm5lZCBlcnJvciAiICsgc3RhdHVzICsgIiBmb3IgIiArICJmaWxlOiIgKyAiICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGaWxlLCAwLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNOYW1lICsgIiBlbmNvZGVyIHJldHVybmVkIGVycm9yICIgKyBzdGF0dXMgKyAiIGZvciAiICsgIm1pbWU6IiArICIgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NaW1lLCAwLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIFN0cmluZyBpbnB1dFJlZmVyZW5jZTsKKyAgICAgICAgICAgICAgICBsb25nIGR1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgaWYgKG1NaW1lLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0UmVmZXJlbmNlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGaWxlICsgIl8iICsgbVdpZHRoICsgIngiICsgbUhlaWdodCArICJfIiArIG1CaXRSYXRlICsgImJwcyI7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgPSAoKChlbGVTdHJlYW0uZ2V0Q2hhbm5lbCgpLnNpemUoKSArIGZyYW1lU2l6ZSAtIDEpIC8gZnJhbWVTaXplKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5DT0RFX0RFRkFVTFRfRlJBTUVfUkFURSkgKiAxMDAwMDAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0UmVmZXJlbmNlID0gbUlucHV0RmlsZSArICJfIiArIG1TYW1wbGVSYXRlICsgImh6XyIgKyBtTnVtQ2hhbm5lbCArICJjaF8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQml0UmF0ZSArICJicHMiOworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWxlU3RyZWFtLmdldENoYW5uZWwoKS5zaXplKCkgLyAobVNhbXBsZVJhdGUgKiBtTnVtQ2hhbm5lbCkpICogMTAwMDAwMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZW5jb2Rlci5kdW1wU3RhdGlzdGljcyhpbnB1dFJlZmVyZW5jZSwgY29kZWNOYW1lLCAoYXN5bmNNb2RlID8gImFzeW5jIiA6ICJzeW5jIiksCisgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblVzLCBtU3RhdHNGaWxlKTsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJFbmNvZGluZyBjb21wbGV0ZSBmb3IgbWltZTogIiArIG1NaW1lICsgIiB3aXRoIGNvZGVjOiAiICsgY29kZWNOYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIGFTeW5jTW9kZSA9ICIgKyBhc3luY01vZGUpOworICAgICAgICAgICAgICAgIGVuY29kZXIucmVzZXRFbmNvZGVyKCk7CisgICAgICAgICAgICAgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgaWYgKGVuY29kZU91dHB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZU91dHB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBGaWxlIGRlY29kZWRGaWxlID0gbmV3IEZpbGUobURlY29kZWRGaWxlKTsKLSAgICAgICAgLy8gQ2xlYW51cCB0ZW1wb3JhcnkgaW5wdXQgZmlsZQotICAgICAgICBpZiAoZGVjb2RlZEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIlVuYWJsZSB0byBkZWxldGUgLSAiICsgbURlY29kZWRGaWxlLCBkZWNvZGVkRmlsZS5kZWxldGUoKSk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJTdWNjZXNzZnVsbHkgZGVsZXRlZCAtICIgKyBtRGVjb2RlZEZpbGUpOworICAgIH0KKworICAgIEBUZXN0KHRpbWVvdXQgPSBQRVJfVEVTVF9USU1FT1VUX01TKQorICAgIHB1YmxpYyB2b2lkIHRlc3ROYXRpdmVFbmNvZGVyKCkgeworICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBtZWRpYUNvZGVjcyA9IENvZGVjVXRpbHMuc2VsZWN0Q29kZWNzKG1NaW1lLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gc3VpdGFibGUgY29kZWNzIGZvdW5kIGZvciBtaW1ldHlwZTogIiArIG1NaW1lLCAobWVkaWFDb2RlY3Muc2l6ZSgpID4gMCkpOworICAgICAgICBmb3IgKFN0cmluZyBjb2RlY05hbWUgOiBtZWRpYUNvZGVjcykgeworICAgICAgICAgICAgTmF0aXZlIG5hdGl2ZUVuY29kZXIgPSBuZXcgTmF0aXZlKCk7CisgICAgICAgICAgICBpbnQgc3RhdHVzID0gbmF0aXZlRW5jb2RlcgorICAgICAgICAgICAgICAgICAgICAuRW5jb2RlKG1GaWxlRGlyUGF0aCwgbUlucHV0RmlsZSwgbVN0YXRzRmlsZSwgY29kZWNOYW1lLCBtTWltZSwgbUJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbG9yRm9ybWF0LCBtSUZyYW1lSW50ZXJ2YWwsIG1XaWR0aCwgbUhlaWdodCwgbVByb2ZpbGUsIG1MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbU51bUNoYW5uZWwpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvZGVjTmFtZSArICIgZW5jb2RlciByZXR1cm5lZCBlcnJvciAiICsgc3RhdHVzICsgIiBmb3IgIiArICJtaW1lOiIgKyAiICIgKworICAgICAgICAgICAgICAgICAgICBtTWltZSwgMCwgc3RhdHVzKTsKICAgICAgICAgfQotICAgICAgICBmaWxlSW5wdXQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAQWZ0ZXJDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEZWNvZGVkRmlsZXMoKSB7CisgICAgICAgIGlmIChtRGVjb2RlZEZpbGVGdWxsSGQuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIiBVbmFibGUgdG8gZGVsZXRlIGRlY29kZWQgZmlsZSIgKyBtRGVjb2RlZEZpbGVGdWxsSGQudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgbURlY29kZWRGaWxlRnVsbEhkLmRlbGV0ZSgpKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlN1Y2Nlc3NmdWxseSBkZWxldGVkIGRlY29kZWQgZmlsZSIgKyBtRGVjb2RlZEZpbGVGdWxsSGQudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1EZWNvZGVkRmlsZVFjaWYuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIiBVbmFibGUgdG8gZGVsZXRlIGRlY29kZWQgZmlsZSIgKyBtRGVjb2RlZEZpbGVRY2lmLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIG1EZWNvZGVkRmlsZVFjaWYuZGVsZXRlKCkpOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiU3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgZGVjb2RlZCBmaWxlIiArIG1EZWNvZGVkRmlsZVFjaWYudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1EZWNvZGVkRmlsZUF1ZGlvLmV4aXN0cygpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCIgVW5hYmxlIHRvIGRlbGV0ZSBkZWNvZGVkIGZpbGUiICsgbURlY29kZWRGaWxlQXVkaW8udG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgbURlY29kZWRGaWxlQXVkaW8uZGVsZXRlKCkpOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiU3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgZGVjb2RlZCBmaWxlIiArIG1EZWNvZGVkRmlsZUF1ZGlvLnRvU3RyaW5nKCkpOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9jcHAvQW5kcm9pZC5icCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL0FuZHJvaWQuYnAKaW5kZXggM2U1ZTRjOC4uYWY5MjQyNCAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9jcHAvQW5kcm9pZC5icAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2NwcC9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfdGVzdF9saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWFiZW5jaG1hcmtfam5pIiwKICAgICBzZGtfdmVyc2lvbjogImN1cnJlbnQiLApkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9jcHAvTmF0aXZlRW5jb2Rlci5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2NwcC9OYXRpdmVFbmNvZGVyLmNwcAppbmRleCAxMjc3YzhiLi4yZjY1OGUzIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2NwcC9OYXRpdmVFbmNvZGVyLmNwcAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2NwcC9OYXRpdmVFbmNvZGVyLmNwcApAQCAtMzAsMTg5ICszMCw4MSBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKIGNvbnN0ZXhwciBpbnQzMl90IEVOQ09ERV9ERUZBVUxUX0ZSQU1FX1JBVEUgPSAyNTsKLWNvbnN0ZXhwciBpbnQzMl90IEVOQ09ERV9ERUZBVUxUX0FVRElPX0JJVF9SQVRFID0gMTI4MDAwIC8qIDEyOCBLYnBzICovOwotY29uc3RleHByIGludDMyX3QgRU5DT0RFX0RFRkFVTFRfQklUX1JBVEUgPSA4MDAwMDAwIC8qIDggTWJwcyAqLzsKLWNvbnN0ZXhwciBpbnQzMl90IEVOQ09ERV9NSU5fQklUX1JBVEUgPSA2MDAwMDAgLyogNjAwIEticHMgKi87CiAKIGV4dGVybiAiQyIgSk5JRVhQT1JUIGludCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfbWVkaWFfYmVuY2htYXJrX2xpYnJhcnlfTmF0aXZlX0VuY29kZSgKLSAgICAgICAgSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwganN0cmluZyBqRmlsZVBhdGgsIGpzdHJpbmcgakZpbGVOYW1lLCBqc3RyaW5nIGpPdXRGaWxlUGF0aCwKLSAgICAgICAganN0cmluZyBqU3RhdHNGaWxlLCBqc3RyaW5nIGpDb2RlY05hbWUpIHsKKyAgICAgICAgSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwganN0cmluZyBqRmlsZVBhdGgsIGpzdHJpbmcgakZpbGVOYW1lLCBqc3RyaW5nIGpTdGF0c0ZpbGUsCisgICAgICAgIGpzdHJpbmcgakNvZGVjTmFtZSwganN0cmluZyBqTWltZSwgamludCBqQml0UmF0ZSwgamludCBqQ29sb3JGb3JtYXQsIGppbnQgakZyYW1lSW50ZXJ2YWwsCisgICAgICAgIGppbnQgaldpZHRoLCBqaW50IGpIZWlnaHQsIGppbnQgalByb2ZpbGUsIGppbnQgakxldmVsLCBqaW50IGpTYW1wbGVSYXRlLAorICAgICAgICBqaW50IGpOdW1DaGFubmVscykgeworICAgIFVOVVNFRCh0aGl6KTsKICAgICBjb25zdCBjaGFyICpmaWxlUGF0aCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoakZpbGVQYXRoLCBudWxscHRyKTsKICAgICBjb25zdCBjaGFyICpmaWxlTmFtZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoakZpbGVOYW1lLCBudWxscHRyKTsKLSAgICBzdHJpbmcgc0ZpbGVQYXRoID0gc3RyaW5nKGZpbGVQYXRoKSArIHN0cmluZyhmaWxlTmFtZSk7Ci0gICAgVU5VU0VEKHRoaXopOwotICAgIEZJTEUgKmlucHV0RnAgPSBmb3BlbihzRmlsZVBhdGguY19zdHIoKSwgInJiIik7Ci0gICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoakZpbGVOYW1lLCBmaWxlTmFtZSk7Ci0gICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoakZpbGVQYXRoLCBmaWxlUGF0aCk7Ci0gICAgaWYgKCFpbnB1dEZwKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gb3BlbiBpbnB1dCBmaWxlIGZvciByZWFkaW5nIik7CisgICAgc3RyaW5nIGlucHV0RmlsZSA9IHN0cmluZyhmaWxlUGF0aCkgKyBzdHJpbmcoZmlsZU5hbWUpOworICAgIGNvbnN0IGNoYXIgKmNvZGVjTmFtZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoakNvZGVjTmFtZSwgbnVsbHB0cik7CisgICAgc3RyaW5nIHNDb2RlY05hbWUgPSBzdHJpbmcoY29kZWNOYW1lKTsKKyAgICBjb25zdCBjaGFyICptaW1lID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqTWltZSwgbnVsbHB0cik7CisKKyAgICBpZnN0cmVhbSBlbGVTdHJlYW07CisgICAgZWxlU3RyZWFtLm9wZW4oaW5wdXRGaWxlLCBpZnN0cmVhbTo6YmluYXJ5IHwgaWZzdHJlYW06OmF0ZSk7CisgICAgaWYgKCFlbGVTdHJlYW0uaXNfb3BlbigpKSB7CisgICAgICAgIEFMT0dFKCIlcyAtIEZpbGUgZmFpbGVkIHRvIG9wZW4gZm9yIHJlYWRpbmchIiwgZmlsZU5hbWUpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqRmlsZU5hbWUsIGZpbGVOYW1lKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIERlY29kZXIgKmRlY29kZXIgPSBuZXcgRGVjb2RlcigpOwotICAgIEV4dHJhY3RvciAqZXh0cmFjdG9yID0gZGVjb2Rlci0+Z2V0RXh0cmFjdG9yKCk7Ci0gICAgaWYgKCFleHRyYWN0b3IpIHsKLSAgICAgICAgQUxPR0UoIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KKyAgICBib29sIGFzeW5jTW9kZVsyXSA9IHt0cnVlLCBmYWxzZX07CisgICAgZm9yIChib29sIG1vZGUgOiBhc3luY01vZGUpIHsKKyAgICAgICAgc2l6ZV90IGVsZVNpemUgPSBlbGVTdHJlYW0udGVsbGcoKTsKKyAgICAgICAgZWxlU3RyZWFtLnNlZWtnKDAsIGlmc3RyZWFtOjpiZWcpOwogCi0gICAgLy8gUmVhZCBmaWxlIHByb3BlcnRpZXMKLSAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0gICAgc3RhdChzRmlsZVBhdGguY19zdHIoKSwgJmJ1Zik7Ci0gICAgc2l6ZV90IGZpbGVTaXplID0gYnVmLnN0X3NpemU7Ci0gICAgaWYgKGZpbGVTaXplID4ga01heEJ1ZmZlclNpemUpIHsKLSAgICAgICAgQUxPR0UoIkZpbGUgc2l6ZSBncmVhdGVyIHRoYW4gbWF4aW11bSBidWZmZXIgc2l6ZSIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGludDMyX3QgZmQgPSBmaWxlbm8oaW5wdXRGcCk7Ci0gICAgaW50MzJfdCB0cmFja0NvdW50ID0gZXh0cmFjdG9yLT5pbml0RXh0cmFjdG9yKGZkLCBmaWxlU2l6ZSk7Ci0gICAgaWYgKHRyYWNrQ291bnQgPD0gMCkgewotICAgICAgICBBTE9HRSgiaW5pdEV4dHJhY3RvciBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KKyAgICAgICAgLy8gU2V0IGVuY29kZXIgcGFyYW1zCisgICAgICAgIGVuY1BhcmFtZXRlciBlbmNQYXJhbXM7CisgICAgICAgIGVuY1BhcmFtcy53aWR0aCA9IGpXaWR0aDsKKyAgICAgICAgZW5jUGFyYW1zLmhlaWdodCA9IGpIZWlnaHQ7CisgICAgICAgIGVuY1BhcmFtcy5iaXRyYXRlID0gakJpdFJhdGU7CisgICAgICAgIGVuY1BhcmFtcy5pRnJhbWVJbnRlcnZhbCA9IGpGcmFtZUludGVydmFsOworICAgICAgICBlbmNQYXJhbXMuc2FtcGxlUmF0ZSA9IGpTYW1wbGVSYXRlOworICAgICAgICBlbmNQYXJhbXMubnVtQ2hhbm5lbHMgPSBqTnVtQ2hhbm5lbHM7CisgICAgICAgIGVuY1BhcmFtcy5mcmFtZVJhdGUgPSBFTkNPREVfREVGQVVMVF9GUkFNRV9SQVRFOworICAgICAgICBlbmNQYXJhbXMuY29sb3JGb3JtYXQgPSBqQ29sb3JGb3JtYXQ7CisgICAgICAgIGVuY1BhcmFtcy5wcm9maWxlID0galByb2ZpbGU7CisgICAgICAgIGVuY1BhcmFtcy5sZXZlbCA9IGpMZXZlbDsKIAotICAgIGZvciAoaW50IGN1clRyYWNrID0gMDsgY3VyVHJhY2sgPCB0cmFja0NvdW50OyBjdXJUcmFjaysrKSB7Ci0gICAgICAgIGludDMyX3Qgc3RhdHVzID0gZXh0cmFjdG9yLT5zZXR1cFRyYWNrRm9ybWF0KGN1clRyYWNrKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVHJhY2sgRm9ybWF0IGludmFsaWQiKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90ICppbnB1dEJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKGZpbGVTaXplKTsKLSAgICAgICAgaWYgKCFpbnB1dEJ1ZmZlcikgewotICAgICAgICAgICAgQUxPR0UoIkluc3VmZmljaWVudCBtZW1vcnkiKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICB2ZWN0b3I8QU1lZGlhQ29kZWNCdWZmZXJJbmZvPiBmcmFtZUluZm87Ci0gICAgICAgIEFNZWRpYUNvZGVjQnVmZmVySW5mbyBpbmZvOwotICAgICAgICB1aW50MzJfdCBpbnB1dEJ1ZmZlck9mZnNldCA9IDA7Ci0KLSAgICAgICAgLy8gR2V0IGZyYW1lIGRhdGEKLSAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IGV4dHJhY3Rvci0+Z2V0RnJhbWVTYW1wbGUoaW5mbyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzIHx8ICFpbmZvLnNpemUpIGJyZWFrOwotICAgICAgICAgICAgLy8gY29weSB0aGUgbWV0YSBkYXRhIGFuZCBidWZmZXIgdG8gYmUgcGFzc2VkIHRvIGRlY29kZXIKLSAgICAgICAgICAgIGlmIChpbnB1dEJ1ZmZlck9mZnNldCArIGluZm8uc2l6ZSA+IGtNYXhCdWZmZXJTaXplKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIk1lbW9yeSBhbGxvY2F0ZWQgbm90IHN1ZmZpY2llbnQiKTsKLSAgICAgICAgICAgICAgICBmcmVlKGlucHV0QnVmZmVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZW1jcHkoaW5wdXRCdWZmZXIgKyBpbnB1dEJ1ZmZlck9mZnNldCwgZXh0cmFjdG9yLT5nZXRGcmFtZUJ1ZigpLCBpbmZvLnNpemUpOwotICAgICAgICAgICAgZnJhbWVJbmZvLnB1c2hfYmFjayhpbmZvKTsKLSAgICAgICAgICAgIGlucHV0QnVmZmVyT2Zmc2V0ICs9IGluZm8uc2l6ZTsKLSAgICAgICAgfQotICAgICAgICBzdHJpbmcgZGVjTmFtZSA9ICIiOwotICAgICAgICBjb25zdCBjaGFyICpvdXRwdXRGaWxlUGF0aCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoak91dEZpbGVQYXRoLCBudWxscHRyKTsKLSAgICAgICAgRklMRSAqb3V0RnAgPSBmb3BlbihvdXRwdXRGaWxlUGF0aCwgIndiIik7Ci0gICAgICAgIGlmIChvdXRGcCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXMgLSBGaWxlIGZhaWxlZCB0byBvcGVuIGZvciB3cml0aW5nISIsIG91dHB1dEZpbGVQYXRoKTsKLSAgICAgICAgICAgIGZyZWUoaW5wdXRCdWZmZXIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGRlY29kZXItPnNldHVwRGVjb2RlcigpOwotICAgICAgICBzdGF0dXMgPSBkZWNvZGVyLT5kZWNvZGUoaW5wdXRCdWZmZXIsIGZyYW1lSW5mbywgZGVjTmFtZSwgZmFsc2UgLyphc3luY01vZGUgKi8sIG91dEZwKTsKKyAgICAgICAgRW5jb2RlciAqZW5jb2RlciA9IG5ldyBFbmNvZGVyKCk7CisgICAgICAgIGVuY29kZXItPnNldHVwRW5jb2RlcigpOworICAgICAgICBhdXRvIHN0YXR1cyA9IGVuY29kZXItPmVuY29kZShzQ29kZWNOYW1lLCBlbGVTdHJlYW0sIGVsZVNpemUsIG1vZGUsIGVuY1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyICo+KG1pbWUpKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJEZWNvZGUgcmV0dXJuZWQgZXJyb3IiKTsKLSAgICAgICAgICAgIGZyZWUoaW5wdXRCdWZmZXIpOworICAgICAgICAgICAgQUxPR0UoIkVuY29kZXIgcmV0dXJuZWQgZXJyb3IiKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotCi0gICAgICAgIEFNZWRpYUZvcm1hdCAqZGVjb2RlckZvcm1hdCA9IGRlY29kZXItPmdldEZvcm1hdCgpOwotICAgICAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCA9IGV4dHJhY3Rvci0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgIGlmIChpbnB1dEJ1ZmZlcikgewotICAgICAgICAgICAgZnJlZShpbnB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICBpbnB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIEFMT0dWKCJFbmNvZGluZyBjb21wbGV0ZSB3aXRoIGNvZGVjICVzIGZvciBhc3luY01vZGUgPSAlZCIsIHNDb2RlY05hbWUuY19zdHIoKSwgbW9kZSk7CisgICAgICAgIGVuY29kZXItPmRlSW5pdENvZGVjKCk7CisgICAgICAgIGNvbnN0IGNoYXIgKnN0YXRzRmlsZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoalN0YXRzRmlsZSwgbnVsbHB0cik7CisgICAgICAgIHN0cmluZyBpbnB1dFJlZmVyZW5jZTsKKyAgICAgICAgaW50NjRfdCBjbGlwRHVyYXRpb25VczsKKyAgICAgICAgaWYgKCFzdHJuY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgeworICAgICAgICAgICAgaW5wdXRSZWZlcmVuY2UgPSBzdHJpbmcoZmlsZU5hbWUpICsgIl8iICsgdG9fc3RyaW5nKGpXaWR0aCkgKyAieCIgKyB0b19zdHJpbmcoakhlaWdodCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXyIgKyB0b19zdHJpbmcoakJpdFJhdGUpICsgImJwcyI7CisgICAgICAgICAgICBpbnQzMl90IGZyYW1lU2l6ZSA9IGpXaWR0aCAqIGpIZWlnaHQgKiAzIC8gMjsKKyAgICAgICAgICAgIGNsaXBEdXJhdGlvblVzID0KKyAgICAgICAgICAgICAgICAgICAgKCgoZWxlU2l6ZSArIGZyYW1lU2l6ZSAtIDEpIC8gZnJhbWVTaXplKSAvIEVOQ09ERV9ERUZBVUxUX0ZSQU1FX1JBVEUpICogMTAwMDAwMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlucHV0UmVmZXJlbmNlID0gc3RyaW5nKGZpbGVOYW1lKSArICJfIiArIHRvX3N0cmluZyhqU2FtcGxlUmF0ZSkgKyAiaHpfIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX3N0cmluZyhqTnVtQ2hhbm5lbHMpICsgImNoXyIgKyB0b19zdHJpbmcoakJpdFJhdGUpICsgImJwcyI7CisgICAgICAgICAgICBjbGlwRHVyYXRpb25VcyA9IChlbGVTaXplIC8gKGpTYW1wbGVSYXRlICogak51bUNoYW5uZWxzKSkgKiAxMDAwMDAwOwogICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGNoYXIgKm1pbWUgPSBudWxscHRyOwotICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7Ci0gICAgICAgIGlmICghbWltZSkgewotICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmciKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZnN0cmVhbSBlbGVTdHJlYW07Ci0gICAgICAgIGVsZVN0cmVhbS5vcGVuKG91dHB1dEZpbGVQYXRoLCBpZnN0cmVhbTo6YmluYXJ5IHwgaWZzdHJlYW06OmF0ZSk7Ci0gICAgICAgIGlmICghZWxlU3RyZWFtLmlzX29wZW4oKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzIC0gRmlsZSBmYWlsZWQgdG8gb3BlbiBmb3IgcmVhZGluZyEiLCBvdXRwdXRGaWxlUGF0aCk7Ci0gICAgICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqT3V0RmlsZVBhdGgsIG91dHB1dEZpbGVQYXRoKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBjaGFyICpjb2RlY05hbWUgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpDb2RlY05hbWUsIE5VTEwpOwotICAgICAgICBjb25zdCBjaGFyICppbnB1dFJlZmVyZW5jZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoakZpbGVOYW1lLCBudWxscHRyKTsKLSAgICAgICAgc3RyaW5nIHNDb2RlY05hbWUgPSBzdHJpbmcoY29kZWNOYW1lKTsKLSAgICAgICAgc3RyaW5nIHNJbnB1dFJlZmVyZW5jZSA9IHN0cmluZyhpbnB1dFJlZmVyZW5jZSk7Ci0KLSAgICAgICAgYm9vbCBhc3luY01vZGVbMl0gPSB7dHJ1ZSwgZmFsc2V9OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAgICAgc2l6ZV90IGVsZVNpemUgPSBlbGVTdHJlYW0udGVsbGcoKTsKLSAgICAgICAgICAgIGVsZVN0cmVhbS5zZWVrZygwLCBpZnN0cmVhbTo6YmVnKTsKLQotICAgICAgICAgICAgLy8gR2V0IGVuY29kZXIgcGFyYW1zCi0gICAgICAgICAgICBlbmNQYXJhbWV0ZXIgZW5jUGFyYW1zOwotICAgICAgICAgICAgaWYgKCFzdHJuY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgewotICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsICZlbmNQYXJhbXMud2lkdGgpOwotICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCAmZW5jUGFyYW1zLmhlaWdodCk7Ci0gICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLCAmZW5jUGFyYW1zLmZyYW1lUmF0ZSk7Ci0gICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgJmVuY1BhcmFtcy5iaXRyYXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoZW5jUGFyYW1zLmJpdHJhdGUgPD0gMCB8fCBlbmNQYXJhbXMuZnJhbWVSYXRlIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jUGFyYW1zLmZyYW1lUmF0ZSA9IEVOQ09ERV9ERUZBVUxUX0ZSQU1FX1JBVEU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc3RyY21wKG1pbWUsICJ2aWRlby8zZ3BwIikgfHwgIXN0cmNtcChtaW1lLCAidmlkZW8vbXA0di1lcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNQYXJhbXMuYml0cmF0ZSA9IEVOQ09ERV9NSU5fQklUX1JBVEUgLyogNjAwIEticHMgKi87Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNQYXJhbXMuYml0cmF0ZSA9IEVOQ09ERV9ERUZBVUxUX0JJVF9SQVRFIC8qIDggTWJwcyAqLzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1BST0ZJTEUsICZlbmNQYXJhbXMucHJvZmlsZSk7Ci0gICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9MRVZFTCwgJmVuY1BhcmFtcy5sZXZlbCk7Ci0gICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGRlY29kZXJGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jUGFyYW1zLmNvbG9yRm9ybWF0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgJmVuY1BhcmFtcy5zYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNQYXJhbXMubnVtQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIGVuY1BhcmFtcy5iaXRyYXRlID0gRU5DT0RFX0RFRkFVTFRfQVVESU9fQklUX1JBVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFbmNvZGVyICplbmNvZGVyID0gbmV3IEVuY29kZXIoKTsKLSAgICAgICAgICAgIGVuY29kZXItPnNldHVwRW5jb2RlcigpOwotICAgICAgICAgICAgc3RhdHVzID0gZW5jb2Rlci0+ZW5jb2RlKHNDb2RlY05hbWUsIGVsZVN0cmVhbSwgZWxlU2l6ZSwgYXN5bmNNb2RlW2ldLCBlbmNQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiltaW1lKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkVuY29kZXIgcmV0dXJuZWQgZXJyb3IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiRW5jb2RpbmcgY29tcGxldGUgd2l0aCBjb2RlYyAlcyBmb3IgYXN5bmNNb2RlID0gJWQiLCBzQ29kZWNOYW1lLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICBhc3luY01vZGVbaV0pOwotICAgICAgICAgICAgZW5jb2Rlci0+ZGVJbml0Q29kZWMoKTsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0YXRzRmlsZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoalN0YXRzRmlsZSwgbnVsbHB0cik7Ci0gICAgICAgICAgICBlbmNvZGVyLT5kdW1wU3RhdGlzdGljcyhzSW5wdXRSZWZlcmVuY2UsIGV4dHJhY3Rvci0+Z2V0Q2xpcER1cmF0aW9uKCksIHNDb2RlY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXN5bmNNb2RlW2ldID8gImFzeW5jIiA6ICJzeW5jIiksIHN0YXRzRmlsZSk7Ci0gICAgICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqU3RhdHNGaWxlLCBzdGF0c0ZpbGUpOwotICAgICAgICAgICAgZW5jb2Rlci0+cmVzZXRFbmNvZGVyKCk7Ci0gICAgICAgICAgICBkZWxldGUgZW5jb2RlcjsKLSAgICAgICAgICAgIGVuY29kZXIgPSBudWxscHRyOwotICAgICAgICB9Ci0gICAgICAgIGVsZVN0cmVhbS5jbG9zZSgpOwotICAgICAgICBpZiAob3V0RnApIHsKLSAgICAgICAgICAgIGZjbG9zZShvdXRGcCk7Ci0gICAgICAgICAgICBvdXRGcCA9IG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoakZpbGVOYW1lLCBpbnB1dFJlZmVyZW5jZSk7Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpDb2RlY05hbWUsIGNvZGVjTmFtZSk7Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpPdXRGaWxlUGF0aCwgb3V0cHV0RmlsZVBhdGgpOwotICAgICAgICBpZiAoZm9ybWF0KSB7Ci0gICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZvcm1hdCk7Ci0gICAgICAgICAgICBmb3JtYXQgPSBudWxscHRyOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZWNvZGVyRm9ybWF0KSB7Ci0gICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGRlY29kZXJGb3JtYXQpOwotICAgICAgICAgICAgZGVjb2RlckZvcm1hdCA9IG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgZGVjb2Rlci0+ZGVJbml0Q29kZWMoKTsKLSAgICAgICAgZGVjb2Rlci0+cmVzZXREZWNvZGVyKCk7CisgICAgICAgIGVuY29kZXItPmR1bXBTdGF0aXN0aWNzKGlucHV0UmVmZXJlbmNlLCBjbGlwRHVyYXRpb25Vcywgc0NvZGVjTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vZGUgPyAiYXN5bmMiIDogInN5bmMiKSwgc3RhdHNGaWxlKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoalN0YXRzRmlsZSwgc3RhdHNGaWxlKTsKKyAgICAgICAgZW5jb2Rlci0+cmVzZXRFbmNvZGVyKCk7CisgICAgICAgIGRlbGV0ZSBlbmNvZGVyOworICAgICAgICBlbmNvZGVyID0gbnVsbHB0cjsKICAgICB9Ci0gICAgaWYgKGlucHV0RnApIHsKLSAgICAgICAgZmNsb3NlKGlucHV0RnApOwotICAgICAgICBpbnB1dEZwID0gbnVsbHB0cjsKLSAgICB9Ci0gICAgZXh0cmFjdG9yLT5kZUluaXRFeHRyYWN0b3IoKTsKLSAgICBkZWxldGUgZGVjb2RlcjsKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqRmlsZVBhdGgsIGZpbGVQYXRoKTsKKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqRmlsZU5hbWUsIGZpbGVOYW1lKTsKKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqTWltZSwgbWltZSk7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoakNvZGVjTmFtZSwgY29kZWNOYW1lKTsKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvbGlicmFyeS9FbmNvZGVyLmphdmEgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvRW5jb2Rlci5qYXZhCmluZGV4IDQ1ZTU1NzQuLjc1NGNkOGUgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvbGlicmFyeS9FbmNvZGVyLmphdmEKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay9saWJyYXJ5L0VuY29kZXIuamF2YQpAQCAtMTc1LDEwICsxNzUsMTAgQEAKIAogICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoQE5vbk51bGwgTWVkaWFDb2RlYyBtZWRpYUNvZGVjLCBATm9uTnVsbCBDb2RlY0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lZGlhQ29kZWMuc3RvcCgpOwotICAgICAgICAgICAgICAgICAgICBtZWRpYUNvZGVjLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ29kZWNFcnJvcjogIiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvZGVjIEVycm9yOiAiICsgZS50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeyBtTG9jay5ub3RpZnkoKTsgfQogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay9saWJyYXJ5L05hdGl2ZS5qYXZhIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay9saWJyYXJ5L05hdGl2ZS5qYXZhCmluZGV4IDM4YjYwOGEuLjNlMzk2OWMgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvbGlicmFyeS9OYXRpdmUuamF2YQorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvTmF0aXZlLmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKICAgICBwdWJsaWMgbmF0aXZlIGludCBEZWNvZGUoU3RyaW5nIGlucHV0RmlsZVBhdGgsIFN0cmluZyBpbnB1dEZpbGVOYW1lLCBTdHJpbmcgc3RhdHNGaWxlLAogICAgICAgICAgICAgU3RyaW5nIGNvZGVjTmFtZSwgYm9vbGVhbiBhc3luY01vZGUpOwogCi0gICAgcHVibGljIG5hdGl2ZSBpbnQgRW5jb2RlKFN0cmluZyBpbnB1dEZpbGVQYXRoLCBTdHJpbmcgaW5wdXRGaWxlTmFtZSwgU3RyaW5nIG91dHB1dEZpbGVQYXRoLAotICAgICAgICAgICAgU3RyaW5nIHN0YXRzRmlsZSwgU3RyaW5nIGNvZGVjTmFtZSk7CisgICAgcHVibGljIG5hdGl2ZSBpbnQgRW5jb2RlKFN0cmluZyBpbnB1dEZpbGVQYXRoLCBTdHJpbmcgaW5wdXRGaWxlTmFtZSwgU3RyaW5nIHN0YXRzRmlsZSwKKyAgICAgICAgICAgIFN0cmluZyBjb2RlY05hbWUsIFN0cmluZyBtaW1lLCBpbnQgYml0UmF0ZSwgaW50IGNvbG9yRm9ybWF0LCBpbnQgZnJhbWVJbnRlcnZhbCwKKyAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHByb2ZpbGUsIGludCBsZXZlbCwgaW50IHNhbXBsZVJhdGUsIGludCBudW1DaGFubmVsKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9SRUFETUUubWQgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvUkVBRE1FLm1kCmluZGV4IDA1ZmJlNmYuLjA0N2MyODkgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9SRUFETUUubWQKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL1JFQURNRS5tZApAQCAtMSw3ICsxLDcgQEAKICMgQmVuY2htYXJrIHRlc3RzCiAKIEJlbmNobWFyayBhcHAgYW5hbHlzZXMgdGhlIHRpbWUgdGFrZW4gYnkgTWVkaWFDb2RlYywgTWVkaWFFeHRyYWN0b3IgYW5kIE1lZGlhTXV4ZXIgZm9yIGdpdmVuIHNldCBvZiBpbnB1dHMuIEl0IGlzIHVzZWQgdG8gYmVuY2htYXJrIHRoZXNlIG1vZHVsZXMgb24gYW5kcm9pZCBkZXZpY2VzLgotQmVuY2htYXJrIHJlc3VsdHMgYXJlIGVtaXR0ZWQgdG8gbG9nY2F0LgorQmVuY2htYXJrIHJlc3VsdHMgYXJlIHB1Ymxpc2hlZCBhcyBhIENTViByZXBvcnQuCiAKIFRoaXMgcGFnZSBkZXNjcmliZXMgc3RlcHMgdG8gcnVuIHRoZSBOREsgYW5kIFNESyBsYXllciB0ZXN0LgogCkBAIC0xMCwzNSArMTAsNDkgQEAKIG1tbSBmcmFtZXdvcmtzL2F2L21lZGlhL3Rlc3RzL2JlbmNobWFyay8KIGBgYAogCi0jIE5ESwotCi1UbyBydW4gdGhlIHRlc3Qgc3VpdGUgZm9yIG1lYXN1cmluZyBwZXJmb3JtYW5jZSBvZiB0aGUgbmF0aXZlIGxheWVyLCBmb2xsb3cgdGhlIGZvbGxvd2luZyBzdGVwczoKLQotVGhlIGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAkT1VUL2RhdGEvbmF0aXZldGVzdDY0LwotCi1hZGIgcHVzaCAkT1VUL2RhdGEvbmF0aXZldGVzdDY0LyogL2RhdGEvbG9jYWwvdG1wLwotCi1FZy4gYWRiIHB1c2ggJE9VVC9kYXRhL25hdGl2ZXRlc3Q2NC9leHRyYWN0b3JUZXN0L2V4dHJhY3RvclRlc3QgL2RhdGEvbG9jYWwvdG1wLwotCi1UbyBydW4gdGhlIGJpbmFyeSwgZm9sbG93IHRoZSBjb21tYW5kcyBtZW50aW9uZWQgYmVsb3cgdW5kZXIgZWFjaCBtb2R1bGUuCi0KLVRoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9kcml2ZS5nb29nbGUuY29tL29wZW4/aWQ9MWdoTXIxN0JCSjduMHBxYm03b1JFaVROX01OZW1KVXF5KQorIyBSZXNvdXJjZXMKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmsuemlwKQogCiBEb3dubG9hZCB0aGUgTWVkaWFCZW5jaG1hcmsuemlwIGZpbGUsIHVuemlwIGFuZCBwdXNoIGl0IHRvIC9kYXRhL2xvY2FsL3RtcC8gb24gdGhlIGRldmljZS4KIAogYGBgCiB1bnppcCBNZWRpYUJlbmNobWFyay56aXAKLWFkYiBwdXNoIE1lZGlhQmVuY2htYXJrIC9kYXRhL2xvY2FsL3RtcAorYWRiIHB1c2ggTWVkaWFCZW5jaG1hcmsgL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy8KIGBgYAogCitUaGUgcmVzb3VyY2UgZmlsZXMgYXJlIGFzc3VtZWQgdG8gYmUgYXQgL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy8uIFlvdSBjYW4gdXNlIGEgZGlmZmVyZW50IGxvY2F0aW9uLCBidXQgeW91IGhhdmUgdG8gbW9kaWZ5IHRoZSByZXN0IG9mIHRoZSBpbnN0cnVjdGlvbnMgdG8gcmVwbGFjZSAvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLyB3aXRoIHdoZXJldmVyIHlvdSBjaG9zZSB0byBwdXQgdGhlIGZpbGVzLgorCisjIE5ESyBDTEkgVGVzdHMKK05vdGU6IFtCZW5jaG1hcmsgQXBwbGljYXRpb25dKCNCZW5jaG1hcmtBcHBsaWNhdGlvbikgbm93IHN1cHBvcnRzIHByb2ZpbGluZyBib3RoIFNESyBhbmQgTkRLIEFQSXMgYW5kIHRoYXQgaXMgdGhlIHByZWZlcnJlZCB3YXkgdG8gYmVuY2htYXJrIGNvZGVjcworCitUbyBydW4gdGhlIHRlc3Qgc3VpdGUgZm9yIG1lYXN1cmluZyBwZXJmb3JtYW5jZSBvZiB0aGUgbmF0aXZlIGxheWVyLCBmb2xsb3cgdGhlIGZvbGxvd2luZyBzdGVwczoKKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KKworYWRiIHB1c2ggJE9VVC9kYXRhL25hdGl2ZXRlc3Q2NC8qIC9kYXRhL2xvY2FsL3RtcC8uIEZvciBleGFtcGxlCisKK2BgYAorYWRiIHB1c2ggJE9VVC9kYXRhL25hdGl2ZXRlc3Q2NC9leHRyYWN0b3JUZXN0L2V4dHJhY3RvclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KKworYWRiIHB1c2ggJE9VVC9kYXRhL25hdGl2ZXRlc3QvKiAvZGF0YS9sb2NhbC90bXAvLiBGb3IgZXhhbXBsZQorCitgYGAKK2FkYiBwdXNoICRPVVQvZGF0YS9uYXRpdmV0ZXN0L2V4dHJhY3RvclRlc3QvZXh0cmFjdG9yVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVG8gcnVuIHRoZSBiaW5hcnksIGZvbGxvdyB0aGUgY29tbWFuZHMgbWVudGlvbmVkIGJlbG93IHVuZGVyIGVhY2ggbW9kdWxlLgorCiAjIyBFeHRyYWN0b3IKIAogVGhlIHRlc3QgZXh0cmFjdHMgZWxlbWVudGFyeSBzdHJlYW0gYW5kIGJlbmNobWFya3MgdGhlIGV4dHJhY3RvcnMgYXZhaWxhYmxlIGluIE5ESy4KIAotVGhlIHJlc291cmNlIGZpbGVzIGFyZSBhc3N1bWVkIHRvIGJlIGF0IC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvLiBZb3UgY2FuIHVzZSBhIGRpZmZlcmVudCBsb2NhdGlvbiwgYnV0IHlvdSBoYXZlIHRvIG1vZGlmeSB0aGUgcmVzdCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIHRvIHJlcGxhY2UgL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy8gd2l0aCB3aGVyZXZlciB5b3UgY2hvc2UgdG8gcHV0IHRoZSBmaWxlcy4KLQotVGhlIHBhdGggdG8gdGhlc2UgZmlsZXMgb24gdGhlIGRldmljZSBpcyByZXF1aXJlZCB0byBiZSBnaXZlbiBmb3IgdGhlIHRlc3QuCi0KIGBgYAogYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9leHRyYWN0b3JUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvCiBgYGAKQEAgLTQ3LDggKzYxLDYgQEAKIAogVGhlIHRlc3QgZGVjb2RlcyBpbnB1dCBzdHJlYW0gYW5kIGJlbmNobWFya3MgdGhlIGRlY29kZXJzIGF2YWlsYWJsZSBpbiBOREsuCiAKLVNldHVwIHN0ZXBzIGFyZSBzYW1lIGFzIGV4dHJhY3Rvci4KLQogYGBgCiBhZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL2RlY29kZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvCiBgYGAKQEAgLTU3LDggKzY5LDYgQEAKIAogVGhlIHRlc3QgbXV4ZXMgZWxlbWVudGFyeSBzdHJlYW0gYW5kIGJlbmNobWFya3MgdGhlIG11eGVycyBhdmFpbGFibGUgaW4gTkRLLgogCi1TZXR1cCBzdGVwcyBhcmUgc2FtZSBhcyBleHRyYWN0b3IuCi0KIGBgYAogYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9tdXhlclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy8KIGBgYApAQCAtNjcsNTUgKzc3LDgyIEBACiAKIFRoZSB0ZXN0IGVuY29kZXMgaW5wdXQgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBlbmNvZGVycyBhdmFpbGFibGUgaW4gTkRLLgogCi1TZXR1cCBzdGVwcyBhcmUgc2FtZSBhcyBleHRyYWN0b3IuCi0KIGBgYAogYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9lbmNvZGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLwogYGBgCiAKLSMgU0RLCisjIDxhIG5hbWU9IkJlbmNobWFya0FwcGxpY2F0aW9uIj48L2E+IEJlbmNobWFyayBBcHBsaWNhdGlvbgorVG8gcnVuIHRoZSB0ZXN0IHN1aXRlIGZvciBtZWFzdXJpbmcgcGVyZm9ybWFuY2Ugb2YgdGhlIFNESyBhbmQgTkRLIEFQSXMsIGZvbGxvdyB0aGUgZm9sbG93aW5nIHN0ZXBzOgorQmVuY2htYXJrIEFwcGxpY2F0aW9uIGNhbiBiZSBydW4gaW4gdHdvIHdheXMuCiAKLVRvIHJ1biB0aGUgdGVzdCBzdWl0ZSBmb3IgbWVhc3VyaW5nIHBlcmZvcm1hbmNlIG9mIHRoZSBTREsgQVBJcywgZm9sbG93IHRoZSBmb2xsb3dpbmcgc3RlcHM6CisjIyBTdGVwcyB0byBydW4gd2l0aCBhdGVzdAorTm90ZSB0aGF0IGF0ZXN0IGNvbW1hbmQgd2lsbCBpbnN0YWxsIEJlbmNobWFyayBhcHBsaWNhdGlvbiBhbmQgcHVzaCB0aGUgcmVxdWlyZWQgdGVzdCBmaWxlcyB0byB0aGUgZGV2aWNlIGFzIHdlbGwuCisKK0ZvciBydW5uaW5nIGFsbCB0aGUgdGVzdHMsIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQKK2BgYAorYXRlc3QgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLnRlc3RzIC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYAorCitGb3IgcnVubmluZyB0aGUgdGVzdHMgaW5kaXZpZHVhbGx5LCBydW4gdGhlIGZvbGxvd2luZyBhdGVzdCBjb21tYW5kczoKKworYGBgCithdGVzdCBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsudGVzdHMuRXh0cmFjdG9yVGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCithdGVzdCBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsudGVzdHMuRGVjb2RlclRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYXRlc3QgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLnRlc3RzLk11eGVyVGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCithdGVzdCBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsudGVzdHMuRW5jb2RlclRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYGBgCisKKyMjIFN0ZXBzIHRvIHJ1biB3aXRob3V0IGF0ZXN0CiAKIFRoZSBhcGsgd2lsbCBiZSBjcmVhdGVkIGF0IHRoZSBmb2xsb3dpbmcgcGF0aDoKLSRPVVQvdGVzdGNhc2VzL01lZGlhQmVuY2htYXJrVGVzdC9hcm02NC8KIAotVG8gZ2V0IHRoZSByZXNvcmNlIGZpbGVzIGZvciB0aGUgdGVzdCBmb2xsb3cgaW5zdHJ1Y3Rpb25zIGdpdmVuIGluIFtOREtdKCNOREspCitUaGUgNjQtYml0IGFwayB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDoKKyRPVVQvdGVzdGNhc2VzL01lZGlhQmVuY2htYXJrVGVzdC9hcm02NC8KIAogRm9yIGluc3RhbGxpbmcgdGhlIGFwaywgcnVuIHRoZSBjb21tYW5kOgogYGBgCiBhZGIgaW5zdGFsbCAtZiAtciAkT1VUL3Rlc3RjYXNlcy9NZWRpYUJlbmNobWFya1Rlc3QvYXJtNjQvTWVkaWFCZW5jaG1hcmtUZXN0LmFwawogYGBgCiAKLUZvciBydW5uaW5nIGFsbCB0aGUgdGVzdHMsIHJ1biB0aGUgY29tbWFuZDoKK1RoZSAzMi1iaXQgYXBrIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOgorJE9VVC90ZXN0Y2FzZXMvTWVkaWFCZW5jaG1hcmtUZXN0L2FybS8KKworRm9yIGluc3RhbGxpbmcgdGhlIGFwaywgcnVuIHRoZSBjb21tYW5kOgorYGBgCithZGIgaW5zdGFsbCAtZiAtciAkT1VUL3Rlc3RjYXNlcy9NZWRpYUJlbmNobWFya1Rlc3QvYXJtL01lZGlhQmVuY2htYXJrVGVzdC5hcGsKK2BgYAorCitUbyBnZXQgdGhlIHJlc291cmNlIGZpbGVzIGZvciB0aGUgdGVzdCBmb2xsb3cgaW5zdHJ1Y3Rpb25zIGdpdmVuIGluIFtSZXNvdXJjZXNdKCNSZXNvdXJjZXMpCisKK0ZvciBydW5uaW5nIGFsbCB0aGUgdGVzdHMsIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQKIGBgYAogYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgLXIgLWUgcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsudGVzdHMgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrL2FuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lcgogYGBgCiAKICMjIEV4dHJhY3RvcgogCi1UaGUgdGVzdCBleHRyYWN0cyBlbGVtZW50YXJ5IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgZXh0cmFjdG9ycyBhdmFpbGFibGUgaW4gU0RLLgorVGhlIHRlc3QgZXh0cmFjdHMgZWxlbWVudGFyeSBzdHJlYW0gYW5kIGJlbmNobWFya3MgdGhlIGV4dHJhY3RvcnMgYXZhaWxhYmxlIGluIFNESyBhbmQgTkRLLgogYGBgCiBhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyAtciAtZSBjbGFzcyAnY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLnRlc3RzLkV4dHJhY3RvclRlc3QnIGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay9hbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIKIGBgYAogCiAjIyBEZWNvZGVyCiAKLVRoZSB0ZXN0IGRlY29kZXMgaW5wdXQgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBkZWNvZGVycyBhdmFpbGFibGUgaW4gU0RLLgorVGhlIHRlc3QgZGVjb2RlcyBpbnB1dCBzdHJlYW0gYW5kIGJlbmNobWFya3MgdGhlIGRlY29kZXJzIGF2YWlsYWJsZSBpbiBTREsgYW5kIE5ESy4KIGBgYAogYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgLXIgLWUgY2xhc3MgJ2NvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0cy5EZWNvZGVyVGVzdCcgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrL2FuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lcgogYGBgCiAKICMjIE11eGVyCiAKLVRoZSB0ZXN0IG11eGVzIGVsZW1lbnRhcnkgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIGRpZmZlcmVudCB3cml0ZXJzIGF2YWlsYWJsZSBpbiBTREsuCitUaGUgdGVzdCBtdXhlcyBlbGVtZW50YXJ5IHN0cmVhbSBhbmQgYmVuY2htYXJrcyBkaWZmZXJlbnQgd3JpdGVycyBhdmFpbGFibGUgaW4gU0RLIGFuZCBOREsuCiBgYGAKIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IC1yIC1lIGNsYXNzICdjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsudGVzdHMuTXV4ZXJUZXN0JyBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsvYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyCiBgYGAKIAogIyMgRW5jb2RlcgogCi1UaGUgdGVzdCBlbmNvZGVzIGlucHV0IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgZW5jb2RlcnMgYXZhaWxhYmxlIGluIFNESy4KK1RoZSB0ZXN0IGVuY29kZXMgaW5wdXQgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBlbmNvZGVycyBhdmFpbGFibGUgaW4gU0RLIGFuZCBOREsuCiBgYGAKIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IC1yIC1lIGNsYXNzICdjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsudGVzdHMuRW5jb2RlclRlc3QnIGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay9hbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIKIGBgYApAQCAtMTI0LDI0ICsxNjEsMjcgQEAKIFRvIHJ1biB0aGUgdGVzdCBzdWl0ZSBmb3IgbWVhc3VyaW5nIHBlcmZvcm1hbmNlIG9mIHRoZSBjb2RlYzIgbGF5ZXIsIGZvbGxvdyB0aGUgZm9sbG93aW5nIHN0ZXBzOgogCiBUaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LworCiBUaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCiAKIFRvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgogYWRiIHB1c2ggJChPVVQpL2RhdGEvbmF0aXZldGVzdDY0LyogL2RhdGEvbG9jYWwvdG1wLwotRWcuIGFkYiBwdXNoICQoT1VUKS9kYXRhL25hdGl2ZXRlc3Q2NC9DMkRlY29kZXJUZXN0L0MyRGVjb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCithZGIgcHVzaCAkKE9VVCkvZGF0YS9uYXRpdmV0ZXN0NjQvQzJEZWNvZGVyVGVzdC9DMkRlY29kZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAogCiBUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCiBhZGIgcHVzaCAkKE9VVCkvZGF0YS9uYXRpdmV0ZXN0LyogL2RhdGEvbG9jYWwvdG1wLwotRWcuIGFkYiBwdXNoICQoT1VUKS9kYXRhL25hdGl2ZXRlc3QvQzJEZWNvZGVyVGVzdC9DMkRlY29kZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorYWRiIHB1c2ggJChPVVQpL2RhdGEvbmF0aXZldGVzdC9DMkRlY29kZXJUZXN0L0MyRGVjb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCiAKLVRvIGdldCB0aGUgcmVzb3VyY2UgZmlsZXMgZm9yIHRoZSB0ZXN0IGZvbGxvdyBpbnN0cnVjdGlvbnMgZ2l2ZW4gaW4gW05ES10oI05ESykKK1RvIGdldCB0aGUgcmVzb3VyY2UgZmlsZXMgZm9yIHRoZSB0ZXN0IGZvbGxvdyBpbnN0cnVjdGlvbnMgZ2l2ZW4gaW4gW1Jlc291cmNlc10oI1Jlc291cmNlcykKIAogIyMgQzIgRGVjb2RlcgogCiBUaGUgdGVzdCBkZWNvZGVzIGlucHV0IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgY29kZWMyIGRlY29kZXJzIGF2YWlsYWJsZSBpbiBkZXZpY2UuCiAKLVNldHVwIHN0ZXBzIGFyZSBzYW1lIGFzIFtleHRyYWN0b3JdKCNleHRyYWN0b3IpLgotCiBgYGAKIGFkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvQzJEZWNvZGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLwogYGBgCkBAIC0xNDksOCArMTg5LDk1IEBACiAKIFRoZSB0ZXN0IGVuY29kZXMgaW5wdXQgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBjb2RlYzIgZW5jb2RlcnMgYXZhaWxhYmxlIGluIGRldmljZS4KIAotU2V0dXAgc3RlcHMgYXJlIHNhbWUgYXMgW2V4dHJhY3Rvcl0oI2V4dHJhY3RvcikuCi0KIGBgYAogYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9DMkVuY29kZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvCiBgYGAKKworIyBBbmFseXNpcworCitUaGUgYmVuY2htYXJrIHJlc3VsdHMgYXJlIHN0b3JlZCBpbiBhIENTViBmaWxlIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBhbmFseXNpcy4gVGhlc2UgcmVzdWx0cyBhcmUgc3RvcmVkIGluIGZvbGxvd2luZyBmb3JtYXQ6Cis8YXBwIGRpcmVjdG9yeT4vPG1vZHVsZV9uYW1lPi48dGltZXN0YW1wPi5jc3YKKworTm90ZTogVGhpcyB0aW1lc3RhbXAgaXMgaW4gbmFubyBzZWNvbmRzIGFuZCB3aWxsIGNoYW5nZSBiYXNlZCBvbiBjdXJyZW50IHN5c3RlbSB0aW1lLgorCitUbyBmaW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgQ1NWIGZpbGUsIGxvb2sgZm9yIHRoZSBwYXRoIGluIGxvZ3MuIEV4YW1wbGUgbG9nIGJlbG93IC0KKworYGBgCitjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsgRC9EZWNvZGVyVGVzdDogU2F2aW5nIEJlbmNobWFyayByZXN1bHRzIGluOiAvc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsvZmlsZXMvRGVjb2Rlci4xNTg3NzMyMzk1Mzg3LmNzdgorYGBgCisKK1RoaXMgZmlsZSBjYW4gYmUgcHVsbGVkIGZyb20gdGhlIGRldmljZSB1c2luZyAiYWRiIHB1bGwiIGNvbW1hbmQuCitgYGAKK2FkYiBwdWxsIC9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay9maWxlcy9EZWNvZGVyLjE1ODc3MzIzOTUzODcuY3N2IC4vRGVjb2Rlci4xNTg3NzMyMzk1Mzg3LmNzdgorYGBgCisKKyMjIENTViBDb2x1bW5zCisKK0ZvbGxvd2luZyBjb2x1bW5zIGFyZSBhdmFpbGFibGUgaW4gQ1NWLgorCitOb3RlOiBBbGwgdGltZSB2YWx1ZXMgYXJlIGluIG5hbm8gc2Vjb25kcworCisxLiAqKmN1cnJlbnRUaW1lKiogOiBUaGUgdGltZSByZWNvcmRlZCBhdCB0aGUgY3JlYXRpb24gb2YgdGhlIHN0YXRzLiBUaGlzIG1heSBiZSB1c2VkIHRvIGVzdGltYXRlIHRpbWUgYmV0d2VlbiBjb25zZWN1dGl2ZSB0ZXN0IGNsaXBzLgorCisyLiAqKmZpbGVOYW1lKio6IFRoZSBmaWxlIGJlaW5nIHVzZWQgYXMgYW4gaW5wdXQgZm9yIHRoZSBiZW5jaG1hcmsgdGVzdC4KKworMy4gKipvcGVyYXRpb24qKjogVGhlIGN1cnJlbnQgb3BlcmF0aW9uIG9uIHRoZSBpbnB1dCB0ZXN0IHZlY3RvciBpLmUuIEV4dHJhY3QvTXV4L0VuY29kZS9EZWNvZGUuCisKKzQuICoqTkRLL1NESyoqOiBUaGUgdGFyZ2V0IEFQSXMgaS5lLiBBTWVkaWEgdnMgTWVkaWEgY2FsbHMgZm9yIHRoZSBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkLgorCis1LiAqKnN5bmMvYXN5bmMqKjogVGhpcyBpcyBzcGVjaWZpYyB0byBNZWRpYUNvZGVjIG9iamVjdHMgKGkuZS4gRW5jb2RlciBhbmQgRGVjb2RlcikuIEl0IHNwZWNpZmllcyB0aGUgbW9kZSBpbiB3aGljaCBNZWRpYUNvZGVjIEFQSXMgYXJlIHdvcmtpbmcuIEZvciBhc3luYyBtb2RlLCBjYWxsYmFja3MgYXJlIHNldC4gRm9yIHN5bmMgbW9kZSwgd2UgaGF2ZSB0byBwb2xsIHRoZSBkZXF1ZXVlQnVmZmVyIEFQSXMgdG8gcXVldWUgYW5kIGRlcXVldWUgaW5wdXQgb3V0cHV0IGJ1ZmZlcnMgcmVzcGVjdGl2ZWx5LgorCis2LiAqKnNldHVwVGltZSoqOiBUaGUgdGltZSB0YWtlbiB0byBzZXQgdXAgdGhlIE1lZGlhRXh0cmFjdG9yL011eGVyL0NvZGVjIGluc3RhbmNlLgorCisgICAgKiBNZWRpYUNvZGVjOiBpbmNsdWRlcyBzZXR0aW5nIGFzeW5jL3N5bmMgbW9kZSwgY29uZmlndXJpbmcgd2l0aCBhIGZvcm1hdCBhbmQgY29kZWMuc3RhcnQKKworICAgICogTWVkaWFFeHRyYWN0b3I6IGluY2x1ZGVzIEFNZWRpYUV4dHJhY3Rvcl9uZXcgYW5kIHNldERhdGFTb3VyY2UuCisKKyAgICAqIE1lZGlhTXV4ZXI6IGluY2x1ZGVzIGNyZWF0aW5nIHRoZSBvYmplY3QsIGFkZGluZyB0cmFjaywgYW5kIHN0YXJ0aW5nIHRoZSBtdXhlci4KKworNy4gKipkZXN0cm95VGltZSoqOiBUaGUgdGltZSB0YWtlbiB0byBzdG9wIGFuZCBjbG9zZSBNZWRpYUV4dHJhY3Rvci9NdXhlci9Db2RlYyBpbnN0YW5jZS4KKworOC4gKiptaW5pbXVtVGltZSoqOiBUaGUgbWluaW11bSB0aW1lIHRha2VuIHRvIGV4dHJhY3QvbXV4L2VuY29kZS9kZWNvZGUgYSBmcmFtZS4KKworOS4gKiptYXhpbXVtVGltZSoqOiBUaGUgbWF4aW11bSB0aW1lIHRha2VuIHRvIGV4dHJhY3QvbXV4L2VuY29kZS9kZWNvZGUgYSBmcmFtZS4KKworMTAuICoqYXZlcmFnZVRpbWUqKjogQXZlcmFnZSB0aW1lIHRha2VuIHRvIGV4dHJhY3QvbXV4L2VuY29kZS9kZWNvZGUgcGVyIGZyYW1lLgorCisgICAgKiBNZWRpYUNvZGVjOiBjb21wdXRlZCBhcyB0aGUgdG90YWwgdGltZSB0YWtlbiB0byBlbmNvZGUvZGVjb2RlIGFsbCBmcmFtZXMgZGl2aWRlZCBieSB0aGUgbnVtYmVyIG9mIGZyYW1lcyBlbmNvZGVkL2RlY29kZWQuCisKKyAgICAqIE1lZGlhRXh0cmFjdG9yOiBjb21wdXRlZCBhcyB0aGUgdG90YWwgdGltZSB0YWtlbiB0byBleHRyYWN0IGFsbCBmcmFtZXMgZGl2aWRlZCBieSB0aGUgbnVtYmVyIG9mIGZyYW1lcyBleHRyYWN0ZWQuCisKKyAgICAqIE1lZGlhTXV4ZXI6IGNvbXB1dGVkIGFzIHRoZSB0b3RhbCB0aW1lIHRha2VuIHRvIG11eCBhbGwgZnJhbWVzIGRpdmlkZWQgYnkgdGhlIG51bWJlciBvZiBmcmFtZXMgbXV4ZWQuCisKKzExLiAqKnRpbWVUb1Byb2Nlc3MxU2VjQ29udGVudCoqOiBUaGUgdGltZSByZXF1aXJlZCB0byBwcm9jZXNzIG9uZSBzZWNvbmQgd29ydGggaW5wdXQgZGF0YS4KKworMTIuICoqdG90YWxCeXRlc1Byb2Nlc3NlZFBlclNlYyoqOiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGV4dHJhY3RlZC9tdXhlZC9kZWNvZGVkL2VuY29kZWQgcGVyIHNlY29uZC4KKworMTMuICoqdGltZVRvRmlyc3RGcmFtZSoqOiBUaGUgdGltZSB0YWtlbiB0byByZWNlaXZlIHRoZSBmaXJzdCBvdXRwdXQgZnJhbWUuCisKKzE0LiAqKnRvdGFsU2l6ZUluQnl0ZXMqKjogVGhlIHRvdGFsIG91dHB1dCBzaXplIG9mIHRoZSBvcGVyYXRpb24gKGluIGJ5dGVzKS4KKworMTUuICoqdG90YWxUaW1lKio6IFRoZSB0aW1lIHRha2VuIHRvIHBlcmZvcm0gdGhlIGNvbXBsZXRlIG9wZXJhdGlvbiAoaS5lLiBFeHRyYWN0L011eC9EZWNvZGUvRW5jb2RlKSBmb3IgcmVzcGVjdGl2ZSB0ZXN0IHZlY3Rvci4KKworCisjIyBNdXhlcgorMS4gKipjb21wb25lbnROYW1lKio6IFRoZSBmb3JtYXQgb2YgdGhlIG91dHB1dCBNZWRpYSBmaWxlLiBGb2xsb3dpbmcgbXV4ZXJzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkOgorICAgICAqIE9nZywgV2VibSwgM2dwcCwgYW5kIG1wNC4KKworIyMgRGVjb2RlcgorMS4gKipjb21wb25lbnROYW1lKio6IEluY2x1ZGVzIGFsbCBzdXBwb3J0ZWQgY29kZWNzIG9uIHRoZSBkZXZpY2UuIEFsaWFzZWQgY29tcG9uZW50cyBhcmUgc2tpcHBlZC4KKyAgICAqICAgVmlkZW86IEgyNjMsIEgyNjQsIEgyNjUsIFZQeCwgTXBlZzQsIE1wZWcyLCBBVjEKKyAgICAqICAgQXVkaW86IEFBQywgRmxhYywgT3B1cywgTVAzLCBWb3JiaXMsIEdTTSwgQU1SLU5CL1dCCisKKyMjIEVuY29kZXIKKzEuICoqY29tcG9uZW50TmFtZSoqOiBJbmNsdWRlcyBhbGwgc3VwcG9ydGVkIGNvZGVjcyBvbiB0aGUgZGV2aWNlLiBBbGlhc2VkIGNvbXBvbmVudHMgYXJlIHNraXBwZWQuCisgICAgKiAgIFZpZGVvOiBIMjYzLCBIMjY0LCBIMjY1LCBWUHgsIE1wZWc0CisgICAgKiAgIEF1ZGlvOiBBQUMsIEZsYWMsIE9wdXMsIEFNUi1OQi9XQgorCisjIyBDb21tb24gRmFpbHVyZXMKK09uIHNvbWUgZGV2aWNlcywgaWYgYSBjb2RlYyBpc24ndCBzdXBwb3J0ZWQgc29tZSB0ZXN0cyBtYXkgcmVwb3J0IGEgZmFpbHVyZSBsaWtlICJjb2RlYyBub3QgZm91bmQgZm9yIgorCitGb3IgZXhhbXBsZTogT24gbW9iaWxlIGRldmljZXMgd2l0aG91dCBzdXBwb3J0IGZvciBtcGVnMiBkZWNvZGVyLCBmb2xsb3dpbmcgZmFpbHVyZSBpcyBvYnNlcnZlZDoKK2BgYAorVW5hYmxlIHRvIGNyZWF0ZSBjb2RlYyBieSBtaW1lOiB2aWRlby9tcGVnMgorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9jb21tb24vQW5kcm9pZC5icCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi9BbmRyb2lkLmJwCmluZGV4IGQ0Mzg5ZGEuLjZiNTRjNmEgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYm1lZGlhYmVuY2htYXJrX2NvbW1vbiIsCiAgICAgZGVmYXVsdHM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2RlY29kZXIvQW5kcm9pZC5icCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2RlY29kZXIvQW5kcm9pZC5icAppbmRleCA5NzkxYzExLi42MDFiMmY2IDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9kZWNvZGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYm1lZGlhYmVuY2htYXJrX2RlY29kZXIiLAogICAgIGRlZmF1bHRzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9kZWNvZGVyL0MyRGVjb2Rlci5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9kZWNvZGVyL0MyRGVjb2Rlci5jcHAKaW5kZXggMjBhMTQ2OC4uNDZjNGE3YyAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9DMkRlY29kZXIuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2RlY29kZXIvQzJEZWNvZGVyLmNwcApAQCAtMTU2LDkgKzE1NiwxMSBAQAogICAgIG1TdGF0cy0+c2V0RGVJbml0VGltZSh0aW1lVGFrZW4pOwogfQogCi12b2lkIEMyRGVjb2Rlcjo6ZHVtcFN0YXRpc3RpY3Moc3RyaW5nIGlucHV0UmVmZXJlbmNlLCBpbnQ2NF90IGR1cmF0aW9uVXMpIHsKK3ZvaWQgQzJEZWNvZGVyOjpkdW1wU3RhdGlzdGljcyhzdHJpbmcgaW5wdXRSZWZlcmVuY2UsIGludDY0X3QgZHVyYXRpb25Vcywgc3RyaW5nIGNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0YXRzRmlsZSkgewogICAgIHN0cmluZyBvcGVyYXRpb24gPSAiYzJkZWNvZGUiOwotICAgIG1TdGF0cy0+ZHVtcFN0YXRpc3RpY3Mob3BlcmF0aW9uLCBpbnB1dFJlZmVyZW5jZSwgZHVyYXRpb25Vcyk7CisgICAgc3RyaW5nIG1vZGUgPSAiYXN5bmMiOworICAgIG1TdGF0cy0+ZHVtcFN0YXRpc3RpY3Mob3BlcmF0aW9uLCBpbnB1dFJlZmVyZW5jZSwgZHVyYXRpb25VcywgY29tcG9uZW50TmFtZSwgbW9kZSwgc3RhdHNGaWxlKTsKIH0KIAogdm9pZCBDMkRlY29kZXI6OnJlc2V0RGVjb2RlcigpIHsKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2RlY29kZXIvQzJEZWNvZGVyLmggYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9kZWNvZGVyL0MyRGVjb2Rlci5oCmluZGV4IDRhM2ViOTYuLmZiMzVhNjYgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2RlY29kZXIvQzJEZWNvZGVyLmgKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9DMkRlY29kZXIuaApAQCAtMzEsNyArMzEsOCBAQAogCiAgICAgdm9pZCBkZUluaXRDb2RlYygpOwogCi0gICAgdm9pZCBkdW1wU3RhdGlzdGljcyhzdHJpbmcgaW5wdXRSZWZlcmVuY2UsIGludDY0X3QgZHVyYXRpb25Vcyk7CisgICAgdm9pZCBkdW1wU3RhdGlzdGljcyhzdHJpbmcgaW5wdXRSZWZlcmVuY2UsIGludDY0X3QgZHVyYXRpb25Vcywgc3RyaW5nIGNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3RhdHNGaWxlKTsKIAogICAgIHZvaWQgcmVzZXREZWNvZGVyKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvQW5kcm9pZC5icCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvQW5kcm9pZC5icAppbmRleCA4ZGU3ODIzLi5hNzg3MDY4IDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYm1lZGlhYmVuY2htYXJrX2VuY29kZXIiLAogICAgIGRlZmF1bHRzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0MyRW5jb2Rlci5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0MyRW5jb2Rlci5jcHAKaW5kZXggMzM0MjllZi4uNmE1MGQ0MCAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9DMkVuY29kZXIuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvQzJFbmNvZGVyLmNwcApAQCAtMjUxLDkgKzI1MSwxMSBAQAogICAgIG1TdGF0cy0+c2V0RGVJbml0VGltZSh0aW1lVGFrZW4pOwogfQogCi12b2lkIEMyRW5jb2Rlcjo6ZHVtcFN0YXRpc3RpY3Moc3RyaW5nIGlucHV0UmVmZXJlbmNlLCBpbnQ2NF90IGR1cmF0aW9uVXMpIHsKK3ZvaWQgQzJFbmNvZGVyOjpkdW1wU3RhdGlzdGljcyhzdHJpbmcgaW5wdXRSZWZlcmVuY2UsIGludDY0X3QgZHVyYXRpb25Vcywgc3RyaW5nIGNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0YXRzRmlsZSkgewogICAgIHN0cmluZyBvcGVyYXRpb24gPSAiYzJlbmNvZGUiOwotICAgIG1TdGF0cy0+ZHVtcFN0YXRpc3RpY3Mob3BlcmF0aW9uLCBpbnB1dFJlZmVyZW5jZSwgZHVyYXRpb25Vcyk7CisgICAgc3RyaW5nIG1vZGUgPSAiYXN5bmMiOworICAgIG1TdGF0cy0+ZHVtcFN0YXRpc3RpY3Mob3BlcmF0aW9uLCBpbnB1dFJlZmVyZW5jZSwgZHVyYXRpb25VcywgY29tcG9uZW50TmFtZSwgbW9kZSwgc3RhdHNGaWxlKTsKIH0KIAogdm9pZCBDMkVuY29kZXI6OnJlc2V0RW5jb2RlcigpIHsKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvQzJFbmNvZGVyLmggYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0MyRW5jb2Rlci5oCmluZGV4IGE0Y2EwOTcuLjdhMDIxZjQgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvQzJFbmNvZGVyLmgKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9DMkVuY29kZXIuaApAQCAtNDQsNyArNDQsOCBAQAogCiAgICAgdm9pZCBkZUluaXRDb2RlYygpOwogCi0gICAgdm9pZCBkdW1wU3RhdGlzdGljcyhzdHJpbmcgaW5wdXRSZWZlcmVuY2UsIGludDY0X3QgZHVyYXRpb25Vcyk7CisgICAgdm9pZCBkdW1wU3RhdGlzdGljcyhzdHJpbmcgaW5wdXRSZWZlcmVuY2UsIGludDY0X3QgZHVyYXRpb25Vcywgc3RyaW5nIGNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3RhdHNGaWxlKTsKIAogICAgIHZvaWQgcmVzZXRFbmNvZGVyKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvRW5jb2Rlci5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0VuY29kZXIuY3BwCmluZGV4IDI2ZmIxYjkuLjE1YzQ3OWQgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9FbmNvZGVyLmNwcApAQCAtMjAzLDEzICsyMDMsMTMgQEAKICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsIG1QYXJhbXMud2lkdGgpOwogICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsIG1QYXJhbXMuaGVpZ2h0KTsKICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSwgbVBhcmFtcy5mcmFtZVJhdGUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9JX0ZSQU1FX0lOVEVSVkFMLCBtUGFyYW1zLmlGcmFtZUludGVydmFsKTsKICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIG1QYXJhbXMuYml0cmF0ZSk7Ci0gICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0lfRlJBTUVfSU5URVJWQUwsIDEpOwotICAgICAgICBpZiAobVBhcmFtcy5wcm9maWxlICYmIG1QYXJhbXMubGV2ZWwpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFULCBtUGFyYW1zLmNvbG9yRm9ybWF0KTsKKyAgICAgICAgaWYgKG1QYXJhbXMucHJvZmlsZSAhPSAtMSAmJiBtUGFyYW1zLmxldmVsICE9IC0xKSB7CiAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFLCBtUGFyYW1zLnByb2ZpbGUpOwogICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTEVWRUwsIG1QYXJhbXMubGV2ZWwpOwogICAgICAgICB9Ci0gICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVCwgbVBhcmFtcy5jb2xvckZvcm1hdCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIG1QYXJhbXMuc2FtcGxlUmF0ZSk7CiAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIG1QYXJhbXMubnVtQ2hhbm5lbHMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9FbmNvZGVyLmggYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0VuY29kZXIuaAppbmRleCA1YWQxNDJiLi4zMjQzMTdjIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0VuY29kZXIuaAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0VuY29kZXIuaApAQCAtMjMsMTAgKzIzLDExIEBACiAjaW5jbHVkZSA8cXVldWU+CiAjaW5jbHVkZSA8dGhyZWFkPgogCi0jaW5jbHVkZSAibWVkaWEvTmRrSW1hZ2UuaCIKICNpbmNsdWRlICJCZW5jaG1hcmtDb21tb24uaCIKICNpbmNsdWRlICJTdGF0cy5oIgogCisvLyBjb25zdGFudCBub3QgZGVmaW5lZCBpbiBOREsgYXBpCitjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZSA9IDB4N0Y0MjA4ODg7CiAKIHN0cnVjdCBlbmNQYXJhbWV0ZXIgewogICAgIGludDMyX3QgYml0cmF0ZSA9IC0xOwpAQCAtMzgsOSArMzksMTAgQEAKICAgICBpbnQzMl90IHdpZHRoID0gMDsKICAgICBpbnQzMl90IGhlaWdodCA9IDA7CiAgICAgaW50MzJfdCBmcmFtZVJhdGUgPSAtMTsKLSAgICBpbnQzMl90IHByb2ZpbGUgPSAwOwotICAgIGludDMyX3QgbGV2ZWwgPSAwOwotICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4OworICAgIGludDMyX3QgaUZyYW1lSW50ZXJ2YWwgPSAwOworICAgIGludDMyX3QgcHJvZmlsZSA9IC0xOworICAgIGludDMyX3QgbGV2ZWwgPSAtMTsKKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CiB9OwogCiBjbGFzcyBFbmNvZGVyIDogcHVibGljIENhbGxCYWNrSGFuZGxlIHsKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2V4dHJhY3Rvci9BbmRyb2lkLmJwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZXh0cmFjdG9yL0FuZHJvaWQuYnAKaW5kZXggN2VkOTQ3Ni4uNDk0Njk5MCAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZXh0cmFjdG9yL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZXh0cmFjdG9yL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlibWVkaWFiZW5jaG1hcmtfZXh0cmFjdG9yIiwKICAgICBkZWZhdWx0czogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvbXV4ZXIvQW5kcm9pZC5icCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL211eGVyL0FuZHJvaWQuYnAKaW5kZXggZjY2OWQ0YS4uODQ5ODVlNCAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvbXV4ZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9tdXhlci9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYm1lZGlhYmVuY2htYXJrX211eGVyIiwKICAgICBkZWZhdWx0czogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQW5kcm9pZC5icAppbmRleCBmNDZmYTRhLi4wZmJkMjBkIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogImV4dHJhY3RvclRlc3QiLAogICAgIGd0ZXN0OiB0cnVlLApkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0JlbmNobWFya1Rlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0JlbmNobWFya1Rlc3RFbnZpcm9ubWVudC5oCmluZGV4IGFlMmVlZTEuLjRlZGIwNDggMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9CZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQuaAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQmVuY2htYXJrVGVzdEVudmlyb25tZW50LmgKQEAgLTI1LDcgKzI1LDkgQEAKIAogY2xhc3MgQmVuY2htYXJrVGVzdEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgewogICBwdWJsaWM6Ci0gICAgQmVuY2htYXJrVGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9zZGNhcmQvbWVkaWEvIikge30KKyAgICBCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQoKQorICAgICAgICA6IHJlcygiL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy8iKSwKKyAgICAgICAgICBzdGF0c0ZpbGUoIi9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvc3RhdHMuY3N2Iikge30KIAogICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50CiAgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwpAQCAtMzQsOCArMzYsMTUgQEAKIAogICAgIGNvbnN0IHN0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KIAorICAgIHZvaWQgc2V0U3RhdHNGaWxlKGNvbnN0IHN0cmluZyBtb2R1bGUpIHsgc3RhdHNGaWxlID0gZ2V0UmVzKCkgKyBtb2R1bGU7IH0KKworICAgIGNvbnN0IHN0cmluZyBnZXRTdGF0c0ZpbGUoKSBjb25zdCB7IHJldHVybiBzdGF0c0ZpbGU7IH0KKworICAgIGJvb2wgd3JpdGVTdGF0c0hlYWRlcigpOworCiAgIHByaXZhdGU6CiAgICAgc3RyaW5nIHJlczsKKyAgICBzdHJpbmcgc3RhdHNGaWxlOwogfTsKIAogaW50IEJlbmNobWFya1Rlc3RFbnZpcm9ubWVudDo6aW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikgewpAQCAtNzAsNCArNzksMjYgQEAKICAgICByZXR1cm4gMDsKIH0KIAorLyoqCisgKiBXcml0ZXMgdGhlIHN0YXRzIGhlYWRlciB0byBhIGZpbGUKKyAqIDxwPgorICogXHBhcmFtIHN0YXRzRmlsZSAgICBmaWxlIHdoZXJlIHRoZSBzdGF0cyBkYXRhIGlzIHRvIGJlIHdyaXR0ZW4KKyAqKi8KK2Jvb2wgQmVuY2htYXJrVGVzdEVudmlyb25tZW50Ojp3cml0ZVN0YXRzSGVhZGVyKCkgeworICAgIGNoYXIgc3RhdHNIZWFkZXJbXSA9CisgICAgICAgICJjdXJyZW50VGltZSwgZmlsZU5hbWUsIG9wZXJhdGlvbiwgY29tcG9uZW50TmFtZSwgTkRLL1NESywgc3luYy9hc3luYywgc2V0dXBUaW1lLCAiCisgICAgICAgICJkZXN0cm95VGltZSwgbWluaW11bVRpbWUsIG1heGltdW1UaW1lLCBhdmVyYWdlVGltZSwgdGltZVRvUHJvY2VzczFTZWNDb250ZW50LCAiCisgICAgICAgICJ0b3RhbEJ5dGVzUHJvY2Vzc2VkUGVyU2VjLCB0aW1lVG9GaXJzdEZyYW1lLCB0b3RhbFNpemVJbkJ5dGVzLCB0b3RhbFRpbWVcbiI7CisgICAgRklMRSAqZnBTdGF0cyA9IGZvcGVuKHN0YXRzRmlsZS5jX3N0cigpLCAidyIpOworICAgIGlmKCFmcFN0YXRzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaW50MzJfdCBudW1CeXRlcyA9IGZ3cml0ZShzdGF0c0hlYWRlciwgc2l6ZW9mKGNoYXIpLCBzaXplb2Yoc3RhdHNIZWFkZXIpLCBmcFN0YXRzKTsKKyAgICBmY2xvc2UoZnBTdGF0cyk7CisgICAgaWYobnVtQnl0ZXMgIT0gc2l6ZW9mKHN0YXRzSGVhZGVyKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCiAjZW5kaWYgIC8vIF9fQkVOQ0hNQVJLX1RFU1RfRU5WSVJPTk1FTlRfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQzJEZWNvZGVyVGVzdC5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQzJEZWNvZGVyVGVzdC5jcHAKaW5kZXggZGVkYzc0My4uODVkY2JjMSAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0MyRGVjb2RlclRlc3QuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9DMkRlY29kZXJUZXN0LmNwcApAQCAtMTM2LDcgKzEzNiw4IEBACiAgICAgICAgICAgICAgICAgbURlY29kZXItPmRlSW5pdENvZGVjKCk7CiAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gZXh0cmFjdG9yLT5nZXRDbGlwRHVyYXRpb24oKTsKICAgICAgICAgICAgICAgICBBTE9HVigiY29kZWMgOiAlcyIsIGNvZGVjTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBtRGVjb2Rlci0+ZHVtcFN0YXRpc3RpY3MoR2V0UGFyYW0oKS5maXJzdCwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgbURlY29kZXItPmR1bXBTdGF0aXN0aWNzKEdldFBhcmFtKCkuZmlyc3QsIGR1cmF0aW9uVXMsIGNvZGVjTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0Vudi0+Z2V0U3RhdHNGaWxlKCkpOwogICAgICAgICAgICAgICAgIG1EZWNvZGVyLT5yZXNldERlY29kZXIoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTc4LDYgKzE3OSw5IEBACiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CiAgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKICAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgZ0Vudi0+c2V0U3RhdHNGaWxlKCJDMkRlY29kZXIuY3N2Iik7CisgICAgICAgIHN0YXR1cyA9IGdFbnYtPndyaXRlU3RhdHNIZWFkZXIoKTsKKyAgICAgICAgQUxPR1YoIlN0YXRzIGZpbGUgPSAlZFxuIiwgc3RhdHVzKTsKICAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOwogICAgICAgICBBTE9HVigiQzIgRGVjb2RlciBUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9DMkVuY29kZXJUZXN0LmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9DMkVuY29kZXJUZXN0LmNwcAppbmRleCA5OGViMTdhLi5iMThkODU2IDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQzJFbmNvZGVyVGVzdC5jcHAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0MyRW5jb2RlclRlc3QuY3BwCkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHN0cmluZyBkZWNOYW1lID0gIiI7Ci0gICAgICAgIHN0cmluZyBvdXRwdXRGaWxlTmFtZSA9ICJkZWNvZGUub3V0IjsKKyAgICAgICAgc3RyaW5nIG91dHB1dEZpbGVOYW1lID0gIi9kYXRhL2xvY2FsL3RtcC9kZWNvZGUub3V0IjsKICAgICAgICAgRklMRSAqb3V0RnAgPSBmb3BlbihvdXRwdXRGaWxlTmFtZS5jX3N0cigpLCAid2IiKTsKICAgICAgICAgQVNTRVJUX05FKG91dEZwLCBudWxscHRyKSA8PCAiVW5hYmxlIHRvIG9wZW4gb3V0cHV0IGZpbGUiIDw8IG91dHB1dEZpbGVOYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmb3IgZHVtcGluZyBkZWNvZGVyJ3Mgb3V0cHV0IjsKQEAgLTE0MCw3ICsxNDAsOCBAQAogICAgICAgICAgICAgICAgIG1FbmNvZGVyLT5kZUluaXRDb2RlYygpOwogICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IGV4dHJhY3Rvci0+Z2V0Q2xpcER1cmF0aW9uKCk7CiAgICAgICAgICAgICAgICAgQUxPR1YoImNvZGVjIDogJXMiLCBjb2RlY05hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgbUVuY29kZXItPmR1bXBTdGF0aXN0aWNzKEdldFBhcmFtKCkuZmlyc3QsIGR1cmF0aW9uVXMpOworICAgICAgICAgICAgICAgIG1FbmNvZGVyLT5kdW1wU3RhdGlzdGljcyhHZXRQYXJhbSgpLmZpcnN0LCBkdXJhdGlvblVzLCBjb2RlY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdFbnYtPmdldFN0YXRzRmlsZSgpKTsKICAgICAgICAgICAgICAgICBtRW5jb2Rlci0+cmVzZXRFbmNvZGVyKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE4MCw2ICsxODEsOSBAQAogICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwogICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CiAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGdFbnYtPnNldFN0YXRzRmlsZSgiQzJFbmNvZGVyLmNzdiIpOworICAgICAgICBzdGF0dXMgPSBnRW52LT53cml0ZVN0YXRzSGVhZGVyKCk7CisgICAgICAgIEFMT0dWKCJTdGF0cyBmaWxlID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKICAgICAgICAgQUxPR1YoIkMyIEVuY29kZXIgVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRGVjb2RlclRlc3QuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0RlY29kZXJUZXN0LmNwcAppbmRleCA5Zjk2ZDNiLi44MWVmMDJhIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRGVjb2RlclRlc3QuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9EZWNvZGVyVGVzdC5jcHAKQEAgLTg0LDcgKzg0LDggQEAKICAgICAgICAgZGVjb2Rlci0+ZGVJbml0Q29kZWMoKTsKICAgICAgICAgQUxPR1YoImNvZGVjIDogJXMiLCBjb2RlY05hbWUuY19zdHIoKSk7CiAgICAgICAgIHN0cmluZyBpbnB1dFJlZmVyZW5jZSA9IGdldDwwPihwYXJhbXMpOwotICAgICAgICBkZWNvZGVyLT5kdW1wU3RhdGlzdGljcyhpbnB1dFJlZmVyZW5jZSk7CisgICAgICAgIGRlY29kZXItPmR1bXBTdGF0aXN0aWNzKGlucHV0UmVmZXJlbmNlLCBjb2RlY05hbWUsIChhc3luY01vZGUgPyAiYXN5bmMiIDogInN5bmMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0Vudi0+Z2V0U3RhdHNGaWxlKCkpOwogICAgICAgICBmcmVlKGlucHV0QnVmZmVyKTsKICAgICAgICAgZGVjb2Rlci0+cmVzZXREZWNvZGVyKCk7CiAgICAgfQpAQCAtMTc5LDggKzE4MCwxMSBAQAogICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwogICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CiAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGdFbnYtPnNldFN0YXRzRmlsZSgiRGVjb2Rlci5jc3YiKTsKKyAgICAgICAgc3RhdHVzID0gZ0Vudi0+d3JpdGVTdGF0c0hlYWRlcigpOworICAgICAgICBBTE9HVigiU3RhdHMgZmlsZSA9ICVkXG4iLCBzdGF0dXMpOwogICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7Ci0gICAgICAgIEFMT0dEKCJEZWNvZGVyIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIEFMT0dWKCJEZWNvZGVyIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0VuY29kZXJUZXN0LmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9FbmNvZGVyVGVzdC5jcHAKaW5kZXggZGMyYTJkZC4uN2UxNjgxZCAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0VuY29kZXJUZXN0LmNwcAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRW5jb2RlclRlc3QuY3BwCkBAIC0yMyw2ICsyMywxMCBAQAogI2luY2x1ZGUgIkRlY29kZXIuaCIKICNpbmNsdWRlICJFbmNvZGVyLmgiCiAKK2NvbnN0ZXhwciBpbnQzMl90IGtFbmNvZGVEZWZhdWx0VmlkZW9CaXRSYXRlID0gODAwMDAwMCAvKiA4IE1icHMgKi87Citjb25zdGV4cHIgaW50MzJfdCBrRW5jb2RlTWluVmlkZW9CaXRSYXRlID0gNjAwMDAwIC8qIDYwMCBLYnBzICovOworY29uc3RleHByIGludDMyX3Qga0VuY29kZURlZmF1bHRBdWRpb0JpdFJhdGUgPSAxMjgwMDAgLyogMTI4IEticHMgKi87CisKIHN0YXRpYyBCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOwogCiBjbGFzcyBFbmNvZGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGU8c3RyaW5nLCBzdHJpbmcsIGJvb2w+PiB7fTsKQEAgLTc4LDcgKzgyLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHN0cmluZyBkZWNOYW1lID0gIiI7Ci0gICAgICAgIHN0cmluZyBvdXRwdXRGaWxlTmFtZSA9ICJkZWNvZGUub3V0IjsKKyAgICAgICAgc3RyaW5nIG91dHB1dEZpbGVOYW1lID0gIi9kYXRhL2xvY2FsL3RtcC9kZWNvZGUub3V0IjsKICAgICAgICAgRklMRSAqb3V0RnAgPSBmb3BlbihvdXRwdXRGaWxlTmFtZS5jX3N0cigpLCAid2IiKTsKICAgICAgICAgQVNTRVJUX05FKG91dEZwLCBudWxscHRyKSA8PCAiVW5hYmxlIHRvIG9wZW4gb3V0cHV0IGZpbGUiIDw8IG91dHB1dEZpbGVOYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmb3IgZHVtcGluZyBkZWNvZGVyJ3Mgb3V0cHV0IjsKQEAgLTg2LDYgKzkwLDcgQEAKICAgICAgICAgZGVjb2Rlci0+c2V0dXBEZWNvZGVyKCk7CiAgICAgICAgIHN0YXR1cyA9IGRlY29kZXItPmRlY29kZShpbnB1dEJ1ZmZlciwgZnJhbWVJbmZvLCBkZWNOYW1lLCBmYWxzZSAvKmFzeW5jTW9kZSAqLywgb3V0RnApOwogICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBBTUVESUFfT0spIDw8ICJEZWNvZGUgcmV0dXJuZWQgZXJyb3IgOiAiIDw8IHN0YXR1czsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpkZWNvZGVyRm9ybWF0ID0gZGVjb2Rlci0+Z2V0Rm9ybWF0KCk7CiAKICAgICAgICAgaWZzdHJlYW0gZWxlU3RyZWFtOwogICAgICAgICBlbGVTdHJlYW0ub3BlbihvdXRwdXRGaWxlTmFtZS5jX3N0cigpLCBpZnN0cmVhbTo6YmluYXJ5IHwgaWZzdHJlYW06OmF0ZSk7CkBAIC0xMDgsMTEgKzExMywxMyBAQAogICAgICAgICAgICAgaWYgKGVuY1BhcmFtcy5iaXRyYXRlIDw9IDAgfHwgZW5jUGFyYW1zLmZyYW1lUmF0ZSA8PSAwKSB7CiAgICAgICAgICAgICAgICAgZW5jUGFyYW1zLmZyYW1lUmF0ZSA9IDI1OwogICAgICAgICAgICAgICAgIGlmICghc3RyY21wKG1pbWUsICJ2aWRlby8zZ3BwIikgfHwgIXN0cmNtcChtaW1lLCAidmlkZW8vbXA0di1lcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY1BhcmFtcy5iaXRyYXRlID0gNjAwMDAwIC8qIDYwMCBLYnBzICovOworICAgICAgICAgICAgICAgICAgICBlbmNQYXJhbXMuYml0cmF0ZSA9IGtFbmNvZGVNaW5WaWRlb0JpdFJhdGU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jUGFyYW1zLmJpdHJhdGUgPSA4MDAwMDAwIC8qIDggTWJwcyAqLzsKKyAgICAgICAgICAgICAgICAgICAgZW5jUGFyYW1zLmJpdHJhdGUgPSBrRW5jb2RlRGVmYXVsdFZpZGVvQml0UmF0ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZGVjb2RlckZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY1BhcmFtcy5jb2xvckZvcm1hdCk7CiAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1BST0ZJTEUsICZlbmNQYXJhbXMucHJvZmlsZSk7CiAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0xFVkVMLCAmZW5jUGFyYW1zLmxldmVsKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTEyMCw4ICsxMjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNQYXJhbXMuc2FtcGxlUmF0ZSkpOwogICAgICAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNQYXJhbXMubnVtQ2hhbm5lbHMpKTsKLSAgICAgICAgICAgIGVuY1BhcmFtcy5iaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgZW5jUGFyYW1zLnNhbXBsZVJhdGUgKiBlbmNQYXJhbXMubnVtQ2hhbm5lbHMgKiAxNiAvKiBiaXRzUGVyU2FtcGxlICovOworICAgICAgICAgICAgZW5jUGFyYW1zLmJpdHJhdGUgPSBrRW5jb2RlRGVmYXVsdEF1ZGlvQml0UmF0ZTsKICAgICAgICAgfQogCiAgICAgICAgIGVuY29kZXItPnNldHVwRW5jb2RlcigpOwpAQCAtMTMzLDcgKzEzOSw4IEBACiAgICAgICAgIGVuY29kZXItPmRlSW5pdENvZGVjKCk7CiAgICAgICAgIEFMT0dWKCJjb2RlYyA6ICVzIiwgY29kZWNOYW1lLmNfc3RyKCkpOwogICAgICAgICBzdHJpbmcgaW5wdXRSZWZlcmVuY2UgPSBnZXQ8MD4ocGFyYW1zKTsKLSAgICAgICAgZW5jb2Rlci0+ZHVtcFN0YXRpc3RpY3MoaW5wdXRSZWZlcmVuY2UsIGV4dHJhY3Rvci0+Z2V0Q2xpcER1cmF0aW9uKCkpOworICAgICAgICBlbmNvZGVyLT5kdW1wU3RhdGlzdGljcyhpbnB1dFJlZmVyZW5jZSwgZXh0cmFjdG9yLT5nZXRDbGlwRHVyYXRpb24oKSwgY29kZWNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXN5bmNNb2RlID8gImFzeW5jIiA6ICJzeW5jIiksIGdFbnYtPmdldFN0YXRzRmlsZSgpKTsKICAgICAgICAgZWxlU3RyZWFtLmNsb3NlKCk7CiAgICAgICAgIGlmIChvdXRGcCkgZmNsb3NlKG91dEZwKTsKIApAQCAtMTQxLDYgKzE0OCwxMCBAQAogICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShmb3JtYXQpOwogICAgICAgICAgICAgZm9ybWF0ID0gbnVsbHB0cjsKICAgICAgICAgfQorICAgICAgICBpZiAoZGVjb2RlckZvcm1hdCkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShkZWNvZGVyRm9ybWF0KTsKKyAgICAgICAgICAgIGRlY29kZXJGb3JtYXQgPSBudWxscHRyOworICAgICAgICB9CiAgICAgICAgIGVuY29kZXItPnJlc2V0RW5jb2RlcigpOwogICAgICAgICBkZWNvZGVyLT5kZUluaXRDb2RlYygpOwogICAgICAgICBmcmVlKGlucHV0QnVmZmVyKTsKQEAgLTIxNCw4ICsyMjUsMTEgQEAKICAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKICAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOwogICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBnRW52LT5zZXRTdGF0c0ZpbGUoIkVuY29kZXIuY3N2Iik7CisgICAgICAgIHN0YXR1cyA9IGdFbnYtPndyaXRlU3RhdHNIZWFkZXIoKTsKKyAgICAgICAgQUxPR1YoIlN0YXRzIGZpbGUgPSAlZFxuIiwgc3RhdHVzKTsKICAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOwotICAgICAgICBBTE9HRCgiRW5jb2RlciBUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICBBTE9HVigiRW5jb2RlciBUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0V4dHJhY3RvclRlc3QuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0V4dHJhY3RvclRlc3QuY3BwCmluZGV4IGFkOGYxZTYuLmQxNGQxNWIgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9FeHRyYWN0b3JUZXN0LmNwcAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRXh0cmFjdG9yVGVzdC5jcHAKQEAgLTQ4LDggKzQ4LDcgQEAKICAgICBBU1NFUlRfRVEoc3RhdHVzLCBBTUVESUFfT0spIDw8ICJFeHRyYWN0aW9uIGZhaWxlZCBcbiI7CiAKICAgICBleHRyYWN0T2JqLT5kZUluaXRFeHRyYWN0b3IoKTsKLQotICAgIGV4dHJhY3RPYmotPmR1bXBTdGF0aXN0aWNzKEdldFBhcmFtKCkuZmlyc3QpOworICAgIGV4dHJhY3RPYmotPmR1bXBTdGF0aXN0aWNzKEdldFBhcmFtKCkuZmlyc3QsICIiLCBnRW52LT5nZXRTdGF0c0ZpbGUoKSk7CiAKICAgICBmY2xvc2UoaW5wdXRGcCk7CiAgICAgZGVsZXRlIGV4dHJhY3RPYmo7CkBAIC03OSw4ICs3OCwxMSBAQAogICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwogICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CiAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGdFbnYtPnNldFN0YXRzRmlsZSgiRXh0cmFjdG9yLmNzdiIpOworICAgICAgICBzdGF0dXMgPSBnRW52LT53cml0ZVN0YXRzSGVhZGVyKCk7CisgICAgICAgIEFMT0dWKCJTdGF0cyBmaWxlID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKLSAgICAgICAgQUxPR0QoIiBFeHRyYWN0b3IgVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR1YoIkV4dHJhY3RvciBUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL011eGVyVGVzdC5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvTXV4ZXJUZXN0LmNwcAppbmRleCBmYTI2MzVkLi45OTE2NDRiIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvTXV4ZXJUZXN0LmNwcAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvTXV4ZXJUZXN0LmNwcApAQCAtMTEzLDcgKzExMyw3IEBACiAgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJNdXggZmFpbGVkIjsKIAogICAgICAgICBtdXhlck9iai0+ZGVJbml0TXV4ZXIoKTsKLSAgICAgICAgbXV4ZXJPYmotPmR1bXBTdGF0aXN0aWNzKEdldFBhcmFtKCkuZmlyc3QgKyAiLiIgKyBmbXQuY19zdHIoKSk7CisgICAgICAgIG11eGVyT2JqLT5kdW1wU3RhdGlzdGljcyhHZXRQYXJhbSgpLmZpcnN0ICsgIi4iICsgZm10LmNfc3RyKCksIGZtdCwgZ0Vudi0+Z2V0U3RhdHNGaWxlKCkpOwogICAgICAgICBmcmVlKGlucHV0QnVmZmVyKTsKICAgICAgICAgZmNsb3NlKG91dHB1dEZwKTsKICAgICAgICAgbXV4ZXJPYmotPnJlc2V0TXV4ZXIoKTsKQEAgLTE1MSw4ICsxNTEsMTEgQEAKICAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKICAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOwogICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBnRW52LT5zZXRTdGF0c0ZpbGUoIk11eGVyLmNzdiIpOworICAgICAgICBzdGF0dXMgPSBnRW52LT53cml0ZVN0YXRzSGVhZGVyKCk7CisgICAgICAgIEFMT0dWKCJTdGF0cyBmaWxlID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKLSAgICAgICAgQUxPR1YoIlRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIEFMT0dWKCJNdXhlciBUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAKaW5kZXggZTNmMWU0NC4uNTljMmU2NSAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS91dGlscy9BbmRyb2lkLmJwCkBAIC0xMiw2ICsxMiwxNSBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm1lZGlhdXRpbHMiLAogCkBAIC0yOCwxNyArMzcsMjMgQEAKICAgICBdLAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJjX21hbGxvY19kZWJ1Z19iYWNrdHJhY2UiLAorICAgICAgICAibGliYmF0dGVyeXN0YXRzX2FpZGwiLAorICAgICAgICAibGlicHJvY2Vzc2luZm9zZXJ2aWNlX2FpZGwiLAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLCAvLyBmb3IgY2xvY2suaAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlicGVybWlzc2lvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKICAgICBdLAorICAgIGV4cG9ydF9zdGF0aWNfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmJhdHRlcnlzdGF0c19haWRsIiwKKyAgICBdLAogCiAgICAgbG9ndGFnczogWyJFdmVudExvZ1RhZ3MubG9ndGFncyJdLAogCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9FdmVudExvZ1RhZ3MubG9ndGFncyBiL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzCmluZGV4IDY3ZjBlYTguLmMzOTdmMzQgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzCisrKyBiL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzCkBAIC0zMSw3ICszMSw3IEBACiAjIDY6IFBlcmNlbnQKICMgRGVmYXVsdCB2YWx1ZSBmb3IgZGF0YSBvZiB0eXBlIGludC9sb25nIGlzIDIgKGJ5dGVzKS4KICMKLSMgU2VlIHN5c3RlbS9jb3JlL2xvZ2NhdC9ldmVudC5sb2d0YWdzIGZvciB0aGUgbWFzdGVyIGNvcHkgb2YgdGhlIHRhZ3MuCisjIFNlZSBzeXN0ZW0vY29yZS9sb2djYXQvZXZlbnQubG9ndGFncyBmb3IgdGhlIG9yaWdpbmFsIGRlZmluaXRpb24gb2YgdGhlIHRhZ3MuCiAKICMgNjEwMDAgLSA2MTE5OSByZXNlcnZlZCBmb3IgYXVkaW9zZXJ2ZXIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvUHJvY2Vzc0luZm8uY3BwIGIvbWVkaWEvdXRpbHMvUHJvY2Vzc0luZm8uY3BwCmluZGV4IDExM2U0YTcuLmU5YzlmOGQgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL1Byb2Nlc3NJbmZvLmNwcAorKysgYi9tZWRpYS91dGlscy9Qcm9jZXNzSW5mby5jcHAKQEAgLTIxLDkgKzIxLDkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mby5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQcm9jZXNzSW5mb1NlcnZpY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjaW5jbHVkZSA8cHJvY2Vzc2luZm8vSVByb2Nlc3NJbmZvU2VydmljZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL1NlcnZpY2VVdGlsaXRpZXMuY3BwIGIvbWVkaWEvdXRpbHMvU2VydmljZVV0aWxpdGllcy5jcHAKaW5kZXggNzY5OTcwMC4uMWIxNzE3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvU2VydmljZVV0aWxpdGllcy5jcHAKKysrIGIvbWVkaWEvdXRpbHMvU2VydmljZVV0aWxpdGllcy5jcHAKQEAgLTI2Niw3ICsyNjYsNyBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3A8Y29udGVudDo6cG06OklQYWNrYWdlTWFuYWdlck5hdGl2ZT4gTWVkaWFQYWNrYWdlTWFuYWdlcjo6cmV0cmVpdmVQYWNrYWdlTWFuYWdlcigpIHsKK3NwPGNvbnRlbnQ6OnBtOjpJUGFja2FnZU1hbmFnZXJOYXRpdmU+IE1lZGlhUGFja2FnZU1hbmFnZXI6OnJldHJpZXZlUGFja2FnZU1hbmFnZXIoKSB7CiAgICAgY29uc3Qgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwogICAgIGlmIChzbSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dXKCIlczogZmFpbGVkIHRvIHJldHJpZXZlIGRlZmF1bHRTZXJ2aWNlTWFuYWdlciIsIF9fZnVuY19fKTsKQEAgLTI4MywyNyArMjgzLDI3IEBACiBzdGQ6Om9wdGlvbmFsPGJvb2w+IE1lZGlhUGFja2FnZU1hbmFnZXI6OmRvSXNBbGxvd2VkKHVpZF90IHVpZCkgewogICAgIGlmIChtUGFja2FnZU1hbmFnZXIgPT0gbnVsbHB0cikgewogICAgICAgICAvKiogQ2FuIG5vdCBmZXRjaCBwYWNrYWdlIG1hbmFnZXIgYXQgY29uc3RydWN0aW9uIGl0IG1heSBub3QgeWV0IGJlIHJlZ2lzdGVyZWQuICovCi0gICAgICAgIG1QYWNrYWdlTWFuYWdlciA9IHJldHJlaXZlUGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgbVBhY2thZ2VNYW5hZ2VyID0gcmV0cmlldmVQYWNrYWdlTWFuYWdlcigpOwogICAgICAgICBpZiAobVBhY2thZ2VNYW5hZ2VyID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIEFMT0dXKCIlczogUGxheWJhY2sgY2FwdHVyZSBpcyBkZW5pZWQgYXMgcGFja2FnZSBtYW5hZ2VyIGlzIG5vdCByZWFjaGFibGUiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gUmV0cmlldmUgcGFja2FnZSBuYW1lcyBmb3IgdGhlIFVJRCBhbmQgdHJhbnNmb3JtIHRvIGEgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+LgorICAgIFZlY3RvcjxTdHJpbmcxNj4gc3RyMTZQYWNrYWdlTmFtZXM7CisgICAgUGVybWlzc2lvbkNvbnRyb2xsZXJ7fS5nZXRQYWNrYWdlc0ZvclVpZCh1aWQsIHN0cjE2UGFja2FnZU5hbWVzKTsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGFja2FnZU5hbWVzOwotICAgIGF1dG8gc3RhdHVzID0gbVBhY2thZ2VNYW5hZ2VyLT5nZXROYW1lc0ZvclVpZHMoeyhpbnQzMl90KXVpZH0sICZwYWNrYWdlTmFtZXMpOwotICAgIGlmICghc3RhdHVzLmlzT2soKSkgewotICAgICAgICBBTE9HVygiJXM6IFBsYXliYWNrIGNhcHR1cmUgaXMgZGVuaWVkIGZvciB1aWQgJXUgYXMgdGhlIHBhY2thZ2UgbmFtZXMgY291bGQgbm90IGJlICIKLSAgICAgICAgICAgICAgInJldHJpZXZlZCBmcm9tIHRoZSBwYWNrYWdlIG1hbmFnZXI6ICVzIiwgX19mdW5jX18sIHVpZCwgc3RhdHVzLnRvU3RyaW5nOCgpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OworICAgIGZvciAoY29uc3QgYXV0byYgc3RyMTZQYWNrYWdlTmFtZSA6IHN0cjE2UGFja2FnZU5hbWVzKSB7CisgICAgICAgIHBhY2thZ2VOYW1lcy5lbXBsYWNlX2JhY2soU3RyaW5nOChzdHIxNlBhY2thZ2VOYW1lKS5zdHJpbmcoKSk7CiAgICAgfQogICAgIGlmIChwYWNrYWdlTmFtZXMuZW1wdHkoKSkgewogICAgICAgICBBTE9HVygiJXM6IFBsYXliYWNrIGNhcHR1cmUgZm9yIHVpZCAldSBpcyBkZW5pZWQgYXMgbm8gcGFja2FnZSBuYW1lIGNvdWxkIGJlIHJldHJpZXZlZCAiCi0gICAgICAgICAgICAgICJmcm9tIHRoZSBwYWNrYWdlIG1hbmFnZXI6ICVzIiwgX19mdW5jX18sIHVpZCwgc3RhdHVzLnRvU3RyaW5nOCgpLmNfc3RyKCkpOworICAgICAgICAgICAgICAiZnJvbSB0aGUgcGFja2FnZSBtYW5hZ2VyLiIsIF9fZnVuY19fLCB1aWQpOwogICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwogICAgIH0KICAgICBzdGQ6OnZlY3Rvcjxib29sPiBpc0FsbG93ZWQ7Ci0gICAgc3RhdHVzID0gbVBhY2thZ2VNYW5hZ2VyLT5pc0F1ZGlvUGxheWJhY2tDYXB0dXJlQWxsb3dlZChwYWNrYWdlTmFtZXMsICZpc0FsbG93ZWQpOworICAgIGF1dG8gc3RhdHVzID0gbVBhY2thZ2VNYW5hZ2VyLT5pc0F1ZGlvUGxheWJhY2tDYXB0dXJlQWxsb3dlZChwYWNrYWdlTmFtZXMsICZpc0FsbG93ZWQpOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICBBTE9HVygiJXM6IFBsYXliYWNrIGNhcHR1cmUgaXMgZGVuaWVkIGZvciB1aWQgJXUgYXMgdGhlIG1hbmlmZXN0IHByb3BlcnR5IGNvdWxkIG5vdCBiZSAiCiAgICAgICAgICAgICAgICJyZXRyaWV2ZWQgZnJvbSB0aGUgcGFja2FnZSBtYW5hZ2VyOiAlcyIsIF9fZnVuY19fLCB1aWQsIHN0YXR1cy50b1N0cmluZzgoKS5jX3N0cigpKTsKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2Z1enplcnMvQW5kcm9pZC5icCBiL21lZGlhL3V0aWxzL2Z1enplcnMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzAzOTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvZnV6emVycy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjEgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzX2Z1enplcl9kZWZhdWx0cyIsCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhdHRlcnlzdGF0c19haWRsIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWMrKzJhLWV4dGVuc2lvbnMiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAiYmlvbmljX2xpYmNfcGxhdGZvcm1faGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgIC8vIEZvciBERUJVR0dFUl9TSUdOQUwKKyAgICAgICAgInN5c3RlbS9jb3JlL2RlYnVnZ2VyZC9pbmNsdWRlIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlibWVkaWF1dGlsc19mdXp6ZXJfYmF0dGVyeV9ub3RpZmllciIsCisgICAgZGVmYXVsdHM6IFsibGlibWVkaWF1dGlsc19mdXp6ZXJfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIkJhdHRlcnlOb3RpZmllckZ1enouY3BwIl0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzX2Z1enplcl9zY2hlZHVsaW5nX3BvbGljeV9zZXJ2aWNlIiwKKyAgICBkZWZhdWx0czogWyJsaWJtZWRpYXV0aWxzX2Z1enplcl9kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiU2NoZWR1bGluZ1BvbGljeVNlcnZpY2VGdXp6LmNwcCJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlibWVkaWF1dGlsc19mdXp6ZXJfc2VydmljZV91dGlsaXRpZXMiLAorICAgIGRlZmF1bHRzOiBbImxpYm1lZGlhdXRpbHNfZnV6emVyX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJTZXJ2aWNlVXRpbGl0aWVzRnV6ei5jcHAiXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImxpYm1lZGlhdXRpbHNfZnV6emVyX3RpbWVfY2hlY2siLAorICAgIGRlZmF1bHRzOiBbImxpYm1lZGlhdXRpbHNfZnV6emVyX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJUaW1lQ2hlY2tGdXp6LmNwcCJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvZnV6emVycy9CYXR0ZXJ5Tm90aWZpZXJGdXp6LmNwcCBiL21lZGlhL3V0aWxzL2Z1enplcnMvQmF0dGVyeU5vdGlmaWVyRnV6ei5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiM2NjZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2Z1enplcnMvQmF0dGVyeU5vdGlmaWVyRnV6ei5jcHAKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKKyNpbmNsdWRlICJtZWRpYXV0aWxzL0JhdHRlcnlOb3RpZmllci5oIgorCitzdGF0aWMgY29uc3RleHByIGludCBrTWF4T3BlcmF0aW9ucyA9IDMwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga01heFN0cmluZ0xlbmd0aCA9IDUwMDsKK3VzaW5nIGFuZHJvaWQ6OkJhdHRlcnlOb3RpZmllcjsKKworc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c3RyaW5nIC8qZmxhc2hsaWdodF9uYW1lKi8sIHN0ZDo6c3RyaW5nIC8qY2FtZXJhX25hbWUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCAvKnZpZGVvX2lkKi8sIHVpZF90IC8qYXVkaW9faWQqLywgdWlkX3QgLypsaWdodF9pZCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IC8qY2FtZXJhX2lkKi8pPj4KKyAgICBvcGVyYXRpb25zID0geworICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpZF90LCB1aWRfdCwgdWlkX3QsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlUmVzZXRWaWRlbygpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpZF90LCB1aWRfdCwgdWlkX3QsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlUmVzZXRBdWRpbygpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpZF90LCB1aWRfdCwgdWlkX3QsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlUmVzZXRGbGFzaGxpZ2h0KCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgdWlkX3QsIHVpZF90LCB1aWRfdCwgdWlkX3QpIC0+IHZvaWQgeworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVSZXNldENhbWVyYSgpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpZF90IHZpZGVvX2lkLCB1aWRfdCwgdWlkX3QsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlU3RhcnRWaWRlbyh2aWRlb19pZCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgdWlkX3QgdmlkZW9faWQsIHVpZF90LCB1aWRfdCwgdWlkX3QpIC0+IHZvaWQgeworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVTdG9wVmlkZW8odmlkZW9faWQpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpZF90LCB1aWRfdCBhdWRpb19pZCwgdWlkX3QsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlU3RhcnRBdWRpbyhhdWRpb19pZCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgdWlkX3QsIHVpZF90IGF1ZGlvX2lkLCB1aWRfdCwgdWlkX3QpIC0+IHZvaWQgeworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVTdG9wQXVkaW8oYXVkaW9faWQpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZyBmbGFzaGxpZ2h0X25hbWUsIHN0ZDo6c3RyaW5nLCB1aWRfdCwgdWlkX3QsIHVpZF90IGxpZ2h0X2lkLCB1aWRfdCkgLT4gdm9pZCB7CisgICAgICAgICAgICBhbmRyb2lkOjpTdHJpbmc4IG5hbWUoZmxhc2hsaWdodF9uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVGbGFzaGxpZ2h0T24obmFtZSwgbGlnaHRfaWQpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZyBmbGFzaGxpZ2h0X25hbWUsIHN0ZDo6c3RyaW5nLCB1aWRfdCwgdWlkX3QsIHVpZF90IGxpZ2h0X2lkLCB1aWRfdCkgLT4gdm9pZCB7CisgICAgICAgICAgICBhbmRyb2lkOjpTdHJpbmc4IG5hbWUoZmxhc2hsaWdodF9uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVGbGFzaGxpZ2h0T2ZmKG5hbWUsIGxpZ2h0X2lkKTsKKyAgICAgICAgfSwKKyAgICAgICAgW10oc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nIGNhbWVyYV9uYW1lLCB1aWRfdCwgdWlkX3QsIHVpZF90LCB1aWRfdCBjYW1lcmFfaWQpIC0+IHZvaWQgeworICAgICAgICAgICAgYW5kcm9pZDo6U3RyaW5nOCBuYW1lKGNhbWVyYV9uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVTdGFydENhbWVyYShuYW1lLCBjYW1lcmFfaWQpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcgY2FtZXJhX25hbWUsIHVpZF90LCB1aWRfdCwgdWlkX3QsIHVpZF90IGNhbWVyYV9pZCkgLT4gdm9pZCB7CisgICAgICAgICAgICBhbmRyb2lkOjpTdHJpbmc4IG5hbWUoY2FtZXJhX25hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkubm90ZVN0b3BDYW1lcmEobmFtZSwgY2FtZXJhX2lkKTsKKyAgICAgICAgfSwKK307CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgZGF0YV9wcm92aWRlcihkYXRhLCBzaXplKTsKKyAgICBzdGQ6OnN0cmluZyBjYW1lcmFfbmFtZSA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4U3RyaW5nTGVuZ3RoKTsKKyAgICBzdGQ6OnN0cmluZyBmbGFzaGxpZ2h0X25hbWUgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heFN0cmluZ0xlbmd0aCk7CisgICAgdWlkX3QgdmlkZW9faWQgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbDx1aWRfdD4oKTsKKyAgICB1aWRfdCBhdWRpb19pZCA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsPHVpZF90PigpOworICAgIHVpZF90IGxpZ2h0X2lkID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWw8dWlkX3Q+KCk7CisgICAgdWlkX3QgY2FtZXJhX2lkID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWw8dWlkX3Q+KCk7CisgICAgc2l6ZV90IG9wc19ydW4gPSAwOworICAgIHdoaWxlIChkYXRhX3Byb3ZpZGVyLnJlbWFpbmluZ19ieXRlcygpID4gMCAmJiBvcHNfcnVuKysgPCBrTWF4T3BlcmF0aW9ucykgeworICAgICAgICB1aW50OF90IG9wID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIG9wZXJhdGlvbnMuc2l6ZSgpIC0gMSk7CisgICAgICAgIG9wZXJhdGlvbnNbb3BdKGZsYXNobGlnaHRfbmFtZSwgY2FtZXJhX25hbWUsIHZpZGVvX2lkLCBhdWRpb19pZCwgbGlnaHRfaWQsIGNhbWVyYV9pZCk7CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvZnV6emVycy9TY2hlZHVsaW5nUG9saWN5U2VydmljZUZ1enouY3BwIGIvbWVkaWEvdXRpbHMvZnV6emVycy9TY2hlZHVsaW5nUG9saWN5U2VydmljZUZ1enouY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMGZlZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9mdXp6ZXJzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlRnV6ei5jcHAKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiQmF0dGVyeU5vdGlmaWVyRnV6emVyIgorI2luY2x1ZGUgPGJhdHRlcnlzdGF0cy9JQmF0dGVyeVN0YXRzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+CisjaW5jbHVkZSAiZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oIgordXNpbmcgYW5kcm9pZDo6SUJhdHRlcnlTdGF0czsKK3VzaW5nIGFuZHJvaWQ6OklCaW5kZXI7Cit1c2luZyBhbmRyb2lkOjpJSW50ZXJmYWNlOwordXNpbmcgYW5kcm9pZDo6SVNlcnZpY2VNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6c3A7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmcxNjsKK3VzaW5nIGFuZHJvaWQ6OmRlZmF1bHRTZXJ2aWNlTWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OnJlcXVlc3RDcHVzZXRCb29zdDsKK3VzaW5nIGFuZHJvaWQ6OnJlcXVlc3RQcmlvcml0eTsKK3NwPElCYXR0ZXJ5U3RhdHM+IGdldEJhdHRlcnlTZXJ2aWNlKCkgeworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IGJhdHRlcnlTdGF0U2VydmljZTsKKyAgICBjb25zdCBzcDxJU2VydmljZU1hbmFnZXI+IHNtKGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpKTsKKyAgICBpZiAoc20gIT0gbnVsbHB0cikgeworICAgICAgICBjb25zdCBTdHJpbmcxNiBuYW1lKCJiYXR0ZXJ5c3RhdHMiKTsKKyAgICAgICAgYmF0dGVyeVN0YXRTZXJ2aWNlID0gY2hlY2tlZF9pbnRlcmZhY2VfY2FzdDxJQmF0dGVyeVN0YXRzPihzbS0+Y2hlY2tTZXJ2aWNlKG5hbWUpKTsKKyAgICAgICAgaWYgKGJhdHRlcnlTdGF0U2VydmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVygiYmF0dGVyeXN0YXRzIHNlcnZpY2UgdW5hdmFpbGFibGUhIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYmF0dGVyeVN0YXRTZXJ2aWNlOworfQorZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBkYXRhX3Byb3ZpZGVyKGRhdGEsIHNpemUpOworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IGJhdHRlcnlTdGF0U2VydmljZSA9IGdldEJhdHRlcnlTZXJ2aWNlKCk7CisgICAgLy8gVGhlcmUgaXMgc29tZSBzdGF0ZSBoZXJlLCBidXQgaXQncyBtb3N0bHkgZm9jdXNlZCBhcm91bmQgdGhyZWFkLXNhZmV0eSwgc28KKyAgICAvLyB3ZSB3b24ndCB3b3JyeSBhYm91dCBvcmRlci4KKyAgICBpbnQzMl90IHByaW9yaXR5ID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBib29sIGlzX2Zvcl9hcHAgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVCb29sKCk7CisgICAgYm9vbCBhc3luYyA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUJvb2woKTsKKyAgICByZXF1ZXN0UHJpb3JpdHkoZ2V0cGlkKCksIGdldHRpZCgpLCBwcmlvcml0eSwgaXNfZm9yX2FwcCwgYXN5bmMpOworICAgIC8vIFRPRE86IFZlcmlmeSBhbmQgcmUtZW5hYmxlIGluIEFPU1AgKFIpLgorICAgIC8vIGJvb2wgZW5hYmxlID0gZGF0YV9wcm92aWRlci5Db25zdW1lQm9vbCgpOworICAgIC8vIFdlIGFyZSBqdXN0IHVzaW5nIGJhdHRlcnlzdGF0cyB0byBhdm9pZCB0aGUgbmVlZAorICAgIC8vIHRvIHJlZ2lzdGVyIGEgbmV3IHNlcnZpY2UuCisgICAgLy8gcmVxdWVzdENwdXNldEJvb3N0KGVuYWJsZSwgSUludGVyZmFjZTo6YXNCaW5kZXIoYmF0dGVyeVN0YXRTZXJ2aWNlKSk7CisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2Z1enplcnMvU2VydmljZVV0aWxpdGllc0Z1enouY3BwIGIvbWVkaWEvdXRpbHMvZnV6emVycy9TZXJ2aWNlVXRpbGl0aWVzRnV6ei5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBiMzcxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2Z1enplcnMvU2VydmljZVV0aWxpdGllc0Z1enouY3BwCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKKyNpbmNsdWRlICJtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaCIKKworc3RhdGljIGNvbnN0ZXhwciBpbnQga01heE9wZXJhdGlvbnMgPSA1MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhTdHJpbmdMZW4gPSAyNTY7CisKK2NvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6ZnVuY3Rpb248dm9pZChGdXp6ZWREYXRhUHJvdmlkZXIqLCBhbmRyb2lkOjpNZWRpYVBhY2thZ2VNYW5hZ2VyKT4+CisgICAgb3BlcmF0aW9ucyA9IHsKKyAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBkYXRhX3Byb3ZpZGVyLCBhbmRyb2lkOjpNZWRpYVBhY2thZ2VNYW5hZ2VyIHBtKSAtPiB2b2lkIHsKKyAgICAgICAgICAgIHVpZF90IHVpZCA9IGRhdGFfcHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDx1aWRfdD4oKTsKKyAgICAgICAgICAgIHBtLmFsbG93UGxheWJhY2tDYXB0dXJlKHVpZCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZGF0YV9wcm92aWRlciwgYW5kcm9pZDo6TWVkaWFQYWNrYWdlTWFuYWdlciBwbSkgLT4gdm9pZCB7CisgICAgICAgICAgICBpbnQgc3BhY2VzID0gZGF0YV9wcm92aWRlci0+Q29uc3VtZUludGVncmFsPGludD4oKTsKKworICAgICAgICAgICAgLy8gRHVtcCBldmVyeXRoaW5nIGludG8gL2Rldi9udWxsCisgICAgICAgICAgICBpbnQgZmQgPSBvcGVuKCIvZGV2L251bGwiLCBPX1dST05MWSk7CisgICAgICAgICAgICBwbS5kdW1wKGZkLCBzcGFjZXMpOworICAgICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICB9LAorfTsKKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBkYXRhX3Byb3ZpZGVyKGRhdGEsIHNpemUpOworICAgIHVpZF90IHVpZCA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsPHVpZF90PigpOworICAgIHBpZF90IHBpZCA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsPHBpZF90PigpOworCisgICAgLy8gVGhlcmUgaXMgbm90IHN0YXRlIGhlcmUsIGFuZCBvcmRlciBpcyBub3Qgc2lnbmlmaWNhbnQsCisgICAgLy8gc28gd2UgY2FuIHNpbXBseSBjYWxsIGFsbCBvZiB0aGUgdGFyZ2V0IGZ1bmN0aW9ucworICAgIGFuZHJvaWQ6OmlzU2VydmljZVVpZCh1aWQpOworICAgIGFuZHJvaWQ6OmlzQXVkaW9TZXJ2ZXJVaWQodWlkKTsKKyAgICBhbmRyb2lkOjppc0F1ZGlvU2VydmVyT3JTeXN0ZW1TZXJ2ZXJVaWQodWlkKTsKKyAgICBhbmRyb2lkOjppc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZCh1aWQpOworICAgIHN0ZDo6c3RyaW5nIHBhY2thZ2VOYW1lU3RyID0gZGF0YV9wcm92aWRlci5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhTdHJpbmdMZW4pOworICAgIGFuZHJvaWQ6OlN0cmluZzE2IG9wUGFja2FnZU5hbWUocGFja2FnZU5hbWVTdHIuY19zdHIoKSk7CisgICAgYW5kcm9pZDo6cmVjb3JkaW5nQWxsb3dlZChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCk7CisgICAgYW5kcm9pZDo6c3RhcnRSZWNvcmRpbmcob3BQYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGZhbHNlKTsKKyAgICBhbmRyb2lkOjpmaW5pc2hSZWNvcmRpbmcob3BQYWNrYWdlTmFtZSwgdWlkLCBmYWxzZSk7CisgICAgYW5kcm9pZDo6Y2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWQsIHVpZCk7CisgICAgYW5kcm9pZDo6Y2FwdHVyZU1lZGlhT3V0cHV0QWxsb3dlZChwaWQsIHVpZCk7CisgICAgYW5kcm9pZDo6Y2FwdHVyZUhvdHdvcmRBbGxvd2VkKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkKTsKKyAgICBhbmRyb2lkOjptb2RpZnlQaG9uZVN0YXRlQWxsb3dlZCh1aWQsIHBpZCk7CisgICAgYW5kcm9pZDo6YnlwYXNzSW50ZXJydXB0aW9uUG9saWN5QWxsb3dlZCh1aWQsIHBpZCk7CisgICAgYW5kcm9pZDo6c2V0dGluZ3NBbGxvd2VkKCk7CisgICAgYW5kcm9pZDo6bW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpOworICAgIGFuZHJvaWQ6Om1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCk7CisgICAgYW5kcm9pZDo6ZHVtcEFsbG93ZWQoKTsKKworICAgIC8vIE1lZGlhUGFja2FnZU1hbmFnZXIgZG9lcyBoYXZlIHN0YXRlLCBzbyB3ZSBuZWVkIHRoZSBmdXp6ZXIgdG8gZGVjaWRlIG9yZGVyCisgICAgYW5kcm9pZDo6TWVkaWFQYWNrYWdlTWFuYWdlciBwYWNrYWdlTWFuYWdlcjsKKyAgICBzaXplX3Qgb3BzX3J1biA9IDA7CisgICAgd2hpbGUgKGRhdGFfcHJvdmlkZXIucmVtYWluaW5nX2J5dGVzKCkgPiAwICYmIG9wc19ydW4rKyA8IGtNYXhPcGVyYXRpb25zKSB7CisgICAgICAgIHVpbnQ4X3Qgb3AgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgb3BlcmF0aW9ucy5zaXplKCkgLSAxKTsKKyAgICAgICAgb3BlcmF0aW9uc1tvcF0oJmRhdGFfcHJvdmlkZXIsIHBhY2thZ2VNYW5hZ2VyKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2Z1enplcnMvVGltZUNoZWNrRnV6ei5jcHAgYi9tZWRpYS91dGlscy9mdXp6ZXJzL1RpbWVDaGVja0Z1enouY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYjZiYTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9mdXp6ZXJzL1RpbWVDaGVja0Z1enouY3BwCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKKyNpbmNsdWRlICJtZWRpYXV0aWxzL1RpbWVDaGVjay5oIgorCitzdGF0aWMgY29uc3RleHByIGludCBrTWF4U3RyaW5nTGVuID0gMjU2OworCisvLyBXaGlsZSBpdCBtaWdodCBiZSBpbnRlcmVzdGluZyB0byB0ZXN0IGxvbmctcnVubmluZworLy8gam9icywgaXQgc2VlbXMgdW5saWtlbHkgaXQnZCBsZWFkIHRvIHRoZSB0eXBlcyBvZiBjcmFzaGVzCisvLyB3ZSdyZSBsb29raW5nIGZvciwgYW5kIHdvdWxkIG1lYW4gYSBzaWduaWZpY2FudCBpbmNyZWFzZSBpbiBmdXp6ZXIgdGltZS4KKy8vIFRoZXJlZm9yZSwgd2UgYXJlIHNldHRpbmcgYSBsb3cgY2FwLgorc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWF4VGltZW91dE1zID0gMTAwMDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga01pblRpbWVvdXRNcyA9IDIwMDsKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgZGF0YV9wcm92aWRlcihkYXRhLCBzaXplKTsKKworICAgIC8vIFRoZXJlJ3MgZXNzZW50aWFsbHkgNSBvcGVyYXRpb25zIHRoYXQgd2UgY2FuIGFjY2VzcyBpbiB0aGlzIGNsYXNzCisgICAgLy8gMS4gVGhlIHRpbWUgaXQgdGFrZXMgdG8gcnVuIHRoaXMgb3BlcmF0aW9uLiBBcyBtZW50aW9uZWQgYWJvdmUsCisgICAgLy8gICAgbG9uZy1ydW5uaW5nIHRhc2tzIGFyZSBub3QgZ29vZCBmb3IgZnV6emluZywgYnV0IHRoZXJlIHdpbGwgYmUKKyAgICAvLyAgICBzb21lIGNoYW5nZSBpbiB0aGUgcnVuIHRpbWUuCisgICAgdWludDMyX3QgdGltZW91dE1zID0KKyAgICAgICAgZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PihrTWluVGltZW91dE1zLCBrTWF4VGltZW91dE1zKTsKKyAgICB1aW50OF90IHBpZF9zaXplID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWw8dWludDhfdD4oKTsKKyAgICBzdGQ6OnZlY3RvcjxwaWRfdD4gcGlkcyhwaWRfc2l6ZSk7CisgICAgZm9yIChhdXRvJiBwaWQgOiBwaWRzKSB7CisgICAgICAgIHBpZCA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsPHBpZF90PigpOworICAgIH0KKworICAgIC8vIDIuIFdlIGFsc28gaGF2ZSBzZXRBdWRpb0hhbFBpZHMsIHdoaWNoIGlzIHBvcHVsYXRlZCB3aXRoIHRoZSBwaWRzIHNldAorICAgIC8vIGFib3ZlLgorICAgIGFuZHJvaWQ6OlRpbWVDaGVjazo6c2V0QXVkaW9IYWxQaWRzKHBpZHMpOworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heFN0cmluZ0xlbik7CisKKyAgICAvLyAzLiBUaGUgY29uc3RydWN0b3IsIHdoaWNoIGlzIGZ1enplZCBoZXJlOgorICAgIGFuZHJvaWQ6OlRpbWVDaGVjayB0aW1lQ2hlY2sobmFtZS5jX3N0cigpLCB0aW1lb3V0TXMpOworICAgIC8vIFdlIHdpbGwgbGVhdmUgc29tZSBidWZmZXIgdG8gYXZvaWQgc2xlZXBpbmcgdG9vIGxvbmcKKyAgICB1aW50OF90IHNsZWVwX2Ftb3VudF9tcyA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50OF90PigwLCB0aW1lb3V0TXMgLyAyKTsKKworICAgIC8vIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIGNhbiBjb3ZlciB0aGUgdGltZSBvdXQgZnVuY3Rpb25hbGl0eS4KKyAgICBpZiAoc2xlZXBfYW1vdW50X21zKSB7CisgICAgICAgIGF1dG8gbXMgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKHNsZWVwX2Ftb3VudF9tcyk7CisgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2Zvcihtcyk7CisgICAgfQorCisgICAgLy8gNC4gRmluYWxseSwgdGhlIGRlc3RydWN0b3Igb24gdGltZWNoZWNrLiBUaGVzZSBzZWVtIHRvIGJlIHRoZSBvbmx5IGZhY3RvcnMKKyAgICAvLyBpbiBwbGF5LgorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0JhdHRlcnlOb3RpZmllci5oIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0JhdHRlcnlOb3RpZmllci5oCmluZGV4IGE0ZTQyYWQuLjM4MTJkN2EgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgTUVESUFfQkFUVEVSWV9OT1RJRklFUl9ICiAjZGVmaW5lIE1FRElBX0JBVFRFUllfTk9USUZJRVJfSAogCi0jaW5jbHVkZSA8YmluZGVyL0lCYXR0ZXJ5U3RhdHMuaD4KKyNpbmNsdWRlIDxiYXR0ZXJ5c3RhdHMvSUJhdHRlcnlTdGF0cy5oPgogI2luY2x1ZGUgPHV0aWxzL1NpbmdsZXRvbi5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmgKaW5kZXggNDMxZGQ3YS4uYzdkNDlmZCAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oCkBAIC0xMTAsNyArMTEwLDcgQEAKIHByaXZhdGU6CiAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBuYXRpdmVQYWNrYWdlTWFuYWdlck5hbWUgPSAicGFja2FnZV9uYXRpdmUiOwogICAgIHN0ZDo6b3B0aW9uYWw8Ym9vbD4gZG9Jc0FsbG93ZWQodWlkX3QgdWlkKTsKLSAgICBzcDxjb250ZW50OjpwbTo6SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPiByZXRyZWl2ZVBhY2thZ2VNYW5hZ2VyKCk7CisgICAgc3A8Y29udGVudDo6cG06OklQYWNrYWdlTWFuYWdlck5hdGl2ZT4gcmV0cmlldmVQYWNrYWdlTWFuYWdlcigpOwogICAgIHNwPGNvbnRlbnQ6OnBtOjpJUGFja2FnZU1hbmFnZXJOYXRpdmU+IG1QYWNrYWdlTWFuYWdlcjsgLy8gVG8gY2hlY2sgYXBwcyBtYW5pZmVzdAogICAgIHVpbnRfdCBtUGFja2FnZU1hbmFnZXJFcnJvcnMgPSAwOwogICAgIHN0cnVjdCBQYWNrYWdlIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL09XTkVSUyBiL3NlcnZpY2VzL09XTkVSUwppbmRleCA2NmE0YmNiLi5mMGI1ZTJmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9PV05FUlMKKysrIGIvc2VydmljZXMvT1dORVJTCkBAIC01LDMgKzUsNSBAQAogZ2thc3RlbkBnb29nbGUuY29tCiBodW5nYUBnb29nbGUuY29tCiBtYXJjb25lQGdvb2dsZS5jb20KK25jaGFsa29AZ29vZ2xlLmNvbQorcXV4aWFuZ2ZhbmdAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5icAppbmRleCAzODczNjAwLi5mZjNiZmQyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5icApAQCAtMSw1ICsxLDI0IEBACiAKIAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X3NlcnZpY2VzX2F1ZGlvZmxpbmdlcl9saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9zZXJ2aWNlc19hdWRpb2ZsaW5nZXJfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJhdWRpb2ZsaW5nZXIiLAogCkBAIC01MCw2ICs2OSw3IEBACiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm5iYWlvIiwKICAgICAgICAgImxpYm5ibG9nIiwKKyAgICAgICAgImxpYnBlcm1pc3Npb24iLAogICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlibWVtdW5yZWFjaGFibGUiLApAQCAtNjcsNiArODcsMTAgQEAKICAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIF0sCiAKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJwZXJtaXNzaW9uIiwKKyAgICBdLAorCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItRFNUQVRFX1FVRVVFX0lOU1RBTlRJQVRJT05TPVwiU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcFwiIiwKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCA3NjRmZGMzLi40YWM0NmI3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtNjg0LDggKzY4NCw4IEBACiAKIHNwPE5CTG9nOjpXcml0ZXI+IEF1ZGlvRmxpbmdlcjo6bmV3V3JpdGVyX2woc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0gICAgLy8gSWYgdGhlcmUgaXMgbm8gbWVtb3J5IGFsbG9jYXRlZCBmb3IgbG9ncywgcmV0dXJuIGEgZHVtbXkgd3JpdGVyIHRoYXQgZG9lcyBub3RoaW5nLgotICAgIC8vIFNpbWlsYXJseSBpZiB3ZSBjYW4ndCBjb250YWN0IHRoZSBtZWRpYS5sb2cgc2VydmljZSwgYWxzbyByZXR1cm4gYSBkdW1teSB3cml0ZXIuCisgICAgLy8gSWYgdGhlcmUgaXMgbm8gbWVtb3J5IGFsbG9jYXRlZCBmb3IgbG9ncywgcmV0dXJuIGEgbm8tb3Agd3JpdGVyIHRoYXQgZG9lcyBub3RoaW5nLgorICAgIC8vIFNpbWlsYXJseSBpZiB3ZSBjYW4ndCBjb250YWN0IHRoZSBtZWRpYS5sb2cgc2VydmljZSwgYWxzbyByZXR1cm4gYSBuby1vcCB3cml0ZXIuCiAgICAgaWYgKG1Mb2dNZW1vcnlEZWFsZXIgPT0gMCB8fCBzTWVkaWFMb2dTZXJ2aWNlID09IDApIHsKICAgICAgICAgcmV0dXJuIG5ldyBOQkxvZzo6V3JpdGVyKCk7CiAgICAgfQpAQCAtNzExLDcgKzcxMSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gRXZlbiBhZnRlciBnYXJiYWdlLWNvbGxlY3RpbmcgYWxsIG9sZCB3cml0ZXJzLCB0aGVyZSBpcyBzdGlsbCBub3QgZW5vdWdoIG1lbW9yeSwKLSAgICAgICAgLy8gc28gcmV0dXJuIGEgZHVtbXkgd3JpdGVyCisgICAgICAgIC8vIHNvIHJldHVybiBhIG5vLW9wIHdyaXRlcgogICAgICAgICByZXR1cm4gbmV3IE5CTG9nOjpXcml0ZXIoKTsKICAgICB9CiBzdWNjZXNzOgpAQCAtMTI4NCw5ICsxMjg0LDkgQEAKICAgICB9CiAKICAgICAvLyBOb3cgc2V0IHRoZSBtYXN0ZXIgbXV0ZSBpbiBlYWNoIHBsYXliYWNrIHRocmVhZC4gIFBsYXliYWNrIHRocmVhZHMKLSAgICAvLyBhc3NpZ25lZCB0byBIQUxzIHdoaWNoIGRvIG5vdCBoYXZlIG1hc3RlciBtdXRlIHN1cHBvcnQgd2lsbCBhcHBseSBtYXN0ZXIKLSAgICAvLyBtdXRlIGR1cmluZyB0aGUgbWl4IG9wZXJhdGlvbi4gIFRocmVhZHMgd2l0aCBIQUxzIHdoaWNoIGRvIHN1cHBvcnQgbWFzdGVyCi0gICAgLy8gbXV0ZSB3aWxsIHNpbXBseSBpZ25vcmUgdGhlIHNldHRpbmcuCisgICAgLy8gYXNzaWduZWQgdG8gSEFMcyB3aGljaCBkbyBub3QgaGF2ZSBtYXN0ZXIgbXV0ZSBzdXBwb3J0IHdpbGwgYXBwbHkgbWFzdGVyIG11dGUKKyAgICAvLyBkdXJpbmcgdGhlIG1peCBvcGVyYXRpb24uICBUaHJlYWRzIHdpdGggSEFMcyB3aGljaCBkbyBzdXBwb3J0IG1hc3RlciBtdXRlCisgICAgLy8gd2lsbCBzaW1wbHkgaWdub3JlIHRoZSBzZXR0aW5nLgogICAgIFZlY3RvcjxWb2x1bWVJbnRlcmZhY2UgKj4gdm9sdW1lSW50ZXJmYWNlcyA9IGdldEFsbFZvbHVtZUludGVyZmFjZXNfbCgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdm9sdW1lSW50ZXJmYWNlcy5zaXplKCk7IGkrKykgewogICAgICAgICB2b2x1bWVJbnRlcmZhY2VzW2ldLT5zZXRNYXN0ZXJNdXRlKG11dGVkKTsKQEAgLTE0NjIsNiArMTQ2MiwyMCBAQAogICAgIH0KIH0KIAorLy8gVXBkYXRlIGRvd25zdHJlYW0gcGF0Y2hlcyBmb3IgYWxsIHBsYXliYWNrIHRocmVhZHMgYXR0YWNoZWQgdG8gYW4gTVNEIG1vZHVsZQordm9pZCBBdWRpb0ZsaW5nZXI6OnVwZGF0ZURvd25TdHJlYW1QYXRjaGVzX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PGF1ZGlvX2lvX2hhbmRsZV90PiBzdHJlYW1zKQoreworICAgIGZvciAoY29uc3QgYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtIDogc3RyZWFtcykgeworICAgICAgICBQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQgPSBjaGVja1BsYXliYWNrVGhyZWFkX2woc3RyZWFtKTsKKyAgICAgICAgaWYgKHBsYXliYWNrVGhyZWFkID09IG51bGxwdHIgfHwgIXBsYXliYWNrVGhyZWFkLT5pc01zZERldmljZSgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBwbGF5YmFja1RocmVhZC0+c2V0RG93blN0cmVhbVBhdGNoKHBhdGNoKTsKKyAgICAgICAgcGxheWJhY2tUaHJlYWQtPnNlbmRJb0NvbmZpZ0V2ZW50KEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCk7CisgICAgfQorfQorCiAvLyBGaWx0ZXIgcmVzZXJ2ZWQga2V5cyBmcm9tIHNldFBhcmFtZXRlcnMoKSBiZWZvcmUgZm9yd2FyZGluZyB0byBhdWRpbyBIQUwgb3IgYWN0aW5nIHVwb24uCiAvLyBTb21lIGtleXMgYXJlIHVzZWQgZm9yIGF1ZGlvIHJvdXRpbmcgYW5kIGF1ZGlvIHBhdGggY29uZmlndXJhdGlvbiBhbmQgc2hvdWxkIGJlIHJlc2VydmVkIGZvciB1c2UKIC8vIGJ5IGF1ZGlvIHBvbGljeSBhbmQgYXVkaW8gZmxpbmdlciBmb3IgZnVuY3Rpb25hbCwgcHJpdmFjeSBhbmQgc2VjdXJpdHkgcmVhc29ucy4KQEAgLTI1MzQsNyArMjU0OCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQsIHRocmVhZC5nZXQoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUGxheWJhY2tUaHJlYWRzLmFkZCgqb3V0cHV0LCB0aHJlYWQpOwotICAgICAgICAgICAgbVBhdGNoUGFuZWwubm90aWZ5U3RyZWFtT3BlbmVkKG91dEh3RGV2LCAqb3V0cHV0KTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICAgICAgICAgIG1QYXRjaFBhbmVsLm5vdGlmeVN0cmVhbU9wZW5lZChvdXRId0RldiwgKm91dHB1dCwgJnBhdGNoKTsKKyAgICAgICAgICAgIGlmICh0aHJlYWQtPmlzTXNkRGV2aWNlKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJlYWQtPnNldERvd25TdHJlYW1QYXRjaCgmcGF0Y2gpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHRocmVhZDsKICAgICAgICAgfQogICAgIH0KQEAgLTMxNDIsNyArMzE2MCw4IEBACiAvLyBkdW1wVG9UaHJlYWRMb2dfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCiB2b2lkIEF1ZGlvRmxpbmdlcjo6ZHVtcFRvVGhyZWFkTG9nX2woY29uc3Qgc3A8VGhyZWFkQmFzZT4gJnRocmVhZCkKIHsKLSAgICBhdWRpb191dGlsczo6RmRUb1N0cmluZyBmZFRvU3RyaW5nOworICAgIGNvbnN0ZXhwciBpbnQgVEhSRUFEX0RVTVBfVElNRU9VVF9NUyA9IDI7CisgICAgYXVkaW9fdXRpbHM6OkZkVG9TdHJpbmcgZmRUb1N0cmluZygiLSAiLCBUSFJFQURfRFVNUF9USU1FT1VUX01TKTsKICAgICBjb25zdCBpbnQgZmQgPSBmZFRvU3RyaW5nLmZkKCk7CiAgICAgaWYgKGZkID49IDApIHsKICAgICAgICAgdGhyZWFkLT5kdW1wKGZkLCB7fSAvKiBhcmdzICovKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAppbmRleCAyMGY1NjFlLi4xMGQ0MDI5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCkBAIC0zMjAsNiArMzIwLDkgQEAKICAgICBzdGF0dXNfdCByZW1vdmVFZmZlY3RGcm9tSGFsKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQsCiAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaHdNb2R1bGVJZCwgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwogCisgICAgdm9pZCB1cGRhdGVEb3duU3RyZWFtUGF0Y2hlc19sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PGF1ZGlvX2lvX2hhbmRsZV90PiBzdHJlYW1zKTsKKwogcHJpdmF0ZToKICAgICAvLyBGSVhNRSBUaGUgNDAwIGlzIHRlbXBvcmFyaWx5IHRvbyBoaWdoIHVudGlsIGEgbGVhayBvZiB3cml0ZXJzIGluIG1lZGlhLmxvZyBpcyBmaXhlZC4KICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtMb2dNZW1vcnlTaXplID0gNDAwICogMTAyNDsKQEAgLTQwNSw3ICs0MDgsNyBAQAogICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT046IHsKICAgICAgICAgICAgIC8vIEhhcHRpYyBjaGFubmVsIG1hc2sgaXMgb25seSBhcHBsaWNhYmxlIGZvciBjaGFubmVsIHBvc2l0aW9uIG1hc2suCiAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soCi0gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrICYgfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihjaGFubmVsTWFzayAmIH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpKTsKICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IG1heENoYW5uZWxDb3VudCA9IGtFbmFibGVFeHRlbmRlZENoYW5uZWxzCiAgICAgICAgICAgICAgICAgICAgID8gQXVkaW9NaXhlcjo6TUFYX05VTV9DSEFOTkVMUyA6IEZDQ18yOwogICAgICAgICAgICAgaWYgKGNoYW5uZWxDb3VudCA8IEZDQ18yIC8vIG1vbm8gaXMgbm90IHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUKQEAgLTY0Miw2ICs2NDUsMTMgQEAKICAgICAgICAgdmlydHVhbCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKSBvdmVycmlkZTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgc2lnbmFsKCk7IC8vIHNpZ25hbCBwbGF5YmFjayB0aHJlYWQgZm9yIGEgY2hhbmdlIGluIGNvbnRyb2wgYmxvY2sKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCogbW9kZSkgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0RHVhbE1vbm9Nb2RlKGF1ZGlvX2R1YWxfbW9ub19tb2RlX3QgbW9kZSkgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0KiBsZXZlbGRCKSBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQgbGV2ZWxkQikgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycyhhdWRpb19wbGF5YmFja19yYXRlX3QqIHBsYXliYWNrUmF0ZSkgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycygKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3BsYXliYWNrX3JhdGVfdCYgcGxheWJhY2tSYXRlKSBvdmVycmlkZTsKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG9uVHJhbnNhY3QoCiAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuY3BwCmluZGV4IDdlMDYwOTYuLmQ4NTY1YmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmNwcApAQCAtMTczLDIyICsxNzMsMTUgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1hdWRpb19mb3JtYXRfdCBBdWRpb1N0cmVhbU91dDo6Z2V0Rm9ybWF0KCkgY29uc3QKK2F1ZGlvX2NvbmZpZ19iYXNlX3QgQXVkaW9TdHJlYW1PdXQ6OmdldEF1ZGlvUHJvcGVydGllcygpIGNvbnN0CiB7Ci0gICAgYXVkaW9fZm9ybWF0X3QgcmVzdWx0OwotICAgIHJldHVybiBzdHJlYW0tPmdldEZvcm1hdCgmcmVzdWx0KSA9PSBPSyA/IHJlc3VsdCA6IEFVRElPX0ZPUk1BVF9JTlZBTElEOwotfQotCi11aW50MzJfdCBBdWRpb1N0cmVhbU91dDo6Z2V0U2FtcGxlUmF0ZSgpIGNvbnN0Ci17Ci0gICAgdWludDMyX3QgcmVzdWx0OwotICAgIHJldHVybiBzdHJlYW0tPmdldFNhbXBsZVJhdGUoJnJlc3VsdCkgPT0gT0sgPyByZXN1bHQgOiAwOwotfQotCi1hdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb1N0cmVhbU91dDo6Z2V0Q2hhbm5lbE1hc2soKSBjb25zdAotewotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHJlc3VsdDsKLSAgICByZXR1cm4gc3RyZWFtLT5nZXRDaGFubmVsTWFzaygmcmVzdWx0KSA9PSBPSyA/IHJlc3VsdCA6IEFVRElPX0NIQU5ORUxfSU5WQUxJRDsKKyAgICBhdWRpb19jb25maWdfYmFzZV90IHJlc3VsdCA9IEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOworICAgIGlmIChzdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygmcmVzdWx0KSAhPSBPSykgeworICAgICAgICByZXN1bHQuc2FtcGxlX3JhdGUgPSAwOworICAgICAgICByZXN1bHQuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9JTlZBTElEOworICAgICAgICByZXN1bHQuZm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGludCBBdWRpb1N0cmVhbU91dDo6Zmx1c2goKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuaAppbmRleCAxNmZiY2YyLi41NjVmNDNhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuaApAQCAtODEsMjIgKzgxLDE0IEBACiAgICAgdmlydHVhbCBzaXplX3QgZ2V0RnJhbWVTaXplKCkgY29uc3QgeyByZXR1cm4gbUhhbEZyYW1lU2l6ZTsgfQogCiAgICAgLyoqCi0gICAgICogQHJldHVybiBmb3JtYXQgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgQXVkaW9GbGluZ2VyLgorICAgICAqIEByZXR1cm4gYXVkaW8gc3RyZWFtIGNvbmZpZ3VyYXRpb246IGNoYW5uZWwgbWFzaywgZm9ybWF0LCBzYW1wbGUgcmF0ZToKKyAgICAgKiAgIC0gY2hhbm5lbCBtYXNrIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIEF1ZGlvRmxpbmdlciwKKyAgICAgKiAgICAgVGhlIEhBTCBpcyBpbiBzdGVyZW8gbW9kZSB3aGVuIHBsYXlpbmcgbXVsdGktY2hhbm5lbCBjb21wcmVzc2VkIGF1ZGlvIG92ZXIgSERNSTsKKyAgICAgKiAgIC0gZm9ybWF0IGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIEF1ZGlvRmxpbmdlcjsKKyAgICAgKiAgIC0gc2FtcGxlIHJhdGUgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgQXVkaW9GbGluZ2VyLAorICAgICAqICAgICBUaGUgSEFMIG1heSBiZSBydW5uaW5nIGF0IGEgaGlnaGVyIHNhbXBsZSByYXRlIGlmLCBmb3IgZXhhbXBsZSwgcGxheWluZyB3cmFwcGVkIEVBQzMuCiAgICAgICovCi0gICAgdmlydHVhbCBhdWRpb19mb3JtYXRfdCBnZXRGb3JtYXQoKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIFRoZSBIQUwgbWF5IGJlIHJ1bm5pbmcgYXQgYSBoaWdoZXIgc2FtcGxlIHJhdGUgaWYsIGZvciBleGFtcGxlLCBwbGF5aW5nIHdyYXBwZWQgRUFDMy4KLSAgICAgKiBAcmV0dXJuIHNhbXBsZSByYXRlIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIEF1ZGlvRmxpbmdlci4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIFRoZSBIQUwgaXMgaW4gc3RlcmVvIG1vZGUgd2hlbiBwbGF5aW5nIG11bHRpLWNoYW5uZWwgY29tcHJlc3NlZCBhdWRpbyBvdmVyIEhETUkuCi0gICAgICogQHJldHVybiBjaGFubmVsIG1hc2sgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgQXVkaW9GbGluZ2VyLgotICAgICAqLwotICAgIHZpcnR1YWwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgZ2V0Q2hhbm5lbE1hc2soKSBjb25zdDsKLQorICAgIHZpcnR1YWwgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRBdWRpb1Byb3BlcnRpZXMoKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAppbmRleCAzZGZlYjgzLi5lZWJhYTdlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCkBAIC0yOTIsNiArMjkyLDkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIFByZXZlbnQgY2FsbHMgdG8gcHJvY2VzcygpIGFuZCBvdGhlciBmdW5jdGlvbnMgb24gZWZmZWN0IGludGVyZmFjZSBmcm9tIG5vdyBvbi4KKyAgICAvLyBUaGUgZWZmZWN0IGVuZ2luZSB3aWxsIGJlIHJlbGVhc2VkIGJ5IHRoZSBkZXN0cnVjdG9yIHdoZW4gdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZSBvbgorICAgIC8vIHRoaXMgb2JqZWN0IGlzIHJlbGVhc2VkIHdoaWNoIGNhbiBoYXBwZW4gYWZ0ZXIgbmV4dCBwcm9jZXNzIGlzIGNhbGxlZC4KICAgICBpZiAobUhhbmRsZXMuc2l6ZSgpID09IDAgJiYgIW1QaW5uZWQpIHsKICAgICAgICAgbVN0YXRlID0gREVTVFJPWUVEOwogICAgIH0KQEAgLTU2NSwyMCArNTY4LDYgQEAKIAogfQogCi1zc2l6ZV90IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpyZW1vdmVIYW5kbGVfbChFZmZlY3RIYW5kbGUgKmhhbmRsZSkKLXsKLSAgICBzc2l6ZV90IHN0YXR1cyA9IEVmZmVjdEJhc2U6OnJlbW92ZUhhbmRsZV9sKGhhbmRsZSk7Ci0KLSAgICAvLyBQcmV2ZW50IGNhbGxzIHRvIHByb2Nlc3MoKSBhbmQgb3RoZXIgZnVuY3Rpb25zIG9uIGVmZmVjdCBpbnRlcmZhY2UgZnJvbSBub3cgb24uCi0gICAgLy8gVGhlIGVmZmVjdCBlbmdpbmUgd2lsbCBiZSByZWxlYXNlZCBieSB0aGUgZGVzdHJ1Y3RvciB3aGVuIHRoZSBsYXN0IHN0cm9uZyByZWZlcmVuY2Ugb24KLSAgICAvLyB0aGlzIG9iamVjdCBpcyByZWxlYXNlZCB3aGljaCBjYW4gaGFwcGVuIGFmdGVyIG5leHQgcHJvY2VzcyBpcyBjYWxsZWQuCi0gICAgaWYgKHN0YXR1cyA9PSAwICYmICFtUGlubmVkKSB7Ci0gICAgICAgIG1FZmZlY3RJbnRlcmZhY2UtPmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQogYm9vbCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6dXBkYXRlU3RhdGUoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIApAQCAtMzAwNSw3ICsyOTk0LDcgQEAKICAgICAgICAgICAgIF9fZnVuY19fLCBwb3J0LT50eXBlLCBwb3J0LT5leHQuZGV2aWNlLnR5cGUsCiAgICAgICAgICAgICBwb3J0LT5leHQuZGV2aWNlLmFkZHJlc3MsIHBvcnQtPmlkLCBwYXRjaC5pc1NvZnR3YXJlKCkpOwogICAgIGlmIChwb3J0LT50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfHwgcG9ydC0+ZXh0LmRldmljZS50eXBlICE9IG1EZXZpY2UubVR5cGUKLSAgICAgICAgfHwgcG9ydC0+ZXh0LmRldmljZS5hZGRyZXNzICE9IG1EZXZpY2UubUFkZHJlc3MpIHsKKyAgICAgICAgfHwgcG9ydC0+ZXh0LmRldmljZS5hZGRyZXNzICE9IG1EZXZpY2UuYWRkcmVzcygpKSB7CiAgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKICAgICB9CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTkFNRV9OT1RfRk9VTkQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaAppbmRleCAyODI2Mjk3Li4yYzc5YWM1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKQEAgLTE0NCw3ICsxNDQsNyBAQAogICAgIHN0YXR1c190IGFkZEhhbmRsZShFZmZlY3RIYW5kbGUgKmhhbmRsZSk7CiAgICAgc3NpemVfdCBkaXNjb25uZWN0SGFuZGxlKEVmZmVjdEhhbmRsZSAqaGFuZGxlLCBib29sIHVucGluSWZMYXN0KTsKICAgICBzc2l6ZV90IHJlbW92ZUhhbmRsZShFZmZlY3RIYW5kbGUgKmhhbmRsZSk7Ci0gICAgdmlydHVhbCBzc2l6ZV90IHJlbW92ZUhhbmRsZV9sKEVmZmVjdEhhbmRsZSAqaGFuZGxlKTsKKyAgICBzc2l6ZV90IHJlbW92ZUhhbmRsZV9sKEVmZmVjdEhhbmRsZSAqaGFuZGxlKTsKICAgICBFZmZlY3RIYW5kbGUqIGNvbnRyb2xIYW5kbGVfbCgpOwogICAgIGJvb2wgcHVyZ2VIYW5kbGVzKCk7CiAKQEAgLTI0MCw4ICsyNDAsNiBAQAogICAgICAgICByZXR1cm4gbU91dEJ1ZmZlciAhPSAwID8gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4obU91dEJ1ZmZlci0+cHRyKCkpIDogTlVMTDsKICAgICB9CiAKLSAgICBzc2l6ZV90IHJlbW92ZUhhbmRsZV9sKEVmZmVjdEhhbmRsZSAqaGFuZGxlKSBvdmVycmlkZTsKLQogICAgIHN0YXR1c190ICAgICAgICAgc2V0RGV2aWNlcyhjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKTsKICAgICBzdGF0dXNfdCAgICAgICAgIHNldElucHV0RGV2aWNlKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSk7CiAgICAgc3RhdHVzX3QgICAgICAgICBzZXRWb2x1bWUodWludDMyX3QgKmxlZnQsIHVpbnQzMl90ICpyaWdodCwgYm9vbCBjb250cm9sbGVyKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKaW5kZXggM2VhY2M4Yy4uMTNlMmNlZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKQEAgLTI3LDcgKzI3LDYgQEAKIAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgpAQCAtNDAsNiArMzksNyBAQAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbW9ub19ibGVuZC5oPgorI2luY2x1ZGUgPGN1dGlscy9iaXRvcHMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb01peGVyLmg+CiAjaW5jbHVkZSAiRmFzdE1peGVyLmgiCiAjaW5jbHVkZSAiVHlwZWRMb2dnZXIuaCIKQEAgLTM1Myw3ICszNTMsOCBAQAogI2VuZGlmCiAgICAgICAgIC8vQUxPR0QoIkVyaWMgRmFzdE1peGVyOjpvbldvcmsoKSBtSXNXYXJtIik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZHVtcFN0YXRlLT5tVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOworICAgICAgICBkdW1wU3RhdGUtPm1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KAorICAgICAgICAgICAgZHVtcFN0YXRlLT5tVGltZXN0YW1wVmVyaWZpZXIuRElTQ09OVElOVUlUWV9NT0RFX0NPTlRJTlVPVVMpOwogICAgICAgICAvLyBTZWUgY29tbWVudCBpbiBpZiBibG9jay4KICNpZmRlZiBGQVNUTUlYRVJfTE9HX0hJU1RfVFMKICAgICAgICAgTE9HX0FVRElPX1NUQVRFKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCmluZGV4IGE0MmUwOWMuLjNmMjAyODIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8Y3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuaD4KICNlbmRpZgogI2VuZGlmCi0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlICJGYXN0TWl4ZXJEdW1wU3RhdGUuaCIKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9PV05FUlMKaW5kZXggZDAyZDllMC4uMDM0ZDE2MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUworKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvT1dORVJTCkBAIC0xLDQgKzEsNCBAQAorZ2thc3RlbkBnb29nbGUuY29tCiBodW5nYUBnb29nbGUuY29tCiBqbXRyaXZpQGdvb2dsZS5jb20KIG1uYWdhbm92QGdvb2dsZS5jb20KLWdrYXN0ZW5AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCmluZGV4IGI1OGZkOGIuLjAzMGM5MjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKQEAgLTExMSw3ICsxMTEsOCBAQAogCiAvKiBDb25uZWN0IGEgcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5kcG9pbnRQYXRjaCkKIHsKICAgICBpZiAoaGFuZGxlID09IE5VTEwgfHwgcGF0Y2ggPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMTc0LDcgKzE3NSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBQYXRjaCBuZXdQYXRjaHsqcGF0Y2h9OworICAgIFBhdGNoIG5ld1BhdGNoeypwYXRjaCwgZW5kcG9pbnRQYXRjaH07CiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGluc2VydGVkTW9kdWxlID0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOwogCiAgICAgc3dpdGNoIChwYXRjaC0+c291cmNlc1swXS50eXBlKSB7CkBAIC0zOTYsMTAgKzM5NywxNSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyByZW1vdmUgc3RhbGUgYXVkaW8gcGF0Y2ggd2l0aCBzYW1lIG91dHB1dCBhcyBzb3VyY2UgaWYgYW55Ci0gICAgICAgICAgICBmb3IgKGF1dG8mIGl0ZXIgOiBtUGF0Y2hlcykgewotICAgICAgICAgICAgICAgIGlmIChpdGVyLnNlY29uZC5tQXVkaW9QYXRjaC5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlID09IHRocmVhZC0+aWQoKSkgewotICAgICAgICAgICAgICAgICAgICBlcmFzZVBhdGNoKGl0ZXIuZmlyc3QpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vIFByZXZlbnQgdG8gcmVtb3ZlIGVuZHBvaW50IHBhdGNoZXMgKGludm9sdmVkIGluIGEgU3dCcmlkZ2UpCisgICAgICAgICAgICAvLyBQcmV2ZW50IHRvIHJlbW92ZSBBdWRpb1BhdGNoIHVzZWQgdG8gcm91dGUgYW4gb3V0cHV0IGludm9sdmVkIGluIGFuIGVuZHBvaW50LgorICAgICAgICAgICAgaWYgKCFlbmRwb2ludFBhdGNoKSB7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBpdGVyIDogbVBhdGNoZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXIuc2Vjb25kLm1BdWRpb1BhdGNoLnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUgPT0gdGhyZWFkLT5pZCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWl0ZXIuc2Vjb25kLm1Jc0VuZHBvaW50UGF0Y2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyYXNlUGF0Y2goaXRlci5maXJzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBicmVhazsKQEAgLTQxMywxMCArNDE5LDEwIEBACiAgICAgICAgICpoYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpIG1BdWRpb0ZsaW5nZXIubmV4dFVuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfUEFUQ0gpOwogICAgICAgICBuZXdQYXRjaC5tSGFsSGFuZGxlID0gaGFsSGFuZGxlOwogICAgICAgICBtQXVkaW9GbGluZ2VyLm1EZXZpY2VFZmZlY3RNYW5hZ2VyLmNyZWF0ZUF1ZGlvUGF0Y2goKmhhbmRsZSwgbmV3UGF0Y2gpOwotICAgICAgICBtUGF0Y2hlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoKmhhbmRsZSwgc3RkOjptb3ZlKG5ld1BhdGNoKSkpOwogICAgICAgICBpZiAoaW5zZXJ0ZWRNb2R1bGUgIT0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBhZGRTb2Z0d2FyZVBhdGNoVG9JbnNlcnRlZE1vZHVsZXMoaW5zZXJ0ZWRNb2R1bGUsICpoYW5kbGUpOworICAgICAgICAgICAgYWRkU29mdHdhcmVQYXRjaFRvSW5zZXJ0ZWRNb2R1bGVzKGluc2VydGVkTW9kdWxlLCAqaGFuZGxlLCAmbmV3UGF0Y2gubUF1ZGlvUGF0Y2gpOwogICAgICAgICB9CisgICAgICAgIG1QYXRjaGVzLmluc2VydChzdGQ6Om1ha2VfcGFpcigqaGFuZGxlLCBzdGQ6Om1vdmUobmV3UGF0Y2gpKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbmV3UGF0Y2guY2xlYXJDb25uZWN0aW9ucyh0aGlzKTsKICAgICB9CkBAIC00MzUsNyArNDQxLDggQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYW5lbC0+Y3JlYXRlQXVkaW9QYXRjaCgKICAgICAgICAgICAgIFBhdGNoQnVpbGRlcigpLmFkZFNvdXJjZShtQXVkaW9QYXRjaC5zb3VyY2VzWzBdKS4KICAgICAgICAgICAgICAgICBhZGRTaW5rKG1SZWNvcmQudGhyZWFkKCksIHsgLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUMgfSkucGF0Y2goKSwKLSAgICAgICAgICAgIG1SZWNvcmQuaGFuZGxlUHRyKCkpOworICAgICAgICAgICAgbVJlY29yZC5oYW5kbGVQdHIoKSwKKyAgICAgICAgICAgIHRydWUgLyplbmRwb2ludFBhdGNoKi8pOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgKm1SZWNvcmQuaGFuZGxlUHRyKCkgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTQ0NSw3ICs0NTIsOCBAQAogICAgIGlmIChtQXVkaW9QYXRjaC5udW1fc2lua3MgIT0gMCkgewogICAgICAgICBzdGF0dXMgPSBwYW5lbC0+Y3JlYXRlQXVkaW9QYXRjaCgKICAgICAgICAgICAgICAgICBQYXRjaEJ1aWxkZXIoKS5hZGRTb3VyY2UobVBsYXliYWNrLnRocmVhZCgpKS5hZGRTaW5rKG1BdWRpb1BhdGNoLnNpbmtzWzBdKS5wYXRjaCgpLAotICAgICAgICAgICAgICAgIG1QbGF5YmFjay5oYW5kbGVQdHIoKSk7CisgICAgICAgICAgICAgICAgbVBsYXliYWNrLmhhbmRsZVB0cigpLAorICAgICAgICAgICAgICAgIHRydWUgLyplbmRwb2ludFBhdGNoKi8pOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAqbVBsYXliYWNrLmhhbmRsZVB0cigpID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwpAQCAtNzgxLDEwICs3ODksMjAgQEAKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6Om5vdGlmeVN0cmVhbU9wZW5lZCgKLSAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSwgYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtKQorICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0sIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gpCiB7CiAgICAgaWYgKGF1ZGlvSHdEZXZpY2UtPmlzSW5zZXJ0KCkpIHsKICAgICAgICAgbUluc2VydGVkTW9kdWxlc1thdWRpb0h3RGV2aWNlLT5oYW5kbGUoKV0uc3RyZWFtcy5pbnNlcnQoc3RyZWFtKTsKKyAgICAgICAgaWYgKHBhdGNoICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yIDxTb2Z0d2FyZVBhdGNoPiBzd1BhdGNoZXM7CisgICAgICAgICAgICBnZXREb3duc3RyZWFtU29mdHdhcmVQYXRjaGVzKHN0cmVhbSwgJnN3UGF0Y2hlcyk7CisgICAgICAgICAgICBpZiAoc3dQYXRjaGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBhdXRvIGl0ZXIgPSBtUGF0Y2hlcy5maW5kKHN3UGF0Y2hlc1swXS5nZXRQYXRjaEhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlciAhPSBtUGF0Y2hlcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAqcGF0Y2ggPSBpdGVyLT5zZWNvbmQubUF1ZGlvUGF0Y2g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogfQogCkBAIC04MTMsOSArODMxLDEzIEBACiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjphZGRTb2Z0d2FyZVBhdGNoVG9JbnNlcnRlZE1vZHVsZXMoCi0gICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKKyAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoKQogewogICAgIG1JbnNlcnRlZE1vZHVsZXNbbW9kdWxlXS5zd19wYXRjaGVzLmluc2VydChoYW5kbGUpOworICAgIGlmICghbUluc2VydGVkTW9kdWxlc1ttb2R1bGVdLnN0cmVhbXMuZW1wdHkoKSkgeworICAgICAgICBtQXVkaW9GbGluZ2VyLnVwZGF0ZURvd25TdHJlYW1QYXRjaGVzX2wocGF0Y2gsIG1JbnNlcnRlZE1vZHVsZXNbbW9kdWxlXS5zdHJlYW1zKTsKKyAgICB9CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpyZW1vdmVTb2Z0d2FyZVBhdGNoRnJvbUluc2VydGVkTW9kdWxlcygKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5oCmluZGV4IDg5ZDRlYjEuLjM4ZjA2MTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuaApAQCAtNTYsNyArNTYsOCBAQAogCiAgICAgLyogQ3JlYXRlIGEgcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLwogICAgIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5kcG9pbnRQYXRjaCA9IGZhbHNlKTsKIAogICAgIC8qIFJlbGVhc2UgYSBwYXRjaCAqLwogICAgIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CkBAIC03MSw3ICs3Miw4IEBACiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTb2Z0d2FyZVBhdGNoPiAqcGF0Y2hlcykgY29uc3Q7CiAKICAgICAvLyBOb3RpZmllcyBwYXRjaCBwYW5lbCBhYm91dCBhbGwgb3BlbmVkIGFuZCBjbG9zZWQgc3RyZWFtcy4KLSAgICB2b2lkIG5vdGlmeVN0cmVhbU9wZW5lZChBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0pOworICAgIHZvaWQgbm90aWZ5U3RyZWFtT3BlbmVkKEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoKTsKICAgICB2b2lkIG5vdGlmeVN0cmVhbUNsb3NlZChhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0pOwogCiAgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7CkBAIC0xNjAsNyArMTYyLDggQEAKIAogICAgIGNsYXNzIFBhdGNoIGZpbmFsIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIGV4cGxpY2l0IFBhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAmcGF0Y2gpIDogbUF1ZGlvUGF0Y2gocGF0Y2gpIHt9CisgICAgICAgIFBhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAmcGF0Y2gsIGJvb2wgZW5kcG9pbnRQYXRjaCkgOgorICAgICAgICAgICAgbUF1ZGlvUGF0Y2gocGF0Y2gpLCBtSXNFbmRwb2ludFBhdGNoKGVuZHBvaW50UGF0Y2gpIHt9CiAgICAgICAgIFBhdGNoKCkgPSBkZWZhdWx0OwogICAgICAgICB+UGF0Y2goKTsKICAgICAgICAgUGF0Y2goY29uc3QgUGF0Y2gmIG90aGVyKSBub2V4Y2VwdCB7CkBAIC0xNjksNiArMTcyLDcgQEAKICAgICAgICAgICAgIG1QbGF5YmFjayA9IG90aGVyLm1QbGF5YmFjazsKICAgICAgICAgICAgIG1SZWNvcmQgPSBvdGhlci5tUmVjb3JkOwogICAgICAgICAgICAgbVRocmVhZCA9IG90aGVyLm1UaHJlYWQ7CisgICAgICAgICAgICBtSXNFbmRwb2ludFBhdGNoID0gb3RoZXIubUlzRW5kcG9pbnRQYXRjaDsKICAgICAgICAgfQogICAgICAgICBQYXRjaChQYXRjaCYmIG90aGVyKSBub2V4Y2VwdCB7IHN3YXAob3RoZXIpOyB9CiAgICAgICAgIFBhdGNoJiBvcGVyYXRvcj0oUGF0Y2gmJiBvdGhlcikgbm9leGNlcHQgewpAQCAtMTgzLDYgKzE4Nyw3IEBACiAgICAgICAgICAgICBzd2FwKG1QbGF5YmFjaywgb3RoZXIubVBsYXliYWNrKTsKICAgICAgICAgICAgIHN3YXAobVJlY29yZCwgb3RoZXIubVJlY29yZCk7CiAgICAgICAgICAgICBzd2FwKG1UaHJlYWQsIG90aGVyLm1UaHJlYWQpOworICAgICAgICAgICAgc3dhcChtSXNFbmRwb2ludFBhdGNoLCBvdGhlci5tSXNFbmRwb2ludFBhdGNoKTsKICAgICAgICAgfQogCiAgICAgICAgIGZyaWVuZCB2b2lkIHN3YXAoUGF0Y2ggJmEsIFBhdGNoICZiKSBub2V4Y2VwdCB7CkBAIC0yMTcsNiArMjIyLDcgQEAKICAgICAgICAgRW5kcG9pbnQ8UmVjb3JkVGhyZWFkLCBSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkPiBtUmVjb3JkOwogCiAgICAgICAgIHdwPFRocmVhZEJhc2U+IG1UaHJlYWQ7CisgICAgICAgIGJvb2wgbUlzRW5kcG9pbnRQYXRjaDsKICAgICB9OwogCiAgICAgLy8gQ2FsbCB3aXRoIEF1ZGlvRmxpbmdlciBtTG9jayBoZWxkCkBAIC0yMjYsNyArMjMyLDggQEAKICAgICBBdWRpb0h3RGV2aWNlKiBmaW5kQXVkaW9Id0RldmljZUJ5TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUpOwogICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gZmluZEh3RGV2aWNlQnlNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSk7CiAgICAgdm9pZCBhZGRTb2Z0d2FyZVBhdGNoVG9JbnNlcnRlZE1vZHVsZXMoCi0gICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCk7CiAgICAgdm9pZCByZW1vdmVTb2Z0d2FyZVBhdGNoRnJvbUluc2VydGVkTW9kdWxlcyhhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOwogICAgIHZvaWQgZXJhc2VQYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCmluZGV4IGEyZGYyOWIuLjk3NzAwNTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCkBAIC0xMTcsNiArMTE3LDEyIEBACiAgICAgICAgICAgICBpbnQgICAgICAgICBhdXhFZmZlY3RJZCgpIGNvbnN0IHsgcmV0dXJuIG1BdXhFZmZlY3RJZDsgfQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApOwogICAgICAgICAgICAgdm9pZCAgICAgICAgc2lnbmFsKCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCogbW9kZSk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCBtb2RlKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgIGdldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCogbGV2ZWxkQik7CisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQgbGV2ZWxkQik7CisgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKGF1ZGlvX3BsYXliYWNrX3JhdGVfdCogcGxheWJhY2tSYXRlKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoY29uc3QgYXVkaW9fcGxheWJhY2tfcmF0ZV90JiBwbGF5YmFja1JhdGUpOwogCiAvLyBpbXBsZW1lbnQgRmFzdE1peGVyU3RhdGU6OlZvbHVtZVByb3ZpZGVyIGludGVyZmFjZQogICAgIHZpcnR1YWwgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgZ2V0Vm9sdW1lTFIoKTsKQEAgLTE0OCw3ICsxNTQsNyBAQAogICAgICAqLwogICAgIGJvb2wgICAgICAgICAgICByZWFkQW5kQ2xlYXJIYXNDaGFuZ2VkKCkgeyByZXR1cm4gIW1DaGFuZ2VOb3RpZmllZC50ZXN0X2FuZF9zZXQoKTsgfQogCi0gICAgdXNpbmcgU291cmNlTWV0YWRhdGFzID0gc3RkOjp2ZWN0b3I8cGxheWJhY2tfdHJhY2tfbWV0YWRhdGFfdD47CisgICAgdXNpbmcgU291cmNlTWV0YWRhdGFzID0gc3RkOjp2ZWN0b3I8cGxheWJhY2tfdHJhY2tfbWV0YWRhdGFfdjdfdD47CiAgICAgdXNpbmcgTWV0YWRhdGFJbnNlcnRlciA9IHN0ZDo6YmFja19pbnNlcnRfaXRlcmF0b3I8U291cmNlTWV0YWRhdGFzPjsKICAgICAvKiogQ29weSB0aGUgdHJhY2sgbWV0YWRhdGEgaW4gdGhlIHByb3ZpZGVkIGl0ZXJhdG9yLiBUaHJlYWQgc2FmZS4gKi8KICAgICB2aXJ0dWFsIHZvaWQgICAgY29weU1ldGFkYXRhVG8oTWV0YWRhdGFJbnNlcnRlciYgYmFja0luc2VydGVyKSBjb25zdDsKQEAgLTIxMSw2ICsyMTcsMTAgQEAKICAgICB2b2lkIGZsdXNoQWNrKCk7CiAgICAgYm9vbCBpc1Jlc3VtZVBlbmRpbmcoKTsKICAgICB2b2lkIHJlc3VtZUFjaygpOworICAgIC8vIEZvciBkaXJlY3Qgb3Igb2ZmbG9hZGVkIHRyYWNrcyBlbnN1cmUgdGhhdCB0aGUgcGF1c2Ugc3RhdGUgaXMgYWNrbm93bGVkZ2VkCisgICAgLy8gYnkgdGhlIHBsYXliYWNrIHRocmVhZCBpbiBjYXNlIG9mIGFuIGltbWVkaWF0ZSBmbHVzaC4KKyAgICBib29sIGlzUGF1c2VQZW5kaW5nKCkgY29uc3QgeyByZXR1cm4gbVBhdXNlSHdQZW5kaW5nOyB9CisgICAgdm9pZCBwYXVzZUFjaygpOwogICAgIHZvaWQgdXBkYXRlVHJhY2tGcmFtZUluZm8oaW50NjRfdCB0cmFja0ZyYW1lc1JlbGVhc2VkLCBpbnQ2NF90IHNpbmtGcmFtZXNXcml0dGVuLAogICAgICAgICAgICAgdWludDMyX3QgaGFsU2FtcGxlUmF0ZSwgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVTdGFtcCk7CiAKQEAgLTI3OCw4ICsyODgsMTAgQEAKICAgICB9OwogICAgIHNwPEF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcj4gbUF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcjsKICAgICBzcDxvczo6RXh0ZXJuYWxWaWJyYXRpb24+ICAgIG1FeHRlcm5hbFZpYnJhdGlvbjsKLSAgICAvKiogSG93IG1hbnkgZnJhbWVzIHNob3VsZCBiZSBpbiB0aGUgYnVmZmVyIGJlZm9yZSB0aGUgdHJhY2sgaXMgY29uc2lkZXJlZCByZWFkeSAqLwotICAgIGNvbnN0IHNpemVfdCAgICAgICAgbUZyYW1lQ291bnRUb0JlUmVhZHk7CisKKyAgICBhdWRpb19kdWFsX21vbm9fbW9kZV90IG1EdWFsTW9ub01vZGUgPSBBVURJT19EVUFMX01PTk9fTU9ERV9PRkY7CisgICAgZmxvYXQgICAgICAgICAgICAgICBtQXVkaW9EZXNjcmlwdGlvbk1peExldmVsID0gLXN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOworICAgIGF1ZGlvX3BsYXliYWNrX3JhdGVfdCAgbVBsYXliYWNrUmF0ZVBhcmFtZXRlcnMgPSBBVURJT19QTEFZQkFDS19SQVRFX0lOSVRJQUxJWkVSOwogCiBwcml2YXRlOgogICAgIHZvaWQgICAgICAgICAgICAgICAgaW50ZXJjZXB0QnVmZmVyKGNvbnN0IEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciYgYnVmZmVyKTsKQEAgLTMwNCw2ICszMTYsNyBAQAogICAgIHNwPEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eT4gIG1BdWRpb1RyYWNrU2VydmVyUHJveHk7CiAgICAgYm9vbCAgICAgICAgICAgICAgICBtUmVzdW1lVG9TdG9wcGluZzsgLy8gdHJhY2sgd2FzIHBhdXNlZCBpbiBzdG9wcGluZyBzdGF0ZS4KICAgICBib29sICAgICAgICAgICAgICAgIG1GbHVzaEh3UGVuZGluZzsgLy8gdHJhY2sgcmVxdWVzdHMgZm9yIHRocmVhZCBmbHVzaAorICAgIGJvb2wgICAgICAgICAgICAgICAgbVBhdXNlSHdQZW5kaW5nID0gZmFsc2U7IC8vIGRpcmVjdC9vZmZsb2FkIHRyYWNrIHJlcXVlc3QgZm9yIHRocmVhZCBwYXVzZQogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsKICAgICAvLyBJZiB0aGUgbGFzdCB0cmFjayBjaGFuZ2Ugd2FzIG5vdGlmaWVkIHRvIHRoZSBjbGllbnQgd2l0aCByZWFkQW5kQ2xlYXJIYXNDaGFuZ2VkCiAgICAgc3RkOjphdG9taWNfZmxhZyAgICAgbUNoYW5nZU5vdGlmaWVkID0gQVRPTUlDX0ZMQUdfSU5JVDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TcGRpZlN0cmVhbU91dC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3BkaWZTdHJlYW1PdXQuY3BwCmluZGV4IGM3YWJhNzkuLjBjZTU2ODEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TcGRpZlN0cmVhbU91dC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NwZGlmU3RyZWFtT3V0LmNwcApAQCAtMzksNyArMzksNyBAQAogICAgICAgICAsIG1TcGRpZkVuY29kZXIodGhpcywgZm9ybWF0KQogICAgICAgICAsIG1BcHBsaWNhdGlvbkZvcm1hdChBVURJT19GT1JNQVRfREVGQVVMVCkKICAgICAgICAgLCBtQXBwbGljYXRpb25TYW1wbGVSYXRlKDApCi0gICAgICAgICwgbUFwcGxpY2F0aW9uQ2hhbm5lbE1hc2soMCkKKyAgICAgICAgLCBtQXBwbGljYXRpb25DaGFubmVsTWFzayhBVURJT19DSEFOTkVMX05PTkUpCiB7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAppbmRleCAxZDAxNDdkLi44OGM5YmE1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db250YWluZXJzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oPgpAQCAtMTE5LDEyICsxMjAsMjYgQEAKIC8vIDUwICogfjIwbXNlY3MgPSAxIHNlY29uZAogc3RhdGljIGNvbnN0IGludDhfdCBrTWF4VHJhY2tSZXRyaWVzID0gNTA7CiBzdGF0aWMgY29uc3QgaW50OF90IGtNYXhUcmFja1N0YXJ0dXBSZXRyaWVzID0gNTA7CisKIC8vIGFsbG93IGxlc3MgcmV0cnkgYXR0ZW1wdHMgb24gZGlyZWN0IG91dHB1dCB0aHJlYWQuCiAvLyBkaXJlY3Qgb3V0cHV0cyBjYW4gYmUgYSBzY2FyY2UgcmVzb3VyY2UgaW4gYXVkaW8gaGFyZHdhcmUgYW5kIHNob3VsZAogLy8gYmUgcmVsZWFzZWQgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4KLXN0YXRpYyBjb25zdCBpbnQ4X3Qga01heFRyYWNrUmV0cmllc0RpcmVjdCA9IDI7Ci0KLQorLy8gTm90ZXM6CisvLyAxKSBUaGUgcmV0cnkgZHVyYXRpb24ga01heFRyYWNrUmV0cmllc0RpcmVjdE1zIG1heSBiZSBpbmNyZWFzZWQKKy8vICAgIGluIGNhc2UgdGhlIGRhdGEgd3JpdGUgaXMgYnVyc3R5IGZvciB0aGUgQXVkaW9UcmFjay4gIFRoZSBhcHBsaWNhdGlvbgorLy8gICAgc2hvdWxkIGVuZGVhdm9yIHRvIHdyaXRlIGF0IGxlYXN0IG9uY2UgZXZlcnkga01heFRyYWNrUmV0cmllc0RpcmVjdE1zCisvLyAgICB0byBwcmV2ZW50IGFuIHVuZGVycnVuIHNpdHVhdGlvbi4gIElmIHRoZSBkYXRhIGlzIGJ1cnN0eSwgdGhlbgorLy8gICAgdGhlIGFwcGxpY2F0aW9uIGNhbiBhbHNvIHRocm90dGxlIHRoZSBkYXRhIHNlbnQgdG8gYmUgZXZlbi4KKy8vIDIpIEZvciBjb21wcmVzc2VkIGF1ZGlvIGRhdGEsIGFueSBkYXRhIHByZXNlbnQgaW4gdGhlIEF1ZGlvVHJhY2sgYnVmZmVyCisvLyAgICB3aWxsIGJlIHNlbnQgYW5kIHJlc2V0IHRoZSByZXRyeSBjb3VudC4gIFRoaXMgZGVsaXZlcnMgZGF0YSBhcworLy8gICAgaXQgYXJyaXZlcywgd2l0aCBhcHByb3hpbWF0ZWx5IGtEaXJlY3RNaW5TbGVlcFRpbWVVcyA9IDEwbXMgY2hlY2tpbmcgaW50ZXJ2YWwuCisvLyAzKSBGb3IgbGluZWFyIFBDTSBvciBwcm9wb3J0aW9uYWwgUENNLCB3ZSB3YWl0IG9uZSBwZXJpb2QgZm9yIGEgcGVyaW9kJ3Mgd29ydGgKKy8vICAgIG9mIGRhdGEgdG8gYmUgYXZhaWxhYmxlLCB0aGVuIGFueSByZW1haW5pbmcgZGF0YSBpcyBkZWxpdmVyZWQuCisvLyAgICBUaGlzIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGUgbGFzdCBiaXQgb2YgZGF0YSBpcyBkZWxpdmVyZWQgYmVmb3JlIHVuZGVycnVuLgorLy8KKy8vIFNsZWVwIHRpbWUgcGVyIGN5Y2xlIGlzIGtEaXJlY3RNaW5TbGVlcFRpbWVVcyBmb3IgY29tcHJlc3NlZCB0cmFja3MKKy8vIG9yIHRoZSBzaXplIG9mIHRoZSBIQUwgcGVyaW9kIGZvciBwcm9wb3J0aW9uYWwgLyBsaW5lYXIgUENNIHRyYWNrcy4KK3N0YXRpYyBjb25zdCBpbnQzMl90IGtNYXhUcmFja1JldHJpZXNEaXJlY3RNcyA9IDIwMDsKIAogLy8gZG9uJ3Qgd2FybiBhYm91dCBibG9ja2VkIHdyaXRlcyBvciByZWNvcmQgYnVmZmVyIG92ZXJmbG93cyBtb3JlIG9mdGVuIHRoYW4gdGhpcwogc3RhdGljIGNvbnN0IG5zZWNzX3Qga1dhcm5pbmdUaHJvdHRsZU5zID0gc2Vjb25kcyg1KTsKQEAgLTYyMSw3ICs2MzYsNyBAQAogICAgIG1Jb0ppdHRlck1zLnJlc2V0KCk7CiAgICAgbUxhdGVuY3lNcy5yZXNldCgpOwogICAgIG1Qcm9jZXNzVGltZU1zLnJlc2V0KCk7Ci0gICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsKKyAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eShtVGltZXN0YW1wVmVyaWZpZXIuRElTQ09OVElOVUlUWV9NT0RFX0NPTlRJTlVPVVMpOwogCiAgICAgc3A8Q29uZmlnRXZlbnQ+IGNvbmZpZ0V2ZW50ID0gKENvbmZpZ0V2ZW50ICopbmV3IElvQ29uZmlnRXZlbnQoZXZlbnQsIHBpZCwgcG9ydElkKTsKICAgICBzZW5kQ29uZmlnRXZlbnRfbChjb25maWdFdmVudCk7CkBAIC03OTcsMTIgKzgxMiwxNiBAQAogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfQ0VOVEVSKSBzLmFwcGVuZCgidG9wLWZyb250LWNlbnRlciwgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9SSUdIVCkgcy5hcHBlbmQoInRvcC1mcm9udC1yaWdodCwgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0xFRlQpIHMuYXBwZW5kKCJ0b3AtYmFjay1sZWZ0LCAiKTsKLSAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfQ0VOVEVSKSBzLmFwcGVuZCgidG9wLWJhY2stY2VudGVyLCAiICk7Ci0gICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX1JJR0hUKSBzLmFwcGVuZCgidG9wLWJhY2stcmlnaHQsICIgKTsKLSAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX1NJREVfTEVGVCkgcy5hcHBlbmQoInRvcC1zaWRlLWxlZnQsICIgKTsKLSAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX1NJREVfUklHSFQpIHMuYXBwZW5kKCJ0b3Atc2lkZS1yaWdodCwgIiApOwotICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9IQVBUSUNfQikgcy5hcHBlbmQoImhhcHRpYy1CLCAiICk7Ci0gICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0hBUFRJQ19BKSBzLmFwcGVuZCgiaGFwdGljLUEsICIgKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfQ0VOVEVSKSBzLmFwcGVuZCgidG9wLWJhY2stY2VudGVyLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfUklHSFQpIHMuYXBwZW5kKCJ0b3AtYmFjay1yaWdodCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9TSURFX0xFRlQpIHMuYXBwZW5kKCJ0b3Atc2lkZS1sZWZ0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX1NJREVfUklHSFQpIHMuYXBwZW5kKCJ0b3Atc2lkZS1yaWdodCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0JPVFRPTV9GUk9OVF9MRUZUKSBzLmFwcGVuZCgiYm90dG9tLWZyb250LWxlZnQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9CT1RUT01fRlJPTlRfQ0VOVEVSKSBzLmFwcGVuZCgiYm90dG9tLWZyb250LWNlbnRlciwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0JPVFRPTV9GUk9OVF9SSUdIVCkgcy5hcHBlbmQoImJvdHRvbS1mcm9udC1yaWdodCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1lfMikgcy5hcHBlbmQoImxvd19mcmVxdWVuY3lfMiwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0hBUFRJQ19CKSBzLmFwcGVuZCgiaGFwdGljLUIsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9IQVBUSUNfQSkgcy5hcHBlbmQoImhhcHRpYy1BLCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgfkFVRElPX0NIQU5ORUxfT1VUX0FMTCkgcy5hcHBlbmQoInVua25vd24sICAiKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9MRUZUKSBzLmFwcGVuZCgibGVmdCwgIik7CkBAIC04MjEsOCArODQwLDggQEAKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9CQUNLX1JJR0hUKSBzLmFwcGVuZCgiYmFjay1yaWdodCwgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fQ0VOVEVSKSBzLmFwcGVuZCgiY2VudGVyLCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9MT1dfRlJFUVVFTkNZKSBzLmFwcGVuZCgibG93IGZyZXEsICIpOwotICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1RPUF9MRUZUKSBzLmFwcGVuZCgidG9wLWxlZnQsICIgKTsKLSAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9UT1BfUklHSFQpIHMuYXBwZW5kKCJ0b3AtcmlnaHQsICIgKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9UT1BfTEVGVCkgcy5hcHBlbmQoInRvcC1sZWZ0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9UT1BfUklHSFQpIHMuYXBwZW5kKCJ0b3AtcmlnaHQsICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOSykgcy5hcHBlbmQoInZvaWNlLXVwbGluaywgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LKSBzLmFwcGVuZCgidm9pY2UtZG5saW5rLCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgfkFVRElPX0NIQU5ORUxfSU5fQUxMKSBzLmFwcGVuZCgidW5rbm93biwgICIpOwpAQCAtMTg2Myw3ICsxODgyLDggQEAKICAgICAgICAgLy8gaW5kZXggMCBpcyByZXNlcnZlZCBmb3Igbm9ybWFsIG1peGVyJ3Mgc3VibWl4CiAgICAgICAgIG1GYXN0VHJhY2tBdmFpbE1hc2soKCgxIDw8IEZhc3RNaXhlclN0YXRlOjpzTWF4RmFzdFRyYWNrcykgLSAxKSAmIH4xKSwKICAgICAgICAgbUh3U3VwcG9ydHNQYXVzZShmYWxzZSksIG1Id1BhdXNlZChmYWxzZSksIG1GbHVzaFBlbmRpbmcoZmFsc2UpLAotICAgICAgICBtTGVmdFZvbEZsb2F0KC0xLjApLCBtUmlnaHRWb2xGbG9hdCgtMS4wKQorICAgICAgICBtTGVmdFZvbEZsb2F0KC0xLjApLCBtUmlnaHRWb2xGbG9hdCgtMS4wKSwKKyAgICAgICAgbURvd25TdHJlYW1QYXRjaHt9CiB7CiAgICAgc25wcmludGYobVRocmVhZE5hbWUsIGtUaHJlYWROYW1lTGVuZ3RoLCAiQXVkaW9PdXRfJVgiLCBpZCk7CiAgICAgbU5CTG9nV3JpdGVyID0gYXVkaW9GbGluZ2VyLT5uZXdXcml0ZXJfbChrTG9nU2l6ZSwgbVRocmVhZE5hbWUpOwpAQCAtMTkwMSw5ICsxOTIxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVVESU9fREVWSUNFX05PTkUpKTsKICAgICB9CiAKLSAgICAvLyArKyBvcGVyYXRvciBkb2VzIG5vdCBjb21waWxlCi0gICAgZm9yIChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9NSU47IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsKLSAgICAgICAgICAgIHN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KSAoc3RyZWFtICsgMSkpIHsKKyAgICBmb3IgKGludCBpID0gQVVESU9fU1RSRUFNX01JTjsgaSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgKytpKSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFte3N0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGkpfTsKICAgICAgICAgbVN0cmVhbVR5cGVzW3N0cmVhbV0udm9sdW1lID0gMC4wZjsKICAgICAgICAgbVN0cmVhbVR5cGVzW3N0cmVhbV0ubXV0ZSA9IG1BdWRpb0ZsaW5nZXItPnN0cmVhbU11dGVfbChzdHJlYW0pOwogICAgIH0KQEAgLTI2MzIsMTIgKzI2NTEsMTYgQEAKICAgICBBTE9HVigiUGxheWJhY2tUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZCwgdGhyZWFkICVwLCBldmVudCAlZCIsIHRoaXMsIGV2ZW50KTsKIAogICAgIGRlc2MtPm1Jb0hhbmRsZSA9IG1JZDsKKyAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2ggPSBtUGF0Y2g7CisgICAgaWYgKGlzTXNkRGV2aWNlKCkpIHsKKyAgICAgICAgcGF0Y2ggPSBtRG93blN0cmVhbVBhdGNoOworICAgIH0KIAogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICBjYXNlIEFVRElPX09VVFBVVF9PUEVORUQ6CiAgICAgY2FzZSBBVURJT19PVVRQVVRfUkVHSVNURVJFRDoKICAgICBjYXNlIEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRDoKLSAgICAgICAgZGVzYy0+bVBhdGNoID0gbVBhdGNoOworICAgICAgICBkZXNjLT5tUGF0Y2ggPSBwYXRjaDsKICAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrOwogICAgICAgICBkZXNjLT5tU2FtcGxpbmdSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgICAgIGRlc2MtPm1Gb3JtYXQgPSBtRm9ybWF0OwpAQCAtMjY0Nyw3ICsyNjcwLDcgQEAKICAgICAgICAgZGVzYy0+bUxhdGVuY3kgPSBsYXRlbmN5X2woKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19DTElFTlRfU1RBUlRFRDoKLSAgICAgICAgZGVzYy0+bVBhdGNoID0gbVBhdGNoOworICAgICAgICBkZXNjLT5tUGF0Y2ggPSBwYXRjaDsKICAgICAgICAgZGVzYy0+bVBvcnRJZCA9IHBvcnRJZDsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19PVVRQVVRfQ0xPU0VEOgpAQCAtMjcxNCw3ICsyNzM3LDcgQEAKICAgICAgICAgLy8gdGhlIHRpbWVzdGFtcCBmcmFtZSBwb3NpdGlvbiB0byByZXNldCB0byAwIGZvciBkaXJlY3QgYW5kIG9mZmxvYWQgdGhyZWFkcy4KICAgICAgICAgLy8gKE91dCBvZiBzZXF1ZW5jZSByZXF1ZXN0cyBhcmUgaWdub3JlZCwgc2luY2UgdGhlIGRpc2NvbnRpbnVpdHkgd291bGQgYmUgaGFuZGxlZAogICAgICAgICAvLyBlbHNld2hlcmUsIGUuZy4gaW4gZmx1c2gpLgotICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOworICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eShtVGltZXN0YW1wVmVyaWZpZXIuRElTQ09OVElOVUlUWV9NT0RFX1pFUk8pOwogICAgICAgICBtRHJhaW5TZXF1ZW5jZSAmPSB+MTsKICAgICAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CiAgICAgfQpAQCAtMjcyMyw4ICsyNzQ2LDkgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6cmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpCiB7CiAgICAgLy8gdW5mb3J0dW5hdGVseSB3ZSBoYXZlIG5vIHdheSBvZiByZWNvdmVyaW5nIGZyb20gZXJyb3JzIGhlcmUsIGhlbmNlIHRoZSBMT0dfQUxXQVlTX0ZBVEFMCi0gICAgbVNhbXBsZVJhdGUgPSBtT3V0cHV0LT5nZXRTYW1wbGVSYXRlKCk7Ci0gICAgbUNoYW5uZWxNYXNrID0gbU91dHB1dC0+Z2V0Q2hhbm5lbE1hc2soKTsKKyAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IGF1ZGlvQ29uZmlnID0gbU91dHB1dC0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKCk7CisgICAgbVNhbXBsZVJhdGUgPSBhdWRpb0NvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICBtQ2hhbm5lbE1hc2sgPSBhdWRpb0NvbmZpZy5jaGFubmVsX21hc2s7CiAgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChtQ2hhbm5lbE1hc2spKSB7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkhBTCBjaGFubmVsIG1hc2sgJSN4IG5vdCB2YWxpZCBmb3Igb3V0cHV0IiwgbUNoYW5uZWxNYXNrKTsKICAgICB9CkBAIC0yNzM3LDExICsyNzYxLDExIEBACiAgICAgbUJhbGFuY2Uuc2V0Q2hhbm5lbE1hc2sobUNoYW5uZWxNYXNrKTsKIAogICAgIC8vIEdldCBhY3R1YWwgSEFMIGZvcm1hdC4KLSAgICBzdGF0dXNfdCByZXN1bHQgPSBtT3V0cHV0LT5zdHJlYW0tPmdldEZvcm1hdCgmbUhBTEZvcm1hdCk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbU91dHB1dC0+c3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMobnVsbHB0ciwgbnVsbHB0ciwgJm1IQUxGb3JtYXQpOwogICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzdWx0ICE9IE9LLCAiRXJyb3Igd2hlbiByZXRyaWV2aW5nIG91dHB1dCBzdHJlYW0gZm9ybWF0OiAlZCIsIHJlc3VsdCk7CiAgICAgLy8gR2V0IGZvcm1hdCBmcm9tIHRoZSBzaGltLCB3aGljaCB3aWxsIGJlIGRpZmZlcmVudCB0aGFuIHRoZSBIQUwgZm9ybWF0CiAgICAgLy8gaWYgcGxheWluZyBjb21wcmVzc2VkIGF1ZGlvIG92ZXIgSERNSSBwYXNzdGhyb3VnaC4KLSAgICBtRm9ybWF0ID0gbU91dHB1dC0+Z2V0Rm9ybWF0KCk7CisgICAgbUZvcm1hdCA9IGF1ZGlvQ29uZmlnLmZvcm1hdDsKICAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChtRm9ybWF0KSkgewogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJIQUwgZm9ybWF0ICUjeCBub3QgdmFsaWQgZm9yIG91dHB1dCIsIG1Gb3JtYXQpOwogICAgIH0KQEAgLTI4NjgsOCArMjg5Miw4IEBACiAgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtRWZmZWN0QnVmZmVyLCAzMiwgbUVmZmVjdEJ1ZmZlclNpemUpOwogICAgIH0KIAotICAgIG1IYXB0aWNDaGFubmVsTWFzayA9IG1DaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKLSAgICBtQ2hhbm5lbE1hc2sgJj0gfm1IYXB0aWNDaGFubmVsTWFzazsKKyAgICBtSGFwdGljQ2hhbm5lbE1hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obUNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKKyAgICBtQ2hhbm5lbE1hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obUNoYW5uZWxNYXNrICYgfm1IYXB0aWNDaGFubmVsTWFzayk7CiAgICAgbUhhcHRpY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtSGFwdGljQ2hhbm5lbE1hc2spOwogICAgIG1DaGFubmVsQ291bnQgLT0gbUhhcHRpY0NoYW5uZWxDb3VudDsKIApAQCAtMzQwMyw3ICszNDI3LDYgQEAKIAogICAgIG1TdGFuZGJ5VGltZU5zID0gc3lzdGVtVGltZSgpOwogICAgIGludDY0X3QgbGFzdExvb3BDb3VudFdyaXR0ZW4gPSAtMjsgLy8gbmV2ZXIgbWF0Y2hlcyAicHJldmlvdXMiIGxvb3AsIHdoZW4gbG9vcENvdW50ID0gMC4KLSAgICBpbnQ2NF90IGxhc3RGcmFtZXNXcml0dGVuID0gLTE7ICAgIC8vIHRyYWNrIGNoYW5nZXMgaW4gdGltZXN0YW1wIHNlcnZlciBmcmFtZXMgd3JpdHRlbgogCiAgICAgLy8gTUlYRVIKICAgICBuc2Vjc190IGxhc3RXYXJuaW5nID0gMDsKQEAgLTM0MzksMTQgKzM0NjIsNiBAQAogCiAgICAgY2hlY2tTaWxlbnRNb2RlX2woKTsKIAotICAgIC8vIERJUkVDVCBhbmQgT0ZGTE9BRCB0aHJlYWRzIHNob3VsZCByZXNldCBmcmFtZSBjb3VudCB0byB6ZXJvIG9uIHN0b3AvZmx1c2gKLSAgICAvLyBUT0RPOiBhZGQgY29uZmlybWF0aW9uIGNoZWNrczoKLSAgICAvLyAxKSBESVJFQ1QgdGhyZWFkcyBhbmQgbGluZWFyIFBDTSBmb3JtYXQgcmVhbGx5IHJlc2V0cyB0byAwPwotICAgIC8vIDIpIElzIGZyYW1lIGNvdW50IHJlYWxseSB2YWxpZCBpZiBub3QgbGluZWFyIHBjbT8KLSAgICAvLyAzKSBBcmUgYWxsIDY0IGJpdHMgb2YgcG9zaXRpb24gcmV0dXJuZWQsIG5vdCBqdXN0IGxvd2VzdCAzMiBiaXRzPwotICAgIGlmIChtVHlwZSA9PSBPRkZMT0FEIHx8IG1UeXBlID09IERJUkVDVCkgewotICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuc2V0RGlzY29udGludWl0eU1vZGUobVRpbWVzdGFtcFZlcmlmaWVyLkRJU0NPTlRJTlVJVFlfTU9ERV9aRVJPKTsKLSAgICB9CiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbGFzdERvd25zdHJlYW1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogCiAgICAgLy8gbG9vcENvdW50IGlzIHVzZWQgZm9yIHN0YXRpc3RpY3MgYW5kIGRpYWdub3N0aWNzLgpAQCAtMzQ4Nyw3ICszNTAyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZW5jeSBvZiA1IHNlY29uZHMpLgogICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgbWluTGF0ZW5jeSA9IDAuLCBtYXhMYXRlbmN5ID0gNTAwMC47CiAgICAgICAgICAgICAgICAgICAgIGlmIChsYXRlbmN5TXMgPj0gbWluTGF0ZW5jeSAmJiBsYXRlbmN5TXMgPD0gbWF4TGF0ZW5jeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5ldyBkb3duc3RyZWFtIGxhdGVuY3kgJWxmIG1zIiwgbGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWVigibmV3IGRvd25zdHJlYW0gbGF0ZW5jeSAlbGYgbXMiLCBsYXRlbmN5TXMpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm91dCBvZiByYW5nZSBkb3duc3RyZWFtIGxhdGVuY3kgJWxmIG1zIiwgbGF0ZW5jeU1zKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXRlbmN5TXMgPCBtaW5MYXRlbmN5KSBsYXRlbmN5TXMgPSBtaW5MYXRlbmN5OwpAQCAtMzUxOCwxMzUgKzM1MzMsOCBAQAogICAgICAgICAgICAgICAgIGxvZ1N0cmluZyA9IE5VTEw7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIENvbGxlY3QgdGltZXN0YW1wIHN0YXRpc3RpY3MgZm9yIHRoZSBQbGF5YmFjayBUaHJlYWQgdHlwZXMgdGhhdCBzdXBwb3J0IGl0LgotICAgICAgICAgICAgaWYgKG1UeXBlID09IE1JWEVSCi0gICAgICAgICAgICAgICAgICAgIHx8IG1UeXBlID09IERVUExJQ0FUSU5HCi0gICAgICAgICAgICAgICAgICAgIHx8IG1UeXBlID09IERJUkVDVAotICAgICAgICAgICAgICAgICAgICB8fCBtVHlwZSA9PSBPRkZMT0FEKSB7IC8vIG5vIGluZGVudGF0aW9uCi0gICAgICAgICAgICAvLyBHYXRoZXIgdGhlIGZyYW1lc1JlbGVhc2VkIGNvdW50ZXJzIGZvciBhbGwgYWN0aXZlIHRyYWNrcywKLSAgICAgICAgICAgIC8vIGFuZCBhc3NvY2lhdGUgd2l0aCB0aGUgc2luayBmcmFtZXMgd3JpdHRlbiBvdXQuICBXZSBuZWVkCi0gICAgICAgICAgICAvLyB0aGlzIHRvIGNvbnZlcnQgdGhlIHNpbmsgdGltZXN0YW1wIHRvIHRoZSB0cmFjayB0aW1lc3RhbXAuCi0gICAgICAgICAgICBib29sIGtlcm5lbExvY2F0aW9uVXBkYXRlID0gZmFsc2U7Ci0gICAgICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCB0aW1lc3RhbXA7IC8vIHVzZSBwcml2YXRlIGNvcHkgdG8gZmV0Y2gKLSAgICAgICAgICAgIGlmIChtU3RhbmRieSkgewotICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRocmVhZGxvb3BfZ2V0SGFsVGltZXN0YW1wX2woJnRpbWVzdGFtcCkgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuYWRkKHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCi0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIGNvbGxlY3RUaW1lc3RhbXBzX2woKTsKIAotICAgICAgICAgICAgICAgIGlmIChpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0JFRk9SRTogJWQgJWxsZCAlbGxkIiwgaWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSk7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8gY29ycmVjdGVkVGltZXN0YW1wID0gbVRpbWVzdGFtcFZlcmlmaWVyLmdldExhc3RDb3JyZWN0ZWRUaW1lc3RhbXAoKTsKLSAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY29ycmVjdGVkVGltZXN0YW1wLm1GcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjb3JyZWN0ZWRUaW1lc3RhbXAubVRpbWVOczsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0FGVEVSOiAlZCAlbGxkICVsbGQiLCBpZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBEb3duc3RyZWFtIGxhdGVuY3kgb25seSBhZGRlZCBpZiB0aW1lc3RhbXAgY29ycmVjdGlvbiBlbmFibGVkLgotICAgICAgICAgICAgICAgICAgICBpZiAobURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE4oKSA+IDApIHsgLy8gd2UgaGF2ZSBsYXRlbmN5IGluZm8uCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IG5ld1Bvc2l0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGludDY0X3QobURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE1lYW4oKSAqIG1TYW1wbGVSYXRlICogMWUtMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IHJldHJvZ3JhZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSBtYXgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Bvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1TdXNwZW5kZWRGcmFtZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFdlIGFsd2F5cyBmZXRjaCB0aGUgdGltZXN0YW1wIGhlcmUgYmVjYXVzZSBvZnRlbiB0aGUgZG93bnN0cmVhbQotICAgICAgICAgICAgICAgIC8vIHNpbmsgd2lsbCBibG9jayB3aGlsZSB3cml0aW5nLgotCi0gICAgICAgICAgICAgICAgLy8gV2Uga2VlcCB0cmFjayBvZiB0aGUgbGFzdCB2YWxpZCBrZXJuZWwgcG9zaXRpb24gaW4gY2FzZSB3ZSBhcmUgaW4gdW5kZXJydW4KLSAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIG5vcm1hbCBtaXhlciBwZXJpb2QgaXMgdGhlIHNhbWUgYXMgdGhlIGZhc3QgbWl4ZXIgcGVyaW9kLCBvciB0aGVyZQotICAgICAgICAgICAgICAgIC8vIGlzIHNvbWUgZXJyb3IgZnJvbSB0aGUgSEFMLgotICAgICAgICAgICAgICAgIGlmIChtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMX0xBU1RLRVJORUxPS10gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOwotICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF9MQVNUS0VSTkVMT0tdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07Ci0KLSAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl9MQVNUS0VSTkVMT0tdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXTsKLSAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJfTEFTVEtFUk5FTE9LXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICh0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGtlcm5lbExvY2F0aW9uVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVlYoImdldFRpbWVzdGFtcCBlcnJvciAtIG5vIHZhbGlkIGtlcm5lbCBwb3NpdGlvbiIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNvcHkgb3ZlciBrZXJuZWwgaW5mbwotICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgbVN1c3BlbmRlZEZyYW1lczsgLy8gYWRkIGZyYW1lcyBkaXNjYXJkZWQgd2hlbiBzdXNwZW5kZWQKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5lcnJvcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBtRnJhbWVzV3JpdHRlbiBmb3Igbm9uLW9mZmxvYWRlZCB0cmFja3MgYXJlIGNvbnRpZ3VvdXMKLSAgICAgICAgICAgIC8vIGV2ZW4gYWZ0ZXIgc3RhbmRieSgpIGlzIGNhbGxlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIHRoZSB0cmFjayBmcmFtZQotICAgICAgICAgICAgLy8gdG8gc2luayBmcmFtZSBtYXBwaW5nLgotICAgICAgICAgICAgYm9vbCBzZXJ2ZXJMb2NhdGlvblVwZGF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKG1GcmFtZXNXcml0dGVuICE9IGxhc3RGcmFtZXNXcml0dGVuKSB7Ci0gICAgICAgICAgICAgICAgc2VydmVyTG9jYXRpb25VcGRhdGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxhc3RGcmFtZXNXcml0dGVuID0gbUZyYW1lc1dyaXR0ZW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0aW1lc3RhbXBzIGlmIHRoZXJlIGlzIGEgbWVhbmluZ2Z1bCBjaGFuZ2UuCi0gICAgICAgICAgICAvLyBFaXRoZXIgdGhlIGtlcm5lbCB0aW1lc3RhbXAgbXVzdCBiZSB2YWxpZCBvciB3ZSBoYXZlIHdyaXR0ZW4gc29tZXRoaW5nLgotICAgICAgICAgICAgaWYgKGtlcm5lbExvY2F0aW9uVXBkYXRlIHx8IHNlcnZlckxvY2F0aW9uVXBkYXRlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZlckxvY2F0aW9uVXBkYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgdGltZSBiZWZvcmUgd2UgY2FsbGVkIHRoZSBIQUwgd3JpdGUgLSBpdCBpcyBhIGJpdCBtb3JlIGFjY3VyYXRlCi0gICAgICAgICAgICAgICAgICAgIC8vIHRvIHdoZW4gdGhlIHNlcnZlciBsYXN0IHJlYWQgZGF0YSB0aGFuIHRoZSBjdXJyZW50IHRpbWUgaGVyZS4KLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCB3cml0dGVuIGFueXRoaW5nLCBtTGFzdElvQmVnaW5OcyB3aWxsIGJlIC0xCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuZCB3ZSB1c2Ugc3lzdGVtVGltZSgpLgotICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9IG1GcmFtZXNXcml0dGVuOwotICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPSBtTGFzdElvQmVnaW5OcyA9PSAtMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3lzdGVtVGltZSgpIDogbUxhc3RJb0JlZ2luTnM7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzcDxUcmFjaz4gJnQgOiBtQWN0aXZlVHJhY2tzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdC0+aXNGYXN0VHJhY2soKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdC0+dXBkYXRlVHJhY2tGcmFtZUluZm8oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlbGVhc2VkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhtRm9ybWF0KSkgewotICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSBtVGltZXN0YW1wLmdldE91dHB1dFNlcnZlckxhdGVuY3lNcyhtU2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGxhdGVuY3lNcyAhPSAwLikgeyAvLyBub3RlIDAuIG1lYW5zIHRpbWVzdGFtcCBpcyBlbXB0eS4KLSAgICAgICAgICAgICAgICAgICAgbUxhdGVuY3lNcy5hZGQobGF0ZW5jeU1zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gLy8gaWYgKG1UeXBlIC4uLiApIHsgLy8gbm8gaW5kZW50YXRpb24KLSNpZiAwCi0gICAgICAgICAgICAvLyBsb2dGb3JtYXQgZXhhbXBsZQotICAgICAgICAgICAgaWYgKHogJSAxMDAgPT0gMCkgewotICAgICAgICAgICAgICAgIHRpbWVzcGVjIHRzOwotICAgICAgICAgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpOwotICAgICAgICAgICAgICAgIExPR1QoIlRoaXMgaXMgYW4gaW50ZWdlciAlZCwgdGhpcyBpcyBhIGZsb2F0ICVmLCB0aGlzIGlzIG15ICIKLSAgICAgICAgICAgICAgICAgICAgInBpZCAlcCAlJSAlcyAldCIsIDQyLCAzLjE0LCAiYW5kIHRoaXMgaXMgYSB0aW1lc3RhbXAiLCB0cyk7Ci0gICAgICAgICAgICAgICAgTE9HVCgiQSBkZWNlcHRpdmUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyAlXDAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICsrejsKLSNlbmRpZgogICAgICAgICAgICAgc2F2ZU91dHB1dFRyYWNrcygpOwogICAgICAgICAgICAgaWYgKG1TaWduYWxQZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgLy8gQSBzaWduYWwgd2FzIHJhaXNlZCB3aGlsZSB3ZSB3ZXJlIHVubG9ja2VkCkBAIC00MDg2LDYgKzM5NzQsMTQ4IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmNvbGxlY3RUaW1lc3RhbXBzX2woKQoreworICAgIC8vIENvbGxlY3QgdGltZXN0YW1wIHN0YXRpc3RpY3MgZm9yIHRoZSBQbGF5YmFjayBUaHJlYWQgdHlwZXMgdGhhdCBzdXBwb3J0IGl0LgorICAgIGlmIChtVHlwZSAhPSBNSVhFUgorICAgICAgICAgICAgJiYgbVR5cGUgIT0gRFVQTElDQVRJTkcKKyAgICAgICAgICAgICYmIG1UeXBlICE9IERJUkVDVAorICAgICAgICAgICAgJiYgbVR5cGUgIT0gT0ZGTE9BRCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtU3RhbmRieSkgeworICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eShkaXNjb250aW51aXR5Rm9yU3RhbmRieU9yRmx1c2goKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKG1Id1BhdXNlZCkgeworICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eShtVGltZXN0YW1wVmVyaWZpZXIuRElTQ09OVElOVUlUWV9NT0RFX0NPTlRJTlVPVVMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gR2F0aGVyIHRoZSBmcmFtZXNSZWxlYXNlZCBjb3VudGVycyBmb3IgYWxsIGFjdGl2ZSB0cmFja3MsCisgICAgLy8gYW5kIGFzc29jaWF0ZSB3aXRoIHRoZSBzaW5rIGZyYW1lcyB3cml0dGVuIG91dC4gIFdlIG5lZWQKKyAgICAvLyB0aGlzIHRvIGNvbnZlcnQgdGhlIHNpbmsgdGltZXN0YW1wIHRvIHRoZSB0cmFjayB0aW1lc3RhbXAuCisgICAgYm9vbCBrZXJuZWxMb2NhdGlvblVwZGF0ZSA9IGZhbHNlOworICAgIEV4dGVuZGVkVGltZXN0YW1wIHRpbWVzdGFtcDsgLy8gdXNlIHByaXZhdGUgY29weSB0byBmZXRjaAorCisgICAgLy8gQWx3YXlzIHF1ZXJ5IEhBTCB0aW1lc3RhbXAgYW5kIHVwZGF0ZSB0aW1lc3RhbXAgdmVyaWZpZXIuIEluIHN0YW5kYnkgb3IgcGF1c2UsCisgICAgLy8gSEFMIG1heSBiZSBkcmFpbmluZyBzb21lIHNtYWxsIGR1cmF0aW9uIGJ1ZmZlcmVkIGRhdGEgZm9yIGZhZGUgb3V0LgorICAgIGlmICh0aHJlYWRsb29wX2dldEhhbFRpbWVzdGFtcF9sKCZ0aW1lc3RhbXApID09IE9LKSB7CisgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5hZGQodGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSk7CisKKyAgICAgICAgaWYgKGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgQUxPR1ZWKCJUU19CRUZPUkU6ICVkICVsbGQgJWxsZCIsIGlkKCksCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSk7CisgICAgICAgICAgICBhdXRvIGNvcnJlY3RlZFRpbWVzdGFtcCA9IG1UaW1lc3RhbXBWZXJpZmllci5nZXRMYXN0Q29ycmVjdGVkVGltZXN0YW1wKCk7CisgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgID0gY29ycmVjdGVkVGltZXN0YW1wLm1GcmFtZXM7CisgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICA9IGNvcnJlY3RlZFRpbWVzdGFtcC5tVGltZU5zOworICAgICAgICAgICAgQUxPR1ZWKCJUU19BRlRFUjogJWQgJWxsZCAlbGxkIiwgaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdKTsKKworICAgICAgICAgICAgLy8gTm90ZTogRG93bnN0cmVhbSBsYXRlbmN5IG9ubHkgYWRkZWQgaWYgdGltZXN0YW1wIGNvcnJlY3Rpb24gZW5hYmxlZC4KKyAgICAgICAgICAgIGlmIChtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TigpID4gMCkgeyAvLyB3ZSBoYXZlIGxhdGVuY3kgaW5mby4KKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IG5ld1Bvc2l0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgIC0gaW50NjRfdChtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TWVhbigpICogbVNhbXBsZVJhdGUgKiAxZS0zKTsKKyAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IHJldHJvZ3JhZGUKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gbWF4KAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3UG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAobVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtU3VzcGVuZGVkRnJhbWVzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBhbHdheXMgZmV0Y2ggdGhlIHRpbWVzdGFtcCBoZXJlIGJlY2F1c2Ugb2Z0ZW4gdGhlIGRvd25zdHJlYW0KKyAgICAgICAgLy8gc2luayB3aWxsIGJsb2NrIHdoaWxlIHdyaXRpbmcuCisKKyAgICAgICAgLy8gV2Uga2VlcCB0cmFjayBvZiB0aGUgbGFzdCB2YWxpZCBrZXJuZWwgcG9zaXRpb24gaW4gY2FzZSB3ZSBhcmUgaW4gdW5kZXJydW4KKyAgICAgICAgLy8gYW5kIHRoZSBub3JtYWwgbWl4ZXIgcGVyaW9kIGlzIHRoZSBzYW1lIGFzIHRoZSBmYXN0IG1peGVyIHBlcmlvZCwgb3IgdGhlcmUKKyAgICAgICAgLy8gaXMgc29tZSBlcnJvciBmcm9tIHRoZSBIQUwuCisgICAgICAgIGlmIChtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPj0gMCkgeworICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF9MQVNUS0VSTkVMT0tdID0KKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF9MQVNUS0VSTkVMT0tdID0KKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOworCisgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSX0xBU1RLRVJORUxPS10gPQorICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXTsKKyAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSX0xBU1RLRVJORUxPS10gPQorICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl07CisgICAgICAgIH0KKworICAgICAgICBpZiAodGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPj0gMCkgeworICAgICAgICAgICAga2VybmVsTG9jYXRpb25VcGRhdGUgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1ZWKCJnZXRUaW1lc3RhbXAgZXJyb3IgLSBubyB2YWxpZCBrZXJuZWwgcG9zaXRpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvcHkgb3ZlciBrZXJuZWwgaW5mbworICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9CisgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICsgbVN1c3BlbmRlZEZyYW1lczsgLy8gYWRkIGZyYW1lcyBkaXNjYXJkZWQgd2hlbiBzdXNwZW5kZWQKKyAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICB9IGVsc2UgeworICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZXJyb3IoKTsKKyAgICB9CisKKyAgICAvLyBtRnJhbWVzV3JpdHRlbiBmb3Igbm9uLW9mZmxvYWRlZCB0cmFja3MgYXJlIGNvbnRpZ3VvdXMKKyAgICAvLyBldmVuIGFmdGVyIHN0YW5kYnkoKSBpcyBjYWxsZWQuIFRoaXMgaXMgdXNlZnVsIGZvciB0aGUgdHJhY2sgZnJhbWUKKyAgICAvLyB0byBzaW5rIGZyYW1lIG1hcHBpbmcuCisgICAgYm9vbCBzZXJ2ZXJMb2NhdGlvblVwZGF0ZSA9IGZhbHNlOworICAgIGlmIChtRnJhbWVzV3JpdHRlbiAhPSBtTGFzdEZyYW1lc1dyaXR0ZW4pIHsKKyAgICAgICAgc2VydmVyTG9jYXRpb25VcGRhdGUgPSB0cnVlOworICAgICAgICBtTGFzdEZyYW1lc1dyaXR0ZW4gPSBtRnJhbWVzV3JpdHRlbjsKKyAgICB9CisgICAgLy8gT25seSB1cGRhdGUgdGltZXN0YW1wcyBpZiB0aGVyZSBpcyBhIG1lYW5pbmdmdWwgY2hhbmdlLgorICAgIC8vIEVpdGhlciB0aGUga2VybmVsIHRpbWVzdGFtcCBtdXN0IGJlIHZhbGlkIG9yIHdlIGhhdmUgd3JpdHRlbiBzb21ldGhpbmcuCisgICAgaWYgKGtlcm5lbExvY2F0aW9uVXBkYXRlIHx8IHNlcnZlckxvY2F0aW9uVXBkYXRlKSB7CisgICAgICAgIGlmIChzZXJ2ZXJMb2NhdGlvblVwZGF0ZSkgeworICAgICAgICAgICAgLy8gdXNlIHRoZSB0aW1lIGJlZm9yZSB3ZSBjYWxsZWQgdGhlIEhBTCB3cml0ZSAtIGl0IGlzIGEgYml0IG1vcmUgYWNjdXJhdGUKKyAgICAgICAgICAgIC8vIHRvIHdoZW4gdGhlIHNlcnZlciBsYXN0IHJlYWQgZGF0YSB0aGFuIHRoZSBjdXJyZW50IHRpbWUgaGVyZS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IHdyaXR0ZW4gYW55dGhpbmcsIG1MYXN0SW9CZWdpbk5zIHdpbGwgYmUgLTEKKyAgICAgICAgICAgIC8vIGFuZCB3ZSB1c2Ugc3lzdGVtVGltZSgpLgorICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPSBtRnJhbWVzV3JpdHRlbjsKKyAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9IG1MYXN0SW9CZWdpbk5zID09IC0xCisgICAgICAgICAgICAgICAgICAgID8gc3lzdGVtVGltZSgpIDogbUxhc3RJb0JlZ2luTnM7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGNvbnN0IHNwPFRyYWNrPiAmdCA6IG1BY3RpdmVUcmFja3MpIHsKKyAgICAgICAgICAgIGlmICghdC0+aXNGYXN0VHJhY2soKSkgeworICAgICAgICAgICAgICAgIHQtPnVwZGF0ZVRyYWNrRnJhbWVJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgdC0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhtRm9ybWF0KSkgeworICAgICAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0gbVRpbWVzdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMobVNhbXBsZVJhdGUpOworICAgICAgICBpZiAobGF0ZW5jeU1zICE9IDAuKSB7IC8vIG5vdGUgMC4gbWVhbnMgdGltZXN0YW1wIGlzIGVtcHR5LgorICAgICAgICAgICAgbUxhdGVuY3lNcy5hZGQobGF0ZW5jeU1zKTsKKyAgICAgICAgfQorICAgIH0KKyNpZiAwCisgICAgLy8gbG9nRm9ybWF0IGV4YW1wbGUKKyAgICBpZiAoeiAlIDEwMCA9PSAwKSB7CisgICAgICAgIHRpbWVzcGVjIHRzOworICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKTsKKyAgICAgICAgTE9HVCgiVGhpcyBpcyBhbiBpbnRlZ2VyICVkLCB0aGlzIGlzIGEgZmxvYXQgJWYsIHRoaXMgaXMgbXkgIgorICAgICAgICAgICAgInBpZCAlcCAlJSAlcyAldCIsIDQyLCAzLjE0LCAiYW5kIHRoaXMgaXMgYSB0aW1lc3RhbXAiLCB0cyk7CisgICAgICAgIExPR1QoIkEgZGVjZXB0aXZlIG51bGwtdGVybWluYXRlZCBzdHJpbmcgJVwwIik7CisgICAgfQorICAgICsrejsKKyNlbmRpZgorfQorCiAvLyByZW1vdmVUcmFja3NfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZW1vdmVUcmFja3NfbChjb25zdCBWZWN0b3I8IHNwPFRyYWNrPiA+JiB0cmFja3NUb1JlbW92ZSkKIHsKQEAgLTQxMzIsMjAgKzQxNjIsMTUgQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgaWYgKChtVHlwZSA9PSBPRkZMT0FEIHx8IG1UeXBlID09IERJUkVDVCkgJiYgbU91dHB1dCAhPSBOVUxMKSB7Ci0gICAgICAgIHVpbnQ2NF90IHBvc2l0aW9uNjQ7Ci0gICAgICAgIGlmIChtT3V0cHV0LT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbigmcG9zaXRpb242NCwgJnRpbWVzdGFtcC5tVGltZSkgPT0gT0spIHsKLSAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSAodWludDMyX3QpcG9zaXRpb242NDsKLSAgICAgICAgICAgIGlmIChtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TigpID4gMCkgewotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHBvc2l0aW9uT2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TWVhbigpICogbVNhbXBsZVJhdGUgKiAxZS0zKTsKLSAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25PZmZzZXQgPiB0aW1lc3RhbXAubVBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gLT0gcG9zaXRpb25PZmZzZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICBjb2xsZWN0VGltZXN0YW1wc19sKCk7CisgICAgICAgIGlmIChtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CisgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICAgICAgY29uc3QgaW50NjRfdCB0aW1lTnMgPSBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgIHRpbWVzdGFtcC5tVGltZS50dl9zZWMgPSB0aW1lTnMgLyBOQU5PU19QRVJfU0VDT05EOworICAgICAgICB0aW1lc3RhbXAubVRpbWUudHZfbnNlYyA9IHRpbWVOcyAtICh0aW1lc3RhbXAubVRpbWUudHZfc2VjICogTkFOT1NfUEVSX1NFQ09ORCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQpAQCAtNDIwNSw3ICs0MjMwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW51bWVyYXRlZCBkZXZpY2UgdHlwZSglI3gpIG11c3Qgbm90IGJlIHVzZWQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcyBpdCBkb2VzIG5vdCBzdXBwb3J0IGF1ZGlvIHBhdGNoZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGUpOwotICAgICAgICB0eXBlIHw9IHBhdGNoLT5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGU7CisgICAgICAgIHR5cGUgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KHR5cGUgfCBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlKTsKICAgICAgICAgZGV2aWNlVHlwZUFkZHJzLnB1c2hfYmFjayhBdWRpb0RldmljZVR5cGVBZGRyKHBhdGNoLT5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGUsCiAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UuYWRkcmVzcykpOwogICAgIH0KQEAgLTQ0NTUsOCArNDQ4MCw5IEBACiAgICAgICAgIC8vIHdyYXAgdGhlIHNvdXJjZSBzaWRlIG9mIHRoZSBNb25vUGlwZSB0byBtYWtlIGl0IGFuIEF1ZGlvQnVmZmVyUHJvdmlkZXIKICAgICAgICAgZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXIgPSBuZXcgU291cmNlQXVkaW9CdWZmZXJQcm92aWRlcihuZXcgTW9ub1BpcGVSZWFkZXIobW9ub1BpcGUpKTsKICAgICAgICAgZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXIgPSBOVUxMOwotICAgICAgICBmYXN0VHJhY2stPm1DaGFubmVsTWFzayA9IG1DaGFubmVsTWFzayB8IG1IYXB0aWNDaGFubmVsTWFzazsgLy8gbVBpcGVTaW5rIGNoYW5uZWwgbWFzayBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF1ZGlvIHRvIEZhc3RNaXhlcgorICAgICAgICBmYXN0VHJhY2stPm1DaGFubmVsTWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PigKKyAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2sgfCBtSGFwdGljQ2hhbm5lbE1hc2spOyAvLyBtUGlwZVNpbmsgY2hhbm5lbCBtYXNrIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF1ZGlvIHRvIEZhc3RNaXhlcgogICAgICAgICBmYXN0VHJhY2stPm1Gb3JtYXQgPSBtRm9ybWF0OyAvLyBtUGlwZVNpbmsgZm9ybWF0IGZvciBhdWRpbyB0byBGYXN0TWl4ZXIKICAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gbUhhcHRpY0NoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfTk9ORTsKICAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljSW50ZW5zaXR5ID0gQXVkaW9NaXhlcjo6SEFQVElDX1NDQUxFX05PTkU7CkBAIC00NDcwLDcgKzQ0OTYsOCBAQAogICAgICAgICAvLyBzcGVjaWZ5IHNpbmsgY2hhbm5lbCBtYXNrIHdoZW4gaGFwdGljIGNoYW5uZWwgbWFzayBwcmVzZW50IGFzIGl0IGNhbiBub3QKICAgICAgICAgLy8gYmUgY2FsY3VsYXRlZCBkaXJlY3RseSBmcm9tIGNoYW5uZWwgY291bnQKICAgICAgICAgc3RhdGUtPm1TaW5rQ2hhbm5lbE1hc2sgPSBtSGFwdGljQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9OT05FCi0gICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX05PTkUgOiBtQ2hhbm5lbE1hc2sgfCBtSGFwdGljQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX05PTkUKKyAgICAgICAgICAgICAgICA6IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtQ2hhbm5lbE1hc2sgfCBtSGFwdGljQ2hhbm5lbE1hc2spOwogICAgICAgICBzdGF0ZS0+bUNvbW1hbmQgPSBGYXN0TWl4ZXJTdGF0ZTo6Q09MRF9JRExFOwogICAgICAgICAvLyBhbHJlYWR5IGRvbmUgaW4gY29uc3RydWN0b3IgaW5pdGlhbGl6YXRpb24gbGlzdAogICAgICAgICAvL21GYXN0TWl4ZXJGdXRleCA9IDA7CkBAIC01NTQ0LDggKzU1NzEsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpCiB7CiAgICAgYm9vbCByZWNvbmZpZyA9IGZhbHNlOwotICAgIGJvb2wgYTJkcERldmljZUNoYW5nZWQgPSBmYWxzZTsKLQogICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogCiAgICAgQXV0b1Bhcms8RmFzdE1peGVyPiBwYXJrKG1GYXN0TWl4ZXIpOwpAQCAtNTYxNyw3ICs1NjQyLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiByZWNvbmZpZyB8fCBhMmRwRGV2aWNlQ2hhbmdlZDsKKyAgICByZXR1cm4gcmVjb25maWc7CiB9CiAKIApAQCAtNTgxOCw4ICs1ODQzLDE1IEBACiAgICAgICAgIHNwPFRyYWNrPiBsID0gbUFjdGl2ZVRyYWNrcy5nZXRMYXRlc3QoKTsKICAgICAgICAgYm9vbCBsYXN0ID0gbC5nZXQoKSA9PSB0cmFjazsKIAotICAgICAgICBpZiAodHJhY2stPmlzUGF1c2luZygpKSB7Ci0gICAgICAgICAgICB0cmFjay0+c2V0UGF1c2VkKCk7CisgICAgICAgIGlmICh0cmFjay0+aXNQYXVzZVBlbmRpbmcoKSkgeworICAgICAgICAgICAgdHJhY2stPnBhdXNlQWNrKCk7CisgICAgICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSBhIHRyYWNrIG1pZ2h0IGhhdmUgYmVlbiBmbHVzaGVkIG9yIHN0b3BwZWQuCisgICAgICAgICAgICAvLyBPdGhlciBvcGVyYXRpb25zIHN1Y2ggYXMgZmx1c2ggcGVuZGluZyBtaWdodCBvY2N1ciBvbiB0aGUgbmV4dCBwcmVwYXJlLgorICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1BhdXNpbmcoKSkgeworICAgICAgICAgICAgICAgIHRyYWNrLT5zZXRQYXVzZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFsd2F5cyBwZXJmb3JtIHBhdXNlLCBhcyBhbiBpbW1lZGlhdGUgZmx1c2ggd2lsbCBjaGFuZ2UKKyAgICAgICAgICAgIC8vIHRoZSBwYXVzZSBzdGF0ZSB0byBiZSBubyBsb25nZXIgaXNQYXVzaW5nKCkuCiAgICAgICAgICAgICBpZiAobUh3U3VwcG9ydHNQYXVzZSAmJiBsYXN0ICYmICFtSHdQYXVzZWQpIHsKICAgICAgICAgICAgICAgICBkb0h3UGF1c2UgPSB0cnVlOwogICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IHRydWU7CkBAIC01ODQ1LDExICs1ODc3LDE5IEBACiAgICAgICAgIC8vIEFsbG93IGRyYWluaW5nIHRoZSBidWZmZXIgaW4gY2FzZSB0aGUgY2xpZW50CiAgICAgICAgIC8vIGFwcCBkb2VzIG5vdCBjYWxsIHN0b3AoKSBhbmQgcmVsaWVzIG9uIHVuZGVycnVuIHRvIHN0b3A6CiAgICAgICAgIC8vIGhlbmNlIHRoZSB0ZXN0IG9uICh0cmFjay0+bVJldHJ5Q291bnQgPiAxKS4KLSAgICAgICAgLy8gSWYgcmV0cnlDb3VudDw9MSB0aGVuIHRyYWNrIGlzIGFib3V0IHRvIHVuZGVycnVuIGFuZCBiZSByZW1vdmVkLgorICAgICAgICAvLyBJZiB0cmFjay0+bVJldHJ5Q291bnQgPD0gMSB0aGVuIHRyYWNrIGlzIGFib3V0IHRvIGJlIGRpc2FibGVkLCBwYXVzZWQsIHJlbW92ZWQsCisgICAgICAgIC8vIHNvIHdlIGFjY2VwdCBhbnkgbm9uemVybyBhbW91bnQgb2YgZGF0YSBkZWxpdmVyZWQgYnkgdGhlIEF1ZGlvVHJhY2sgKHdoaWNoIHdpbGwKKyAgICAgICAgLy8gcmVzZXQgdGhlIHJldHJ5IGNvdW50ZXIpLgogICAgICAgICAvLyBEbyBub3QgdXNlIGEgaGlnaCB0aHJlc2hvbGQgZm9yIGNvbXByZXNzZWQgYXVkaW8uCisKKyAgICAgICAgLy8gdGFyZ2V0IHJldHJ5IGNvdW50IHRoYXQgd2Ugd2lsbCB1c2UgaXMgYmFzZWQgb24gdGhlIHRpbWUgd2Ugd2FpdCBmb3IgcmV0cmllcy4KKyAgICAgICAgY29uc3QgaW50MzJfdCB0YXJnZXRSZXRyeUNvdW50ID0ga01heFRyYWNrUmV0cmllc0RpcmVjdE1zICogMTAwMCAvIG1BY3RpdmVTbGVlcFRpbWVVczsKKyAgICAgICAgLy8gdGhlIHJldHJ5IHRocmVzaG9sZCBpcyB3aGVuIHdlIGFjY2VwdCBhbnkgc2l6ZSBmb3IgUENNIGRhdGEuICBUaGlzIGlzIHNsaWdodGx5CisgICAgICAgIC8vIHNtYWxsZXIgdGhhbiB0aGUgcmV0cnkgY291bnQgc28gd2UgY2FuIHB1c2ggc21hbGwgYml0cyBvZiBkYXRhIHdpdGhvdXQgYSBnbGl0Y2guCisgICAgICAgIGNvbnN0IGludDMyX3QgcmV0cnlUaHJlc2hvbGQgPSB0YXJnZXRSZXRyeUNvdW50ID4gMiA/IHRhcmdldFJldHJ5Q291bnQgLSAxIDogMTsKICAgICAgICAgdWludDMyX3QgbWluRnJhbWVzOwogICAgICAgICBpZiAoKHRyYWNrLT5zaGFyZWRCdWZmZXIoKSA9PSAwKSAmJiAhdHJhY2stPmlzU3RvcHBpbmdfMSgpICYmICF0cmFjay0+aXNQYXVzaW5nKCkKLSAgICAgICAgICAgICYmICh0cmFjay0+bVJldHJ5Q291bnQgPiAxKSAmJiBhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhtRm9ybWF0KSkgeworICAgICAgICAgICAgJiYgKHRyYWNrLT5tUmV0cnlDb3VudCA+IHJldHJ5VGhyZXNob2xkKSAmJiBhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhtRm9ybWF0KSkgewogICAgICAgICAgICAgbWluRnJhbWVzID0gbU5vcm1hbEZyYW1lQ291bnQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtaW5GcmFtZXMgPSAxOwpAQCAtNTg5Myw3ICs1OTMzLDcgQEAKICAgICAgICAgICAgICAgICBtUHJldmlvdXNUcmFjayA9IHRyYWNrOwogCiAgICAgICAgICAgICAgICAgLy8gcmVzZXQgcmV0cnkgY291bnQKLSAgICAgICAgICAgICAgICB0cmFjay0+bVJldHJ5Q291bnQgPSBrTWF4VHJhY2tSZXRyaWVzRGlyZWN0OworICAgICAgICAgICAgICAgIHRyYWNrLT5tUmV0cnlDb3VudCA9IHRhcmdldFJldHJ5Q291bnQ7CiAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrID0gdDsKICAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX1RSQUNLU19SRUFEWTsKICAgICAgICAgICAgICAgICBpZiAobUh3UGF1c2VkKSB7CkBAIC01OTQ3LDE1ICs1OTg3LDE3IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRvIGNsaWVudCBwcm9jZXNzIHRoYXQgdGhlIHRyYWNrIHdhcyBkaXNhYmxlZCBiZWNhdXNlIG9mIHVuZGVycnVuOwogICAgICAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIHRoZW4gYXV0b21hdGljYWxseSBjYWxsIHN0YXJ0KCkgd2hlbiBkYXRhIGlzIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgICAgICB0cmFjay0+ZGlzYWJsZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdCkgeworICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIGh3IHBhdXNlIHdoZW4gdHJhY2sgaXMgZ29pbmcgdG8gYmUgcmVtb3ZlZCBkdWUgdG8gQlVGRkVSIFRJTUVPVVQuCisgICAgICAgICAgICAgICAgICAgIC8vIHVubGlrZSBtaXhlcnRocmVhZCwgSEFMIGNhbiBiZSBwYXVzZWQgZm9yIGRpcmVjdCBvdXRwdXQKICAgICAgICAgICAgICAgICAgICAgQUxPR1coInBhdXNlIGJlY2F1c2Ugb2YgVU5ERVJSVU4sIGZyYW1lc1JlYWR5ID0gJXp1LCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWluRnJhbWVzID0gJXUsIG1Gb3JtYXQgPSAlI3giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1JlYWR5LCBtaW5GcmFtZXMsIG1Gb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX1RSQUNLU19FTkFCTEVEOwotICAgICAgICAgICAgICAgICAgICBpZiAobUh3U3VwcG9ydHNQYXVzZSAmJiAhbUh3UGF1c2VkICYmICFtU3RhbmRieSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCAmJiBtSHdTdXBwb3J0c1BhdXNlICYmICFtSHdQYXVzZWQgJiYgIW1TdGFuZGJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBkb0h3UGF1c2UgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgbUh3UGF1c2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdCkgeworICAgICAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX1RSQUNLU19FTkFCTEVEOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjAyNywxNiArNjA2OSwxMyBAQAogICAgICAgICBtU2xlZXBUaW1lVXMgPSBtSWRsZVNsZWVwVGltZVVzOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGlmIChtU2xlZXBUaW1lVXMgPT0gMCkgewotICAgICAgICBpZiAobU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEKSB7Ci0gICAgICAgICAgICBtU2xlZXBUaW1lVXMgPSBtQWN0aXZlU2xlZXBUaW1lVXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU2xlZXBUaW1lVXMgPSBtSWRsZVNsZWVwVGltZVVzOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtQnl0ZXNXcml0dGVuICE9IDAgJiYgYXVkaW9faGFzX3Byb3BvcnRpb25hbF9mcmFtZXMobUZvcm1hdCkpIHsKLSAgICAgICAgbWVtc2V0KG1TaW5rQnVmZmVyLCAwLCBtRnJhbWVDb3VudCAqIG1GcmFtZVNpemUpOwotICAgICAgICBtU2xlZXBUaW1lVXMgPSAwOworICAgIGlmIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQpIHsKKyAgICAgICAgbVNsZWVwVGltZVVzID0gbUFjdGl2ZVNsZWVwVGltZVVzOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TbGVlcFRpbWVVcyA9IG1JZGxlU2xlZXBUaW1lVXM7CiAgICAgfQorICAgIC8vIE5vdGU6IEluIFMgb3IgbGF0ZXIsIHdlIGRvIG5vdCB3cml0ZSB6ZXJvZXMgZm9yCisgICAgLy8gbGluZWFyIG9yIHByb3BvcnRpb25hbCBQQ00gZGlyZWN0IHRyYWNrcyBpbiB1bmRlcnJ1bi4KIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6dGhyZWFkTG9vcF9leGl0KCkKQEAgLTYwNzgsOCArNjExNyw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpCiB7CiAgICAgYm9vbCByZWNvbmZpZyA9IGZhbHNlOwotICAgIGJvb2wgYTJkcERldmljZUNoYW5nZWQgPSBmYWxzZTsKLQogICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogCiAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXIpOwpAQCAtNjExNCw3ICs2MTUxLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiByZWNvbmZpZyB8fCBhMmRwRGV2aWNlQ2hhbmdlZDsKKyAgICByZXR1cm4gcmVjb25maWc7CiB9CiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjphY3RpdmVTbGVlcFRpbWVVcygpIGNvbnN0CkBAIC02MTcxLDcgKzYyMDgsNyBAQAogICAgIG1PdXRwdXQtPmZsdXNoKCk7CiAgICAgbUh3UGF1c2VkID0gZmFsc2U7CiAgICAgbUZsdXNoUGVuZGluZyA9IGZhbHNlOwotICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7IC8vIERJUkVDVCBhbmQgT0ZGTE9BREVEIGZsdXNoIHJlc2V0cyBmcmFtZSBjb3VudC4KKyAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eShkaXNjb250aW51aXR5Rm9yU3RhbmRieU9yRmx1c2goKSk7CiAgICAgbVRpbWVzdGFtcC5jbGVhcigpOwogfQogCkBAIC02MzYzLDggKzY0MDAsMTUgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHRyYWNrLT5pc1BhdXNpbmcoKSkgewotICAgICAgICAgICAgdHJhY2stPnNldFBhdXNlZCgpOworICAgICAgICBpZiAodHJhY2stPmlzUGF1c2VQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgIHRyYWNrLT5wYXVzZUFjaygpOworICAgICAgICAgICAgLy8gSXQgaXMgcG9zc2libGUgYSB0cmFjayBtaWdodCBoYXZlIGJlZW4gZmx1c2hlZCBvciBzdG9wcGVkLgorICAgICAgICAgICAgLy8gT3RoZXIgb3BlcmF0aW9ucyBzdWNoIGFzIGZsdXNoIHBlbmRpbmcgbWlnaHQgb2NjdXIgb24gdGhlIG5leHQgcHJlcGFyZS4KKyAgICAgICAgICAgIGlmICh0cmFjay0+aXNQYXVzaW5nKCkpIHsKKyAgICAgICAgICAgICAgICB0cmFjay0+c2V0UGF1c2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBBbHdheXMgcGVyZm9ybSBwYXVzZSBpZiBsYXN0LCBhcyBhbiBpbW1lZGlhdGUgZmx1c2ggd2lsbCBjaGFuZ2UKKyAgICAgICAgICAgIC8vIHRoZSBwYXVzZSBzdGF0ZSB0byBiZSBubyBsb25nZXIgaXNQYXVzaW5nKCkuCiAgICAgICAgICAgICBpZiAobGFzdCkgewogICAgICAgICAgICAgICAgIGlmIChtSHdTdXBwb3J0c1BhdXNlICYmICFtSHdQYXVzZWQpIHsKICAgICAgICAgICAgICAgICAgICAgZG9Id1BhdXNlID0gdHJ1ZTsKQEAgLTY1MDcsMTMgKzY1NTEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnByZXNlbnRhdGlvbkNvbXBsZXRlKGZyYW1lc1dyaXR0ZW4sIGF1ZGlvSEFMRnJhbWVzKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnJlc2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwotICAgICAgICAgICAgICAgICAgICAvLyBESVJFQ1QgYW5kIE9GRkxPQURFRCBzdG9wIHJlc2V0cyBmcmFtZSBjb3VudHMuCisgICAgICAgICAgICAgICAgICAgIC8vIE9GRkxPQURFRCBzdG9wIHJlc2V0cyBmcmFtZSBjb3VudHMuCiAgICAgICAgICAgICAgICAgICAgIGlmICghbVVzZUFzeW5jV3JpdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IGdldCBleHBsaWNpdCBkcmFpbiBub3RpZmljYXRpb24gd2UgbXVzdAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgZGlzY29udGludWl0eSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhpcyBpcwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByZXZpb3VzICghbGFzdCkgb3IgdGhlIHVwY29taW5nIChsYXN0KSB0cmFjawogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYXZvaWQgc2tpcHBpbmcgdGhlIGRpc2NvbnRpbnVpdHkuCi0gICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5ESVNDT05USU5VSVRZX01PREVfWkVSTyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNjg4Nyw3ICs2OTMyLDcgQEAKICAgICBzbnByaW50ZihtVGhyZWFkTmFtZSwga1RocmVhZE5hbWVMZW5ndGgsICJBdWRpb0luXyVYIiwgaWQpOwogICAgIG1OQkxvZ1dyaXRlciA9IGF1ZGlvRmxpbmdlci0+bmV3V3JpdGVyX2woa0xvZ1NpemUsIG1UaHJlYWROYW1lKTsKIAotICAgIGlmIChtSW5wdXQgIT0gbnVsbHB0ciAmJiBtSW5wdXQtPmF1ZGlvSHdEZXYgIT0gbnVsbHB0cikgeworICAgIGlmIChtSW5wdXQtPmF1ZGlvSHdEZXYgIT0gbnVsbHB0cikgewogICAgICAgICBtSXNNc2REZXZpY2UgPSBzdHJjbXAoCiAgICAgICAgICAgICAgICAgbUlucHV0LT5hdWRpb0h3RGV2LT5tb2R1bGVOYW1lKCksIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpID09IDA7CiAgICAgfQpAQCAtNzMxOCw3ICs3MzYzLDcgQEAKIAogICAgICAgICAgICAgY29uc3Qgc3NpemVfdCBhdmFpbGFibGVUb1JlYWQgPSBtUGlwZVNvdXJjZS0+YXZhaWxhYmxlVG9SZWFkKCk7CiAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlVG9SZWFkID49IDApIHsKLSAgICAgICAgICAgICAgICAvLyBQaXBlU291cmNlIGlzIHRoZSBtYXN0ZXIgY2xvY2suICBJdCBpcyB1cCB0byB0aGUgQXVkaW9SZWNvcmQgY2xpZW50IHRvIGtlZXAgdXAuCisgICAgICAgICAgICAgICAgLy8gUGlwZVNvdXJjZSBpcyB0aGUgcHJpbWFyeSBjbG9jay4gIEl0IGlzIHVwIHRvIHRoZSBBdWRpb1JlY29yZCBjbGllbnQgdG8ga2VlcCB1cC4KICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChzaXplX3QpYXZhaWxhYmxlVG9SZWFkID4gbVBpcGVGcmFtZXNQMiwKICAgICAgICAgICAgICAgICAgICAgICAgICJtb3JlIGZyYW1lcyB0byByZWFkIHRoYW4gZmlmbyBzaXplLCAlemQgPiAlenUiLAogICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlVG9SZWFkLCBtUGlwZUZyYW1lc1AyKTsKQEAgLTczNzEsNyArNzQxNiw5IEBACiAgICAgICAgIGlmIChtUGlwZVNvdXJjZS5nZXQoKSA9PSBudWxscHRyIC8qIGRvbid0IG9idGFpbiBmb3IgRmFzdENhcHR1cmUsIGNvdWxkIGJsb2NrICovKSB7CiAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uLCB0aW1lOwogICAgICAgICAgICAgaWYgKG1TdGFuZGJ5KSB7Ci0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eShhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpID8KKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLkRJU0NPTlRJTlVJVFlfTU9ERV9DT05USU5VT1VTIDoKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLkRJU0NPTlRJTlVJVFlfTU9ERV9aRVJPKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobVNvdXJjZS0+Z2V0Q2FwdHVyZVBvc2l0aW9uKCZwb3NpdGlvbiwgJnRpbWUpID09IE5PX0VSUk9SCiAgICAgICAgICAgICAgICAgICAgICYmIHRpbWUgPiBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0pIHsKIApAQCAtNzM3OSwxMiArNzQyNiwxMiBAQAogCiAgICAgICAgICAgICAgICAgLy8gQ29ycmVjdCB0aW1lc3RhbXBzCiAgICAgICAgICAgICAgICAgaWYgKGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQkVGT1JFOiAlZCAlbGxkICVsbGQiLAorICAgICAgICAgICAgICAgICAgICBBTE9HVlYoIlRTX0JFRk9SRTogJWQgJWxsZCAlbGxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCgpLCAobG9uZyBsb25nKXRpbWUsIChsb25nIGxvbmcpcG9zaXRpb24pOwogICAgICAgICAgICAgICAgICAgICBhdXRvIGNvcnJlY3RlZFRpbWVzdGFtcCA9IG1UaW1lc3RhbXBWZXJpZmllci5nZXRMYXN0Q29ycmVjdGVkVGltZXN0YW1wKCk7CiAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gY29ycmVjdGVkVGltZXN0YW1wLm1GcmFtZXM7CiAgICAgICAgICAgICAgICAgICAgIHRpbWUgPSBjb3JyZWN0ZWRUaW1lc3RhbXAubVRpbWVOczsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0FGVEVSOiAlZCAlbGxkICVsbGQiLAorICAgICAgICAgICAgICAgICAgICBBTE9HVlYoIlRTX0FGVEVSOiAlZCAlbGxkICVsbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKCksIChsb25nIGxvbmcpdGltZSwgKGxvbmcgbG9uZylwb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgfQogCkBAIC03NDM0LDcgKzc0ODEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKGZyYW1lc1JlYWQgLSBwYXJ0MSkgKiBtRnJhbWVTaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZWFyID0gbVJzbXBJblJlYXIgKz0gZnJhbWVzUmVhZDsKKyAgICAgICAgbVJzbXBJblJlYXIgPSBhdWRpb191dGlsczo6c2FmZV9hZGRfb3ZlcmZsb3cobVJzbXBJblJlYXIsIChpbnQzMl90KWZyYW1lc1JlYWQpOwogCiAgICAgICAgIHNpemUgPSBhY3RpdmVUcmFja3Muc2l6ZSgpOwogCkBAIC04MDU0LDEwICs4MTAxLDE1IEBACiAgICAgU3RyZWFtSW5IYWxJbnRlcmZhY2U6OlNpbmtNZXRhZGF0YSBtZXRhZGF0YTsKICAgICBmb3IgKGNvbnN0IHNwPFJlY29yZFRyYWNrPiAmdHJhY2sgOiBtQWN0aXZlVHJhY2tzKSB7CiAgICAgICAgIC8vIE5vIHRyYWNrIGlzIGludmFsaWQgYXMgdGhpcyBpcyBjYWxsZWQgYWZ0ZXIgcHJlcGFyZVRyYWNrX2wgaW4gdGhlIHNhbWUgY3JpdGljYWwgc2VjdGlvbgotICAgICAgICBtZXRhZGF0YS50cmFja3MucHVzaF9iYWNrKHsKKyAgICAgICAgcmVjb3JkX3RyYWNrX21ldGFkYXRhX3Y3X3QgdHJhY2tNZXRhZGF0YTsKKyAgICAgICAgdHJhY2tNZXRhZGF0YS5iYXNlID0gewogICAgICAgICAgICAgICAgIC5zb3VyY2UgPSB0cmFjay0+YXR0cmlidXRlcygpLnNvdXJjZSwKICAgICAgICAgICAgICAgICAuZ2FpbiA9IDEsIC8vIGNhcHR1cmUgdHJhY2tzIGRvIG5vdCBoYXZlIHZvbHVtZXMKLSAgICAgICAgfSk7CisgICAgICAgIH07CisgICAgICAgIHRyYWNrTWV0YWRhdGEuY2hhbm5lbF9tYXNrID0gdHJhY2stPmNoYW5uZWxNYXNrKCksCisgICAgICAgIHN0cm5jcHkodHJhY2tNZXRhZGF0YS50YWdzLCB0cmFjay0+YXR0cmlidXRlcygpLnRhZ3MsIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSk7CisKKyAgICAgICAgbWV0YWRhdGEudHJhY2tzLnB1c2hfYmFjayh0cmFja01ldGFkYXRhKTsKICAgICB9CiAgICAgbUlucHV0LT5zdHJlYW0tPnVwZGF0ZVNpbmtNZXRhZGF0YShtZXRhZGF0YSk7CiB9CkBAIC04MzU4LDEzICs4NDEwLDExIEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKHJlY29uZmlnKSB7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEJBRF9WQUxVRSkgewotICAgICAgICAgICAgICAgIHVpbnQzMl90IHNSYXRlOwotICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrOwotICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDsKLSAgICAgICAgICAgICAgICBpZiAobUlucHV0LT5zdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygmc1JhdGUsICZjaGFubmVsTWFzaywgJmZvcm1hdCkgPT0gT0sgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJiBhdWRpb19pc19saW5lYXJfcGNtKHJlcUZvcm1hdCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHNSYXRlIDw9IChBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVggKiBzYW1wbGluZ1JhdGUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzaykgPD0gRkNDXzgpIHsKKyAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgICAgIGlmIChtSW5wdXQtPnN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKCZjb25maWcpID09IE9LICYmCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGNvbmZpZy5mb3JtYXQpICYmIGF1ZGlvX2lzX2xpbmVhcl9wY20ocmVxRm9ybWF0KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlIDw9IChBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVggKiBzYW1wbGluZ1JhdGUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWcuY2hhbm5lbF9tYXNrKSA8PSBGQ0NfOCkgewogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC04NTYyLDcgKzg2MTIsNyBAQAogCiAgICAgLy8gc3RvcmUgbmV3IGRldmljZSBhbmQgc2VuZCB0byBlZmZlY3RzCiAgICAgbUluRGV2aWNlVHlwZUFkZHIubVR5cGUgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLnR5cGU7Ci0gICAgbUluRGV2aWNlVHlwZUFkZHIubUFkZHJlc3MgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmFkZHJlc3M7CisgICAgbUluRGV2aWNlVHlwZUFkZHIuc2V0QWRkcmVzcyhwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmFkZHJlc3MpOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBwYXRjaC0+c291cmNlc1swXS5pZDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0SW5wdXREZXZpY2VfbChpbkRldmljZVR5cGVBZGRyKCkpOwpAQCAtODY0MSw2ICs4NjkxLDcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6dXBkYXRlT3V0RGV2aWNlcyhjb25zdCBEZXZpY2VEZXNjcmlwdG9yQmFzZVZlY3RvciYgb3V0RGV2aWNlcykKIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIG1PdXREZXZpY2VzID0gb3V0RGV2aWNlczsKICAgICBtT3V0RGV2aWNlVHlwZUFkZHJzID0gZGV2aWNlVHlwZUFkZHJzRnJvbURlc2NyaXB0b3JzKG1PdXREZXZpY2VzKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKQEAgLTkxOTIsNyArOTI0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnVtZXJhdGVkIGRldmljZSB0eXBlKCUjeCkgbXVzdCBub3QgYmUgdXNlZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcyBpdCBkb2VzIG5vdCBzdXBwb3J0IGF1ZGlvIHBhdGNoZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlKTsKLSAgICAgICAgICAgIHR5cGUgfD0gcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZTsKKyAgICAgICAgICAgIHR5cGUgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KHR5cGUgfCBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlKTsKICAgICAgICAgICAgIHNpbmtEZXZpY2VUeXBlQWRkcnMucHVzaF9iYWNrKEF1ZGlvRGV2aWNlVHlwZUFkZHIocGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZSwKICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UuYWRkcmVzcykpOwogICAgICAgICB9CkBAIC05MjAzLDcgKzkyNTQsNyBAQAogICAgICAgICBkZXZpY2VJZCA9IHBhdGNoLT5zb3VyY2VzWzBdLmlkOwogICAgICAgICBudW1EZXZpY2VzID0gbVBhdGNoLm51bV9zb3VyY2VzOwogICAgICAgICBzb3VyY2VEZXZpY2VUeXBlQWRkci5tVHlwZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZTsKLSAgICAgICAgc291cmNlRGV2aWNlVHlwZUFkZHIubUFkZHJlc3MgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmFkZHJlc3M7CisgICAgICAgIHNvdXJjZURldmljZVR5cGVBZGRyLnNldEFkZHJlc3MocGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKQEAgLTk2MTgsMTEgKzk2NjksMTUgQEAKICAgICBTdHJlYW1PdXRIYWxJbnRlcmZhY2U6OlNvdXJjZU1ldGFkYXRhIG1ldGFkYXRhOwogICAgIGZvciAoY29uc3Qgc3A8TW1hcFRyYWNrPiAmdHJhY2sgOiBtQWN0aXZlVHJhY2tzKSB7CiAgICAgICAgIC8vIE5vIHRyYWNrIGlzIGludmFsaWQgYXMgdGhpcyBpcyBjYWxsZWQgYWZ0ZXIgcHJlcGFyZVRyYWNrX2wgaW4gdGhlIHNhbWUgY3JpdGljYWwgc2VjdGlvbgotICAgICAgICBtZXRhZGF0YS50cmFja3MucHVzaF9iYWNrKHsKKyAgICAgICAgcGxheWJhY2tfdHJhY2tfbWV0YWRhdGFfdjdfdCB0cmFja01ldGFkYXRhOworICAgICAgICB0cmFja01ldGFkYXRhLmJhc2UgPSB7CiAgICAgICAgICAgICAgICAgLnVzYWdlID0gdHJhY2stPmF0dHJpYnV0ZXMoKS51c2FnZSwKICAgICAgICAgICAgICAgICAuY29udGVudF90eXBlID0gdHJhY2stPmF0dHJpYnV0ZXMoKS5jb250ZW50X3R5cGUsCiAgICAgICAgICAgICAgICAgLmdhaW4gPSBtSGFsVm9sRmxvYXQsIC8vIFRPRE86IHByb3BhZ2F0ZSBmcm9tIGFhdWRpbyBwcmUtbWl4IHZvbHVtZQotICAgICAgICB9KTsKKyAgICAgICAgfTsKKyAgICAgICAgdHJhY2tNZXRhZGF0YS5jaGFubmVsX21hc2sgPSB0cmFjay0+Y2hhbm5lbE1hc2soKSwKKyAgICAgICAgc3RybmNweSh0cmFja01ldGFkYXRhLnRhZ3MsIHRyYWNrLT5hdHRyaWJ1dGVzKCkudGFncywgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFKTsKKyAgICAgICAgbWV0YWRhdGEudHJhY2tzLnB1c2hfYmFjayh0cmFja01ldGFkYXRhKTsKICAgICB9CiAgICAgbU91dHB1dC0+c3RyZWFtLT51cGRhdGVTb3VyY2VNZXRhZGF0YShtZXRhZGF0YSk7CiB9CkBAIC05NzI5LDEwICs5Nzg0LDE0IEBACiAgICAgU3RyZWFtSW5IYWxJbnRlcmZhY2U6OlNpbmtNZXRhZGF0YSBtZXRhZGF0YTsKICAgICBmb3IgKGNvbnN0IHNwPE1tYXBUcmFjaz4gJnRyYWNrIDogbUFjdGl2ZVRyYWNrcykgewogICAgICAgICAvLyBObyB0cmFjayBpcyBpbnZhbGlkIGFzIHRoaXMgaXMgY2FsbGVkIGFmdGVyIHByZXBhcmVUcmFja19sIGluIHRoZSBzYW1lIGNyaXRpY2FsIHNlY3Rpb24KLSAgICAgICAgbWV0YWRhdGEudHJhY2tzLnB1c2hfYmFjayh7CisgICAgICAgIHJlY29yZF90cmFja19tZXRhZGF0YV92N190IHRyYWNrTWV0YWRhdGE7CisgICAgICAgIHRyYWNrTWV0YWRhdGEuYmFzZSA9IHsKICAgICAgICAgICAgICAgICAuc291cmNlID0gdHJhY2stPmF0dHJpYnV0ZXMoKS5zb3VyY2UsCiAgICAgICAgICAgICAgICAgLmdhaW4gPSAxLCAvLyBjYXB0dXJlIHRyYWNrcyBkbyBub3QgaGF2ZSB2b2x1bWVzCi0gICAgICAgIH0pOworICAgICAgICB9OworICAgICAgICB0cmFja01ldGFkYXRhLmNoYW5uZWxfbWFzayA9IHRyYWNrLT5jaGFubmVsTWFzaygpLAorICAgICAgICBzdHJuY3B5KHRyYWNrTWV0YWRhdGEudGFncywgdHJhY2stPmF0dHJpYnV0ZXMoKS50YWdzLCBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUpOworICAgICAgICBtZXRhZGF0YS50cmFja3MucHVzaF9iYWNrKHRyYWNrTWV0YWRhdGEpOwogICAgIH0KICAgICBtSW5wdXQtPnN0cmVhbS0+dXBkYXRlU2lua01ldGFkYXRhKG1ldGFkYXRhKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCmluZGV4IDZiMzNhZDUuLjlmNjU1NjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaApAQCAtNTkwLDYgKzU5MCwxMSBAQAogICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wICAgICAgIG1UaW1lc3RhbXA7CiAgICAgICAgICAgICAgICAgVGltZXN0YW1wVmVyaWZpZXI8IC8vIEZvciB0aW1lc3RhbXAgc3RhdGlzdGljcy4KICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgLyogZnJhbWUgY291bnQgKi8sIGludDY0X3QgLyogdGltZSBucyAqLz4gbVRpbWVzdGFtcFZlcmlmaWVyOworICAgICAgICAgICAgICAgIC8vIERJUkVDVCBhbmQgT0ZGTE9BRCB0aHJlYWRzIHNob3VsZCByZXNldCBmcmFtZSBjb3VudCB0byB6ZXJvIG9uIHN0b3AvZmx1c2gKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBhZGQgY29uZmlybWF0aW9uIGNoZWNrczoKKyAgICAgICAgICAgICAgICAvLyAxKSBESVJFQ1QgdGhyZWFkcyBhbmQgbGluZWFyIFBDTSBmb3JtYXQgcmVhbGx5IHJlc2V0cyB0byAwPworICAgICAgICAgICAgICAgIC8vIDIpIElzIGZyYW1lIGNvdW50IHJlYWxseSB2YWxpZCBpZiBub3QgbGluZWFyIHBjbT8KKyAgICAgICAgICAgICAgICAvLyAzKSBBcmUgYWxsIDY0IGJpdHMgb2YgcG9zaXRpb24gcmV0dXJuZWQsIG5vdCBqdXN0IGxvd2VzdCAzMiBiaXRzPwogICAgICAgICAgICAgICAgIC8vIFRpbWVzdGFtcCBjb3JyZWN0ZWQgZGV2aWNlIHNob3VsZCBiZSBhIHNpbmdsZSBkZXZpY2UuCiAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgbVRpbWVzdGFtcENvcnJlY3RlZERldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwogCkBAIC05NDAsNiArOTQ1LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgb3V0RGV2aWNlVHlwZXMoKS5jb3VudChtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlKSAhPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIHZvaWQgc2V0RG93blN0cmVhbVBhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gpIHsKKyAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgbURvd25TdHJlYW1QYXRjaCA9ICpwYXRjaDsKKyAgICAgICAgICAgICAgICB9CisKIHByb3RlY3RlZDoKICAgICAvLyB1cGRhdGVkIGJ5IHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKQogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQ7ICAvLyBub3JtYWwgbWl4ZXIgYW5kIGVmZmVjdHMKQEAgLTEwMTgsNiArMTAyOCw4IEBACiAKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW47CiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbjsgLy8gbm90IHJlc2V0IG9uIHN0YW5kYnkKKyAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RnJhbWVzV3JpdHRlbiA9IC0xOyAvLyB0cmFjayBjaGFuZ2VzIGluIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcnZlciBmcmFtZXMgd3JpdHRlbi4KICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1TdXNwZW5kZWRGcmFtZXM7IC8vIG5vdCByZXNldCBvbiBzdGFuZGJ5CiAKICAgICAvLyBtSGFwdGljQ2hhbm5lbE1hc2sgYW5kIG1IYXB0aWNDaGFubmVsQ291bnQgd2lsbCBvbmx5IGJlIHZhbGlkIHdoZW4gdGhlIHRocmVhZCBzdXBwb3J0CkBAIC0xMDMwLDYgKzEwNDIsMTQgQEAKICAgICAvLyBjb3B5IHJhdGhlciB0aGFuIHRoZSBvbmUgaW4gQXVkaW9GbGluZ2VyLiAgVGhpcyBvcHRpbWl6YXRpb24gc2F2ZXMgYSBsb2NrLgogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hc3Rlck11dGU7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0TWFzdGVyTXV0ZV9sKGJvb2wgbXV0ZWQpIHsgbU1hc3Rlck11dGUgPSBtdXRlZDsgfQorCisgICAgICAgICAgICAgICAgYXV0byBkaXNjb250aW51aXR5Rm9yU3RhbmRieU9yRmx1c2goKSBjb25zdCB7IC8vIGNhbGwgb24gdGhyZWFkTG9vcCBvciB3aXRoIGxvY2suCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKG1UeXBlID09IERJUkVDVCAmJiAhYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1UeXBlID09IE9GRkxPQUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtVGltZXN0YW1wVmVyaWZpZXIuRElTQ09OVElOVUlUWV9NT0RFX1pFUk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1UaW1lc3RhbXBWZXJpZmllci5ESVNDT05USU5VSVRZX01PREVfQ09OVElOVU9VUzsKKyAgICAgICAgICAgICAgICB9CisKIHByb3RlY3RlZDoKICAgICBBY3RpdmVUcmFja3M8VHJhY2s+ICAgICBtQWN0aXZlVHJhY2tzOwogCkBAIC0xMDc2LDYgKzEwOTYsOCBAQAogICAgIHZvaWQgICAgICAgIHVwZGF0ZU1ldGFkYXRhX2woKSBmaW5hbDsKICAgICB2aXJ0dWFsIHZvaWQgc2VuZE1ldGFkYXRhVG9CYWNrZW5kX2woY29uc3QgU3RyZWFtT3V0SGFsSW50ZXJmYWNlOjpTb3VyY2VNZXRhZGF0YSYgbWV0YWRhdGEpOwogCisgICAgdm9pZCAgICAgICAgY29sbGVjdFRpbWVzdGFtcHNfbCgpOworCiAgICAgLy8gVGhlIFRyYWNrcyBjbGFzcyBtYW5hZ2VzIHRyYWNrcyBhZGRlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBUaHJlYWQuCiAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICAgY2xhc3MgVHJhY2tzIHsKQEAgLTEyMTgsNiArMTI0MCwxMCBAQAogICAgICAgICAgICAgICAgIC8vIHZvbHVtZXMgbGFzdCBzZW50IHRvIGF1ZGlvIEhBTCB3aXRoIHN0cmVhbS0+c2V0Vm9sdW1lKCkKICAgICAgICAgICAgICAgICBmbG9hdCBtTGVmdFZvbEZsb2F0OwogICAgICAgICAgICAgICAgIGZsb2F0IG1SaWdodFZvbEZsb2F0OworCisgICAgICAgICAgICAgICAgLy8gYXVkaW8gcGF0Y2ggdXNlZCBieSB0aGUgZG93bnN0cmVhbSBzb2Z0d2FyZSBwYXRjaC4KKyAgICAgICAgICAgICAgICAvLyBPbmx5IHVzZWQgaWYgVGhyZWFkQmFzZTo6bUlzTXNkRGV2aWNlIGlzIHRydWUuCisgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIG1Eb3duU3RyZWFtUGF0Y2g7CiB9OwogCiBjbGFzcyBNaXhlclRocmVhZCA6IHB1YmxpYyBQbGF5YmFja1RocmVhZCB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKaW5kZXggMDFkNTM0NS4uMzhkYWI1YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaApAQCAtMjUzLDYgKzI1Myw4IEBACiAgICAgLy8gQ2FsbGVkIHRvIHRhbGx5IHVuZGVycnVuIGZyYW1lcyBpbiBwbGF5YmFjay4KICAgICB2aXJ0dWFsIHZvaWQgdGFsbHlVbmRlcnJ1bkZyYW1lcyhzaXplX3QgLyogZnJhbWVzICovKSB7fQogCisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2soKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbE1hc2s7IH0KKwogcHJvdGVjdGVkOgogICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUcmFja0Jhc2UpOwogCkBAIC0yNzgsOCArMjgwLDYgQEAKIAogICAgIHNpemVfdCBmcmFtZVNpemUoKSBjb25zdCB7IHJldHVybiBtRnJhbWVTaXplOyB9CiAKLSAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsTWFzazsgfQotCiAgICAgdmlydHVhbCB1aW50MzJfdCBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsZVJhdGU7IH0KIAogICAgIGJvb2wgaXNTdG9wcGVkKCkgY29uc3QgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcAppbmRleCBmMjg2ZDhhLi40MzUzYjNkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcApAQCAtNTQsNiArNTQsNjAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvLyBWYWxpZGF0aW9uIG1ldGhvZHMgZm9yIGlucHV0CituYW1lc3BhY2UgeworCitzdGF0dXNfdCB2YWxpZGF0ZUF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCBsZXZlbGRCKQoreworICAgIGNvbnN0ZXhwciBmbG9hdCBNQVhfQVVESU9fREVTQ1JJUFRJT05fTUlYX0xFVkVMID0gNDguZjsKKyAgICByZXR1cm4gc3RkOjppc25hbihsZXZlbGRCKSB8fCBsZXZlbGRCID4gTUFYX0FVRElPX0RFU0NSSVBUSU9OX01JWF9MRVZFTCA/IEJBRF9WQUxVRSA6IE9LOworfQorCitzdGF0dXNfdCB2YWxpZGF0ZUR1YWxNb25vTW9kZShhdWRpb19kdWFsX21vbm9fbW9kZV90IGR1YWxNb25vTW9kZSkKK3sKKyAgICBzd2l0Y2ggKGR1YWxNb25vTW9kZSkgeworICAgICAgICBjYXNlIEFVRElPX0RVQUxfTU9OT19NT0RFX09GRjoKKyAgICAgICAgY2FzZSBBVURJT19EVUFMX01PTk9fTU9ERV9MUjoKKyAgICAgICAgY2FzZSBBVURJT19EVUFMX01PTk9fTU9ERV9MTDoKKyAgICAgICAgY2FzZSBBVURJT19EVUFMX01PTk9fTU9ERV9SUjoKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCB2YWxpZGF0ZVBsYXliYWNrUmF0ZUZhbGxiYWNrTW9kZSgKKyAgICAgICAgYXVkaW9fdGltZXN0cmV0Y2hfZmFsbGJhY2tfbW9kZV90IGZhbGxiYWNrTW9kZSkKK3sKKyAgICBzd2l0Y2ggKGZhbGxiYWNrTW9kZSkgeworICAgICAgICBjYXNlIEFVRElPX1RJTUVTVFJFVENIX0ZBTExCQUNLX0NVVF9SRVBFQVQ6CisgICAgICAgICAgICBicmVhazsgLy8gd2FybmluZyBpZiBub3QgbGlzdGVkLgorICAgICAgICBjYXNlIEFVRElPX1RJTUVTVFJFVENIX0ZBTExCQUNLX0RFRkFVTFQ6CisgICAgICAgIGNhc2UgQVVESU9fVElNRVNUUkVUQ0hfRkFMTEJBQ0tfTVVURToKKyAgICAgICAgY2FzZSBBVURJT19USU1FU1RSRVRDSF9GQUxMQkFDS19GQUlMOgorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCB2YWxpZGF0ZVBsYXliYWNrUmF0ZVN0cmV0Y2hNb2RlKGF1ZGlvX3RpbWVzdHJldGNoX3N0cmV0Y2hfbW9kZV90IHN0cmV0Y2hNb2RlKQoreworICAgIHN3aXRjaCAoc3RyZXRjaE1vZGUpIHsKKyAgICAgICAgY2FzZSBBVURJT19USU1FU1RSRVRDSF9TVFJFVENIX0RFRkFVTFQ6CisgICAgICAgIGNhc2UgQVVESU9fVElNRVNUUkVUQ0hfU1RSRVRDSF9WT0lDRToKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworc3RhdHVzX3QgdmFsaWRhdGVQbGF5YmFja1JhdGUoY29uc3QgYXVkaW9fcGxheWJhY2tfcmF0ZV90JiBwbGF5YmFja1JhdGUpCit7CisgICAgaWYgKHBsYXliYWNrUmF0ZS5tU3BlZWQgPCAwLmYgfHwgcGxheWJhY2tSYXRlLm1QaXRjaCA8IDAuZikgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICByZXR1cm4gdmFsaWRhdGVQbGF5YmFja1JhdGVGYWxsYmFja01vZGUocGxheWJhY2tSYXRlLm1GYWxsYmFja01vZGUpID86CisgICAgICAgICAgICB2YWxpZGF0ZVBsYXliYWNrUmF0ZVN0cmV0Y2hNb2RlKHBsYXliYWNrUmF0ZS5tU3RyZXRjaE1vZGUpOworfQorCit9IC8vIG5hbWVzcGFjZQorCiB1c2luZyBtZWRpYTo6Vm9sdW1lU2hhcGVyOwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICBUcmFja0Jhc2UKQEAgLTM2NywxMiArNDIxLDQ1IEBACiAgICAgcmV0dXJuIG1UcmFjay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7CiB9CiAKLQogdm9pZCBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpzaWduYWwoKQogewogICAgIHJldHVybiBtVHJhY2stPnNpZ25hbCgpOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpnZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCogbW9kZSkKK3sKKyAgICByZXR1cm4gbVRyYWNrLT5nZXREdWFsTW9ub01vZGUobW9kZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OnNldER1YWxNb25vTW9kZShhdWRpb19kdWFsX21vbm9fbW9kZV90IG1vZGUpCit7CisgICAgcmV0dXJuIHZhbGlkYXRlRHVhbE1vbm9Nb2RlKG1vZGUpID86IG1UcmFjay0+c2V0RHVhbE1vbm9Nb2RlKG1vZGUpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpnZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQqIGxldmVsZEIpCit7CisgICAgcmV0dXJuIG1UcmFjay0+Z2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGxldmVsZEIpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpzZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQgbGV2ZWxkQikKK3sKKyAgICByZXR1cm4gdmFsaWRhdGVBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwobGV2ZWxkQikKKyAgICAgICAgICAgID86IG1UcmFjay0+c2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGxldmVsZEIpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpnZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKAorICAgICAgICBhdWRpb19wbGF5YmFja19yYXRlX3QqIHBsYXliYWNrUmF0ZSkKK3sKKyAgICByZXR1cm4gbVRyYWNrLT5nZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKHBsYXliYWNrUmF0ZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OnNldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BsYXliYWNrX3JhdGVfdCYgcGxheWJhY2tSYXRlKQoreworICAgIHJldHVybiB2YWxpZGF0ZVBsYXliYWNrUmF0ZShwbGF5YmFja1JhdGUpCisgICAgICAgICAgICA/OiBtVHJhY2stPnNldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMocGxheWJhY2tSYXRlKTsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6b25UcmFuc2FjdCgKICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQogewpAQCAtNTUxLDcgKzYzOCw2IEBACiAgICAgbU9wUGxheUF1ZGlvTW9uaXRvcihPcFBsYXlBdWRpb01vbml0b3I6OmNyZWF0ZUlmTmVlZGVkKAogICAgICAgICAgICAgdWlkLCBhdHRyLCBpZCgpLCBzdHJlYW1UeXBlLCBvcFBhY2thZ2VOYW1lKSksCiAgICAgLy8gbVNpbmtUaW1lc3RhbXAKLSAgICBtRnJhbWVDb3VudFRvQmVSZWFkeShmcmFtZUNvdW50VG9CZVJlYWR5KSwKICAgICBtRmFzdEluZGV4KC0xKSwKICAgICBtQ2FjaGVkVm9sdW1lKDEuMCksCiAgICAgLyogVGhlIHRyYWNrIG1pZ2h0IG5vdCBwbGF5IGltbWVkaWF0ZWx5IGFmdGVyIGJlaW5nIGFjdGl2ZSwgc2ltaWxhcmx5IGFzIGlmIGl0cyB2b2x1bWUgd2FzIDAuCkBAIC01ODUsNiArNjcxLDcgQEAKICAgICAgICAgICAgICAgICBtRnJhbWVTaXplLCBzYW1wbGVSYXRlKTsKICAgICB9CiAgICAgbVNlcnZlclByb3h5ID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKKyAgICBtU2VydmVyUHJveHktPnNldFN0YXJ0VGhyZXNob2xkSW5GcmFtZXMoZnJhbWVDb3VudFRvQmVSZWFkeSk7IC8vIHVwZGF0ZSB0aGUgQ2JsayB2YWx1ZQogCiAgICAgLy8gb25seSBhbGxvY2F0ZSBhIGZhc3QgdHJhY2sgaW5kZXggaWYgd2Ugd2VyZSBhYmxlIHRvIGFsbG9jYXRlIGEgbm9ybWFsIHRyYWNrIG5hbWUKICAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7CkBAIC05MTIsNyArOTk5LDEwIEBACiAgICAgfQogCiAgICAgc2l6ZV90IGJ1ZmZlclNpemVJbkZyYW1lcyA9IG1TZXJ2ZXJQcm94eS0+Z2V0QnVmZmVyU2l6ZUluRnJhbWVzKCk7Ci0gICAgc2l6ZV90IGZyYW1lc1RvQmVSZWFkeSA9IHN0ZDo6bWluKG1GcmFtZUNvdW50VG9CZVJlYWR5LCBidWZmZXJTaXplSW5GcmFtZXMpOworICAgIC8vIE5vdGU6IG1TZXJ2ZXJQcm94eS0+Z2V0U3RhcnRUaHJlc2hvbGRJbkZyYW1lcygpIGlzIGNsYW1wZWQuCisgICAgY29uc3Qgc2l6ZV90IHN0YXJ0VGhyZXNob2xkSW5GcmFtZXMgPSBtU2VydmVyUHJveHktPmdldFN0YXJ0VGhyZXNob2xkSW5GcmFtZXMoKTsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVzVG9CZVJlYWR5ID0gc3RkOjpjbGFtcCggIC8vIGNsYW1wIGFnYWluIHRvIHZhbGlkYXRlIGNsaWVudCB2YWx1ZXMuCisgICAgICAgICAgICBzdGQ6Om1pbihzdGFydFRocmVzaG9sZEluRnJhbWVzLCBidWZmZXJTaXplSW5GcmFtZXMpLCBzaXplX3QoMSksIG1GcmFtZUNvdW50KTsKIAogICAgIGlmIChmcmFtZXNSZWFkeSgpID49IGZyYW1lc1RvQmVSZWFkeSB8fCAobUNibGstPm1GbGFncyAmIENCTEtfRk9SQ0VSRUFEWSkpIHsKICAgICAgICAgQUxPR1YoIiVzKCVkKTogY29uc2lkZXIgdHJhY2sgcmVhZHkgd2l0aCAlenUvJXp1LCB0YXJnZXQgd2FzICV6dSkiLApAQCAtOTUxLDYgKzEwNDEsMTEgQEAKICAgICAgICAgLy8gaW5pdGlhbCBzdGF0ZS1zdG9wcGluZy4gbmV4dCBzdGF0ZS1wYXVzaW5nLgogICAgICAgICAvLyBXaGF0IGlmIHJlc3VtZSBpcyBjYWxsZWQgPwogCisgICAgICAgIGlmIChzdGF0ZSA9PSBGTFVTSEVEKSB7CisgICAgICAgICAgICAvLyBhdm9pZCB1bmRlcnJ1biBnbGl0Y2hlcyB3aGVuIHN0YXJ0aW5nIGFmdGVyIGZsdXNoCisgICAgICAgICAgICByZXNldCgpOworICAgICAgICB9CisKICAgICAgICAgaWYgKHN0YXRlID09IFBBVVNFRCB8fCBzdGF0ZSA9PSBQQVVTSU5HKSB7CiAgICAgICAgICAgICBpZiAobVJlc3VtZVRvU3RvcHBpbmcpIHsKICAgICAgICAgICAgICAgICAvLyBoYXBwZW5lZCB3ZSBuZWVkIHRvIHJlc3VtZSB0byBTVE9QUElOR18xCkBAIC0xMDgyLDYgKzExNzcsOSBAQAogICAgICAgICAgICAgbVN0YXRlID0gUEFVU0lORzsKICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IEFDVElWRS9SRVNVTUlORyA9PiBQQVVTSU5HIG9uIHRocmVhZCAlZCIsCiAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKKyAgICAgICAgICAgICAgICBtUGF1c2VId1BlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPmJyb2FkY2FzdF9sKCk7CiAgICAgICAgICAgICBicmVhazsKIApAQCAtMTE2OSw2ICsxMjY3LDExIEBACiAgICAgbUZsdXNoSHdQZW5kaW5nID0gZmFsc2U7CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnBhdXNlQWNrKCkKK3sKKyAgICBtUGF1c2VId1BlbmRpbmcgPSBmYWxzZTsKK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6cmVzZXQoKQogewogICAgIC8vIERvIG5vdCByZXNldCB0d2ljZSB0byBhdm9pZCBkaXNjYXJkaW5nIGRhdGEgd3JpdHRlbiBqdXN0IGFmdGVyIGEgZmx1c2ggYW5kIGJlZm9yZQpAQCAtMTI2NiwxMSArMTM2OSwxNSBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpjb3B5TWV0YWRhdGFUbyhNZXRhZGF0YUluc2VydGVyJiBiYWNrSW5zZXJ0ZXIpIGNvbnN0CiB7Ci0gICAgKmJhY2tJbnNlcnRlcisrID0geworICAgIHBsYXliYWNrX3RyYWNrX21ldGFkYXRhX3Y3X3QgbWV0YWRhdGE7CisgICAgbWV0YWRhdGEuYmFzZSA9IHsKICAgICAgICAgICAgIC51c2FnZSA9IG1BdHRyLnVzYWdlLAogICAgICAgICAgICAgLmNvbnRlbnRfdHlwZSA9IG1BdHRyLmNvbnRlbnRfdHlwZSwKICAgICAgICAgICAgIC5nYWluID0gbUZpbmFsVm9sdW1lLAogICAgIH07CisgICAgbWV0YWRhdGEuY2hhbm5lbF9tYXNrID0gbUNoYW5uZWxNYXNrLAorICAgIHN0cm5jcHkobWV0YWRhdGEudGFncywgbUF0dHIudGFncywgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFKTsKKyAgICAqYmFja0luc2VydGVyKysgPSBtZXRhZGF0YTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c2V0VGVlUGF0Y2hlcyhUZWVQYXRjaGVzIHRlZVBhdGNoZXMpIHsKQEAgLTE0NTIsNiArMTU1OSwxMDggQEAKICAgICB9CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpnZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCogbW9kZSkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdCgpKSB7CisgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgICAgICBpZiAodGhyZWFkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICp0ID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHQtPm1Mb2NrKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHQtPm1PdXRwdXQtPnN0cmVhbS0+Z2V0RHVhbE1vbm9Nb2RlKG1vZGUpOworICAgICAgICAgICAgQUxPR0RfSUYoKHN0YXR1cyA9PSBOT19FUlJPUikgJiYgKG1EdWFsTW9ub01vZGUgIT0gKm1vZGUpLAorICAgICAgICAgICAgICAgICAgICAiJXM6IG1vZGUgJWQgaW5jb25zaXN0ZW50IiwgX19mdW5jX18sIG1EdWFsTW9ub01vZGUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpzZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCBtb2RlKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKKyAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgICAgIGlmICh0aHJlYWQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYXV0byB0ID0gc3RhdGljX2Nhc3Q8UGxheWJhY2tUaHJlYWQgKj4odGhyZWFkLmdldCgpKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHQtPm1Mb2NrKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHQtPm1PdXRwdXQtPnN0cmVhbS0+c2V0RHVhbE1vbm9Nb2RlKG1vZGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1EdWFsTW9ub01vZGUgPSBtb2RlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpnZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQqIGxldmVsZEIpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgeworICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHRocmVhZCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBhdXRvIHQgPSBzdGF0aWNfY2FzdDxQbGF5YmFja1RocmVhZCAqPih0aHJlYWQuZ2V0KCkpOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sodC0+bUxvY2spOworICAgICAgICAgICAgc3RhdHVzID0gdC0+bU91dHB1dC0+c3RyZWFtLT5nZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwobGV2ZWxkQik7CisgICAgICAgICAgICBBTE9HRF9JRigoc3RhdHVzID09IE5PX0VSUk9SKSAmJiAobUF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbCAhPSAqbGV2ZWxkQiksCisgICAgICAgICAgICAgICAgICAgICIlczogbGV2ZWwgJS4zZiBpbmNvbnNpc3RlbnQiLCBfX2Z1bmNfXywgbUF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCBsZXZlbGRCKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKKyAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgICAgIGlmICh0aHJlYWQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYXV0byB0ID0gc3RhdGljX2Nhc3Q8UGxheWJhY2tUaHJlYWQgKj4odGhyZWFkLmdldCgpKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHQtPm1Mb2NrKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHQtPm1PdXRwdXQtPnN0cmVhbS0+c2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGxldmVsZEIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1BdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwgPSBsZXZlbGRCOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpnZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKAorICAgICAgICBhdWRpb19wbGF5YmFja19yYXRlX3QqIHBsYXliYWNrUmF0ZSkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdCgpKSB7CisgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgICAgICBpZiAodGhyZWFkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGF1dG8gdCA9IHN0YXRpY19jYXN0PFBsYXliYWNrVGhyZWFkICo+KHRocmVhZC5nZXQoKSk7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayh0LT5tTG9jayk7CisgICAgICAgICAgICBzdGF0dXMgPSB0LT5tT3V0cHV0LT5zdHJlYW0tPmdldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMocGxheWJhY2tSYXRlKTsKKyAgICAgICAgICAgIEFMT0dEX0lGKChzdGF0dXMgPT0gTk9fRVJST1IpICYmCisgICAgICAgICAgICAgICAgICAgICFpc0F1ZGlvUGxheWJhY2tSYXRlRXF1YWwobVBsYXliYWNrUmF0ZVBhcmFtZXRlcnMsICpwbGF5YmFja1JhdGUpLAorICAgICAgICAgICAgICAgICAgICAiJXM6IHBsYXliYWNrUmF0ZSBpbmNvbnNpc3RlbnQiLCBfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnNldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BsYXliYWNrX3JhdGVfdCYgcGxheWJhY2tSYXRlKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKKyAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgICAgIGlmICh0aHJlYWQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYXV0byB0ID0gc3RhdGljX2Nhc3Q8UGxheWJhY2tUaHJlYWQgKj4odGhyZWFkLmdldCgpKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHQtPm1Mb2NrKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHQtPm1PdXRwdXQtPnN0cmVhbS0+c2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycyhwbGF5YmFja1JhdGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1QbGF5YmFja1JhdGVQYXJhbWV0ZXJzID0gcGxheWJhY2tSYXRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKIC8vVG8gYmUgY2FsbGVkIHdpdGggdGhyZWFkIGxvY2sgaGVsZAogYm9vbCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6aXNSZXN1bWVQZW5kaW5nKCkgewogCkBAIC0xOTMzLDYgKzIxNDIsMjUgQEAKIHsKICAgICBtUHJveHktPnJlbGVhc2VCdWZmZXIoYnVmZmVyKTsKICAgICByZXN0YXJ0SWZEaXNhYmxlZCgpOworCisgICAgLy8gQ2hlY2sgaWYgdGhlIFBhdGNoVHJhY2sgaGFzIGVub3VnaCBkYXRhIHRvIHdyaXRlIG9uY2UgaW4gcmVsZWFzZUJ1ZmZlcigpLgorICAgIC8vIElmIG5vdCwgcHJldmVudCBhbiB1bmRlcnJ1biBmcm9tIG9jY3VycmluZyBieSBtb3ZpbmcgdGhlIHRyYWNrIGludG8gRlNfRklMTElORzsKKyAgICAvLyB0aGlzIGxvZ2ljIGF2b2lkcyBnbGl0Y2hlcyB3aGVuIHN1c3BlbmRpbmcgQTJEUCB3aXRoIEF1ZGlvUGxheWJhY2tDYXB0dXJlLgorICAgIC8vIFRPRE86IHBlcmhhcHMgdW5kZXJydW4gYXZvaWRhbmNlIGNvdWxkIGJlIGEgdHJhY2sgcHJvcGVydHkgY2hlY2tlZCBpbiBpc1JlYWR5KCkgaW5zdGVhZC4KKyAgICBpZiAobUZpbGxpbmdVcFN0YXR1cyA9PSBGU19BQ1RJVkUKKyAgICAgICAgICAgICYmIGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkKKyAgICAgICAgICAgICYmICFpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKKyAgICAgICAgaWYgKHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgICAgICAgICAgdGhyZWFkICE9IDApIHsKKyAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gcGxheWJhY2tUaHJlYWQtPmZyYW1lQ291bnQoKSAqIHNhbXBsZVJhdGUoKQorICAgICAgICAgICAgICAgICAgICAvIHBsYXliYWNrVGhyZWFkLT5zYW1wbGVSYXRlKCk7CisgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZHkoKSA8IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiJXMoJWQpIE5vdCBlbm91Z2ggZGF0YSwgd2FpdCBmb3IgYnVmZmVyIHRvIGZpbGwiLCBfX2Z1bmNfXywgbUlkKTsKKyAgICAgICAgICAgICAgICBtRmlsbGluZ1VwU3RhdHVzID0gRlNfRklMTElORzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpyZXN0YXJ0SWZEaXNhYmxlZCgpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCmluZGV4IDZlZjE5YmYuLmZlYjcxZTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCkBAIC04MCw3ICs4MCw3IEBACiAKIC8vIFRPRE8gUGVybWl0IGRpc2FibGluZyBvZiBsb2dnaW5nIGF0IGNvbXBpbGUtdGltZS4KIAotLy8gVE9ETyBBIG5vbi1udWxscHRyIGR1bW15IGltcGxlbWVudGF0aW9uIHRoYXQgaXMgYSBub3Agd291bGQgYmUgZmFzdGVyIHRoYW4gY2hlY2tpbmcgZm9yIG51bGxwdHIKKy8vIFRPRE8gQSBub24tbnVsbHB0ciBzdHViIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgYSBub3Agd291bGQgYmUgZmFzdGVyIHRoYW4gY2hlY2tpbmcgZm9yIG51bGxwdHIKIC8vICAgICAgaW4gdGhlIGNhc2Ugd2hlbiBsb2dnaW5nIGlzIGVuYWJsZWQgYXQgY29tcGlsZS10aW1lIGFuZCBlbmFibGVkIGF0IHJ1bnRpbWUsIGJ1dCBpdCBtaWdodCBiZQogLy8gICAgICBzbG93ZXIgdGhhbiBudWxscHRyIGNoZWNrIHdoZW4gbG9nZ2luZyBpcyBlbmFibGVkIGF0IGNvbXBpbGUtdGltZSBhbmQgZGlzYWJsZWQgYXQgcnVudGltZS4KIApAQCAtMTI5LDggKzEyOSw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIGV4dGVybiAiQyIgewotLy8gVE9ETyBjb25zaWRlciBhZGRpbmcgYSB0aHJlYWRfbG9jYWwgTkJMb2c6OldyaXRlciB0bER1bW15TkJMb2dXcml0ZXIgYW5kIHRoZW4KLS8vIGluaXRpYWxpemUgYmVsb3cgdGxOQkxvZ1dyaXRlciB0byAmdGxEdW1teU5CTG9nV3JpdGVyIHRvIHJlbW92ZSB0aGUgbmVlZCB0bworLy8gVE9ETyBjb25zaWRlciBhZGRpbmcgYSB0aHJlYWRfbG9jYWwgTkJMb2c6OldyaXRlciB0bFN0dWJOQkxvZ1dyaXRlciBhbmQgdGhlbgorLy8gaW5pdGlhbGl6ZSBiZWxvdyB0bE5CTG9nV3JpdGVyIHRvICZ0bFN0dWJOQkxvZ1dyaXRlciB0byByZW1vdmUgdGhlIG5lZWQgdG8KIC8vIGNoZWNrIGZvciBudWxscHRyIGV2ZXJ5IHRpbWUuIEFsc28gcmVkdWNlcyB0aGUgbmVlZCB0byBhZGQgYSBuZXcgbG9nZ2luZyBtYWNybyBhYm92ZQogLy8gZWFjaCB0aW1lIHdlIHdhbnQgdG8gbG9nIGEgbmV3IHR5cGUuCiBleHRlcm4gdGhyZWFkX2xvY2FsIE5CTG9nOjpXcml0ZXIgKnRsTkJMb2dXcml0ZXI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5icAppbmRleCBhNDJiODlmLi5lMDE4ZGQzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X2hlYWRlcnMgewogICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeW1hbmFnZXJfaW50ZXJmYWNlX2hlYWRlcnMiLAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKaW5kZXggOGQwZTVkYi4uOTM4MTlmNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCkBAIC0yNTAsMTIgKzI1MCwxMiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlclBvbGljeU1peGVzKFZlY3RvcjxBdWRpb01peD4gbWl4ZXMpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKQogICAgICAgICAgICAgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkLAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKSA9IDA7CisgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKQEAgLTI5NSwxMyArMjk1LDM2IEBACiAKICAgICB2aXJ0dWFsIGJvb2wgICAgIGlzQ2FsbFNjcmVlbk1vZGVTdXBwb3J0ZWQoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpID0gMDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvT1dORVJTIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvT1dORVJTCmluZGV4IGE4NDgzZmEuLmRhOWQzMmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L09XTkVSUworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9PV05FUlMKQEAgLTEsMyArMSwyIEBACiBqbXRyaXZpQGdvb2dsZS5jb20KLWtyb2NhcmRAZ29vZ2xlLmNvbQogbW5hZ2Fub3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5icAppbmRleCA2ZTBkMmY2Li45MTcwMWFkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5Y29tbW9uIiwKICAgICBoZWFkZXJfbGliczogWwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaAppbmRleCA3YzhjZTgzLi43MzZmOGIyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaApAQCAtMTI2LDYgKzEyNiw3IEBACiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUDoKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM6CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVDoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUOgogICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9IRUFEU0VUOwogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQ6CiAgICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEOwpAQCAtMTM5LDYgKzE0MCw3IEBACiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWToKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTEVfU1BFQUtFUjoKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUjsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLmJwCmluZGV4IDU3ZjBiNWIuLjIyN2MyZDggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyIsCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaAppbmRleCAzOWQxMTQwLi4xZDkyMjNlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oCkBAIC00OTgsMTEgKzQ5OCw2IEBACiAgICAgICovCiAgICAgYm9vbCBpc0EyZHBPZmZsb2FkZWRPblByaW1hcnkoKSBjb25zdDsKIAotICAgIC8qKgotICAgICAqIHJldHVybnMgdHJ1ZSBpZiBBMkRQIGlzIHN1cHBvcnRlZCAoZWl0aGVyIHZpYSBoYXJkd2FyZSBvZmZsb2FkIG9yIHNvZnR3YXJlIGVuY29kaW5nKQotICAgICAqLwotICAgIGJvb2wgaXNBMmRwU3VwcG9ydGVkKCkgY29uc3Q7Ci0KICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZ2V0T3V0cHV0RnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0OwogCiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGdldFByaW1hcnlPdXRwdXQoKSBjb25zdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeUNvbmZpZy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5Q29uZmlnLmgKaW5kZXggMzk1YmM3MC4uY2YxZjY0YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5Q29uZmlnLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5Q29uZmlnLmgKQEAgLTMzLDYgKzMzLDE1IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gVGhpcyBjbGFzcyBnYXRoZXJzIHRvZ2V0aGVyIHZhcmlvdXMgYml0cyBvZiBBdWRpb1BvbGljeU1hbmFnZXIKKy8vIGNvbmZpZ3VyYXRpb24sIHdoaWNoIGFyZSB1c3VhbGx5IGZpbGxlZCBvdXQgYXMgYSByZXN1bHQgb2YgcGFyc2luZworLy8gdGhlIGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBmaWxlLgorLy8KKy8vIE5vdGUgdGhhdCBBdWRpb1BvbGljeUNvbmZpZyBkb2Vzbid0IG93biBzb21lIG9mIHRoZSBkYXRhLAorLy8gaXQgc2ltcGx5IHByb3hpZXMgYWNjZXNzIHRvIHRoZSBmaWVsZHMgb2YgQXVkaW9Qb2xpY3lNYW5hZ2VyCisvLyBjbGFzcy4gQmUgY2FyZWZ1bCBhYm91dCB0aGUgZmllbGRzIHRoYXQgYXJlIHJlZmVyZW5jZXMsCisvLyBlLmcuICdtT3V0cHV0RGV2aWNlcycuIFRoaXMgYWxzbyBtZWFucyB0aGF0IGl0J3MgaW1wb3NzaWJsZQorLy8gdG8gaW1wbGVtZW50ICJkZWVwIGNvcHlpbmciIG9mIHRoaXMgY2xhc3Mgd2l0aG91dCByZS1kZXNpZ25pbmcgaXQuCiBjbGFzcyBBdWRpb1BvbGljeUNvbmZpZwogewogcHVibGljOgpAQCAtNDAsMTQgKzQ5LDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZvdXRwdXREZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmaW5wdXREZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0T3V0cHV0RGV2aWNlKQotICAgICAgICA6IG1FbmdpbmVMaWJyYXJ5TmFtZVN1ZmZpeChrRGVmYXVsdEVuZ2luZUxpYnJhcnlOYW1lU3VmZml4KSwKLSAgICAgICAgICBtSHdNb2R1bGVzKGh3TW9kdWxlcyksCisgICAgICAgIDogbUh3TW9kdWxlcyhod01vZHVsZXMpLAogICAgICAgICAgIG1PdXRwdXREZXZpY2VzKG91dHB1dERldmljZXMpLAogICAgICAgICAgIG1JbnB1dERldmljZXMoaW5wdXREZXZpY2VzKSwKLSAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZShkZWZhdWx0T3V0cHV0RGV2aWNlKSwKLSAgICAgICAgICBtSXNTcGVha2VyRHJjRW5hYmxlZChmYWxzZSksCi0gICAgICAgICAgbUlzQ2FsbFNjcmVlbk1vZGVTdXBwb3J0ZWQoZmFsc2UpCi0gICAge30KKyAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZShkZWZhdWx0T3V0cHV0RGV2aWNlKSB7CisgICAgICAgIGNsZWFyKCk7CisgICAgfQorCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgbVNvdXJjZSA9IHt9OworICAgICAgICBtRW5naW5lTGlicmFyeU5hbWVTdWZmaXggPSBrRGVmYXVsdEVuZ2luZUxpYnJhcnlOYW1lU3VmZml4OworICAgICAgICBtSHdNb2R1bGVzLmNsZWFyKCk7CisgICAgICAgIG1PdXRwdXREZXZpY2VzLmNsZWFyKCk7CisgICAgICAgIG1JbnB1dERldmljZXMuY2xlYXIoKTsKKyAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UuY2xlYXIoKTsKKyAgICAgICAgbUlzU3BlYWtlckRyY0VuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgbUlzQ2FsbFNjcmVlbk1vZGVTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5jbGVhcigpOworICAgIH0KIAogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRTb3VyY2UoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU291cmNlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaAppbmRleCBiODIzMDVkLi5jNmJkYjA0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaApAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgICogICAgQW4gZXhhbXBsZSBvZiBmYWlsdXJlIGlzIHdoZW4gdGhlcmUgYXJlIGFscmVhZHkgcnVsZXMgaW4gcGxhY2UgdG8gcmVzdHJpY3QKICAgICAgKiAgICBhIG1peCB0byB0aGUgZ2l2ZW4gdWlkIChpLmUuIHdoZW4gYSBNQVRDSF9VSUQgcnVsZSB3YXMgc2V0IGZvciBpdCkuCiAgICAgICovCi0gICAgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcyk7CisgICAgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpOwogICAgIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKTsKICAgICBzdGF0dXNfdCBnZXREZXZpY2VzRm9yVWlkKHVpZF90IHVpZCwgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKSBjb25zdDsKIApAQCAtMTE1LDcgKzExNSw3IEBACiAgICAgICogICAgQW4gZXhhbXBsZSBvZiBmYWlsdXJlIGlzIHdoZW4gdGhlcmUgYXJlIGFscmVhZHkgcnVsZXMgaW4gcGxhY2UgdG8gcmVzdHJpY3QKICAgICAgKiAgICBhIG1peCB0byB0aGUgZ2l2ZW4gdXNlcklkIChpLmUuIHdoZW4gYSBNQVRDSF9VU0VSSUQgcnVsZSB3YXMgc2V0IGZvciBpdCkuCiAgICAgICovCi0gICAgc3RhdHVzX3Qgc2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworICAgIHN0YXR1c190IHNldFVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCwgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcyk7CiAgICAgc3RhdHVzX3QgcmVtb3ZlVXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkKTsKICAgICBzdGF0dXNfdCBnZXREZXZpY2VzRm9yVXNlcklkKGludCB1c2VySWQsIFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgY29uc3Q7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9DbGllbnREZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ2xpZW50RGVzY3JpcHRvci5oCmluZGV4IDkyMzMxMGMuLmNlOTc3NDggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9DbGllbnREZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NsaWVudERlc2NyaXB0b3IuaApAQCAtMTk1LDEwICsxOTUsMTggQEAKIAogICAgIH5Tb3VyY2VDbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCisgICAgdm9pZCBjb25uZWN0KGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgc2lua0RldmljZSkgeworICAgICAgICBtUGF0Y2hIYW5kbGUgPSBwYXRjaEhhbmRsZTsKKyAgICAgICAgbVNpbmtEZXZpY2UgPSBzaW5rRGV2aWNlOworICAgIH0KKyAgICB2b2lkIGRpc2Nvbm5lY3QoKSB7CisgICAgICAgIG1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICBtU2lua0RldmljZSA9IG51bGxwdHI7CisgICAgfQorICAgIGJvb2wgaXNDb25uZWN0ZWQoKSBjb25zdCB7IHJldHVybiBtUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7IH0KICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1QYXRjaEhhbmRsZTsgfQotICAgIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpIHsgbVBhdGNoSGFuZGxlID0gcGF0Y2hIYW5kbGU7IH0KLQogICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1TcmNEZXZpY2U7IH0KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzaW5rRGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbVNpbmtEZXZpY2U7IH0KICAgICB3cDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3dPdXRwdXQoKSBjb25zdCB7IHJldHVybiBtU3dPdXRwdXQ7IH0KICAgICB2b2lkIHNldFN3T3V0cHV0KGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgc3dPdXRwdXQpOwogICAgIHdwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBod091dHB1dCgpIGNvbnN0IHsgcmV0dXJuIG1Id091dHB1dDsgfQpAQCAtMjEwLDYgKzIxOCw3IEBACiAgcHJpdmF0ZToKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtU3JjRGV2aWNlOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1TaW5rRGV2aWNlOwogICAgIHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtU3dPdXRwdXQ7CiAgICAgd3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IG1Id091dHB1dDsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaAppbmRleCBkZDE0OTljLi4yMDM4YWE5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKQEAgLTY1LDYgKzY1LDkgQEAKIAogICAgIGJvb2wgc3VwcG9ydHNGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKIAorICAgIHZvaWQgc2V0RHluYW1pYygpIHsgbUlzRHluYW1pYyA9IHRydWU7IH0KKyAgICBib29sIGlzRHluYW1pYygpIGNvbnN0IHsgcmV0dXJuIG1Jc0R5bmFtaWM7IH0KKwogICAgIC8vIFBvbGljeUF1ZGlvUG9ydENvbmZpZwogICAgIHZpcnR1YWwgc3A8UG9saWN5QXVkaW9Qb3J0PiBnZXRQb2xpY3lBdWRpb1BvcnQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxQb2xpY3lBdWRpb1BvcnQqPihjb25zdF9jYXN0PERldmljZURlc2NyaXB0b3IqPih0aGlzKSk7CkBAIC05Nyw2ICsxMDAsOCBAQAogICAgIHN0ZDo6c3RyaW5nIG1UYWdOYW1lOyAvLyBVbmlxdWUgaHVtYW4gcmVhZGFibGUgaWRlbnRpZmllciBmb3IgYSBkZXZpY2UgcG9ydCBmb3VuZCBpbiBjb25mIGZpbGUuCiAgICAgRm9ybWF0VmVjdG9yICAgICAgICBtRW5jb2RlZEZvcm1hdHM7CiAgICAgYXVkaW9fZm9ybWF0X3QgICAgICBtQ3VycmVudEVuY29kZWRGb3JtYXQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICBtSXNEeW5hbWljID0gZmFsc2U7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgICBtRGVjbGFyZWRBZGRyZXNzOyAvLyBPcmlnaW5hbCBkZXZpY2UgYWRkcmVzcwogfTsKIAogY2xhc3MgRGV2aWNlVmVjdG9yIDogcHVibGljIFNvcnRlZFZlY3RvcjxzcDxEZXZpY2VEZXNjcmlwdG9yPiA+CkBAIC0xNDYsNiArMTUxLDE1IEBACiAgICAgLy8gICAgIDQpIHRoZSBjb21iaW5hdGlvbiBvZiBhbGwgZGV2aWNlcyBpcyBpbnZhbGlkIGZvciBzZWxlY3Rpb24KICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGb3JPcGVuaW5nKCkgY29uc3Q7CiAKKyAgICAvLyBSZXR1cm4gdGhlIGRldmljZSBkZXNjcmlwdG9yIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gQXVkaW9EZXZpY2VUeXBlQWRkcgorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZUZyb21EZXZpY2VUeXBlQWRkcigKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZVR5cGVBZGRyKSBjb25zdDsKKworICAgIC8vIFJldHVybiB0aGUgZGV2aWNlIHZlY3RvciB0aGF0IGNvbnRhaW5zIGRldmljZSBkZXNjcmlwdG9yIHdob3NlIEF1ZGlvRGV2aWNlVHlwZUFkZHIgYXBwZWFycworICAgIC8vIGluIHRoZSBnaXZlbiBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yCisgICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGcm9tRGV2aWNlVHlwZUFkZHJWZWMoCisgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VUeXBlQWRkclZlY3RvcikgY29uc3Q7CisKICAgICAvLyBJZiB0aGVyZSBhcmUgZGV2aWNlcyB3aXRoIHRoZSBnaXZlbiB0eXBlIGFuZCB0aGUgZGV2aWNlcyB0byBhZGQgaXMgbm90IGVtcHR5LAogICAgIC8vIHJlbW92ZSBhbGwgdGhlIGRldmljZXMgd2l0aCB0aGUgZ2l2ZW4gdHlwZSBhbmQgYWRkIGFsbCB0aGUgZGV2aWNlcyB0byBhZGQuCiAgICAgdm9pZCByZXBsYWNlRGV2aWNlc0J5VHlwZShhdWRpb19kZXZpY2VzX3QgdHlwZVRvUmVtb3ZlLCBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXNUb0FkZCk7CkBAIC0yMDQsNyArMjE4LDkgQEAKICAgICAgICAgICAgIGFkZChkZXZpY2VzKTsKICAgICAgICAgICAgIHJldHVybiBzaXplKCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFNvcnRlZFZlY3Rvcjo6bWVyZ2UoZGV2aWNlcyk7CisgICAgICAgIHNzaXplX3QgcmV0ID0gU29ydGVkVmVjdG9yOjptZXJnZShkZXZpY2VzKTsKKyAgICAgICAgcmVmcmVzaFR5cGVzKCk7CisgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDgsNyArMjY0LDkgQEAKICAgICAgICAgcmV0dXJuIFN0cmluZzgoIiIpOwogICAgIH0KIAotICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisgICAgLy8gUmV0dXJuIGEgc3RyaW5nIHRvIGRlc2NyaWJlIHRoZSBEZXZpY2VWZWN0b3IuIFRoZSBzZW5zaXRpdmUgaW5mb3JtYXRpb24gd2lsbCBvbmx5IGJlCisgICAgLy8gYWRkZWQgdG8gdGhlIHN0cmluZyBpZiBgaW5jbHVkZVNlbnNpdGl2ZUluZm9gIGlzIHRydWUuCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoYm9vbCBpbmNsdWRlU2Vuc2l0aXZlSW5mbyA9IGZhbHNlKSBjb25zdDsKIAogICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcyA9IDAsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSHdNb2R1bGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCmluZGV4IDIzZjBjOWEuLjliYTc0NWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCkBAIC01Miw4ICs1MiwxMiBAQAogICAgICAgICBkZXZpY2VzLm1lcmdlKG1EeW5hbWljRGV2aWNlcyk7CiAgICAgICAgIHJldHVybiBkZXZpY2VzOwogICAgIH0KKyAgICBzdGQ6OnN0cmluZyBnZXRUYWdGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmYWRkcmVzcyA9IFN0cmluZzgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgY29kZWMgPSBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgdm9pZCBhZGREeW5hbWljRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpCiAgICAgeworICAgICAgICBkZXZpY2UtPnNldER5bmFtaWMoKTsKICAgICAgICAgbUR5bmFtaWNEZXZpY2VzLmFkZChkZXZpY2UpOwogICAgIH0KIApAQCAtMTMxLDggKzEzNSwxNyBAQAogcHVibGljOgogICAgIHNwPEh3TW9kdWxlPiBnZXRNb2R1bGVGcm9tTmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdDsKIAorICAgIC8qKgorICAgICAqIEBicmllZiBnZXRNb2R1bGVGb3JEZXZpY2VUeXBlIHRyeSB0byBnZXQgYSBkZXZpY2UgZnJvbSB0eXBlIC8gZm9ybWF0IG9uIGFsbCBtb2R1bGVzCisgICAgICogQHBhcmFtIGRldmljZSB0eXBlIHRvIGNvbnNpZGVyCisgICAgICogQHBhcmFtIGVuY29kZWRGb3JtYXQgdG8gY29uc2lkZXIKKyAgICAgKiBAcGFyYW1bb3V0XSB0YWdOYW1lIGlmIG5vdCBudWxsLCBpZiBhIG1hdGNoaW5nIGRldmljZSBpcyBmb3VuZCwgd2lsbCByZXR1cm4gdGhlIHRhZ05hbWUKKyAgICAgKiBvZiBvcmlnaW5hbCBkZXZpY2UgZnJvbSBYTUwgZmlsZSBzbyB0aGF0IGF1ZGlvIHJvdXRlcyBtYXRjaGluIHJ1bGVzIHdvcmsuCisgICAgICogQHJldHVybiB2YWxpZCBtb2R1bGUgaWYgY29uc2lkZXJlZCBkZXZpY2UgZm91bmQsIG51bGxwdHIgb3RoZXJ3aXNlLgorICAgICAqLwogICAgIHNwPEh3TW9kdWxlPiBnZXRNb2R1bGVGb3JEZXZpY2VUeXBlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqdGFnTmFtZSA9IG51bGxwdHIpIGNvbnN0OwogCiAgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZUZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgY29uc3Q7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmgKaW5kZXggNWY1NTFkNS4uMTFkM2E5OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lPUHJvZmlsZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaApAQCAtMTEyLDYgKzExMiwxOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEBicmllZiBnZXRUYWcKKyAgICAgKiBAcGFyYW0gZGV2aWNlVHlwZXMgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEByZXR1cm4gdGFnTmFtZSBvZiBmaXJzdCBtYXRjaGluZyBkZXZpY2UgZm9yIHRoZSBjb25zaWRlcmVkIHR5cGVzLCBlbXB0eSBzdHJpbmcgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHN0ZDo6c3RyaW5nIGdldFRhZyhjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcykgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChzdXBwb3J0c0RldmljZVR5cGVzKGRldmljZVR5cGVzKSkgeworICAgICAgICAgICAgcmV0dXJuIG1TdXBwb3J0ZWREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZXMoZGV2aWNlVHlwZXMpLml0ZW1BdCgwKS0+Z2V0VGFnTmFtZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBAYnJpZWYgc3VwcG9ydHNEZXZpY2UKICAgICAgKiBAcGFyYW0gZGV2aWNlIHRvIGJlIGNoZWNrZWQgYWdhaW5zdAogICAgICAqICAgICAgICBmb3JjZUNoZWNrT25BZGRyZXNzIGlmIHRydWUsIGNoZWNrIG9uIHR5cGUgYW5kIGFkZHJlc3Mgd2hhdGV2ZXIgdGhlIHR5cGUsIG90aGVyd2lzZQpAQCAtMTUwLDYgKzE2MywxMiBAQAogICAgIH0KICAgICB2b2lkIHJlbW92ZVN1cHBvcnRlZERldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKQogICAgIHsKKyAgICAgICAgc3NpemVfdCByZXQgPSBtU3VwcG9ydGVkRGV2aWNlcy5pbmRleE9mKGRldmljZSk7CisgICAgICAgIGlmIChyZXQgPj0gMCAmJiAhbVN1cHBvcnRlZERldmljZXMuaXRlbUF0KHJldCktPmlzRHluYW1pYygpKSB7CisgICAgICAgICAgICAvLyBkZXZpY2VzIGVxdWFsaXR5IGNoZWNrcyBvbmx5IHR5cGUsIGFkZHJlc3MsIG5hbWUgYW5kIGZvcm1hdAorICAgICAgICAgICAgLy8gUHJldmVudHMgZnJvbSByZW1vdmluZyBub24gZHluYW1pY2FsbHkgYWRkZWQgZGV2aWNlcworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIG1TdXBwb3J0ZWREZXZpY2VzLnJlbW92ZShkZXZpY2UpOwogICAgIH0KICAgICB2b2lkIHNldFN1cHBvcnRlZERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1BvbGljeUF1ZGlvUG9ydC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1BvbGljeUF1ZGlvUG9ydC5oCmluZGV4IGQyZjYyOTcuLmU2ZWVmMjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Qb2xpY3lBdWRpb1BvcnQuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvUG9saWN5QXVkaW9Qb3J0LmgKQEAgLTQyLDYgKzQyLDExIEBACiAKICAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nIGdldFRhZ05hbWUoKSBjb25zdCA9IDA7CiAKKyAgICBib29sIGVxdWFscyhjb25zdCBzcDxQb2xpY3lBdWRpb1BvcnQ+ICZyaWdodCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRUYWdOYW1lKCkgPT0gcmlnaHQtPmdldFRhZ05hbWUoKTsKKyAgICB9CisKICAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gYXNBdWRpb1BvcnQoKSBjb25zdCA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0RmxhZ3ModWludDMyX3QgZmxhZ3MpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2VyaWFsaXplci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NlcmlhbGl6ZXIuaAppbmRleCA0OGM0MTQ3Li5iNzBjNTk1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2VyaWFsaXplci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXJpYWxpemVyLmgKQEAgLTIxLDUgKzIxLDkgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdHVzX3QgZGVzZXJpYWxpemVBdWRpb1BvbGljeUZpbGUoY29uc3QgY2hhciAqZmlsZU5hbWUsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpOworLy8gSW4gVlRTIG1vZGUgYWxsIHZlbmRvciBleHRlbnNpb25zIGFyZSBpZ25vcmVkLiBUaGlzIGlzIGRvbmUgYmVjYXVzZQorLy8gVlRTIHRlc3RzIGFyZSBidWlsdCB1c2luZyBBT1NQIGNvZGUgYW5kIHRodXMgY2FuIG5vdCB1c2UgdmVuZG9yIG92ZXJsYXlzCisvLyBvZiBzeXN0ZW0gbGlicmFyaWVzLgorc3RhdHVzX3QgZGVzZXJpYWxpemVBdWRpb1BvbGljeUZpbGVGb3JWdHMoY29uc3QgY2hhciAqZmlsZU5hbWUsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpOwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKaW5kZXggYjk2MzEyMS4uNDkyMmViZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcApAQCAtNTE2LDcgKzUxNiw3IEBACiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7CiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBGb3JtYXQ6ICVkXG4iLCBtRm9ybWF0KTsKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRGV2aWNlcyAlc1xuIiwgbURldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIERldmljZXMgJXNcbiIsIG1EZXZpY2UtPnRvU3RyaW5nKHRydWUgLyppbmNsdWRlU2Vuc2l0aXZlSW5mbyovKS5jX3N0cigpKTsKICAgICBtRW5hYmxlZEVmZmVjdHMuZHVtcChkc3QsIDEgLypzcGFjZXMqLywgZmFsc2UgLyp2ZXJib3NlKi8pOwogICAgIGRzdC0+YXBwZW5kKCIgQXVkaW9SZWNvcmQgQ2xpZW50czpcbiIpOwogICAgIENsaWVudE1hcEhhbmRsZXI8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj46OmR1bXAoZHN0KTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCmluZGV4IGQ2ZDQ3MmIuLjVjNDdkMWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcApAQCAtMjQ1LDcgKzI0NSw3IEBACiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7CiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBGb3JtYXQ6ICUwOHhcbiIsIG1Gb3JtYXQpOwogICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBEZXZpY2VzOiAlc1xuIiwgZGV2aWNlcygpLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBEZXZpY2VzOiAlc1xuIiwgZGV2aWNlcygpLnRvU3RyaW5nKHRydWUgLyppbmNsdWRlU2Vuc2l0aXZlSW5mbyovKS5jX3N0cigpKTsKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEdsb2JhbCBhY3RpdmUgY291bnQ6ICV1XG4iLCBtR2xvYmFsQWN0aXZlQ291bnQpOwogICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Sb3V0aW5nQWN0aXZpdGllcykgewogICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFByb2R1Y3QgU3RyYXRlZ3kgaWQ6ICVkIiwgaXRlci5maXJzdCk7CkBAIC01MDUsNiArNTA1LDkgQEAKICAgICAgICAgbENvbmZpZy5vZmZsb2FkX2luZm8uZHVyYXRpb25fdXMgPSAtMTsKICAgICAgICAgbENvbmZpZy5vZmZsb2FkX2luZm8uaGFzX3ZpZGVvID0gdHJ1ZTsgLy8gY29uc2VydmF0aXZlCiAgICAgICAgIGxDb25maWcub2ZmbG9hZF9pbmZvLmlzX3N0cmVhbWluZyA9IHRydWU7IC8vIGxpa2VseQorICAgICAgICBsQ29uZmlnLm9mZmxvYWRfaW5mby5lbmNhcHN1bGF0aW9uX21vZGUgPSBsQ29uZmlnLm9mZmxvYWRfaW5mby5lbmNhcHN1bGF0aW9uX21vZGU7CisgICAgICAgIGxDb25maWcub2ZmbG9hZF9pbmZvLmNvbnRlbnRfaWQgPSBsQ29uZmlnLm9mZmxvYWRfaW5mby5jb250ZW50X2lkOworICAgICAgICBsQ29uZmlnLm9mZmxvYWRfaW5mby5zeW5jX2lkID0gbENvbmZpZy5vZmZsb2FkX2luZm8uc3luY19pZDsKICAgICB9CiAKICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKG1GbGFncyB8IGZsYWdzKTsKQEAgLTc2NCwxMSArNzY3LDYgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzQTJkcFN1cHBvcnRlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChpc0EyZHBPZmZsb2FkZWRPblByaW1hcnkoKSB8fCAoZ2V0QTJkcE91dHB1dCgpICE9IDApKTsKLX0KLQogc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRQcmltYXJ5T3V0cHV0KCkgY29uc3QKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAKaW5kZXggYjZkZTRiZS4uZmMxZDBlMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcApAQCAtNDYzLDcgKzQ2Myw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsCi0gICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgeworICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKSB7CiAgICAgLy8gdmVyaWZ5IGZlYXNpYmlsaXR5OiBmb3IgZWFjaCBwbGF5ZXIgbWl4OiBpZiBpdCBhbHJlYWR5IGNvbnRhaW5zIGEKICAgICAvLyAgICAibWF0Y2ggdWlkIiBydWxlIGZvciB0aGlzIHVpZCwgcmV0dXJuIGFuIGVycm9yCiAgICAgLy8gICAgKGFkZGluZyBhIHVpZC1kZXZpY2UgYWZmaW5pdHkgd291bGQgcmVzdWx0IGluIGNvbnRyYWRpY3RvcnkgcnVsZXMpCkBAIC01NjUsNyArNTY1LDcgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpzZXRVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQsCi0gICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgeworICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKSB7CiAgICAgLy8gdmVyaWZ5IGZlYXNpYmlsaXR5OiBmb3IgZWFjaCBwbGF5ZXIgbWl4OiBpZiBpdCBhbHJlYWR5IGNvbnRhaW5zIGEKICAgICAvLyAgICAibWF0Y2ggdXNlcklkIiBydWxlIGZvciB0aGlzIHVzZXJJZCwgcmV0dXJuIGFuIGVycm9yCiAgICAgLy8gICAgKGFkZGluZyBhIHVzZXJJZC1kZXZpY2UgYWZmaW5pdHkgd291bGQgcmVzdWx0IGluIGNvbnRyYWRpY3RvcnkgcnVsZXMpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUm91dGUuY3BwCmluZGV4IDJhMThmMTkuLmM4ZTRlNzYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUm91dGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUm91dGUuY3BwCkBAIC0zOSwxMiArMzksMTIgQEAKIGJvb2wgQXVkaW9Sb3V0ZTo6c3VwcG9ydHNQYXRjaChjb25zdCBzcDxQb2xpY3lBdWRpb1BvcnQ+ICZzcmNQb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFBvbGljeUF1ZGlvUG9ydD4gJmRzdFBvcnQpIGNvbnN0CiB7Ci0gICAgaWYgKG1TaW5rID09IDAgfHwgZHN0UG9ydCA9PSAwIHx8IGRzdFBvcnQgIT0gbVNpbmspIHsKKyAgICBpZiAobVNpbmsgPT0gMCB8fCBkc3RQb3J0ID09IDAgfHwgIWRzdFBvcnQtPmVxdWFscyhtU2luaykpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBBTE9HVigiJXM6IHNpbmtzICVzIG1hdGNoaW5nIiwgX19GVU5DVElPTl9fLCBtU2luay0+Z2V0VGFnTmFtZSgpLmNfc3RyKCkpOwogICAgIGZvciAoY29uc3QgYXV0byAmc291cmNlUG9ydCA6IG1Tb3VyY2VzKSB7Ci0gICAgICAgIGlmIChzb3VyY2VQb3J0ID09IHNyY1BvcnQpIHsKKyAgICAgICAgaWYgKHNvdXJjZVBvcnQtPmVxdWFscyhzcmNQb3J0KSkgewogICAgICAgICAgICAgQUxPR1YoIiVzOiBzb3VyY2VzICVzIG1hdGNoaW5nIiwgX19GVU5DVElPTl9fLCBzb3VyY2VQb3J0LT5nZXRUYWdOYW1lKCkuY19zdHIoKSk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcAppbmRleCBhMjllNjBlLi5mNjg1OWM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcApAQCAtNDksMTAgKzQ5LDEzIEBACiB7CiB9CiAKKy8vIExldCBEZXZpY2VEZXNjcmlwdG9yQmFzZSBpbml0aWFsaXplIHRoZSBhZGRyZXNzIHNpbmNlIGl0IGhhbmRsZXMgc3BlY2lmaWMgY2FzZXMgbGlrZQorLy8gbGVnYWN5IHJlbW90ZSBzdWJtaXggd2hlcmUgIjAiIGlzIGFkZGVkIGFzIGRlZmF1bHQgYWRkcmVzcy4KIERldmljZURlc2NyaXB0b3I6OkRldmljZURlc2NyaXB0b3IoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlVHlwZUFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZ0YWdOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXRWZWN0b3IgJmVuY29kZWRGb3JtYXRzKSA6Ci0gICAgICAgIERldmljZURlc2NyaXB0b3JCYXNlKGRldmljZVR5cGVBZGRyKSwgbVRhZ05hbWUodGFnTmFtZSksIG1FbmNvZGVkRm9ybWF0cyhlbmNvZGVkRm9ybWF0cykKKyAgICAgICAgRGV2aWNlRGVzY3JpcHRvckJhc2UoZGV2aWNlVHlwZUFkZHIpLCBtVGFnTmFtZSh0YWdOYW1lKSwgbUVuY29kZWRGb3JtYXRzKGVuY29kZWRGb3JtYXRzKSwKKyAgICAgICAgbURlY2xhcmVkQWRkcmVzcyhEZXZpY2VEZXNjcmlwdG9yQmFzZTo6YWRkcmVzcygpKQogewogICAgIG1DdXJyZW50RW5jb2RlZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOwogICAgIC8qIElmIGZyYW1ld29yayBydW5zIGFnYWluc3QgYSBwcmUgNS4wIEF1ZGlvIEhBTCwgZW5jb2RlZCBmb3JtYXRzIGFyZSBhYnNlbnQgZnJvbSB0aGUgY29uZmlnLgpAQCAtNzUsNiArNzgsMTAgQEAKIHZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6ZGV0YWNoKCkgewogICAgIG1JZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgUG9saWN5QXVkaW9Qb3J0OjpkZXRhY2goKTsKKyAgICAvLyBUaGUgZGV2aWNlIGFkZHJlc3MgbWF5IGhhdmUgYmVlbiBvdmVyd3JpdHRlbiBvbiBkZXZpY2UgY29ubmVjdGlvbgorICAgIHNldEFkZHJlc3MobURlY2xhcmVkQWRkcmVzcyk7CisgICAgLy8gRGV2aWNlIFBvcnQgZG9lcyBub3QgaGF2ZSBhIG5hbWUgdW5sZXNzIHByb3ZpZGVkIGJ5IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZQorICAgIHNldE5hbWUoIiIpOwogfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpAQCAtMzc1LDcgKzM4Miw3IEBACiAgICAgaWYgKGlzRW1wdHkoKSkgewogICAgICAgICAvLyBSZXR1cm4gbnVsbHB0ciBpZiB0aGlzIGNvbGxlY3Rpb24gaXMgZW1wdHkuCiAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0gZWxzZSBpZiAoYXJlQWxsT2ZTYW1lRGV2aWNlVHlwZSh0eXBlcygpLCBhdWRpb19pc19pbnB1dF9kZXZpY2UpKSB7CisgICAgfSBlbHNlIGlmIChhcmVBbGxPZlNhbWVEZXZpY2VUeXBlKHR5cGVzKCksIGF1ZGlvX2NhbGxfaXNfaW5wdXRfZGV2aWNlKSkgewogICAgICAgICAvLyBGb3IgaW5wdXQgY2FzZSwgcmV0dXJuIHRoZSBmaXJzdCBvbmUgd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBkZXZpY2UuCiAgICAgICAgIHJldHVybiBzaXplKCkgPiAxID8gbnVsbHB0ciA6ICpiZWdpbigpOwogICAgIH0gZWxzZSBpZiAoYXJlQWxsT2ZTYW1lRGV2aWNlVHlwZSh0eXBlcygpLCBhdWRpb19pc19vdXRwdXRfZGV2aWNlKSkgewpAQCAtMzg4LDYgKzM5NSwyNCBAQAogICAgIHJldHVybiBudWxscHRyOwogfQogCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBEZXZpY2VWZWN0b3I6OmdldERldmljZUZyb21EZXZpY2VUeXBlQWRkcigKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZVR5cGVBZGRyKSBjb25zdCB7CisgICAgcmV0dXJuIGdldERldmljZShkZXZpY2VUeXBlQWRkci5tVHlwZSwgU3RyaW5nOChkZXZpY2VUeXBlQWRkci5nZXRBZGRyZXNzKCkpLAorICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworfQorCitEZXZpY2VWZWN0b3IgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbURldmljZVR5cGVBZGRyVmVjKAorICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VUeXBlQWRkclZlY3RvcikgY29uc3QgeworICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlVHlwZUFkZHIgOiBkZXZpY2VUeXBlQWRkclZlY3RvcikgeworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBnZXREZXZpY2VGcm9tRGV2aWNlVHlwZUFkZHIoZGV2aWNlVHlwZUFkZHIpOworICAgICAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRldmljZXMuYWRkKGRldmljZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRldmljZXM7Cit9CisKIHZvaWQgRGV2aWNlVmVjdG9yOjpyZXBsYWNlRGV2aWNlc0J5VHlwZSgKICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGVUb1JlbW92ZSwgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzVG9BZGQpIHsKICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlc1RvUmVtb3ZlID0gZ2V0RGV2aWNlc0Zyb21UeXBlKHR5cGVUb1JlbW92ZSk7CkBAIC00MDgsNyArNDMzLDcgQEAKICAgICB9CiB9CiAKLXN0ZDo6c3RyaW5nIERldmljZVZlY3Rvcjo6dG9TdHJpbmcoKSBjb25zdAorc3RkOjpzdHJpbmcgRGV2aWNlVmVjdG9yOjp0b1N0cmluZyhib29sIGluY2x1ZGVTZW5zaXRpdmVJbmZvKSBjb25zdAogewogICAgIGlmIChpc0VtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuIHsiQVVESU9fREVWSUNFX05PTkUifTsKQEAgLTQxOCw3ICs0NDMsNyBAQAogICAgICAgICBpZiAoZGV2aWNlICE9ICpiZWdpbigpKSB7CiAgICAgICAgICAgIHJlc3VsdCArPSAiOyI7CiAgICAgICAgIH0KLSAgICAgICAgcmVzdWx0ICs9IGRldmljZS0+dG9TdHJpbmcoKTsKKyAgICAgICAgcmVzdWx0ICs9IGRldmljZS0+dG9TdHJpbmcoaW5jbHVkZVNlbnNpdGl2ZUluZm8pOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0ICsgIn0iOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwCmluZGV4IGQzMWU0NDMuLjNhMTQzYjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAKQEAgLTQxLDYgKzQxLDE0IEBACiAgICAgfQogfQogCitzdGQ6OnN0cmluZyBId01vZHVsZTo6Z2V0VGFnRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGNvbnN0IFN0cmluZzggJmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBjb2RlYykKK3sKKyAgICBEZXZpY2VWZWN0b3IgZGVjbGFyZWREZXZpY2VzID0gZ2V0RGVjbGFyZWREZXZpY2VzKCk7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9IGRlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2UoZGV2aWNlLCBhZGRyZXNzLCBjb2RlYyk7CisgICAgcmV0dXJuIGRldmljZURlc2MgPyBkZXZpY2VEZXNjLT5nZXRUYWdOYW1lKCkgOiBzdGQ6OnN0cmluZ3t9OworfQorCiBzdGF0dXNfdCBId01vZHVsZTo6YWRkT3V0cHV0UHJvZmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpCiB7CkBAIC00OSw3ICs1Nyw4IEBACiAgICAgcHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKG5ldyBBdWRpb1Byb2ZpbGUoY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUpKTsKIAotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihkZXZpY2UsICIiIC8qdGFnTmFtZSovLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KKyAgICAgICAgICAgIG5ldyBEZXZpY2VEZXNjcmlwdG9yKGRldmljZSwgZ2V0VGFnRm9yRGV2aWNlKGRldmljZSksIGFkZHJlc3Muc3RyaW5nKCkpOwogICAgIGFkZER5bmFtaWNEZXZpY2UoZGV2RGVzYyk7CiAgICAgLy8gUmVjaXByb2NhbGx5IGF0dGFjaCB0aGUgZGV2aWNlIHRvIHRoZSBtb2R1bGUKICAgICBkZXZEZXNjLT5hdHRhY2godGhpcyk7CkBAIC0xMTYsNyArMTI1LDggQEAKICAgICBwcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUobmV3IEF1ZGlvUHJvZmlsZShjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSkpOwogCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKGRldmljZSwgIiIgLyp0YWdOYW1lKi8sIGFkZHJlc3Muc3RyaW5nKCkpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQorICAgICAgICAgICAgbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlLCBnZXRUYWdGb3JEZXZpY2UoZGV2aWNlKSwgYWRkcmVzcy5zdHJpbmcoKSk7CiAgICAgYWRkRHluYW1pY0RldmljZShkZXZEZXNjKTsKICAgICAvLyBSZWNpcHJvY2FsbHkgYXR0YWNoIHRoZSBkZXZpY2UgdG8gdGhlIG1vZHVsZQogICAgIGRldkRlc2MtPmF0dGFjaCh0aGlzKTsKQEAgLTI3MSw4ICsyODEsOSBAQAogICAgIHJldHVybiBudWxscHRyOwogfQogCi1zcCA8SHdNb2R1bGU+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0TW9kdWxlRm9yRGV2aWNlVHlwZShhdWRpb19kZXZpY2VzX3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpIGNvbnN0CitzcDxId01vZHVsZT4gSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXRNb2R1bGVGb3JEZXZpY2VUeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqdGFnTmFtZSkgY29uc3QKIHsKICAgICBmb3IgKGNvbnN0IGF1dG8mIG1vZHVsZSA6ICp0aGlzKSB7CiAgICAgICAgIGNvbnN0IGF1dG8mIHByb2ZpbGVzID0gYXVkaW9faXNfb3V0cHV0X2RldmljZSh0eXBlKSA/CkBAIC0yODQsOSArMjk1LDE1IEBACiAgICAgICAgICAgICAgICAgICAgIHNwIDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZERldmljZXMuZ2V0RGV2aWNlKHR5cGUsIFN0cmluZzgoKSwgZW5jb2RlZEZvcm1hdCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2VEZXNjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFnTmFtZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRhZ05hbWUgPSBkZXZpY2VEZXNjLT5nZXRUYWdOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ05hbWUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgKnRhZ05hbWUgPSBwcm9maWxlLT5nZXRUYWcoe3R5cGV9KTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTMyNSwxNSArMzQyLDMyIEBACiAgICAgfQogCiAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6ICp0aGlzKSB7CisgICAgICAgIGlmICghYWxsb3dUb0NyZWF0ZSkgeworICAgICAgICAgICAgYXV0byBkeW5hbWljRGV2aWNlcyA9IGh3TW9kdWxlLT5nZXREeW5hbWljRGV2aWNlcygpOworICAgICAgICAgICAgYXV0byBkeW5hbWljRGV2aWNlID0gZHluYW1pY0RldmljZXMuZ2V0RGV2aWNlKGRldmljZVR5cGUsIGRldkFkZHJlc3MsIGVuY29kZWRGb3JtYXQpOworICAgICAgICAgICAgaWYgKGR5bmFtaWNEZXZpY2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZHluYW1pY0RldmljZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBEZXZpY2VWZWN0b3IgbW9kdWxlRGV2aWNlcyA9IGh3TW9kdWxlLT5nZXRBbGxEZXZpY2VzKCk7CiAgICAgICAgIGF1dG8gbW9kdWxlRGV2aWNlID0gbW9kdWxlRGV2aWNlcy5nZXREZXZpY2UoZGV2aWNlVHlwZSwgZGV2QWRkcmVzcywgZW5jb2RlZEZvcm1hdCk7CisKKyAgICAgICAgLy8gUHJldmVudCBvdmVyd3JpdHRpbmcgbW9kdWxlRGV2aWNlIGFkZHJlc3MgaWYgY29ubmVjdGVkIGRldmljZSBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lCisgICAgICAgIC8vIGFkZHJlc3MgKHNpbmNlIGdldERldmljZSB3aXRoIGVtcHR5IGFkZHJlc3MgaWdub3JlcyBtYXRjaCBvbiBhZGRyZXNzKSwgdXNlIGR5bmFtaWMgZGV2aWNlCisgICAgICAgIGlmIChtb2R1bGVEZXZpY2UgJiYgYWxsb3dUb0NyZWF0ZSAmJgorICAgICAgICAgICAgICAgICghbW9kdWxlRGV2aWNlLT5hZGRyZXNzKCkuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgICAobW9kdWxlRGV2aWNlLT5hZGRyZXNzKCkuY29tcGFyZShkZXZBZGRyZXNzLmNfc3RyKCkpICE9IDApKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgICAgaWYgKG1vZHVsZURldmljZSkgewogICAgICAgICAgICAgaWYgKGVuY29kZWRGb3JtYXQgIT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKICAgICAgICAgICAgICAgICBtb2R1bGVEZXZpY2UtPnNldEVuY29kZWRGb3JtYXQoZW5jb2RlZEZvcm1hdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYWxsb3dUb0NyZWF0ZSkgewogICAgICAgICAgICAgICAgIG1vZHVsZURldmljZS0+YXR0YWNoKGh3TW9kdWxlKTsKKyAgICAgICAgICAgICAgICAvLyBOYW1lIG1heSBiZSBvdmVyd3JpdHRlbiwgcmVzdG9yZWQgb24gZGV0YWNoLgogICAgICAgICAgICAgICAgIG1vZHVsZURldmljZS0+c2V0QWRkcmVzcyhkZXZBZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAvLyBOYW1lIG1heSBiZSBvdmVyd3JpdHRlbiwgcmVzdG9yZWQgb24gZGV0YWNoLgogICAgICAgICAgICAgICAgIG1vZHVsZURldmljZS0+c2V0TmFtZShuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBtb2R1bGVEZXZpY2U7CkBAIC0zNTIsMTggKzM4NiwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpIGNvbnN0CiB7Ci0gICAgc3A8SHdNb2R1bGU+IGh3TW9kdWxlID0gZ2V0TW9kdWxlRm9yRGV2aWNlVHlwZSh0eXBlLCBlbmNvZGVkRm9ybWF0KTsKKyAgICBzdGQ6OnN0cmluZyB0YWdOYW1lID0ge307CisgICAgc3A8SHdNb2R1bGU+IGh3TW9kdWxlID0gZ2V0TW9kdWxlRm9yRGV2aWNlVHlwZSh0eXBlLCBlbmNvZGVkRm9ybWF0LCAmdGFnTmFtZSk7CiAgICAgaWYgKGh3TW9kdWxlID09IDApIHsKICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgZmluZCBIVyBtb2R1bGUgZm9yIGRldmljZSAlMDR4IGFkZHJlc3MgJXMiLCBfX0ZVTkNUSU9OX18sIHR5cGUsCiAgICAgICAgICAgICAgIGFkZHJlc3MpOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiAKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcih0eXBlLCBuYW1lLCBhZGRyZXNzKTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcih0eXBlLCB0YWdOYW1lLCBhZGRyZXNzKTsKICAgICBkZXZpY2UtPnNldE5hbWUobmFtZSk7CiAgICAgZGV2aWNlLT5zZXRFbmNvZGVkRm9ybWF0KGVuY29kZWRGb3JtYXQpOwotCi0gIC8vIEFkZCB0aGUgZGV2aWNlIHRvIHRoZSBsaXN0IG9mIGR5bmFtaWMgZGV2aWNlcworICAgIGRldmljZS0+c2V0RHluYW1pYygpOworICAgIC8vIEFkZCB0aGUgZGV2aWNlIHRvIHRoZSBsaXN0IG9mIGR5bmFtaWMgZGV2aWNlcwogICAgIGh3TW9kdWxlLT5hZGREeW5hbWljRGV2aWNlKGRldmljZSk7CiAgICAgLy8gUmVjaXByb2NhbGx5IGF0dGFjaCB0aGUgZGV2aWNlIHRvIHRoZSBtb2R1bGUKICAgICBkZXZpY2UtPmF0dGFjaChod01vZHVsZSk7CkBAIC0zNzUsNyArNDEwLDcgQEAKICAgICBmb3IgKGNvbnN0IGF1dG8gJnByb2ZpbGUgOiBwcm9maWxlcykgewogICAgICAgICAvLyBBZGQgdGhlIGRldmljZSBhcyBzdXBwb3J0ZWQgdG8gYWxsIHByb2ZpbGUgc3VwcG9ydGluZyAid2Vha2x5IiBvciBub3QgdGhlIGRldmljZQogICAgICAgICAvLyBhY2NvcmRpbmcgdG8gaXRzIHR5cGUKLSAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnRzRGV2aWNlKGRldmljZSwgZmFsc2UgLyptYXRjaEFkcmVzcyovKSkgeworICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlLCBmYWxzZSAvKm1hdGNoQWRkcmVzcyovKSkgewogCiAgICAgICAgICAgICAvLyBAdG9kbyBxdWlkIG9mIGF1ZGlvIHByb2ZpbGU/IGltcG9ydCB0aGUgcHJvZmlsZSBmcm9tIGRldmljZSBvZiB0aGUgc2FtZSB0eXBlPwogICAgICAgICAgICAgY29uc3QgYXV0byAmaXNvVHlwZURldmljZUZvclByb2ZpbGUgPQpAQCAtNDA2LDEwICs0NDEsOSBAQAogCiAgICAgICAgIGRldmljZS0+ZGV0YWNoKCk7CiAgICAgICAgIC8vIE9ubHkgcmVtb3ZlIGZyb20gZHluYW1pYyBsaXN0LCBub3QgZnJvbSBkZWNsYXJlZCBsaXN0ISEhCi0gICAgICAgIGlmICghaHdNb2R1bGUtPmdldER5bmFtaWNEZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgeworICAgICAgICBpZiAoIWh3TW9kdWxlLT5yZW1vdmVEeW5hbWljRGV2aWNlKGRldmljZSkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBod01vZHVsZS0+cmVtb3ZlRHluYW1pY0RldmljZShkZXZpY2UpOwogICAgICAgICBBTE9HVigiJXM6IHJlbW92ZWQgZHluYW1pYyBkZXZpY2UgJXMgZnJvbSBtb2R1bGUgJXMiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKaW5kZXggYmYxYTBmNy4uYWU5MmI0MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwCkBAIC0xNyw3ICsxNyw3IEBACiAjZGVmaW5lIExPR19UQUcgIkFQTTo6SU9Qcm9maWxlIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLWJhc2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKICNpbmNsdWRlICJId01vZHVsZS5oIgogI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKQEAgLTExMiwxMiArMTEyLDExIEBACiAgICAgZHN0LT5hcHBlbmQocG9ydFN0ci5jX3N0cigpKTsKIAogICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgICAgLSBmbGFnczogMHglMDR4IiwgZ2V0RmxhZ3MoKSk7Ci0gICAgc3RkOjpzdHJpbmcgZmxhZ3NMaXRlcmFsOwotICAgIGlmIChnZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKLSAgICAgICAgSW5wdXRGbGFnQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZ2V0RmxhZ3MoKSwgZmxhZ3NMaXRlcmFsKTsKLSAgICB9IGVsc2UgaWYgKGdldFJvbGUoKSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7Ci0gICAgICAgIE91dHB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhnZXRGbGFncygpLCBmbGFnc0xpdGVyYWwpOwotICAgIH0KKyAgICBzdGQ6OnN0cmluZyBmbGFnc0xpdGVyYWwgPQorICAgICAgICAgICAgZ2V0Um9sZSgpID09IEFVRElPX1BPUlRfUk9MRV9TSU5LID8KKyAgICAgICAgICAgIHRvU3RyaW5nKHN0YXRpY19jYXN0PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+KGdldEZsYWdzKCkpKSA6CisgICAgICAgICAgICBnZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSA/CisgICAgICAgICAgICB0b1N0cmluZyhzdGF0aWNfY2FzdDxhdWRpb19vdXRwdXRfZmxhZ3NfdD4oZ2V0RmxhZ3MoKSkpIDogIiI7CiAgICAgaWYgKCFmbGFnc0xpdGVyYWwuZW1wdHkoKSkgewogICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICglcykiLCBmbGFnc0xpdGVyYWwuY19zdHIoKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXJpYWxpemVyLmNwcAppbmRleCA4ODNlNzEzLi41NjJjMjEzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXJpYWxpemVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXJpYWxpemVyLmNwcApAQCAtMjAsOCArMjAsOCBAQAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2YXJpYW50PgogCi0jaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KICNpbmNsdWRlIDxsaWJ4bWwvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bGlieG1sL3hpbmNsdWRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvY29udmVydC5oPgpAQCAtMzYsMTEgKzM2LDE0IEBACiAKIG5hbWVzcGFjZSB7CiAKLS8vIFRPRE8obW5hZ2Fub3YpOiBDb25zaWRlciBmaW5kaW5nIGFuIGFsdGVybmF0aXZlIGZvciB1c2luZyBISURMIGNvZGUuCi11c2luZyBoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgaGFyZHdhcmU6OlN0YXR1czsKIHVzaW5nIHV0aWxpdGllczo6Y29udmVydFRvOwogCitzdGF0aWMgaW5saW5lIGJvb2wgbWF5YmVWZW5kb3JFeHRlbnNpb24oY29uc3Qgc3RkOjpzdHJpbmcmIHMpIHsKKyAgICAvLyBPbmx5IGNoZWNrcyB3aGV0aGVyIHRoZSBzdHJpbmcgc3RhcnRzIHdpdGggdGhlICJ2ZW5kb3IgcHJlZml4Ii4KKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgdmVuZG9yUHJlZml4ID0gIlZYXyI7CisgICAgcmV0dXJuIHMuc2l6ZSgpID4gdmVuZG9yUHJlZml4LnNpemUoKSAmJiBzLnN1YnN0cigwLCB2ZW5kb3JQcmVmaXguc2l6ZSgpKSA9PSB2ZW5kb3JQcmVmaXg7Cit9CisKIHRlbXBsYXRlPHR5cGVuYW1lIEUsIHR5cGVuYW1lIEM+CiBzdHJ1Y3QgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHMgewogICAgIHR5cGVkZWYgc3A8RT4gRWxlbWVudDsKQEAgLTg5LDcgKzkyLDYgQEAKIAogICAgIH07CiAKLSAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKICAgICAvLyBObyBjaGlsZHJlbgogfTsKIApAQCAtMTA2LDggKzEwOCw2IEBACiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqZm9ybWF0ID0gImZvcm1hdCI7CiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY2hhbm5lbE1hc2tzID0gImNoYW5uZWxNYXNrcyI7CiAgICAgfTsKLQotICAgIHN0YXRpYyBSZXR1cm48RWxlbWVudD4gZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwogfTsKIAogc3RydWN0IE1peFBvcnRUcmFpdHMgOiBwdWJsaWMgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHM8SU9Qcm9maWxlLCBJT1Byb2ZpbGVDb2xsZWN0aW9uPgpAQCAtMTI1LDcgKzEyNSw2IEBACiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWF4QWN0aXZlQ291bnQgPSAibWF4QWN0aXZlQ291bnQiOwogICAgIH07CiAKLSAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKICAgICAvLyBDaGlsZHJlbjogR2FpblRyYWl0cwogfTsKIApAQCAtMTQ3LDcgKzE0Niw2IEBACiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqZW5jb2RlZEZvcm1hdHMgPSAiZW5jb2RlZEZvcm1hdHMiOwogICAgIH07CiAKLSAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKICAgICAvLyBDaGlsZHJlbjogR2FpblRyYWl0cyAob3B0aW9uYWwpCiB9OwogCkBAIC0xNjYsOCArMTY0LDYgQEAKICAgICB9OwogCiAgICAgdHlwZWRlZiBId01vZHVsZSAqUHRyU2VyaWFsaXppbmdDdHg7Ci0KLSAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKIH07CiAKIHN0cnVjdCBNb2R1bGVUcmFpdHMgOiBwdWJsaWMgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHM8SHdNb2R1bGUsIEh3TW9kdWxlQ29sbGVjdGlvbj4KQEAgLTE4NywxMyArMTgzLDE0IEBACiAKICAgICB0eXBlZGVmIEF1ZGlvUG9saWN5Q29uZmlnICpQdHJTZXJpYWxpemluZ0N0eDsKIAotICAgIHN0YXRpYyBSZXR1cm48RWxlbWVudD4gZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwogICAgIC8vIENoaWxkcmVuOiBtaXhQb3J0VHJhaXRzLCBkZXZpY2VQb3J0VHJhaXRzLCBhbmQgcm91dGVUcmFpdHMKICAgICAvLyBOZWVkIHRvIGNhbGwgZGVzZXJpYWxpemUgb24gZWFjaCBjaGlsZAogfTsKIAogc3RydWN0IEdsb2JhbENvbmZpZ1RyYWl0cwogeworICAgIHR5cGVkZWYgc3RkOjptb25vc3RhdGUgRWxlbWVudDsKKwogICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gImdsb2JhbENvbmZpZ3VyYXRpb24iOwogCiAgICAgc3RydWN0IEF0dHJpYnV0ZXMKQEAgLTIwMywxNCArMjAwLDE2IEBACiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqZW5naW5lTGlicmFyeVN1ZmZpeCA9ICJlbmdpbmVfbGlicmFyeSI7CiAgICAgfTsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKTsKKyAgICB0eXBlZGVmIEF1ZGlvUG9saWN5Q29uZmlnICpQdHJTZXJpYWxpemluZ0N0eDsKIH07CiAKIHN0cnVjdCBTdXJyb3VuZFNvdW5kVHJhaXRzCiB7CisgICAgdHlwZWRlZiBzdGQ6Om1vbm9zdGF0ZSBFbGVtZW50OworCiAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAic3Vycm91bmRTb3VuZCI7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqcm9vdCwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZyk7CisgICAgdHlwZWRlZiBBdWRpb1BvbGljeUNvbmZpZyAqUHRyU2VyaWFsaXppbmdDdHg7CiAgICAgLy8gQ2hpbGRyZW46IFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHMKIH07CiAKQEAgLTIyNCwyOCArMjIzLDMyIEBACiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzdWJmb3JtYXRzID0gInN1YmZvcm1hdHMiOwogICAgIH07Ci0KLSAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKIH07CiAKIGNsYXNzIFBvbGljeVNlcmlhbGl6ZXIKIHsKIHB1YmxpYzoKLSAgICBQb2xpY3lTZXJpYWxpemVyKCkgOiBtVmVyc2lvbntzdGQ6OnRvX3N0cmluZyhnTWFqb3IpICsgIi4iICsgc3RkOjp0b19zdHJpbmcoZ01pbm9yKX0KLSAgICB7Ci0gICAgICAgIEFMT0dWKCIlczogVmVyc2lvbj0lcyBSb290PSVzIiwgX19mdW5jX18sIG1WZXJzaW9uLmNfc3RyKCksIHJvb3ROYW1lKTsKLSAgICB9Ci0gICAgc3RhdHVzX3QgZGVzZXJpYWxpemUoY29uc3QgY2hhciAqY29uZmlnRmlsZSwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZyk7CisgICAgc3RhdHVzX3QgZGVzZXJpYWxpemUoY29uc3QgY2hhciAqY29uZmlnRmlsZSwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIGJvb2wgaWdub3JlVmVuZG9yRXh0ZW5zaW9ucyA9IGZhbHNlKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBUcmFpdD4KKyAgICBzdGF0dXNfdCBkZXNlcmlhbGl6ZUNvbGxlY3Rpb24oY29uc3QgeG1sTm9kZSAqY3VyLAorICAgICAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OkNvbGxlY3Rpb24gKmNvbGxlY3Rpb24sCisgICAgICAgICAgICB0eXBlbmFtZSBUcmFpdDo6UHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXQ+CisgICAgc3RkOjp2YXJpYW50PHN0YXR1c190LCB0eXBlbmFtZSBUcmFpdDo6RWxlbWVudD4gZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLAorICAgICAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OlB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CiAKIHByaXZhdGU6CiAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyb290TmFtZSA9ICJhdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24iOwogICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdmVyc2lvbkF0dHJpYnV0ZSA9ICJ2ZXJzaW9uIjsKLSAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGdNYWpvciA9IDE7IC8qKjwgdGhlIG1ham9yIG51bWJlciBvZiB0aGUgcG9saWN5IHhtbCBmb3JtYXQgdmVyc2lvbi4gKi8KLSAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGdNaW5vciA9IDA7IC8qKjwgdGhlIG1pbm9yIG51bWJlciBvZiB0aGUgcG9saWN5IHhtbCBmb3JtYXQgdmVyc2lvbi4gKi8KIAogICAgIHR5cGVkZWYgQXVkaW9Qb2xpY3lDb25maWcgRWxlbWVudDsKIAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1WZXJzaW9uOworICAgIGJvb2wgbUlnbm9yZVZlbmRvckV4dGVuc2lvbnMgPSBmYWxzZTsKKyAgICBzdGQ6OnN0cmluZyBtQ2hhbm5lbE1hc2tzU2VwYXJhdG9yID0gIiwiOworICAgIHN0ZDo6c3RyaW5nIG1TYW1wbGluZ1JhdGVzU2VwYXJhdG9yID0gIiwiOworICAgIHN0ZDo6c3RyaW5nIG1GbGFnc1NlcGFyYXRvciA9ICJ8IjsKIAogICAgIC8vIENoaWxkcmVuOiBNb2R1bGVzVHJhaXRzLCBWb2x1bWVUcmFpdHMsIFN1cnJvdW5kU291bmRUcmFpdHMgKG9wdGlvbmFsKQogfTsKQEAgLTI1NCw5ICsyNTcsOCBAQAogY29uc3RleHByIHZvaWQgKCp4bWxEZWxldGVyKShUKiB0KTsKIHRlbXBsYXRlIDw+CiBjb25zdGV4cHIgYXV0byB4bWxEZWxldGVyPHhtbERvYz4gPSB4bWxGcmVlRG9jOwotLy8gaHR0cDovL2IvMTExMDY3Mjc3IC0gQWRkIGJhY2sgY29uc3RleHByIHdoZW4gd2Ugc3dpdGNoIHRvIEMrKzE3LgogdGVtcGxhdGUgPD4KLWF1dG8geG1sRGVsZXRlcjx4bWxDaGFyPiA9IFtdKHhtbENoYXIgKnMpIHsgeG1sRnJlZShzKTsgfTsKK2NvbnN0ZXhwciBhdXRvIHhtbERlbGV0ZXI8eG1sQ2hhcj4gPSBbXSh4bWxDaGFyICpzKSB7IHhtbEZyZWUocyk7IH07CiAKIC8qKiBAcmV0dXJuIGEgdW5pcXVlX3B0ciB3aXRoIHRoZSBjb3JyZWN0IGRlbGV0ZXIgZm9yIHRoZSBsaWJ4bWwyIG9iamVjdC4gKi8KIHRlbXBsYXRlIDxjbGFzcyBUPgpAQCAtMjk2LDcgKzI5OCw3IEBACiB9CiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFpdD4KLXN0YXR1c190IGRlc2VyaWFsaXplQ29sbGVjdGlvbihjb25zdCB4bWxOb2RlICpjdXIsCitzdGF0dXNfdCBQb2xpY3lTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZUNvbGxlY3Rpb24oY29uc3QgeG1sTm9kZSAqY3VyLAogICAgICAgICB0eXBlbmFtZSBUcmFpdDo6Q29sbGVjdGlvbiAqY29sbGVjdGlvbiwKICAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OlB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCkKIHsKQEAgLTMwOSwxNCArMzExLDE3IEBACiAgICAgICAgIH0KICAgICAgICAgZm9yICg7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKICAgICAgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihUcmFpdDo6dGFnKSkpIHsKLSAgICAgICAgICAgICAgICBhdXRvIGVsZW1lbnQgPSBUcmFpdDo6ZGVzZXJpYWxpemUoY2hpbGQsIHNlcmlhbGl6aW5nQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IFRyYWl0OjphZGRFbGVtZW50VG9Db2xsZWN0aW9uKGVsZW1lbnQsIGNvbGxlY3Rpb24pOworICAgICAgICAgICAgICAgIGF1dG8gbWF5YmVFbGVtZW50ID0gZGVzZXJpYWxpemU8VHJhaXQ+KGNoaWxkLCBzZXJpYWxpemluZ0NvbnRleHQpOworICAgICAgICAgICAgICAgIGlmIChtYXliZUVsZW1lbnQuaW5kZXgoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IFRyYWl0OjphZGRFbGVtZW50VG9Db2xsZWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Z2V0PDE+KG1heWJlRWxlbWVudCksIGNvbGxlY3Rpb24pOwogICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBhZGQgZWxlbWVudCB0byAlcyBjb2xsZWN0aW9uIiwgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaXQ6OmNvbGxlY3Rpb25UYWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUlnbm9yZVZlbmRvckV4dGVuc2lvbnMgJiYgc3RkOjpnZXQ8c3RhdHVzX3Q+KG1heWJlRWxlbWVudCkgPT0gTk9fSU5JVCkgeworICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGEgdmVuZG9yIGV4dGVuc2lvbiBlbGVtZW50LgogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgfQpAQCAtMzI5LDE1ICszMzQsMTggQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLVJldHVybjxBdWRpb0dhaW5UcmFpdHM6OkVsZW1lbnQ+IEF1ZGlvR2FpblRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLAotICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQordGVtcGxhdGU8Pgorc3RkOjp2YXJpYW50PHN0YXR1c190LCBBdWRpb0dhaW5UcmFpdHM6OkVsZW1lbnQ+IFBvbGljeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplPEF1ZGlvR2FpblRyYWl0cz4oCisgICAgICAgIGNvbnN0IHhtbE5vZGUgKmN1ciwgQXVkaW9HYWluVHJhaXRzOjpQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQogeworICAgIHVzaW5nIEF0dHJpYnV0ZXMgPSBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM7CisKICAgICBzdGF0aWMgdWludDMyX3QgaW5kZXggPSAwOwotICAgIEVsZW1lbnQgZ2FpbiA9IG5ldyBBdWRpb0dhaW4oaW5kZXgrKywgdHJ1ZSk7CisgICAgQXVkaW9HYWluVHJhaXRzOjpFbGVtZW50IGdhaW4gPSBuZXcgQXVkaW9HYWluKGluZGV4KyssIHRydWUpOwogCiAgICAgc3RkOjpzdHJpbmcgbW9kZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om1vZGUpOwogICAgIGlmICghbW9kZS5lbXB0eSgpKSB7Ci0gICAgICAgIGdhaW4tPnNldE1vZGUoR2Fpbk1vZGVDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKG1vZGUpKTsKKyAgICAgICAgZ2Fpbi0+c2V0TW9kZShHYWluTW9kZUNvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcobW9kZSwgIiAiKSk7CiAgICAgfQogCiAgICAgc3RkOjpzdHJpbmcgY2hhbm5lbHNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6Y2hhbm5lbE1hc2spOwpAQCAtMzkyLDIwICs0MDAsMjggQEAKICAgICBpZiAoZ2Fpbi0+Z2V0TW9kZSgpICE9IDApIHsKICAgICAgICAgcmV0dXJuIGdhaW47CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiB9CiAKLVJldHVybjxBdWRpb1Byb2ZpbGVUcmFpdHM6OkVsZW1lbnQ+IEF1ZGlvUHJvZmlsZVRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLAotICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQordGVtcGxhdGU8Pgorc3RkOjp2YXJpYW50PHN0YXR1c190LCBBdWRpb1Byb2ZpbGVUcmFpdHM6OkVsZW1lbnQ+CitQb2xpY3lTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZTxBdWRpb1Byb2ZpbGVUcmFpdHM+KAorICAgICAgICBjb25zdCB4bWxOb2RlICpjdXIsIEF1ZGlvUHJvZmlsZVRyYWl0czo6UHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKKyAgICB1c2luZyBBdHRyaWJ1dGVzID0gQXVkaW9Qcm9maWxlVHJhaXRzOjpBdHRyaWJ1dGVzOworCiAgICAgc3RkOjpzdHJpbmcgc2FtcGxpbmdSYXRlcyA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnNhbXBsaW5nUmF0ZXMpOwogICAgIHN0ZDo6c3RyaW5nIGZvcm1hdCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OmZvcm1hdCk7CiAgICAgc3RkOjpzdHJpbmcgY2hhbm5lbHMgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpjaGFubmVsTWFza3MpOwogCi0gICAgRWxlbWVudCBwcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXRGcm9tU3RyaW5nKGZvcm1hdCwgZ0R5bmFtaWNGb3JtYXQpLAotICAgICAgICAgICAgY2hhbm5lbE1hc2tzRnJvbVN0cmluZyhjaGFubmVscywgIiwiKSwKLSAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXNGcm9tU3RyaW5nKHNhbXBsaW5nUmF0ZXMsICIsIikpOworICAgIGlmIChtSWdub3JlVmVuZG9yRXh0ZW5zaW9ucyAmJiBtYXliZVZlbmRvckV4dGVuc2lvbihmb3JtYXQpKSB7CisgICAgICAgIEFMT0dJKCIlczogdmVuZG9yIGV4dGVuc2lvbiBmb3JtYXQgXCIlc1wiIHNraXBwZWQiLCBfX2Z1bmNfXywgZm9ybWF0LmNfc3RyKCkpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQXVkaW9Qcm9maWxlVHJhaXRzOjpFbGVtZW50IHByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdEZyb21TdHJpbmcoZm9ybWF0LCBnRHluYW1pY0Zvcm1hdCksCisgICAgICAgICAgICBjaGFubmVsTWFza3NGcm9tU3RyaW5nKGNoYW5uZWxzLCBtQ2hhbm5lbE1hc2tzU2VwYXJhdG9yLmNfc3RyKCkpLAorICAgICAgICAgICAgc2FtcGxpbmdSYXRlc0Zyb21TdHJpbmcoc2FtcGxpbmdSYXRlcywgbVNhbXBsaW5nUmF0ZXNTZXBhcmF0b3IuY19zdHIoKSkpOwogCiAgICAgcHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBnRHluYW1pY0Zvcm1hdCk7CiAgICAgcHJvZmlsZS0+c2V0RHluYW1pY0NoYW5uZWxzKHByb2ZpbGUtPmdldENoYW5uZWxzKCkuZW1wdHkoKSk7CkBAIC00MTQsMzAgKzQzMCwzMyBAQAogICAgIHJldHVybiBwcm9maWxlOwogfQogCi1SZXR1cm48TWl4UG9ydFRyYWl0czo6RWxlbWVudD4gTWl4UG9ydFRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY2hpbGQsCi0gICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCit0ZW1wbGF0ZTw+CitzdGQ6OnZhcmlhbnQ8c3RhdHVzX3QsIE1peFBvcnRUcmFpdHM6OkVsZW1lbnQ+IFBvbGljeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplPE1peFBvcnRUcmFpdHM+KAorICAgICAgICBjb25zdCB4bWxOb2RlICpjaGlsZCwgTWl4UG9ydFRyYWl0czo6UHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKKyAgICB1c2luZyBBdHRyaWJ1dGVzID0gTWl4UG9ydFRyYWl0czo6QXR0cmlidXRlczsKKwogICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om5hbWUpOwogICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCBNaXhQb3J0VHJhaXRzOjp0YWcsIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CiAgICAgc3RkOjpzdHJpbmcgcm9sZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6cm9sZSk7CiAgICAgaWYgKHJvbGUuZW1wdHkoKSkgewogICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnJvbGUpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBTE9HVigiJXM6IFJvbGU9JXMiLCBfX2Z1bmNfXywgcm9sZS5jX3N0cigpKTsKICAgICBhdWRpb19wb3J0X3JvbGVfdCBwb3J0Um9sZSA9IChyb2xlID09IEF0dHJpYnV0ZXM6OnJvbGVTb3VyY2UpID8KICAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgOiBBVURJT19QT1JUX1JPTEVfU0lOSzsKIAotICAgIEVsZW1lbnQgbWl4UG9ydCA9IG5ldyBJT1Byb2ZpbGUobmFtZSwgcG9ydFJvbGUpOworICAgIE1peFBvcnRUcmFpdHM6OkVsZW1lbnQgbWl4UG9ydCA9IG5ldyBJT1Byb2ZpbGUobmFtZSwgcG9ydFJvbGUpOwogCiAgICAgQXVkaW9Qcm9maWxlVHJhaXRzOjpDb2xsZWN0aW9uIHByb2ZpbGVzOwogICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb1Byb2ZpbGVUcmFpdHM+KGNoaWxkLCAmcHJvZmlsZXMsIE5VTEwpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgaWYgKHByb2ZpbGVzLmVtcHR5KCkpIHsKICAgICAgICAgcHJvZmlsZXMuYWRkKEF1ZGlvUHJvZmlsZTo6Y3JlYXRlRnVsbER5bmFtaWMoZ0R5bmFtaWNGb3JtYXQpKTsKQEAgLTQ1MSwxMCArNDcwLDEwIEBACiAgICAgaWYgKCFmbGFncy5lbXB0eSgpKSB7CiAgICAgICAgIC8vIFNvdXJjZSByb2xlCiAgICAgICAgIGlmIChwb3J0Um9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7Ci0gICAgICAgICAgICBtaXhQb3J0LT5zZXRGbGFncyhPdXRwdXRGbGFnQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhmbGFncykpOworICAgICAgICAgICAgbWl4UG9ydC0+c2V0RmxhZ3MoT3V0cHV0RmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcoZmxhZ3MsIG1GbGFnc1NlcGFyYXRvci5jX3N0cigpKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBTaW5rIHJvbGUKLSAgICAgICAgICAgIG1peFBvcnQtPnNldEZsYWdzKElucHV0RmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcoZmxhZ3MpKTsKKyAgICAgICAgICAgIG1peFBvcnQtPnNldEZsYWdzKElucHV0RmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcoZmxhZ3MsIG1GbGFnc1NlcGFyYXRvci5jX3N0cigpKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgc3RkOjpzdHJpbmcgbWF4T3BlbkNvdW50ID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjptYXhPcGVuQ291bnQpOwpAQCAtNDY5LDQzICs0ODgsNTEgQEAKICAgICBBdWRpb0dhaW5UcmFpdHM6OkNvbGxlY3Rpb24gZ2FpbnM7CiAgICAgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvR2FpblRyYWl0cz4oY2hpbGQsICZnYWlucywgTlVMTCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICBtaXhQb3J0LT5zZXRHYWlucyhnYWlucyk7CiAKICAgICByZXR1cm4gbWl4UG9ydDsKIH0KIAotUmV0dXJuPERldmljZVBvcnRUcmFpdHM6OkVsZW1lbnQ+IERldmljZVBvcnRUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwKLSAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKK3RlbXBsYXRlPD4KK3N0ZDo6dmFyaWFudDxzdGF0dXNfdCwgRGV2aWNlUG9ydFRyYWl0czo6RWxlbWVudD4gUG9saWN5U2VyaWFsaXplcjo6ZGVzZXJpYWxpemU8RGV2aWNlUG9ydFRyYWl0cz4oCisgICAgICAgIGNvbnN0IHhtbE5vZGUgKmN1ciwgRGV2aWNlUG9ydFRyYWl0czo6UHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKKyAgICB1c2luZyBBdHRyaWJ1dGVzID0gRGV2aWNlUG9ydFRyYWl0czo6QXR0cmlidXRlczsKKyAgICBhdXRvJiB0YWcgPSBEZXZpY2VQb3J0VHJhaXRzOjp0YWc7CisKICAgICBzdGQ6OnN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6dGFnTmFtZSk7CiAgICAgaWYgKG5hbWUuZW1wdHkoKSkgewogICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnRhZ05hbWUpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6dGFnTmFtZSwgbmFtZS5jX3N0cigpKTsKICAgICBzdGQ6OnN0cmluZyB0eXBlTmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnR5cGUpOwogICAgIGlmICh0eXBlTmFtZS5lbXB0eSgpKSB7CiAgICAgICAgIEFMT0dFKCIlczogbm8gdHlwZSBmb3IgJXMiLCBfX2Z1bmNfXywgbmFtZS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6OnR5cGUsIHR5cGVOYW1lLmNfc3RyKCkpOwogICAgIHN0ZDo6c3RyaW5nIHJvbGUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpyb2xlKTsKICAgICBpZiAocm9sZS5lbXB0eSgpKSB7CiAgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6cm9sZSk7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjpyb2xlLCByb2xlLmNfc3RyKCkpOwogICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlID0gKHJvbGUgPT0gQXR0cmlidXRlczo6cm9sZVNvdXJjZSkgPwogICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgOiBBVURJT19QT1JUX1JPTEVfU0lOSzsKIAorICAgIGlmIChtSWdub3JlVmVuZG9yRXh0ZW5zaW9ucyAmJiBtYXliZVZlbmRvckV4dGVuc2lvbih0eXBlTmFtZSkpIHsKKyAgICAgICAgQUxPR0koIiVzOiB2ZW5kb3IgZXh0ZW5zaW9uIGRldmljZSB0eXBlIFwiJXNcIiBza2lwcGVkIiwgX19mdW5jX18sIHR5cGVOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CiAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICBpZiAoIWRldmljZUZyb21TdHJpbmcodHlwZU5hbWUsIHR5cGUpIHx8CisgICAgaWYgKCFEZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcodHlwZU5hbWUsIHR5cGUpIHx8CiAgICAgICAgICAgICAoIWF1ZGlvX2lzX2lucHV0X2RldmljZSh0eXBlKSAmJiBwb3J0Um9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB8fAogICAgICAgICAgICAgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlcyh0eXBlKSAmJiBwb3J0Um9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykpIHsKICAgICAgICAgQUxPR1coIiVzOiBiYWQgdHlwZSAlMDh4IiwgX19mdW5jX18sIHR5cGUpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBzdGQ6OnN0cmluZyBlbmNvZGVkRm9ybWF0c0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjplbmNvZGVkRm9ybWF0cyk7CiAgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6OmVuY29kZWRGb3JtYXRzLCBlbmNvZGVkRm9ybWF0c0xpdGVyYWwuY19zdHIoKSk7CkBAIC01MTQsMTIgKzU0MSwxMyBAQAogICAgICAgICBlbmNvZGVkRm9ybWF0cyA9IGZvcm1hdHNGcm9tU3RyaW5nKGVuY29kZWRGb3JtYXRzTGl0ZXJhbCwgIiAiKTsKICAgICB9CiAgICAgc3RkOjpzdHJpbmcgYWRkcmVzcyA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OmFkZHJlc3MpOwotICAgIEVsZW1lbnQgZGV2aWNlRGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKHR5cGUsIG5hbWUsIGFkZHJlc3MsIGVuY29kZWRGb3JtYXRzKTsKKyAgICBEZXZpY2VQb3J0VHJhaXRzOjpFbGVtZW50IGRldmljZURlc2MgPQorICAgICAgICAgICAgbmV3IERldmljZURlc2NyaXB0b3IodHlwZSwgbmFtZSwgYWRkcmVzcywgZW5jb2RlZEZvcm1hdHMpOwogCiAgICAgQXVkaW9Qcm9maWxlVHJhaXRzOjpDb2xsZWN0aW9uIHByb2ZpbGVzOwogICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb1Byb2ZpbGVUcmFpdHM+KGN1ciwgJnByb2ZpbGVzLCBOVUxMKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIGlmIChwcm9maWxlcy5lbXB0eSgpKSB7CiAgICAgICAgIHByb2ZpbGVzLmFkZChBdWRpb1Byb2ZpbGU6OmNyZWF0ZUZ1bGxEeW5hbWljKGdEeW5hbWljRm9ybWF0KSk7CkBAIC01MzIsNDMgKzU2MCw1MSBAQAogICAgIC8vIERlc2VyaWFsaXplIEF1ZGlvR2FpbiBjaGlsZHJlbgogICAgIHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb0dhaW5UcmFpdHM+KGN1ciwgJmRldmljZURlc2MtPm1HYWlucywgTlVMTCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICBBTE9HVigiJXM6IGFkZGluZyBkZXZpY2UgdGFnICVzIHR5cGUgJTA4eCBhZGRyZXNzICVzIiwgX19mdW5jX18sCiAgICAgICAgICAgZGV2aWNlRGVzYy0+Z2V0TmFtZSgpLmNfc3RyKCksIHR5cGUsIGRldmljZURlc2MtPmFkZHJlc3MoKS5jX3N0cigpKTsKICAgICByZXR1cm4gZGV2aWNlRGVzYzsKIH0KIAotUmV0dXJuPFJvdXRlVHJhaXRzOjpFbGVtZW50PiBSb3V0ZVRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBjdHgpCit0ZW1wbGF0ZTw+CitzdGQ6OnZhcmlhbnQ8c3RhdHVzX3QsIFJvdXRlVHJhaXRzOjpFbGVtZW50PiBQb2xpY3lTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZTxSb3V0ZVRyYWl0cz4oCisgICAgICAgIGNvbnN0IHhtbE5vZGUgKmN1ciwgUm91dGVUcmFpdHM6OlB0clNlcmlhbGl6aW5nQ3R4IGN0eCkKIHsKKyAgICB1c2luZyBBdHRyaWJ1dGVzID0gUm91dGVUcmFpdHM6OkF0dHJpYnV0ZXM7CisKICAgICBzdGQ6OnN0cmluZyB0eXBlID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6dHlwZSk7CiAgICAgaWYgKHR5cGUuZW1wdHkoKSkgewogICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnR5cGUpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBhdWRpb19yb3V0ZV90eXBlX3Qgcm91dGVUeXBlID0gKHR5cGUgPT0gQXR0cmlidXRlczo6dHlwZU1peCkgPwogICAgICAgICAgICAgICAgIEFVRElPX1JPVVRFX01JWCA6IEFVRElPX1JPVVRFX01VWDsKIAotICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjp0eXBlLCB0eXBlLmNfc3RyKCkpOwotICAgIEVsZW1lbnQgcm91dGUgPSBuZXcgQXVkaW9Sb3V0ZShyb3V0ZVR5cGUpOworICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgUm91dGVUcmFpdHM6OnRhZywgQXR0cmlidXRlczo6dHlwZSwgdHlwZS5jX3N0cigpKTsKKyAgICBSb3V0ZVRyYWl0czo6RWxlbWVudCByb3V0ZSA9IG5ldyBBdWRpb1JvdXRlKHJvdXRlVHlwZSk7CiAKICAgICBzdGQ6OnN0cmluZyBzaW5rQXR0ciA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnNpbmspOwogICAgIGlmIChzaW5rQXR0ci5lbXB0eSgpKSB7CiAgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6c2luayk7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIC8vIENvbnZlcnQgU2luayBuYW1lIHRvIHBvcnQgcG9pbnRlcgogICAgIHNwPFBvbGljeUF1ZGlvUG9ydD4gc2luayA9IGN0eC0+ZmluZFBvcnRCeVRhZ05hbWUoc2lua0F0dHIpOwotICAgIGlmIChzaW5rID09IE5VTEwpIHsKKyAgICBpZiAoc2luayA9PSBOVUxMICYmICFtSWdub3JlVmVuZG9yRXh0ZW5zaW9ucykgewogICAgICAgICBBTE9HRSgiJXM6IG5vIHNpbmsgZm91bmQgd2l0aCBuYW1lPSVzIiwgX19mdW5jX18sIHNpbmtBdHRyLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAoc2luayA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJTa2lwcGluZyByb3V0ZSB0byBzaW5rIFwiJXNcIiBhcyBpdCBsaWtlbHkgaGFzIHZlbmRvciBleHRlbnNpb24gdHlwZSIsCisgICAgICAgICAgICAgICAgc2lua0F0dHIuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICByb3V0ZS0+c2V0U2luayhzaW5rKTsKIAogICAgIHN0ZDo6c3RyaW5nIHNvdXJjZXNBdHRyID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c291cmNlcyk7CiAgICAgaWYgKHNvdXJjZXNBdHRyLmVtcHR5KCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpzb3VyY2VzKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gVG9rZW5pemUgYW5kIENvbnZlcnQgU291cmNlcyBuYW1lIHRvIHBvcnQgcG9pbnRlcgogICAgIFBvbGljeUF1ZGlvUG9ydFZlY3RvciBzb3VyY2VzOwpAQCAtNTc4LDExICs2MTQsMTUgQEAKICAgICB3aGlsZSAoZGV2VGFnICE9IE5VTEwpIHsKICAgICAgICAgaWYgKHN0cmxlbihkZXZUYWcpICE9IDApIHsKICAgICAgICAgICAgIHNwPFBvbGljeUF1ZGlvUG9ydD4gc291cmNlID0gY3R4LT5maW5kUG9ydEJ5VGFnTmFtZShkZXZUYWcpOwotICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoc291cmNlID09IE5VTEwgJiYgIW1JZ25vcmVWZW5kb3JFeHRlbnNpb25zKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBubyBzb3VyY2UgZm91bmQgd2l0aCBuYW1lPSVzIiwgX19mdW5jX18sIGRldlRhZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJTa2lwcGluZyByb3V0ZSBzb3VyY2UgXCIlc1wiIGFzIGl0IGxpa2VseSBoYXMgdmVuZG9yIGV4dGVuc2lvbiB0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldlRhZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNvdXJjZXMuYWRkKHNvdXJjZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzb3VyY2VzLmFkZChzb3VyY2UpOwogICAgICAgICB9CiAgICAgICAgIGRldlRhZyA9IHN0cnRvayhOVUxMLCAiLCIpOwogICAgIH0KQEAgLTU5NiwxMiArNjM2LDIwIEBACiAgICAgcmV0dXJuIHJvdXRlOwogfQogCi1SZXR1cm48TW9kdWxlVHJhaXRzOjpFbGVtZW50PiBNb2R1bGVUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggY3R4KQordGVtcGxhdGU8Pgorc3RkOjp2YXJpYW50PHN0YXR1c190LCBNb2R1bGVUcmFpdHM6OkVsZW1lbnQ+IFBvbGljeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplPE1vZHVsZVRyYWl0cz4oCisgICAgICAgIGNvbnN0IHhtbE5vZGUgKmN1ciwgTW9kdWxlVHJhaXRzOjpQdHJTZXJpYWxpemluZ0N0eCBjdHgpCiB7CisgICAgdXNpbmcgQXR0cmlidXRlcyA9IE1vZHVsZVRyYWl0czo6QXR0cmlidXRlczsKKyAgICBhdXRvJiB0YWcgPSBNb2R1bGVUcmFpdHM6OnRhZzsKKyAgICBhdXRvJiBjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZyA9IE1vZHVsZVRyYWl0czo6Y2hpbGRBdHRhY2hlZERldmljZXNUYWc7CisgICAgYXV0byYgY2hpbGRBdHRhY2hlZERldmljZVRhZyA9IE1vZHVsZVRyYWl0czo6Y2hpbGRBdHRhY2hlZERldmljZVRhZzsKKyAgICBhdXRvJiBjaGlsZERlZmF1bHRPdXRwdXREZXZpY2VUYWcgPSBNb2R1bGVUcmFpdHM6OmNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZzsKKwogICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpuYW1lKTsKICAgICBpZiAobmFtZS5lbXB0eSgpKSB7CiAgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6bmFtZSk7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIHVpbnQzMl90IHZlcnNpb25NYWpvciA9IDAsIHZlcnNpb25NaW5vciA9IDA7CiAgICAgc3RkOjpzdHJpbmcgdmVyc2lvbkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjp2ZXJzaW9uKTsKQEAgLTYxMSwyOSArNjU5LDI5IEBACiAgICAgICAgICAgICAgIHZlcnNpb25NYWpvciwgdmVyc2lvbk1ham9yKTsKICAgICB9CiAKLSAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKKyAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIE1vZHVsZVRyYWl0czo6dGFnLCBBdHRyaWJ1dGVzOjpuYW1lLCBuYW1lLmNfc3RyKCkpOwogCi0gICAgRWxlbWVudCBtb2R1bGUgPSBuZXcgSHdNb2R1bGUobmFtZS5jX3N0cigpLCB2ZXJzaW9uTWFqb3IsIHZlcnNpb25NaW5vcik7CisgICAgTW9kdWxlVHJhaXRzOjpFbGVtZW50IG1vZHVsZSA9IG5ldyBId01vZHVsZShuYW1lLmNfc3RyKCksIHZlcnNpb25NYWpvciwgdmVyc2lvbk1pbm9yKTsKIAotICAgIC8vIERlc2VyaWFsaXplIGNoaWxkcmVuczogQXVkaW8gTWl4IFBvcnQsIEF1ZGlvIERldmljZSBQb3J0cyAoU291cmNlL1NpbmspLCBBdWRpbyBSb3V0ZXMKKyAgICAvLyBEZXNlcmlhbGl6ZSBjaGlsZHJlbjogQXVkaW8gTWl4IFBvcnQsIEF1ZGlvIERldmljZSBQb3J0cyAoU291cmNlL1NpbmspLCBBdWRpbyBSb3V0ZXMKICAgICBNaXhQb3J0VHJhaXRzOjpDb2xsZWN0aW9uIG1peFBvcnRzOwogICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxNaXhQb3J0VHJhaXRzPihjdXIsICZtaXhQb3J0cywgTlVMTCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICBtb2R1bGUtPnNldFByb2ZpbGVzKG1peFBvcnRzKTsKIAogICAgIERldmljZVBvcnRUcmFpdHM6OkNvbGxlY3Rpb24gZGV2aWNlUG9ydHM7CiAgICAgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPERldmljZVBvcnRUcmFpdHM+KGN1ciwgJmRldmljZVBvcnRzLCBOVUxMKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIG1vZHVsZS0+c2V0RGVjbGFyZWREZXZpY2VzKGRldmljZVBvcnRzKTsKIAogICAgIFJvdXRlVHJhaXRzOjpDb2xsZWN0aW9uIHJvdXRlczsKICAgICBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Um91dGVUcmFpdHM+KGN1ciwgJnJvdXRlcywgbW9kdWxlLmdldCgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIG1vZHVsZS0+c2V0Um91dGVzKHJvdXRlcyk7CiAKQEAgLTY1Myw2ICs3MDEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUZyb21UYWdOYW1lKHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hlZERldmljZS5nZXQoKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0ciAmJiBtSWdub3JlVmVuZG9yRXh0ZW5zaW9ucykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJTa2lwcGVkIGF0dGFjaGVkIGRldmljZSBcIiVzXCIgYmVjYXVzZSBpdCBsaWtlbHkgdXNlcyBhIHZlbmRvciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHRlbnNpb24gdHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihhdHRhY2hlZERldmljZS5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5hZGREZXZpY2UoZGV2aWNlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTY3OCwxMCArNzMyLDE1IEBACiAgICAgcmV0dXJuIG1vZHVsZTsKIH0KIAotc3RhdHVzX3QgR2xvYmFsQ29uZmlnVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQordGVtcGxhdGU8Pgorc3RkOjp2YXJpYW50PHN0YXR1c190LCBHbG9iYWxDb25maWdUcmFpdHM6OkVsZW1lbnQ+CitQb2xpY3lTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZTxHbG9iYWxDb25maWdUcmFpdHM+KAorICAgICAgICBjb25zdCB4bWxOb2RlICpyb290LCBHbG9iYWxDb25maWdUcmFpdHM6OlB0clNlcmlhbGl6aW5nQ3R4IGNvbmZpZykKIHsKKyAgICB1c2luZyBBdHRyaWJ1dGVzID0gR2xvYmFsQ29uZmlnVHJhaXRzOjpBdHRyaWJ1dGVzOworCiAgICAgZm9yIChjb25zdCB4bWxOb2RlICpjdXIgPSByb290LT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKLSAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPih0YWcpKSkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KEdsb2JhbENvbmZpZ1RyYWl0czo6dGFnKSkpIHsKICAgICAgICAgICAgIGJvb2wgdmFsdWU7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBhdHRyID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c3BlYWtlckRyY0VuYWJsZWQpOwogICAgICAgICAgICAgaWYgKCFhdHRyLmVtcHR5KCkgJiYKQEAgLTcwMywxMiArNzYyLDE1IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBTdXJyb3VuZFNvdW5kVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQordGVtcGxhdGU8Pgorc3RkOjp2YXJpYW50PHN0YXR1c190LCBTdXJyb3VuZFNvdW5kVHJhaXRzOjpFbGVtZW50PgorUG9saWN5U2VyaWFsaXplcjo6ZGVzZXJpYWxpemU8U3Vycm91bmRTb3VuZFRyYWl0cz4oCisgICAgICAgIGNvbnN0IHhtbE5vZGUgKnJvb3QsIFN1cnJvdW5kU291bmRUcmFpdHM6OlB0clNlcmlhbGl6aW5nQ3R4IGNvbmZpZykKIHsKICAgICBjb25maWctPnNldERlZmF1bHRTdXJyb3VuZEZvcm1hdHMoKTsKIAogICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY3VyID0gcm9vdC0+eG1sQ2hpbGRyZW5Ob2RlOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7Ci0gICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4odGFnKSkpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihTdXJyb3VuZFNvdW5kVHJhaXRzOjp0YWcpKSkgewogICAgICAgICAgICAgQXVkaW9Qb2xpY3lDb25maWc6OlN1cnJvdW5kRm9ybWF0cyBmb3JtYXRzOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHM+KAogICAgICAgICAgICAgICAgICAgICBjdXIsICZmb3JtYXRzLCBudWxscHRyKTsKQEAgLTcyMSwyMCArNzgzLDI5IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1SZXR1cm48U3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0czo6RWxlbWVudD4gU3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0czo6ZGVzZXJpYWxpemUoCi0gICAgICAgIGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKK3RlbXBsYXRlPD4KK3N0ZDo6dmFyaWFudDxzdGF0dXNfdCwgU3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0czo6RWxlbWVudD4KK1BvbGljeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplPFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHM+KAorICAgICAgICBjb25zdCB4bWxOb2RlICpjdXIsIFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHM6OlB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCiB7CisgICAgdXNpbmcgQXR0cmlidXRlcyA9IFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHM6OkF0dHJpYnV0ZXM7CisKICAgICBzdGQ6OnN0cmluZyBmb3JtYXRMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bmFtZSk7CiAgICAgaWYgKGZvcm1hdExpdGVyYWwuZW1wdHkoKSkgewogICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIGZvciBhIHN1cnJvdW5kIGZvcm1hdCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKG1JZ25vcmVWZW5kb3JFeHRlbnNpb25zICYmIG1heWJlVmVuZG9yRXh0ZW5zaW9uKGZvcm1hdExpdGVyYWwpKSB7CisgICAgICAgIEFMT0dJKCIlczogdmVuZG9yIGV4dGVuc2lvbiBmb3JtYXQgXCIlc1wiIHNraXBwZWQiLCBfX2Z1bmNfXywgZm9ybWF0TGl0ZXJhbC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IGZvcm1hdEZyb21TdHJpbmcoZm9ybWF0TGl0ZXJhbCk7CiAgICAgaWYgKGZvcm1hdCA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgewogICAgICAgICBBTE9HRSgiJXM6IFVucmVjb2duaXplZCBmb3JtYXQgJXMiLCBfX2Z1bmNfXywgZm9ybWF0TGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgRWxlbWVudCBwYWlyID0gc3RkOjptYWtlX3BhaXIoZm9ybWF0LCBDb2xsZWN0aW9uOjptYXBwZWRfdHlwZXt9KTsKKyAgICBTdXJyb3VuZFNvdW5kRm9ybWF0VHJhaXRzOjpFbGVtZW50IHBhaXIgPSBzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgIGZvcm1hdCwgU3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0czo6Q29sbGVjdGlvbjo6bWFwcGVkX3R5cGV7fSk7CiAKICAgICBzdGQ6OnN0cmluZyBzdWJmb3JtYXRzTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnN1YmZvcm1hdHMpOwogICAgIGlmIChzdWJmb3JtYXRzTGl0ZXJhbC5lbXB0eSgpKSByZXR1cm4gcGFpcjsKQEAgLTc0MywxNCArODE0LDE2IEBACiAgICAgICAgIGF1dG8gcmVzdWx0ID0gcGFpci5zZWNvbmQuaW5zZXJ0KHN1YmZvcm1hdCk7CiAgICAgICAgIGlmICghcmVzdWx0LnNlY29uZCkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgYWRkIHN1YmZvcm1hdCAleCB0byBjb2xsZWN0aW9uIiwgX19mdW5jX18sIHN1YmZvcm1hdCk7Ci0gICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcGFpcjsKIH0KIAotc3RhdHVzX3QgUG9saWN5U2VyaWFsaXplcjo6ZGVzZXJpYWxpemUoY29uc3QgY2hhciAqY29uZmlnRmlsZSwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZykKK3N0YXR1c190IFBvbGljeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplKGNvbnN0IGNoYXIgKmNvbmZpZ0ZpbGUsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlnbm9yZVZlbmRvckV4dGVuc2lvbnMpCiB7CisgICAgbUlnbm9yZVZlbmRvckV4dGVuc2lvbnMgPSBpZ25vcmVWZW5kb3JFeHRlbnNpb25zOwogICAgIGF1dG8gZG9jID0gbWFrZV94bWxVbmlxdWUoeG1sUGFyc2VGaWxlKGNvbmZpZ0ZpbGUpKTsKICAgICBpZiAoZG9jID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgcGFyc2UgJXMgZG9jdW1lbnQuIiwgX19mdW5jX18sIGNvbmZpZ0ZpbGUpOwpAQCAtNzc2LDEyICs4NDksMTQgQEAKICAgICAgICAgQUxPR0UoIiVzOiBObyB2ZXJzaW9uIGZvdW5kIGluIHJvb3Qgbm9kZSAlcyIsIF9fZnVuY19fLCByb290TmFtZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGlmICh2ZXJzaW9uICE9IG1WZXJzaW9uKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVmVyc2lvbiBkb2VzIG5vdCBtYXRjaDsgZXhwZWN0ICVzIGdvdCAlcyIsIF9fZnVuY19fLCBtVmVyc2lvbi5jX3N0cigpLAotICAgICAgICAgICAgICB2ZXJzaW9uLmNfc3RyKCkpOworICAgIGlmICh2ZXJzaW9uID09ICI3LjAiKSB7CisgICAgICAgIG1DaGFubmVsTWFza3NTZXBhcmF0b3IgPSBtU2FtcGxpbmdSYXRlc1NlcGFyYXRvciA9IG1GbGFnc1NlcGFyYXRvciA9ICIgIjsKKyAgICB9IGVsc2UgaWYgKHZlcnNpb24gIT0gIjEuMCIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBWZXJzaW9uIGRvZXMgbm90IG1hdGNoOyBleHBlY3RlZCBcIjEuMFwiIG9yIFwiNy4wXCIgZ290IFwiJXNcIiIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHZlcnNpb24uY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIC8vIExldHMgZGVzZXJpYWxpemUgY2hpbGRyZW4KKyAgICAvLyBMZXQncyBkZXNlcmlhbGl6ZSBjaGlsZHJlbgogICAgIC8vIE1vZHVsZXMKICAgICBNb2R1bGVUcmFpdHM6OkNvbGxlY3Rpb24gbW9kdWxlczsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248TW9kdWxlVHJhaXRzPihyb290LCAmbW9kdWxlcywgY29uZmlnKTsKQEAgLTc5MSwxMCArODY2LDEwIEBACiAgICAgY29uZmlnLT5zZXRId01vZHVsZXMobW9kdWxlcyk7CiAKICAgICAvLyBHbG9iYWwgQ29uZmlndXJhdGlvbgotICAgIEdsb2JhbENvbmZpZ1RyYWl0czo6ZGVzZXJpYWxpemUocm9vdCwgY29uZmlnKTsKKyAgICBkZXNlcmlhbGl6ZTxHbG9iYWxDb25maWdUcmFpdHM+KHJvb3QsIGNvbmZpZyk7CiAKICAgICAvLyBTdXJyb3VuZCBjb25maWd1cmF0aW9uCi0gICAgU3Vycm91bmRTb3VuZFRyYWl0czo6ZGVzZXJpYWxpemUocm9vdCwgY29uZmlnKTsKKyAgICBkZXNlcmlhbGl6ZTxTdXJyb3VuZFNvdW5kVHJhaXRzPihyb290LCBjb25maWcpOwogCiAgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOwogfQpAQCAtODA0LDcgKzg3OSwxNyBAQAogc3RhdHVzX3QgZGVzZXJpYWxpemVBdWRpb1BvbGljeUZpbGUoY29uc3QgY2hhciAqZmlsZU5hbWUsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpCiB7CiAgICAgUG9saWN5U2VyaWFsaXplciBzZXJpYWxpemVyOwotICAgIHJldHVybiBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGZpbGVOYW1lLCBjb25maWcpOworICAgIHN0YXR1c190IHN0YXR1cyA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZmlsZU5hbWUsIGNvbmZpZyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgY29uZmlnLT5jbGVhcigpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lGaWxlRm9yVnRzKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQoreworICAgIFBvbGljeVNlcmlhbGl6ZXIgc2VyaWFsaXplcjsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGZpbGVOYW1lLCBjb25maWcsIHRydWUgLyppZ25vcmVWZW5kb3JFeHRlbnNpb25zKi8pOworICAgIGlmIChzdGF0dXMgIT0gT0spIGNvbmZpZy0+Y2xlYXIoKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9BbmRyb2lkLmJwCmluZGV4IGY0NjEwYmIuLjY3MWIzMGEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9BbmRyb2lkLmJwCkBAIC0xNyw2ICsxNywxNSBAQAogc29vbmdfbmFtZXNwYWNlIHsKIH0KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBwcmVidWlsdF9ldGMgewogICAgIG5hbWU6ICJhMmRwX2luX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIsCiAgICAgdmVuZG9yOiB0cnVlLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2EyZHBfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hMmRwX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQzMjNmNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hMmRwX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwKQEAgLTAsMCArMSw0NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQTJkcCBBdWRpbyBIQUwgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSAtLT4KKzxtb2R1bGUgbmFtZT0iYTJkcCIgaGFsVmVyc2lvbj0iMi4wIj4KKyAgICA8bWl4UG9ydHM+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImEyZHAgb3V0cHV0IiByb2xlPSJzb3VyY2UiLz4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0iYTJkcCBpbnB1dCIgcm9sZT0ic2luayI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0NDEwMCA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICA8L21peFBvcnRzPgorICAgIDxkZXZpY2VQb3J0cz4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgQTJEUCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDQxMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEEyRFAgSGVhZHBob25lcyIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ0MTAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBBMkRQIFNwZWFrZXIiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiIgcm9sZT0ic2luayI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0NDEwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgQTJEUCBJbiIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQIiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyBBVURJT19DSEFOTkVMX0lOX1NURVJFTyIvPgorICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgPC9kZXZpY2VQb3J0cz4KKyAgICA8cm91dGVzPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBBMkRQIE91dCIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEEyRFAgSGVhZHBob25lcyIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEEyRFAgU3BlYWtlciIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9ImEyZHAgaW5wdXQiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJCVCBBMkRQIEluIi8+CisgICAgPC9yb3V0ZXM+Cis8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hMmRwX2luX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYTJkcF9pbl9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1OWFkNzAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYTJkcF9pbl9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIEJsdWV0b290aCBJbnB1dCBBdWRpbyBIQUwgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSAtLT4KKzxtb2R1bGUgbmFtZT0iYTJkcCIgaGFsVmVyc2lvbj0iMi4wIj4KKyAgICA8bWl4UG9ydHM+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImEyZHAgaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyBBVURJT19DSEFOTkVMX0lOX1NURVJFTyIvPgorICAgICAgICA8L21peFBvcnQ+CisgICAgPC9taXhQb3J0cz4KKyAgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEEyRFAgSW4iIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgIDwvZGV2aWNlUG9ydHM+CisgICAgPHJvdXRlcz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iYTJkcCBpbnB1dCIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9IkJUIEEyRFAgSW4iLz4KKyAgICA8L3JvdXRlcz4KKzwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKaW5kZXggYjI4MzgxYi4uZGNkYzAzNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCkBAIC05MSw3ICs5MSw3IEBACiAgICAgICAgICAgICAgICAgPCEtLSBPdXRwdXQgZGV2aWNlcyBkZWNsYXJhdGlvbiwgaS5lLiBTaW5rIERFVklDRSBQT1JUIC0tPgogICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkVhcnBpZWNlIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFIiByb2xlPSJzaW5rIj4KICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyIvPgogICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KICAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJTcGVha2VyIiByb2xlPSJzaW5rIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIiIGFkZHJlc3M9IiI+CiAgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk2MWEwMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCkBAIC0wLDAgKzEsMjExIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxhdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24gdmVyc2lvbj0iNy4wIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisgICAgPCEtLSB2ZXJzaW9uIHNlY3Rpb24gY29udGFpbnMgYSDigJx2ZXJzaW9u4oCdIHRhZyBpbiB0aGUgZm9ybSDigJxtYWpvci5taW5vcuKAnSBlLmcgdmVyc2lvbj3igJ0xLjDigJ0gLS0+CisKKyAgICA8IS0tIEdsb2JhbCBjb25maWd1cmF0aW9uIERlY2FsYXJhdGlvbiAtLT4KKyAgICA8Z2xvYmFsQ29uZmlndXJhdGlvbiBzcGVha2VyX2RyY19lbmFibGVkPSJ0cnVlIi8+CisKKworICAgIDwhLS0gTW9kdWxlcyBzZWN0aW9uOgorICAgICAgICBUaGVyZSBpcyBvbmUgc2VjdGlvbiBwZXIgYXVkaW8gSFcgbW9kdWxlIHByZXNlbnQgb24gdGhlIHBsYXRmb3JtLgorICAgICAgICBFYWNoIG1vZHVsZSBzZWN0aW9uIHdpbGwgY29udGFpbnMgdHdvIG1hbmRhdG9yeSB0YWdzIGZvciBhdWRpbyBIQUwg4oCcaGFsVmVyc2lvbuKAnSBhbmQg4oCcbmFtZeKAnS4KKyAgICAgICAgVGhlIG1vZHVsZSBuYW1lcyBhcmUgdGhlIHNhbWUgYXMgaW4gY3VycmVudCAuY29uZiBmaWxlOgorICAgICAgICAgICAgICAgIOKAnHByaW1hcnnigJ0sIOKAnEEyRFDigJ0sIOKAnHJlbW90ZV9zdWJtaXjigJ0sIOKAnFVTQuKAnQorICAgICAgICBFYWNoIG1vZHVsZSB3aWxsIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9uczoKKyAgICAgICAg4oCcZGV2aWNlUG9ydHPigJ06IGEgbGlzdCBvZiBkZXZpY2UgZGVzY3JpcHRvcnMgZm9yIGFsbCBpbnB1dCBhbmQgb3V0cHV0IGRldmljZXMgYWNjZXNzaWJsZSB2aWEgdGhpcworICAgICAgICBtb2R1bGUuCisgICAgICAgIFRoaXMgY29udGFpbnMgYm90aCBwZXJtYW5lbnRseSBhdHRhY2hlZCBkZXZpY2VzIGFuZCByZW1vdmFibGUgZGV2aWNlcy4KKyAgICAgICAg4oCcbWl4UG9ydHPigJ06IGxpc3RpbmcgYWxsIG91dHB1dCBhbmQgaW5wdXQgc3RyZWFtcyBleHBvc2VkIGJ5IHRoZSBhdWRpbyBIQUwKKyAgICAgICAg4oCccm91dGVz4oCdOiBsaXN0IG9mIHBvc3NpYmxlIGNvbm5lY3Rpb25zIGJldHdlZW4gaW5wdXQgYW5kIG91dHB1dCBkZXZpY2VzIG9yIGJldHdlZW4gc3RyZWFtIGFuZAorICAgICAgICBkZXZpY2VzLgorICAgICAgICAgICAgInJvdXRlIjogaXMgZGVmaW5lZCBieSBhbiBhdHRyaWJ1dGU6CisgICAgICAgICAgICAgICAgLSJ0eXBlIjogPG11eHxtaXg+IG1lYW5zIGFsbCBzb3VyY2VzIGFyZSBtdXR1YWwgZXhjbHVzaXZlIChtdXgpIG9yIGNhbiBiZSBtaXhlZCAobWl4KQorICAgICAgICAgICAgICAgIC0ic2luayI6IHRoZSBzaW5rIGludm9sdmVkIGluIHRoaXMgcm91dGUKKyAgICAgICAgICAgICAgICAtInNvdXJjZXMiOiBhbGwgdGhlIHNvdXJjZXMgdGhhbiBjYW4gYmUgY29ubmVjdGVkIHRvIHRoZSBzaW5rIHZpYSB2aXMgcm91dGUKKyAgICAgICAg4oCcYXR0YWNoZWREZXZpY2Vz4oCdOiBwZXJtYW5lbnRseSBhdHRhY2hlZCBkZXZpY2VzLgorICAgICAgICBUaGUgYXR0YWNoZWREZXZpY2VzIHNlY3Rpb24gaXMgYSBsaXN0IG9mIGRldmljZXMgbmFtZXMuIFRoZSBuYW1lcyBjb3JyZXNwb25kIHRvIGRldmljZSBuYW1lcworICAgICAgICBkZWZpbmVkIGluIDxkZXZpY2VQb3J0cz4gc2VjdGlvbi4KKyAgICAgICAg4oCcZGVmYXVsdE91dHB1dERldmljZeKAnTogZGV2aWNlIHRvIGJlIHVzZWQgYnkgZGVmYXVsdCB3aGVuIG5vIHBvbGljeSBydWxlIGFwcGxpZXMKKyAgICAtLT4KKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPCEtLSBQcmltYXJ5IEF1ZGlvIEhBTCAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJwcmltYXJ5IiBoYWxWZXJzaW9uPSIzLjAiPgorICAgICAgICAgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgICAgICAgICA8aXRlbT5TcGVha2VyPC9pdGVtPgorICAgICAgICAgICAgICAgIDxpdGVtPkJ1aWx0LUluIE1pYzwvaXRlbT4KKyAgICAgICAgICAgICAgICA8aXRlbT5CdWlsdC1JbiBCYWNrIE1pYzwvaXRlbT4KKyAgICAgICAgICAgIDwvYXR0YWNoZWREZXZpY2VzPgorICAgICAgICAgICAgPGRlZmF1bHRPdXRwdXREZXZpY2U+U3BlYWtlcjwvZGVmYXVsdE91dHB1dERldmljZT4KKyAgICAgICAgICAgIDxtaXhQb3J0cz4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJwcmltYXJ5IG91dHB1dCIgcm9sZT0ic291cmNlIiBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9ImRlZXBfYnVmZmVyIiByb2xlPSJzb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJjb21wcmVzc2VkX29mZmxvYWQiIHJvbGU9InNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgQVVESU9fT1VUUFVUX0ZMQUdfTk9OX0JMT0NLSU5HIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9NUDMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTEwMjUgMTIwMDAgMTYwMDAgMjIwNTAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIEFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9BQUMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTEwMjUgMTIwMDAgMTYwMDAgMjIwNTAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIEFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9BQUNfTEMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTEwMjUgMTIwMDAgMTYwMDAgMjIwNTAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIEFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L21peFBvcnQ+CisgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0idm9pY2VfdHgiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9InByaW1hcnkgaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTEwMjUgMTIwMDAgMTYwMDAgMjIwNTAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJ2b2ljZV9yeCIgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L21peFBvcnQ+CisgICAgICAgICAgICA8L21peFBvcnRzPgorICAgICAgICAgICAgPGRldmljZVBvcnRzPgorICAgICAgICAgICAgICAgIDwhLS0gT3V0cHV0IGRldmljZXMgZGVjbGFyYXRpb24sIGkuZS4gU2luayBERVZJQ0UgUE9SVCAtLT4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJFYXJwaWVjZSIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSIgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iU3BlYWtlciIgcm9sZT0ic2luayIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9TUEVBS0VSIiBhZGRyZXNzPSIiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgICAgICAgICA8Z2FpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z2FpbiBuYW1lPSJnYWluXzEiIG1vZGU9IkFVRElPX0dBSU5fTU9ERV9KT0lOVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblZhbHVlTUI9Ii04NDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWVNQj0iNDAwMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZU1CPSIwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFZhbHVlTUI9IjEwMCIvPgorICAgICAgICAgICAgICAgICAgICA8L2dhaW5zPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJXaXJlZCBIZWFkc2V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJXaXJlZCBIZWFkcGhvbmVzIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSIgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIFNDTyIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDE2MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgU0NPIEhlYWRzZXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDE2MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgU0NPIENhciBLaXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTYwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyIvPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJUZWxlcGhvbnkgVHgiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDE2MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisKKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCdWlsdC1JbiBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDExMDI1IDEyMDAwIDE2MDAwIDIyMDUwIDI0MDAwIDMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyBBVURJT19DSEFOTkVMX0lOX1NURVJFTyBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0siLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQnVpbHQtSW4gQmFjayBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CQUNLX01JQyIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDExMDI1IDEyMDAwIDE2MDAwIDIyMDUwIDI0MDAwIDMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyBBVURJT19DSEFOTkVMX0lOX1NURVJFTyBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0siLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iV2lyZWQgSGVhZHNldCBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUIiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTEwMjUgMTIwMDAgMTYwMDAgMjIwNTAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyIvPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBTQ08gSGVhZHNldCBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iVGVsZXBob255IFJ4IiB0eXBlPSJBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYIiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTYwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIi8+CisgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgPC9kZXZpY2VQb3J0cz4KKyAgICAgICAgICAgIDwhLS0gcm91dGUgZGVjbGFyYXRpb24sIGkuZS4gbGlzdCBhbGwgYXZhaWxhYmxlIHNvdXJjZXMgZm9yIGEgZ2l2ZW4gc2luayAtLT4KKyAgICAgICAgICAgIDxyb3V0ZXM+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iRWFycGllY2UiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9InByaW1hcnkgb3V0cHV0LGRlZXBfYnVmZmVyLEJUIFNDTyBIZWFkc2V0IE1pYyIvPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IlNwZWFrZXIiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9InByaW1hcnkgb3V0cHV0LGRlZXBfYnVmZmVyLGNvbXByZXNzZWRfb2ZmbG9hZCxCVCBTQ08gSGVhZHNldCBNaWMsVGVsZXBob255IFJ4Ii8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iV2lyZWQgSGVhZHNldCIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0icHJpbWFyeSBvdXRwdXQsZGVlcF9idWZmZXIsY29tcHJlc3NlZF9vZmZsb2FkLEJUIFNDTyBIZWFkc2V0IE1pYyxUZWxlcGhvbnkgUngiLz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJXaXJlZCBIZWFkcGhvbmVzIgorICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJwcmltYXJ5IG91dHB1dCxkZWVwX2J1ZmZlcixjb21wcmVzc2VkX29mZmxvYWQsQlQgU0NPIEhlYWRzZXQgTWljLFRlbGVwaG9ueSBSeCIvPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9InByaW1hcnkgaW5wdXQiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9IkJ1aWx0LUluIE1pYyxCdWlsdC1JbiBCYWNrIE1pYyxXaXJlZCBIZWFkc2V0IE1pYyxCVCBTQ08gSGVhZHNldCBNaWMiLz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJUZWxlcGhvbnkgVHgiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9IkJ1aWx0LUluIE1pYyxCdWlsdC1JbiBCYWNrIE1pYyxXaXJlZCBIZWFkc2V0IE1pYyxCVCBTQ08gSGVhZHNldCBNaWMsIHZvaWNlX3R4Ii8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0idm9pY2VfcngiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9IlRlbGVwaG9ueSBSeCIvPgorICAgICAgICAgICAgPC9yb3V0ZXM+CisKKyAgICAgICAgPC9tb2R1bGU+CisKKyAgICAgICAgPCEtLSBBMmRwIElucHV0IEF1ZGlvIEhBTCAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0iYTJkcF9pbl9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sIi8+CisKKyAgICAgICAgPCEtLSBVc2IgQXVkaW8gSEFMIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJ1c2JfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CisKKyAgICAgICAgPCEtLSBSZW1vdGUgU3VibWl4IEF1ZGlvIEhBTCAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0icl9zdWJtaXhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CisKKyAgICAgICAgPCEtLSBCbHVldG9vdGggQXVkaW8gSEFMIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJibHVldG9vdGhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbCIvPgorCisgICAgICAgIDwhLS0gTVNEIEF1ZGlvIEhBTCAob3B0aW9uYWwpIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJtc2RfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbCIvPgorCisgICAgPC9tb2R1bGVzPgorICAgIDwhLS0gRW5kIG9mIE1vZHVsZXMgc2VjdGlvbiAtLT4KKworICAgIDwhLS0gVm9sdW1lIHNlY3Rpb246CisgICAgICAgIElNUE9SVEFOVCBOT1RFOiBWb2x1bWUgdGFibGVzIGhhdmUgYmVlbiBtb3ZlZCB0byBlbmdpbmUgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIEtlZXAgaXQgaGVyZSBmb3IgbGVnYWN5LgorICAgICAgICAgICAgICAgICAgICAgICAgRW5naW5lIHdpbGwgZmFsbGJhY2sgb24gdGhlc2UgZmlsZXMgaWYgbm9uZSBhcmUgcHJvdmlkZWQgYnkgZW5naW5lLgorICAgICAtLT4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImRlZmF1bHRfdm9sdW1lX3RhYmxlcy54bWwiLz4KKworICAgIDwhLS0gRW5kIG9mIFZvbHVtZSBzZWN0aW9uIC0tPgorCisgICAgPCEtLSBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0ic3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIi8+CisKKyAgICA8IS0tIEVuZCBvZiBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCis8L2F1ZGlvUG9saWN5Q29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9ibHVldG9vdGhfbGVnYWN5X2hhbC54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fYmx1ZXRvb3RoX2xlZ2FjeV9oYWwueG1sCmluZGV4IGI0Y2MxZDMuLjVmNGU1ZjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9ibHVldG9vdGhfbGVnYWN5X2hhbC54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2JsdWV0b290aF9sZWdhY3lfaGFsLnhtbApAQCAtMTg1LDYgKzE4NSw5IEBACiAgICAgICAgIDwhLS0gSGVhcmluZyBhaWQgQXVkaW8gSEFMIC0tPgogICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJoZWFyaW5nX2FpZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KIAorICAgICAgICA8IS0tIExlIEF1ZGlvIEF1ZGlvIEhBTCAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0ibGVfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CisKICAgICAgICAgPCEtLSBNU0QgQXVkaW8gSEFMIChvcHRpb25hbCkgLS0+CiAgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9Im1zZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAppbmRleCBjZTc4ZWIwLi45ODQxNWI3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtMTAsNiArMTAsMTggQEAKICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjI0MDAwLDE2MDAwIgogICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICA8IS0tIExlIEF1ZGlvIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJsZSBhdWRpbyBvdXRwdXQiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwLDE2MDAwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTYwMDAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8zMl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwLDE2MDAwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L21peFBvcnQ+CiAgICAgPC9taXhQb3J0cz4KICAgICA8ZGV2aWNlUG9ydHM+CiAgICAgICAgIDwhLS0gQTJEUCBBdWRpbyBQb3J0cyAtLT4KQEAgLTMwLDYgKzQyLDEzIEBACiAgICAgICAgIDwvZGV2aWNlUG9ydD4KICAgICAgICAgPCEtLSBIZWFyaW5nIEFJRHMgQXVkaW8gUG9ydHMgLS0+CiAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEhlYXJpbmcgQWlkIE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCIgcm9sZT0ic2luayIvPgorICAgICAgICA8IS0tIEJMRSBBdWRpbyBQb3J0cyAtLT4KKyAgICAgICAgPCEtLSBOb3RlIHRoYXQgdGhlc2UgZGV2aWNlIHR5cGVzIGFyZSBub3QgdmFsaWQgaW4gSEFMIHZlcnNpb25zIDwgNy4gQW55IGRldmljZQorICAgICAgICAgICAgIHJ1bm5pbmcgcHJlLVY3IEhBTCBhbmQgdXNpbmcgdGhpcyBmaWxlIHdpbGwgbm90IHBhc3MgVlRTLiBOZWVkIHRvIHVzZQorICAgICAgICAgICAgIGJsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sIGluc3RlYWQuCisgICAgICAgIC0tPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCTEUgSGVhZHNldCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVQiIHJvbGU9InNpbmsiLz4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQkxFIFNwZWFrZXIgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMRV9TUEVBS0VSIiByb2xlPSJzaW5rIi8+CiAgICAgPC9kZXZpY2VQb3J0cz4KICAgICA8cm91dGVzPgogICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBBMkRQIE91dCIKQEAgLTQwLDUgKzU5LDkgQEAKICAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CiAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEhlYXJpbmcgQWlkIE91dCIKICAgICAgICAgICAgICAgIHNvdXJjZXM9ImhlYXJpbmcgYWlkIG91dHB1dCIvPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCTEUgSGVhZHNldCBPdXQiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJsZSBhdWRpbyBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQkxFIFNwZWFrZXIgT3V0IgorICAgICAgICAgICAgICAgc291cmNlcz0ibGUgYXVkaW8gb3V0cHV0Ii8+CiAgICAgPC9yb3V0ZXM+CiA8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9ibHVldG9vdGhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9ibHVldG9vdGhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmU3NTcxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCkBAIC0wLDAgKzEsNjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIEJsdWV0b290aCBBdWRpbyBIQUwgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSAtLT4KKzxtb2R1bGUgbmFtZT0iYmx1ZXRvb3RoIiBoYWxWZXJzaW9uPSIyLjAiPgorICAgIDxtaXhQb3J0cz4KKyAgICAgICAgPCEtLSBBMkRQIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJhMmRwIG91dHB1dCIgcm9sZT0ic291cmNlIi8+CisgICAgICAgIDwhLS0gSGVhcmluZyBBSURzIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJoZWFyaW5nIGFpZCBvdXRwdXQiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIyNDAwMCAxNjAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgPCEtLSBMZSBBdWRpbyBBdWRpbyBQb3J0cyAtLT4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibGUgYXVkaW8gb3V0cHV0IiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCAyNDAwMCAzMjAwMCA0NDEwMCA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDE2MDAwIDI0MDAwIDMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMzJfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCAyNDAwMCAzMjAwMCA0NDEwMCA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgIDwvbWl4UG9ydHM+CisgICAgPGRldmljZVBvcnRzPgorICAgICAgICA8IS0tIEEyRFAgQXVkaW8gUG9ydHMgLS0+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEEyRFAgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ0MTAwIDQ4MDAwIDg4MjAwIDk2MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBBMkRQIEhlYWRwaG9uZXMiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyIgcm9sZT0ic2luayI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0NDEwMCA0ODAwMCA4ODIwMCA5NjAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgQTJEUCBTcGVha2VyIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDQxMDAgNDgwMDAgODgyMDAgOTYwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgIDwhLS0gSGVhcmluZyBBSURzIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBIZWFyaW5nIEFpZCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQiIHJvbGU9InNpbmsiLz4KKyAgICAgICAgPCEtLSBCTEUgQXVkaW8gUG9ydHMgLS0+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJMRSBIZWFkc2V0IE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTEVfSEVBRFNFVCIgcm9sZT0ic2luayIvPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCTEUgU3BlYWtlciBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxFX1NQRUFLRVIiIHJvbGU9InNpbmsiLz4KKyAgICA8L2RldmljZVBvcnRzPgorICAgIDxyb3V0ZXM+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEEyRFAgT3V0IgorICAgICAgICAgICAgICAgc291cmNlcz0iYTJkcCBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgQTJEUCBIZWFkcGhvbmVzIgorICAgICAgICAgICAgICAgc291cmNlcz0iYTJkcCBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgQTJEUCBTcGVha2VyIgorICAgICAgICAgICAgICAgc291cmNlcz0iYTJkcCBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgSGVhcmluZyBBaWQgT3V0IgorICAgICAgICAgICAgICAgc291cmNlcz0iaGVhcmluZyBhaWQgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJMRSBIZWFkc2V0IE91dCIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImxlIGF1ZGlvIG91dHB1dCIvPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCTEUgU3BlYWtlciBPdXQiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJsZSBhdWRpbyBvdXRwdXQiLz4KKyAgICA8L3JvdXRlcz4KKzwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2hlYXJpbmdfYWlkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvaGVhcmluZ19haWRfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzM2NGU0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2hlYXJpbmdfYWlkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwKQEAgLTAsMCArMSwxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gSGVhcmluZyBhaWQgQXVkaW8gSEFMIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUgLS0+Cis8bW9kdWxlIG5hbWU9ImhlYXJpbmdfYWlkIiBoYWxWZXJzaW9uPSIyLjAiPgorICAgIDxtaXhQb3J0cz4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0iaGVhcmluZyBhaWQgb3V0cHV0IiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMjQwMDAgMTYwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L21peFBvcnQ+CisgICAgPC9taXhQb3J0cz4KKyAgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEhlYXJpbmcgQWlkIE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCIgcm9sZT0ic2luayIvPgorICAgIDwvZGV2aWNlUG9ydHM+CisgICAgPHJvdXRlcz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgSGVhcmluZyBBaWQgT3V0IiBzb3VyY2VzPSJoZWFyaW5nIGFpZCBvdXRwdXQiLz4KKyAgICA8L3JvdXRlcz4KKzwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2xlX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9sZV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkYzcyYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9sZV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gTGUgQXVkaW8gSEFMIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUgLS0+Cis8bW9kdWxlIG5hbWU9ImJsdWV0b290aCIgaGFsVmVyc2lvbj0iMi4xIj4KKyAgICA8bWl4UG9ydHM+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImxlIGF1ZGlvIG91dHB1dCIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCxBVURJT19GT1JNQVRfUENNXzI0X0JJVCxBVURJT19GT1JNQVRfUENNXzMyX0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTYwMDAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICA8L21peFBvcnRzPgorICAgIDxkZXZpY2VQb3J0cz4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQkxFIEhlYWRzZXQgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUIiByb2xlPSJzaW5rIi8+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJMRSBTcGVha2VyIE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTEVfU1BFQUtFUiIgcm9sZT0ic2luayIvPgorICAgIDwvZGV2aWNlUG9ydHM+CisgICAgPHJvdXRlcz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQkxFIEhlYWRzZXQgT3V0IiBzb3VyY2VzPSJsZSBhdWRpbyBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQkxFIFNwZWFrZXIgT3V0IiBzb3VyY2VzPSJsZSBhdWRpbyBvdXRwdXQiLz4KKyAgICA8L3JvdXRlcz4KKzwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL21zZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL21zZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNjdmMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwKQEAgLTAsMCArMSw3OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3LTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBNdWx0aSBTdHJlYW0gRGVjb2RlciBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBmaWxlIC0tPgorPG1vZHVsZSBuYW1lPSJtc2QiIGhhbFZlcnNpb249IjIuMCI+CisgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgPGl0ZW0+TVMxMiBJbnB1dDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+TVMxMiBPdXRwdXQ8L2l0ZW0+CisgICAgPC9hdHRhY2hlZERldmljZXM+CisgICAgPG1peFBvcnRzPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJtczEyIGlucHV0IiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibXMxMiBjb21wcmVzc2VkIGlucHV0IiByb2xlPSJzb3VyY2UiCisgICAgICAgICAgICAgICAgZmxhZ3M9IkFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORyI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEgQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDM19KT0MiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCA0NDEwMCA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDNCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgICAgICA8IS0tIFRoZSBIVyBBViBTeW5jIGZsYWcgaXMgbm90IHJlcXVpcmVkLCBidXQgaXMgcmVjb21tZW5kZWQgLS0+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9Im1zMTIgb3V0cHV0IiByb2xlPSJzaW5rIiBmbGFncz0iQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DIEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMSIvPgorICAgICAgICA8L21peFBvcnQ+CisgICA8L21peFBvcnRzPgorICAgPGRldmljZVBvcnRzPgorICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9Ik1TMTIgSW5wdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQlVTIiAgcm9sZT0ic2luayI+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUMzIgorICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCA0NDEwMCA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIi8+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfRV9BQzMiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEgQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDM19KT0MiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCA0NDEwMCA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUM0IgorICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCA0NDEwMCA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iTVMxMiBPdXRwdXQiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CVVMiICByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICA8L2RldmljZVBvcnRzPgorICAgIDxyb3V0ZXM+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Ik1TMTIgSW5wdXQiIHNvdXJjZXM9Im1zMTIgaW5wdXQsbXMxMiBjb21wcmVzc2VkIGlucHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Im1zMTIgb3V0cHV0IiBzb3VyY2VzPSJNUzEyIE91dHB1dCIvPgorICAgIDwvcm91dGVzPgorPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGE1NmIyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBEZWZhdWx0IFByaW1hcnkgQXVkaW8gSEFMIE1vZHVsZSBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBpbmNsdWRlIGZpbGUgLS0+Cis8bW9kdWxlIG5hbWU9InByaW1hcnkiIGhhbFZlcnNpb249IjIuMCI+CisgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgPGl0ZW0+U3BlYWtlcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0+QnVpbHQtSW4gTWljPC9pdGVtPgorICAgIDwvYXR0YWNoZWREZXZpY2VzPgorICAgIDxkZWZhdWx0T3V0cHV0RGV2aWNlPlNwZWFrZXI8L2RlZmF1bHRPdXRwdXREZXZpY2U+CisgICAgPG1peFBvcnRzPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJwcmltYXJ5IG91dHB1dCIgcm9sZT0ic291cmNlIiBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0NDEwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJwcmltYXJ5IGlucHV0IiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTYwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgIDwvbWl4UG9ydHM+CisgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IlNwZWFrZXIiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUiIgcm9sZT0ic2luayI+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKworICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCdWlsdC1JbiBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgIDwvZGV2aWNlUG9ydHM+CisgICAgPHJvdXRlcz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iU3BlYWtlciIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9InByaW1hcnkgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9InByaW1hcnkgaW5wdXQiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJCdWlsdC1JbiBNaWMiLz4KKyAgICA8L3JvdXRlcz4KKzwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9BbmRyb2lkLmJwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYTFjNjlmMi4uNTBjNWVhYgotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0xMiw2ICsxMiwxNSBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9oZWFkZXJzIHsKICAgICBuYW1lOiAibGliYXVkaW9wb2xpY3llbmdpbmVfY29tbW9uX2hlYWRlcnMiLAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0VuZ2luZUJhc2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9FbmdpbmVCYXNlLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA3ZjMzOWRjLi40NTEwZjYzCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9FbmdpbmVCYXNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0VuZ2luZUJhc2UuaApAQCAtOTMsMTMgKzkzLDEzIEBACiAKICAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKIAotICAgIHN0YXR1c190IHNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpIG92ZXJyaWRlOwogCi0gICAgc3RhdHVzX3QgcmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCByZW1vdmVEZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgZGV2aWNlX3JvbGVfdCByb2xlKSBvdmVycmlkZTsKIAotICAgIHN0YXR1c190IGdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkgY29uc3Qgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0RGV2aWNlc0ZvclJvbGVBbmRTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpIGNvbnN0IG92ZXJyaWRlOwogCiAgICAgZW5naW5lQ29uZmlnOjpQYXJzaW5nUmVzdWx0IGxvYWRBdWRpb1BvbGljeUVuZ2luZUNvbmZpZygpOwogCkBAIC0xMjcsMTEgKzEyNywzNiBAQAogCiAgICAgc3RhdHVzX3QgcmVzdG9yZU9yaWdpblZvbHVtZUN1cnZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKIAorICAgIHN0YXR1c190IHNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBhZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGRldmljZXMgcm9sZSBmb3IgY2FwdHVyZSBwcmVzZXQuIFdoZW4gYGZvcmNlTWF0Y2hlZGAgaXMgdHJ1ZSwgdGhlIGRldmljZXMgdG8gYmUKKyAgICAgKiByZW1vdmVkIG11c3QgYWxsIHNob3cgYXMgcm9sZSBmb3IgdGhlIGNhcHR1cmUgcHJlc2V0LiBPdGhlcndpc2UsIG9ubHkgZGV2aWNlcyB0aGF0IGhhcyBzaG93bgorICAgICAqIGFzIHJvbGUgZm9yIHRoZSBjYXB0dXJlIHByZXNldCB3aWxsIGJlIHJlbW92ZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBkb1JlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcywKKyAgICAgICAgICAgIGJvb2wgZm9yY2VNYXRjaGVkPXRydWUpOworCisgICAgc3RhdHVzX3QgcmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IGNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IGdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgY29uc3Qgb3ZlcnJpZGU7CisKIHByaXZhdGU6CiAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm1BcG1PYnNlcnZlciA9IG51bGxwdHI7CiAKICAgICBQcm9kdWN0U3RyYXRlZ3lNYXAgbVByb2R1Y3RTdHJhdGVnaWVzOwogICAgIFByb2R1Y3RTdHJhdGVneVByZWZlcnJlZFJvdXRpbmdNYXAgbVByb2R1Y3RTdHJhdGVneVByZWZlcnJlZERldmljZXM7CisgICAgQ2FwdHVyZVByZXNldERldmljZXNSb2xlTWFwIG1DYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGU7CiAgICAgVm9sdW1lR3JvdXBNYXAgbVZvbHVtZUdyb3VwczsKICAgICBMYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzIG1MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzOwogICAgIGF1ZGlvX21vZGVfdCBtUGhvbmVTdGF0ZSA9IEFVRElPX01PREVfTk9STUFMOyAgLyoqPCBjdXJyZW50IHBob25lIHN0YXRlLiAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0xhc3RSZW1vdmFibGVNZWRpYURldmljZXMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1Byb2R1Y3RTdHJhdGVneS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1Byb2R1Y3RTdHJhdGVneS5oCmluZGV4IDNlYmU3ZDEuLmM1MDU0NTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9Qcm9kdWN0U3RyYXRlZ3kuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvUHJvZHVjdFN0cmF0ZWd5LmgKQEAgLTI4LDggKzI4LDExIEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQXR0cmlidXRlcy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRGV2aWNlVHlwZUFkZHIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgogCisjaW5jbHVkZSA8dmVjdG9yPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8qKgpAQCAtMTY0LDcgKzE2Nyw4IEBACiAgICAgcHJvZHVjdF9zdHJhdGVneV90IG1EZWZhdWx0U3RyYXRlZ3kgPSBQUk9EVUNUX1NUUkFURUdZX05PTkU7CiB9OwogCi1jbGFzcyBQcm9kdWN0U3RyYXRlZ3lQcmVmZXJyZWRSb3V0aW5nTWFwIDogcHVibGljIHN0ZDo6bWFwPHByb2R1Y3Rfc3RyYXRlZ3lfdCwgQXVkaW9EZXZpY2VUeXBlQWRkcj4KK2NsYXNzIFByb2R1Y3RTdHJhdGVneVByZWZlcnJlZFJvdXRpbmdNYXAgOiBwdWJsaWMgc3RkOjptYXA8cHJvZHVjdF9zdHJhdGVneV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yPgogewogcHVibGljOgogICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwKSBjb25zdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZUJhc2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lQmFzZS5jcHAKaW5kZXggMWJjN2ZlMy4uMjBjMmMyOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lQmFzZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lQmFzZS5jcHAKQEAgLTE3LDYgKzE3LDggQEAKICNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZS9CYXNlIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKwogI2luY2x1ZGUgIkVuZ2luZUJhc2UuaCIKICNpbmNsdWRlICJFbmdpbmVEZWZhdWx0Q29uZmlnLmgiCiAjaW5jbHVkZSA8VHlwZUNvbnZlcnRlci5oPgpAQCAtMTQ3LDggKzE0OSwxMyBAQAogICAgICAgICB9KTsKICAgICAgICAgcmV0dXJuIGl0ZXIgIT0gZW5kKHZvbHVtZUdyb3Vwcyk7CiAgICAgfTsKKyAgICBhdXRvIGZpbGVFeGlzdHMgPSBbXShjb25zdCBjaGFyKiBwYXRoKSB7CisgICAgICAgIHN0cnVjdCBzdGF0IGZpbGVTdGF0OworICAgICAgICByZXR1cm4gc3RhdChwYXRoLCAmZmlsZVN0YXQpID09IDAgJiYgU19JU1JFRyhmaWxlU3RhdC5zdF9tb2RlKTsKKyAgICB9OwogCi0gICAgYXV0byByZXN1bHQgPSBlbmdpbmVDb25maWc6OnBhcnNlKCk7CisgICAgYXV0byByZXN1bHQgPSBmaWxlRXhpc3RzKGVuZ2luZUNvbmZpZzo6REVGQVVMVF9QQVRIKSA/CisgICAgICAgICAgICBlbmdpbmVDb25maWc6OnBhcnNlKGVuZ2luZUNvbmZpZzo6REVGQVVMVF9QQVRIKSA6IGVuZ2luZUNvbmZpZzo6UGFyc2luZ1Jlc3VsdHt9OwogICAgIGlmIChyZXN1bHQucGFyc2VkQ29uZmlnID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR1coIiVzOiBObyBjb25maWd1cmF0aW9uIGZvdW5kLCB1c2luZyBkZWZhdWx0IG1hdGNoaW5nIHBob25lIGV4cGVyaWVuY2UuIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgZW5naW5lQ29uZmlnOjpDb25maWcgY29uZmlnID0gZ0RlZmF1bHRFbmdpbmVDb25maWc7CkBAIC0zMzksOCArMzQ2LDggQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEVuZ2luZUJhc2U6OnNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkKK3N0YXR1c190IEVuZ2luZUJhc2U6OnNldERldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKQogewogICAgIC8vIHZlcmlmeSBzdHJhdGVneSBleGlzdHMKICAgICBpZiAobVByb2R1Y3RTdHJhdGVnaWVzLmZpbmQoc3RyYXRlZ3kpID09IG1Qcm9kdWN0U3RyYXRlZ2llcy5lbmQoKSkgewpAQCAtMzQ4LDExICszNTUsMjQgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBtUHJvZHVjdFN0cmF0ZWd5UHJlZmVycmVkRGV2aWNlc1tzdHJhdGVneV0gPSBkZXZpY2U7CisgICAgc3dpdGNoIChyb2xlKSB7CisgICAgY2FzZSBERVZJQ0VfUk9MRV9QUkVGRVJSRUQ6CisgICAgICAgIG1Qcm9kdWN0U3RyYXRlZ3lQcmVmZXJyZWREZXZpY2VzW3N0cmF0ZWd5XSA9IGRldmljZXM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgREVWSUNFX1JPTEVfRElTQUJMRUQ6CisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgc2V0IGRldmljZXMgcm9sZSBhcyBkaXNhYmxlZCBmb3Igc3RyYXRlZ3kuCisgICAgICAgIEFMT0dJKCIlcyBubyBpbXBsZW1lbnRlZCBmb3Igcm9sZSBhcyAlZCIsIF9fZnVuY19fLCByb2xlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBERVZJQ0VfUk9MRV9OT05FOgorICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGZhbGwtdGhyb3VnaCBhcyBpdCBpcyBubyBuZWVkIHRvIHNldCBkZXZpY2Ugcm9sZSBhcyBub25lIGZvciBhIHN0cmF0ZWd5LgorICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIHJvbGUgJWQiLCBfX2Z1bmNfXywgcm9sZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgRW5naW5lQmFzZTo6cmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KQorc3RhdHVzX3QgRW5naW5lQmFzZTo6cmVtb3ZlRGV2aWNlc1JvbGVGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksIGRldmljZV9yb2xlX3Qgcm9sZSkKIHsKICAgICAvLyB2ZXJpZnkgc3RyYXRlZ3kgZXhpc3RzCiAgICAgaWYgKG1Qcm9kdWN0U3RyYXRlZ2llcy5maW5kKHN0cmF0ZWd5KSA9PSBtUHJvZHVjdFN0cmF0ZWdpZXMuZW5kKCkpIHsKQEAgLTM2MCwyOSArMzgwLDIxOCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGlmIChtUHJvZHVjdFN0cmF0ZWd5UHJlZmVycmVkRGV2aWNlcy5lcmFzZShzdHJhdGVneSkgPT0gMCkgewotICAgICAgICAvLyBubyBwcmVmZXJyZWQgZGV2aWNlIHdhcyBzZXQKLSAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIHN3aXRjaCAocm9sZSkgeworICAgIGNhc2UgREVWSUNFX1JPTEVfUFJFRkVSUkVEOgorICAgICAgICBpZiAobVByb2R1Y3RTdHJhdGVneVByZWZlcnJlZERldmljZXMuZXJhc2Uoc3RyYXRlZ3kpID09IDApIHsKKyAgICAgICAgICAgIC8vIG5vIHByZWZlcnJlZCBkZXZpY2Ugd2FzIHNldAorICAgICAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgREVWSUNFX1JPTEVfRElTQUJMRUQ6CisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgcmVtb3ZlIGRldmljZXMgcm9sZSBhcyBkaXNhYmxlZCBmb3Igc3RyYXRlZ3kuCisgICAgICAgIEFMT0dJKCIlcyBubyBpbXBsZW1lbnRlZCBmb3Igcm9sZSBhcyAlZCIsIF9fZnVuY19fLCByb2xlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBERVZJQ0VfUk9MRV9OT05FOgorICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGZhbGwtdGhyb3VnaCBhcyBpdCBtYWtlcyBubyBzZW5zZSB0byByZW1vdmUgZGV2aWNlcyB3aXRoCisgICAgICAgIC8vIHJvbGUgYXMgREVWSUNFX1JPTEVfTk9ORSBmb3IgYSBzdHJhdGVneQorICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIHJvbGUgJWQiLCBfX2Z1bmNfXywgcm9sZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgRW5naW5lQmFzZTo6Z2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKSBjb25zdAorc3RhdHVzX3QgRW5naW5lQmFzZTo6Z2V0RGV2aWNlc0ZvclJvbGVBbmRTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpIGNvbnN0CiB7CiAgICAgLy8gdmVyaWZ5IHN0cmF0ZWd5IGV4aXN0cwogICAgIGlmIChtUHJvZHVjdFN0cmF0ZWdpZXMuZmluZChzdHJhdGVneSkgPT0gbVByb2R1Y3RTdHJhdGVnaWVzLmVuZCgpKSB7CiAgICAgICAgIEFMT0dFKCIlcyB1bmtub3duIHN0cmF0ZWd5ICV1IiwgX19mdW5jX18sIHN0cmF0ZWd5KTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgLy8gcHJlZmVycmVkIGRldmljZSBmb3IgdGhpcyBzdHJhdGVneT8KLSAgICBhdXRvIGRldkl0ID0gbVByb2R1Y3RTdHJhdGVneVByZWZlcnJlZERldmljZXMuZmluZChzdHJhdGVneSk7Ci0gICAgaWYgKGRldkl0ID09IG1Qcm9kdWN0U3RyYXRlZ3lQcmVmZXJyZWREZXZpY2VzLmVuZCgpKSB7Ci0gICAgICAgIEFMT0dWKCIlcyBubyBwcmVmZXJyZWQgZGV2aWNlIGZvciBzdHJhdGVneSAldSIsIF9fZnVuY19fLCBzdHJhdGVneSk7Ci0gICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKworICAgIHN3aXRjaCAocm9sZSkgeworICAgIGNhc2UgREVWSUNFX1JPTEVfUFJFRkVSUkVEOiB7CisgICAgICAgIC8vIHByZWZlcnJlZCBkZXZpY2UgZm9yIHRoaXMgc3RyYXRlZ3k/CisgICAgICAgIGF1dG8gZGV2SXQgPSBtUHJvZHVjdFN0cmF0ZWd5UHJlZmVycmVkRGV2aWNlcy5maW5kKHN0cmF0ZWd5KTsKKyAgICAgICAgaWYgKGRldkl0ID09IG1Qcm9kdWN0U3RyYXRlZ3lQcmVmZXJyZWREZXZpY2VzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVigiJXMgbm8gcHJlZmVycmVkIGRldmljZSBmb3Igc3RyYXRlZ3kgJXUiLCBfX2Z1bmNfXywgc3RyYXRlZ3kpOworICAgICAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgICAgICB9CisKKyAgICAgICAgZGV2aWNlcyA9IGRldkl0LT5zZWNvbmQ7CisgICAgfSBicmVhazsKKyAgICBjYXNlIERFVklDRV9ST0xFX05PTkU6CisgICAgICAgIC8vIEludGVudGlvbmFsbHkgZmFsbC10aHJvdWdoIGFzIHRoZSBERVZJQ0VfUk9MRV9OT05FIGlzIG5ldmVyIHNldAorICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIHJvbGUgJWQiLCBfX2Z1bmNfXywgcm9sZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgRW5naW5lQmFzZTo6c2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLCBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpCit7CisgICAgLy8gdmVyaWZ5IGlmIHRoZSBhdWRpbyBzb3VyY2UgaXMgdmFsaWQKKyAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2F1ZGlvX3NvdXJjZShhdWRpb1NvdXJjZSkpIHsKKyAgICAgICAgQUxPR0UoIiVzIHVua25vd24gYXVkaW8gc291cmNlICV1IiwgX19mdW5jX18sIGF1ZGlvU291cmNlKTsKICAgICB9CiAKLSAgICBkZXZpY2UgPSBkZXZJdC0+c2Vjb25kOworICAgIHN3aXRjaCAocm9sZSkgeworICAgIGNhc2UgREVWSUNFX1JPTEVfUFJFRkVSUkVEOgorICAgICAgICBtQ2FwdHVyZVByZXNldERldmljZXNSb2xlW2F1ZGlvU291cmNlXVtyb2xlXSA9IGRldmljZXM7CisgICAgICAgIC8vIFdoZW4gdGhlIGRldmljZXMgYXJlIHNldCBhcyBwcmVmZXJyZWQgZGV2aWNlcywgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgZGlzYWJsZWQgZGV2aWNlcy4KKyAgICAgICAgZG9SZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCisgICAgICAgICAgICAgICAgYXVkaW9Tb3VyY2UsIERFVklDRV9ST0xFX0RJU0FCTEVELCBkZXZpY2VzLCBmYWxzZSAvKmZvcmNlTWF0Y2hlZCovKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBERVZJQ0VfUk9MRV9ESVNBQkxFRDoKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBzZXR0aW5nIGRldmljZXMgcm9sZSBhcyBkaXNhYmxlZCBmb3IgY2FwdHVyZSBwcmVzZXQuCisgICAgICAgIEFMT0dJKCIlcyBubyBpbXBsZW1lbnRlZCBmb3Igcm9sZSBhcyAlZCIsIF9fZnVuY19fLCByb2xlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBERVZJQ0VfUk9MRV9OT05FOgorICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGZhbGwtdGhyb3VnaCBhcyBpdCBpcyBubyBuZWVkIHRvIHNldCBkZXZpY2Ugcm9sZSBhcyBub25lCisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgcm9sZSAlZCIsIF9fZnVuY19fLCByb2xlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjphZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykKK3sKKyAgICAvLyB2ZXJpZnkgaWYgdGhlIGF1ZGlvIHNvdXJjZSBpcyB2YWxpZAorICAgIGlmICghYXVkaW9faXNfdmFsaWRfYXVkaW9fc291cmNlKGF1ZGlvU291cmNlKSkgeworICAgICAgICBBTE9HRSgiJXMgdW5rbm93biBhdWRpbyBzb3VyY2UgJXUiLCBfX2Z1bmNfXywgYXVkaW9Tb3VyY2UpOworICAgIH0KKworICAgIHN3aXRjaCAocm9sZSkgeworICAgIGNhc2UgREVWSUNFX1JPTEVfUFJFRkVSUkVEOgorICAgICAgICBtQ2FwdHVyZVByZXNldERldmljZXNSb2xlW2F1ZGlvU291cmNlXVtyb2xlXSA9IGV4Y2x1ZGVEZXZpY2VUeXBlQWRkcnNGcm9tKAorICAgICAgICAgICAgICAgIG1DYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGVbYXVkaW9Tb3VyY2VdW3JvbGVdLCBkZXZpY2VzKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBkZXZpY2VzKSB7CisgICAgICAgICAgICBtQ2FwdHVyZVByZXNldERldmljZXNSb2xlW2F1ZGlvU291cmNlXVtyb2xlXS5wdXNoX2JhY2soZGV2aWNlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBXaGVuIHRoZSBkZXZpY2VzIGFyZSBzZXQgYXMgcHJlZmVycmVkIGRldmljZXMsIHJlbW92ZSB0aGVtIGZyb20gdGhlIGRpc2FibGVkIGRldmljZXMuCisgICAgICAgIGRvUmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICAgICAgICAgIGF1ZGlvU291cmNlLCBERVZJQ0VfUk9MRV9ESVNBQkxFRCwgZGV2aWNlcywgZmFsc2UgLypmb3JjZU1hdGNoZWQqLyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgREVWSUNFX1JPTEVfRElTQUJMRUQ6CisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgc2V0dGluZyBkZXZpY2VzIHJvbGUgYXMgZGlzYWJsZWQgZm9yIGNhcHR1cmUgcHJlc2V0LgorICAgICAgICBBTE9HSSgiJXMgbm8gaW1wbGVtZW50ZWQgZm9yIHJvbGUgYXMgJWQiLCBfX2Z1bmNfXywgcm9sZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgREVWSUNFX1JPTEVfTk9ORToKKyAgICAgICAgLy8gSW50ZW50aW9uYWxseSBmYWxsLXRocm91Z2ggYXMgaXQgaXMgbm8gbmVlZCB0byBzZXQgZGV2aWNlIHJvbGUgYXMgbm9uZQorICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIHJvbGUgJWQiLCBfX2Z1bmNfXywgcm9sZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgRW5naW5lQmFzZTo6cmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKSB7CisgICAgcmV0dXJuIGRvUmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKTsKK30KKworc3RhdHVzX3QgRW5naW5lQmFzZTo6ZG9SZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcywgYm9vbCBmb3JjZU1hdGNoZWQpCit7CisgICAgLy8gdmVyaWZ5IGlmIHRoZSBhdWRpbyBzb3VyY2UgaXMgdmFsaWQKKyAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2F1ZGlvX3NvdXJjZShhdWRpb1NvdXJjZSkpIHsKKyAgICAgICAgQUxPR0UoIiVzIHVua25vd24gYXVkaW8gc291cmNlICV1IiwgX19mdW5jX18sIGF1ZGlvU291cmNlKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHJvbGUpIHsKKyAgICBjYXNlIERFVklDRV9ST0xFX1BSRUZFUlJFRDoKKyAgICBjYXNlIERFVklDRV9ST0xFX0RJU0FCTEVEOiB7CisgICAgICAgIGlmIChtQ2FwdHVyZVByZXNldERldmljZXNSb2xlLmNvdW50KGF1ZGlvU291cmNlKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgbUNhcHR1cmVQcmVzZXREZXZpY2VzUm9sZVthdWRpb1NvdXJjZV0uY291bnQocm9sZSkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgcmVtYWluaW5nRGV2aWNlcyA9IGV4Y2x1ZGVEZXZpY2VUeXBlQWRkcnNGcm9tKAorICAgICAgICAgICAgICAgIG1DYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGVbYXVkaW9Tb3VyY2VdW3JvbGVdLCBkZXZpY2VzKTsKKyAgICAgICAgaWYgKGZvcmNlTWF0Y2hlZCAmJiByZW1haW5pbmdEZXZpY2VzLnNpemUoKSAhPQorICAgICAgICAgICAgICAgIG1DYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGVbYXVkaW9Tb3VyY2VdW3JvbGVdLnNpemUoKSAtIGRldmljZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAvLyBUaGVyZSBhcmUgc29tZSBkZXZpY2VzIGZyb20gYGRldmljZXNUb1JlbW92ZWAgdGhhdCBhcmUgbm90IHNob3duIGluIHRoZSBjYWNoZWQgcmVjb3JkCisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIG1DYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGVbYXVkaW9Tb3VyY2VdW3JvbGVdID0gcmVtYWluaW5nRGV2aWNlczsKKyAgICAgICAgaWYgKG1DYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGVbYXVkaW9Tb3VyY2VdW3JvbGVdLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcm9sZSB3aGVuIGRldmljZSBsaXN0IGlzIGVtcHR5CisgICAgICAgICAgICBtQ2FwdHVyZVByZXNldERldmljZXNSb2xlW2F1ZGlvU291cmNlXS5lcmFzZShyb2xlKTsKKyAgICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBERVZJQ0VfUk9MRV9OT05FOgorICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGZhbGwtdGhyb3VnaCBhcyBpdCBtYWtlcyBubyBzZW5zZSB0byByZW1vdmUgZGV2aWNlcyB3aXRoCisgICAgICAgIC8vIHJvbGUgYXMgREVWSUNFX1JPTEVfTk9ORQorICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIHJvbGUgJWQiLCBfX2Z1bmNfXywgcm9sZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgRW5naW5lQmFzZTo6Y2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUpCit7CisgICAgLy8gdmVyaWZ5IGlmIHRoZSBhdWRpbyBzb3VyY2UgaXMgdmFsaWQKKyAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2F1ZGlvX3NvdXJjZShhdWRpb1NvdXJjZSkpIHsKKyAgICAgICAgQUxPR0UoIiVzIHVua25vd24gYXVkaW8gc291cmNlICV1IiwgX19mdW5jX18sIGF1ZGlvU291cmNlKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHJvbGUpIHsKKyAgICBjYXNlIERFVklDRV9ST0xFX1BSRUZFUlJFRDoKKyAgICAgICAgaWYgKG1DYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGUuY291bnQoYXVkaW9Tb3VyY2UpID09IDAgfHwKKyAgICAgICAgICAgICAgICBtQ2FwdHVyZVByZXNldERldmljZXNSb2xlW2F1ZGlvU291cmNlXS5lcmFzZShyb2xlKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBubyBwcmVmZXJyZWQgZGV2aWNlIGZvciB0aGUgZ2l2ZW4gYXVkaW8gc291cmNlCisgICAgICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBERVZJQ0VfUk9MRV9ESVNBQkxFRDoKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCByZW1vdmUgZGV2aWNlcyByb2xlIGFzIGRpc2FibGVkIGZvciBzdHJhdGVneS4KKyAgICAgICAgQUxPR0koIiVzIG5vIGltcGxlbWVudGVkIGZvciByb2xlIGFzICVkIiwgX19mdW5jX18sIHJvbGUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERFVklDRV9ST0xFX05PTkU6CisgICAgICAgIC8vIEludGVudGlvbmFsbHkgZmFsbC10aHJvdWdoIGFzIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHJlbW92ZSBkZXZpY2VzIHdpdGgKKyAgICAgICAgLy8gcm9sZSBhcyBERVZJQ0VfUk9MRV9OT05FIGZvciBhIHN0cmF0ZWd5CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgcm9sZSAlZCIsIF9fZnVuY19fLCByb2xlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjpnZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgY29uc3QKK3sKKyAgICAvLyB2ZXJpZnkgaWYgdGhlIGF1ZGlvIHNvdXJjZSBpcyB2YWxpZAorICAgIGlmICghYXVkaW9faXNfdmFsaWRfYXVkaW9fc291cmNlKGF1ZGlvU291cmNlKSkgeworICAgICAgICBBTE9HRSgiJXMgdW5rbm93biBhdWRpbyBzb3VyY2UgJXUiLCBfX2Z1bmNfXywgYXVkaW9Tb3VyY2UpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN3aXRjaCAocm9sZSkgeworICAgIGNhc2UgREVWSUNFX1JPTEVfUFJFRkVSUkVEOgorICAgIGNhc2UgREVWSUNFX1JPTEVfRElTQUJMRUQ6IHsKKyAgICAgICAgaWYgKG1DYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGUuY291bnQoYXVkaW9Tb3VyY2UpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBhdXRvIGRldkl0ID0gbUNhcHR1cmVQcmVzZXREZXZpY2VzUm9sZS5hdChhdWRpb1NvdXJjZSkuZmluZChyb2xlKTsKKyAgICAgICAgaWYgKGRldkl0ID09IG1DYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGUuYXQoYXVkaW9Tb3VyY2UpLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVigiJXMgbm8gZGV2aWNlcyByb2xlKCVkKSBmb3IgY2FwdHVyZSBwcmVzZXQgJXUiLCBfX2Z1bmNfXywgcm9sZSwgYXVkaW9Tb3VyY2UpOworICAgICAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgICAgICB9CisKKyAgICAgICAgZGV2aWNlcyA9IGRldkl0LT5zZWNvbmQ7CisgICAgfSBicmVhazsKKyAgICBjYXNlIERFVklDRV9ST0xFX05PTkU6CisgICAgICAgIC8vIEludGVudGlvbmFsbHkgZmFsbC10aHJvdWdoIGFzIHRoZSBERVZJQ0VfUk9MRV9OT05FIGlzIG5ldmVyIHNldAorICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIHJvbGUgJWQiLCBfX2Z1bmNfXywgcm9sZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lRGVmYXVsdENvbmZpZy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lRGVmYXVsdENvbmZpZy5oCmluZGV4IDE4MjExNDAuLmQzOWVmZjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZURlZmF1bHRDb25maWcuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVEZWZhdWx0Q29uZmlnLmgKQEAgLTI2LDggKzI2LDggQEAKICAgICB7IlNUUkFURUdZX1BIT05FIiwKICAgICAgewogICAgICAgICAgeyJwaG9uZSIsIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCAiQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwiLAotICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04sIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLAotICAgICAgICAgICAgIiJ9fSwKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OLCBBVURJT19TT1VSQ0VfREVGQVVMVCwKKyAgICAgICAgICAgIEFVRElPX0ZMQUdfTk9ORSwgIiJ9fSwKICAgICAgICAgIH0sCiAgICAgICAgICB7InNjbyIsIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPLCAiQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08iLAogICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX1NDTywKQEAgLTM5LDEwICszOSwxMSBAQAogICAgICB7CiAgICAgICAgICB7InJpbmciLCBBVURJT19TVFJFQU1fUklORywgIkFVRElPX1NUUkVBTV9SSU5HIiwKICAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FLAotICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0KKyAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifX0KICAgICAgICAgIH0sCiAgICAgICAgICB7ImFsYXJtIiwgQVVESU9fU1RSRUFNX0FMQVJNLCAiQVVESU9fU1RSRUFNX0FMQVJNIiwKLSAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9BTEFSTSwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0sCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfQUxBUk0sIEFVRElPX1NPVVJDRV9ERUZBVUxULAorICAgICAgICAgICAgQVVESU9fRkxBR19OT05FLCAiIn19LAogICAgICAgICAgfQogICAgICB9LAogICAgIH0sCkBAIC01OCw3ICs1OSw3IEBACiAgICAgIHsKICAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksICJBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSIsCiAgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZLAotICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0KKyAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifX0KICAgICAgICAgIH0KICAgICAgfSwKICAgICB9LApAQCAtNjYsMTUgKzY3LDE2IEBACiAgICAgIHsKICAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiwgIkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iLAogICAgICAgICAgIHsKLSAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT04sIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OLCBBVURJT19TT1VSQ0VfREVGQVVMVCwKKyAgICAgICAgICAgICAgIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1QsCi0gICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQsCi0gICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQsCi0gICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVCwKLSAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0KKyAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifQogICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgfSwKQEAgLTgzLDIxICs4NSwyNSBAQAogICAgICB7CiAgICAgICAgICB7ImFzc2lzdGFudCIsIEFVRElPX1NUUkVBTV9BU1NJU1RBTlQsICJBVURJT19TVFJFQU1fQVNTSVNUQU5UIiwKICAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0gsIEFVRElPX1VTQUdFX0FTU0lTVEFOVCwKLSAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19CisgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn19CiAgICAgICAgICB9LAogICAgICAgICAgeyJtdXNpYyIsIEFVRElPX1NUUkVBTV9NVVNJQywgIkFVRElPX1NUUkVBTV9NVVNJQyIsCiAgICAgICAgICAgewotICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX01FRElBLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAotICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0dBTUUsIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCi0gICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfQVNTSVNUQU5ULCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX01FRElBLCBBVURJT19TT1VSQ0VfREVGQVVMVCwKKyAgICAgICAgICAgICAgIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0dBTUUsIEFVRElPX1NPVVJDRV9ERUZBVUxULAorICAgICAgICAgICAgICAgQVVESU9fRkxBR19OT05FLCAiIn0sCisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfQVNTSVNUQU5ULCBBVURJT19TT1VSQ0VfREVGQVVMVCwKKyAgICAgICAgICAgICAgIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSwKLSAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCi0gICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifQorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULAorICAgICAgICAgICAgICAgQVVESU9fRkxBR19OT05FLCAiIn0KICAgICAgICAgICB9LAogICAgICAgICAgfSwKICAgICAgICAgIHsic3lzdGVtIiwgQVVESU9fU1RSRUFNX1NZU1RFTSwgIkFVRElPX1NUUkVBTV9TWVNURU0iLAogICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OLAotICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0KKyAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifX0KICAgICAgICAgIH0KICAgICAgfSwKICAgICB9LApAQCAtMTA2LDcgKzExMiw3IEBACiAgICAgICAgICB7IiIsIEFVRElPX1NUUkVBTV9EVE1GLCAiQVVESU9fU1RSRUFNX0RUTUYiLAogICAgICAgICAgIHsKICAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkcsCi0gICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9CisgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn0KICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgIH0sCkBAIC0xMTQsNyArMTIwLDggQEAKICAgICB7IlNUUkFURUdZX0NBTExfQVNTSVNUQU5UIiwKICAgICAgewogICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fQ0FMTF9BU1NJU1RBTlQsICJBVURJT19TVFJFQU1fQ0FMTF9BU1NJU1RBTlQiLAotICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0NBTExfQVNTSVNUQU5ULCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9fQorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0NBTExfQVNTSVNUQU5ULCBBVURJT19TT1VSQ0VfREVGQVVMVCwKKyAgICAgICAgICAgIEFVRElPX0ZMQUdfTk9ORSwgIiJ9fQogICAgICAgICAgfQogICAgICB9LAogICAgIH0sCkBAIC0xMzYsMTQgKzE0MywxNiBAQAogICAgIHsicmVyb3V0aW5nIiwKICAgICAgewogICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fUkVST1VUSU5HLCAiQVVESU9fU1RSRUFNX1JFUk9VVElORyIsCi0gICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UsIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19CisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UsIEFVRElPX1NPVVJDRV9ERUZBVUxULAorICAgICAgICAgICAgQVVESU9fRkxBR19OT05FLCAiIn19CiAgICAgICAgICB9CiAgICAgIH0sCiAgICAgfSwKICAgICB7InBhdGNoIiwKICAgICAgewogICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fUEFUQ0gsICJBVURJT19TVFJFQU1fUEFUQ0giLAotICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19CisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsCisgICAgICAgICAgICBBVURJT19GTEFHX05PTkUsICIifX0KICAgICAgICAgIH0KICAgICAgfSwKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0xhc3RSZW1vdmFibGVNZWRpYURldmljZXMuY3BwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggODdiNmFhZi4uOTZjYzE0MAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmNwcApAQCAtNjksNiArNjksMTEgQEAKICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA6CiAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM6CiAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI6CisgICAgLy8gVE9ETyAoYi8xMjI5MzEyNjEpOiByZW1vdmUgd2hlbiBwcmVmZXJyZWQgZGV2aWNlIGZvciBzdHJhdGVneSBtZWRpYSB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZgorICAgIC8vICBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUC4KKyAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQ6CisgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUOgorICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTEVfU1BFQUtFUjoKICAgICAgICAgcmV0dXJuIEdST1VQX0JUX0EyRFA7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIEdST1VQX05PTkU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Qcm9kdWN0U3RyYXRlZ3kuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvUHJvZHVjdFN0cmF0ZWd5LmNwcAppbmRleCAxNTFjN2JiLi4wNjA1NjhhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Qcm9kdWN0U3RyYXRlZ3kuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1Byb2R1Y3RTdHJhdGVneS5jcHAKQEAgLTMyMSwxMCArMzIxLDExIEBACiB2b2lkIFByb2R1Y3RTdHJhdGVneVByZWZlcnJlZFJvdXRpbmdNYXA6OmR1bXAoYW5kcm9pZDo6U3RyaW5nOCogZHN0LCBpbnQgc3BhY2VzKSBjb25zdCB7CiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuJSpzUHJlZmVycmVkIGRldmljZXMgcGVyIHByb2R1Y3Qgc3RyYXRlZ3kgZHVtcDoiLCBzcGFjZXMsICIiKTsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZXIgOiAqdGhpcykgewotICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4lKnNTdHJhdGVneSAldSBkZXY6JTA4eCBhZGRyOiVzIiwKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuJSpzU3RyYXRlZ3kgJXUgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMgKyAyLCAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSBpdGVyLmZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLnNlY29uZC5tVHlwZSwgaXRlci5zZWNvbmQubUFkZHJlc3MuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yKGl0ZXIuc2Vjb25kLCB0cnVlIC8qaW5jbHVkZVNlbnNpdGl2ZUluZm8qLykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY19zdHIoKSk7CiAgICAgfQogICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiIpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9BbmRyb2lkLmJwCmluZGV4IGZmODQwZjkuLjQ1OWNjNzggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliYXVkaW9wb2xpY3llbmdpbmVfY29uZmlnIiwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvVEVTVF9NQVBQSU5HIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjZTExMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsNyBAQAoreworICAicHJlc3VibWl0IjogWworICAgIHsKKyAgICAgICAibmFtZSI6ICJhdWRpb3BvbGljeV9lbmdpbmVjb25maWdfdGVzdHMiCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL2luY2x1ZGUvRW5naW5lQ29uZmlnLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL2luY2x1ZGUvRW5naW5lQ29uZmlnLmgKaW5kZXggNWQyMmMyNC4uYzU2NTkyNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9pbmNsdWRlL0VuZ2luZUNvbmZpZy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvaW5jbHVkZS9FbmdpbmVDb25maWcuaApAQCAtMTExLDYgKzExMSw4IEBACiAgKi8KIFBhcnNpbmdSZXN1bHQgcGFyc2UoY29uc3QgY2hhciogcGF0aCA9IERFRkFVTFRfUEFUSCk7CiBhbmRyb2lkOjpzdGF0dXNfdCBwYXJzZUxlZ2FjeVZvbHVtZXMoVm9sdW1lR3JvdXBzICZ2b2x1bWVHcm91cHMpOworLy8gRXhwb3NlZCBmb3IgdGVzdGluZy4KK2FuZHJvaWQ6OnN0YXR1c190IHBhcnNlTGVnYWN5Vm9sdW1lRmlsZShjb25zdCBjaGFyKiBwYXRoLCBWb2x1bWVHcm91cHMgJnZvbHVtZUdyb3Vwcyk7CiAKIH0gLy8gbmFtZXNwYWNlIGVuZ2luZUNvbmZpZwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9zcmMvRW5naW5lQ29uZmlnLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvc3JjL0VuZ2luZUNvbmZpZy5jcHAKaW5kZXggNDg0MmNiMi4uN2NmZWY1YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9zcmMvRW5naW5lQ29uZmlnLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3NyYy9FbmdpbmVDb25maWcuY3BwCkBAIC0yMjgsNyArMjI4LDggQEAKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZsYWdzID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgInZhbHVlIik7CiAKICAgICAgICAgICAgIEFMT0dWKCIlcyBmbGFncyAlcyIsICBfX0ZVTkNUSU9OX18sIGZsYWdzLmNfc3RyKCkpOwotICAgICAgICAgICAgYXR0cmlidXRlcy5mbGFncyA9IEF1ZGlvRmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcoZmxhZ3MsICIgIik7CisgICAgICAgICAgICBhdHRyaWJ1dGVzLmZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PigKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9GbGFnQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhmbGFncywgIiAiKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQnVuZGxlIikpKSB7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBidW5kbGVLZXkgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCAia2V5Iik7CkBAIC01ODgsNiArNTg5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKyAgICBWb2x1bWVHcm91cHMgdGVtcFZvbHVtZUdyb3VwcyA9IHZvbHVtZUdyb3VwczsKICAgICBmb3IgKGNvbnN0IGF1dG8gJnZvbHVtZU1hcEl0ZXIgOiBsZWdhY3lWb2x1bWVNYXApIHsKICAgICAgICAgLy8gSW4gb3JkZXIgdG8gbGV0IEF1ZGlvU2VydmljZSBzZXR0aW5nIHRoZSBtaW4gYW5kIG1heCAoY29tcGF0aWJpbGl0eSksIHNldCBNaW4gYW5kIE1heAogICAgICAgICAvLyB0byAtMSBleGNlcHQgZm9yIHByaXZhdGUgc3RyZWFtcwpAQCAtNTk4LDggKzYwMCwxMCBAQAogICAgICAgICB9CiAgICAgICAgIGludCBpbmRleE1pbiA9IHN0cmVhbVR5cGUgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQgPyAwIDogLTE7CiAgICAgICAgIGludCBpbmRleE1heCA9IHN0cmVhbVR5cGUgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQgPyAxMDAgOiAtMTsKLSAgICAgICAgdm9sdW1lR3JvdXBzLnB1c2hfYmFjayh7IHZvbHVtZU1hcEl0ZXIuZmlyc3QsIGluZGV4TWluLCBpbmRleE1heCwgdm9sdW1lTWFwSXRlci5zZWNvbmQgfSk7CisgICAgICAgIHRlbXBWb2x1bWVHcm91cHMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIHsgdm9sdW1lTWFwSXRlci5maXJzdCwgaW5kZXhNaW4sIGluZGV4TWF4LCB2b2x1bWVNYXBJdGVyLnNlY29uZCB9KTsKICAgICB9CisgICAgc3RkOjpzd2FwKHRlbXBWb2x1bWVHcm91cHMsIHZvbHVtZUdyb3Vwcyk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC02OTQsMzUgKzY5OCwxNCBAQAogICAgIHJldHVybiBkZXNlcmlhbGl6ZUxlZ2FjeVZvbHVtZUNvbGxlY3Rpb24oZG9jLCBjdXIsIHZvbHVtZUdyb3VwcywgbmJTa2lwcGVkRWxlbWVudHMpOwogfQogCi1zdGF0aWMgY29uc3QgaW50IGdBcG1YbWxDb25maWdGaWxlUGF0aE1heExlbmd0aCA9IDEyODsKLQotc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICphcG1YbWxDb25maWdGaWxlTmFtZSA9ICJhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiOwotc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICphcG1BMmRwT2ZmbG9hZERpc2FibGVkWG1sQ29uZmlnRmlsZU5hbWUgPQotICAgICAgICAiYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fYTJkcF9vZmZsb2FkX2Rpc2FibGVkLnhtbCI7Ci0KIGFuZHJvaWQ6OnN0YXR1c190IHBhcnNlTGVnYWN5Vm9sdW1lcyhWb2x1bWVHcm91cHMgJnZvbHVtZUdyb3VwcykgewotICAgIGNoYXIgYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlW2dBcG1YbWxDb25maWdGaWxlUGF0aE1heExlbmd0aF07Ci0gICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiBmaWxlTmFtZXM7Ci0gICAgc3RhdHVzX3QgcmV0OwotCi0gICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJyby5ibHVldG9vdGguYTJkcF9vZmZsb2FkLnN1cHBvcnRlZCIsIGZhbHNlKSAmJgotICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuYmx1ZXRvb3RoLmEyZHBfb2ZmbG9hZC5kaXNhYmxlZCIsIGZhbHNlKSkgewotICAgICAgICAvLyBBMkRQIG9mZmxvYWQgc3VwcG9ydGVkIGJ1dCBkaXNhYmxlZDogdHJ5IHRvIHVzZSBzcGVjaWFsIFhNTCBmaWxlCi0gICAgICAgIGZpbGVOYW1lcy5wdXNoX2JhY2soYXBtQTJkcE9mZmxvYWREaXNhYmxlZFhtbENvbmZpZ0ZpbGVOYW1lKTsKKyAgICBpZiAoc3RkOjpzdHJpbmcgYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlID0gYXVkaW9fZ2V0X2F1ZGlvX3BvbGljeV9jb25maWdfZmlsZSgpOworICAgICAgICAgICAgIWF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZS5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZ2FjeVZvbHVtZUZpbGUoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlLmNfc3RyKCksIHZvbHVtZUdyb3Vwcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIk5vIHJlYWRhYmxlIGF1ZGlvIHBvbGljeSBjb25maWcgZmlsZSBmb3VuZCIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBmaWxlTmFtZXMucHVzaF9iYWNrKGFwbVhtbENvbmZpZ0ZpbGVOYW1lKTsKLQotICAgIGZvciAoY29uc3QgY2hhciogZmlsZU5hbWUgOiBmaWxlTmFtZXMpIHsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwYXRoIDogYXVkaW9fZ2V0X2NvbmZpZ3VyYXRpb25fcGF0aHMoKSkgewotICAgICAgICAgICAgc25wcmludGYoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlLCBzaXplb2YoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICIlcy8lcyIsIHBhdGguY19zdHIoKSwgZmlsZU5hbWUpOwotICAgICAgICAgICAgcmV0ID0gcGFyc2VMZWdhY3lWb2x1bWVGaWxlKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgdm9sdW1lR3JvdXBzKTsKLSAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGVuZ2luZUNvbmZpZwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy90ZXN0cy9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OTFmMTcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzNCBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiYXVkaW9wb2xpY3lfZW5naW5lY29uZmlnX3Rlc3RzIiwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlieG1sMiIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW9wb2xpY3llbmdpbmVfY29uZmlnIiwKKyAgICBdLAorCisgICAgc3JjczogWyJlbmdpbmVjb25maWdfdGVzdHMuY3BwIl0sCisKKyAgICBkYXRhOiBbIjphdWRpb3BvbGljeV9lbmdpbmVjb25maWdfZmlsZXMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy90ZXN0cy9lbmdpbmVjb25maWdfdGVzdHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy90ZXN0cy9lbmdpbmVjb25maWdfdGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MWUwMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3Rlc3RzL2VuZ2luZWNvbmZpZ190ZXN0cy5jcHAKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjZGVmaW5lIExPR19UQUcgIkFQTV9UZXN0IgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSAiRW5naW5lQ29uZmlnLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitURVNUKEVuZ2luZUNvbmZpZ1Rlc3RJbml0LCBMZWdhY3lWb2x1bWVHcm91cHNMb2FkaW5nSXNUcmFuc2FjdGlvbmFsKSB7CisgICAgZW5naW5lQ29uZmlnOjpWb2x1bWVHcm91cHMgZ3JvdXBzOworICAgIEFTU0VSVF9UUlVFKGdyb3Vwcy5lbXB0eSgpKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBlbmdpbmVDb25maWc6OnBhcnNlTGVnYWN5Vm9sdW1lRmlsZSgKKyAgICAgICAgICAgIChiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCkgKyAiL3Rlc3RfaW52YWxpZF9hcG1fdm9sdW1lX3RhYmxlcy54bWwiKS5jX3N0cigpLAorICAgICAgICAgICAgZ3JvdXBzKTsKKyAgICBBU1NFUlRfTkUoTk9fRVJST1IsIHN0YXR1cyk7CisgICAgRVhQRUNUX1RSVUUoZ3JvdXBzLmVtcHR5KCkpOworICAgIHN0YXR1cyA9IGVuZ2luZUNvbmZpZzo6cGFyc2VMZWdhY3lWb2x1bWVGaWxlKAorICAgICAgICAgICAgKGJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKSArICIvdGVzdF9hcG1fdm9sdW1lX3RhYmxlcy54bWwiKS5jX3N0cigpLAorICAgICAgICAgICAgZ3JvdXBzKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHN0YXR1cyk7CisgICAgRVhQRUNUX0ZBTFNFKGdyb3Vwcy5lbXB0eSgpKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvdGVzdHMvcmVzb3VyY2VzL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3Rlc3RzL3Jlc291cmNlcy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZWU5NzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3Rlc3RzL3Jlc291cmNlcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiYXVkaW9wb2xpY3lfZW5naW5lY29uZmlnX2ZpbGVzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0X2FwbV92b2x1bWVfdGFibGVzLnhtbCIsCisgICAgICAgICJ0ZXN0X2ludmFsaWRfYXBtX3ZvbHVtZV90YWJsZXMueG1sIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy90ZXN0cy9yZXNvdXJjZXMvdGVzdF9hcG1fdm9sdW1lX3RhYmxlcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3Rlc3RzL3Jlc291cmNlcy90ZXN0X2FwbV92b2x1bWVfdGFibGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjEyNmI2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy90ZXN0cy9yZXNvdXJjZXMvdGVzdF9hcG1fdm9sdW1lX3RhYmxlcy54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8YXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uIHZlcnNpb249IjEuMCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorICAgIDxnbG9iYWxDb25maWd1cmF0aW9uIHNwZWFrZXJfZHJjX2VuYWJsZWQ9InRydWUiLz4KKyAgICA8dm9sdW1lcz4KKyAgICAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTI0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0xNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiCisgICAgICAgICAgICAgICAgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lcz4KKyAgICA8dm9sdW1lcz4KKyAgICAgICAgPHJlZmVyZW5jZSBuYW1lPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSI+CisgICAgICAgICAgICA8IS0tIEZ1bGwgU2NhbGUgcmVmZXJlbmNlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgICAgIDxwb2ludD4wLDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgPC92b2x1bWVzPgorPC9hdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3Rlc3RzL3Jlc291cmNlcy90ZXN0X2ludmFsaWRfYXBtX3ZvbHVtZV90YWJsZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy90ZXN0cy9yZXNvdXJjZXMvdGVzdF9pbnZhbGlkX2FwbV92b2x1bWVfdGFibGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWM1ZDEwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy90ZXN0cy9yZXNvdXJjZXMvdGVzdF9pbnZhbGlkX2FwbV92b2x1bWVfdGFibGVzLnhtbApAQCAtMCwwICsxLDU5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVGhpcyBmaWxlIHVzZXMgYSBub24tZXhpc3RlbnQgYXVkaW8gc3RyZWFtIG5hbWUuIC0tPgorPGF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgICA8Z2xvYmFsQ29uZmlndXJhdGlvbiBzcGVha2VyX2RyY19lbmFibGVkPSJ0cnVlIi8+CisgICAgPHZvbHVtZXM+CisgICAgICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fTk9OX0VYSVNUSU5HIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTI0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0xNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX1JJTkciIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIKKyAgICAgICAgICAgICAgICByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fTVVTSUMiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIKKyAgICAgICAgICAgICAgICByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fQUxBUk0iIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjk3MDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTIwMTA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xMDIwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIgorICAgICAgICAgICAgICAgIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIKKyAgICAgICAgICAgICAgICByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIKKyAgICAgICAgICAgICAgICByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fRFRNRiIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIgorICAgICAgICAgICAgICAgIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZXM+CisgICAgPHZvbHVtZXM+CisgICAgICAgIDxyZWZlcmVuY2UgbmFtZT0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiPgorICAgICAgICAgICAgPCEtLSBGdWxsIFNjYWxlIHJlZmVyZW5jZSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgICAgICA8cG9pbnQ+MCwwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvcmVmZXJlbmNlPgorICAgIDwvdm9sdW1lcz4KKzwvYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BbmRyb2lkLmJwCmluZGV4IDJlYTQyYjYuLjVkZDVhZGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0FuZHJvaWQuYnAKQEAgLTEyLDYgKzEyLDE1IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X2hlYWRlcnMgewogICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeWVuZ2luZV9pbnRlcmZhY2VfaGVhZGVycyIsCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0VuZ2luZUludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9FbmdpbmVJbnRlcmZhY2UuaAppbmRleCBkZmIyMGI1Li5mNjQ2MDhkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0VuZ2luZUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvRW5naW5lSW50ZXJmYWNlLmgKQEAgLTM0LDYgKzM0LDggQEAKIHVzaW5nIERldmljZVN0cmF0ZWd5TWFwID0gc3RkOjptYXA8cHJvZHVjdF9zdHJhdGVneV90LCBEZXZpY2VWZWN0b3I+OwogdXNpbmcgU3RyYXRlZ3lWZWN0b3IgPSBzdGQ6OnZlY3Rvcjxwcm9kdWN0X3N0cmF0ZWd5X3Q+OwogdXNpbmcgVm9sdW1lR3JvdXBWZWN0b3IgPSBzdGQ6OnZlY3Rvcjx2b2x1bWVfZ3JvdXBfdD47Cit1c2luZyBDYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGVNYXAgPQorICAgICAgICBzdGQ6Om1hcDxhdWRpb19zb3VyY2VfdCwgc3RkOjptYXA8ZGV2aWNlX3JvbGVfdCwgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3Rvcj4+OwogCiAvKioKICAqIFRoaXMgaW50ZXJmYWNlIGlzIGRlZGljYXRlZCB0byB0aGUgcG9saWN5IG1hbmFnZXIgdGhhdCBhIFBvbGljeSBFbmdpbmUgc2hhbGwgaW1wbGVtZW50LgpAQCAtMjkzLDM2ICsyOTUsMTEzIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKSBjb25zdCA9IDA7CiAKICAgICAvKioKLSAgICAgKiBAYnJpZWYgc2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kgc2V0cyB0aGUgZGVmYXVsdCBkZXZpY2UgdG8gYmUgdXNlZCBmb3IgYQotICAgICAqIHN0cmF0ZWd5IHdoZW4gYXZhaWxhYmxlCisgICAgICogQGJyaWVmIHNldERldmljZXNSb2xlRm9yU3RyYXRlZ3kgc2V0cyBkZXZpY2VzIHJvbGUgZm9yIGEgc3RyYXRlZ3kgd2hlbiBhdmFpbGFibGUuIFRvIHJlbW92ZQorICAgICAqIGRldmljZXMgcm9sZSwgcmVtb3ZlRGV2aWNlc1JvbGVGb3JTdHJhdGVneSBtdXN0IGJlIGNhbGxlZC4gV2hlbiBkZXZpY2VzIHJvbGUgaXMgc2V0CisgICAgICogc3VjY2Vzc2Z1bGx5LCBwcmV2aW91c2x5IHNldCBkZXZpY2VzIGZvciB0aGUgc2FtZSByb2xlIGFuZCBzdHJhdGVneSB3aWxsIGJlIHJlbW92ZWQuCiAgICAgICogQHBhcmFtIHN0cmF0ZWd5IHRoZSBhdWRpbyBzdHJhdGVneSB3aG9zZSByb3V0aW5nIHdpbGwgYmUgYWZmZWN0ZWQKLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSBhdWRpbyBkZXZpY2UgdG8gcm91dGUgdG8gd2hlbiBhdmFpbGFibGUKLSAgICAgKiBAcmV0dXJuIEJBRF9WQUxVRSBpZiB0aGUgc3RyYXRlZ3kgaXMgaW52YWxpZCwKLSAgICAgKiAgICAgb3IgTk9fRVJST1IgaWYgdGhlIHByZWZlcnJlZCBkZXZpY2Ugd2FzIHNldAorICAgICAqIEBwYXJhbSByb2xlIHRoZSByb2xlIG9mIHRoZSBkZXZpY2VzIGZvciB0aGUgc3RyYXRlZ3kuIEFsbCBkZXZpY2Ugcm9sZXMgYXJlIGRlZmluZWQgYXQKKyAgICAgKiAgICAgICAgICAgICBzeXN0ZW0vbWVkaWEvYXVkaW8vaW5jbHVkZS9zeXN0ZW0vYXVkaW9fcG9saWN5LmguIERFVklDRV9ST0xFX05PTkUgaXMgaW52YWxpZAorICAgICAqICAgICAgICAgICAgIGZvciBzZXR0aW5nLgorICAgICAqIEBwYXJhbSBkZXZpY2VzIHRoZSBhdWRpbyBkZXZpY2VzIHRvIGJlIHNldAorICAgICAqIEByZXR1cm4gQkFEX1ZBTFVFIGlmIHRoZSBzdHJhdGVneSBvciByb2xlIGlzIGludmFsaWQsCisgICAgICogICAgIG9yIE5PX0VSUk9SIGlmIHRoZSByb2xlIG9mIHRoZSBkZXZpY2VzIGZvciBzdHJhdGVneSB3YXMgc2V0CiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSA9IDA7CiAKICAgICAvKioKLSAgICAgKiBAYnJpZWYgcmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kgcmVtb3ZlcyB0aGUgcHJlZmVycmVkIGRldmljZSBwcmV2aW91c2x5IHNldAorICAgICAqIEBicmllZiByZW1vdmVEZXZpY2VzUm9sZUZvclN0cmF0ZWd5IHJlbW92ZXMgdGhlIHJvbGUgb2YgZGV2aWNlKHMpIHByZXZpb3VzbHkgc2V0CiAgICAgICogZm9yIHRoZSBnaXZlbiBzdHJhdGVneQogICAgICAqIEBwYXJhbSBzdHJhdGVneSB0aGUgYXVkaW8gc3RyYXRlZ3kgd2hvc2Ugcm91dGluZyB3aWxsIGJlIGFmZmVjdGVkCi0gICAgICogQHJldHVybiBCQURfVkFMVUUgaWYgdGhlIHN0cmF0ZWd5IGlzIGludmFsaWQsCi0gICAgICogICAgIG9yIE5PX0VSUk9SIGlmIHRoZSBwcmVmZXJyZWQgZGV2aWNlIHdhcyByZW1vdmVkCisgICAgICogQHBhcmFtIHJvbGUgdGhlIHJvbGUgb2YgdGhlIGRldmljZXMgZm9yIHN0cmF0ZWd5CisgICAgICogQHJldHVybiBCQURfVkFMVUUgaWYgdGhlIHN0cmF0ZWd5IG9yIHJvbGUgaXMgaW52YWxpZCwKKyAgICAgKiAgICAgb3IgTk9fRVJST1IgaWYgdGhlIGRldmljZXMgZm9yIHRoaXMgcm9sZSB3YXMgcmVtb3ZlZAogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVEZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSkgPSAwOwogCiAgICAgLyoqCi0gICAgICogQGJyaWVmIGdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5IHF1ZXJpZXMgd2hpY2ggZGV2aWNlIGlzIHNldCBhcyB0aGUKLSAgICAgKiBwcmVmZXJyZWQgZGV2aWNlIGZvciB0aGUgZ2l2ZW4gc3RyYXRlZ3kKKyAgICAgKiBAYnJpZWYgZ2V0RGV2aWNlc0ZvclJvbGVBbmRTdHJhdGVneSBxdWVyaWVzIHdoaWNoIGRldmljZXMgaGF2ZSB0aGUgc3BlY2lmaWVkIHJvbGUgZm9yIHRoZQorICAgICAqIHNwZWNpZmllZCBzdHJhdGVneQogICAgICAqIEBwYXJhbSBzdHJhdGVneSB0aGUgc3RyYXRlZ3kgdG8gcXVlcnkKLSAgICAgKiBAcGFyYW0gZGV2aWNlIHJldHVybnMgY29uZmlndXJlZCBhcyB0aGUgcHJlZmVycmVkIGRldmljZSBpZiBvbmUgd2FzIHNldAotICAgICAqIEByZXR1cm4gQkFEX1ZBTFVFIGlmIHRoZSBzdHJhdGVneSBpcyBpbnZhbGlkLAotICAgICAqICAgICBvciBOQU1FX05PVF9GT1VORCBpZiBubyBwcmVmZXJyZWQgZGV2aWNlIHdhcyBzZXQKLSAgICAgKiAgICAgb3IgTk9fRVJST1IgaWYgdGhlIGRldmljZSBwYXJhbWV0ZXIgd2FzIGluaXRpYWxpemVkIHRvIHRoZSBwcmVmZXJyZWQgZGV2aWNlCisgICAgICogQHBhcmFtIHJvbGUgdGhlIHJvbGUgb2YgdGhlIGRldmljZXMgdG8gcXVlcnkKKyAgICAgKiBAcGFyYW0gZGV2aWNlcyByZXR1cm5zIGxpc3Qgb2YgZGV2aWNlcyB3aXRoIG1hdGNoaW5nIHJvbGUgZm9yIHRoZSBzcGVjaWZpZWQgc3RyYXRlZ3kuCisgICAgICogICAgICAgICAgICAgICAgREVWSUNFX1JPTEVfTk9ORSBpcyBpbnZhbGlkIGFzIGlucHV0LgorICAgICAqIEByZXR1cm4gQkFEX1ZBTFVFIGlmIHRoZSBzdHJhdGVneSBvciByb2xlIGlzIGludmFsaWQsCisgICAgICogICAgIG9yIE5BTUVfTk9UX0ZPVU5EIGlmIG5vIGRldmljZSBmb3IgdGhlIHJvbGUgYW5kIHN0cmF0ZWd5IHdhcyBzZXQKKyAgICAgKiAgICAgb3IgTk9fRVJST1IgaWYgdGhlIGRldmljZXMgcGFyYW1ldGVyIGNvbnRhaW5zIGEgbGlzdCBvZiBkZXZpY2VzCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgc2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0IHNldHMgZGV2aWNlcyByb2xlIGZvciBhIGNhcHR1cmUgcHJlc2V0IHdoZW4gYXZhaWxhYmxlLgorICAgICAqIFRvIHJlbW92ZSBkZXZpY2VzIHJvbGUsIHJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCBtdXN0IGJlIGNhbGxlZC4gQ2FsbGluZworICAgICAqIGNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0IHdpbGwgcmVtb3ZlIGFsbCBkZXZpY2VzIGFzIHJvbGUuIFdoZW4gZGV2aWNlcyByb2xlIGlzIHNldAorICAgICAqIHN1Y2Nlc3NmdWxseSwgcHJldmlvdXNseSBzZXQgZGV2aWNlcyBmb3IgdGhlIHNhbWUgcm9sZSBhbmQgY2FwdHVyZSBwcmVzZXQgd2lsbCBiZSByZW1vdmVkLgorICAgICAqIEBwYXJhbSBhdWRpb1NvdXJjZSB0aGUgYXVkaW8gY2FwdHVyZSBwcmVzZXQgd2hvc2Ugcm91dGluZyB3aWxsIGJlIGFmZmVjdGVkCisgICAgICogQHBhcmFtIHJvbGUgdGhlIHJvbGUgb2YgdGhlIGRldmljZXMgZm9yIHRoZSBjYXB0dXJlIHByZXNldC4gQWxsIGRldmljZSByb2xlcyBhcmUgZGVmaW5lZCBhdAorICAgICAqICAgICAgICAgICAgIHN5c3RlbS9tZWRpYS9hdWRpby9pbmNsdWRlL3N5c3RlbS9hdWRpb19wb2xpY3kuaC4gREVWSUNFX1JPTEVfTk9ORSBpcyBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgZm9yIHNldHRpbmcuCisgICAgICogQHBhcmFtIGRldmljZXMgdGhlIGF1ZGlvIGRldmljZXMgdG8gYmUgc2V0CisgICAgICogQHJldHVybiBCQURfVkFMVUUgaWYgdGhlIGNhcHR1cmUgcHJlc2V0IG9yIHJvbGUgaXMgaW52YWxpZCwKKyAgICAgKiAgICAgb3IgTk9fRVJST1IgaWYgdGhlIHJvbGUgb2YgdGhlIGRldmljZXMgZm9yIGNhcHR1cmUgcHJlc2V0IHdhcyBzZXQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCBhZGRzIGRldmljZXMgcm9sZSBmb3IgYSBjYXB0dXJlIHByZXNldCB3aGVuIGF2YWlsYWJsZS4KKyAgICAgKiBUbyByZW1vdmUgZGV2aWNlcyByb2xlLCByZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQgbXVzdCBiZSBjYWxsZWQuIENhbGxpbmcKKyAgICAgKiBjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCB3aWxsIHJlbW92ZSBhbGwgZGV2aWNlcyBhcyByb2xlLgorICAgICAqIEBwYXJhbSBhdWRpb1NvdXJjZSB0aGUgYXVkaW8gY2FwdHVyZSBwcmVzZXQgd2hvc2Ugcm91dGluZyB3aWxsIGJlIGFmZmVjdGVkCisgICAgICogQHBhcmFtIHJvbGUgdGhlIHJvbGUgb2YgdGhlIGRldmljZXMgZm9yIHRoZSBjYXB0dXJlIHByZXNldC4gQWxsIGRldmljZSByb2xlcyBhcmUgZGVmaW5lZCBhdAorICAgICAqICAgICAgICAgICAgIHN5c3RlbS9tZWRpYS9hdWRpby9pbmNsdWRlL3N5c3RlbS9hdWRpb19wb2xpY3kuaC4gREVWSUNFX1JPTEVfTk9ORSBpcyBpbnZhbGlkCisgICAgICogICAgICAgICAgICAgZm9yIHNldHRpbmcuCisgICAgICogQHBhcmFtIGRldmljZXMgdGhlIGF1ZGlvIGRldmljZXMgdG8gYmUgYWRkZWQKKyAgICAgKiBAcmV0dXJuIEJBRF9WQUxVRSBpZiB0aGUgY2FwdHVyZSBwcmVzZXQgb3Igcm9sZSBpcyBpbnZhbGlkLAorICAgICAqICAgICBvciBOT19FUlJPUiBpZiB0aGUgcm9sZSBvZiB0aGUgZGV2aWNlcyBmb3IgY2FwdHVyZSBwcmVzZXQgd2FzIGFkZGVkCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiByZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQgcmVtb3ZlcyB0aGUgcm9sZSBvZiBkZXZpY2UocykgcHJldmlvdXNseSBzZXQKKyAgICAgKiBmb3IgdGhlIGdpdmVuIGNhcHR1cmUgcHJlc2V0CisgICAgICogQHBhcmFtIGF1ZGlvU291cmNlIHRoZSBhdWRpbyBjYXB0dXJlIHByZXNldCB3aG9zZSByb3V0aW5nIHdpbGwgYmUgYWZmZWN0ZWQKKyAgICAgKiBAcGFyYW0gcm9sZSB0aGUgcm9sZSBvZiB0aGUgZGV2aWNlcyBmb3IgdGhlIGNhcHR1cmUgcHJlc2V0CisgICAgICogQHBhcmFtIGRldmljZXMgdGhlIGRldmljZXMgdG8gYmUgcmVtb3ZlZAorICAgICAqIEByZXR1cm4gQkFEX1ZBTFVFIGlmIDEpIHRoZSBjYXB0dXJlIHByZXNldCBpcyBpbnZhbGlkLCAyKSByb2xlIGlzIGludmFsaWQgb3IgMykgdGhlIGxpc3Qgb2YKKyAgICAgKiAgICAgZGV2aWNlcyB0byBiZSByZW1vdmVkIGFyZSBub3QgYWxsIHByZXNlbnQgYXMgcm9sZSBmb3IgYSBjYXB0dXJlIHByZXNldAorICAgICAqICAgICBvciBOT19FUlJPUiBpZiB0aGUgZGV2aWNlcyBmb3IgdGhpcyByb2xlIHdhcyByZW1vdmVkCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCByZW1vdmVzIHRoZSByb2xlIG9mIGFsbCBkZXZpY2UocykgcHJldmlvdXNseSBzZXQKKyAgICAgKiBmb3IgdGhlIGdpdmVuIGNhcHR1cmUgcHJlc2V0CisgICAgICogQHBhcmFtIGF1ZGlvU291cmNlIHRoZSBhdWRpbyBjYXB0dXJlIHByZXNldCB3aG9zZSByb3V0aW5nIHdpbGwgYmUgYWZmZWN0ZWQKKyAgICAgKiBAcGFyYW0gcm9sZSB0aGUgcm9sZSBvZiB0aGUgZGV2aWNlcyBmb3IgdGhlIGNhcHR1cmUgcHJlc2V0CisgICAgICogQHJldHVybiBCQURfVkFMVUUgaWYgdGhlIGNhcHR1cmUgcHJlc2V0IG9yIHJvbGUgaXMgaW52YWxpZCwKKyAgICAgKiAgICAgb3IgTk9fRVJST1IgaWYgdGhlIGRldmljZXMgZm9yIHRoaXMgcm9sZSB3YXMgcmVtb3ZlZAorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUpOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldCBxdWVyaWVzIHdoaWNoIGRldmljZXMgaGF2ZSB0aGUgc3BlY2lmaWVkIHJvbGUgZm9yCisgICAgICogdGhlIHNwZWNpZmllZCBjYXB0dXJlIHByZXNldAorICAgICAqIEBwYXJhbSBhdWRpb1NvdXJjZSB0aGUgY2FwdHVyZSBwcmVzZXQgdG8gcXVlcnkKKyAgICAgKiBAcGFyYW0gcm9sZSB0aGUgcm9sZSBvZiB0aGUgZGV2aWNlcyB0byBxdWVyeQorICAgICAqIEBwYXJhbSBkZXZpY2VzIHJldHVybnMgbGlzdCBvZiBkZXZpY2VzIHdpdGggbWF0Y2hpbmcgcm9sZSBmb3IgdGhlIHNwZWNpZmllZCBjYXB0dXJlIHByZXNldC4KKyAgICAgKiAgICAgICAgICAgICAgICBERVZJQ0VfUk9MRV9OT05FIGlzIGludmFsaWQgYXMgaW5wdXQuCisgICAgICogQHJldHVybiBCQURfVkFMVUUgaWYgdGhlIGNhcHR1cmUgcHJlc2V0IG9yIHJvbGUgaXMgaW52YWxpZCwKKyAgICAgKiAgICAgb3IgTkFNRV9OT1RfRk9VTkQgaWYgbm8gZGV2aWNlIGZvciB0aGUgcm9sZSBhbmQgY2FwdHVyZSBwcmVzZXQgd2FzIHNldAorICAgICAqICAgICBvciBOT19FUlJPUiBpZiB0aGUgZGV2aWNlcyBwYXJhbWV0ZXIgY29udGFpbnMgYSBsaXN0IG9mIGRldmljZXMKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgY29uc3QgPSAwOwogCiAKICAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0ID0gMDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL0FuZHJvaWQuYnAKaW5kZXggOGY1MjJmMC4uYTc0NzgyMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X2hlYWRlcnMgewogICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYWJsZV9pbnRlcmZhY2VfaGVhZGVycyIsCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL0FuZHJvaWQuYnAKaW5kZXggZmUzZWFlMC4uYjNkMWY5NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvQW5kcm9pZC5icApAQCAtMTYsNiArMTYsMTUgQEAKIAogLy8gUm9vdCBzb29uZ19uYW1lc3BhY2UgZm9yIGNvbW1vbiBjb21wb25lbnRzCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogcHJlYnVpbHRfZXRjIHsKICAgICBuYW1lOiAiYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwiLAogICAgIHZlbmRvcjogdHJ1ZSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvYXV0b21vdGl2ZS9BbmRyb2lkLmJwCmluZGV4IGY5MTNhMTQuLmU0NmI2MGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUvQW5kcm9pZC5icApAQCAtMjIsNiArMjIsMTUgQEAKICAgICBdLAogfQogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIHByZWJ1aWx0X2V0YyB7CiAgICAgbmFtZTogImF1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwiLAogICAgIHZlbmRvcjogdHJ1ZSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jYXJlbXUvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jYXJlbXUvQW5kcm9pZC5icAppbmRleCBmYWU2YjdiLi5hZDZlZWIxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY2FyZW11L0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NhcmVtdS9BbmRyb2lkLmJwCkBAIC0yMyw2ICsyMywxNSBAQAogICAgIF0sCiB9CiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogcHJlYnVpbHRfZXRjIHsKICAgICBuYW1lOiAiYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbCIsCiAgICAgdmVuZG9yOiB0cnVlLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvQW5kcm9pZC5icAppbmRleCA5NGQzM2JkLi43NzNhOTlhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvQW5kcm9pZC5icApAQCAtMjIsNiArMjIsMTUgQEAKICAgICBdLAogfQogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIHByZWJ1aWx0X2V0YyB7CiAgICAgbmFtZTogImF1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwiLAogICAgIHZlbmRvcjogdHJ1ZSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCmluZGV4IGE3Mzg4ZGEuLmJjMzI0MTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbApAQCAtNjUsNiArNjUsMTIgQEAKICAgICA8L1Byb2R1Y3RTdHJhdGVneT4KIAogICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfTUVESUEiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9BU1NJU1RBTlQiIHZvbHVtZUdyb3VwPSJhc3Npc3RhbnQiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+CisgICAgICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+CisgICAgICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTlQiLz4KKyAgICAgICAgICAgIDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CiAgICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9NVVNJQyIgdm9sdW1lR3JvdXA9Im11c2ljIj4KICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX01FRElBIi8+IDwvQXR0cmlidXRlcz4KICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0dBTUUiLz4gPC9BdHRyaWJ1dGVzPgpAQCAtNzIsMTIgKzc4LDYgQEAKICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPiA8L0F0dHJpYnV0ZXM+CiAgICAgICAgICAgICA8QXR0cmlidXRlcz48L0F0dHJpYnV0ZXM+CiAgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgotICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9BU1NJU1RBTlQiIHZvbHVtZUdyb3VwPSJhc3Npc3RhbnQiPgotICAgICAgICAgICAgPEF0dHJpYnV0ZXM+Ci0gICAgICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+Ci0gICAgICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTlQiLz4KLSAgICAgICAgICAgIDwvQXR0cmlidXRlcz4KLSAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CiAgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1NZU1RFTSIgdm9sdW1lR3JvdXA9InN5c3RlbSI+CiAgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+CiAgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL0FuZHJvaWQuYnAKaW5kZXggOTBlYmZmZC4uZWU2MmQ1ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9BbmRyb2lkLmJwCkBAIC0xNiw2ICsxNiwxNSBAQAogCiAvLyBSb290IHNvb25nX25hbWVzcGFjZSBmb3IgY29tbW9uIGNvbXBvbmVudHMKIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBwcmVidWlsdF9ldGMgewogICAgIG5hbWU6ICJQb2xpY3lDbGFzcy54bWwiLAogICAgIHZlbmRvcjogdHJ1ZSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0Nhci9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyL0FuZHJvaWQuYnAKaW5kZXggODJiMWI2ZC4uMmQ1N2Q0ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyL0FuZHJvaWQuYnAKQEAgLTI2LDYgKzI2LDE3IEBACiAvLwogLy8gR2VuZXJhdGUgQXVkaW8gUG9saWN5IFBhcmFtZXRlciBGcmFtZXdvcmsgUHJvZHVjdCBTdHJhdGVnaWVzIFN0cnVjdHVyZSBmaWxlIGZyb20gdGVtcGxhdGUKIC8vCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLU1JVAorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItVW5pY29kZS1ERlMKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIHByZWJ1aWx0X2V0YyB7CiAgICAgbmFtZTogIlByb2R1Y3RTdHJhdGVnaWVzLnhtbCIsCiAgICAgdmVuZG9yOiB0cnVlLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyRW11L0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXJFbXUvQW5kcm9pZC5icAppbmRleCBlNDYwNWIyLi5kZjMxYmI5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXJFbXUvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXJFbXUvQW5kcm9pZC5icApAQCAtMjcsNiArMjcsMTcgQEAKIC8vCiAvLyBHZW5lcmF0ZSBBdWRpbyBQb2xpY3kgUGFyYW1ldGVyIEZyYW1ld29yayBQcm9kdWN0IFN0cmF0ZWdpZXMgU3RydWN0dXJlIGZpbGUgZnJvbSB0ZW1wbGF0ZQogLy8KK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItTUlUCisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1Vbmljb2RlLURGUworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogcHJlYnVpbHRfZXRjIHsKICAgICBuYW1lOiAiUHJvZHVjdFN0cmF0ZWdpZXMueG1sIiwKICAgICB2ZW5kb3I6IHRydWUsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvQW5kcm9pZC5icAppbmRleCA2MWI1NGNmLi42NWFiOGI2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL0FuZHJvaWQuYnAKQEAgLTI2LDYgKzI2LDE3IEBACiAvLwogLy8gR2VuZXJhdGUgQXVkaW8gUG9saWN5IFBhcmFtZXRlciBGcmFtZXdvcmsgUHJvZHVjdCBTdHJhdGVnaWVzIFN0cnVjdHVyZSBmaWxlIGZyb20gdGVtcGxhdGUKIC8vCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLU1JVAorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItVW5pY29kZS1ERlMKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIHByZWJ1aWx0X2V0YyB7CiAgICAgbmFtZTogIlByb2R1Y3RTdHJhdGVnaWVzLnhtbCIsCiAgICAgdmVuZG9yOiB0cnVlLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3NOb0lucHV0L0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5nc05vSW5wdXQvQW5kcm9pZC5icAppbmRleCA5YWJjYjcwLi45MDE1NGVlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5nc05vSW5wdXQvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5nc05vSW5wdXQvQW5kcm9pZC5icApAQCAtMjMsNiArMjMsMTcgQEAKICAgICBdLAogfQogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLU1JVAorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItVW5pY29kZS1ERlMKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIHByZWJ1aWx0X2V0YyB7CiAgICAgbmFtZTogInBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5IiwKICAgICBmaWxlbmFtZV9mcm9tX3NyYzogdHJ1ZSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzTm9PdXRwdXQvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzTm9PdXRwdXQvQW5kcm9pZC5icAppbmRleCAyNzE3MmE0Li41YjA2ODUyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5nc05vT3V0cHV0L0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3NOb091dHB1dC9BbmRyb2lkLmJwCkBAIC0yMyw2ICsyMywxNyBAQAogICAgIF0sCiB9CiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItTUlUCisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1Vbmljb2RlLURGUworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogcHJlYnVpbHRfZXRjIHsKICAgICBuYW1lOiAicGFyYW1ldGVyLWZyYW1ld29yay5wb2xpY3kiLAogICAgIGZpbGVuYW1lX2Zyb21fc3JjOiB0cnVlLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vQW5kcm9pZC5icAppbmRleCAyNjg1YzZkLi4wMzk4ZmM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlicG9saWN5LXN1YnN5c3RlbSIsCiAgICAgc3JjczogWwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5jcHAKaW5kZXggZjkxZjhkNy4uZjhhNmZjMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vSW5wdXRTb3VyY2UuY3BwCkBAIC00NSw3ICs0NSw3IEBACiAKIGJvb2wgSW5wdXRTb3VyY2U6OnNlbmRUb0hXKHN0cmluZyAmIC8qZXJyb3IqLykKIHsKLSAgICB1aW50MzJfdCBhcHBsaWNhYmxlSW5wdXREZXZpY2U7CisgICAgYXVkaW9fZGV2aWNlc190IGFwcGxpY2FibGVJbnB1dERldmljZTsKICAgICBibGFja2JvYXJkUmVhZCgmYXBwbGljYWJsZUlucHV0RGV2aWNlLCBzaXplb2YoYXBwbGljYWJsZUlucHV0RGV2aWNlKSk7CiAgICAgcmV0dXJuIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPnNldERldmljZUZvcklucHV0U291cmNlKG1JZCwgYXBwbGljYWJsZUlucHV0RGV2aWNlKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuaAppbmRleCAyNDRmMDgyLi42YzhlYjY1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUHJvZHVjdFN0cmF0ZWd5LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5oCkBAIC0zMiw3ICszMiw3IEBACiAKICAgICBzdHJ1Y3QgRGV2aWNlCiAgICAgewotICAgICAgICB1aW50MzJfdCBhcHBsaWNhYmxlRGV2aWNlOyAvKio8IGFwcGxpY2FibGUgZGV2aWNlIGZvciB0aGlzIHN0cmF0ZWd5LiAqLworICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXBwbGljYWJsZURldmljZTsgLyoqPCBhcHBsaWNhYmxlIGRldmljZSBmb3IgdGhpcyBzdHJhdGVneS4gKi8KICAgICAgICAgY2hhciBkZXZpY2VBZGRyZXNzW21NYXhTdHJpbmdTaXplXTsgLyoqPCBkZXZpY2UgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdHJhdGVneS4gKi8KICAgICB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuY3BwCmluZGV4IGFhMDZhZTMuLmY0NjQ1ZTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuY3BwCkBAIC01MSw3ICs1MSw3IEBACiAgICAgICAgIG1BcHBsaWNhYmxlRGV2aWNlcyA9IGRldmljZXM7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9Ci0gICAgZGV2aWNlcyB8PSBBVURJT19ERVZJQ0VfQklUX0lOOworICAgIGRldmljZXMgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KGRldmljZXMgfCBBVURJT19ERVZJQ0VfQklUX0lOKTsKICAgICBpZiAoIWF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2VzKSkgewogICAgICAgICBBTE9HRSgiJXM6IHRyeWluZyB0byBzZXQgYW4gaW52YWxpZCBkZXZpY2UgMHglWCBmb3IgaW5wdXQgc291cmNlICVzIiwKICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2VzLCBnZXROYW1lKCkuY19zdHIoKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9BbmRyb2lkLmJwCmluZGV4IDNlNDczMjQuLjQwZWZiM2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9BbmRyb2lkLmJwCkBAIC0xMiw2ICsxMiwxNSBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogcHl0aG9uX2RlZmF1bHRzIHsKICAgICBuYW1lOiAidG9vbHNfZGVmYXVsdCIsCiAgICAgdmVyc2lvbjogewpAQCAtNDIsOCArNTEsOCBAQAogICAgIGNtZDogImNwICQobG9jYXRpb25zIDphdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9maWxlcykgJChnZW5EaXIpLy4gJiYgIiArCiAgICAgICAgICAiY3AgJChsb2NhdGlvbiA6YXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fdG9wX2ZpbGUpICQoZ2VuRGlyKS9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgJiYgIiArCiAgICAgICAgICAiJChsb2NhdGlvbiBidWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5KSAiICsKLSAgICAgICAgIC8vIEB0b2RvIHVwZGF0ZSBpZiAxNDI4NjU5IGlzIG1lcmdlZCAiLS1hbmRyb2lkYXVkaW9iYXNlaGVhZGVyICQobG9jYXRpb24gOmFuZHJvaWRfYXVkaW9fYmFzZV9oZWFkZXJfZmlsZSkgIiArCi0gICAgICAgICAiIC0tYW5kcm9pZGF1ZGlvYmFzZWhlYWRlciBzeXN0ZW0vbWVkaWEvYXVkaW8vaW5jbHVkZS9zeXN0ZW0vYXVkaW8tYmFzZS5oICIgKworICAgICAgICAgIiAtLWFuZHJvaWRhdWRpb2Jhc2VoZWFkZXIgJChsb2NhdGlvbiA6bGliYXVkaW9fc3lzdGVtX2F1ZGlvX2Jhc2UpICIgKworICAgICAgICAgIiAtLWFuZHJvaWRhdWRpb2NvbW1vbmJhc2VoZWFkZXIgJChsb2NhdGlvbiA6bGliYXVkaW9fc3lzdGVtX2F1ZGlvX2NvbW1vbl9iYXNlKSAiICsKICAgICAgICAgICItLWF1ZGlvcG9saWN5Y29uZmlndXJhdGlvbmZpbGUgJChnZW5EaXIpL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCAiICsKICAgICAgICAgICItLWNyaXRlcmlvbnR5cGVzICQobG9jYXRpb24gOmF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzX3RlbXBsYXRlKSAiICsKICAgICAgICAgICItLW91dHB1dGZpbGUgJChvdXQpIiwKQEAgLTUxLDYgKzYwLDggQEAKICAgICAgICAgLy8gVGhlIGNvbW1lbnRlZCBpbnB1dHMgbXVzdCBiZSBwcm92aWRlZCB0byB1c2UgdGhpcyBnZW5ydWxlX2RlZmF1bHRzCiAgICAgICAgIC8vIEB0b2RvIHVuY29tbWVudCBpZiAxNDI4NjU5IGlzIG1lcmdlZCI6YW5kcm9pZF9hdWRpb19iYXNlX2hlYWRlcl9maWxlIiwKICAgICAgICAgIjphdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlc190ZW1wbGF0ZSIsCisgICAgICAgICI6bGliYXVkaW9fc3lzdGVtX2F1ZGlvX2Jhc2UiLAorICAgICAgICAiOmxpYmF1ZGlvX3N5c3RlbV9hdWRpb19jb21tb25fYmFzZSIsCiAgICAgICAgIC8vICI6YXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fdG9wX2ZpbGUiLAogICAgICAgICAvLyAiOmF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2ZpbGVzIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkQ29tbW9uVHlwZXNTdHJ1Y3R1cmVGaWxlLnB5IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkQ29tbW9uVHlwZXNTdHJ1Y3R1cmVGaWxlLnB5CmluZGV4IDlhN2ZhOGYuLjQzYjNkZDIgMTAwNzU1Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZENvbW1vblR5cGVzU3RydWN0dXJlRmlsZS5weQorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRDb21tb25UeXBlc1N0cnVjdHVyZUZpbGUucHkKQEAgLTUyLDEzICs1MiwxOSBAQAogZGVmIGZpbmRCaXRQb3MoZGVjaW1hbCk6CiAgICAgcG9zID0gMAogICAgIGkgPSAxCi0gICAgd2hpbGUgaSAhPSBkZWNpbWFsOgorICAgIHdoaWxlIGkgPCBkZWNpbWFsOgogICAgICAgICBpID0gaSA8PCAxCiAgICAgICAgIHBvcyA9IHBvcyArIDEKICAgICAgICAgaWYgcG9zID09IDMyOgogICAgICAgICAgICAgcmV0dXJuIC0xCi0gICAgcmV0dXJuIHBvcwogCisgICAgIyBUT0RPOiBiLzE2ODA2NTcwNi4gVGhpcyBpcyBqdXN0IHRvIGZpeCB0aGUgYnVpbGQuIFRoYXQgdGhlIHByb2JsZW0gb2YgZGV2aWNlcyB3aXRoCisgICAgIyBtdWx0aXBsZSBiaXRzIHNldCBtdXN0IGJlIGFkZHJlc3NlZCBtb3JlIGdlbmVyYWxseSBpbiB0aGUgY29uZmlndXJhYmxlIGF1ZGlvIHBvbGljeQorICAgICMgYW5kIHBhcmFtZXRlciBmcmFtZXdvcmsuCisgICAgaWYgaSA+IGRlY2ltYWw6CisgICAgICAgIGxvZ2dpbmcuaW5mbygiRGV2aWNlOnt9IHdoaWNoIGhhcyBtdWx0aXBsZSBiaXRzIHNldCBpcyBza2lwcGVkLiBiLzE2ODA2NTcwNiIuZm9ybWF0KGRlY2ltYWwpKQorICAgICAgICByZXR1cm4gLTIKKyAgICByZXR1cm4gcG9zCiAKIGRlZiBnZW5lcmF0ZVhtbFN0cnVjdHVyZUZpbGUoY29tcG9uZW50VHlwZURpY3QsIHN0cnVjdHVyZVR5cGVzRmlsZSwgb3V0cHV0RmlsZSk6CiAKQEAgLTc0LDEwICs4MCwxMiBAQAogICAgICAgICAgICAgICAgIGlmIGJpdHBhcmFtZXRlcnNfbm9kZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZF92YWx1ZXMgPSBPcmRlcmVkRGljdChzb3J0ZWQodmFsdWVzX2RpY3QuaXRlbXMoKSwga2V5PWxhbWJkYSB4OiB4WzFdKSkKICAgICAgICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gb3JkZXJlZF92YWx1ZXMuaXRlbXMoKToKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUgPSBFVC5TdWJFbGVtZW50KGJpdHBhcmFtZXRlcnNfbm9kZSwgIkJpdFBhcmFtZXRlciIpCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlLnNldCgnTmFtZScsIGtleSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUuc2V0KCdTaXplJywgIjEiKQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ1BvcycsIHN0cihmaW5kQml0UG9zKHZhbHVlKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSBmaW5kQml0UG9zKHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcG9zID49IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZSA9IEVULlN1YkVsZW1lbnQoYml0cGFyYW1ldGVyc19ub2RlLCAiQml0UGFyYW1ldGVyIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlLnNldCgnTmFtZScsIGtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlLnNldCgnU2l6ZScsICIxIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlLnNldCgnUG9zJywgc3RyKHBvcykpCiAKICAgICAgICAgICAgICAgICBlbnVtX3BhcmFtZXRlcl9ub2RlID0gY29tcG9uZW50X3R5cGUuZmluZCgiRW51bVBhcmFtZXRlciIpCiAgICAgICAgICAgICAgICAgaWYgZW51bV9wYXJhbWV0ZXJfbm9kZSBpcyBub3QgTm9uZToKQEAgLTExOCw5ICsxMjYsOSBAQAogICAgIGlnbm9yZWRfdmFsdWVzID0gWydDTlQnLCAnTUFYJywgJ0FMTCcsICdOT05FJ10KIAogICAgIGNyaXRlcmlhX3BhdHRlcm4gPSByZS5jb21waWxlKAotICAgICAgICByIlxzKig/UDx0eXBlPig/OiIrJ3wnLmpvaW4oY29tcG9uZW50X3R5cGVfbWFwcGluZ190YWJsZS5rZXlzKCkpICsgIikpXyIgXAotICAgICAgICByIig/UDxsaXRlcmFsPig/ISIgKyAnfCcuam9pbihpZ25vcmVkX3ZhbHVlcykgKyAiKVx3Kilccyo9XHMqIiBcCi0gICAgICAgIHIiKD9QPHZhbHVlcz4oPzowW3hYXSk/WzAtOWEtZkEtRl0rKSIpCisgICAgICAgIHIiXHMqVlwoKD9QPHR5cGU+KD86IisnfCcuam9pbihjb21wb25lbnRfdHlwZV9tYXBwaW5nX3RhYmxlLmtleXMoKSkgKyAiKSlfIiBcCisgICAgICAgIHIiKD9QPGxpdGVyYWw+KD8hIiArICd8Jy5qb2luKGlnbm9yZWRfdmFsdWVzKSArICIpXHcqKVxzKixccyoiIFwKKyAgICAgICAgciIoPzpBVURJT19ERVZJQ0VfQklUX0lOIFx8ICk/KD9QPHZhbHVlcz4oPzowW3hYXSlbMC05YS1mQS1GXSt8WzAtOV0rKSIpCiAKICAgICBsb2dnaW5nLmluZm8oIkNoZWNraW5nIEFuZHJvaWQgSGVhZGVyIGZpbGUge30iLmZvcm1hdChhbmRyb2lkYXVkaW9iYXNlaGVhZGVyRmlsZSkpCiAKQEAgLTE1NiwxMyArMTY0LDE0IEBACiAKICAgICAgICAgICAgIGxvZ2dpbmcuZGVidWcoInR5cGU6e30sIGxpdGVyYWw6e30sIHZhbHVlczp7fS4iLmZvcm1hdChjb21wb25lbnRfdHlwZV9uYW1lLCBjb21wb25lbnRfdHlwZV9saXRlcmFsLCBjb21wb25lbnRfdHlwZV9udW1lcmljYWxfdmFsdWUpKQogCi0gICAgIyBUcmFuc2Zvcm0gaW5wdXQgc291cmNlIGluIGluY2x1c2l2ZSBjcml0ZXJpb24KLSAgICBzaGlmdCA9IGxlbihhbGxfY29tcG9uZW50X3R5cGVzWydPdXRwdXREZXZpY2VzTWFzayddKQotICAgIGlmIHNoaWZ0ID4gMzI6Ci0gICAgICAgIGxvZ2dpbmcuY3JpdGljYWwoIk91dHB1dERldmljZXNNYXNrIGluY29tcGF0aWJsZSB3aXRoIGNyaXRlcmlvbiByZXByZXNlbnRhdGlvbiBvbiAzMiBiaXRzIikKLSAgICAgICAgbG9nZ2luZy5pbmZvKCJFWElUIE9OIEZBSUxVUkUiKQotICAgICAgICBleGl0KDEpCisgICAgaWYgInN0dWIiIG5vdCBpbiBhbGxfY29tcG9uZW50X3R5cGVzWyJPdXRwdXREZXZpY2VzTWFzayJdOgorICAgICAgICBhbGxfY29tcG9uZW50X3R5cGVzWyJPdXRwdXREZXZpY2VzTWFzayJdWyJzdHViIl0gPSAweDQwMDAwMDAwCisgICAgICAgIGxvZ2dpbmcuaW5mbygiYWRkZWQgc3R1YiBvdXRwdXQgZGV2aWNlIG1hc2siKQorICAgIGlmICJzdHViIiBub3QgaW4gYWxsX2NvbXBvbmVudF90eXBlc1siSW5wdXREZXZpY2VzTWFzayJdOgorICAgICAgICBhbGxfY29tcG9uZW50X3R5cGVzWyJJbnB1dERldmljZXNNYXNrIl1bInN0dWIiXSA9IDB4NDAwMDAwMDAKKyAgICAgICAgbG9nZ2luZy5pbmZvKCJhZGRlZCBzdHViIGlucHV0IGRldmljZSBtYXNrIikKIAorICAgICMgVHJhbnNmb3JtIGlucHV0IHNvdXJjZSBpbiBpbmNsdXNpdmUgY3JpdGVyaW9uCiAgICAgZm9yIGNvbXBvbmVudF90eXBlcyBpbiBhbGxfY29tcG9uZW50X3R5cGVzOgogICAgICAgICB2YWx1ZXMgPSAnLCcuam9pbigne306e30nLmZvcm1hdCh2YWx1ZSwga2V5KSBmb3Iga2V5LCB2YWx1ZSBpbiBhbGxfY29tcG9uZW50X3R5cGVzW2NvbXBvbmVudF90eXBlc10uaXRlbXMoKSkKICAgICAgICAgbG9nZ2luZy5pbmZvKCJ7fTogPHt9PiIuZm9ybWF0KGNvbXBvbmVudF90eXBlcywgdmFsdWVzKSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkUG9saWN5Q3JpdGVyaW9uVHlwZXMucHkKaW5kZXggYjhiNjBjMS4uYjU4ODVjMCAxMDA3NTUKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkUG9saWN5Q3JpdGVyaW9uVHlwZXMucHkKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkUG9saWN5Q3JpdGVyaW9uVHlwZXMucHkKQEAgLTU1LDYgKzU1LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhdmFyPSJBTkRST0lEX0FVRElPX0JBU0VfSEVBREVSIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3InKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hbmRyb2lkYXVkaW9jb21tb25iYXNlaGVhZGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkFuZHJvaWQgQXVkaW8gQ29tbW9uQmFzZSBDIGhlYWRlciBmaWxlLCBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGF2YXI9IkFORFJPSURfQVVESU9fQ09NTU9OX0JBU0VfSEVBREVSIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3InKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCiAgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkFuZHJvaWQgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSwgTWFuZGF0b3J5LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhdmFyPSIoQVVESU9fUE9MSUNZX0NPTkZJR1VSQVRJT05fRklMRSkiLApAQCAtMTc2LDEyICsxODEsMTIgQEAKICMgICAtT3V0cHV0IGRldmljZXMgdHlwZQogIyAgIC1JbnB1dCBkZXZpY2VzIHR5cGUKICMKLWRlZiBwYXJzZUFuZHJvaWRBdWRpb0ZpbGUoYW5kcm9pZGF1ZGlvYmFzZWhlYWRlckZpbGUpOgorZGVmIHBhcnNlQW5kcm9pZEF1ZGlvRmlsZShhbmRyb2lkYXVkaW9iYXNlaGVhZGVyRmlsZSwgYW5kcm9pZGF1ZGlvY29tbW9uYmFzZWhlYWRlckZpbGUpOgogICAgICMKICAgICAjIEFkYXB0YXRpb24gdGFibGUgYmV0d2VlbiBBbmRyb2lkIEVudW1lcmF0aW9uIHByZWZpeCBhbmQgQXVkaW8gUEZXIENyaXRlcmlvbiB0eXBlIG5hbWVzCiAgICAgIwogICAgIGNyaXRlcmlvbl9tYXBwaW5nX3RhYmxlID0gewotICAgICAgICAnQVVESU9fTU9ERScgOiAiQW5kcm9pZE1vZGVUeXBlIiwKKyAgICAgICAgJ0hBTF9BVURJT19NT0RFJyA6ICJBbmRyb2lkTW9kZVR5cGUiLAogICAgICAgICAnQVVESU9fREVWSUNFX09VVCcgOiAiT3V0cHV0RGV2aWNlc01hc2tUeXBlIiwKICAgICAgICAgJ0FVRElPX0RFVklDRV9JTicgOiAiSW5wdXREZXZpY2VzTWFza1R5cGUifQogCkBAIC0xOTYsOSArMjAxLDkgQEAKICAgICBpZ25vcmVkX3ZhbHVlcyA9IFsnQ05UJywgJ01BWCcsICdBTEwnLCAnTk9ORSddCiAKICAgICBjcml0ZXJpYV9wYXR0ZXJuID0gcmUuY29tcGlsZSgKLSAgICAgICAgciJccyooP1A8dHlwZT4oPzoiKyd8Jy5qb2luKGNyaXRlcmlvbl9tYXBwaW5nX3RhYmxlLmtleXMoKSkgKyAiKSlfIiBcCi0gICAgICAgIHIiKD9QPGxpdGVyYWw+KD8hIiArICd8Jy5qb2luKGlnbm9yZWRfdmFsdWVzKSArICIpXHcqKVxzKj1ccyoiIFwKLSAgICAgICAgciIoP1A8dmFsdWVzPig/OjBbeFhdKT9bMC05YS1mQS1GXSspIikKKyAgICAgICAgciJccypWXCgoP1A8dHlwZT4oPzoiKyd8Jy5qb2luKGNyaXRlcmlvbl9tYXBwaW5nX3RhYmxlLmtleXMoKSkgKyAiKSlfIiBcCisgICAgICAgIHIiKD9QPGxpdGVyYWw+KD8hIiArICd8Jy5qb2luKGlnbm9yZWRfdmFsdWVzKSArICIpXHcqKVxzKixccyoiIFwKKyAgICAgICAgciIoPzpBVURJT19ERVZJQ0VfQklUX0lOIFx8ICk/KD9QPHZhbHVlcz4oPzowW3hYXSk/WzAtOWEtZkEtRl0rfFswLTldKykiKQogCiAgICAgbG9nZ2luZy5pbmZvKCJDaGVja2luZyBBbmRyb2lkIEhlYWRlciBmaWxlIHt9Ii5mb3JtYXQoYW5kcm9pZGF1ZGlvYmFzZWhlYWRlckZpbGUpKQogCkBAIC0yMDksMjcgKzIxNCw5MSBAQAogICAgICAgICAgICAgICAgIGFuZHJvaWRhdWRpb2Jhc2VoZWFkZXJGaWxlLm5hbWUsIGxpbmVfbnVtYmVyLCBsaW5lKSkKIAogICAgICAgICAgICAgY3JpdGVyaW9uX25hbWUgPSBjcml0ZXJpb25fbWFwcGluZ190YWJsZVttYXRjaC5ncm91cGRpY3QoKVsndHlwZSddXQotICAgICAgICAgICAgbGl0ZXJhbCA9ICcnLmpvaW4oKHcuY2FwaXRhbGl6ZSgpIGZvciB3IGluIG1hdGNoLmdyb3VwZGljdCgpWydsaXRlcmFsJ10uc3BsaXQoJ18nKSkpCi0gICAgICAgICAgICBudW1lcmljYWxfdmFsdWUgPSBtYXRjaC5ncm91cGRpY3QoKVsndmFsdWVzJ10KKyAgICAgICAgICAgIGNyaXRlcmlvbl9saXRlcmFsID0gXAorICAgICAgICAgICAgICAgICcnLmpvaW4oKHcuY2FwaXRhbGl6ZSgpIGZvciB3IGluIG1hdGNoLmdyb3VwZGljdCgpWydsaXRlcmFsJ10uc3BsaXQoJ18nKSkpCisgICAgICAgICAgICBjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlID0gbWF0Y2guZ3JvdXBkaWN0KClbJ3ZhbHVlcyddCiAKLSAgICAgICAgICAgICMgZm9yIEFVRElPX0RFVklDRV9JTjogbmVlZCB0byByZW1vdmUgc2lnbiBiaXQKKyAgICAgICAgICAgICMgZm9yIEFVRElPX0RFVklDRV9JTjogbmVlZCB0byByZW1vdmUgc2lnbiBiaXQgLyByZW5hbWUgZGVmYXVsdCB0byBzdHViCiAgICAgICAgICAgICBpZiBjcml0ZXJpb25fbmFtZSA9PSAiSW5wdXREZXZpY2VzTWFza1R5cGUiOgotICAgICAgICAgICAgICAgIG51bWVyaWNhbF92YWx1ZSA9IHN0cihpbnQobnVtZXJpY2FsX3ZhbHVlLCAwKSAmIH4yMTQ3NDgzNjQ4KQorICAgICAgICAgICAgICAgIGlmIGNyaXRlcmlvbl9saXRlcmFsID09ICJEZWZhdWx0IjoKKyAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSA9IHN0cihpbnQoIjB4NDAwMDAwMDAiLCAwKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfaW50ID0gaW50KGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUsIDApCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBIYW5kbGUgdGhlIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJ2YWx1ZSB7fTp7fSBmb3IgY3JpdGVyaW9uIHt9IGlzIG5vdCBhIG51bWJlciwgaWdub3JpbmciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdChjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlLCBjcml0ZXJpb25fbGl0ZXJhbCwgY3JpdGVyaW9uX25hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSA9IHN0cihpbnQoY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSwgMCkgJiB+MjE0NzQ4MzY0OCkKKworICAgICAgICAgICAgaWYgY3JpdGVyaW9uX25hbWUgPT0gIk91dHB1dERldmljZXNNYXNrVHlwZSI6CisgICAgICAgICAgICAgICAgaWYgY3JpdGVyaW9uX2xpdGVyYWwgPT0gIkRlZmF1bHQiOgorICAgICAgICAgICAgICAgICAgICBjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlID0gc3RyKGludCgiMHg0MDAwMDAwMCIsIDApKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3RyaW5nX2ludCA9IGludChjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlLCAwKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgIyBIYW5kbGUgdGhlIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiVGhlIHZhbHVlIHt9Ont9IGlzIGZvciBjcml0ZXJpb24ge30gaXMgbm90IGEgbnVtYmVyLCBpZ25vcmluZyIKKyAgICAgICAgICAgICAgICAgICAgLmZvcm1hdChjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlLCBjcml0ZXJpb25fbGl0ZXJhbCwgY3JpdGVyaW9uX25hbWUpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAKICAgICAgICAgICAgICMgUmVtb3ZlIGR1cGxpY2F0ZWQgbnVtZXJpY2FsIHZhbHVlcwotICAgICAgICAgICAgaWYgaW50KG51bWVyaWNhbF92YWx1ZSwgMCkgaW4gYWxsX2NyaXRlcmlhW2NyaXRlcmlvbl9uYW1lXS52YWx1ZXMoKToKKyAgICAgICAgICAgIGlmIGludChjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlLCAwKSBpbiBhbGxfY3JpdGVyaWFbY3JpdGVyaW9uX25hbWVdLnZhbHVlcygpOgogICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiY3JpdGVyaW9uIHt9IGR1cGxpY2F0ZWQgdmFsdWVzOiIuZm9ybWF0KGNyaXRlcmlvbl9uYW1lKSkKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oInt9Ont9Ii5mb3JtYXQobnVtZXJpY2FsX3ZhbHVlLCBsaXRlcmFsKSkKKyAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oInt9Ont9Ii5mb3JtYXQoY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSwgY3JpdGVyaW9uX2xpdGVyYWwpKQogICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiS0VFUElORyBMQVRFU1QiKQogICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gbGlzdChhbGxfY3JpdGVyaWFbY3JpdGVyaW9uX25hbWVdKToKLSAgICAgICAgICAgICAgICAgICAgaWYgYWxsX2NyaXRlcmlhW2NyaXRlcmlvbl9uYW1lXVtrZXldID09IGludChudW1lcmljYWxfdmFsdWUsIDApOgorICAgICAgICAgICAgICAgICAgICBpZiBhbGxfY3JpdGVyaWFbY3JpdGVyaW9uX25hbWVdW2tleV0gPT0gaW50KGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUsIDApOgogICAgICAgICAgICAgICAgICAgICAgICAgZGVsIGFsbF9jcml0ZXJpYVtjcml0ZXJpb25fbmFtZV1ba2V5XQogCi0gICAgICAgICAgICBhbGxfY3JpdGVyaWFbY3JpdGVyaW9uX25hbWVdW2xpdGVyYWxdID0gaW50KG51bWVyaWNhbF92YWx1ZSwgMCkKKyAgICAgICAgICAgIGFsbF9jcml0ZXJpYVtjcml0ZXJpb25fbmFtZV1bY3JpdGVyaW9uX2xpdGVyYWxdID0gaW50KGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUsIDApCiAKICAgICAgICAgICAgIGxvZ2dpbmcuZGVidWcoInR5cGU6e30sIi5mb3JtYXQoY3JpdGVyaW9uX25hbWUpKQotICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygiaXRlcmFsOnt9LCIuZm9ybWF0KGxpdGVyYWwpKQotICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygidmFsdWVzOnt9LiIuZm9ybWF0KG51bWVyaWNhbF92YWx1ZSkpCisgICAgICAgICAgICBsb2dnaW5nLmRlYnVnKCJpdGVyYWw6e30sIi5mb3JtYXQoY3JpdGVyaW9uX2xpdGVyYWwpKQorICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygidmFsdWVzOnt9LiIuZm9ybWF0KGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUpKQorCisgICAgbG9nZ2luZy5pbmZvKCJDaGVja2luZyBBbmRyb2lkIENvbW1vbiBIZWFkZXIgZmlsZSB7fSIuZm9ybWF0KGFuZHJvaWRhdWRpb2NvbW1vbmJhc2VoZWFkZXJGaWxlKSkKKworICAgIGNyaXRlcmlhX3BhdHRlcm4gPSByZS5jb21waWxlKAorICAgICAgICByIlxzKig/UDx0eXBlPig/OiIrJ3wnLmpvaW4oY3JpdGVyaW9uX21hcHBpbmdfdGFibGUua2V5cygpKSArICIpKV8iIFwKKyAgICAgICAgciIoP1A8bGl0ZXJhbD4oPyEiICsgJ3wnLmpvaW4oaWdub3JlZF92YWx1ZXMpICsgIilcdyopXHMqPVxzKiIgXAorICAgICAgICByIig/OkFVRElPX0RFVklDRV9CSVRfSU4gXHwgKT8oP1A8dmFsdWVzPig/OjBbeFhdKT9bMC05YS1mQS1GXSt8WzAtOV0rKSIpCisKKyAgICBmb3IgbGluZV9udW1iZXIsIGxpbmUgaW4gZW51bWVyYXRlKGFuZHJvaWRhdWRpb2NvbW1vbmJhc2VoZWFkZXJGaWxlKToKKyAgICAgICAgbWF0Y2ggPSBjcml0ZXJpYV9wYXR0ZXJuLm1hdGNoKGxpbmUpCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygiVGhlIGZvbGxvd2luZyBsaW5lIGlzIFZBTElEOiB7fTp7fVxue30iLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBhbmRyb2lkYXVkaW9jb21tb25iYXNlaGVhZGVyRmlsZS5uYW1lLCBsaW5lX251bWJlciwgbGluZSkpCisKKyAgICAgICAgICAgIGNyaXRlcmlvbl9uYW1lID0gY3JpdGVyaW9uX21hcHBpbmdfdGFibGVbbWF0Y2guZ3JvdXBkaWN0KClbJ3R5cGUnXV0KKyAgICAgICAgICAgIGNyaXRlcmlvbl9saXRlcmFsID0gXAorICAgICAgICAgICAgICAgICcnLmpvaW4oKHcuY2FwaXRhbGl6ZSgpIGZvciB3IGluIG1hdGNoLmdyb3VwZGljdCgpWydsaXRlcmFsJ10uc3BsaXQoJ18nKSkpCisgICAgICAgICAgICBjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlID0gbWF0Y2guZ3JvdXBkaWN0KClbJ3ZhbHVlcyddCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzdHJpbmdfaW50ID0gaW50KGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUsIDApCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIEhhbmRsZSB0aGUgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJUaGUgdmFsdWUge306e30gaXMgZm9yIGNyaXRlcmlvbiB7fSBpcyBub3QgYSBudW1iZXIsIGlnbm9yaW5nIgorICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUsIGNyaXRlcmlvbl9saXRlcmFsLCBjcml0ZXJpb25fbmFtZSkpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBSZW1vdmUgZHVwbGljYXRlZCBudW1lcmljYWwgdmFsdWVzCisgICAgICAgICAgICBpZiBpbnQoY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSwgMCkgaW4gYWxsX2NyaXRlcmlhW2NyaXRlcmlvbl9uYW1lXS52YWx1ZXMoKToKKyAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oImNyaXRlcmlvbiB7fSBkdXBsaWNhdGVkIHZhbHVlczoiLmZvcm1hdChjcml0ZXJpb25fbmFtZSkpCisgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJ7fTp7fSIuZm9ybWF0KGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUsIGNyaXRlcmlvbl9saXRlcmFsKSkKKyAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIktFRVBJTkcgTEFURVNUIikKKyAgICAgICAgICAgICAgICBmb3Iga2V5IGluIGxpc3QoYWxsX2NyaXRlcmlhW2NyaXRlcmlvbl9uYW1lXSk6CisgICAgICAgICAgICAgICAgICAgIGlmIGFsbF9jcml0ZXJpYVtjcml0ZXJpb25fbmFtZV1ba2V5XSA9PSBpbnQoY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSwgMCk6CisgICAgICAgICAgICAgICAgICAgICAgICBkZWwgYWxsX2NyaXRlcmlhW2NyaXRlcmlvbl9uYW1lXVtrZXldCisKKyAgICAgICAgICAgIGFsbF9jcml0ZXJpYVtjcml0ZXJpb25fbmFtZV1bY3JpdGVyaW9uX2xpdGVyYWxdID0gaW50KGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUsIDApCisKKyAgICAgICAgICAgIGxvZ2dpbmcuZGVidWcoInR5cGU6e30sIi5mb3JtYXQoY3JpdGVyaW9uX25hbWUpKQorICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygiaXRlcmFsOnt9LCIuZm9ybWF0KGNyaXRlcmlvbl9saXRlcmFsKSkKKyAgICAgICAgICAgIGxvZ2dpbmcuZGVidWcoInZhbHVlczp7fS4iLmZvcm1hdChjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlKSkKIAogICAgIHJldHVybiBhbGxfY3JpdGVyaWEKIApAQCAtMjM4LDcgKzMwNyw4IEBACiAgICAgbG9nZ2luZy5yb290LnNldExldmVsKGxvZ2dpbmcuSU5GTykKICAgICBhcmdzID0gcGFyc2VBcmdzKCkKIAotICAgIGFsbF9jcml0ZXJpYSA9IHBhcnNlQW5kcm9pZEF1ZGlvRmlsZShhcmdzLmFuZHJvaWRhdWRpb2Jhc2VoZWFkZXIpCisgICAgYWxsX2NyaXRlcmlhID0gcGFyc2VBbmRyb2lkQXVkaW9GaWxlKGFyZ3MuYW5kcm9pZGF1ZGlvYmFzZWhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5hbmRyb2lkYXVkaW9jb21tb25iYXNlaGVhZGVyKQogCiAgICAgYWRkcmVzc19jcml0ZXJpYSA9IHBhcnNlQW5kcm9pZEF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbkZpbGUoYXJncy5hdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlKQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvQW5kcm9pZC5icAppbmRleCAzMDFlY2MwLi4zZTA0YjY4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmFibGVfcGZ3d3JhcHBlciIsCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQuYnAKaW5kZXggYWFmNDE1OC4uN2Y5YzBhYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliYXVkaW9wb2xpY3llbmdpbmVkZWZhdWx0IiwKICAgICBzcmNzOiBbCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL0FuZHJvaWQuYnAKaW5kZXggMGJmY2FhMS4uNTlhNzA0YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvQW5kcm9pZC5icApAQCAtMTksNiArMTksMTUgQEAKIHNvb25nX25hbWVzcGFjZSB7CiB9CiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogcHJlYnVpbHRfZXRjIHsKICAgICBuYW1lOiAiYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbCIsCiAgICAgdmVuZG9yOiB0cnVlLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbAppbmRleCBhNzM4OGRhLi5iYzMyNDE2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbApAQCAtNjUsNiArNjUsMTIgQEAKICAgICA8L1Byb2R1Y3RTdHJhdGVneT4KIAogICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfTUVESUEiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9BU1NJU1RBTlQiIHZvbHVtZUdyb3VwPSJhc3Npc3RhbnQiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+CisgICAgICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+CisgICAgICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTlQiLz4KKyAgICAgICAgICAgIDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CiAgICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9NVVNJQyIgdm9sdW1lR3JvdXA9Im11c2ljIj4KICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX01FRElBIi8+IDwvQXR0cmlidXRlcz4KICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0dBTUUiLz4gPC9BdHRyaWJ1dGVzPgpAQCAtNzIsMTIgKzc4LDYgQEAKICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPiA8L0F0dHJpYnV0ZXM+CiAgICAgICAgICAgICA8QXR0cmlidXRlcz48L0F0dHJpYnV0ZXM+CiAgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgotICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9BU1NJU1RBTlQiIHZvbHVtZUdyb3VwPSJhc3Npc3RhbnQiPgotICAgICAgICAgICAgPEF0dHJpYnV0ZXM+Ci0gICAgICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+Ci0gICAgICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTlQiLz4KLSAgICAgICAgICAgIDwvQXR0cmlidXRlcz4KLSAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CiAgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1NZU1RFTSIgdm9sdW1lR3JvdXA9InN5c3RlbSI+CiAgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+CiAgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBiMTRkMmJiLi5lMGEwYmJiCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcApAQCAtMTg0LDE2ICsxODQsNyBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgU1RSQVRFR1lfRFRNRjoKLSAgICAgICAgaWYgKCFpc0luQ2FsbCgpKSB7Ci0gICAgICAgICAgICAvLyB3aGVuIG9mZiBjYWxsLCBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMgTUVESUEgc3RyYXRlZ3kKLSAgICAgICAgICAgIGRldmljZXMgPSBnZXREZXZpY2VzRm9yU3RyYXRlZ3lJbnQoCi0gICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX01FRElBLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gd2hlbiBpbiBjYWxsLCBEVE1GIGFuZCBQSE9ORSBzdHJhdGVnaWVzIGZvbGxvdyB0aGUgc2FtZSBydWxlcwotICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKLQotICAgIGNhc2UgU1RSQVRFR1lfUEhPTkU6CisgICAgY2FzZSBTVFJBVEVHWV9QSE9ORTogewogICAgICAgICAvLyBGb3JjZSB1c2Ugb2Ygb25seSBkZXZpY2VzIG9uIHByaW1hcnkgb3V0cHV0IGlmOgogICAgICAgICAvLyAtIGluIGNhbGwgQU5ECiAgICAgICAgIC8vICAgLSBjYW5ub3Qgcm91dGUgZnJvbSB2b2ljZSBjYWxsIFJYIE9SCkBAIC0yMTYsNzUgKzIwNywyNCBAQAogICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEKSk7CiAKICAgICAgICAgICAgIGlmICgoYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZShBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpID09IG51bGxwdHIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICgoYXZhaWxQcmltYXJ5SW5wdXREZXZpY2VzLmdldERldmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eERldmljZSwgU3RyaW5nOCgiIiksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSAhPSBudWxscHRyKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmltYXJ5T3V0cHV0LT5nZXRQb2xpY3lBdWRpb1BvcnQoKS0+Z2V0TW9kdWxlVmVyc2lvbk1ham9yKCkgPCAzKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpID09IG51bGxwdHIpIHx8CisgICAgICAgICAgICAgICAgKChhdmFpbFByaW1hcnlJbnB1dERldmljZXMuZ2V0RGV2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgdHhEZXZpY2UsIFN0cmluZzgoIiIpLCBBVURJT19GT1JNQVRfREVGQVVMVCkgIT0gbnVsbHB0cikgJiYKKyAgICAgICAgICAgICAgICAgKHByaW1hcnlPdXRwdXQtPmdldFBvbGljeUF1ZGlvUG9ydCgpLT5nZXRNb2R1bGVWZXJzaW9uTWFqb3IoKSA8IDMpKSkgewogICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMgPSBhdmFpbFByaW1hcnlPdXRwdXREZXZpY2VzOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIC8vIGZvciBwaG9uZSBzdHJhdGVneSwgd2UgZmlyc3QgY29uc2lkZXIgdGhlIGZvcmNlZCB1c2UgYW5kIHRoZW4gdGhlIGF2YWlsYWJsZSBkZXZpY2VzIGJ5Ci0gICAgICAgIC8vIG9yZGVyIG9mIHByaW9yaXR5Ci0gICAgICAgIHN3aXRjaCAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OKSkgewotICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ086Ci0gICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkgfHwgc3RyYXRlZ3kgIT0gU1RSQVRFR1lfRFRNRikgewotICAgICAgICAgICAgICAgIGRldmljZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQpOwotICAgICAgICAgICAgICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkpIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGV2aWNlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0Rmlyc3REZXZpY2VzRnJvbVR5cGVzKHsKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQsIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT30pOwotICAgICAgICAgICAgaWYgKCFkZXZpY2VzLmlzRW1wdHkoKSkgYnJlYWs7Ci0gICAgICAgICAgICAvLyBpZiBTQ08gZGV2aWNlIGlzIHJlcXVlc3RlZCBidXQgbm8gU0NPIGRldmljZSBpcyBhdmFpbGFibGUsIGZhbGwgYmFjayB0byBkZWZhdWx0IGNhc2UKLSAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwotCi0gICAgICAgIGRlZmF1bHQ6ICAgIC8vIEZPUkNFX05PTkUKLSAgICAgICAgICAgIGRldmljZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEKTsKLSAgICAgICAgICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkpIGJyZWFrOwotICAgICAgICAgICAgLy8gd2hlbiBub3QgaW4gYSBwaG9uZSBjYWxsLCBwaG9uZSBzdHJhdGVneSBzaG91bGQgcm91dGUgU1RSRUFNX1ZPSUNFX0NBTEwgdG8gQTJEUAotICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpICYmCi0gICAgICAgICAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgJiYKLSAgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNBMmRwU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXRGaXJzdERldmljZXNGcm9tVHlwZXMoewotICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FU30pOwotICAgICAgICAgICAgICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkpIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGV2aWNlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0Rmlyc3REZXZpY2VzRnJvbVR5cGVzKHsKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUsIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVCwKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9MSU5FLCBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VULAotICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0V9KTsKLSAgICAgICAgICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkpIGJyZWFrOwotICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0Rmlyc3REZXZpY2VzRnJvbVR5cGVzKHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWSwgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUwsIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVR9KTsKLSAgICAgICAgICAgICAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpKSBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRldmljZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVI6Ci0gICAgICAgICAgICAvLyB3aGVuIG5vdCBpbiBhIHBob25lIGNhbGwsIHBob25lIHN0cmF0ZWd5IHNob3VsZCByb3V0ZSBTVFJFQU1fVk9JQ0VfQ0FMTCB0bwotICAgICAgICAgICAgLy8gQTJEUCBzcGVha2VyIHdoZW4gZm9yY2luZyB0byBzcGVha2VyIG91dHB1dAotICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpICYmCi0gICAgICAgICAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgJiYKLSAgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNBMmRwU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIpOwotICAgICAgICAgICAgICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkpIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0Rmlyc3REZXZpY2VzRnJvbVR5cGVzKHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWSwgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVCwgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVR9KTsKLSAgICAgICAgICAgICAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpKSBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRldmljZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICBicmVhazsKKyAgICAgICAgZGV2aWNlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpOworICAgICAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpKSBicmVhazsKKyAgICAgICAgZGV2aWNlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0Rmlyc3REZXZpY2VzRnJvbVR5cGVzKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9MSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRX0pOworICAgICAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpKSBicmVhazsKKyAgICAgICAgZGV2aWNlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UpOworICAgIH0gYnJlYWs7CiAKICAgICBjYXNlIFNUUkFURUdZX1NPTklGSUNBVElPTjoKIApAQCAtMzI3LDcgKzI2Nyw4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVXNlIGJvdGggQmx1ZXRvb3RoIFNDTyBhbmQgcGhvbmUgZGVmYXVsdCBvdXRwdXQgd2hlbiByaW5naW5nIGluIG5vcm1hbCBtb2RlCi0gICAgICAgICAgICBpZiAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB7CisgICAgICAgICAgICBpZiAoYXVkaW9faXNfYmx1ZXRvb3RoX291dF9zY29fZGV2aWNlKGdldFByZWZlcnJlZERldmljZVR5cGVGb3JMZWdhY3lTdHJhdGVneSgKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgU1RSQVRFR1lfUEhPTkUpKSkgewogICAgICAgICAgICAgICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHsKICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5yZXBsYWNlRGV2aWNlc0J5VHlwZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIsCkBAIC0zODYsMTggKzMyNywxMyBAQAogICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9QSE9ORSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIC8vIEZJWE1FOiBGaW5kIGEgYmV0dGVyIHNvbHV0aW9uIHRvIHByZXZlbnQgcm91dGluZyB0byBCVCBoZWFyaW5nIGFpZChiLzEyMjkzMTI2MSkuCi0gICAgICAgIGlmICgoZGV2aWNlczIuaXNFbXB0eSgpKSAmJgotICAgICAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkpIHsKLSAgICAgICAgICAgIGRldmljZXMyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCk7Ci0gICAgICAgIH0KKwogICAgICAgICBpZiAoKGRldmljZXMyLmlzRW1wdHkoKSkgJiYKICAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1BFQUtFUikpIHsKICAgICAgICAgICAgIGRldmljZXMyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZGV2aWNlczIuaXNFbXB0eSgpICYmIChnZXRMYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzKCkuc2l6ZSgpID4gMCkpIHsKLSAgICAgICAgICAgIGlmICgoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNBMmRwU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIGlmICgoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApKSB7CiAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBsYXN0IGNvbm5lY3RlZCBkZXZpY2Ugb2Ygd2lyZWQgYW5kIGJsdWV0b290aCBhMmRwCiAgICAgICAgICAgICAgICAgZGV2aWNlczIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldEZpcnN0RGV2aWNlc0Zyb21UeXBlcygKICAgICAgICAgICAgICAgICAgICAgICAgIGdldExhc3RSZW1vdmFibGVNZWRpYURldmljZXMoKSk7CkBAIC01MDIsMjAgKzQzOCwyNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgYXVkaW9fZGV2aWNlc190IGNvbW1EZXZpY2VUeXBlID0KKyAgICAgICAgZ2V0UHJlZmVycmVkRGV2aWNlVHlwZUZvckxlZ2FjeVN0cmF0ZWd5KGF2YWlsYWJsZU91dHB1dERldmljZXMsIFNUUkFURUdZX1BIT05FKTsKKwogICAgIHN3aXRjaCAoaW5wdXRTb3VyY2UpIHsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9ERUZBVUxUOgogICAgIGNhc2UgQVVESU9fU09VUkNFX01JQzoKICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlRGV2aWNlcy5nZXREZXZpY2UoCiAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQLCBTdHJpbmc4KCIiKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIGJyZWFrOwotICAgICAgICBpZiAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkQpID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHsKKyAgICAgICAgaWYgKGF1ZGlvX2lzX2JsdWV0b290aF9vdXRfc2NvX2RldmljZShjb21tRGV2aWNlVHlwZSkpIHsKICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZURldmljZXMuZ2V0RGV2aWNlKAogICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VULCBTdHJpbmc4KCIiKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICAgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSBicmVhazsKICAgICAgICAgfQogICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldEZpcnN0RXhpc3RpbmdEZXZpY2UoewotICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VULCBBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQsCi0gICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UsIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQ30pOworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CTEVfSEVBRFNFVCwgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VULCBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSwKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0JMRSwgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDfSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKQEAgLTUyOCw0NiArNDY4LDYzIEBACiAgICAgICAgICAgICBhdmFpbGFibGVEZXZpY2VzID0gYXZhaWxhYmxlUHJpbWFyeURldmljZXM7CiAgICAgICAgIH0KIAotICAgICAgICBzd2l0Y2ggKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTikpIHsKLSAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPOgorICAgICAgICBpZiAoYXVkaW9faXNfYmx1ZXRvb3RoX291dF9zY29fZGV2aWNlKGNvbW1EZXZpY2VUeXBlKSkgewogICAgICAgICAgICAgLy8gaWYgU0NPIGRldmljZSBpcyByZXF1ZXN0ZWQgYnV0IG5vIFNDTyBkZXZpY2UgaXMgYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gZGVmYXVsdCBjYXNlCiAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldERldmljZSgKICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCwgU3RyaW5nOCgiIiksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7Ci0KLSAgICAgICAgZGVmYXVsdDogICAgLy8gRk9SQ0VfTk9ORQotICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlRGV2aWNlcy5nZXRGaXJzdEV4aXN0aW5nRGV2aWNlKHsKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQsIEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVCwKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UsIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQ30pOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoY29tbURldmljZVR5cGUpIHsKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUOgorICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlRGV2aWNlcy5nZXREZXZpY2UoCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQsIFN0cmluZzgoIiIpLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjoKICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZURldmljZXMuZ2V0Rmlyc3RFeGlzdGluZ0RldmljZSh7CiAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CQUNLX01JQywgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDfSk7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogICAgLy8gRk9SQ0VfTk9ORQorICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlRGV2aWNlcy5nZXRGaXJzdEV4aXN0aW5nRGV2aWNlKHsKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQsIEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVCwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UsIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQkxFLAorICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUN9KTsKKyAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjoKICAgICBjYXNlIEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRDoKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOgotICAgICAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKLSAgICAgICAgICAgIC8vIFdlIHNob3VsZCBub3QgdXNlIHByaW1hcnkgb3V0cHV0IGNyaXRlcmlhIGZvciBIb3R3b3JkIGJ1dCByYXRoZXIgbGltaXQKLSAgICAgICAgICAgIC8vIHRvIGRldmljZXMgYXR0YWNoZWQgdG8gdGhlIHNhbWUgSFcgbW9kdWxlIGFzIHRoZSBidWlsZCBpbiBtaWMKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoYXZhaWxhYmxlUHJpbWFyeURldmljZXMuaXNFbXB0eSgpLCAiUHJpbWFyeSBkZXZpY2VzIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgYXZhaWxhYmxlRGV2aWNlcyA9IGF2YWlsYWJsZVByaW1hcnlEZXZpY2VzOworICAgICAgICBpZiAoYXVkaW9faXNfYmx1ZXRvb3RoX291dF9zY29fZGV2aWNlKGNvbW1EZXZpY2VUeXBlKSkgeworICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlRGV2aWNlcy5nZXREZXZpY2UoCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQsIFN0cmluZzgoIiIpLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRCkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgeworICAgICAgICAvLyB3ZSBuZWVkIHRvIG1ha2UgQkxVRVRPT1RIX0JMRSBoYXMgaGlnaGVyIHByaW9yaXR5IHRoYW4gQlVJTFRJTl9NSUMsCisgICAgICAgIC8vIGJlY2F1c2Ugc29tZXRpbWVzIHVzZXIgd2FudCB0byBkbyB2b2ljZSBzZWFyY2ggYnkgYnQgcmVtb3RlCisgICAgICAgIC8vIGV2ZW4gaWYgQlVJTERJTl9NSUMgaXMgYXZhaWxhYmxlLgorICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldEZpcnN0RXhpc3RpbmdEZXZpY2UoeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CTEVfSEVBRFNFVCwgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VULCBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSwKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0JMRSwgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDfSk7CisKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfSE9UV09SRDoKKyAgICAgICAgLy8gV2Ugc2hvdWxkIG5vdCB1c2UgcHJpbWFyeSBvdXRwdXQgY3JpdGVyaWEgZm9yIEhvdHdvcmQgYnV0IHJhdGhlciBsaW1pdAorICAgICAgICAvLyB0byBkZXZpY2VzIGF0dGFjaGVkIHRvIHRoZSBzYW1lIEhXIG1vZHVsZSBhcyB0aGUgYnVpbGQgaW4gbWljCisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoYXZhaWxhYmxlUHJpbWFyeURldmljZXMuaXNFbXB0eSgpLCAiUHJpbWFyeSBkZXZpY2VzIG5vdCBmb3VuZCIpOworICAgICAgICBhdmFpbGFibGVEZXZpY2VzID0gYXZhaWxhYmxlUHJpbWFyeURldmljZXM7CisgICAgICAgIGlmIChhdWRpb19pc19ibHVldG9vdGhfb3V0X3Njb19kZXZpY2UoY29tbURldmljZVR5cGUpKSB7CiAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldERldmljZSgKICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCwgU3RyaW5nOCgiIiksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlRGV2aWNlcy5nZXRGaXJzdEV4aXN0aW5nRGV2aWNlKHsKLSAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCwgQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VULAotICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFLCBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUN9KTsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxFX0hFQURTRVQsIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VULAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVCwgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDfSk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjoKICAgICAgICAgLy8gRm9yIGEgZGV2aWNlIHdpdGhvdXQgYnVpbHQtaW4gbWljLCBhZGRpbmcgdXNiIGRldmljZQpAQCAtNTg0LDcgKzU0MSw4IEBACiAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0U6CiAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZURldmljZXMuZ2V0Rmlyc3RFeGlzdGluZ0RldmljZSh7CiAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQsIEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVCwKLSAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSwgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDfSk7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UsIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQkxFLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQ30pOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYOgogICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldERldmljZSgKQEAgLTYwOSw2ICs1NjcsNyBAQAogICAgICAgICBBTE9HRV9JRihkZXZpY2UgPT0gbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgImdldERldmljZUZvcklucHV0U291cmNlKCkgbm8gZGVmYXVsdCBkZXZpY2UgZGVmaW5lZCIpOwogICAgIH0KKwogICAgIEFMT0dWX0lGKGRldmljZSAhPSBudWxscHRyLAogICAgICAgICAgICAgICJnZXREZXZpY2VGb3JJbnB1dFNvdXJjZSgpaW5wdXQgc291cmNlICVkLCBkZXZpY2UgJTA4eCIsCiAgICAgICAgICAgICAgaW5wdXRTb3VyY2UsIGRldmljZS0+dHlwZSgpKTsKQEAgLTYyNiwzMSArNTg1LDY2IEBACiAgICAgfQogfQogCi1EZXZpY2VWZWN0b3IgRW5naW5lOjpnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgY29uc3QgewotICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOworcHJvZHVjdF9zdHJhdGVneV90IEVuZ2luZTo6Z2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUxlZ2FjeShsZWdhY3lfc3RyYXRlZ3kgbGVnYWN5U3RyYXRlZ3kpIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHN0cmF0ZWd5TWFwIDogbUxlZ2FjeVN0cmF0ZWd5TWFwKSB7CisgICAgICAgIGlmIChzdHJhdGVneU1hcC5zZWNvbmQgPT0gbGVnYWN5U3RyYXRlZ3kpIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJhdGVneU1hcC5maXJzdDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUFJPRFVDVF9TVFJBVEVHWV9OT05FOworfQogCi0gICAgLy8gY2hlY2sgaWYgdGhpcyBzdHJhdGVneSBoYXMgYSBwcmVmZXJyZWQgZGV2aWNlIHRoYXQgaXMgYXZhaWxhYmxlLAotICAgIC8vIGlmIHllcywgZ2l2ZSBwcmlvcml0eSB0byBpdAotICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgcHJlZmVycmVkU3RyYXRlZ3lEZXZpY2U7Ci0gICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHByZWZlcnJlZFN0cmF0ZWd5RGV2aWNlKTsKK2F1ZGlvX2RldmljZXNfdCBFbmdpbmU6OmdldFByZWZlcnJlZERldmljZVR5cGVGb3JMZWdhY3lTdHJhdGVneSgKKyAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBsZWdhY3lfc3RyYXRlZ3kgbGVnYWN5U3RyYXRlZ3kpIGNvbnN0IHsKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tTGVnYWN5KGxlZ2FjeVN0cmF0ZWd5KTsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IGdldFByZWZlcnJlZEF2YWlsYWJsZURldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3koCisgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBzdHJhdGVneSk7CisgICAgaWYgKGRldmljZXMuc2l6ZSgpID4gMCkgeworICAgICAgICByZXR1cm4gZGV2aWNlc1swXS0+dHlwZSgpOworICAgIH0KKyAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7Cit9CisKK0RldmljZVZlY3RvciBFbmdpbmU6OmdldFByZWZlcnJlZEF2YWlsYWJsZURldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3koCisgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBjb25zdCB7CisgICAgRGV2aWNlVmVjdG9yIHByZWZlcnJlZEF2YWlsYWJsZURldlZlYyA9IHt9OworICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgcHJlZmVycmVkU3RyYXRlZ3lEZXZpY2VzOworICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IGdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3koCisgICAgICAgICAgICBzdHJhdGVneSwgREVWSUNFX1JPTEVfUFJFRkVSUkVELCBwcmVmZXJyZWRTdHJhdGVneURldmljZXMpOwogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgLy8gdGhlcmUgaXMgYSBwcmVmZXJyZWQgZGV2aWNlLCBpcyBpdCBhdmFpbGFibGU/Ci0gICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHByZWZlcnJlZEF2YWlsYWJsZURldkRlc2NyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UoCi0gICAgICAgICAgICAgICAgcHJlZmVycmVkU3RyYXRlZ3lEZXZpY2UubVR5cGUsCi0gICAgICAgICAgICAgICAgU3RyaW5nOChwcmVmZXJyZWRTdHJhdGVneURldmljZS5tQWRkcmVzcy5jX3N0cigpKSwKLSAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7Ci0gICAgICAgIGlmIChwcmVmZXJyZWRBdmFpbGFibGVEZXZEZXNjciAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HVlYoIiVzIHVzaW5nIHByZWYgZGV2aWNlIDB4JTA4eC8lcyBmb3Igc3RyYXRlZ3kgJXUiLAotICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwcmVmZXJyZWRTdHJhdGVneURldmljZS5tVHlwZSwKLSAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWRTdHJhdGVneURldmljZS5tQWRkcmVzcy5jX3N0cigpLCBzdHJhdGVneSk7Ci0gICAgICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKHByZWZlcnJlZEF2YWlsYWJsZURldkRlc2NyKTsKKyAgICAgICAgcHJlZmVycmVkQXZhaWxhYmxlRGV2VmVjID0KKyAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tRGV2aWNlVHlwZUFkZHJWZWMocHJlZmVycmVkU3RyYXRlZ3lEZXZpY2VzKTsKKyAgICAgICAgaWYgKHByZWZlcnJlZEF2YWlsYWJsZURldlZlYy5zaXplKCkgPT0gcHJlZmVycmVkQXZhaWxhYmxlRGV2VmVjLnNpemUoKSkgeworICAgICAgICAgICAgQUxPR1ZWKCIlcyB1c2luZyBwcmVmIGRldmljZSAlcyBmb3Igc3RyYXRlZ3kgJXUiLAorICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwcmVmZXJyZWRBdmFpbGFibGVEZXZWZWMudG9TdHJpbmcoKS5jX3N0cigpLCBzdHJhdGVneSk7CisgICAgICAgICAgICByZXR1cm4gcHJlZmVycmVkQXZhaWxhYmxlRGV2VmVjOwogICAgICAgICB9CiAgICAgfQorICAgIHJldHVybiBwcmVmZXJyZWRBdmFpbGFibGVEZXZWZWM7Cit9CisKK0RldmljZVZlY3RvciBFbmdpbmU6OmdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBjb25zdCB7CisgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZU91dHB1dERldmljZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7CisgICAgYXV0byBsZWdhY3lTdHJhdGVneSA9IG1MZWdhY3lTdHJhdGVneU1hcC5maW5kKHN0cmF0ZWd5KSAhPSBlbmQobUxlZ2FjeVN0cmF0ZWd5TWFwKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgIG1MZWdhY3lTdHJhdGVneU1hcC5hdChzdHJhdGVneSkgOiBTVFJBVEVHWV9OT05FOworCisgICAgLy8gV2hlbiBub3QgaW4gY2FsbCwgU1RSQVRFR1lfUEhPTkUgYW5kIFNUUkFURUdZX0RUTUYgZm9sbG93IFNUUkFURUdZX01FRElBCisgICAgaWYgKCFpc0luQ2FsbCgpICYmIChsZWdhY3lTdHJhdGVneSA9PSBTVFJBVEVHWV9QSE9ORSB8fCBsZWdhY3lTdHJhdGVneSA9PSBTVFJBVEVHWV9EVE1GKSkgeworICAgICAgICBsZWdhY3lTdHJhdGVneSA9IFNUUkFURUdZX01FRElBOworICAgICAgICBzdHJhdGVneSA9IGdldFByb2R1Y3RTdHJhdGVneUZyb21MZWdhY3koU1RSQVRFR1lfTUVESUEpOworICAgIH0KKyAgICAvLyBjaGVjayBpZiB0aGlzIHN0cmF0ZWd5IGhhcyBhIHByZWZlcnJlZCBkZXZpY2UgdGhhdCBpcyBhdmFpbGFibGUsCisgICAgLy8gaWYgeWVzLCBnaXZlIHByaW9yaXR5IHRvIGl0LgorICAgIERldmljZVZlY3RvciBwcmVmZXJyZWRBdmFpbGFibGVEZXZWZWMgPQorICAgICAgICAgICAgZ2V0UHJlZmVycmVkQXZhaWxhYmxlRGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneShhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBzdHJhdGVneSk7CisgICAgaWYgKCFwcmVmZXJyZWRBdmFpbGFibGVEZXZWZWMuaXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBwcmVmZXJyZWRBdmFpbGFibGVEZXZWZWM7CisgICAgfQogCiAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZUlucHV0RGV2aWNlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpOwogICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uJiBvdXRwdXRzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0T3V0cHV0cygpOwotICAgIGF1dG8gbGVnYWN5U3RyYXRlZ3kgPSBtTGVnYWN5U3RyYXRlZ3lNYXAuZmluZChzdHJhdGVneSkgIT0gZW5kKG1MZWdhY3lTdHJhdGVneU1hcCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICBtTGVnYWN5U3RyYXRlZ3lNYXAuYXQoc3RyYXRlZ3kpIDogU1RSQVRFR1lfTk9ORTsKKwogICAgIHJldHVybiBnZXREZXZpY2VzRm9yU3RyYXRlZ3lJbnQobGVnYWN5U3RyYXRlZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmgKaW5kZXggYmI5ZTJkZi4uNjIxNGZlNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmgKQEAgLTgzLDYgKzgzLDEyIEBACiAKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkgY29uc3Q7CiAKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUxlZ2FjeShsZWdhY3lfc3RyYXRlZ3kgbGVnYWN5U3RyYXRlZ3kpIGNvbnN0OworICAgIGF1ZGlvX2RldmljZXNfdCBnZXRQcmVmZXJyZWREZXZpY2VUeXBlRm9yTGVnYWN5U3RyYXRlZ3koCisgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgbGVnYWN5X3N0cmF0ZWd5IGxlZ2FjeVN0cmF0ZWd5KSBjb25zdDsKKyAgICBEZXZpY2VWZWN0b3IgZ2V0UHJlZmVycmVkQXZhaWxhYmxlRGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneSgKKyAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIGNvbnN0OworCiAgICAgRGV2aWNlU3RyYXRlZ3lNYXAgbURldmljZXNGb3JTdHJhdGVnaWVzOwogCiAgICAgc3RkOjptYXA8cHJvZHVjdF9zdHJhdGVneV90LCBsZWdhY3lfc3RyYXRlZ3k+IG1MZWdhY3lTdHJhdGVneU1hcDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXIvQW5kcm9pZC5tawppbmRleCBjYWU2Y2ZhLi42ZmM4Mzg4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlci9BbmRyb2lkLm1rCkBAIC0yNCw2ICsyNCw5IEBACiBMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgogCiBMT0NBTF9NT0RVTEU6PSBsaWJhdWRpb3BvbGljeW1hbmFnZXIKK0xPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCitMT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKK0xPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS8uLi8uLi8uLi9OT1RJQ0UKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQW5kcm9pZC5icAppbmRleCA1NzdiNDJmLi41NTcyYmViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5bWFuYWdlcmRlZmF1bHQiLAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcAppbmRleCBhNTkyZGVhLi41YjUzYzBiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKQEAgLTI5LDI5ICsyOSwyNSBAQAogI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCiAjZW5kaWYKIAotI2RlZmluZSBBVURJT19QT0xJQ1lfWE1MX0NPTkZJR19GSUxFX1BBVEhfTUFYX0xFTkdUSCAxMjgKLSNkZWZpbmUgQVVESU9fUE9MSUNZX1hNTF9DT05GSUdfRklMRV9OQU1FICJhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiCi0jZGVmaW5lIEFVRElPX1BPTElDWV9BMkRQX09GRkxPQURfRElTQUJMRURfWE1MX0NPTkZJR19GSUxFX05BTUUgXAotICAgICAgICAiYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fYTJkcF9vZmZsb2FkX2Rpc2FibGVkLnhtbCIKLSNkZWZpbmUgQVVESU9fUE9MSUNZX0JMVUVUT09USF9MRUdBQ1lfSEFMX1hNTF9DT05GSUdfRklMRV9OQU1FIFwKLSAgICAgICAgImF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2JsdWV0b290aF9sZWdhY3lfaGFsLnhtbCIKLQogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KICNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxTZXJpYWxpemVyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fY29uZmlnLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKICNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXIuaCIKLSNpbmNsdWRlIDxTZXJpYWxpemVyLmg+CiAjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgotI2luY2x1ZGUgPHBvbGljeS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTY0LDExICs2MCwxMSBAQAogY29uc3RleHByIGZsb2F0IElOX0NBTExfRUFSUElFQ0VfSEVBRFJPT01fREIgPSAzLmY7CiAKIC8vIENvbXByZXNzZWQgZm9ybWF0cyBmb3IgTVNEIG1vZHVsZSwgb3JkZXJlZCBmcm9tIG1vc3QgcHJlZmVycmVkIHRvIGxlYXN0IHByZWZlcnJlZC4KLXN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gY29tcHJlc3NlZEZvcm1hdHNPcmRlciA9IHt7Ci0gICAgICAgIEFVRElPX0ZPUk1BVF9NQVRfMl8xLCBBVURJT19GT1JNQVRfTUFUXzJfMCwgQVVESU9fRk9STUFUX0VfQUMzLAorc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiBtc2RDb21wcmVzc2VkRm9ybWF0c09yZGVyID0ge3sKKyAgICAgICAgQVVESU9fRk9STUFUX0lFQzYwOTU4LCBBVURJT19GT1JNQVRfTUFUXzJfMSwgQVVESU9fRk9STUFUX01BVF8yXzAsIEFVRElPX0ZPUk1BVF9FX0FDMywKICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgfX07CiAvLyBDaGFubmVsIG1hc2tzIGZvciBNU0QgbW9kdWxlLCAzRCA+IDJEID4gMUQgb3JkZXJpbmcgKG1vc3QgcHJlZmVycmVkIHRvIGxlYXN0IHByZWZlcnJlZCkuCi1zdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IHN1cnJvdW5kQ2hhbm5lbE1hc2tzT3JkZXIgPSB7eworc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiBtc2RTdXJyb3VuZENoYW5uZWxNYXNrc09yZGVyID0ge3sKICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMVBPSU5UMiwgQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMFBPSU5UMiwKICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMVBPSU5UMiwgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMiwKICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIH19OwpAQCAtMjQ2LDYgKzI0Miw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJBdWRpb1NvdXJjZXNGb3JPdXRwdXQob3V0cHV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0yNjAsMTEgKzI1Nyw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjaGVja0Nsb3NlT3V0cHV0cygpOwogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX0lOX0NBTEwgJiYgaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlcyk7Ci0gICAgICAgIH0KKyAgICAgICAgKHZvaWQpdXBkYXRlQ2FsbFJvdXRpbmcoZmFsc2UgLypmcm9tQ2FjaGUqLyk7CiAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciBtc2RPdXREZXZpY2VzID0gZ2V0TXNkQXVkaW9PdXREZXZpY2VzKCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKQEAgLTM1MiwxMSArMzQ1LDEyIEBACiAgICAgICAgIC8vIGdldERldmljZUZvclN0cmF0ZWd5KCkgY2FjaGUKICAgICAgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKIAotICAgICAgICBpZiAobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCAmJiBoYXNQcmltYXJ5T3V0cHV0KCkpIHsKLSAgICAgICAgICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2VzKTsKKyAgICAgICAgKHZvaWQpdXBkYXRlQ2FsbFJvdXRpbmcoZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIC8vIFJlY29ubmVjdCBBdWRpbyBTb3VyY2UKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZzdHJhdGVneSA6IG1FbmdpbmUtPmdldE9yZGVyZWRQcm9kdWN0U3RyYXRlZ2llcygpKSB7CisgICAgICAgICAgICBhdXRvIGF0dHJpYnV0ZXMgPSBtRW5naW5lLT5nZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5KS5mcm9udCgpOworICAgICAgICAgICAgY2hlY2tBdWRpb1NvdXJjZUZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CiAgICAgICAgIH0KLQogICAgICAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgewogICAgICAgICAgICAgY2xlYW5VcEZvckRldmljZShkZXZpY2UpOwogICAgICAgICB9CkBAIC00NDEsNyArNDM1LDcgQEAKICAgICAvLyBDYXNlIDE6IEEyRFAgYWN0aXZlIGRldmljZSBzd2l0Y2hlcyBmcm9tIHByaW1hcnkgdG8gcHJpbWFyeQogICAgIC8vIG1vZHVsZQogICAgIC8vIENhc2UgMjogQTJEUCBkZXZpY2UgY29uZmlnIGNoYW5nZXMgb24gcHJpbWFyeSBtb2R1bGUuCi0gICAgaWYgKGF1ZGlvX2lzX2EyZHBfb3V0X2RldmljZShkZXZpY2UpKSB7CisgICAgaWYgKGF1ZGlvX2lzX2EyZHBfb3V0X2RldmljZShkZXZpY2UpICYmIGhhc1ByaW1hcnlPdXRwdXQoKSkgewogICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGb3JEZXZpY2VUeXBlKGRldmljZSwgZW5jb2RlZEZvcm1hdCk7CiAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBwcmltYXJ5SGFuZGxlID0gbVByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpOwogICAgICAgICBpZiAoYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKS5jb250YWlucyhkZXZEZXNjKSAmJgpAQCAtNDYxLDcgKzQ1NSwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCisgICAgYXV0byBtdXNpY1N0cmF0ZWd5ID0gc3RyZWFtVG9TdHJhdGVneShBVURJT19TVFJFQU1fTVVTSUMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgLy8gbXV0ZSBtZWRpYSBzdHJhdGVnaWVzIGFuZCBkZWxheSBkZXZpY2Ugc3dpdGNoIGJ5IHRoZSBsYXJnZXN0CisgICAgICAgLy8gVGhpcyBhdm9pZCBzZW5kaW5nIHRoZSBtdXNpYyB0YWlsIGludG8gdGhlIGVhcnBpZWNlIG9yIGhlYWRzZXQuCisgICAgICAgc2V0U3RyYXRlZ3lNdXRlKG11c2ljU3RyYXRlZ3ksIHRydWUsIGRlc2MpOworICAgICAgIHNldFN0cmF0ZWd5TXV0ZShtdXNpY1N0cmF0ZWd5LCBmYWxzZSwgZGVzYywgTVVURV9USU1FX01TLAorICAgICAgICAgIG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTUVESUEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIHRydWUgLypmcm9tQ2FjaGUqLykudHlwZXMoKSk7CisgICAgfQogICAgIC8vIFRvZ2dsZSB0aGUgZGV2aWNlIHN0YXRlOiBVTkFWQUlMQUJMRSAtPiBBVkFJTEFCTEUKICAgICAvLyBUaGlzIHdpbGwgZm9yY2UgcmVhZGluZyBhZ2FpbiB0aGUgZGV2aWNlIGNvbmZpZ3VyYXRpb24KICAgICBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLApAQCAtNTA3LDMwICs1MTAsNjEgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUNhbGxSb3V0aW5nKGNvbnN0IERldmljZVZlY3RvciAmcnhEZXZpY2VzLCB1aW50MzJfdCBkZWxheU1zKQorRGV2aWNlVmVjdG9yIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2VsZWN0QmVzdFJ4U2lua0RldmljZXNGb3JDYWxsKGJvb2wgZnJvbUNhY2hlKQoreworICAgIERldmljZVZlY3RvciByeFNpbmtkZXZpY2Vze307CisgICAgcnhTaW5rZGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiksIG51bGxwdHIsIGZyb21DYWNoZSk7CisgICAgaWYgKCFyeFNpbmtkZXZpY2VzLmlzRW1wdHkoKSAmJiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jb250YWlucyhyeFNpbmtkZXZpY2VzLml0ZW1BdCgwKSkpIHsKKyAgICAgICAgYXV0byByeFNpbmtEZXZpY2UgPSByeFNpbmtkZXZpY2VzLml0ZW1BdCgwKTsKKyAgICAgICAgYXV0byB0ZWxlcGhvbnlSeE1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlVHlwZSgKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAvLyByZXRyaWV2ZSBSeCBTb3VyY2UgZGV2aWNlIGRlc2NyaXB0b3IKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gcnhTb3VyY2VEZXZpY2UgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZSgKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCwgU3RyaW5nOCgpLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisKKyAgICAgICAgLy8gUlggVGVsZXBob255IGFuZCBSeCBzaW5rIGRldmljZXMgYXJlIGRlY2xhcmVkIGJ5IFByaW1hcnkgQXVkaW8gSEFMCisgICAgICAgIGlmIChpc1ByaW1hcnlNb2R1bGUodGVsZXBob255UnhNb2R1bGUpICYmICh0ZWxlcGhvbnlSeE1vZHVsZS0+Z2V0SGFsVmVyc2lvbk1ham9yKCkgPj0gMykgJiYKKyAgICAgICAgICAgICAgICB0ZWxlcGhvbnlSeE1vZHVsZS0+c3VwcG9ydHNQYXRjaChyeFNvdXJjZURldmljZSwgcnhTaW5rRGV2aWNlKSkgeworICAgICAgICAgICAgQUxPR1coIiVzKCkgZGV2aWNlICVzIHVzaW5nIEhXIEJyaWRnZSIsIF9fZnVuY19fLCByeFNpbmtEZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKHJ4U2lua0RldmljZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gTm90ZSB0aGF0IGRlc3BpdGUgdGhlIGZhY3QgdGhhdCBnZXROZXdPdXRwdXREZXZpY2VzKCkgaXMgY2FsbGVkIG9uIHRoZSBwcmltYXJ5IG91dHB1dCwKKyAgICAvLyB0aGUgZGV2aWNlIHJldHVybmVkIGlzIG5vdCBuZWNlc3NhcmlseSByZWFjaGFibGUgdmlhIHRoaXMgb3V0cHV0CisgICAgLy8gKGZpbHRlciBsYXRlciBieSBzZXRPdXRwdXREZXZpY2VzKCkpCisgICAgcmV0dXJuIGdldE5ld091dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIGZyb21DYWNoZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlQ2FsbFJvdXRpbmcoYm9vbCBmcm9tQ2FjaGUsIHVpbnQzMl90IGRlbGF5TXMsIHVpbnQzMl90ICp3YWl0TXMpCit7CisgICAgaWYgKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX0lOX0NBTEwgJiYgaGFzUHJpbWFyeU91dHB1dCgpKSB7CisgICAgICAgIERldmljZVZlY3RvciByeERldmljZXMgPSBzZWxlY3RCZXN0UnhTaW5rRGV2aWNlc0ZvckNhbGwoZnJvbUNhY2hlKTsKKyAgICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxSb3V0aW5nSW50ZXJuYWwocnhEZXZpY2VzLCBkZWxheU1zLCB3YWl0TXMpOworICAgIH0KKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlQ2FsbFJvdXRpbmdJbnRlcm5hbCgKKyAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZyeERldmljZXMsIHVpbnQzMl90IGRlbGF5TXMsIHVpbnQzMl90ICp3YWl0TXMpCiB7CiAgICAgYm9vbCBjcmVhdGVUeFBhdGNoID0gZmFsc2U7CiAgICAgYm9vbCBjcmVhdGVSeFBhdGNoID0gZmFsc2U7CiAgICAgdWludDMyX3QgbXV0ZVdhaXRNcyA9IDA7Ci0KICAgICBpZighaGFzUHJpbWFyeU91dHB1dCgpIHx8CiAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dC0+ZGV2aWNlcygpLm9ubHlDb250YWluc0RldmljZXNXaXRoVHlwZShBVURJT19ERVZJQ0VfT1VUX1NUVUIpKSB7Ci0gICAgICAgIHJldHVybiBtdXRlV2FpdE1zOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIEFMT0dfQVNTRVJUKCFyeERldmljZXMuaXNFbXB0eSgpLCAidXBkYXRlQ2FsbFJvdXRpbmcoKSBubyBzZWxlY3RlZCBvdXRwdXQgZGV2aWNlIik7CisgICAgQUxPR19BU1NFUlQoIXJ4RGV2aWNlcy5pc0VtcHR5KCksICIlcygpIG5vIHNlbGVjdGVkIG91dHB1dCBkZXZpY2UiLCBfX2Z1bmNfXyk7CiAKICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IHsgLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OIH07CiAgICAgYXV0byB0eFNvdXJjZURldmljZSA9IG1FbmdpbmUtPmdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcyhhdHRyKTsKLSAgICBBTE9HX0FTU0VSVCh0eFNvdXJjZURldmljZSAhPSAwLCAidXBkYXRlQ2FsbFJvdXRpbmcoKSBpbnB1dCBzZWxlY3RlZCBkZXZpY2Ugbm90IGF2YWlsYWJsZSIpOworICAgIEFMT0dfQVNTRVJUKHR4U291cmNlRGV2aWNlICE9IDAsICIlcygpIGlucHV0IHNlbGVjdGVkIGRldmljZSBub3QgYXZhaWxhYmxlIiwgX19mdW5jX18pOwogCi0gICAgQUxPR1YoInVwZGF0ZUNhbGxSb3V0aW5nIGRldmljZSByeERldmljZSAlcyB0eERldmljZSAlcyIsCisgICAgQUxPR1YoIiVzIGRldmljZSByeERldmljZSAlcyB0eERldmljZSAlcyIsIF9fZnVuY19fLAogICAgICAgICAgIHJ4RGV2aWNlcy5pdGVtQXQoMCktPnRvU3RyaW5nKCkuY19zdHIoKSwgdHhTb3VyY2VEZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKLSAgICAvLyByZWxlYXNlIGV4aXN0aW5nIFJYIHBhdGNoIGlmIGFueQotICAgIGlmIChtQ2FsbFJ4UGF0Y2ggIT0gMCkgewotICAgICAgICByZWxlYXNlQXVkaW9QYXRjaEludGVybmFsKG1DYWxsUnhQYXRjaC0+Z2V0SGFuZGxlKCkpOwotICAgICAgICBtQ2FsbFJ4UGF0Y2guY2xlYXIoKTsKLSAgICB9CisgICAgZGlzY29ubmVjdFRlbGVwaG9ueVJ4QXVkaW9Tb3VyY2UoKTsKICAgICAvLyByZWxlYXNlIFRYIHBhdGNoIGlmIGFueQogICAgIGlmIChtQ2FsbFR4UGF0Y2ggIT0gMCkgewogICAgICAgICByZWxlYXNlQXVkaW9QYXRjaEludGVybmFsKG1DYWxsVHhQYXRjaC0+Z2V0SGFuZGxlKCkpOwpAQCAtNTU2LDggKzU5MCw4IEBACiAgICAgICAgICAgICAodGVsZXBob255UnhNb2R1bGUtPmdldEhhbFZlcnNpb25NYWpvcigpID49IDMpKSB7CiAgICAgICAgIGlmIChyeFNvdXJjZURldmljZSA9PSAwIHx8IHR4U2lua0RldmljZSA9PSAwKSB7CiAgICAgICAgICAgICAvLyBSWCAvIFRYIFRlbGVwaG9ueSBkZXZpY2UocykgaXMoYXJlKSBub3QgY3VycmVudGx5IGF2YWlsYWJsZQotICAgICAgICAgICAgQUxPR0UoInVwZGF0ZUNhbGxSb3V0aW5nKCkgbm8gdGVsZXBob255IFR4IGFuZC9vciBSWCBkZXZpY2UiKTsKLSAgICAgICAgICAgIHJldHVybiBtdXRlV2FpdE1zOworICAgICAgICAgICAgQUxPR0UoIiVzKCkgbm8gdGVsZXBob255IFR4IGFuZC9vciBSWCBkZXZpY2UiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KICAgICAgICAgLy8gY3JlYXRlQXVkaW9QYXRjaEludGVybmFsIG5vdyBzdXBwb3J0cyBib3RoIEhXIC8gU1cgYnJpZGdpbmcKICAgICAgICAgY3JlYXRlUnhQYXRjaCA9IHRydWU7CkBAIC01NzgsOCArNjEyLDcgQEAKICAgICBpZiAoIWNyZWF0ZVJ4UGF0Y2gpIHsKICAgICAgICAgbXV0ZVdhaXRNcyA9IHNldE91dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlcywgdHJ1ZSwgZGVsYXlNcyk7CiAgICAgfSBlbHNlIHsgLy8gY3JlYXRlIFJYIHBhdGggYXVkaW8gcGF0Y2gKLSAgICAgICAgbUNhbGxSeFBhdGNoID0gY3JlYXRlVGVsZXBob255UGF0Y2godHJ1ZSAvKmlzUngqLywgcnhEZXZpY2VzLml0ZW1BdCgwKSwgZGVsYXlNcyk7Ci0KKyAgICAgICAgY29ubmVjdFRlbGVwaG9ueVJ4QXVkaW9Tb3VyY2UoKTsKICAgICAgICAgLy8gSWYgdGhlIFRYIGRldmljZSBpcyBvbiB0aGUgcHJpbWFyeSBIVyBtb2R1bGUgYnV0IFJYIGRldmljZSBpcwogICAgICAgICAvLyBvbiBvdGhlciBIVyBtb2R1bGUsIFNpbmtNZXRhRGF0YSBvZiB0ZWxlcGhvbnkgaW5wdXQgc2hvdWxkIGhhbmRsZSBpdAogICAgICAgICAvLyBhc3N1bWluZyB0aGUgZGV2aWNlIHVzZXMgYXVkaW8gSEFMIFY1LjAgYW5kIGFib3ZlCkBAIC01OTYsOCArNjI5LDEwIEBACiAgICAgICAgIH0KICAgICAgICAgbUNhbGxUeFBhdGNoID0gY3JlYXRlVGVsZXBob255UGF0Y2goZmFsc2UgLyppc1J4Ki8sIHR4U291cmNlRGV2aWNlLCBkZWxheU1zKTsKICAgICB9Ci0KLSAgICByZXR1cm4gbXV0ZVdhaXRNczsKKyAgICBpZiAod2FpdE1zICE9IG51bGxwdHIpIHsKKyAgICAgICAgKndhaXRNcyA9IG11dGVXYWl0TXM7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3A8QXVkaW9QYXRjaD4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjcmVhdGVUZWxlcGhvbnlQYXRjaCgKQEAgLTY0Miw2ICs2NzcsMjQgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb25uZWN0VGVsZXBob255UnhBdWRpb1NvdXJjZSgpCit7CisgICAgZGlzY29ubmVjdFRlbGVwaG9ueVJ4QXVkaW9Tb3VyY2UoKTsKKyAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgc291cmNlID0geworICAgICAgICAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSwKKyAgICAgICAgLmV4dC5kZXZpY2UudHlwZSA9IEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgsIC5leHQuZGV2aWNlLmFkZHJlc3MgPSAiIgorICAgIH07CisgICAgY29uc3QgYXV0byBhYSA9IG1FbmdpbmUtPmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydEF1ZGlvU291cmNlKCZzb3VyY2UsICZhYSwgJm1DYWxsUnhTb3VyY2VDbGllbnRQb3J0LCAwLyp1aWQqLyk7CisgICAgQUxPR0VfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAiJXMgZmFpbGVkIHRvIHN0YXJ0IFRlbGVwaG9ueSBSeCBBdWRpb1NvdXJjZSIsIF9fZnVuY19fKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmRpc2Nvbm5lY3RUZWxlcGhvbnlSeEF1ZGlvU291cmNlKCkKK3sKKyAgICBzdG9wQXVkaW9Tb3VyY2UobUNhbGxSeFNvdXJjZUNsaWVudFBvcnQpOworICAgIG1DYWxsUnhTb3VyY2VDbGllbnRQb3J0ID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKK30KKwogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKQogewogICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkgc3RhdGUgJWQiLCBzdGF0ZSk7CkBAIC02OTcsMjggKzc1MCwyMiBAQAogICAgIH0KIAogICAgIGlmIChoYXNQcmltYXJ5T3V0cHV0KCkpIHsKLSAgICAgICAgLy8gTm90ZSB0aGF0IGRlc3BpdGUgdGhlIGZhY3QgdGhhdCBnZXROZXdPdXRwdXREZXZpY2VzKCkgaXMgY2FsbGVkIG9uIHRoZSBwcmltYXJ5IG91dHB1dCwKLSAgICAgICAgLy8gdGhlIGRldmljZSByZXR1cm5lZCBpcyBub3QgbmVjZXNzYXJpbHkgcmVhY2hhYmxlIHZpYSB0aGlzIG91dHB1dAotICAgICAgICBEZXZpY2VWZWN0b3IgcnhEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIGVuZGluZyBjYWxsCi0gICAgICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKLSAgICAgICAgaWYgKGlzU3RhdGVJbkNhbGwob2xkU3RhdGUpICYmIHJ4RGV2aWNlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJ4RGV2aWNlcyA9IG1QcmltYXJ5T3V0cHV0LT5kZXZpY2VzKCk7Ci0gICAgICAgIH0KLQogICAgICAgICBpZiAoc3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7Ci0gICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhyeERldmljZXMsIGRlbGF5TXMpOwotICAgICAgICB9IGVsc2UgaWYgKG9sZFN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgewotICAgICAgICAgICAgaWYgKG1DYWxsUnhQYXRjaCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChtQ2FsbFJ4UGF0Y2gtPmdldEhhbmRsZSgpKTsKLSAgICAgICAgICAgICAgICBtQ2FsbFJ4UGF0Y2guY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQ2FsbFR4UGF0Y2ggIT0gMCkgewotICAgICAgICAgICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoSW50ZXJuYWwobUNhbGxUeFBhdGNoLT5nZXRIYW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgbUNhbGxUeFBhdGNoLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCByeERldmljZXMsIGZvcmNlLCAwKTsKKyAgICAgICAgICAgICh2b2lkKXVwZGF0ZUNhbGxSb3V0aW5nKGZhbHNlIC8qZnJvbUNhY2hlKi8sIGRlbGF5TXMpOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRGV2aWNlVmVjdG9yIHJ4RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgLy8gZm9yY2Ugcm91dGluZyBjb21tYW5kIHRvIGF1ZGlvIGhhcmR3YXJlIHdoZW4gZW5kaW5nIGNhbGwKKyAgICAgICAgICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKKyAgICAgICAgICAgIGlmIChpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSAmJiByeERldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcnhEZXZpY2VzID0gbVByaW1hcnlPdXRwdXQtPmRldmljZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvbGRTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKKyAgICAgICAgICAgICAgICBkaXNjb25uZWN0VGVsZXBob255UnhBdWRpb1NvdXJjZSgpOworICAgICAgICAgICAgICAgIGlmIChtQ2FsbFR4UGF0Y2ggIT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZWxlYXNlQXVkaW9QYXRjaEludGVybmFsKG1DYWxsVHhQYXRjaC0+Z2V0SGFuZGxlKCkpOworICAgICAgICAgICAgICAgICAgICBtQ2FsbFR4UGF0Y2guY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCByeERldmljZXMsIGZvcmNlLCAwKTsKICAgICAgICAgfQogICAgIH0KQEAgLTc4MCwxNiArODI3LDcgQEAKICAgICB9CiAKICAgICB1cGRhdGVDYWxsQW5kT3V0cHV0Um91dGluZyhmb3JjZVZvbHVtZVJlZXZhbCwgZGVsYXlNcyk7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdGl2ZURlc2MgOiBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpKSB7Ci0gICAgICAgIGF1dG8gbmV3RGV2aWNlID0gZ2V0TmV3SW5wdXREZXZpY2UoYWN0aXZlRGVzYyk7Ci0gICAgICAgIC8vIEZvcmNlIG5ldyBpbnB1dCBzZWxlY3Rpb24gaWYgdGhlIG5ldyBkZXZpY2UgY2FuIG5vdCBiZSByZWFjaGVkIHZpYSBjdXJyZW50IGlucHV0Ci0gICAgICAgIGlmIChhY3RpdmVEZXNjLT5tUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpLmNvbnRhaW5zKG5ld0RldmljZSkpIHsKLSAgICAgICAgICAgIHNldElucHV0RGV2aWNlKGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSwgbmV3RGV2aWNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNsb3NlSW5wdXQoYWN0aXZlRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgfQotICAgIH0KKyAgICB1cGRhdGVJbnB1dFJvdXRpbmcoKTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN5c3RlbVByb3BlcnR5KGNvbnN0IGNoYXIqIHByb3BlcnR5LCBjb25zdCBjaGFyKiB2YWx1ZSkKQEAgLTg5Myw3ICs5MzEsOCBAQAogICAgIC8vIE9ubHkgaG9ub3IgYXVkaWJpbGl0eSBlbmZvcmNlZCB3aGVuIHJlcXVpcmVkLiBUaGUgY2xpZW50IHdpbGwgYmUKICAgICAvLyBmb3JjZWQgdG8gcmVjb25uZWN0IGlmIHRoZSBmb3JjZWQgdXNhZ2UgY2hhbmdlcy4KICAgICBpZiAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pICE9IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKLSAgICAgICAgZHN0QXR0ci0+ZmxhZ3MgJj0gfkFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRDsKKyAgICAgICAgZHN0QXR0ci0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDxhdWRpb19mbGFnc19tYXNrX3Q+KAorICAgICAgICAgICAgICAgIGRzdEF0dHItPmZsYWdzICYgfkFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCk7CiAgICAgfQogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtOTI1LDcgKzk2NCw3IEBACiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIGlmIChhdXRvIGl0ID0gbUFsbG93ZWRDYXB0dXJlUG9saWNpZXMuZmluZCh1aWQpOyBpdCAhPSBlbmQobUFsbG93ZWRDYXB0dXJlUG9saWNpZXMpKSB7Ci0gICAgICAgIHJlc3VsdEF0dHItPmZsYWdzIHw9IGl0LT5zZWNvbmQ7CisgICAgICAgIHJlc3VsdEF0dHItPmZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PihyZXN1bHRBdHRyLT5mbGFncyB8IGl0LT5zZWNvbmQpOwogICAgIH0KICAgICAqc3RyZWFtID0gbUVuZ2luZS0+Z2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoKnJlc3VsdEF0dHIpOwogCkBAIC0xMDIwLDExICsxMDU5LDkgQEAKICAgICAqb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgaWYgKCFtc2REZXZpY2VzLmlzRW1wdHkoKSkgewogICAgICAgICAqb3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRGV2aWNlcyhtc2REZXZpY2VzLCBzZXNzaW9uLCAqc3RyZWFtLCBjb25maWcsIGZsYWdzKTsKLSAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gb3V0cHV0RGV2aWNlcy5pc0VtcHR5KCkgPyBudWxscHRyIDogb3V0cHV0RGV2aWNlcy5pdGVtQXQoMCk7Ci0gICAgICAgIGlmICgqb3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FICYmIHNldE1zZFBhdGNoKGRldmljZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKCpvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUgJiYgc2V0TXNkT3V0cHV0UGF0Y2hlcygmb3V0cHV0RGV2aWNlcykgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIEFMT0dWKCIlcygpIFVzaW5nIE1TRCBkZXZpY2VzICVzIGluc3RlYWQgb2YgZGV2aWNlcyAlcyIsCiAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbXNkRGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksIG91dHB1dERldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgICAgIG91dHB1dERldmljZXMgPSBtc2REZXZpY2VzOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgKm91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICB9CkBAIC0xMDM4LDYgKzEwNzUsMTIgQEAKICAgICB9CiAKICAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IGdldEZpcnN0RGV2aWNlSWQob3V0cHV0RGV2aWNlcyk7CisgICAgZm9yIChhdXRvICZvdXRwdXREZXZpY2UgOiBvdXRwdXREZXZpY2VzKSB7CisgICAgICAgIGlmIChvdXRwdXREZXZpY2UtPmdldElkKCkgPT0gZ2V0Q29uZmlnKCkuZ2V0RGVmYXVsdE91dHB1dERldmljZSgpLT5nZXRJZCgpKSB7CisgICAgICAgICAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IG91dHB1dERldmljZS0+Z2V0SWQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQogCiAgICAgaWYgKG91dHB1dERldmljZXMub25seUNvbnRhaW5zRGV2aWNlc1dpdGhUeXBlKEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKSkgewogICAgICAgICAqb3V0cHV0VHlwZSA9IEFQSV9PVVRQVVRfVEVMRVBIT05ZX1RYOwpAQCAtMTE4MCwyNCArMTIyMyw5IEBACiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPQogICAgICAgICAgICAgbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKIAotICAgIFN0cmluZzggYWRkcmVzcyA9IGdldEZpcnN0RGV2aWNlQWRkcmVzcyhkZXZpY2VzKTsKLQotICAgIC8vIE1TRCBwYXRjaCBtYXkgYmUgdXNpbmcgdGhlIG9ubHkgb3V0cHV0IHN0cmVhbSB0aGF0IGNhbiBzZXJ2aWNlIHRoaXMgcmVxdWVzdC4gUmVsZWFzZQotICAgIC8vIE1TRCBwYXRjaCB0byBwcmlvcml0aXplIHRoaXMgcmVxdWVzdCBvdmVyIGFueSBhY3RpdmUgb3V0cHV0IG9uIE1TRC4KLSAgICBBdWRpb1BhdGNoQ29sbGVjdGlvbiBtc2RQYXRjaGVzID0gZ2V0TXNkUGF0Y2hlcygpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbXNkUGF0Y2hlcy5zaXplKCk7IGkrKykgewotICAgICAgICBjb25zdCBhdXRvJiBwYXRjaCA9IG1zZFBhdGNoZXNbaV07Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcGF0Y2gtPm1QYXRjaC5udW1fc2lua3M7ICsraikgewotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rID0gJnBhdGNoLT5tUGF0Y2guc2lua3Nbal07Ci0gICAgICAgICAgICBpZiAoc2luay0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFICYmCi0gICAgICAgICAgICAgICAgICAgIGRldmljZXMuY29udGFpbnNEZXZpY2VXaXRoVHlwZShzaW5rLT5leHQuZGV2aWNlLnR5cGUpICYmCi0gICAgICAgICAgICAgICAgICAgIChhZGRyZXNzLmlzRW1wdHkoKSB8fCBzdHJuY21wKHNpbmstPmV4dC5kZXZpY2UuYWRkcmVzcywgYWRkcmVzcy5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSkgewotICAgICAgICAgICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoLT5nZXRIYW5kbGUoKSwgbVVpZENhY2hlZCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisgICAgLy8gQW4gTVNEIHBhdGNoIG1heSBiZSB1c2luZyB0aGUgb25seSBvdXRwdXQgc3RyZWFtIHRoYXQgY2FuIHNlcnZpY2UgdGhpcyByZXF1ZXN0LiBSZWxlYXNlCisgICAgLy8gYWxsIE1TRCBwYXRjaGVzIHRvIHByaW9yaXRpemUgdGhpcyByZXF1ZXN0IG92ZXIgYW55IGFjdGl2ZSBvdXRwdXQgb24gTVNELgorICAgIHJlbGVhc2VNc2RPdXRwdXRQYXRjaGVzKGRldmljZXMpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0RGVzYy0+b3Blbihjb25maWcsIGRldmljZXMsIHN0cmVhbSwgZmxhZ3MsIG91dHB1dCk7CiAKQEAgLTEyNDMsNyArMTI3MSw4IEBACiAKICAgICAvLyBEaXNjYXJkIGhhcHRpYyBjaGFubmVsIG1hc2sgd2hlbiBmb3JjaW5nIG11dGluZyBoYXB0aWMgY2hhbm5lbHMuCiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBmb3JjZU11dGluZ0hhcHRpYwotICAgICAgICAgICAgPyAoY29uZmlnLT5jaGFubmVsX21hc2sgJiB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSA6IGNvbmZpZy0+Y2hhbm5lbF9tYXNrOworICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oY29uZmlnLT5jaGFubmVsX21hc2sgJiB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKQorICAgICAgICAgICAgOiBjb25maWctPmNoYW5uZWxfbWFzazsKIAogICAgIC8vIG9wZW4gYSBkaXJlY3Qgb3V0cHV0IGlmIHJlcXVpcmVkIGJ5IHNwZWNpZmllZCBwYXJhbWV0ZXJzCiAgICAgLy9mb3JjZSBkaXJlY3QgZmxhZyBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0OiBvZmZsb2FkaW5nIGltcGxpZXMgYSBkaXJlY3Qgb3V0cHV0IHN0cmVhbQpAQCAtMTMxOSw3ICsxMzQ4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMpOwogfQogCi1jb25zdCBBdWRpb1BhdGNoQ29sbGVjdGlvbiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1zZFBhdGNoZXMoKSBjb25zdCB7Citjb25zdCBBdWRpb1BhdGNoQ29sbGVjdGlvbiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1zZE91dHB1dFBhdGNoZXMoKSBjb25zdCB7CiAgICAgQXVkaW9QYXRjaENvbGxlY3Rpb24gbXNkUGF0Y2hlczsKICAgICBzcDxId01vZHVsZT4gbXNkTW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKTsKICAgICBpZiAobXNkTW9kdWxlICE9IDApIHsKQEAgLTEzMzcsNDkgKzEzNjYsNDcgQEAKICAgICByZXR1cm4gbXNkUGF0Y2hlczsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRCZXN0TXNkQXVkaW9Qcm9maWxlRm9yKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZvdXRwdXREZXZpY2UsCi0gICAgICAgIGJvb2wgaHdBdlN5bmMsIGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VDb25maWcsIGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rQ29uZmlnKSBjb25zdAotewotICAgIHNwPEh3TW9kdWxlPiBtc2RNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpOwotICAgIGlmIChtc2RNb2R1bGUgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXMoKSB1bmFibGUgdG8gZ2V0IE1TRCBtb2R1bGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBzcDxId01vZHVsZT4gZGV2aWNlTW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGb3JEZXZpY2Uob3V0cHV0RGV2aWNlLCBBVURJT19GT1JNQVRfREVGQVVMVCk7Ci0gICAgaWYgKGRldmljZU1vZHVsZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpIHVuYWJsZSB0byBnZXQgbW9kdWxlIGZvciAlcyIsIF9fZnVuY19fLCBvdXRwdXREZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBjb25zdCBJbnB1dFByb2ZpbGVDb2xsZWN0aW9uICZpbnB1dFByb2ZpbGVzID0gbXNkTW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCk7CitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1zZFByb2ZpbGVzKGJvb2wgaHdBdlN5bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0UHJvZmlsZUNvbGxlY3Rpb24gJmlucHV0UHJvZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE91dHB1dFByb2ZpbGVDb2xsZWN0aW9uICZvdXRwdXRQcm9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnNvdXJjZURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnNpbmtEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUHJvZmlsZVZlY3RvciYgc291cmNlUHJvZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUHJvZmlsZVZlY3RvciYgc2lua1Byb2ZpbGVzKSBjb25zdCB7CiAgICAgaWYgKGlucHV0UHJvZmlsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpIG5vIGlucHV0IHByb2ZpbGVzIGZvciBNU0QgbW9kdWxlIiwgX19mdW5jX18pOworICAgICAgICBBTE9HRSgiJXMoKSBubyBpbnB1dCBwcm9maWxlcyBmb3Igc291cmNlIG1vZHVsZSIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIGNvbnN0IE91dHB1dFByb2ZpbGVDb2xsZWN0aW9uICZvdXRwdXRQcm9maWxlcyA9IGRldmljZU1vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKTsKICAgICBpZiAob3V0cHV0UHJvZmlsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpIG5vIG91dHB1dCBwcm9maWxlcyBmb3IgZGV2aWNlICVzIiwgX19mdW5jX18sIG91dHB1dERldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIiVzKCkgbm8gb3V0cHV0IHByb2ZpbGVzIGZvciBzaW5rIG1vZHVsZSIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBtc2RQcm9maWxlczsKLSAgICAvLyBFYWNoIElPUHJvZmlsZSByZXByZXNlbnRzIGEgTWl4UG9ydCBmcm9tIGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAogICAgIGZvciAoY29uc3QgYXV0byAmaW5Qcm9maWxlIDogaW5wdXRQcm9maWxlcykgewotICAgICAgICBpZiAoaHdBdlN5bmMgPT0gKChpblByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkMpICE9IDApKSB7Ci0gICAgICAgICAgICBhcHBlbmRBdWRpb1Byb2ZpbGVzKG1zZFByb2ZpbGVzLCBpblByb2ZpbGUtPmdldEF1ZGlvUHJvZmlsZXMoKSk7CisgICAgICAgIGlmIChod0F2U3luYyA9PSAoKGluUHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICBpblByb2ZpbGUtPnN1cHBvcnRzRGV2aWNlKHNvdXJjZURldmljZSkpIHsKKyAgICAgICAgICAgIGFwcGVuZEF1ZGlvUHJvZmlsZXMoc291cmNlUHJvZmlsZXMsIGluUHJvZmlsZS0+Z2V0QXVkaW9Qcm9maWxlcygpKTsKICAgICAgICAgfQogICAgIH0KLSAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgZGV2aWNlUHJvZmlsZXM7CiAgICAgZm9yIChjb25zdCBhdXRvICZvdXRQcm9maWxlIDogb3V0cHV0UHJvZmlsZXMpIHsKLSAgICAgICAgaWYgKGh3QXZTeW5jID09ICgob3V0UHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpICE9IDApKSB7Ci0gICAgICAgICAgICBhcHBlbmRBdWRpb1Byb2ZpbGVzKGRldmljZVByb2ZpbGVzLCBvdXRQcm9maWxlLT5nZXRBdWRpb1Byb2ZpbGVzKCkpOworICAgICAgICBpZiAoaHdBdlN5bmMgPT0gKChvdXRQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICBvdXRQcm9maWxlLT5zdXBwb3J0c0RldmljZShzaW5rRGV2aWNlKSkgeworICAgICAgICAgICAgYXBwZW5kQXVkaW9Qcm9maWxlcyhzaW5rUHJvZmlsZXMsIG91dFByb2ZpbGUtPmdldEF1ZGlvUHJvZmlsZXMoKSk7CiAgICAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEJlc3RNc2RDb25maWcoYm9vbCBod0F2U3luYywKKyAgICAgICAgY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yICZzb3VyY2VQcm9maWxlcywgY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yICZzaW5rUHJvZmlsZXMsCisgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VDb25maWcsIGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rQ29uZmlnKSBjb25zdAorewogICAgIHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBiZXN0U2lua0NvbmZpZzsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBmaW5kQmVzdE1hdGNoaW5nT3V0cHV0Q29uZmlnKG1zZFByb2ZpbGVzLCBkZXZpY2VQcm9maWxlcywKLSAgICAgICAgICAgIGNvbXByZXNzZWRGb3JtYXRzT3JkZXIsIHN1cnJvdW5kQ2hhbm5lbE1hc2tzT3JkZXIsIHRydWUgLypwcmVmZXJIaWdoZXJTYW1wbGluZ1JhdGVzKi8sCi0gICAgICAgICAgICBiZXN0U2lua0NvbmZpZyk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gZmluZEJlc3RNYXRjaGluZ091dHB1dENvbmZpZyhzb3VyY2VQcm9maWxlcywgc2lua1Byb2ZpbGVzLAorICAgICAgICAgICAgbXNkQ29tcHJlc3NlZEZvcm1hdHNPcmRlciwgbXNkU3Vycm91bmRDaGFubmVsTWFza3NPcmRlciwKKyAgICAgICAgICAgIHRydWUgLypwcmVmZXJIaWdoZXJTYW1wbGluZ1JhdGVzKi8sIGJlc3RTaW5rQ29uZmlnKTsKICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dEKCIlcygpIG5vIG1hdGNoaW5nIHByb2ZpbGVzIGZvdW5kIGZvciBkZXZpY2U6ICVzLCBod0F2U3luYzogJWQiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fLCBvdXRwdXREZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgaHdBdlN5bmMpOworICAgICAgICBBTE9HRCgiJXMoKSBubyBtYXRjaGluZyBjb25maWcgZm91bmQgZm9yIHNpbmssIGh3QXZTeW5jOiAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGh3QXZTeW5jKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAgICAgc2lua0NvbmZpZy0+c2FtcGxlX3JhdGUgPSBiZXN0U2lua0NvbmZpZy5zYW1wbGVfcmF0ZTsKQEAgLTEzOTAsNyArMTQxNyw3IEBACiAgICAgICAgICAgICBzaW5rQ29uZmlnLT5mbGFncy5vdXRwdXQgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOwogICAgIGlmIChhdWRpb19pc19pZWM2MTkzN19jb21wYXRpYmxlKHNpbmtDb25maWctPmZvcm1hdCkpIHsKICAgICAgICAgLy8gRm9yIGZvcm1hdHMgY29tcGF0aWJsZSB3aXRoIElFQzYxOTM3IGVuY2Fwc3VsYXRpb24sIGFzc3VtZSB0aGF0Ci0gICAgICAgIC8vIHRoZSByZWNvcmQgdGhyZWFkIGlucHV0IGZyb20gTVNEIGlzIElFQzYxOTM3IGZyYW1lZCAoZm9yIHByb3BvcnRpb25hbCBidWZmZXIgc2l6aW5nKS4KKyAgICAgICAgLy8gdGhlIGlucHV0IGlzIElFQzYxOTM3IGZyYW1lZCAoZm9yIHByb3BvcnRpb25hbCBidWZmZXIgc2l6aW5nKS4KICAgICAgICAgLy8gQWRkIHRoZSBBVURJT19PVVRQVVRfRkxBR19JRUM5NThfTk9OQVVESU8gZmxhZyBzbyBkb3duc3RyZWFtIEhBTCBjYW4gZGlzdGluZ3Vpc2ggYmV0d2VlbgogICAgICAgICAvLyByYXcgYW5kIElFQzYxOTM3IGZyYW1lZCBzdHJlYW1zLgogICAgICAgICBzaW5rQ29uZmlnLT5mbGFncy5vdXRwdXQgPSBzdGF0aWNfY2FzdDxhdWRpb19vdXRwdXRfZmxhZ3NfdD4oCkBAIC0xNDE2LDYxICsxNDQzLDEyOCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotUGF0Y2hCdWlsZGVyIEF1ZGlvUG9saWN5TWFuYWdlcjo6YnVpbGRNc2RQYXRjaChjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmb3V0cHV0RGV2aWNlKSBjb25zdAorUGF0Y2hCdWlsZGVyIEF1ZGlvUG9saWN5TWFuYWdlcjo6YnVpbGRNc2RQYXRjaChib29sIG1zZElzU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKSBjb25zdAogewogICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7Ci0gICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShnZXRNc2RBdWRpb0luRGV2aWNlKCkpLmFkZFNpbmsob3V0cHV0RGV2aWNlKTsKKyAgICBzcDxId01vZHVsZT4gbXNkTW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKTsKKyAgICBBTE9HX0FTU0VSVChtc2RNb2R1bGUgIT0gbnVsbHB0ciwgIk1TRCBtb2R1bGUgbm90IGF2YWlsYWJsZSIpOworICAgIHNwPEh3TW9kdWxlPiBkZXZpY2VNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZShkZXZpY2UsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICBpZiAoZGV2aWNlTW9kdWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgdW5hYmxlIHRvIGdldCBtb2R1bGUgZm9yICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHBhdGNoQnVpbGRlcjsKKyAgICB9CisgICAgY29uc3QgSW5wdXRQcm9maWxlQ29sbGVjdGlvbiBpbnB1dFByb2ZpbGVzID0gbXNkSXNTb3VyY2UgPworICAgICAgICAgICAgbXNkTW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCkgOiBkZXZpY2VNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKTsKKyAgICBjb25zdCBPdXRwdXRQcm9maWxlQ29sbGVjdGlvbiBvdXRwdXRQcm9maWxlcyA9IG1zZElzU291cmNlID8KKyAgICAgICAgICAgIGRldmljZU1vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKSA6IG1zZE1vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKTsKKworICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IHNvdXJjZURldmljZSA9IG1zZElzU291cmNlID8gZ2V0TXNkQXVkaW9JbkRldmljZSgpIDogZGV2aWNlOworICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IHNpbmtEZXZpY2UgPSBtc2RJc1NvdXJjZSA/CisgICAgICAgICAgICBkZXZpY2UgOiBnZXRNc2RBdWRpb091dERldmljZXMoKS5pdGVtQXQoMCk7CisgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShzb3VyY2VEZXZpY2UpLmFkZFNpbmsoc2lua0RldmljZSk7CisKICAgICBhdWRpb19wb3J0X2NvbmZpZyBzb3VyY2VDb25maWcgPSBwYXRjaEJ1aWxkZXIucGF0Y2goKS0+c291cmNlc1swXTsKICAgICBhdWRpb19wb3J0X2NvbmZpZyBzaW5rQ29uZmlnID0gcGF0Y2hCdWlsZGVyLnBhdGNoKCktPnNpbmtzWzBdOworICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBzb3VyY2VQcm9maWxlczsKKyAgICBBdWRpb1Byb2ZpbGVWZWN0b3Igc2lua1Byb2ZpbGVzOwogICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2hldGhlciBNU0QgbW9kdWxlIGhhcyBIV19BVl9TWU5DIGZsYWcgc2V0IGluIHRoZSBBUCBjb25maWcgZmlsZS4KICAgICAvLyBGb3Igbm93LCB3ZSBqdXN0IGZvcmNlZnVsbHkgdHJ5IHdpdGggSHdBdlN5bmMgZmlyc3QuCi0gICAgc3RhdHVzX3QgcmVzID0gZ2V0QmVzdE1zZEF1ZGlvUHJvZmlsZUZvcihvdXRwdXREZXZpY2UsIHRydWUgLypod0F2U3luYyovLAotICAgICAgICAgICAgJnNvdXJjZUNvbmZpZywgJnNpbmtDb25maWcpID09IE5PX0VSUk9SID8gTk9fRVJST1IgOgotICAgICAgICAgICAgZ2V0QmVzdE1zZEF1ZGlvUHJvZmlsZUZvcigKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlLCBmYWxzZSAvKmh3QXZTeW5jKi8sICZzb3VyY2VDb25maWcsICZzaW5rQ29uZmlnKTsKLSAgICBpZiAocmVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIC8vIEZvdW5kIGEgbWF0Y2hpbmcgcHJvZmlsZSBmb3IgZW5jb2RlZCBhdWRpby4gUmUtY3JlYXRlIFBhdGNoQnVpbGRlciB3aXRoIHRoaXMgY29uZmlnLgotICAgICAgICByZXR1cm4gKFBhdGNoQnVpbGRlcigpKS5hZGRTb3VyY2Uoc291cmNlQ29uZmlnKS5hZGRTaW5rKHNpbmtDb25maWcpOworICAgIGZvciAoYXV0byBod0F2U3luYyA6IHsgdHJ1ZSwgZmFsc2UgfSkgeworICAgICAgICBpZiAoZ2V0TXNkUHJvZmlsZXMoaHdBdlN5bmMsIGlucHV0UHJvZmlsZXMsIG91dHB1dFByb2ZpbGVzLCBzb3VyY2VEZXZpY2UsIHNpbmtEZXZpY2UsCisgICAgICAgICAgICAgICAgc291cmNlUHJvZmlsZXMsIHNpbmtQcm9maWxlcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRCZXN0TXNkQ29uZmlnKGh3QXZTeW5jLCBzb3VyY2VQcm9maWxlcywgc2lua1Byb2ZpbGVzLCAmc291cmNlQ29uZmlnLAorICAgICAgICAgICAgICAgICZzaW5rQ29uZmlnKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgLy8gRm91bmQgYSBtYXRjaGluZyBjb25maWcuIFJlLWNyZWF0ZSBQYXRjaEJ1aWxkZXIgd2l0aCB0aGlzIGNvbmZpZy4KKyAgICAgICAgICAgIHJldHVybiAoUGF0Y2hCdWlsZGVyKCkpLmFkZFNvdXJjZShzb3VyY2VDb25maWcpLmFkZFNpbmsoc2lua0NvbmZpZyk7CisgICAgICAgIH0KICAgICB9Ci0gICAgQUxPR1YoIiVzKCkgbm8gbWF0Y2hpbmcgcHJvZmlsZSBmb3VuZC4gRmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQgUENNIHBhdGNoIgorICAgIEFMT0dWKCIlcygpIG5vIG1hdGNoaW5nIGNvbmZpZyBmb3VuZC4gRmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQgUENNIHBhdGNoIgogICAgICAgICAgICAgIiBzdXBwb3J0aW5nIFBDTSBmb3JtYXQgY29udmVyc2lvbi4iLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIHBhdGNoQnVpbGRlcjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRNc2RQYXRjaChjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmb3V0cHV0RGV2aWNlKSB7Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gb3V0cHV0RGV2aWNlOwotICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRNc2RPdXRwdXRQYXRjaGVzKGNvbnN0IERldmljZVZlY3RvciAqb3V0cHV0RGV2aWNlcykgeworICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgIGlmIChvdXRwdXREZXZpY2VzICE9IG51bGxwdHIgJiYgb3V0cHV0RGV2aWNlcy0+c2l6ZSgpID4gMCkgeworICAgICAgICBkZXZpY2VzLmFkZCgqb3V0cHV0RGV2aWNlcyk7CisgICAgfSBlbHNlIHsKICAgICAgICAgLy8gVXNlIG1lZGlhIHN0cmF0ZWd5IGZvciB1bnNwZWNpZmllZCBvdXRwdXQgZGV2aWNlLiBUaGlzIHNob3VsZCBvbmx5CiAgICAgICAgIC8vIG9jY3VyIG9uIGNoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcygpLiBEZXZpY2UgY29ubmVjdGlvbiBldmVudHMgbWF5CiAgICAgICAgIC8vIHRoZXJlZm9yZSBpbnZhbGlkYXRlIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMuCi0gICAgICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoCisgICAgICAgIGRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygKICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9NRURJQSksIG51bGxwdHIsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGRldmljZXMuaXNFbXB0eSgpLCAibm8gb3V0cHVkZXZpY2UgdG8gc2V0IE1zZCBQYXRjaCIpOwotICAgICAgICBkZXZpY2UgPSBkZXZpY2VzLml0ZW1BdCgwKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihkZXZpY2VzLmlzRW1wdHkoKSwgIm5vIG91dHB1dCBkZXZpY2UgdG8gc2V0IE1TRCBwYXRjaCIpOwogICAgIH0KLSAgICBBTE9HVigiJXMoKSBmb3IgZGV2aWNlICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyID0gYnVpbGRNc2RQYXRjaChkZXZpY2UpOwotICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCogcGF0Y2ggPSBwYXRjaEJ1aWxkZXIucGF0Y2goKTsKLSAgICBjb25zdCBBdWRpb1BhdGNoQ29sbGVjdGlvbiBtc2RQYXRjaGVzID0gZ2V0TXNkUGF0Y2hlcygpOwotICAgIGlmICghbXNkUGF0Y2hlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtc2RQYXRjaGVzLnNpemUoKSA+IDEsCi0gICAgICAgICAgICAgICAgIlRoZSBjdXJyZW50IE1TRCBwcm90b3R5cGUgb25seSBzdXBwb3J0cyBvbmUgb3V0cHV0IHBhdGNoIik7Ci0gICAgICAgIHNwPEF1ZGlvUGF0Y2g+IGN1cnJlbnRQYXRjaCA9IG1zZFBhdGNoZXMudmFsdWVBdCgwKTsKLSAgICAgICAgaWYgKGF1ZGlvX3BhdGNoZXNfYXJlX2VxdWFsKCZjdXJyZW50UGF0Y2gtPm1QYXRjaCwgcGF0Y2gpKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgc3RkOjp2ZWN0b3I8UGF0Y2hCdWlsZGVyPiBwYXRjaGVzVG9DcmVhdGU7CisgICAgZm9yIChhdXRvIGkgPSAwdTsgaSA8IGRldmljZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQUxPR1YoIiVzKCkgZm9yIGRldmljZSAlcyIsIF9fZnVuY19fLCBkZXZpY2VzW2ldLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICBwYXRjaGVzVG9DcmVhdGUucHVzaF9iYWNrKGJ1aWxkTXNkUGF0Y2godHJ1ZSAvKm1zZElzU291cmNlKi8sIGRldmljZXNbaV0pKTsKKyAgICB9CisgICAgLy8gUmV0YWluIG9ubHkgdGhlIE1TRCBwYXRjaGVzIGFzc29jaWF0ZWQgd2l0aCBvdXRwdXREZXZpY2VzIHJlcXVlc3QuCisgICAgLy8gVGVhciBkb3duIHRoZSBvdGhlcnMsIGFuZCBjcmVhdGUgbmV3IG9uZXMgYXMgbmVlZGVkLgorICAgIEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIHBhdGNoZXNUb1JlbW92ZSA9IGdldE1zZE91dHB1dFBhdGNoZXMoKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBwYXRjaGVzVG9DcmVhdGUuYmVnaW4oKTsgaXQgIT0gcGF0Y2hlc1RvQ3JlYXRlLmVuZCgpOyApIHsKKyAgICAgICAgYXV0byByZXRhaW5lZFBhdGNoID0gZmFsc2U7CisgICAgICAgIGZvciAoYXV0byBpID0gMHU7IGkgPCBwYXRjaGVzVG9SZW1vdmUuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChhdWRpb19wYXRjaGVzX2FyZV9lcXVhbChpdC0+cGF0Y2goKSwgJnBhdGNoZXNUb1JlbW92ZVtpXS0+bVBhdGNoKSkgeworICAgICAgICAgICAgICAgIHBhdGNoZXNUb1JlbW92ZS5yZW1vdmVJdGVtc0F0KGkpOworICAgICAgICAgICAgICAgIHJldGFpbmVkUGF0Y2ggPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmIChyZXRhaW5lZFBhdGNoKSB7CisgICAgICAgICAgICBpdCA9IHBhdGNoZXNUb0NyZWF0ZS5lcmFzZShpdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICArK2l0OworICAgIH0KKyAgICBpZiAocGF0Y2hlc1RvQ3JlYXRlLnNpemUoKSA9PSAwICYmIHBhdGNoZXNUb1JlbW92ZS5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIGZvciAoYXV0byBpID0gMHU7IGkgPCBwYXRjaGVzVG9SZW1vdmUuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgYXV0byAmY3VycmVudFBhdGNoID0gcGF0Y2hlc1RvUmVtb3ZlLnZhbHVlQXQoaSk7CiAgICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoKGN1cnJlbnRQYXRjaC0+Z2V0SGFuZGxlKCksIG1VaWRDYWNoZWQpOwogICAgIH0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnN0YWxsUGF0Y2goX19mdW5jX18sIC0xIC8qaW5kZXgqLywgbnVsbHB0ciAvKnBhdGNoSGFuZGxlKi8sCi0gICAgICAgICAgICBwYXRjaCwgMCAvKmRlbGF5TXMqLywgbVVpZENhY2hlZCwgbnVsbHB0ciAvKnBhdGNoRGVzY1B0ciovKTsKLSAgICBBTE9HRV9JRihzdGF0dXMgIT0gTk9fRVJST1IsICIlcygpIGVycm9yICVkIGNyZWF0aW5nIE1TRCBhdWRpbyBwYXRjaCIsIF9fZnVuY19fLCBzdGF0dXMpOwotICAgIEFMT0dJX0lGKHN0YXR1cyA9PSBOT19FUlJPUiwgIiVzKCkgUGF0Y2ggY3JlYXRlZCBmcm9tIE1TRF9JTiB0byAiCi0gICAgICAgICAgICJkZXZpY2U6JXMgKGZvcm1hdDolI3ggY2hhbm5lbHM6JSN4IHNhbXBsZXJhdGU6JWQpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIHBhdGNoLT5zb3VyY2VzWzBdLmZvcm1hdCwKLSAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5jaGFubmVsX21hc2ssIHBhdGNoLT5zb3VyY2VzWzBdLnNhbXBsZV9yYXRlKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiBwYXRjaGVzVG9DcmVhdGUpIHsKKyAgICAgICAgYXV0byBjdXJyU3RhdHVzID0gaW5zdGFsbFBhdGNoKF9fZnVuY19fLCAtMSAvKmluZGV4Ki8sIG51bGxwdHIgLypwYXRjaEhhbmRsZSovLAorICAgICAgICAgICAgICAgIHAucGF0Y2goKSwgMCAvKmRlbGF5TXMqLywgbVVpZENhY2hlZCwgbnVsbHB0ciAvKnBhdGNoRGVzY1B0ciovKTsKKyAgICAgICAgY2hhciBtZXNzYWdlWzI1Nl07CisgICAgICAgIHNucHJpbnRmKG1lc3NhZ2UsIHNpemVvZihtZXNzYWdlKSwgIiVzKCkgJXM6IGNyZWF0aW5nIE1TRCBwYXRjaCBmcm9tIGRldmljZTpJTl9CVVMgdG8gIgorICAgICAgICAgICAgImRldmljZTolI3ggKGZvcm1hdDolI3ggY2hhbm5lbHM6JSN4IHNhbXBsZXJhdGU6JWQpIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgY3VyclN0YXR1cyA9PSBOT19FUlJPUiA/ICJTdWNjZXNzIiA6ICJFcnJvciIsCisgICAgICAgICAgICAgICAgcC5wYXRjaCgpLT5zaW5rc1swXS5leHQuZGV2aWNlLnR5cGUsIHAucGF0Y2goKS0+c291cmNlc1swXS5mb3JtYXQsCisgICAgICAgICAgICAgICAgcC5wYXRjaCgpLT5zb3VyY2VzWzBdLmNoYW5uZWxfbWFzaywgcC5wYXRjaCgpLT5zb3VyY2VzWzBdLnNhbXBsZV9yYXRlKTsKKyAgICAgICAgaWYgKGN1cnJTdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dEKCIlcyIsIG1lc3NhZ2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzIiwgbWVzc2FnZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gY3VyclN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZU1zZE91dHB1dFBhdGNoZXMoY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzKSB7CisgICAgQXVkaW9QYXRjaENvbGxlY3Rpb24gbXNkUGF0Y2hlcyA9IGdldE1zZE91dHB1dFBhdGNoZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1zZFBhdGNoZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgYXV0byYgcGF0Y2ggPSBtc2RQYXRjaGVzW2ldOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHBhdGNoLT5tUGF0Y2gubnVtX3NpbmtzOyArK2opIHsKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2luayA9ICZwYXRjaC0+bVBhdGNoLnNpbmtzW2pdOworICAgICAgICAgICAgaWYgKHNpbmstPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJiBkZXZpY2VzLmdldERldmljZShzaW5rLT5leHQuZGV2aWNlLnR5cGUsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoc2luay0+ZXh0LmRldmljZS5hZGRyZXNzKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChwYXRjaC0+Z2V0SGFuZGxlKCksIG1VaWRDYWNoZWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCiBhdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNlbGVjdE91dHB1dChjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKQEAgLTE3NjUsNyArMTg1OSw4IEBACiAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKGN1cnZlcywgY2xpZW50LT52b2x1bWVTb3VyY2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVzLmdldFZvbHVtZUluZGV4KG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKSwgMCAvKmRlbGF5Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnVzZUh3R2FpbigpIC8qZm9yY2UqLyk7CiAKICAgICAgICAgLy8gdXBkYXRlIHRoZSBvdXRwdXRzIGlmIHN0YXJ0aW5nIGFuIG91dHB1dCB3aXRoIGEgc3RyZWFtIHRoYXQgY2FuIGFmZmVjdCBub3RpZmljYXRpb24KICAgICAgICAgLy8gcm91dGluZwpAQCAtMzA4MywxNiArMzE3OCwxNiBAQAogCiAvLyBSZXR1cm5zIHRydWUgaWYgYWxsIGRldmljZXMgdHlwZXMgbWF0Y2ggdGhlIHByZWRpY2F0ZSBhbmQgYXJlIHN1cHBvcnRlZCBieSBvbmUgSFcgbW9kdWxlCiBib29sICBBdWRpb1BvbGljeU1hbmFnZXI6OmFyZUFsbERldmljZXNTdXBwb3J0ZWQoCi0gICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcywKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcywKICAgICAgICAgc3RkOjpmdW5jdGlvbjxib29sKGF1ZGlvX2RldmljZXNfdCk+IHByZWRpY2F0ZSwKICAgICAgICAgY29uc3QgY2hhciAqY29udGV4dCkgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV2aWNlcy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgIGRldmljZXNbaV0ubVR5cGUsIGRldmljZXNbaV0ubUFkZHJlc3MuY19zdHIoKSwgU3RyaW5nOCgpLAorICAgICAgICAgICAgICAgIGRldmljZXNbaV0ubVR5cGUsIGRldmljZXNbaV0uZ2V0QWRkcmVzcygpLCBTdHJpbmc4KCksCiAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQsIGZhbHNlIC8qYWxsb3dUb0NyZWF0ZSovLCB0cnVlIC8qbWF0Y2hBZGRyZXNzKi8pOwogICAgICAgICBpZiAoZGV2RGVzYyA9PSBudWxscHRyIHx8IChwcmVkaWNhdGUgIT0gbnVsbHB0ciAmJiAhcHJlZGljYXRlKGRldmljZXNbaV0ubVR5cGUpKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBkZXZpY2UgdHlwZSAlI3ggYWRkcmVzcyAlcyBub3Qgc3VwcG9ydGVkIG9yIG5vdCBhbiBvdXRwdXQgZGV2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgZGV2aWNlc1tpXS5tVHlwZSwgZGV2aWNlc1tpXS5tQWRkcmVzcy5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dFKCIlczogZGV2aWNlIHR5cGUgJSN4IGFkZHJlc3MgJXMgbm90IHN1cHBvcnRlZCBvciBub3QgbWF0Y2ggcHJlZGljYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgZGV2aWNlc1tpXS5tVHlwZSwgZGV2aWNlc1tpXS5nZXRBZGRyZXNzKCkpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtMzEwMCw3ICszMTk1LDcgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwKLSAgICAgICAgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKSB7CisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpIHsKICAgICBBTE9HVigiJXMoKSB1aWQ9JWQgbnVtIGRldmljZXMgJXp1IiwgX19GVU5DVElPTl9fLCB1aWQsIGRldmljZXMuc2l6ZSgpKTsKICAgICBpZiAoIWFyZUFsbERldmljZXNTdXBwb3J0ZWQoZGV2aWNlcywgYXVkaW9faXNfb3V0cHV0X2RldmljZSwgX19mdW5jX18pKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0zMTMyLDI1ICszMjI3LDM1IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpIHsKLSAgICBBTE9HVigiJXMoKSBzdHJhdGVneT0lZCBkZXZpY2U9JTA4eCBhZGRyPSVzIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgc3RyYXRlZ3ksIGRldmljZS5tVHlwZSwgZGV2aWNlLm1BZGRyZXNzLmNfc3RyKCkpOwogCi0gICAgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+IGRldmljZXM7Ci0gICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpIHsKKyAgICBBTE9HVigiJXMoKSBzdHJhdGVneT0lZCByb2xlPSVkICVzIiwgX19mdW5jX18sIHN0cmF0ZWd5LCByb2xlLAorICAgICAgICAgICAgZHVtcEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IoZGV2aWNlcykuY19zdHIoKSk7CisKICAgICBpZiAoIWFyZUFsbERldmljZXNTdXBwb3J0ZWQoZGV2aWNlcywgYXVkaW9faXNfb3V0cHV0X2RldmljZSwgX19mdW5jX18pKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHN0YXR1c190IHN0YXR1cyA9IG1FbmdpbmUtPnNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBkZXZpY2UpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1FbmdpbmUtPnNldERldmljZXNSb2xlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHJvbGUsIGRldmljZXMpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1coIkVuZ2luZSBjb3VsZCBub3Qgc2V0IHByZWZlcnJlZCBkZXZpY2UgJTA4eCAlcyBmb3Igc3RyYXRlZ3kgJWQiLAotICAgICAgICAgICAgICAgIGRldmljZS5tVHlwZSwgZGV2aWNlLm1BZGRyZXNzLmNfc3RyKCksIHN0cmF0ZWd5KTsKKyAgICAgICAgQUxPR1coIkVuZ2luZSBjb3VsZCBub3Qgc2V0IHByZWZlcnJlZCBkZXZpY2VzICVzIGZvciBzdHJhdGVneSAlZCByb2xlICVkIiwKKyAgICAgICAgICAgICAgICBkdW1wQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvcihkZXZpY2VzKS5jX3N0cigpLCBzdHJhdGVneSwgcm9sZSk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCiAgICAgY2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKCk7Ci0gICAgdXBkYXRlQ2FsbEFuZE91dHB1dFJvdXRpbmcoKTsKKworICAgIGJvb2wgZm9yY2VWb2x1bWVSZWV2YWwgPSBmYWxzZTsKKyAgICAvLyBGSVhNRTogd29ya2Fyb3VuZCBmb3IgdHJ1bmNhdGVkIHRvdWNoIHNvdW5kcworICAgIC8vIHRvIGJlIHJlbW92ZWQgd2hlbiB0aGUgcHJvYmxlbSBpcyBoYW5kbGVkIGJ5IHN5c3RlbSBVSQorICAgIHVpbnQzMl90IGRlbGF5TXMgPSAwOworICAgIGlmIChzdHJhdGVneSA9PSBtQ29tbXVubmljYXRpb25TdHJhdGVneSkgeworICAgICAgICBmb3JjZVZvbHVtZVJlZXZhbCA9IHRydWU7CisgICAgICAgIGRlbGF5TXMgPSBUT1VDSF9TT1VORF9GSVhFRF9ERUxBWV9NUzsKKyAgICAgICAgdXBkYXRlSW5wdXRSb3V0aW5nKCk7CisgICAgfQorICAgIHVwZGF0ZUNhbGxBbmRPdXRwdXRSb3V0aW5nKGZvcmNlVm9sdW1lUmVldmFsLCBkZWxheU1zKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTMxNTgsOSArMzI2Myw3IEBACiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlQ2FsbEFuZE91dHB1dFJvdXRpbmcoYm9vbCBmb3JjZVZvbHVtZVJlZXZhbCwgdWludDMyX3QgZGVsYXlNcykKIHsKICAgICB1aW50MzJfdCB3YWl0TXMgPSAwOwotICAgIGlmIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMICYmIGhhc1ByaW1hcnlPdXRwdXQoKSkgewotICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIHdhaXRNcyA9IHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZXMsIGRlbGF5TXMpOworICAgIGlmICh1cGRhdGVDYWxsUm91dGluZyh0cnVlIC8qZnJvbUNhY2hlKi8sIGRlbGF5TXMsICZ3YWl0TXMpID09IE5PX0VSUk9SKSB7CiAgICAgICAgIC8vIE9ubHkgYXBwbHkgc3BlY2lhbCB0b3VjaCBzb3VuZCBkZWxheSBvbmNlCiAgICAgICAgIGRlbGF5TXMgPSAwOwogICAgIH0KQEAgLTMxODEsMzAgKzMyODQsMTI0IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbW92ZVByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkKLXsKLSAgICBBTE9HSSgiJXMoKSBzdHJhdGVneT0lZCIsIF9fRlVOQ1RJT05fXywgc3RyYXRlZ3kpOwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUlucHV0Um91dGluZygpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdGl2ZURlc2MgOiBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpKSB7CisgICAgICAgIGF1dG8gbmV3RGV2aWNlID0gZ2V0TmV3SW5wdXREZXZpY2UoYWN0aXZlRGVzYyk7CisgICAgICAgIC8vIEZvcmNlIG5ldyBpbnB1dCBzZWxlY3Rpb24gaWYgdGhlIG5ldyBkZXZpY2UgY2FuIG5vdCBiZSByZWFjaGVkIHZpYSBjdXJyZW50IGlucHV0CisgICAgICAgIGlmIChhY3RpdmVEZXNjLT5tUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpLmNvbnRhaW5zKG5ld0RldmljZSkpIHsKKyAgICAgICAgICAgIHNldElucHV0RGV2aWNlKGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSwgbmV3RGV2aWNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNsb3NlSW5wdXQoYWN0aXZlRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KK30KIAotICAgIHN0YXR1c190IHN0YXR1cyA9IG1FbmdpbmUtPnJlbW92ZVByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVtb3ZlRGV2aWNlc1JvbGVGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlKQoreworICAgIEFMT0dJKCIlcygpIHN0cmF0ZWd5PSVkIHJvbGU9JWQiLCBfX2Z1bmNfXywgc3RyYXRlZ3ksIHJvbGUpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUVuZ2luZS0+cmVtb3ZlRGV2aWNlc1JvbGVGb3JTdHJhdGVneShzdHJhdGVneSwgcm9sZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygiRW5naW5lIGNvdWxkIG5vdCByZW1vdmUgcHJlZmVycmVkIGRldmljZSBmb3Igc3RyYXRlZ3kgJWQiLCBzdHJhdGVneSk7CisgICAgICAgIEFMT0dWKCJFbmdpbmUgY291bGQgbm90IHJlbW92ZSBwcmVmZXJyZWQgZGV2aWNlIGZvciBzdHJhdGVneSAlZCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgIHN0cmF0ZWd5LCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAogICAgIGNoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcygpOwotICAgIHVwZGF0ZUNhbGxBbmRPdXRwdXRSb3V0aW5nKCk7CisKKyAgICBib29sIGZvcmNlVm9sdW1lUmVldmFsID0gZmFsc2U7CisgICAgLy8gRklYTUU6IHdvcmthcm91bmQgZm9yIHRydW5jYXRlZCB0b3VjaCBzb3VuZHMKKyAgICAvLyB0byBiZSByZW1vdmVkIHdoZW4gdGhlIHByb2JsZW0gaXMgaGFuZGxlZCBieSBzeXN0ZW0gVUkKKyAgICB1aW50MzJfdCBkZWxheU1zID0gMDsKKyAgICBpZiAoc3RyYXRlZ3kgPT0gbUNvbW11bm5pY2F0aW9uU3RyYXRlZ3kpIHsKKyAgICAgICAgZm9yY2VWb2x1bWVSZWV2YWwgPSB0cnVlOworICAgICAgICBkZWxheU1zID0gVE9VQ0hfU09VTkRfRklYRURfREVMQVlfTVM7CisgICAgICAgIHVwZGF0ZUlucHV0Um91dGluZygpOworICAgIH0KKyAgICB1cGRhdGVDYWxsQW5kT3V0cHV0Um91dGluZyhmb3JjZVZvbHVtZVJlZXZhbCwgZGVsYXlNcyk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKSB7Ci0gICAgcmV0dXJuIG1FbmdpbmUtPmdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBkZXZpY2UpOworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgeworICAgIHJldHVybiBtRW5naW5lLT5nZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KHN0cmF0ZWd5LCByb2xlLCBkZXZpY2VzKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLCBkZXZpY2Vfcm9sZV90IHJvbGUsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpIHsKKyAgICBBTE9HVigiJXMoKSBhdWRpb1NvdXJjZT0lZCByb2xlPSVkICVzIiwgX19mdW5jX18sIGF1ZGlvU291cmNlLCByb2xlLAorICAgICAgICAgICAgZHVtcEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IoZGV2aWNlcykuY19zdHIoKSk7CisKKyAgICBpZiAoIWFyZUFsbERldmljZXNTdXBwb3J0ZWQoZGV2aWNlcywgYXVkaW9fY2FsbF9pc19pbnB1dF9kZXZpY2UsIF9fZnVuY19fKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtRW5naW5lLT5zZXREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpOworICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwKKyAgICAgICAgICAgICJFbmdpbmUgY291bGQgbm90IHNldCBwcmVmZXJyZWQgZGV2aWNlcyAlcyBmb3IgYXVkaW8gc291cmNlICVkIHJvbGUgJWQiLAorICAgICAgICAgICAgZHVtcEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IoZGV2aWNlcykuY19zdHIoKSwgYXVkaW9Tb3VyY2UsIHJvbGUpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLCBkZXZpY2Vfcm9sZV90IHJvbGUsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpIHsKKyAgICBBTE9HVigiJXMoKSBhdWRpb1NvdXJjZT0lZCByb2xlPSVkICVzIiwgX19mdW5jX18sIGF1ZGlvU291cmNlLCByb2xlLAorICAgICAgICAgICAgZHVtcEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IoZGV2aWNlcykuY19zdHIoKSk7CisKKyAgICBpZiAoIWFyZUFsbERldmljZXNTdXBwb3J0ZWQoZGV2aWNlcywgYXVkaW9fY2FsbF9pc19pbnB1dF9kZXZpY2UsIF9fZnVuY19fKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtRW5naW5lLT5hZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpOworICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwKKyAgICAgICAgICAgICJFbmdpbmUgY291bGQgbm90IGFkZCBwcmVmZXJyZWQgZGV2aWNlcyAlcyBmb3IgYXVkaW8gc291cmNlICVkIHJvbGUgJWQiLAorICAgICAgICAgICAgZHVtcEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IoZGV2aWNlcykuY19zdHIoKSwgYXVkaW9Tb3VyY2UsIHJvbGUpOworCisgICAgdXBkYXRlSW5wdXRSb3V0aW5nKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLCBkZXZpY2Vfcm9sZV90IHJvbGUsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpCit7CisgICAgQUxPR1YoIiVzKCkgYXVkaW9Tb3VyY2U9JWQgcm9sZT0lZCBkZXZpY2VzPSVzIiwgX19mdW5jX18sIGF1ZGlvU291cmNlLCByb2xlLAorICAgICAgICAgICAgZHVtcEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IoZGV2aWNlcykuY19zdHIoKSk7CisKKyAgICBpZiAoIWFyZUFsbERldmljZXNTdXBwb3J0ZWQoZGV2aWNlcywgYXVkaW9fY2FsbF9pc19pbnB1dF9kZXZpY2UsIF9fZnVuY19fKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1FbmdpbmUtPnJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCgKKyAgICAgICAgICAgIGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKTsKKyAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsCisgICAgICAgICAgICAiRW5naW5lIGNvdWxkIG5vdCByZW1vdmUgZGV2aWNlcyByb2xlICglZCkgZm9yIGNhcHR1cmUgcHJlc2V0ICVkIiwgcm9sZSwgYXVkaW9Tb3VyY2UpOworCisgICAgdXBkYXRlSW5wdXRSb3V0aW5nKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlKSB7CisgICAgQUxPR1YoIiVzKCkgYXVkaW9Tb3VyY2U9JWQgcm9sZT0lZCIsIF9fZnVuY19fLCBhdWRpb1NvdXJjZSwgcm9sZSk7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtRW5naW5lLT5jbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSk7CisgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAorICAgICAgICAgICAgIkVuZ2luZSBjb3VsZCBub3QgY2xlYXIgZGV2aWNlcyByb2xlICglZCkgZm9yIGNhcHR1cmUgcHJlc2V0ICVkIiwgcm9sZSwgYXVkaW9Tb3VyY2UpOworCisgICAgdXBkYXRlSW5wdXRSb3V0aW5nKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLCBkZXZpY2Vfcm9sZV90IHJvbGUsIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpIHsKKyAgICByZXR1cm4gbUVuZ2luZS0+Z2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQsCi0gICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgewotICAgIEFMT0dJKCIlcygpIHVzZXJJZD0lZCBudW0gZGV2aWNlcyAlenUiLCBfX0ZVTkNUSU9OX18sIHVzZXJJZCwgZGV2aWNlcy5zaXplKCkpO1wKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykgeworICAgIEFMT0dJKCIlcygpIHVzZXJJZD0lZCBudW0gZGV2aWNlcyAlenUiLCBfX2Z1bmNfXywgdXNlcklkLCBkZXZpY2VzLnNpemUoKSk7CiAgICAgaWYgKCFhcmVBbGxEZXZpY2VzU3VwcG9ydGVkKGRldmljZXMsIGF1ZGlvX2lzX291dHB1dF9kZXZpY2UsIF9fZnVuY19fKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KQEAgLTMyNjMsNyArMzQ2MCw5IEBACiAgICAgfQogICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgVFRTIG91dHB1dCAlc2F2YWlsYWJsZVxuIiwgbVR0c091dHB1dEF2YWlsYWJsZSA/ICIiIDogIm5vdCAiKTsKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIE1hc3RlciBtb25vOiAlc1xuIiwgbU1hc3Rlck1vbm8gPyAib24iIDogIm9mZiIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ29tbXVubmljYXRpb24gU3RyYXRlZ3k6ICVkXG4iLCBtQ29tbXVubmljYXRpb25TdHJhdGVneSk7CiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBDb25maWcgc291cmNlOiAlc1xuIiwgbUNvbmZpZy5nZXRTb3VyY2UoKS5jX3N0cigpKTsgLy8gZ2V0Q29uZmlnIG5vdCBjb25zdAorCiAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIkF2YWlsYWJsZSBvdXRwdXQiKSk7CiAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiQXZhaWxhYmxlIGlucHV0IikpOwogICAgIG1Id01vZHVsZXNBbGwuZHVtcChkc3QpOwpAQCAtMzY2OSw2ICszODY4LDE1IEBACiAgICAgICAgICAgICAvLyBiZSBpbmNvbXBsZXRlLgogICAgICAgICAgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnIHNvdXJjZVBvcnRDb25maWcgPSB7fTsKKworICAgICAgICAgICAgLy8gaWYgZmlyc3Qgc2luayBpcyB0byBNU0QsIGVzdGFibGlzaCBzaW5nbGUgTVNEIHBhdGNoCisgICAgICAgICAgICBpZiAoZ2V0TXNkQXVkaW9PdXREZXZpY2VzKCkuY29udGFpbnMoCisgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocGF0Y2gtPnNpbmtzWzBdLmlkKSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgcGF0Y2hpbmcgdG8gTVNEIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBwYXRjaEJ1aWxkZXIgPSBidWlsZE1zZFBhdGNoKGZhbHNlIC8qbXNkSXNTb3VyY2UqLywgc3JjRGV2aWNlKTsKKyAgICAgICAgICAgICAgICBnb3RvIGluc3RhbGxQYXRjaDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgc3JjRGV2aWNlLT50b0F1ZGlvUG9ydENvbmZpZygmc291cmNlUG9ydENvbmZpZywgJnBhdGNoLT5zb3VyY2VzWzBdKTsKICAgICAgICAgICAgIHBhdGNoQnVpbGRlci5hZGRTb3VyY2Uoc291cmNlUG9ydENvbmZpZyk7CiAKQEAgLTM2ODYsNiArMzg5NCw0MSBAQAogICAgICAgICAgICAgICAgIHNpbmtEZXZpY2UtPnRvQXVkaW9Qb3J0Q29uZmlnKCZzaW5rUG9ydENvbmZpZywgJnBhdGNoLT5zaW5rc1tpXSk7CiAgICAgICAgICAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNpbmsoc2lua1BvcnRDb25maWcpOwogCisgICAgICAgICAgICAgICAgLy8gV2hhdGV2ZXIgU3cgb3IgSHcgYnJpZGdlLCB3ZSBkbyBhdHRhY2ggYW4gU3dPdXRwdXQgdG8gYW4gQXVkaW8gU291cmNlIGZvcgorICAgICAgICAgICAgICAgIC8vIHZvbHVtZSBtYW5hZ2VtZW50IHB1cnBvc2UgKHRyYWNraW5nIGFjdGl2aXR5KQorICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgSHcgYnJpZGdlLCBpdCBpcyBhIFdvcmsgQXJvdW5kLiBUaGUgbWl4UG9ydCB1c2VkIGlzIHRoZSBvbmUgZGVjbGFyZWQKKyAgICAgICAgICAgICAgICAvLyBpbiBjb25maWcgWE1MIHRvIHJlYWNoIHRoZSBzaW5rIHNvIHRoYXQgaXMgY2FuIGJlIGRlY2xhcmVkIGFzIGF2YWlsYWJsZS4KKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZURlc2MgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIGNhcmUgb2YgZHluYW1pYyByb3V0aW5nIGZvciBTd091dHB1dCBzZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gc291cmNlRGVzYy0+YXR0cmlidXRlcygpOworICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHNvdXJjZURlc2MtPnN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgcmVzdWx0QXR0cjsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBzb3VyY2VEZXNjLT5jb25maWcoKS5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IHNvdXJjZURlc2MtPmNvbmZpZygpLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IHNvdXJjZURlc2MtPmNvbmZpZygpLmZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgICAgICBib29sIGlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dF90eXBlX3Qgb3V0cHV0VHlwZTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0Rm9yQXR0ckludCgmcmVzdWx0QXR0ciwgJm91dHB1dCwgQVVESU9fU0VTU0lPTl9OT05FLCAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtLCBzb3VyY2VEZXNjLT51aWQoKSwgJmNvbmZpZywgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3RlZERldmljZUlkLCAmaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgJm91dHB1dFR5cGUpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXMgbm8gb3V0cHV0IGZvciBkZXZpY2UgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzaW5rRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBvdXRwdXQgaXMgZHVwbGljYXRlZCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzb3VyY2VEZXNjLT5zZXRTd091dHB1dChvdXRwdXREZXNjKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgc29mdHdhcmUgYnJpZGdlIGluIFBhdGNoUGFuZWwgaWY6CiAgICAgICAgICAgICAgICAgLy8gLSBzb3VyY2UgYW5kIHNpbmsgZGV2aWNlcyBhcmUgb24gZGlmZmVyZW50IEhXIG1vZHVsZXMgT1IKICAgICAgICAgICAgICAgICAvLyAtIGF1ZGlvIEhBTCB2ZXJzaW9uIGlzIDwgMy4wCkBAIC0zNzAxLDQ5ICszOTQ0LDI1IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NpbmtzID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlRGVzYyAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIGNhcmUgb2YgZHluYW1pYyByb3V0aW5nIGZvciBTd091dHB1dCBzZWxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHNvdXJjZURlc2MtPmF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gc291cmNlRGVzYy0+c3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgcmVzdWx0QXR0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHNvdXJjZURlc2MtPmNvbmZpZygpLnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IHNvdXJjZURlc2MtPmNvbmZpZygpLmNoYW5uZWxfbWFzazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBzb3VyY2VEZXNjLT5jb25maWcoKS5mb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1JlcXVlc3RlZERldmljZUZvckV4Y2x1c2l2ZVVzZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3R5cGVfdCBvdXRwdXRUeXBlOwotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0Rm9yQXR0ckludCgmcmVzdWx0QXR0ciwgJm91dHB1dCwgQVVESU9fU0VTU0lPTl9OT05FLCAmYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbSwgc291cmNlRGVzYy0+dWlkKCksICZjb25maWcsICZmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGVkRGV2aWNlSWQsICZpc1JlcXVlc3RlZERldmljZUZvckV4Y2x1c2l2ZVVzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgJm91dHB1dFR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBubyBvdXRwdXQgZm9yIGRldmljZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzaW5rRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZURlc2MgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0c0ZvckRldmljZXMoRGV2aWNlVmVjdG9yKHNpbmtEZXZpY2UpLCBtT3V0cHV0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc2luayBkZXZpY2UgaXMgcmVhY2hhYmxlIHZpYSBhbiBvcGVuZWQgb3V0cHV0IHN0cmVhbSwgcmVxdWVzdCB0bwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ28gdmlhIHRoaXMgb3V0cHV0IHN0cmVhbSBieSBhZGRpbmcgYSBzZWNvbmQgc291cmNlIHRvIHRoZSBwYXRjaAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXMgb3V0cHV0IGZvciBkZXZpY2UgJXMgaXMgZHVwbGljYXRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzaW5rRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzIG91dHB1dCBmb3IgZGV2aWNlICVzIGlzIGR1cGxpY2F0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNpbmtEZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9jb25maWcgc3JjTWl4UG9ydENvbmZpZyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnNyY01peFBvcnRDb25maWcsICZwYXRjaC0+c291cmNlc1swXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlRGVzYyAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRGVzYy0+c2V0U3dPdXRwdXQob3V0cHV0RGVzYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3Igdm9sdW1lIGNvbnRyb2wsIHdlIG1heSBuZWVkIGEgdmFsaWQgc3RyZWFtCiAgICAgICAgICAgICAgICAgICAgICAgICBzcmNNaXhQb3J0Q29uZmlnLmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBzb3VyY2VEZXNjICE9IG51bGxwdHIgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRGVzYy0+c3RyZWFtKCkgOiBBVURJT19TVFJFQU1fUEFUQ0g7CkBAIC0zNzUzLDYgKzM5NzIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgZnJvbSByb3V0aW5nIGNhcGFiaWxpdGllcyBpbiBjb25maWcgZmlsZSBhbmQgb3RoZXIgY29uZmxpY3RpbmcgcGF0Y2hlcwogCitpbnN0YWxsUGF0Y2g6CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnN0YWxsUGF0Y2goCiAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaW5kZXgsIGhhbmRsZSwgcGF0Y2hCdWlsZGVyLnBhdGNoKCksIGRlbGF5TXMsIHVpZCwgJnBhdGNoRGVzYyk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CkBAIC0zODM0LDggKzQwNTQsOSBAQAogICAgICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0KICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmdldE91dHB1dEZyb21JZChwYXRjaC0+c291cmNlc1sxXS5pZCk7CiAgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXMgb3V0cHV0IG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBfX2Z1bmNfXywgcGF0Y2gtPnNvdXJjZXNbMF0uaWQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgb3V0cHV0IG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBfX2Z1bmNfXywgcGF0Y2gtPnNvdXJjZXNbMF0uaWQpOworICAgICAgICAgICAgICAgICAgICAvLyByZWxlYXNlT3V0cHV0IGhhcyBhbHJlYWR5IGNhbGxlZCBjbG9zZU91cHV0IGluIGNhc2Ugb2YgZGlyZWN0IG91dHB1dAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChwYXRjaERlc2MtPmdldEhhbmRsZSgpICE9IG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2UgU3dPdXRwdXQgcGF0Y2ggcmVtb3ZhbCBhcyBBRiBjb3VudGVyIHBhcnQgcGF0Y2ggaGFzIGFscmVhZHkgZ29uZS4KQEAgLTQxMDEsMTUgKzQzMjIsMTkgQEAKICAgICBkaXNjb25uZWN0QXVkaW9Tb3VyY2Uoc291cmNlRGVzYyk7CiAKICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHNvdXJjZURlc2MtPmF0dHJpYnV0ZXMoKTsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2UgPSBzb3VyY2VEZXNjLT5zcmNEZXZpY2UoKTsKLQorICAgIC8vIE1heSB0aGUgZGV2aWNlIChkeW5hbWljKSBoYXZlIGJlZW4gZGlzY29ubmVjdGVkL3JlY29ubmVjdGVkLCBpZCBoYXMgY2hhbmdlZC4KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2UgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZSgKKyAgICAgICAgICAgICAgICBzb3VyY2VEZXNjLT5zcmNEZXZpY2UoKS0+dHlwZSgpLAorICAgICAgICAgICAgICAgIFN0cmluZzgoc291cmNlRGVzYy0+c3JjRGV2aWNlKCktPmFkZHJlc3MoKS5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgRGV2aWNlVmVjdG9yIHNpbmtEZXZpY2VzID0KLSAgICAgICAgICAgIG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIG51bGxwdHIsIHRydWUpOworICAgICAgICAgICAgbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgbnVsbHB0ciwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CiAgICAgQUxPR19BU1NFUlQoIXNpbmtEZXZpY2VzLmlzRW1wdHkoKSwgImNvbm5lY3RBdWRpb1NvdXJjZSgpOiBubyBkZXZpY2UgZm91bmQgZm9yIGF0dHJpYnV0ZXMiKTsKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzaW5rRGV2aWNlID0gc2lua0RldmljZXMuaXRlbUF0KDApOwotICAgIEFMT0dfQVNTRVJUKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNvbnRhaW5zKHNpbmtEZXZpY2UpLCAiJXM6IERldmljZSAlcyBub3QgYXZhaWxhYmxlIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNpbmtEZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KKyAgICBpZiAoIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNvbnRhaW5zKHNpbmtEZXZpY2UpKSB7CisgICAgICAgIEFMT0dFKCIlcyBEZXZpY2UgJXMgbm90IGF2YWlsYWJsZSIsIF9fZnVuY19fLCBzaW5rRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQogICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CiAgICAgcGF0Y2hCdWlsZGVyLmFkZFNpbmsoc2lua0RldmljZSkuYWRkU291cmNlKHNyY0RldmljZSk7CiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CkBAIC00MTE5LDcgKzQzNDQsNyBAQAogICAgICAgICBBTE9HVygiJXMgcGF0Y2ggcGFuZWwgY291bGQgbm90IGNvbm5lY3QgZGV2aWNlIHBhdGNoLCBlcnJvciAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIHNvdXJjZURlc2MtPnNldFBhdGNoSGFuZGxlKGhhbmRsZSk7CisgICAgc291cmNlRGVzYy0+Y29ubmVjdChoYW5kbGUsIHNpbmtEZXZpY2UpOwogICAgIC8vIFNXIEJyaWRnZT8gKEB0b2RvOiBIVyBicmlkZ2UsIGtlZXAgdHJhY2sgb2YgSHdPdXRwdXQgZm9yIGRldmljZSBzZWxlY3Rpb24gInJlY29uc2lkZXJhdGlvbiIpCiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHN3T3V0cHV0ID0gc291cmNlRGVzYy0+c3dPdXRwdXQoKS5wcm9tb3RlKCk7CiAgICAgaWYgKHN3T3V0cHV0ICE9IDApIHsKQEAgLTQ0MDIsNiArNDYyNywxMCBAQAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkaXNjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpCiB7CiAgICAgQUxPR1YoIiVzIHBvcnQgSWQgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPnBvcnRJZCgpKTsKKyAgICBpZiAoIXNvdXJjZURlc2MtPmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgQUxPR1YoIiVzIHBvcnQgSWQgJWQgYWxyZWFkeSBkaXNjb25uZWN0ZWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPnBvcnRJZCgpKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3dPdXRwdXQgPSBzb3VyY2VEZXNjLT5zd091dHB1dCgpLnByb21vdGUoKTsKICAgICBpZiAoc3dPdXRwdXQgIT0gMCkgewogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wU291cmNlKHN3T3V0cHV0LCBzb3VyY2VEZXNjKTsKQEAgLTQ0MTcsNyArNDY0Niw5IEBACiAgICAgICAgICAgICBBTE9HVygiJXMgc291cmNlIGhhcyBuZWl0aGVyIFNXIG5vciBIVyBvdXRwdXQiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiByZWxlYXNlQXVkaW9QYXRjaEludGVybmFsKHNvdXJjZURlc2MtPmdldFBhdGNoSGFuZGxlKCkpOworICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbGVhc2VBdWRpb1BhdGNoSW50ZXJuYWwoc291cmNlRGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7CisgICAgc291cmNlRGVzYy0+ZGlzY29ubmVjdCgpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U291cmNlRm9yQXR0cmlidXRlc09uT3V0cHV0KApAQCAtNDQ0NSwzNyArNDY3NiwxNSBAQAogfQogCiBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemVBdWRpb1BvbGljeVhtbENvbmZpZyhBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKSB7Ci0gICAgY2hhciBhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGVbQVVESU9fUE9MSUNZX1hNTF9DT05GSUdfRklMRV9QQVRIX01BWF9MRU5HVEhdOwotICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBmaWxlTmFtZXM7Ci0gICAgc3RhdHVzX3QgcmV0OwotCi0gICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJyby5ibHVldG9vdGguYTJkcF9vZmZsb2FkLnN1cHBvcnRlZCIsIGZhbHNlKSkgewotICAgICAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuYmx1ZXRvb3RoLmJsdWV0b290aF9hdWRpb19oYWwuZGlzYWJsZWQiLCBmYWxzZSkgJiYKLSAgICAgICAgICAgIHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LmJsdWV0b290aC5hMmRwX29mZmxvYWQuZGlzYWJsZWQiLCBmYWxzZSkpIHsKLSAgICAgICAgICAgIC8vIEJvdGggQmx1ZXRvb3RoQXVkaW9AMi4wIGFuZCBCbHVldG9vdGhBMmRwQDEuMCAoT2ZmbGFvZCkgYXJlIGRpc2FibGVkLCBhbmQgdXNlcwotICAgICAgICAgICAgLy8gdGhlIGxlZ2FjeSBoYXJkd2FyZSBtb2R1bGUgZm9yIEEyRFAgYW5kIGhlYXJpbmcgYWlkLgotICAgICAgICAgICAgZmlsZU5hbWVzLnB1c2hfYmFjayhBVURJT19QT0xJQ1lfQkxVRVRPT1RIX0xFR0FDWV9IQUxfWE1MX0NPTkZJR19GSUxFX05BTUUpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LmJsdWV0b290aC5hMmRwX29mZmxvYWQuZGlzYWJsZWQiLCBmYWxzZSkpIHsKLSAgICAgICAgICAgIC8vIEEyRFAgb2ZmbG9hZCBzdXBwb3J0ZWQgYnV0IGRpc2FibGVkOiB0cnkgdG8gdXNlIHNwZWNpYWwgWE1MIGZpbGUKLSAgICAgICAgICAgIGZpbGVOYW1lcy5wdXNoX2JhY2soQVVESU9fUE9MSUNZX0EyRFBfT0ZGTE9BRF9ESVNBQkxFRF9YTUxfQ09ORklHX0ZJTEVfTkFNRSk7CisgICAgaWYgKHN0ZDo6c3RyaW5nIGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSA9IGF1ZGlvX2dldF9hdWRpb19wb2xpY3lfY29uZmlnX2ZpbGUoKTsKKyAgICAgICAgICAgICFhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUuZW1wdHkoKSkgeworICAgICAgICBzdGF0dXNfdCByZXQgPSBkZXNlcmlhbGl6ZUF1ZGlvUG9saWN5RmlsZShhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUuY19zdHIoKSwgJmNvbmZpZyk7CisgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGNvbmZpZy5zZXRTb3VyY2UoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlKTsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuYmx1ZXRvb3RoLmJsdWV0b290aF9hdWRpb19oYWwuZGlzYWJsZWQiLCBmYWxzZSkpIHsKLSAgICAgICAgZmlsZU5hbWVzLnB1c2hfYmFjayhBVURJT19QT0xJQ1lfQkxVRVRPT1RIX0xFR0FDWV9IQUxfWE1MX0NPTkZJR19GSUxFX05BTUUpOworICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KLSAgICBmaWxlTmFtZXMucHVzaF9iYWNrKEFVRElPX1BPTElDWV9YTUxfQ09ORklHX0ZJTEVfTkFNRSk7Ci0KLSAgICBmb3IgKGNvbnN0IGNoYXIqIGZpbGVOYW1lIDogZmlsZU5hbWVzKSB7Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byYgcGF0aCA6IGF1ZGlvX2dldF9jb25maWd1cmF0aW9uX3BhdGhzKCkpIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgc2l6ZW9mKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSksCi0gICAgICAgICAgICAgICAgICAgICAiJXMvJXMiLCBwYXRoLmNfc3RyKCksIGZpbGVOYW1lKTsKLSAgICAgICAgICAgIHJldCA9IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lGaWxlKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgJmNvbmZpZyk7Ci0gICAgICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLnNldFNvdXJjZShhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCiBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlLApAQCAtNDU1MSwxNCArNDc2MCwxNCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKG1QcmltYXJ5T3V0cHV0ID09IDApIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIHByaW1hcnkgb3V0cHV0Iik7Ci0gICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7Ci0gICAgfQorICAgIEFMT0dXX0lGKG1QcmltYXJ5T3V0cHV0ID09IG51bGxwdHIsICJUaGUgcG9saWN5IGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgZGVjbGFyZSBhIHByaW1hcnkgb3V0cHV0Iik7CiAKICAgICAvLyBTaWxlbmNlIEFMT0dWIHN0YXRlbWVudHMKICAgICBwcm9wZXJ0eV9zZXQoImxvZy50YWcuIiBMT0dfVEFHLCAiRCIpOwogCisgICAgbUNvbW11bm5pY2F0aW9uU3RyYXRlZ3kgPSBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgbUVuZ2luZS0+Z2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKTsKKwogICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTQ2NjQsNyArNDg3Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIHNldEVuZ2luZURldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVByaW1hcnlPdXRwdXQgPT0gMCAmJgorICAgICAgICAgICAgaWYgKG1QcmltYXJ5T3V0cHV0ID09IG51bGxwdHIgJiYKICAgICAgICAgICAgICAgICAgICAgb3V0UHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpIHsKICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dCA9IG91dHB1dERlc2M7CiAgICAgICAgICAgICB9CkBAIC00NzQxLDYgKzQ5NTAsMTAgQEAKIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbW92ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCiB7CisgICAgaWYgKG1QcmltYXJ5T3V0cHV0ICE9IDAgJiYgbVByaW1hcnlPdXRwdXQgPT0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KSkgeworICAgICAgICBBTE9HVigiJXM6IHJlbW92aW5nIHByaW1hcnkgb3V0cHV0IiwgX19mdW5jX18pOworICAgICAgICBtUHJpbWFyeU91dHB1dCA9IG51bGxwdHI7CisgICAgfQogICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0ob3V0cHV0KTsKICAgICBzZWxlY3RPdXRwdXRGb3JNdXNpY0VmZmVjdHMoKTsKIH0KQEAgLTQ4OTksNiArNTExMiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtUHJpbWFyeU91dHB1dCA9PSBudWxscHRyCisJCSAgICAgICAgICAgICYmIChwcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCk6IHJlLWFzc2lnbmluZyBtUHJpbWFyeU91dHB1dCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0ID0gZGVzYzsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CkBAIC01MTU0LDggKzUzNzIsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoIWRpcmVjdE91dHB1dE9wZW4pIHsKLSAgICAgICAgICAgIEFMT0dWKCJubyBkaXJlY3Qgb3V0cHV0cyBvcGVuLCByZXNldCBNU0QgcGF0Y2giKTsKLSAgICAgICAgICAgIHNldE1zZFBhdGNoKCk7CisgICAgICAgICAgICBBTE9HVigibm8gZGlyZWN0IG91dHB1dHMgb3BlbiwgcmVzZXQgTVNEIHBhdGNoZXMiKTsKKyAgICAgICAgICAgIC8vIFRPRE86IFRoZSBNU0QgcGF0Y2hlcyB0byBiZSBlc3RhYmxpc2hlZCBoZXJlIG1heSBkaWZmZXIgdG8gY3VycmVudCBNU0QgcGF0Y2hlcyBkdWUgdG8KKyAgICAgICAgICAgIC8vIGhvdyBvdXRwdXQgZGV2aWNlcyBmb3IgcGF0Y2hpbmcgYXJlIHJlc29sdmVkLiBBdm9pZCBieSBjYWNoaW5nIGFuZCByZXVzaW5nIHRoZQorICAgICAgICAgICAgLy8gYXJndW1lbnRzIHRvIG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKCkgd2hlbiByZXNvbHZpbmcgd2hpY2ggb3V0cHV0CisgICAgICAgICAgICAvLyBkZXZpY2VzIHRvIHBhdGNoIHRvLiBUaGlzIG1heSBiZSBjb21wbGljYXRlZCBieSB0aGUgZmFjdCB0aGF0IGRldmljZXMgbWF5IGJlY29tZQorICAgICAgICAgICAgLy8gdW5hdmFpbGFibGUuCisgICAgICAgICAgICBzZXRNc2RPdXRwdXRQYXRjaGVzKCk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC01MjIyLDcgKzU0NDUsMTMgQEAKICAgICBpZiAob25PdXRwdXRzQ2hlY2tlZCAhPSBudWxscHRyICYmIG9uT3V0cHV0c0NoZWNrZWQoKSkgY2hlY2tBMmRwU3VzcGVuZCgpOwogICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CiAgICAgaWYgKG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkgIT0gMCkgewotICAgICAgICBzZXRNc2RQYXRjaCgpOworICAgICAgICAvLyBUT0RPOiBUaGUgTVNEIHBhdGNoZXMgdG8gYmUgZXN0YWJsaXNoZWQgaGVyZSBtYXkgZGlmZmVyIHRvIGN1cnJlbnQgTVNEIHBhdGNoZXMgZHVlIHRvIGhvdworICAgICAgICAvLyBvdXRwdXQgZGV2aWNlcyBmb3IgcGF0Y2hpbmcgYXJlIHJlc29sdmVkLiBOZXZlcnRoZWxlc3MsIEF1ZGlvVHJhY2tzIGFmZmVjdGVkIGJ5IGRldmljZQorICAgICAgICAvLyBjb25maWd1cmF0aW9uIGNoYW5nZXMgd2lsbCB1bHRpbWF0ZWx5IGJlIHJlcm91dGVkIGNvcnJlY3RseS4gV2UgY2FuIHN0aWxsIGF2b2lkCisgICAgICAgIC8vIHVubmVjZXNzYXJ5IHJlcm91dGluZyBieSBjYWNoaW5nIGFuZCByZXVzaW5nIHRoZSBhcmd1bWVudHMgdG8KKyAgICAgICAgLy8gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoKSB3aGVuIHJlc29sdmluZyB3aGljaCBvdXRwdXQgZGV2aWNlcyB0byBwYXRjaCB0by4KKyAgICAgICAgLy8gVGhpcyBtYXkgYmUgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCBkZXZpY2VzIG1heSBiZWNvbWUgdW5hdmFpbGFibGUuCisgICAgICAgIHNldE1zZE91dHB1dFBhdGNoZXMoKTsKICAgICB9CiB9CiAKQEAgLTUyMzMsNiArNTQ2MiwyOSBAQAogICAgICAgICAgICAgbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhyQXR0cik7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0F1ZGlvU291cmNlRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Tb3VyY2VzLnNpemUoKTsgaSsrKSAgeworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoc291cmNlRGVzYyAhPSBudWxscHRyICYmIGZvbGxvd3NTYW1lUm91dGluZyhhdHRyLCBzb3VyY2VEZXNjLT5hdHRyaWJ1dGVzKCkpCisgICAgICAgICAgICAgICAgJiYgc291cmNlRGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSA9PSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORQorICAgICAgICAgICAgICAgICYmICFpc0NhbGxSeEF1ZGlvU291cmNlKHNvdXJjZURlc2MpKSB7CisgICAgICAgICAgICBjb25uZWN0QXVkaW9Tb3VyY2Uoc291cmNlRGVzYyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbGVhckF1ZGlvU291cmNlc0Zvck91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Tb3VyY2VzLnNpemUoKTsgaSsrKSAgeworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoc291cmNlRGVzYyAhPSBudWxscHRyICYmIHNvdXJjZURlc2MtPnN3T3V0cHV0KCkucHJvbW90ZSgpICE9IG51bGxwdHIKKyAgICAgICAgICAgICAgICAmJiBzb3VyY2VEZXNjLT5zd091dHB1dCgpLnByb21vdGUoKS0+bUlvSGFuZGxlID09IG91dHB1dCkgeworICAgICAgICAgICAgZGlzY29ubmVjdEF1ZGlvU291cmNlKHNvdXJjZURlc2MpOworICAgICAgICB9CisgICAgfQorfQorCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikKIHsKICAgICBhdXRvIHBzSWQgPSBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGF0dHIpOwpAQCAtNTMyOCw3ICs1NTgwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGV2aWNlcy50eXBlcygpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZSA9IGdldFNvdXJjZUZvckF0dHJpYnV0ZXNPbk91dHB1dChzcmNPdXQsIGF0dHIpOwotICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSAwKXsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbHB0ciAmJiAhaXNDYWxsUnhBdWRpb1NvdXJjZShzb3VyY2UpKSB7CiAgICAgICAgICAgICAgICAgY29ubmVjdEF1ZGlvU291cmNlKHNvdXJjZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUzNTEsNiArNTYwMyw3IEBACiAgICAgZm9yIChjb25zdCBhdXRvICZzdHJhdGVneSA6IG1FbmdpbmUtPmdldE9yZGVyZWRQcm9kdWN0U3RyYXRlZ2llcygpKSB7CiAgICAgICAgIGF1dG8gYXR0cmlidXRlcyA9IG1FbmdpbmUtPmdldEFsbEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3kpLmZyb250KCk7CiAgICAgICAgIGNoZWNrT3V0cHV0Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICAgICAgY2hlY2tBdWRpb1NvdXJjZUZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CiAgICAgfQogfQogCkBAIC01Mzg2LDYgKzU2MzksMTcgQEAKICAgICB9CiB9CiAKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1Njb1JlcXVlc3RlZEZvckNvbW0oKSBjb25zdCB7CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzOworICAgIG1FbmdpbmUtPmdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3kobUNvbW11bm5pY2F0aW9uU3RyYXRlZ3ksIERFVklDRV9ST0xFX1BSRUZFUlJFRCwgZGV2aWNlcyk7CisgICAgZm9yIChjb25zdCBhdXRvICZkZXZpY2UgOiBkZXZpY2VzKSB7CisgICAgICAgIGlmIChhdWRpb19pc19ibHVldG9vdGhfb3V0X3Njb19kZXZpY2UoZGV2aWNlLm1UeXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBMmRwU3VzcGVuZCgpCiB7CiAgICAgYXVkaW9faW9faGFuZGxlX3QgYTJkcE91dHB1dCA9IG1PdXRwdXRzLmdldEEyZHBPdXRwdXQoKTsKQEAgLTUzOTcsMjMgKzU2NjEsMjEgQEAKICAgICBib29sIGlzU2NvQ29ubmVjdGVkID0KICAgICAgICAgICAgIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkuY291bnQoQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkgIT0gMCB8fAogICAgICAgICAgICAgICFJbnRlcnNlY3Rpb24obUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSwgZ2V0QXVkaW9EZXZpY2VPdXRBbGxTY29TZXQoKSkuZW1wdHkoKSk7CisgICAgYm9vbCBpc1Njb1JlcXVlc3RlZCA9IGlzU2NvUmVxdWVzdGVkRm9yQ29tbSgpOwogCiAgICAgLy8gaWYgc3VzcGVuZGVkLCByZXN0b3JlIEEyRFAgb3V0cHV0IGlmOgogICAgIC8vICAgICAgKChTQ08gZGV2aWNlIGlzIE5PVCBjb25uZWN0ZWQpIHx8Ci0gICAgLy8gICAgICAgKChmb3JjZWQgdXNhZ2UgY29tbXVuaWNhdGlvbiBpcyBOT1QgU0NPKSAmJiAoZm9yY2VkIHVzYWdlIGZvciByZWNvcmQgaXMgTk9UIFNDTykgJiYKKyAgICAvLyAgICAgICAoKFNDTyBpcyBub3QgcmVxdWVzdGVkKSAmJgogICAgIC8vICAgICAgICAocGhvbmUgc3RhdGUgaXMgTk9UIGluIGNhbGwpICYmIChwaG9uZSBzdGF0ZSBpcyBOT1QgcmluZ2luZykpKQogICAgIC8vCiAgICAgLy8gaWYgbm90IHN1c3BlbmRlZCwgc3VzcGVuZCBBMkRQIG91dHB1dCBpZjoKICAgICAvLyAgICAgIChTQ08gZGV2aWNlIGlzIGNvbm5lY3RlZCkgJiYKLSAgICAvLyAgICAgICAoKGZvcmNlZCB1c2FnZSBmb3IgY29tbXVuaWNhdGlvbiBpcyBTQ08pIHx8IChmb3JjZWQgdXNhZ2UgZm9yIHJlY29yZCBpcyBTQ08pIHx8CisgICAgLy8gICAgICAgKChTQ08gaXMgcmVxdWVzdGVkKSB8fAogICAgIC8vICAgICAgICgocGhvbmUgc3RhdGUgaXMgaW4gY2FsbCkgfHwgKHBob25lIHN0YXRlIGlzIHJpbmdpbmcpKSkKICAgICAvLwogICAgIGlmIChtQTJkcFN1c3BlbmRlZCkgewogICAgICAgICBpZiAoIWlzU2NvQ29ubmVjdGVkIHx8Ci0gICAgICAgICAgICAgKChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pICE9Ci0gICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSAmJgotICAgICAgICAgICAgICAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkQpICE9Ci0gICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgJiYKKyAgICAgICAgICAgICAoIWlzU2NvUmVxdWVzdGVkICYmCiAgICAgICAgICAgICAgIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSAmJgogICAgICAgICAgICAgICAobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpICE9IEFVRElPX01PREVfUklOR1RPTkUpKSkgewogCkBAIC01NDIyLDEwICs1Njg0LDcgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChpc1Njb0Nvbm5lY3RlZCAmJgotICAgICAgICAgICAgICgobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OKSA9PQotICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgfHwKLSAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEKSA9PQotICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHx8CisgICAgICAgICAgICAgKGlzU2NvUmVxdWVzdGVkIHx8CiAgICAgICAgICAgICAgIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB8fAogICAgICAgICAgICAgICAobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfUklOR1RPTkUpKSkgewogCkBAIC01NDUwLDYgKzU3MDksMTIgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIERvIG5vdCByZXRyaWV2ZSBlbmdpbmUgZGV2aWNlIGZvciBvdXRwdXRzIHRocm91Z2ggTVNECisgICAgLy8gVE9ETzogc3VwcG9ydCBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3RzIGJ5IHJlc2V0dGluZyBNU0QgcGF0Y2ggdG8gZW5naW5lIGRldmljZS4KKyAgICBpZiAob3V0cHV0RGVzYy0+ZGV2aWNlcygpID09IGdldE1zZEF1ZGlvT3V0RGV2aWNlcygpKSB7CisgICAgICAgIHJldHVybiBvdXRwdXREZXNjLT5kZXZpY2VzKCk7CisgICAgfQorCiAgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIG5vIGNsaWVudCB1c2luZyBkZWZhdWx0IHJvdXRpbmcgaXMgYWN0aXZlIG9uIHRoaXMKICAgICAvLyBpbnB1dDogYSBzcGVjaWZpYyBhcHAgY2FuIG5vdCBmb3JjZSByb3V0aW5nIGZvciBvdGhlciBhcHBzIGJ5IHNldHRpbmcgYSBwcmVmZXJyZWQgZGV2aWNlLgogICAgIGJvb2wgYWN0aXZlOyAvLyB1bnVzZWQKQEAgLTU1MzcsOCArNTgwMiw4IEBACiAgICAgfQogICAgIERldmljZVZlY3RvciBhY3RpdmVEZXZpY2VzOwogICAgIERldmljZVZlY3RvciBkZXZpY2VzOwotICAgIGZvciAoYXVkaW9fc3RyZWFtX3R5cGVfdCBjdXJTdHJlYW0gPSBBVURJT19TVFJFQU1fTUlOOyBjdXJTdHJlYW0gPCBBVURJT19TVFJFQU1fUFVCTElDX0NOVDsKLSAgICAgICAgIGN1clN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KSAoY3VyU3RyZWFtICsgMSkpIHsKKyAgICBmb3IgKGludCBpID0gQVVESU9fU1RSRUFNX01JTjsgaSA8IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UOyArK2kpIHsKKyAgICAgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCBjdXJTdHJlYW17c3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4oaSl9OwogICAgICAgICBpZiAoIXN0cmVhbXNNYXRjaEZvcnZvbHVtZShzdHJlYW0sIGN1clN0cmVhbSkpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CkBAIC02MDM1LDcgKzYzMDAsOCBAQAogICAgIGlmICghSW50ZXJzZWN0aW9uKGRldmljZVR5cGVzLAogICAgICAgICAgICAge0FVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAsIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUywKICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQsIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FLAotICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQsIEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUR9KS5lbXB0eSgpICYmCisgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVCwgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCwKKyAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUfSkuZW1wdHkoKSAmJgogICAgICAgICAgICAgKCh2b2x1bWVTb3VyY2UgPT0gYWxhcm1Wb2x1bWVTcmMgfHwKICAgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHJpbmdWb2x1bWVTcmMpIHx8CiAgICAgICAgICAgICAgKHZvbHVtZVNvdXJjZSA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OKSkgfHwKQEAgLTYxMzAsMTYgKzYzOTYsMTcgQEAKICAgICBib29sIGlzVm9pY2VWb2xTcmMgPSBjYWxsVm9sU3JjID09IHZvbHVtZVNvdXJjZTsKICAgICBib29sIGlzQnRTY29Wb2xTcmMgPSBidFNjb1ZvbFNyYyA9PSB2b2x1bWVTb3VyY2U7CiAKLSAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlRm9yQ29tbSA9Ci0gICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pOworICAgIGJvb2wgaXNTY29SZXF1ZXN0ZWQgPSBpc1Njb1JlcXVlc3RlZEZvckNvbW0oKTsKICAgICAvLyBkbyBub3QgY2hhbmdlIGluIGNhbGwgdm9sdW1lIGlmIGJsdWV0b290aCBpcyBjb25uZWN0ZWQgYW5kIHZpY2UgdmVyc2EKICAgICAvLyBpZiBzY28gYW5kIGNhbGwgZm9sbG93IHNhbWUgY3VydmVzLCBieXBhc3MgZm9yY2VVc2VGb3JDb21tCiAgICAgaWYgKChjYWxsVm9sU3JjICE9IGJ0U2NvVm9sU3JjKSAmJgotICAgICAgICAgICAgKChpc1ZvaWNlVm9sU3JjICYmIGZvcmNlVXNlRm9yQ29tbSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB8fAotICAgICAgICAgICAgIChpc0J0U2NvVm9sU3JjICYmIGZvcmNlVXNlRm9yQ29tbSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSkpIHsKLSAgICAgICAgQUxPR1YoIiVzIGNhbm5vdCBzZXQgdm9sdW1lIGdyb3VwICVkIHZvbHVtZSB3aXRoIGZvcmNlIHVzZSA9ICVkIGZvciBjb21tIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgdm9sdW1lU291cmNlLCBmb3JjZVVzZUZvckNvbW0pOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAoKGlzVm9pY2VWb2xTcmMgJiYgaXNTY29SZXF1ZXN0ZWQpIHx8CisgICAgICAgICAgICAgKGlzQnRTY29Wb2xTcmMgJiYgIWlzU2NvUmVxdWVzdGVkKSkpIHsKKyAgICAgICAgQUxPR1YoIiVzIGNhbm5vdCBzZXQgdm9sdW1lIGdyb3VwICVkIHZvbHVtZSB3aGVuIGlzJXNyZXF1ZXN0ZWQgZm9yIGNvbW0iLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICB2b2x1bWVTb3VyY2UsIGlzU2NvUmVxdWVzdGVkID8gIiAiIDogIm4gb3QgIik7CisgICAgICAgIC8vIERvIG5vdCByZXR1cm4gYW4gZXJyb3IgaGVyZSBhcyBBdWRpb1NlcnZpY2Ugd2lsbCBhbHdheXMgc2V0IGJvdGggdm9pY2UgY2FsbAorICAgICAgICAvLyBhbmQgYmx1ZXRvb3RoIFNDTyB2b2x1bWVzIGR1ZSB0byBzdHJlYW0gYWxpYXNpbmcuCisgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAgICAgaWYgKGRldmljZVR5cGVzLmVtcHR5KCkpIHsKICAgICAgICAgZGV2aWNlVHlwZXMgPSBvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKTsKQEAgLTYzMDgsOSArNjU3NSwxMCBAQAogewogICAgIGZvciAoc3NpemVfdCBpID0gKHNzaXplX3QpbUF1ZGlvU291cmNlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgIHsKICAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKHNvdXJjZURlc2MtPnNyY0RldmljZSgpLT5lcXVhbHMoZGV2aWNlRGVzYykpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyByZWxlYXNpbmcgYXVkaW8gc291cmNlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5wb3J0SWQoKSk7Ci0gICAgICAgICAgICBzdG9wQXVkaW9Tb3VyY2Uoc291cmNlRGVzYy0+cG9ydElkKCkpOworICAgICAgICBpZiAoc291cmNlRGVzYy0+aXNDb25uZWN0ZWQoKSAmJiAoc291cmNlRGVzYy0+c3JjRGV2aWNlKCktPmVxdWFscyhkZXZpY2VEZXNjKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRGVzYy0+c2lua0RldmljZSgpLT5lcXVhbHMoZGV2aWNlRGVzYykpCisgICAgICAgICAgICAgICAgJiYgIWlzQ2FsbFJ4QXVkaW9Tb3VyY2Uoc291cmNlRGVzYykpIHsKKyAgICAgICAgICAgIGRpc2Nvbm5lY3RBdWRpb1NvdXJjZShzb3VyY2VEZXNjKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjMyNCwxMCArNjU5MiwxNCBAQAogICAgICAgICAgICAgICAgIHJlbGVhc2UgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSBkZXZpY2VEZXNjLT5hZGRyZXNzKCkuY19zdHIoKTsKICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwYXRjaERlc2MtPm1QYXRjaC5udW1fc2lua3MgJiYgIXJlbGVhc2U7IGorKykgIHsKICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2luayA9ICZwYXRjaERlc2MtPm1QYXRjaC5zaW5rc1tqXTsKICAgICAgICAgICAgIGlmIChzaW5rLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgJiYKLSAgICAgICAgICAgICAgICAgICAgc2luay0+ZXh0LmRldmljZS50eXBlID09IGRldmljZURlc2MtPnR5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICBzaW5rLT5leHQuZGV2aWNlLnR5cGUgPT0gZGV2aWNlRGVzYy0+dHlwZSgpICYmCisgICAgICAgICAgICAgICAgICAgIChzdHJubGVuKGFkZHJlc3MsIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pID09IDAKKyAgICAgICAgICAgICAgICAgICAgIHx8IHN0cm5jbXAoc2luay0+ZXh0LmRldmljZS5hZGRyZXNzLCBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMCkpIHsKICAgICAgICAgICAgICAgICByZWxlYXNlID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaAppbmRleCBiNTg4Zjg5Li41NTMzODI5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaApAQCAtMjYzLDE3ICsyNjMsNDIgQEAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyUG9saWN5TWl4ZXMoVmVjdG9yPEF1ZGlvTWl4PiBtaXhlcyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKTsKKyAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkLAotICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcyk7CisgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkKTsKIAotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcyk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVEZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSk7CisKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcyk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcyk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcyk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCisgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcyk7CiAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLApAQCAtNTMxLDYgKzU1NiwyMCBAQAogICAgICAgICAgKi8KICAgICAgICAgdm9pZCB1cGRhdGVDYWxsQW5kT3V0cHV0Um91dGluZyhib29sIGZvcmNlVm9sdW1lUmVldmFsID0gdHJ1ZSwgdWludDMyX3QgZGVsYXlNcyA9IDApOwogCisgICAgICAgIGJvb2wgaXNDYWxsUnhBdWRpb1NvdXJjZShjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiAmc291cmNlKSB7CisgICAgICAgICAgICByZXR1cm4gbUNhbGxSeFNvdXJjZUNsaWVudFBvcnQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORQorICAgICAgICAgICAgICAgICYmIHNvdXJjZSA9PSBtQXVkaW9Tb3VyY2VzLnZhbHVlRm9yKG1DYWxsUnhTb3VyY2VDbGllbnRQb3J0KTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgY29ubmVjdFRlbGVwaG9ueVJ4QXVkaW9Tb3VyY2UoKTsKKworICAgICAgICB2b2lkIGRpc2Nvbm5lY3RUZWxlcGhvbnlSeEF1ZGlvU291cmNlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiB1cGRhdGVzIHJvdXRpbmcgZm9yIGFsbCBpbnB1dHMuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHVwZGF0ZUlucHV0Um91dGluZygpOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBAYnJpZWYgY2hlY2tPdXRwdXRGb3JBdHRyaWJ1dGVzIGNoZWNrcyBhbmQgaWYgbmVjZXNzYXJ5IGNoYW5nZXMgb3V0cHV0cyB1c2VkIGZvciB0aGUKICAgICAgICAgICogZ2l2ZW4gYXVkaW8gYXR0cmlidXRlcy4KQEAgLTU0MSw2ICs1ODAsMTYgQEAKICAgICAgICAgICovCiAgICAgICAgIHZvaWQgY2hlY2tPdXRwdXRGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cik7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBjaGVja0F1ZGlvU291cmNlRm9yQXR0cmlidXRlcyBjaGVja3MgaWYgYW55IEF1ZGlvU291cmNlIGZvbGxvd2luZyB0aGUgc2FtZSByb3V0aW5nCisgICAgICAgICAqIGFzIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzIGlzIG5vdCByb3V0ZWQgYW5kIHRyeSB0byBjb25uZWN0IGl0LgorICAgICAgICAgKiBJdCBtdXN0IGJlIGNhbGxlZCBvbmNlIGNoZWNrT3V0cHV0Rm9yQXR0cmlidXRlcyBoYXMgYmVlbiBjYWxsZWQgZm9yIG9ycGhhbnMgQXVkaW9Tb3VyY2UsCisgICAgICAgICAqIGFrYSBBdWRpb1NvdXJjZSBub3QgYXR0YWNoZWQgdG8gYW55IEF1ZGlvIE91dHB1dCAoZS5nLiBBdWRpb1NvdXJjZSBjb25uZWN0ZWQgdG8gZGlyZWN0CisgICAgICAgICAqIE91dHB1dCB3aGljaCBoYXMgYmVlbiBkaXNjb25uZWN0ZWQgKGFuZCBvdXRwdXQgY2xvc2VkKSBkdWUgdG8gc2luayBkZXZpY2UgdW5hdmFpbGFibGUpLgorICAgICAgICAgKiBAcGFyYW0gYXR0ciB0byBiZSBjb25zaWRlcmVkCisgICAgICAgICAqLworICAgICAgICB2b2lkIGNoZWNrQXVkaW9Tb3VyY2VGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cik7CisKICAgICAgICAgYm9vbCBmb2xsb3dzU2FtZVJvdXRpbmcoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZsQXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZyQXR0cikgY29uc3Q7CiAKQEAgLTY4MCw5ICs3MjksMjIgQEAKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChkZXZpY2VzLml0ZW1BdCgwKS0+YWRkcmVzcygpLmNfc3RyKCkpIDogU3RyaW5nOCgiIik7CiAgICAgICAgIH0KIAotICAgICAgICB1aW50MzJfdCB1cGRhdGVDYWxsUm91dGluZyhjb25zdCBEZXZpY2VWZWN0b3IgJnJ4RGV2aWNlcywgdWludDMyX3QgZGVsYXlNcyA9IDApOworICAgICAgICBzdGF0dXNfdCB1cGRhdGVDYWxsUm91dGluZygKKyAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSwgdWludDMyX3QgZGVsYXlNcyA9IDAsIHVpbnQzMl90ICp3YWl0TXMgPSBudWxscHRyKTsKKyAgICAgICAgc3RhdHVzX3QgdXBkYXRlQ2FsbFJvdXRpbmdJbnRlcm5hbCgKKyAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJnJ4RGV2aWNlcywgdWludDMyX3QgZGVsYXlNcywgdWludDMyX3QgKndhaXRNcyk7CiAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IGNyZWF0ZVRlbGVwaG9ueVBhdGNoKGJvb2wgaXNSeCwgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcyk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgc2VsZWN0QmVzdFJ4U2lua0RldmljZXNGb3JDYWxsOiBpZiB0aGUgcHJpbWFyeSBtb2R1bGUgaG9zdCBib3RoIFRlbGVwaG9ueSBSeC9UeAorICAgICAgICAgKiBkZXZpY2VzLCBhbmQgaXQgZGVjbGFyZXMgYWxzbyBzdXBwb3J0aW5nIGEgSFcgYnJpZGdlIGJldHdlZW4gdGhlIFRlbGVwaG9ueSBSeCBhbmQgdGhlCisgICAgICAgICAqIGdpdmVuIHNpbmsgZGV2aWNlIGZvciBWb2ljZSBDYWxsIGF1ZGlvIGF0dHJpYnV0ZXMsIHNlbGVjdCB0aGlzIGRldmljZSBpbiBwcmlvLgorICAgICAgICAgKiBPdGhlcndpc2UsIGdldE5ld091dHB1dERldmljZXMoKSBpcyBjYWxsZWQgb24gdGhlIHByaW1hcnkgb3V0cHV0IHRvIHNlbGVjdCBzaW5rIGRldmljZS4KKyAgICAgICAgICogQHBhcmFtIGZyb21DYWNoZSB0cnVlIHRvIHByZXZlbnQgZW5naW5lIHJlY29uc2lkZXJpbmcgYWxsIHByb2R1Y3Qgc3RyYXRlZ2llcyBhbmQgcmV0cmlldmUKKyAgICAgICAgICogZnJvbSBlbmdpbmUgY2FjaGUuCisgICAgICAgICAqIEByZXR1cm4gdmVjdG9yIG9mIGRldmljZXMsIGVtcHR5IGlmIG5vbmUgaXMgZm91bmQuCisgICAgICAgICAqLworICAgICAgICBEZXZpY2VWZWN0b3Igc2VsZWN0QmVzdFJ4U2lua0RldmljZXNGb3JDYWxsKGJvb2wgZnJvbUNhY2hlKTsKICAgICAgICAgYm9vbCBpc0RldmljZU9mTW9kdWxlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBjb25zdCBjaGFyICptb2R1bGVJZCkgY29uc3Q7CiAKICAgICAgICAgc3RhdHVzX3Qgc3RhcnRTb3VyY2UoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLApAQCAtNzA5LDYgKzc3MSw3IEBACiAKICAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gZ2V0U291cmNlRm9yQXR0cmlidXRlc09uT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cik7CisgICAgICAgIHZvaWQgY2xlYXJBdWRpb1NvdXJjZXNGb3JPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKIAogICAgICAgICB2b2lkIGNsZWFuVXBGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldmljZURlc2MpOwogCkBAIC03NTUsNyArODE4LDYgQEAKICAgICAgICAgU291bmRUcmlnZ2VyU2Vzc2lvbkNvbGxlY3Rpb24gbVNvdW5kVHJpZ2dlclNlc3Npb25zOwogCiAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IG1DYWxsVHhQYXRjaDsKLSAgICAgICAgc3A8QXVkaW9QYXRjaD4gbUNhbGxSeFBhdGNoOwogCiAgICAgICAgIEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uIG1Id091dHB1dHM7CiAgICAgICAgIFNvdXJjZUNsaWVudENvbGxlY3Rpb24gbUF1ZGlvU291cmNlczsKQEAgLTc4Nyw2ICs4NDksMzMgQEAKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBtTWFudWFsU3Vycm91bmRGb3JtYXRzOwogCiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgYXVkaW9fZmxhZ3NfbWFza190PiBtQWxsb3dlZENhcHR1cmVQb2xpY2llczsKKworICAgICAgICAvLyBDYWNoZWQgcHJvZHVjdCBzdHJhdGVneSBJRCBjb3JyZXNwb25kaW5nIHRvIGxlZ2FjeSBzdHJhdGVneSBTVFJBVEVHWV9QSE9ORQorICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgbUNvbW11bm5pY2F0aW9uU3RyYXRlZ3k7CisKKyAgICAgICAgLy8gVGhlIHBvcnQgaGFuZGxlIG9mIHRoZSBoYXJkd2FyZSBhdWRpbyBzb3VyY2UgY3JlYXRlZCBpbnRlcm5hbGx5IGZvciB0aGUgQ2FsbCBSWCBhdWRpbworICAgICAgICAvLyBlbmQgcG9pbnQuCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUNhbGxSeFNvdXJjZUNsaWVudFBvcnQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworCisgICAgICAgIC8vIFN1cHBvcnQgZm9yIE11bHRpLVN0cmVhbSBEZWNvZGVyIChNU0QpIG1vZHVsZQorICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRNc2RBdWRpb0luRGV2aWNlKCkgY29uc3Q7CisgICAgICAgIERldmljZVZlY3RvciBnZXRNc2RBdWRpb091dERldmljZXMoKSBjb25zdDsKKyAgICAgICAgY29uc3QgQXVkaW9QYXRjaENvbGxlY3Rpb24gZ2V0TXNkT3V0cHV0UGF0Y2hlcygpIGNvbnN0OworICAgICAgICBzdGF0dXNfdCBnZXRNc2RQcm9maWxlcyhib29sIGh3QXZTeW5jLAorICAgICAgICAgICAgICAgIGNvbnN0IElucHV0UHJvZmlsZUNvbGxlY3Rpb24gJmlucHV0UHJvZmlsZXMsCisgICAgICAgICAgICAgICAgY29uc3QgT3V0cHV0UHJvZmlsZUNvbGxlY3Rpb24gJm91dHB1dFByb2ZpbGVzLAorICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZzb3VyY2VEZXZpY2UsCisgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnNpbmtEZXZpY2UsCisgICAgICAgICAgICAgICAgQXVkaW9Qcm9maWxlVmVjdG9yICZzb3VyY2VQcm9maWxlcywKKyAgICAgICAgICAgICAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgJnNpbmtQcm9maWxlcykgY29uc3Q7CisgICAgICAgIHN0YXR1c190IGdldEJlc3RNc2RDb25maWcoYm9vbCBod0F2U3luYywKKyAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3IgJnNvdXJjZVByb2ZpbGVzLAorICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciAmc2lua1Byb2ZpbGVzLAorICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VDb25maWcsCisgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtDb25maWcpIGNvbnN0OworICAgICAgICBQYXRjaEJ1aWxkZXIgYnVpbGRNc2RQYXRjaChib29sIG1zZElzU291cmNlLCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKSBjb25zdDsKKyAgICAgICAgc3RhdHVzX3Qgc2V0TXNkT3V0cHV0UGF0Y2hlcyhjb25zdCBEZXZpY2VWZWN0b3IgKm91dHB1dERldmljZXMgPSBudWxscHRyKTsKKyAgICAgICAgdm9pZCByZWxlYXNlTXNkT3V0cHV0UGF0Y2hlcyhjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMpOwogcHJpdmF0ZToKICAgICAgICAgdm9pZCBvbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZUludChEZXZpY2VWZWN0b3IgKm5ld0RldmljZXMpOwogCkBAIC03OTQsMTcgKzg4Myw2IEBACiAgICAgICAgIHZvaWQgbW9kaWZ5U3Vycm91bmRGb3JtYXRzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBGb3JtYXRWZWN0b3IgKmZvcm1hdHNQdHIpOwogICAgICAgICB2b2lkIG1vZGlmeVN1cnJvdW5kQ2hhbm5lbE1hc2tzKENoYW5uZWxNYXNrU2V0ICpjaGFubmVsTWFza3NQdHIpOwogCi0gICAgICAgIC8vIFN1cHBvcnQgZm9yIE11bHRpLVN0cmVhbSBEZWNvZGVyIChNU0QpIG1vZHVsZQotICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRNc2RBdWRpb0luRGV2aWNlKCkgY29uc3Q7Ci0gICAgICAgIERldmljZVZlY3RvciBnZXRNc2RBdWRpb091dERldmljZXMoKSBjb25zdDsKLSAgICAgICAgY29uc3QgQXVkaW9QYXRjaENvbGxlY3Rpb24gZ2V0TXNkUGF0Y2hlcygpIGNvbnN0OwotICAgICAgICBzdGF0dXNfdCBnZXRCZXN0TXNkQXVkaW9Qcm9maWxlRm9yKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZvdXRwdXREZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBod0F2U3luYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rQ29uZmlnKSBjb25zdDsKLSAgICAgICAgUGF0Y2hCdWlsZGVyIGJ1aWxkTXNkUGF0Y2goY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm91dHB1dERldmljZSkgY29uc3Q7Ci0gICAgICAgIHN0YXR1c190IHNldE1zZFBhdGNoKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZvdXRwdXREZXZpY2UgPSBudWxscHRyKTsKLQogICAgICAgICAvLyBJZiBhbnksIHJlc29sdmUgYW55ICJkeW5hbWljIiBmaWVsZHMgb2YgYW4gQXVkaW8gUHJvZmlsZXMgY29sbGVjdGlvbgogICAgICAgICB2b2lkIHVwZGF0ZUF1ZGlvUHJvZmlsZXMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAogICAgICAgICAgICAgICAgIEF1ZGlvUHJvZmlsZVZlY3RvciAmcHJvZmlsZXMpOwpAQCAtOTM4LDEwICsxMDE2LDExIEBACiAgICAgICAgICAgICAgICAgc3A8QXVkaW9QYXRjaD4gKnBhdGNoRGVzY1B0cik7CiAKICAgICAgICAgYm9vbCBhcmVBbGxEZXZpY2VzU3VwcG9ydGVkKAotICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcywKKyAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzLAogICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbChhdWRpb19kZXZpY2VzX3QpPiBwcmVkaWNhdGUsCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29udGV4dCk7CiAKKyAgICAgICAgYm9vbCBpc1Njb1JlcXVlc3RlZEZvckNvbW0oKSBjb25zdDsKIH07CiAKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0FuZHJvaWQubWsKaW5kZXggNjgwYjA3Ny4uN2JlMTBjNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQW5kcm9pZC5tawpAQCAtMTksNiArMTksNyBAQAogICAgIGxpYmF1ZGlvcG9saWN5bWFuYWdlcl9pbnRlcmZhY2VfaGVhZGVycwogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhY3Rpdml0eW1hbmFnZXJfYWlkbCBcCiAgICAgbGliY3V0aWxzIFwKICAgICBsaWJ1dGlscyBcCiAgICAgbGlibG9nIFwKQEAgLTM2LDE1ICszNywxOCBAQAogICAgIGNhcHR1cmVfc3RhdGVfbGlzdGVuZXItYWlkbC1jcHAKIAogTE9DQUxfRVhQT1JUX1NIQVJFRF9MSUJSQVJZX0hFQURFUlMgOj0gXAorICAgIGxpYmFjdGl2aXR5bWFuYWdlcl9haWRsIFwKICAgICBsaWJzZW5zb3Jwcml2YWN5CiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwogCiBMT0NBTF9NT0RVTEU6PSBsaWJhdWRpb3BvbGljeXNlcnZpY2UKK0xPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCitMT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKK0xPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS8uLi8uLi8uLi9OT1RJQ0UKIAogTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yIC1XdGhyZWFkLXNhZmV0eQogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcAppbmRleCBiNzM4NjMzLi41ZGFjNTViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCkBAIC05NzAsNyArOTcwLDcgQEAKICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZUVmZmVjdHNJdGVyIDogbURldmljZUVmZmVjdHMpIHsKICAgICAgICAgY29uc3QgYXV0byYgZGV2aWNlRWZmZWN0cyA9ICBkZXZpY2VFZmZlY3RzSXRlci5zZWNvbmQ7CiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgZWZmZWN0RGVzYyA6IGRldmljZUVmZmVjdHMtPm1FZmZlY3REZXNjcmlwdG9ycy0+bUVmZmVjdHMpIHsKLSAgICAgICAgICAgIGF1dG8gZnggPSBzdGQ6Om1ha2VfdW5pcXVlPEF1ZGlvRWZmZWN0PihTdHJpbmcxNigiYW5kcm9pZCIpKTsKKyAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBmeCA9IG5ldyBBdWRpb0VmZmVjdChTdHJpbmcxNigiYW5kcm9pZCIpKTsKICAgICAgICAgICAgIGZ4LT5zZXQoRUZGRUNUX1VVSURfTlVMTCwgJmVmZmVjdERlc2MtPm1VdWlkLCAwLCBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBBVURJT19TRVNTSU9OX0RFVklDRSwgQVVESU9fSU9fSEFORExFX05PTkUsCiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJ7ZGV2aWNlRWZmZWN0cy0+Z2V0RGV2aWNlVHlwZSgpLApAQCAtOTg3LDcgKzk4Nyw3IEBACiAgICAgICAgICAgICBBTE9HVigiJXMoKTogY3JlYXRlIEZ4ICVzIGFkZGVkIG9uIHBvcnQgdHlwZT0lZCBhZGRyZXNzPSVzIiwgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tTmFtZSwgZGV2aWNlRWZmZWN0cy0+Z2V0RGV2aWNlVHlwZSgpLAogICAgICAgICAgICAgICAgICAgZGV2aWNlRWZmZWN0cy0+Z2V0RGV2aWNlQWRkcmVzcygpLmNfc3RyKCkpOwotICAgICAgICAgICAgZGV2aWNlRWZmZWN0cy0+bUVmZmVjdHMucHVzaF9iYWNrKHN0ZDo6bW92ZShmeCkpOworICAgICAgICAgICAgZGV2aWNlRWZmZWN0cy0+bUVmZmVjdHMucHVzaF9iYWNrKGZ4KTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCmluZGV4IDgxYzcyOGQuLjEzZDVkMGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaApAQCAtMjA3LDcgKzIwNyw3IEBACiAgICAgICAgICAgICBtRGV2aWNlVHlwZShkZXZpY2UpLCBtRGV2aWNlQWRkcmVzcyhhZGRyZXNzKSB7fQogICAgICAgICAvKnZpcnR1YWwqLyB+RGV2aWNlRWZmZWN0cygpID0gZGVmYXVsdDsKIAotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QXVkaW9FZmZlY3Q+PiBtRWZmZWN0czsKKyAgICAgICAgc3RkOjp2ZWN0b3I8IHNwPEF1ZGlvRWZmZWN0PiA+IG1FZmZlY3RzOwogICAgICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlOyB9CiAgICAgICAgIHN0ZDo6c3RyaW5nIGdldERldmljZUFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlQWRkcmVzczsgfQogICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8RWZmZWN0RGVzY1ZlY3Rvcj4gbUVmZmVjdERlc2NyaXB0b3JzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCmluZGV4IGRmMjdmNmUuLmRjZDMwZjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKQEAgLTI0NCwxMSArMjQ0LDEyIEBACiAgICAgICAgIHVpZCA9IGNhbGxpbmdVaWQ7CiAgICAgfQogICAgIGlmICghbVBhY2thZ2VNYW5hZ2VyLmFsbG93UGxheWJhY2tDYXB0dXJlKHVpZCkpIHsKLSAgICAgICAgYXR0ci0+ZmxhZ3MgfD0gQVVESU9fRkxBR19OT19NRURJQV9QUk9KRUNUSU9OOworICAgICAgICBhdHRyLT5mbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX2ZsYWdzX21hc2tfdD4oYXR0ci0+ZmxhZ3MgfCBBVURJT19GTEFHX05PX01FRElBX1BST0pFQ1RJT04pOwogICAgIH0KICAgICBpZiAoKChhdHRyLT5mbGFncyAmIChBVURJT19GTEFHX0JZUEFTU19JTlRFUlJVUFRJT05fUE9MSUNZfEFVRElPX0ZMQUdfQllQQVNTX01VVEUpKSAhPSAwKQogICAgICAgICAgICAgJiYgIWJ5cGFzc0ludGVycnVwdGlvblBvbGljeUFsbG93ZWQocGlkLCB1aWQpKSB7Ci0gICAgICAgIGF0dHItPmZsYWdzICY9IH4oQVVESU9fRkxBR19CWVBBU1NfSU5URVJSVVBUSU9OX1BPTElDWXxBVURJT19GTEFHX0JZUEFTU19NVVRFKTsKKyAgICAgICAgYXR0ci0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDxhdWRpb19mbGFnc19tYXNrX3Q+KAorICAgICAgICAgICAgICAgIGF0dHItPmZsYWdzICYgfihBVURJT19GTEFHX0JZUEFTU19JTlRFUlJVUFRJT05fUE9MSUNZfEFVRElPX0ZMQUdfQllQQVNTX01VVEUpKTsKICAgICB9CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICBBdWRpb1BvbGljeUludGVyZmFjZTo6b3V0cHV0X3R5cGVfdCBvdXRwdXRUeXBlOwpAQCAtMTI2MCw3ICsxMjYxLDcgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwKLSAgICAgICAgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKSB7CisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwpAQCAtMTI4NSw3ICsxMjg2LDcgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQsCi0gICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgeworICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKQEAgLTE0OTcsMzMgKzE0OTgsMzYgQEAKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNDYWxsU2NyZWVuTW9kZVN1cHBvcnRlZCgpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGRldmljZSk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldERldmljZXNSb2xlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHJvbGUsIGRldmljZXMpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZVByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlRGV2aWNlc1JvbGVGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbW92ZVByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVtb3ZlRGV2aWNlc1JvbGVGb3JTdHJhdGVneShzdHJhdGVneSwgcm9sZSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZGV2aWNlKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0RGV2aWNlc0ZvclJvbGVBbmRTdHJhdGVneShzdHJhdGVneSwgcm9sZSwgZGV2aWNlcyk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVnaXN0ZXJTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGVMaXN0ZW5lcigKQEAgLTE1MzQsNCArMTUzOCw1NSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLCBkZXZpY2Vfcm9sZV90IHJvbGUsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjphZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLCBkZXZpY2Vfcm9sZV90IHJvbGUsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+YWRkRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLCBkZXZpY2Vfcm9sZV90IHJvbGUsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcyk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCmluZGV4IDg2OWE5NjMuLjBiMjE4YzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaApAQCAtMjI2LDE5ICsyMjYsNDEgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcywgYm9vbCByZWdpc3RyYXRpb24pOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVEZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgZGV2aWNlX3JvbGVfdCByb2xlKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGV2aWNlc0ZvclJvbGVBbmRTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkLAorICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGVmZGIyNDEuLjQyZjAzNDIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJhdWRpb3BvbGljeV90ZXN0cyIsCiAKQEAgLTE4LDcgKzI3LDEwIEBACiAgICAgICAgICJsaWJ4bWwyIiwKICAgICBdLAogCi0gICAgc3RhdGljX2xpYnM6IFsibGliYXVkaW9wb2xpY3ljb21wb25lbnRzIl0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyIsCisgICAgICAgICJsaWJnbW9jayIKKyAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tbW9uIiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQuaAppbmRleCBlMTcyMWVhLi5iZGRkZjA2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudC5oCkBAIC03NSw2ICs3NSwxMCBAQAogICAgIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypkZWxheU1zKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgYXV0byBpdGVyID0gbUFjdGl2ZVBhdGNoZXMuZmluZCgqaGFuZGxlKTsKKyAgICAgICAgaWYgKGl0ZXIgIT0gbUFjdGl2ZVBhdGNoZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIG1BY3RpdmVQYXRjaGVzLmVyYXNlKCpoYW5kbGUpOworICAgICAgICB9CiAgICAgICAgICpoYW5kbGUgPSBtTmV4dFBhdGNoSGFuZGxlKys7CiAgICAgICAgIG1BY3RpdmVQYXRjaGVzLmluc2VydChzdGQ6Om1ha2VfcGFpcigqaGFuZGxlLCAqcGF0Y2gpKTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oCmluZGV4IDhiYWIwMjAuLjYxNTAyMDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdE1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RNYW5hZ2VyLmgKQEAgLTI5LDYgKzI5LDkgQEAKICAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dHM7CiAgICAgdXNpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzOwogICAgIHVzaW5nIEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzOworICAgIHVzaW5nIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZU1zZE91dHB1dFBhdGNoZXM7CisgICAgdXNpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRNc2RPdXRwdXRQYXRjaGVzOworICAgIHVzaW5nIEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0QXVkaW9QYXRjaGVzOwogICAgIHVpbnQzMl90IGdldEF1ZGlvUG9ydEdlbmVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtQXVkaW9Qb3J0R2VuZXJhdGlvbjsgfQogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9faGVhbHRoX3Rlc3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvX2hlYWx0aF90ZXN0cy5jcHAKaW5kZXggYjVjNjdhMS4uZTE2MzRjZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9faGVhbHRoX3Rlc3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb19oZWFsdGhfdGVzdHMuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC02OCw5ICs2OSwxOCBAQAogICAgIEFTU0VSVF9ORSgiQXVkaW9Qb2xpY3lDb25maWc6OnNldERlZmF1bHQiLCBtYW5hZ2VyLmdldENvbmZpZygpLmdldFNvdXJjZSgpKTsKIAogICAgIGZvciAoYXV0byBkZXNjIDogbWFuYWdlci5nZXRDb25maWcoKS5nZXRJbnB1dERldmljZXMoKSkgewotICAgICAgICBBU1NFUlRfTkUoYXR0YWNoZWREZXZpY2VzLmVuZCgpLCBhdHRhY2hlZERldmljZXMuZmluZChkZXNjLT50eXBlKCkpKTsKKyAgICAgICAgaWYgKGF0dGFjaGVkRGV2aWNlcy5maW5kKGRlc2MtPnR5cGUoKSkgPT0gYXR0YWNoZWREZXZpY2VzLmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXZpY2VUeXBlOworICAgICAgICAgICAgKHZvaWQpRGV2aWNlQ29udmVydGVyOjp0b1N0cmluZyhkZXNjLT50eXBlKCksIGRldmljZVR5cGUpOworICAgICAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCAiSW5wdXQgZGV2aWNlIFwiIiA8PCBkZXZpY2VUeXBlIDw8ICJcIiBub3QgZm91bmQiOworICAgICAgICB9CiAgICAgfQogICAgIGZvciAoYXV0byBkZXNjIDogbWFuYWdlci5nZXRDb25maWcoKS5nZXRPdXRwdXREZXZpY2VzKCkpIHsKLSAgICAgICAgQVNTRVJUX05FKGF0dGFjaGVkRGV2aWNlcy5lbmQoKSwgYXR0YWNoZWREZXZpY2VzLmZpbmQoZGVzYy0+dHlwZSgpKSk7CisgICAgICAgIGlmIChhdHRhY2hlZERldmljZXMuZmluZChkZXNjLT50eXBlKCkpID09IGF0dGFjaGVkRGV2aWNlcy5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGV2aWNlVHlwZTsKKyAgICAgICAgICAgICh2b2lkKURldmljZUNvbnZlcnRlcjo6dG9TdHJpbmcoZGVzYy0+dHlwZSgpLCBkZXZpY2VUeXBlKTsKKyAgICAgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgIk91dHB1dCBkZXZpY2UgXCIiIDw8IGRldmljZVR5cGUgPDwgIlwiIG5vdCBmb3VuZCI7CisgICAgICAgIH0KICAgICB9CiB9CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwCmluZGV4IGEwMDc0YmMuLmEzZDZkYjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgogCiAjZGVmaW5lIExPR19UQUcgIkFQTV9UZXN0IgogI2luY2x1ZGUgPFNlcmlhbGl6ZXIuaD4KQEAgLTM2LDYgKzM3LDcgQEAKICNpbmNsdWRlICJBdWRpb1BvbGljeVRlc3RNYW5hZ2VyLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgdGVzdGluZzo6VW5vcmRlcmVkRWxlbWVudHNBcmU7CiAKIFRFU1QoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEluaXQsIEVuZ2luZUZhaWx1cmUpIHsKICAgICBBdWRpb1BvbGljeVRlc3RDbGllbnQgY2xpZW50OwpAQCAtNTYsNiArNTgsMzQgQEAKICAgICBBU1NFUlRfRVEoTk9fSU5JVCwgbWFuYWdlci5pbml0Q2hlY2soKSk7CiB9CiAKKy8vIFZlcmlmaWVzIHRoYXQgYSBmYWlsdXJlIHdoaWxlIGxvYWRpbmcgYSBjb25maWcgZG9lc24ndCBsZWF2ZQorLy8gQVBNIGNvbmZpZyBpbiBhICJkaXJ0eSIgc3RhdGUuIFNpbmNlIEF1ZGlvUG9saWN5Q29uZmlnIG9iamVjdAorLy8gaXMgYSBwcm94eSBmb3IgdGhlIGRhdGEgaG9zdGVkIGJ5IEFQTSwgaXQgaXNuJ3QgcG9zc2libGUKKy8vIHRvICJkZWVwIGNvcHkiIGl0LCBhbmQgdGh1cyB3ZSBoYXZlIHRvIHRlc3QgaXRzIGVsZW1lbnRzCisvLyBpbmRpdmlkdWFsbHkuCitURVNUKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RJbml0LCBDb25maWdMb2FkaW5nSXNUcmFuc2FjdGlvbmFsKSB7CisgICAgQXVkaW9Qb2xpY3lUZXN0Q2xpZW50IGNsaWVudDsKKyAgICBBdWRpb1BvbGljeVRlc3RNYW5hZ2VyIG1hbmFnZXIoJmNsaWVudCk7CisgICAgQVNTRVJUX1RSVUUobWFuYWdlci5nZXRDb25maWcoKS5nZXRId01vZHVsZXMoKS5pc0VtcHR5KCkpOworICAgIEFTU0VSVF9UUlVFKG1hbmFnZXIuZ2V0Q29uZmlnKCkuZ2V0SW5wdXREZXZpY2VzKCkuaXNFbXB0eSgpKTsKKyAgICBBU1NFUlRfVFJVRShtYW5hZ2VyLmdldENvbmZpZygpLmdldE91dHB1dERldmljZXMoKS5pc0VtcHR5KCkpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lGaWxlKAorICAgICAgICAgICAgKGJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKSArCisgICAgICAgICAgICAgICAgICAgICIvdGVzdF9pbnZhbGlkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIpLmNfc3RyKCksCisgICAgICAgICAgICAmbWFuYWdlci5nZXRDb25maWcoKSk7CisgICAgQVNTRVJUX05FKE5PX0VSUk9SLCBzdGF0dXMpOworICAgIEVYUEVDVF9UUlVFKG1hbmFnZXIuZ2V0Q29uZmlnKCkuZ2V0SHdNb2R1bGVzKCkuaXNFbXB0eSgpKTsKKyAgICBFWFBFQ1RfVFJVRShtYW5hZ2VyLmdldENvbmZpZygpLmdldElucHV0RGV2aWNlcygpLmlzRW1wdHkoKSk7CisgICAgRVhQRUNUX1RSVUUobWFuYWdlci5nZXRDb25maWcoKS5nZXRPdXRwdXREZXZpY2VzKCkuaXNFbXB0eSgpKTsKKyAgICBzdGF0dXMgPSBkZXNlcmlhbGl6ZUF1ZGlvUG9saWN5RmlsZSgKKyAgICAgICAgICAgIChiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCkgKyAiL3Rlc3RfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIikuY19zdHIoKSwKKyAgICAgICAgICAgICZtYW5hZ2VyLmdldENvbmZpZygpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHN0YXR1cyk7CisgICAgRVhQRUNUX0ZBTFNFKG1hbmFnZXIuZ2V0Q29uZmlnKCkuZ2V0SHdNb2R1bGVzKCkuaXNFbXB0eSgpKTsKKyAgICBFWFBFQ1RfRkFMU0UobWFuYWdlci5nZXRDb25maWcoKS5nZXRJbnB1dERldmljZXMoKS5pc0VtcHR5KCkpOworICAgIEVYUEVDVF9GQUxTRShtYW5hZ2VyLmdldENvbmZpZygpLmdldE91dHB1dERldmljZXMoKS5pc0VtcHR5KCkpOworfQorCiAKIGNsYXNzIFBhdGNoQ291bnRDaGVjayB7CiAgIHB1YmxpYzoKQEAgLTg3LDcgKzExNyw3IEBACiAgICAgdm9pZCBnZXRPdXRwdXRGb3JBdHRyKAogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgIGludCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgaW50IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0ID0gbnVsbHB0ciwKQEAgLTk4LDcgKzEyOCw3IEBACiAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCByaWlkLAogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgIGludCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgaW50IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FLAogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkID0gbnVsbHB0cik7CkBAIC0xNjQsNyArMTk0LDcgQEAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6Z2V0T3V0cHV0Rm9yQXR0cigKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICBpbnQgY2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBpbnQgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCkBAIC0xOTQsNyArMjI0LDcgQEAKICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCwKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICBpbnQgY2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBpbnQgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSB7CkBAIC0zMTcsMTUgKzM0Nyw0NiBAQAogCiAvLyBUT0RPOiBBZGQgcGF0Y2ggY3JlYXRpb24gdGVzdHMgdGhhdCBpbnZvbHZlIGFscmVhZHkgZXhpc3RpbmcgcGF0Y2gKIAotY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0IHsKK2VudW0KK3sKKyAgICBNU0RfQVVESU9fUEFUQ0hfQ09VTlRfTlVNX0FVRElPX1BBVENIRVNfSU5ERVggPSAwLAorICAgIE1TRF9BVURJT19QQVRDSF9DT1VOVF9OQU1FX0lOREVYID0gMQorfTsKK3VzaW5nIE1zZEF1ZGlvUGF0Y2hDb3VudFNwZWNpZmljYXRpb24gPSBzdGQ6OnR1cGxlPHNpemVfdCwgc3RkOjpzdHJpbmc+OworCitjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlclRlc3QsCisgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxNc2RBdWRpb1BhdGNoQ291bnRTcGVjaWZpY2F0aW9uPiB7CisgIHB1YmxpYzoKKyAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkKCk7CiAgIHByb3RlY3RlZDoKICAgICB2b2lkIFNldFVwTWFuYWdlckNvbmZpZygpIG92ZXJyaWRlOwogICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZTsKIAogICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1Nc2RPdXRwdXREZXZpY2U7CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbU1zZElucHV0RGV2aWNlOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1EZWZhdWx0T3V0cHV0RGV2aWNlOworCisgICAgY29uc3Qgc2l6ZV90IG1FeHBlY3RlZEF1ZGlvUGF0Y2hDb3VudDsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtU3BkaWZEZXZpY2U7CisKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtSGRtaUlucHV0RGV2aWNlOwogfTsKIAorQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZDo6QXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCgpCisgICAgOiBtRXhwZWN0ZWRBdWRpb1BhdGNoQ291bnQoc3RkOjpnZXQ8TVNEX0FVRElPX1BBVENIX0NPVU5UX05VTV9BVURJT19QQVRDSEVTX0lOREVYPigKKyAgICAgICAgICAgIEdldFBhcmFtKCkpKSB7fQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUCgKKyAgICAgICAgTXNkQXVkaW9QYXRjaENvdW50LAorICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICBNc2RBdWRpb1BhdGNoQ291bnRTcGVjaWZpY2F0aW9uKDF1LCAic2luZ2xlIiksCisgICAgICAgICAgICAgICAgTXNkQXVkaW9QYXRjaENvdW50U3BlY2lmaWNhdGlvbigydSwgImR1YWwiKQorICAgICAgICApLAorICAgICAgICBbXShjb25zdCA6OnRlc3Rpbmc6OlRlc3RQYXJhbUluZm88TXNkQXVkaW9QYXRjaENvdW50U3BlY2lmaWNhdGlvbj4gJmluZm8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpnZXQ8TVNEX0FVRElPX1BBVENIX0NPVU5UX05BTUVfSU5ERVg+KGluZm8ucGFyYW0pOyB9CispOworCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2Q6OlNldFVwTWFuYWdlckNvbmZpZygpIHsKICAgICAvLyBUT0RPOiBDb25zaWRlciB1c2luZyBTZXJpYWxpemVyIHRvIGxvYWQgcGFydCBvZiB0aGUgY29uZmlnIGZyb20gYSBzdHJpbmcuCiAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6U2V0VXBNYW5hZ2VyQ29uZmlnKCk7CkBAIC0zMzUsOCArMzk2LDExIEBACiAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLCA0ODAwMCk7CiAgICAgc3A8QXVkaW9Qcm9maWxlPiBhYzNPdXRwdXRQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZSgKICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQzMsIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsIDQ4MDAwKTsKKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGllYzk1OE91dHB1dFByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKAorICAgICAgICAgICAgQVVESU9fRk9STUFUX0lFQzYwOTU4LCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sIDQ4MDAwKTsKICAgICBtTXNkT3V0cHV0RGV2aWNlLT5hZGRBdWRpb1Byb2ZpbGUocGNtT3V0cHV0UHJvZmlsZSk7CiAgICAgbU1zZE91dHB1dERldmljZS0+YWRkQXVkaW9Qcm9maWxlKGFjM091dHB1dFByb2ZpbGUpOworICAgIG1Nc2RPdXRwdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShpZWM5NThPdXRwdXRQcm9maWxlKTsKICAgICBtTXNkSW5wdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfSU5fQlVTKTsKICAgICAvLyBNYXRjaCBvdXRwdXQgcHJvZmlsZSBmcm9tIEF1ZGlvUG9saWN5Q29uZmlnOjpzZXREZWZhdWx0LgogICAgIHNwPEF1ZGlvUHJvZmlsZT4gcGNtSW5wdXRQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZSgKQEAgLTM0NSw2ICs0MDksMTkgQEAKICAgICBjb25maWcuYWRkRGV2aWNlKG1Nc2RPdXRwdXREZXZpY2UpOwogICAgIGNvbmZpZy5hZGREZXZpY2UobU1zZElucHV0RGV2aWNlKTsKIAorICAgIGlmIChtRXhwZWN0ZWRBdWRpb1BhdGNoQ291bnQgPT0gMikgeworICAgICAgICAvLyBBZGQgU1BESUYgZGV2aWNlIHdpdGggUENNIG91dHB1dCBwcm9maWxlIGFzIGEgc2Vjb25kIGRldmljZSBmb3IgZHVhbCBNU0QgYXVkaW8gcGF0Y2hpbmcuCisgICAgICAgIG1TcGRpZkRldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKEFVRElPX0RFVklDRV9PVVRfU1BESUYpOworICAgICAgICBtU3BkaWZEZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShwY21PdXRwdXRQcm9maWxlKTsKKyAgICAgICAgY29uZmlnLmFkZERldmljZShtU3BkaWZEZXZpY2UpOworCisgICAgICAgIHNwPE91dHB1dFByb2ZpbGU+IHNwZGlmT3V0cHV0UHJvZmlsZSA9IG5ldyBPdXRwdXRQcm9maWxlKCJzcGRpZiBvdXRwdXQiKTsKKyAgICAgICAgc3BkaWZPdXRwdXRQcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUocGNtT3V0cHV0UHJvZmlsZSk7CisgICAgICAgIHNwZGlmT3V0cHV0UHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKG1TcGRpZkRldmljZSk7CisgICAgICAgIGNvbmZpZy5nZXRId01vZHVsZXMoKS5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSktPgorICAgICAgICAgICAgICAgIGFkZE91dHB1dFByb2ZpbGUoc3BkaWZPdXRwdXRQcm9maWxlKTsKKyAgICB9CisKICAgICBzcDxId01vZHVsZT4gbXNkTW9kdWxlID0gbmV3IEh3TW9kdWxlKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QsIDIgLypoYWxWZXJzaW9uTWFqb3IqLyk7CiAgICAgSHdNb2R1bGVDb2xsZWN0aW9uIG1vZHVsZXMgPSBjb25maWcuZ2V0SHdNb2R1bGVzKCk7CiAgICAgbW9kdWxlcy5hZGQobXNkTW9kdWxlKTsKQEAgLTM2MSw2ICs0MzgsMTEgQEAKICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORyk7CiAgICAgbXNkQ29tcHJlc3NlZE91dHB1dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtTXNkT3V0cHV0RGV2aWNlKTsKICAgICBtc2RNb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUobXNkQ29tcHJlc3NlZE91dHB1dFByb2ZpbGUpOworICAgIHNwPE91dHB1dFByb2ZpbGU+IG1zZEllYzk1OE91dHB1dFByb2ZpbGUgPSBuZXcgT3V0cHV0UHJvZmlsZSgibXNkIGllYzk1OCBpbnB1dCIpOworICAgIG1zZEllYzk1OE91dHB1dFByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZShpZWM5NThPdXRwdXRQcm9maWxlKTsKKyAgICBtc2RJZWM5NThPdXRwdXRQcm9maWxlLT5zZXRGbGFncyhBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIG1zZEllYzk1OE91dHB1dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtTXNkT3V0cHV0RGV2aWNlKTsKKyAgICBtc2RNb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUobXNkSWVjOTU4T3V0cHV0UHJvZmlsZSk7CiAKICAgICBzcDxJbnB1dFByb2ZpbGU+IG1zZElucHV0UHJvZmlsZSA9IG5ldyBJbnB1dFByb2ZpbGUoIm1zZCBvdXRwdXQiKTsKICAgICBtc2RJbnB1dFByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZShwY21JbnB1dFByb2ZpbGUpOwpAQCAtMzc4LDYyICs0NjAsMTA0IEBACiAgICAgcHJpbWFyeUVuY29kZWRPdXRwdXRQcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UoY29uZmlnLmdldERlZmF1bHRPdXRwdXREZXZpY2UoKSk7CiAgICAgY29uZmlnLmdldEh3TW9kdWxlcygpLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKS0+CiAgICAgICAgICAgICBhZGRPdXRwdXRQcm9maWxlKHByaW1hcnlFbmNvZGVkT3V0cHV0UHJvZmlsZSk7CisKKyAgICBtRGVmYXVsdE91dHB1dERldmljZSA9IGNvbmZpZy5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCk7CisgICAgaWYgKG1FeHBlY3RlZEF1ZGlvUGF0Y2hDb3VudCA9PSAyKSB7CisgICAgICAgIG1TcGRpZkRldmljZS0+YWRkQXVkaW9Qcm9maWxlKGR0c091dHB1dFByb2ZpbGUpOworICAgICAgICBwcmltYXJ5RW5jb2RlZE91dHB1dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtU3BkaWZEZXZpY2UpOworICAgIH0KKworICAgIC8vIEFkZCBIRE1JIGlucHV0IGRldmljZSB3aXRoIElFQzYwOTU4IHByb2ZpbGUgZm9yIEhETUkgaW4gLT4gTVNEIHBhdGNoaW5nLgorICAgIG1IZG1pSW5wdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfSU5fSERNSSk7CisgICAgc3A8QXVkaW9Qcm9maWxlPiBpZWM5NThJbnB1dFByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKAorICAgICAgICAgICAgQVVESU9fRk9STUFUX0lFQzYwOTU4LCBBVURJT19DSEFOTkVMX0lOX1NURVJFTywgNDgwMDApOworICAgIG1IZG1pSW5wdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShpZWM5NThJbnB1dFByb2ZpbGUpOworICAgIGNvbmZpZy5hZGREZXZpY2UobUhkbWlJbnB1dERldmljZSk7CisgICAgc3A8SW5wdXRQcm9maWxlPiBoZG1pSW5wdXRQcm9maWxlID0gbmV3IElucHV0UHJvZmlsZSgiaGRtaSBpbnB1dCIpOworICAgIGhkbWlJbnB1dFByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZShpZWM5NThJbnB1dFByb2ZpbGUpOworICAgIGhkbWlJbnB1dFByb2ZpbGUtPnNldEZsYWdzKEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBoZG1pSW5wdXRQcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UobUhkbWlJbnB1dERldmljZSk7CisgICAgY29uZmlnLmdldEh3TW9kdWxlcygpLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKS0+CisgICAgICAgICAgICBhZGRJbnB1dFByb2ZpbGUoaGRtaUlucHV0UHJvZmlsZSk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZDo6VGVhckRvd24oKSB7CiAgICAgbU1zZE91dHB1dERldmljZS5jbGVhcigpOwogICAgIG1Nc2RJbnB1dERldmljZS5jbGVhcigpOworICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlLmNsZWFyKCk7CisgICAgbVNwZGlmRGV2aWNlLmNsZWFyKCk7CisgICAgbUhkbWlJbnB1dERldmljZS5jbGVhcigpOwogICAgIEF1ZGlvUG9saWN5TWFuYWdlclRlc3Q6OlRlYXJEb3duKCk7CiB9CiAKLVRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBJbml0U3VjY2VzcykgeworVEVTVF9QKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEluaXRTdWNjZXNzKSB7CiAgICAgQVNTRVJUX1RSVUUobU1zZE91dHB1dERldmljZSk7CiAgICAgQVNTRVJUX1RSVUUobU1zZElucHV0RGV2aWNlKTsKKyAgICBBU1NFUlRfVFJVRShtRGVmYXVsdE91dHB1dERldmljZSk7CiB9CiAKLVRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBEdW1wKSB7CitURVNUX1AoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgRHVtcCkgewogICAgIGR1bXBUb0xvZygpOwogfQogCi1URVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgUGF0Y2hDcmVhdGlvbk9uU2V0Rm9yY2VVc2UpIHsKK1RFU1RfUChBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBQYXRjaENyZWF0aW9uT25TZXRGb3JjZVVzZSkgewogICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CiAgICAgbU1hbmFnZXItPnNldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCwKICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUyk7Ci0gICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CisgICAgQVNTRVJUX0VRKG1FeHBlY3RlZEF1ZGlvUGF0Y2hDb3VudCwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKIH0KIAotVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEdldE91dHB1dEZvckF0dHJFbmNvZGVkUm91dGVzVG9Nc2QpIHsKK1RFU1RfUChBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBQYXRjaENyZWF0aW9uU2V0UmVsZWFzZU1zZE91dHB1dFBhdGNoZXMpIHsKKyAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOworICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gbU1hbmFnZXItPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKTsKKyAgICAvLyBSZW1vdmUgTVNEIG91dHB1dCBkZXZpY2UgdG8gYXZvaWQgcGF0Y2hpbmcgdG8gaXRzZWxmCisgICAgZGV2aWNlcy5yZW1vdmUobU1zZE91dHB1dERldmljZSk7CisgICAgQVNTRVJUX0VRKG1FeHBlY3RlZEF1ZGlvUGF0Y2hDb3VudCwgZGV2aWNlcy5zaXplKCkpOworICAgIG1NYW5hZ2VyLT5zZXRNc2RPdXRwdXRQYXRjaGVzKCZkZXZpY2VzKTsKKyAgICBBU1NFUlRfRVEobUV4cGVjdGVkQXVkaW9QYXRjaENvdW50LCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworICAgIC8vIER1YWwgcGF0Y2g6IGV4ZXJjaXNlIGNyZWF0aW5nIG9uZSBuZXcgYXVkaW8gcGF0Y2ggYW5kIHJldXNpbmcgYW5vdGhlciBleGlzdGluZyBhdWRpbyBwYXRjaC4KKyAgICBEZXZpY2VWZWN0b3Igc2luZ2xlRGV2aWNlKGRldmljZXNbMF0pOworICAgIG1NYW5hZ2VyLT5yZWxlYXNlTXNkT3V0cHV0UGF0Y2hlcyhzaW5nbGVEZXZpY2UpOworICAgIEFTU0VSVF9FUShtRXhwZWN0ZWRBdWRpb1BhdGNoQ291bnQgLSAxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworICAgIG1NYW5hZ2VyLT5zZXRNc2RPdXRwdXRQYXRjaGVzKCZkZXZpY2VzKTsKKyAgICBBU1NFUlRfRVEobUV4cGVjdGVkQXVkaW9QYXRjaENvdW50LCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworICAgIG1NYW5hZ2VyLT5yZWxlYXNlTXNkT3V0cHV0UGF0Y2hlcyhkZXZpY2VzKTsKKyAgICBBU1NFUlRfRVEoMCwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKK30KKworVEVTVF9QKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEdldE91dHB1dEZvckF0dHJFbmNvZGVkUm91dGVzVG9Nc2QpIHsKICAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQzMsIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsIDQ4MDAwLCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOwotICAgIEFTU0VSVF9FUShzZWxlY3RlZERldmljZUlkLCBtTXNkT3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKLSAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbURlZmF1bHRPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgIEFTU0VSVF9FUShtRXhwZWN0ZWRBdWRpb1BhdGNoQ291bnQsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CiB9CiAKLVRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyUGNtUm91dGVzVG9Nc2QpIHsKK1RFU1RfUChBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyUGNtUm91dGVzVG9Nc2QpIHsKICAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sIDQ4MDAwKTsKLSAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7Ci0gICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CisgICAgQVNTRVJUX0VRKHNlbGVjdGVkRGV2aWNlSWQsIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKKyAgICBBU1NFUlRfRVEobUV4cGVjdGVkQXVkaW9QYXRjaENvdW50LCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOwogfQogCi1URVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgR2V0T3V0cHV0Rm9yQXR0ckVuY29kZWRQbHVzUGNtUm91dGVzVG9Nc2QpIHsKK1RFU1RfUChBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyRW5jb2RlZFBsdXNQY21Sb3V0ZXNUb01zZCkgewogICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7Ci0gICAgQVNTRVJUX0VRKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOwotICAgIEFTU0VSVF9FUSgxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworICAgIEFTU0VSVF9FUShzZWxlY3RlZERldmljZUlkLCBtRGVmYXVsdE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgQVNTRVJUX0VRKG1FeHBlY3RlZEF1ZGlvUGF0Y2hDb3VudCwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywgNDgwMDApOwotICAgIEFTU0VSVF9FUShzZWxlY3RlZERldmljZUlkLCBtTXNkT3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKLSAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbURlZmF1bHRPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgIEFTU0VSVF9FUShtRXhwZWN0ZWRBdWRpb1BhdGNoQ291bnQsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CiB9CiAKLVRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyVW5zdXBwb3J0ZWRGb3JtYXRCeXBhc3Nlc01zZCkgeworVEVTVF9QKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEdldE91dHB1dEZvckF0dHJVbnN1cHBvcnRlZEZvcm1hdEJ5cGFzc2VzTXNkKSB7CiAgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCkBAIC00NDIsNyArNTY2LDcgQEAKICAgICBBU1NFUlRfRVEoMCwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKIH0KIAotVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEdldE91dHB1dEZvckF0dHJGb3JtYXRTd2l0Y2hpbmcpIHsKK1RFU1RfUChBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyRm9ybWF0U3dpdGNoaW5nKSB7CiAgICAgLy8gU3dpdGNoIGJldHdlZW4gZm9ybWF0cyB0aGF0IGFyZSBzdXBwb3J0ZWQgYW5kIG5vdCBzdXBwb3J0ZWQgYnkgTVNELgogICAgIHsKICAgICAgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKQEAgLTQ1MSwxMCArNTc1LDEwIEBACiAgICAgICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCwKICAgICAgICAgICAgICAgICBudWxscHRyIC8qb3V0cHV0Ki8sICZwb3J0SWQpOwotICAgICAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7Ci0gICAgICAgIEFTU0VSVF9FUSgxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworICAgICAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbURlZmF1bHRPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgICAgICBBU1NFUlRfRVEobUV4cGVjdGVkQXVkaW9QYXRjaENvdW50LCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOwogICAgICAgICBtTWFuYWdlci0+cmVsZWFzZU91dHB1dChwb3J0SWQpOwotICAgICAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKG1FeHBlY3RlZEF1ZGlvUGF0Y2hDb3VudCwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKICAgICB9CiAgICAgewogICAgICAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOwpAQCAtNDY0LDcgKzU4OCw3IEBACiAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RUUywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCwKICAgICAgICAgICAgICAgICBudWxscHRyIC8qb3V0cHV0Ki8sICZwb3J0SWQpOwogICAgICAgICBBU1NFUlRfTkUoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7Ci0gICAgICAgIEFTU0VSVF9FUSgtMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKC1zdGF0aWNfY2FzdDxpbnQ+KG1FeHBlY3RlZEF1ZGlvUGF0Y2hDb3VudCksIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CiAgICAgICAgIG1NYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiAgICAgICAgIEFTU0VSVF9FUSgwLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOwogICAgIH0KQEAgLTQ3MywxMSArNTk3LDM5IEBACiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7Ci0gICAgICAgIEFTU0VSVF9FUShzZWxlY3RlZERldmljZUlkLCBtTXNkT3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKHNlbGVjdGVkRGV2aWNlSWQsIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKICAgICAgICAgQVNTRVJUX0VRKDAsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CiAgICAgfQogfQogCitURVNUX1AoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgUGF0Y2hDcmVhdGlvbkZyb21IZG1pSW5Ub01zZCkgeworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgIHVpZF90IHVpZCA9IDQyOworICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CisgICAgQVNTRVJUX0ZBTFNFKG1NYW5hZ2VyLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKS5pc0VtcHR5KCkpOworICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CisgICAgcGF0Y2hCdWlsZGVyLgorICAgICAgICAgICAgYWRkU291cmNlKG1NYW5hZ2VyLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlKEFVRElPX0RFVklDRV9JTl9IRE1JLCBTdHJpbmc4KCIiKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpKS4KKyAgICAgICAgICAgIGFkZFNpbmsobU1hbmFnZXItPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlKEFVRElPX0RFVklDRV9PVVRfQlVTLCBTdHJpbmc4KCIiKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoQnVpbGRlci5wYXRjaCgpLCAmaGFuZGxlLCB1aWQpKTsKKyAgICBBU1NFUlRfTkUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUsIGhhbmRsZSk7CisgICAgQXVkaW9QYXRjaENvbGxlY3Rpb24gcGF0Y2hlcyA9IG1NYW5hZ2VyLT5nZXRBdWRpb1BhdGNoZXMoKTsKKyAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaCA9IHBhdGNoZXMudmFsdWVGb3IoaGFuZGxlKTsKKyAgICBBU1NFUlRfRVEoMSwgcGF0Y2gtPm1QYXRjaC5udW1fc291cmNlcyk7CisgICAgQVNTRVJUX0VRKDEsIHBhdGNoLT5tUGF0Y2gubnVtX3NpbmtzKTsKKyAgICBBU1NFUlRfRVEoQVVESU9fUE9SVF9ST0xFX1NPVVJDRSwgcGF0Y2gtPm1QYXRjaC5zb3VyY2VzWzBdLnJvbGUpOworICAgIEFTU0VSVF9FUShBVURJT19QT1JUX1JPTEVfU0lOSywgcGF0Y2gtPm1QYXRjaC5zaW5rc1swXS5yb2xlKTsKKyAgICBBU1NFUlRfRVEoQVVESU9fRk9STUFUX0lFQzYwOTU4LCBwYXRjaC0+bVBhdGNoLnNvdXJjZXNbMF0uZm9ybWF0KTsKKyAgICBBU1NFUlRfRVEoQVVESU9fRk9STUFUX0lFQzYwOTU4LCBwYXRjaC0+bVBhdGNoLnNpbmtzWzBdLmZvcm1hdCk7CisgICAgQVNTRVJUX0VRKEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPLCBwYXRjaC0+bVBhdGNoLnNvdXJjZXNbMF0uY2hhbm5lbF9tYXNrKTsKKyAgICBBU1NFUlRfRVEoQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLCBwYXRjaC0+bVBhdGNoLnNpbmtzWzBdLmNoYW5uZWxfbWFzayk7CisgICAgQVNTRVJUX0VRKDQ4MDAwLCBwYXRjaC0+bVBhdGNoLnNvdXJjZXNbMF0uc2FtcGxlX3JhdGUpOworICAgIEFTU0VSVF9FUSg0ODAwMCwgcGF0Y2gtPm1QYXRjaC5zaW5rc1swXS5zYW1wbGVfcmF0ZSk7CisgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7Cit9CisKIGNsYXNzIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RXaXRoQ29uZmlndXJhdGlvbkZpbGUgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCB7CiBwcm90ZWN0ZWQ6CiAgICAgdm9pZCBTZXRVcE1hbmFnZXJDb25maWcoKSBvdmVycmlkZTsKQEAgLTcwNyw3ICs4NTksOCBAQAogCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDsKLSAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgc291cmNlLCAwLCAiIn07CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSB7CisgICAgICAgIEFVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBzb3VyY2UsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9OwogICAgIHN0ZDo6c3RyaW5nIHRhZ3MgPSAiYWRkcj0iICsgbU1peEFkZHJlc3M7CiAgICAgc3RybmNweShhdHRyLnRhZ3MsIHRhZ3MuY19zdHIoKSwgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSk7CiAgICAgZ2V0SW5wdXRGb3JBdHRyKGF0dHIsIG1UcmFja2VyLT5nZXRSaWlkKCksICZzZWxlY3RlZERldmljZUlkLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKQEAgLTc1Nyw5ICs5MTAsOSBAQAogICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RFBQbGF5YmFja1JlUm91dGluZywKICAgICAgICAgdGVzdGluZzo6VmFsdWVzKAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLCBBVURJT19VU0FHRV9BTEFSTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9CiAgICAgICAgICAgICAgICAgKQogICAgICAgICApOwogCkBAIC03NjgsNDcgKzkyMSw0NyBAQAogICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RFBQbGF5YmFja1JlUm91dGluZywKICAgICAgICAgdGVzdGluZzo6VmFsdWVzKAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAorICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAorICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkcsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsIEFVRElPX1VTQUdFX0FMQVJNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsIEFVRElPX1VTQUdFX05PVElGSUNBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAorICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAorICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5ULAorICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFLAorICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OLAorICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLCBBVURJT19VU0FHRV9HQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsIEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsIEFVRElPX1VTQUdFX0FTU0lTVEFOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAorICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCwgQVVESU9fVVNBR0VfQVNTSVNUQU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0KKyAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9CiAgICAgICAgICAgICAgICAgKQogICAgICAgICApOwogCkBAIC04MTcsNDEgKzk3MCw0MSBAQAogICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RFBQbGF5YmFja1JlUm91dGluZywKICAgICAgICAgdGVzdGluZzo6VmFsdWVzKAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLCBBVURJT19VU0FHRV9HQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfQVNTSVNUQU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0gsIEFVRElPX1VTQUdFX0FTU0lTVEFOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9CiAgICAgICAgICAgICAgICAgKQogICAgICAgICApOwogCkBAIC04OTIsNyArMTA0NSw4IEBACiAKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UgPSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRTsKLSAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgdXNhZ2UsIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn07CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPQorICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCB1c2FnZSwgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9OwogICAgIHN0ZDo6c3RyaW5nIHRhZ3MgPSBzdGQ6OnN0cmluZygiYWRkcj0iKSArIG1NaXhBZGRyZXNzOwogICAgIHN0cm5jcHkoYXR0ci50YWdzLCB0YWdzLmNfc3RyKCksIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIDEpOwogICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCkBAIC05NDEsMTcgKzEwOTUsMTkgQEAKICAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdERQTWl4UmVjb3JkSW5qZWN0aW9uLAogICAgICAgICB0ZXN0aW5nOjpWYWx1ZXMoCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0NBTUNPUkRFUiwgMCwgIiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9DQU1DT1JERVIsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9DQU1DT1JERVIsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfQ0FNQ09SREVSLCBBVURJT19GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLCBBVURJT19GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsIDAsICIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwgMCwgIiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OLCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwgQVVESU9fRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifQogICAgICAgICAgICAgICAgICkKICAgICAgICAgKTsKQEAgLTk2MiwxNCArMTExOCwxNSBAQAogICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RFBNaXhSZWNvcmRJbmplY3Rpb24sCiAgICAgICAgIHRlc3Rpbmc6OlZhbHVlcygKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04sIDAsICIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04sIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9IT1RXT1JELCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0hPVFdPUkQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04sIEFVRElPX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0hPVFdPUkQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9IT1RXT1JELCBBVURJT19GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9CiAgICAgICAgICAgICAgICAgKQogICAgICAgICApOwogCkBAIC0xMTg4LDMgKzEzNDUsMTA5IEBACiAgICAgRVhQRUNUX0dUKG1DbGllbnQtPmdldEF1ZGlvUG9ydExpc3RVcGRhdGVDb3VudCgpLCBwcmV2QXVkaW9Qb3J0TGlzdFVwZGF0ZUNvdW50KTsKICAgICBFWFBFQ1RfR1QobU1hbmFnZXItPmdldEF1ZGlvUG9ydEdlbmVyYXRpb24oKSwgcHJldkF1ZGlvUG9ydEdlbmVyYXRpb24pOwogfQorCit1c2luZyBEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXRQYXJhbSA9IHN0ZDo6dHVwbGU8YXVkaW9fc291cmNlX3QsIGRldmljZV9yb2xlX3Q+OworCitjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXRUZXN0CisgICAgICAgIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RXaXRoQ29uZmlndXJhdGlvbkZpbGUsCisgICAgICAgICAgcHVibGljIHRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXRQYXJhbT4geworcHJvdGVjdGVkOgorICAgIC8vIFRoZSBgaW5wdXREZXZpY2VgIGFuZCBgaW5wdXREZXZpY2UyYCBpbmRpY2F0ZSB0aGUgYXVkaW8gZGV2aWNlcyB0eXBlIHRvIGJlIHVzZWQgZm9yIHNldHRpbmcKKyAgICAvLyBkZXZpY2Ugcm9sZS4gVGhleSBtdXN0IGJlIGRlY2xhcmVkIGluIHRoZSB0ZXN0X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgaW5wdXREZXZpY2UgPSBBdWRpb0RldmljZVR5cGVBZGRyKEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQywgIiIpOworICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgaW5wdXREZXZpY2UyID0gQXVkaW9EZXZpY2VUeXBlQWRkcihBVURJT19ERVZJQ0VfSU5fSERNSSwgIiIpOworfTsKKworVEVTVF9QKEF1ZGlvUG9saWN5TWFuYWdlckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldFRlc3QsIERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCkgeworICAgIGNvbnN0IGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgY29uc3QgZGV2aWNlX3JvbGVfdCByb2xlID0gc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSk7CisKKyAgICAvLyBUZXN0IGludmFsaWQgZGV2aWNlIHdoZW4gc2V0dGluZworICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgb3V0cHV0RGV2aWNlKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUiwgIiIpOworICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3Igb3V0cHV0RGV2aWNlcyA9IHtvdXRwdXREZXZpY2V9OworICAgIEFTU0VSVF9FUShCQURfVkFMVUUsCisgICAgICAgICAgICAgIG1NYW5hZ2VyLT5zZXREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIG91dHB1dERldmljZXMpKTsKKyAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLAorICAgICAgICAgICAgICBtTWFuYWdlci0+YWRkRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBvdXRwdXREZXZpY2VzKSk7CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzOworICAgIEFTU0VSVF9FUShOQU1FX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcykpOworICAgIEFTU0VSVF9UUlVFKGRldmljZXMuZW1wdHkoKSk7CisgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwKKyAgICAgICAgICAgICAgbU1hbmFnZXItPnJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgb3V0cHV0RGV2aWNlcykpOworCisgICAgLy8gV2l0aG91dCBzZXR0aW5nLCBjYWxsIGdldC9yZW1vdmUvY2xlYXIgbXVzdCBmYWlsCisgICAgQVNTRVJUX0VRKE5BTUVfTk9UX0ZPVU5ELAorICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKSk7CisgICAgQVNTRVJUX0VRKE5BTUVfTk9UX0ZPVU5ELAorICAgICAgICAgICAgICBtTWFuYWdlci0+cmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKSk7CisgICAgQVNTRVJUX0VRKE5BTUVfTk9UX0ZPVU5ELAorICAgICAgICAgICAgICBtTWFuYWdlci0+Y2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUpKTsKKworICAgIC8vIFRlc3Qgc2V0L2dldCBkZXZpY2VzIHJvbGUKKyAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIGlucHV0RGV2aWNlcyA9IHtpbnB1dERldmljZX07CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLAorICAgICAgICAgICAgICBtTWFuYWdlci0+c2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBpbnB1dERldmljZXMpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5nZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpKTsKKyAgICBFWFBFQ1RfVEhBVChkZXZpY2VzLCBVbm9yZGVyZWRFbGVtZW50c0FyZShpbnB1dERldmljZSkpOworCisgICAgLy8gVGVzdCBzZXR0aW5nIHdpbGwgY2hhbmdlIHRoZSBwcmV2aW91c2x5IHNldCBkZXZpY2VzCisgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBpbnB1dERldmljZXMyID0ge2lucHV0RGV2aWNlMn07CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLAorICAgICAgICAgICAgICBtTWFuYWdlci0+c2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBpbnB1dERldmljZXMyKSk7CisgICAgZGV2aWNlcy5jbGVhcigpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcykpOworICAgIEVYUEVDVF9USEFUKGRldmljZXMsIFVub3JkZXJlZEVsZW1lbnRzQXJlKGlucHV0RGV2aWNlMikpOworCisgICAgLy8gVGVzdCBhZGQgZGV2aWNlcworICAgIEFTU0VSVF9FUShOT19FUlJPUiwKKyAgICAgICAgICAgICAgbU1hbmFnZXItPmFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgaW5wdXREZXZpY2VzKSk7CisgICAgZGV2aWNlcy5jbGVhcigpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcykpOworICAgIEVYUEVDVF9USEFUKGRldmljZXMsIFVub3JkZXJlZEVsZW1lbnRzQXJlKGlucHV0RGV2aWNlLCBpbnB1dERldmljZTIpKTsKKworICAgIC8vIFRlc3QgcmVtb3ZlIGRldmljZXMKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsCisgICAgICAgICAgICAgIG1NYW5hZ2VyLT5yZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGlucHV0RGV2aWNlcykpOworICAgIGRldmljZXMuY2xlYXIoKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5nZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpKTsKKyAgICBFWFBFQ1RfVEhBVChkZXZpY2VzLCBVbm9yZGVyZWRFbGVtZW50c0FyZShpbnB1dERldmljZTIpKTsKKworICAgIC8vIFRlc3QgcmVtb3ZlIGRldmljZXMgdGhhdCBhcmUgbm90IHNldCBhcyB0aGUgZGV2aWNlIHJvbGUKKyAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLAorICAgICAgICAgICAgICBtTWFuYWdlci0+cmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBpbnB1dERldmljZXMpKTsKKworICAgIC8vIFRlc3QgY2xlYXIgZGV2aWNlcworICAgIEFTU0VSVF9FUShOT19FUlJPUiwKKyAgICAgICAgICAgICAgbU1hbmFnZXItPmNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlKSk7CisgICAgZGV2aWNlcy5jbGVhcigpOworICAgIEFTU0VSVF9FUShOQU1FX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcykpOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUCgKKyAgICAgICAgRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0T3BlcmF0aW9uLAorICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXRUZXN0LAorICAgICAgICB0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0UGFyYW0oe0FVRElPX1NPVVJDRV9NSUMsIERFVklDRV9ST0xFX1BSRUZFUlJFRH0pLAorICAgICAgICAgICAgICAgIERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldFBhcmFtKHtBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVZJQ0VfUk9MRV9QUkVGRVJSRUR9KSwKKyAgICAgICAgICAgICAgICBEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXRQYXJhbSh7QVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVZJQ0VfUk9MRV9QUkVGRVJSRUR9KSwKKyAgICAgICAgICAgICAgICBEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXRQYXJhbSh7QVVESU9fU09VUkNFX1ZPSUNFX0NBTEwsIERFVklDRV9ST0xFX1BSRUZFUlJFRH0pLAorICAgICAgICAgICAgICAgIERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldFBhcmFtKHtBVURJT19TT1VSQ0VfQ0FNQ09SREVSLCBERVZJQ0VfUk9MRV9QUkVGRVJSRUR9KSwKKyAgICAgICAgICAgICAgICBEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXRQYXJhbSh7QVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVZJQ0VfUk9MRV9QUkVGRVJSRUR9KSwKKyAgICAgICAgICAgICAgICBEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXRQYXJhbSh7QVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFVklDRV9ST0xFX1BSRUZFUlJFRH0pLAorICAgICAgICAgICAgICAgIERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldFBhcmFtKHtBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVWSUNFX1JPTEVfUFJFRkVSUkVEfSksCisgICAgICAgICAgICAgICAgRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0UGFyYW0oe0FVRElPX1NPVVJDRV9VTlBST0NFU1NFRCwgREVWSUNFX1JPTEVfUFJFRkVSUkVEfSksCisgICAgICAgICAgICAgICAgRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0UGFyYW0oe0FVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVWSUNFX1JPTEVfUFJFRkVSUkVEfSksCisgICAgICAgICAgICAgICAgRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0UGFyYW0oe0FVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVWSUNFX1JPTEVfUFJFRkVSUkVEfSksCisgICAgICAgICAgICAgICAgRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0UGFyYW0oe0FVRElPX1NPVVJDRV9GTV9UVU5FUiwgREVWSUNFX1JPTEVfUFJFRkVSUkVEfSksCisgICAgICAgICAgICAgICAgRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0UGFyYW0oe0FVRElPX1NPVVJDRV9IT1RXT1JELCBERVZJQ0VfUk9MRV9QUkVGRVJSRUR9KQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvcmVzb3VyY2VzL0FuZHJvaWQuYnAKaW5kZXggZDk0NzZkOS4uNjMwYmJjZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvcmVzb3VyY2VzL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvcmVzb3VyY2VzL0FuZHJvaWQuYnAKQEAgLTEsOCArMSwyMCBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1NSVQKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLVVuaWNvZGUtREZTCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBmaWxlZ3JvdXAgewogICAgIG5hbWU6ICJhdWRpb3BvbGljeXRlc3RfY29uZmlndXJhdGlvbl9maWxlcyIsCiAgICAgc3JjczogWwogICAgICAgICAidGVzdF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLAogICAgICAgICAidGVzdF9hdWRpb19wb2xpY3lfcHJpbWFyeV9vbmx5X2NvbmZpZ3VyYXRpb24ueG1sIiwKKyAgICAgICAgInRlc3RfaW52YWxpZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLAogICAgICAgICAidGVzdF90dl9hcG1fY29uZmlndXJhdGlvbi54bWwiLAogICAgIF0sCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9yZXNvdXJjZXMvdGVzdF9pbnZhbGlkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy90ZXN0X2ludmFsaWRfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NjQxZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9yZXNvdXJjZXMvdGVzdF9pbnZhbGlkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtMCwwICsxLDExMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRoaXMgZmlsZSBjb250YWlucyBhbiB1bm5hbWVkIGRldmljZSBwb3J0IGluIHRoZSAicl9zdWJtaXgiIG1vZHVsZSBzZWN0aW9uLiAtLT4KKzxhdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24gdmVyc2lvbj0iMS4wIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisgICAgPGdsb2JhbENvbmZpZ3VyYXRpb24gc3BlYWtlcl9kcmNfZW5hYmxlZD0idHJ1ZSIvPgorCisgICAgPG1vZHVsZXM+CisgICAgICAgIDwhLS0gUHJpbWFyeSBtb2R1bGUgLS0+CisgICAgICAgIDxtb2R1bGUgbmFtZT0icHJpbWFyeSIgaGFsVmVyc2lvbj0iMi4wIj4KKyAgICAgICAgICAgIDxhdHRhY2hlZERldmljZXM+CisgICAgICAgICAgICAgICAgPGl0ZW0+U3BlYWtlcjwvaXRlbT4KKyAgICAgICAgICAgICAgICA8aXRlbT5CdWlsdC1JbiBNaWM8L2l0ZW0+CisgICAgICAgICAgICA8L2F0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgICAgIDxkZWZhdWx0T3V0cHV0RGV2aWNlPlNwZWFrZXI8L2RlZmF1bHRPdXRwdXREZXZpY2U+CisgICAgICAgICAgICA8bWl4UG9ydHM+CisgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0icHJpbWFyeSBvdXRwdXQiIHJvbGU9InNvdXJjZSIgZmxhZ3M9IkFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJwcmltYXJ5IGlucHV0IiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX1NURVJFTyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJtaXhwb3J0X2J0X2hmcF9vdXRwdXQiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9Im1peHBvcnRfYnRfaGZwX2lucHV0IiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwLDExMDI1LDE2MDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPLEFVRElPX0NIQU5ORUxfSU5fTU9OTyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgIDwvbWl4UG9ydHM+CisgICAgICAgICAgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iU3BlYWtlciIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9TUEVBS0VSIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQnVpbHQtSW4gTWljIiB0eXBlPSJBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkhkbWkiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfSERNSSIgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkhkbWktSW4gTWljIiB0eXBlPSJBVURJT19ERVZJQ0VfSU5fSERNSSIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgU0NPIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT0ic2luayIgYWRkcmVzcz0iaGZwX2NsaWVudF9vdXQiPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBTQ08gSGVhZHNldCBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT0ic291cmNlIiBhZGRyZXNzPSJoZnBfY2xpZW50X2luIj4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICA8L2RldmljZVBvcnRzPgorICAgICAgICAgICAgPHJvdXRlcz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJTcGVha2VyIgorICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJwcmltYXJ5IG91dHB1dCIvPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9InByaW1hcnkgaW5wdXQiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9IkJ1aWx0LUluIE1pYyxIZG1pLUluIE1pYyIvPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkhkbWkiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9InByaW1hcnkgb3V0cHV0Ii8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgU0NPIgorICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJtaXhwb3J0X2J0X2hmcF9vdXRwdXQiLz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJtaXhwb3J0X2J0X2hmcF9pbnB1dCIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0iQlQgU0NPIEhlYWRzZXQgTWljIi8+CisgICAgICAgICAgICA8L3JvdXRlcz4KKyAgICAgICAgPC9tb2R1bGU+CisKKyAgICAgICAgPCEtLSBSZW1vdGUgU3VibWl4IG1vZHVsZSAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJyX3N1Ym1peCIgaGFsVmVyc2lvbj0iMi4wIj4KKyAgICAgICAgICAgIDxhdHRhY2hlZERldmljZXM+CisgICAgICAgICAgICAgICAgPGl0ZW0+UmVtb3RlIFN1Ym1peCBJbjwvaXRlbT4KKyAgICAgICAgICAgIDwvYXR0YWNoZWREZXZpY2VzPgorICAgICAgICAgICAgPG1peFBvcnRzPgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9InJfc3VibWl4IG91dHB1dCIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgICAgICAgICA8L21peFBvcnQ+CisgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0icl9zdWJtaXggaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX1NURVJFTyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgPC9taXhQb3J0cz4KKyAgICAgICAgICAgPGRldmljZVBvcnRzPgorICAgICAgICAgICAgICAgPCEtLSBUaGlzIHBvcnQgaXMgbWlzc2luZyAidGFnTmFtZSIgYXR0cmlidXRlLiAtLT4KKyAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHR5cGU9IkFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCIgIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IlJlbW90ZSBTdWJtaXggSW4iIHR5cGU9IkFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYIiAgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICA8L2RldmljZVBvcnRzPgorICAgICAgICAgICAgPHJvdXRlcz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJSZW1vdGUgU3VibWl4IE91dCIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0icl9zdWJtaXggb3V0cHV0Ii8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0icl9zdWJtaXggaW5wdXQiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9IlJlbW90ZSBTdWJtaXggSW4iLz4KKyAgICAgICAgICAgIDwvcm91dGVzPgorICAgICAgICA8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+Cis8L2F1ZGlvUG9saWN5Q29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLmJwCmluZGV4IDUwMWQ5MjIuLmQxNmVhMWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5icApAQCAtMTYsNiArMTYsMjUgQEAKIC8vIGxpYmNhbWVyYXNlcnZpY2UKIC8vCiAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9zZXJ2aWNlc19jYW1lcmFfbGliY2FtZXJhc2VydmljZV9saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9zZXJ2aWNlc19jYW1lcmFfbGliY2FtZXJhc2VydmljZV9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmNhbWVyYXNlcnZpY2UiLAogCkBAIC05NCw2ICsxMTMsOCBAQAogICAgICAgICAibGlidXRpbHNjYWxsc3RhY2siLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmFjdGl2aXR5bWFuYWdlcl9haWRsIiwKKyAgICAgICAgImxpYnBlcm1pc3Npb24iLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLApAQCAtMTMxLDExICsxNTIsMTQgQEAKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnByb2Nlc3NpbmZvc2VydmljZV9haWRsIiwKICAgICAgICAgImxpYmJpbmRlcnRocmVhZHN0YXRldXRpbHMiLAogICAgIF0sCiAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliYWN0aXZpdHltYW5hZ2VyX2FpZGwiLAorICAgICAgICAibGlicGVybWlzc2lvbiIsCiAgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKICAgICAgICAgImxpYmZtcSIsCiAgICAgICAgICJsaWJzZW5zb3Jwcml2YWN5IiwKQEAgLTE1OSw0ICsxODMsMyBAQAogICAgIF0sCiAKIH0KLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAppbmRleCBlMmZjYjVhLi45MWRkYTkyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcApAQCAtNDEsNyArNDEsNiBAQAogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25Db250cm9sbGVyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NJbmZvU2VydmljZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JUmVzdWx0UmVjZWl2ZXIuaD4KICNpbmNsdWRlIDxiaW5kZXJ0aHJlYWRzdGF0ZS9DYWxsZXJVdGlscy5oPgogI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KQEAgLTU3LDYgKzU2LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaD4KKyNpbmNsdWRlIDxwcm9jZXNzaW5mby9Qcm9jZXNzSW5mb1NlcnZpY2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgpAQCAtODE0LDcgKzgxNCw3IEBACiAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjptYWtlQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxJSW50ZXJmYWNlPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSwKLSAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgZmVhdHVyZUlkLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50IGFwaTFDYW1lcmFJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGZlYXR1cmVJZCwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgIGludCBmYWNpbmcsIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsIGludCBoYWxWZXJzaW9uLAogICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbiwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsCiAgICAgICAgIC8qb3V0Ki9zcDxCYXNpY0NsaWVudD4qIGNsaWVudCkgewpAQCAtOTcwLDcgKzk3MCw3IEBACiAgICAgaWYgKCEocmV0ID0gY29ubmVjdEhlbHBlcjxJQ2FtZXJhQ2xpZW50LENsaWVudD4oCiAgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PntudWxscHRyfSwgaWQsIGNhbWVyYUlkLAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVEKSwKLSAgICAgICAgICAgIGludGVybmFsUGFja2FnZU5hbWUsIHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4oKSwgdWlkLCBVU0VfQ0FMTElOR19QSUQsCisgICAgICAgICAgICBpbnRlcm5hbFBhY2thZ2VOYW1lLCB7fSwgdWlkLCBVU0VfQ0FMTElOR19QSUQsCiAgICAgICAgICAgICBBUElfMSwgLypzaGltVXBkYXRlT25seSovIHRydWUsIC8qb3V0Ki8gdG1wKQogICAgICAgICAgICAgKS5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBpbml0aWFsaXppbmcgc2hpbSBtZXRhZGF0YTogJXMiLCBfX0ZVTkNUSU9OX18sIHJldC50b1N0cmluZzgoKS5zdHJpbmcoKSk7CkBAIC0xNDg4LDcgKzE0ODgsNyBAQAogICAgIFN0cmluZzggaWQgPSBjYW1lcmFJZEludFRvU3RyKGFwaTFDYW1lcmFJZCk7CiAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBudWxscHRyOwogICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KGNhbWVyYUNsaWVudCwgaWQsIGFwaTFDYW1lcmFJZCwKLSAgICAgICAgICAgIENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQsIGNsaWVudFBhY2thZ2VOYW1lLCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+KCksCisgICAgICAgICAgICBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVELCBjbGllbnRQYWNrYWdlTmFtZSwge30sCiAgICAgICAgICAgICBjbGllbnRVaWQsIGNsaWVudFBpZCwgQVBJXzEsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwgLypvdXQqL2NsaWVudCk7CiAKICAgICBpZighcmV0LmlzT2soKSkgewpAQCAtMTUxNSw3ICsxNTE1LDcgQEAKICAgICBTdGF0dXMgcmV0ID0gU3RhdHVzOjpvaygpOwogICAgIHNwPENsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKICAgICByZXQgPSBjb25uZWN0SGVscGVyPElDYW1lcmFDbGllbnQsQ2xpZW50PihjYW1lcmFDbGllbnQsIGlkLCBhcGkxQ2FtZXJhSWQsIGhhbFZlcnNpb24sCi0gICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PigpLCBjbGllbnRVaWQsIFVTRV9DQUxMSU5HX1BJRCwgQVBJXzEsCisgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwge30sIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMSwKICAgICAgICAgICAgIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwgLypvdXQqL2NsaWVudCk7CiAKICAgICBpZighcmV0LmlzT2soKSkgewpAQCAtMTU5MCw3ICsxNTkwLDcgQEAKICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+JiBjYW1lcmFDYiwKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgaW50IGNsaWVudFVpZCwKICAgICAgICAgLypvdXQqLwogICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI+KiBkZXZpY2UpIHsKQEAgLTE2MjQsNyArMTYyNCw3IEBACiB0ZW1wbGF0ZTxjbGFzcyBDQUxMQkFDSywgY2xhc3MgQ0xJRU5UPgogU3RhdHVzIENhbWVyYVNlcnZpY2U6OmNvbm5lY3RIZWxwZXIoY29uc3Qgc3A8Q0FMTEJBQ0s+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBoYWxWZXJzaW9uLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwgaW50IGNsaWVudFVpZCwgaW50IGNsaWVudFBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwgaW50IGNsaWVudFVpZCwgaW50IGNsaWVudFBpZCwKICAgICAgICAgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgc2hpbVVwZGF0ZU9ubHksCiAgICAgICAgIC8qb3V0Ki9zcDxDTElFTlQ+JiBkZXZpY2UpIHsKICAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKQEAgLTI3MzksNyArMjczOSw3IEBACiBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OkNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkU3RyLAogICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsCkBAIC0yNzc2LDI0ICsyNzc2LDE4IEBACiAKIENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpCYXNpY0NsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIHJlbW90ZUNhbGxiYWNrLAotICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZFN0ciwgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICBpbnQgc2VydmljZVBpZCk6CiAgICAgICAgIG1DYW1lcmFJZFN0cihjYW1lcmFJZFN0ciksIG1DYW1lcmFGYWNpbmcoY2FtZXJhRmFjaW5nKSwKLSAgICAgICAgbUNsaWVudFBhY2thZ2VOYW1lKGNsaWVudFBhY2thZ2VOYW1lKSwKKyAgICAgICAgbUNsaWVudFBhY2thZ2VOYW1lKGNsaWVudFBhY2thZ2VOYW1lKSwgbUNsaWVudEZlYXR1cmVJZChjbGllbnRGZWF0dXJlSWQpLAogICAgICAgICBtQ2xpZW50UGlkKGNsaWVudFBpZCksIG1DbGllbnRVaWQoY2xpZW50VWlkKSwKICAgICAgICAgbVNlcnZpY2VQaWQoc2VydmljZVBpZCksCiAgICAgICAgIG1EaXNjb25uZWN0ZWQoZmFsc2UpLCBtVWlkSXNUcnVzdGVkKGZhbHNlKSwKICAgICAgICAgbUF1ZGlvUmVzdHJpY3Rpb24oaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpBVURJT19SRVNUUklDVElPTl9OT05FKSwKICAgICAgICAgbVJlbW90ZUJpbmRlcihyZW1vdGVDYWxsYmFjaykKIHsKLSAgICBpZiAoY2xpZW50RmVhdHVyZUlkKSB7Ci0gICAgICAgIG1DbGllbnRGZWF0dXJlSWQgPSBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+KG5ldyBTdHJpbmcxNigqY2xpZW50RmVhdHVyZUlkKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUNsaWVudEZlYXR1cmVJZCA9IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4oKTsKLSAgICB9Ci0KICAgICBpZiAoc0NhbWVyYVNlcnZpY2UgPT0gbnVsbHB0cikgewogICAgICAgICBzQ2FtZXJhU2VydmljZSA9IGNhbWVyYVNlcnZpY2U7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCmluZGV4IDVjNGM5NmIuLjI4NTNiMGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKQEAgLTUyLDYgKzUyLDcgQEAKICNpbmNsdWRlIDxsaXN0PgogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgogI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CkBAIC0xNDIsNyArMTQzLDcgQEAKIAogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICAgIGNvbm5lY3REZXZpY2UoCiAgICAgICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsCi0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgIGludDMyX3QgY2xpZW50VWlkLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyPiogZGV2aWNlKTsKQEAgLTI5OSw3ICszMDAsNyBAQAogICAgICAgICBCYXNpY0NsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgcmVtb3RlQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkU3RyLAogICAgICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKQEAgLTMxOSw3ICszMjAsNyBAQAogICAgICAgICBjb25zdCBTdHJpbmc4ICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0cjsKICAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhRmFjaW5nOwogICAgICAgICBTdHJpbmcxNiAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZTsKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiAgICAgICBtQ2xpZW50RmVhdHVyZUlkOworICAgICAgICBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiAgICAgICAgIG1DbGllbnRGZWF0dXJlSWQ7CiAgICAgICAgIHBpZF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFBpZDsKICAgICAgICAgY29uc3QgdWlkX3QgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50VWlkOwogICAgICAgICBjb25zdCBwaWRfdCAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlUGlkOwpAQCAtMzkxLDcgKzM5Miw3IEBACiAgICAgICAgIENsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWRTdHIsCiAgICAgICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLApAQCAtNzI5LDcgKzczMCw3IEBACiAgICAgdGVtcGxhdGU8Y2xhc3MgQ0FMTEJBQ0ssIGNsYXNzIENMSUVOVD4KICAgICBiaW5kZXI6OlN0YXR1cyBjb25uZWN0SGVscGVyKGNvbnN0IHNwPENBTExCQUNLPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGhhbFZlcnNpb24sIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwgaW50IGNsaWVudFVpZCwgaW50IGNsaWVudFBpZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsIGludCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQsCiAgICAgICAgICAgICBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBzaGltVXBkYXRlT25seSwgLypvdXQqL3NwPENMSUVOVD4mIGRldmljZSk7CiAKICAgICAvLyBMb2NrIGd1YXJkaW5nIGNhbWVyYSBzZXJ2aWNlIHN0YXRlCkBAIC0xMDY0LDcgKzEwNjUsNyBAQAogCiAgICAgc3RhdGljIGJpbmRlcjo6U3RhdHVzIG1ha2VDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBzcDxJSW50ZXJmYWNlPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGZlYXR1cmVJZCwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludCBhcGkxQ2FtZXJhSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgZmVhdHVyZUlkLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50IGFwaTFDYW1lcmFJZCwKICAgICAgICAgICAgIGludCBmYWNpbmcsIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsIGludCBoYWxWZXJzaW9uLAogICAgICAgICAgICAgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAogICAgICAgICAgICAgLypvdXQqL3NwPEJhc2ljQ2xpZW50PiogY2xpZW50KTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCmluZGV4IGIwNDNjMGIuLjA5ZTJjM2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcApAQCAtNTAsNyArNTAsNyBAQAogQ2FtZXJhMkNsaWVudDo6Q2FtZXJhMkNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFEZXZpY2VJZCwKICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKaW5kZXggMDNjYTQ0YS4uZjhkYTBiNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKQEAgLTk0LDcgKzk0LDcgQEAKICAgICBDYW1lcmEyQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhRGV2aWNlSWQsCiAgICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLAogICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAppbmRleCA4OTI5OTZjLi5iODYwY2ViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCkBAIC0zNCw3ICszNCw3IEBACiAKIENhbWVyYUNsaWVudDo6Q2FtZXJhQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKLSAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICBpbnQgY2xpZW50UGlkLCBpbnQgY2xpZW50VWlkLAogICAgICAgICBpbnQgc2VydmljZVBpZCk6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaAppbmRleCBhN2ViOTYwLi5hYWNiMDBlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKQEAgLTY4LDcgKzY4LDcgQEAKICAgICBDYW1lcmFDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgICAgICBpbnQgY2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAppbmRleCBlMzViNDM2Li4wMjJkNjg2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCkBAIC01NCw3ICs1NCw3IEBACiAgICAgICAgIGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCkBAIC04MCw3ICs4MCw3IEBACiBDYW1lcmFEZXZpY2VDbGllbnQ6OkNhbWVyYURldmljZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICBpbnQgY2xpZW50UGlkLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKaW5kZXggOWQzODc0Zi4uNWNkMTZlZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCkBAIC01MCw3ICs1MCw3IEBACiAgICAgQ2FtZXJhRGV2aWNlQ2xpZW50QmFzZShjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCiAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLAogICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKQEAgLTE3NSw3ICsxNzUsNyBAQAogICAgIENhbWVyYURldmljZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCiAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQuaAppbmRleCBiNjdmY2IzLi4wMzYyMWM4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudC5oCkBAIC00OCw3ICs0OCw3IEBACiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxzcDxJQmluZGVyPiwgc3A8Q29tcG9zaXRlU3RyZWFtPj4mIG9mZmxpbmVDb21wb3NpdGVTdHJlYW1NYXAsCiAgICAgICAgICAgICBjb25zdCBzcDxJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCiAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWRTdHIsIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgICAgICBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsIGludCBzZXJ2aWNlUGlkKSA6CiAgICAgICAgICAgICBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudCgKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCmluZGV4IDBhNDE3NzYuLjYwOTY5OGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcApAQCAtNDQsNyArNDQsNyBAQAogICAgICAgICBjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8VENhbUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCmluZGV4IDA0MmY1YWEuLmQ3NTA2YWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCkBAIC00OCw3ICs0OCw3IEBACiAgICAgQ2FtZXJhMkNsaWVudEJhc2UoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8VENhbUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcAppbmRleCBkNWYxMzZiLi5lYTZkNTllIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKQEAgLTQ2NzUsMTUgKzQ2NzUsMjEgQEAKICAgICAgICAgfQogICAgICAgICBib29sIGlzU3RpbGxDYXB0dXJlID0gZmFsc2U7CiAgICAgICAgIGJvb2wgaXNac2xDYXB0dXJlID0gZmFsc2U7CisgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiBzZXR0aW5ncyA9IGhhbFJlcXVlc3QtPnNldHRpbmdzOworICAgICAgICBib29sIHNob3VsZFVubG9ja1NldHRpbmdzID0gZmFsc2U7CisgICAgICAgIGlmIChzZXR0aW5ncyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBzaG91bGRVbmxvY2tTZXR0aW5ncyA9IHRydWU7CisgICAgICAgICAgICBzZXR0aW5ncyA9IGNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhLmdldEFuZExvY2soKTsKKyAgICAgICAgfQogICAgICAgICBpZiAoIW1OZXh0UmVxdWVzdHNbMF0uY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlID0gY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QoKTsKLSAgICAgICAgICAgIGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KGhhbFJlcXVlc3QtPnNldHRpbmdzLCBBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQsICZlKTsKKyAgICAgICAgICAgIGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KHNldHRpbmdzLCBBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQsICZlKTsKICAgICAgICAgICAgIGlmICgoZS5jb3VudCA+IDApICYmIChlLmRhdGEudThbMF0gPT0gQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UX1NUSUxMX0NBUFRVUkUpKSB7CiAgICAgICAgICAgICAgICAgaXNTdGlsbENhcHR1cmUgPSB0cnVlOwogICAgICAgICAgICAgICAgIEFUUkFDRV9BU1lOQ19CRUdJTigic3RpbGwgY2FwdHVyZSIsIG1OZXh0UmVxdWVzdHNbaV0uaGFsUmVxdWVzdC5mcmFtZV9udW1iZXIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmaW5kX2NhbWVyYV9tZXRhZGF0YV9yb19lbnRyeShoYWxSZXF1ZXN0LT5zZXR0aW5ncywgQU5EUk9JRF9DT05UUk9MX0VOQUJMRV9aU0wsICZlKTsKKyAgICAgICAgICAgIGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KHNldHRpbmdzLCBBTkRST0lEX0NPTlRST0xfRU5BQkxFX1pTTCwgJmUpOwogICAgICAgICAgICAgaWYgKChlLmNvdW50ID4gMCkgJiYgKGUuZGF0YS51OFswXSA9PSBBTkRST0lEX0NPTlRST0xfRU5BQkxFX1pTTF9UUlVFKSkgewogICAgICAgICAgICAgICAgIGlzWnNsQ2FwdHVyZSA9IHRydWU7CiAgICAgICAgICAgICB9CkBAIC00NjkyLDcgKzQ2OTgsNyBAQAogICAgICAgICAgICAgICAgIHRvdGFsTnVtQnVmZmVycywgY2FwdHVyZVJlcXVlc3QtPm1SZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgLypoYXNJbnB1dCovaGFsUmVxdWVzdC0+aW5wdXRfYnVmZmVyICE9IE5VTEwsCiAgICAgICAgICAgICAgICAgaGFzQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgY2FsY3VsYXRlTWF4RXhwZWN0ZWREdXJhdGlvbihoYWxSZXF1ZXN0LT5zZXR0aW5ncyksCisgICAgICAgICAgICAgICAgY2FsY3VsYXRlTWF4RXhwZWN0ZWREdXJhdGlvbihzZXR0aW5ncyksCiAgICAgICAgICAgICAgICAgcmVxdWVzdGVkUGh5c2ljYWxDYW1lcmFzLCBpc1N0aWxsQ2FwdHVyZSwgaXNac2xDYXB0dXJlLAogICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tUm90YXRlQW5kQ3JvcEF1dG8sIG1QcmV2Q2FtZXJhSWRzV2l0aFpvb20sCiAgICAgICAgICAgICAgICAgKG1Vc2VIYWxCdWZNYW5hZ2VyKSA/IHVuaXF1ZVN1cmZhY2VJZE1hcCA6CkBAIC00NzAyLDYgKzQ3MDgsMTEgQEAKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1SZXN1bHRFeHRyYXMucmVxdWVzdElkLCBjYXB0dXJlUmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwKICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5idXJzdElkKTsKKworICAgICAgICBpZiAoc2hvdWxkVW5sb2NrU2V0dGluZ3MpIHsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhLnVubG9jayhzZXR0aW5ncyk7CisgICAgICAgIH0KKwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gcmVnaXN0ZXIgbmV3IGluLWZsaWdodCByZXF1ZXN0OiIKICAgICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOWEwM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDU1IEBACisvLyBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9zZXJ2aWNlc19jYW1lcmFfbGliY2FtZXJhc2VydmljZV9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfc2VydmljZXNfY2FtZXJhX2xpYmNhbWVyYXNlcnZpY2VfbGljZW5zZSIsCisgICAgXSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjYW1lcmFzZXJ2aWNlX2Z1enpfZGVmYXVsdHMiLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNvbXBvbmVudGlkOiA0MTcyNworICAgIH0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJsaWJjYW1lcmFzZXJ2aWNlX2Rpc3RvcnRpb25fbWFwcGVyX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsibGliY2FtZXJhc2VydmljZV9mdXp6X2RlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiRGlzdG9ydGlvbk1hcHBlckZ1enplci5jcHAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNhbWVyYXNlcnZpY2UiLAorICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImxpYmNhbWVyYXNlcnZpY2VfZGVwdGhfcHJvY2Vzc29yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsibGliY2FtZXJhc2VydmljZV9mdXp6X2RlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiRGVwdGhQcm9jZXNzb3JGdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjYW1lcmFzZXJ2aWNlIiwKKyAgICBdLAorICAgIGNvcnB1czogWyJjb3JwdXMvKi5qcGciXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9EZXB0aFByb2Nlc3NvckZ1enplci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvRGVwdGhQcm9jZXNzb3JGdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MGNhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvRGVwdGhQcm9jZXNzb3JGdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorCisjaW5jbHVkZSAiY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrVGVzdEJ1ZmZlcldpZHRoID0gNjQwOworc3RhdGljIGNvbnN0IHNpemVfdCBrVGVzdEJ1ZmZlckhlaWdodCA9IDQ4MDsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1Rlc3RCdWZmZXJEZXB0aFNpemUgKGtUZXN0QnVmZmVyV2lkdGggKiBrVGVzdEJ1ZmZlckhlaWdodCk7CisKK3ZvaWQgZ2VuZXJhdGVEZXB0aDE2QnVmZmVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplLCBzdGQ6OmFycmF5PHVpbnQxNl90LCBrVGVzdEJ1ZmZlckRlcHRoU2l6ZT4gKmRlcHRoMTZCdWZmZXIgLypvdXQqLykgeworICAgIEZ1enplZERhdGFQcm92aWRlciBkYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXB0aDE2QnVmZmVyLT5zaXplKCk7IGkrKykgeworICAgICAgICAoKmRlcHRoMTZCdWZmZXIpW2ldID0gZGF0YVByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lOworICAgIC8vIFdvcnN0IGNhc2UgYm90aCBkZXB0aCBhbmQgY29uZmlkZW5jZSBtYXBzIGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgbWFpbiBjb2xvciBpbWFnZS4KKyAgICBpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSA9IGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSAqIDM7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkZXB0aFBob3RvQnVmZmVyKGlucHV0RnJhbWUubU1heEpwZWdTaXplKTsKKyAgICBzaXplX3QgYWN0dWFsRGVwdGhQaG90b1NpemUgPSAwOworCisgICAgc3RkOjphcnJheTx1aW50MTZfdCwga1Rlc3RCdWZmZXJEZXB0aFNpemU+IGRlcHRoMTZCdWZmZXI7CisgICAgZ2VuZXJhdGVEZXB0aDE2QnVmZmVyKGRhdGEsIHNpemUsICZkZXB0aDE2QnVmZmVyKTsKKworICAgIGlucHV0RnJhbWUubU1haW5KcGVnQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4gKGRhdGEpOworICAgIGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSA9IHNpemU7CisgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXIgPSBkZXB0aDE2QnVmZmVyLmRhdGEoKTsKKyAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcFN0cmlkZSA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aCA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICBwcm9jZXNzRGVwdGhQaG90b0ZyYW1lKAorICAgICAgICBpbnB1dEZyYW1lLAorICAgICAgICBkZXB0aFBob3RvQnVmZmVyLnNpemUoKSwKKyAgICAgICAgZGVwdGhQaG90b0J1ZmZlci5kYXRhKCksCisgICAgICAgICZhY3R1YWxEZXB0aFBob3RvU2l6ZSk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvRGlzdG9ydGlvbk1hcHBlckZ1enplci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvRGlzdG9ydGlvbk1hcHBlckZ1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZiYWI0ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9EaXN0b3J0aW9uTWFwcGVyRnV6emVyLmNwcApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KKworI2luY2x1ZGUgImRldmljZTMvRGlzdG9ydGlvbk1hcHBlci5oIgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjYW1lcmEzOworCitpbnQzMl90IHRlc3RBY3RpdmVBcnJheVtdID0gezEwMCwgMTAwLCAxMDAwLCA3NTB9OworZmxvYXQgdGVzdElDYWxbXSA9IHsgMTAwMC5mLCAxMDAwLmYsIDUwMC5mLCA1MDAuZiwgMC5mIH07CitmbG9hdCBpZGVudGl0eURpc3RvcnRpb25bXSA9IHsgMC5mLCAwLmYsIDAuZiwgMC5mLCAwLmZ9OworCit2b2lkIHNldHVwVGVzdE1hcHBlcihEaXN0b3J0aW9uTWFwcGVyICptLAorICAgICAgICBmbG9hdCBkaXN0b3J0aW9uWzVdLCBmbG9hdCBpbnRyaW5zaWNzWzVdLAorICAgICAgICBpbnQzMl90IGFjdGl2ZUFycmF5WzRdLCBpbnQzMl90IHByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVs0XSkgeworICAgIENhbWVyYU1ldGFkYXRhIGRldmljZUluZm87CisKKyAgICBkZXZpY2VJbmZvLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFLAorICAgICAgICAgICAgcHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5LCA0KTsKKworICAgIGRldmljZUluZm8udXBkYXRlKEFORFJPSURfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUsCisgICAgICAgICAgICBhY3RpdmVBcnJheSwgNCk7CisKKyAgICBkZXZpY2VJbmZvLnVwZGF0ZShBTkRST0lEX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OLAorICAgICAgICAgICAgaW50cmluc2ljcywgNSk7CisKKyAgICBkZXZpY2VJbmZvLnVwZGF0ZShBTkRST0lEX0xFTlNfRElTVE9SVElPTiwKKyAgICAgICAgICAgIGRpc3RvcnRpb24sIDUpOworCisgICAgbS0+c2V0dXBTdGF0aWNJbmZvKGRldmljZUluZm8pOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcChkYXRhLCBzaXplKTsKKworICAgIERpc3RvcnRpb25NYXBwZXIgbTsKKyAgICBzZXR1cFRlc3RNYXBwZXIoJm0sIGlkZW50aXR5RGlzdG9ydGlvbiwgdGVzdElDYWwsCisgICAgICAgIC8qYWN0aXZlQXJyYXkqLyB0ZXN0QWN0aXZlQXJyYXksCisgICAgICAgIC8qcHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5Ki8gdGVzdEFjdGl2ZUFycmF5KTsKKworICAgIGJvb2wgY2xhbXAgPSBmZHAuQ29uc3VtZUJvb2woKTsKKyAgICBib29sIHNpbXBsZSA9IGZkcC5Db25zdW1lQm9vbCgpOworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGlucHV0OworICAgIGZvciAoaW50IGluZGV4ID0gMDsgZmRwLnJlbWFpbmluZ19ieXRlcygpID4gMDsgaW5kZXgrKykgeworICAgICAgICBpbnB1dC5wdXNoX2JhY2soZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICB9CisKKyAgICAvLyBUaGUgc2l6ZSBhcmd1bWVudCBjb3VudHMgaG93IG1hbnkgY29vcmRpbmF0ZSBwYWlycyB0aGVyZSBhcmUsIHNvCisgICAgLy8gaXQgaXMgZXhwZWN0ZWQgdG8gYmUgMS8yIHRoZSBzaXplIG9mIHRoZSBpbnB1dC4KKyAgICBtLm1hcENvcnJlY3RlZFRvUmF3KGlucHV0LmRhdGEoKSwgaW5wdXQuc2l6ZSgpLzIsICBjbGFtcCwgc2ltcGxlKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9DYW5vbl9NYWtlck5vdGVfdmFyaWFudF90eXBlXzEuanBnIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9DYW5vbl9NYWtlck5vdGVfdmFyaWFudF90eXBlXzEuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYjM3ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL0Nhbm9uX01ha2VyTm90ZV92YXJpYW50X3R5cGVfMS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9GdWppX01ha2VyTm90ZV92YXJpYW50X3R5cGVfMS5qcGcgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL0Z1amlfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV8xLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWUwMzcxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9GdWppX01ha2VyTm90ZV92YXJpYW50X3R5cGVfMS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9PbHltcHVzX01ha2VyTm90ZV92YXJpYW50X3R5cGVfMi5qcGcgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL09seW1wdXNfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV8yLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjFkNjEzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9PbHltcHVzX01ha2VyTm90ZV92YXJpYW50X3R5cGVfMi5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9PbHltcHVzX01ha2VyTm90ZV92YXJpYW50X3R5cGVfMy5qcGcgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL09seW1wdXNfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV8zLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjQ5OGUyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9PbHltcHVzX01ha2VyTm90ZV92YXJpYW50X3R5cGVfMy5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9PbHltcHVzX01ha2VyTm90ZV92YXJpYW50X3R5cGVfNC5qcGcgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL09seW1wdXNfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV80LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzNmZjc4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9PbHltcHVzX01ha2VyTm90ZV92YXJpYW50X3R5cGVfNC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9PbHltcHVzX01ha2VyTm90ZV92YXJpYW50X3R5cGVfNS5qcGcgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL09seW1wdXNfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV81LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDgzZjc1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9PbHltcHVzX01ha2VyTm90ZV92YXJpYW50X3R5cGVfNS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9QZW50YXhfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV8yLmpwZyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvUGVudGF4X01ha2VyTm90ZV92YXJpYW50X3R5cGVfMi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmMGVmMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvUGVudGF4X01ha2VyTm90ZV92YXJpYW50X3R5cGVfMi5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9QZW50YXhfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV8zLmpwZyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvUGVudGF4X01ha2VyTm90ZV92YXJpYW50X3R5cGVfMy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkzYjg2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvUGVudGF4X01ha2VyTm90ZV92YXJpYW50X3R5cGVfMy5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9QZW50YXhfTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV80LmpwZyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvUGVudGF4X01ha2VyTm90ZV92YXJpYW50X3R5cGVfNC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk3ZWExYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvUGVudGF4X01ha2VyTm90ZV92YXJpYW50X3R5cGVfNC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcAppbmRleCBhNDYxMzNlLi45ZWE5NTI2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcApAQCAtMTAzLDcgKzEwMyw3IEBACiAgICAgfQogICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYWxsYmFja3MgPSBoeWJyaWRDYWxsYmFja3M7CiAgICAgYmluZGVyOjpTdGF0dXMgc2VydmljZVJldCA9IG1BaWRsSUNhbWVyYVNlcnZpY2UtPmNvbm5lY3REZXZpY2UoCi0gICAgICAgICAgICBjYWxsYmFja3MsIFN0cmluZzE2KGNhbWVyYUlkLmNfc3RyKCkpLCBTdHJpbmcxNigiIiksIHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4oKSwKKyAgICAgICAgICAgIGNhbGxiYWNrcywgU3RyaW5nMTYoY2FtZXJhSWQuY19zdHIoKSksIFN0cmluZzE2KCIiKSwge30sCiAgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCwgLypvdXQqLyZkZXZpY2VSZW1vdGUpOwogICAgIEhTdGF0dXMgc3RhdHVzID0gSFN0YXR1czo6Tk9fRVJST1I7CiAgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvbGliY2FtZXJhc2VydmljZV9mdXp6ZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2xpYmNhbWVyYXNlcnZpY2VfZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2YjJjNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2xpYmNhbWVyYXNlcnZpY2VfZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X3NlcnZpY2VzX2NhbWVyYV9saWJjYW1lcmFzZXJ2aWNlX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9zZXJ2aWNlc19jYW1lcmFfbGliY2FtZXJhc2VydmljZV9saWNlbnNlIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiY2FtZXJhX3NlcnZpY2VfZnV6emVyIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJjYW1lcmFfc2VydmljZV9mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliY2FtZXJhc2VydmljZSIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjUiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi42IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4zIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjQiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy42IiwKKyAgICBdLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2xpYmNhbWVyYXNlcnZpY2VfZnV6emVyL1JFQURNRS5tZCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2xpYmNhbWVyYXNlcnZpY2VfZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzAzODQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvbGliY2FtZXJhc2VydmljZV9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTkgQEAKKyMgRnV6emVyIGZvciBsaWJjYW1lcmFzZXJ2aWNlCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGlzIGRlc2lnbmVkIGJhc2VkIG9uIHRoZSB1bmRlcnN0YW5kaW5nIG9mIHRoZQorbGlicmFyeSBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSBub3QgaGFyZGNvZGVkLCBidXQgaW5zdGVhZCBzZWxlY3RlZCBiYXNlZCBvbgoraW5jb21pbmcgZGF0YS4gVGhpcyBlbnN1cmVzIG1vcmUgY29kZSBwYXRocyBhcmUgcmVhY2hlZCBieSB0aGUgZnV6emVyLgorCitsaWJjYW1lcmFzZXJ2aWNlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKzEuIENhbWVyYSBUeXBlIChwYXJhbWV0ZXIgbmFtZTogYGNhbWVyYVR5cGVgKQorMi4gQ2FtZXJhIEFQSSBWZXJzaW9uIChwYXJhbWV0ZXIgbmFtZTogYGNhbWVyYUFQSVZlcnNpb25gKQorMy4gRXZlbnQgSUQgKHBhcmFtZXRlciBuYW1lOiBgZXZlbnRJZGApCis0LiBDYW1lcmEgU291bmQgS2luZCAocGFyYW1ldGVyIG5hbWU6IGBzb3VuZEtpbmRgKQorNS4gU2hlbGwgQ29tbWFuZCAocGFyYW1ldGVyIG5hbWU6IGBzaGVsbENvbW1hbmRgKQorCit8IFBhcmFtZXRlcnwgVmFsaWQgVmFsdWVzfCBDb25maWd1cmVkIFZhbHVlfAorfC0tLS0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS18IC0tLS0tIHwKK3wgYGNhbWVyYVR5cGVgIHwgMC4gYENBTUVSQV9UWVBFX0JBQ0tXQVJEX0NPTVBBVElCTEVgIDEuIGBDQU1FUkFfVFlQRV9BTExgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgY2FtZXJhQVBJVmVyc2lvbmAgfCAgMC4gYEFQSV9WRVJTSU9OXzFgIDEuIGBBUElfVkVSU0lPTl8yYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYGV2ZW50SWRgIHwgIDAuIGBFVkVOVF9VU0VSX1NXSVRDSEVEYCAxLiBgRVZFTlRfTk9ORWAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBzb3VuZEtpbmRgIHwgIDAuIGBTT1VORF9TSFVUVEVSYCAxLiBgU09VTkRfUkVDT1JESU5HX1NUQVJUYCAyLiBgU09VTkRfUkVDT1JESU5HX1NUT1BgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBzaGVsbENvbW1hbmRgIHwgIDAuIGBzZXQtdWlkLXN0YXRlYCAxLiBgcmVzZXQtdWlkLXN0YXRlYCAyLiBgZ2V0LXVpZC1zdGF0ZWAgMy4gYHNldC1yb3RhdGUtYW5kLWNyb3BgIDQuIGBnZXQtcm90YXRlLWFuZC1jcm9wYCA1LiBgaGVscGB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKKworVGhpcyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIGlzIGFsd2F5cyBkZXRlcm1pbmlzdGljIGZvciBhbnkgZ2l2ZW4gaW5wdXQuCisKKyMjIyMjIE1heGltaXplIHV0aWxpemF0aW9uIG9mIGlucHV0IGRhdGEKK1RoZSBwbHVnaW4gdG9sZXJhdGVzIGFueSBraW5kIG9mIGlucHV0IChlbXB0eSwgaHVnZSwKK21hbGZvcm1lZCwgZXRjKSBhbmQgZG9lc24ndCBgZXhpdCgpYCBvbiBhbnkgaW5wdXQgYW5kIHRoZXJlYnkgaW5jcmVhc2luZyB0aGUKK2NoYW5jZSBvZiBpZGVudGlmeWluZyB2dWxuZXJhYmlsaXRpZXMuCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIGNhbWVyYV9zZXJ2aWNlX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgY2FtZXJhX3NlcnZpY2VfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSCitgYGAKKyAgJCBhZGIgc2hlbGwgbWtkaXIgQ09SUFVTX0RJUgorYGBgCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9jYW1lcmFfc2VydmljZV9mdXp6ZXIvY2FtZXJhX3NlcnZpY2VfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIyBSZWZlcmVuY2VzOgorICogaHR0cDovL2xsdm0ub3JnL2RvY3MvTGliRnV6emVyLmh0bWwKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvb3NzLWZ1enoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2xpYmNhbWVyYXNlcnZpY2VfZnV6emVyL2NhbWVyYV9zZXJ2aWNlX2Z1enplci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9saWJjYW1lcmFzZXJ2aWNlX2Z1enplci9jYW1lcmFfc2VydmljZV9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTUwYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9saWJjYW1lcmFzZXJ2aWNlX2Z1enplci9jYW1lcmFfc2VydmljZV9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNDMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworI2luY2x1ZGUgPENhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKyNpbmNsdWRlICJmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY29uc3QgaW50MzJfdCBrUHJldmlld1RocmVzaG9sZCA9IDg7Citjb25zdCBuc2Vjc190IGtQcmV2aWV3VGltZW91dCA9IDUwMDAwMDAwMDA7ICAvLyAuNSBbcy5dCitjb25zdCBuc2Vjc190IGtFdmVudFRpbWVvdXQgPSAxMDAwMDAwMDAwMDsgICAvLyAxIFtzLl0KK2NvbnN0IHNpemVfdCBrTWF4TnVtTGluZXMgPSBVU0hSVF9NQVg7Citjb25zdCBzaXplX3Qga01pbkFyZ3MgPSAxOworY29uc3Qgc2l6ZV90IGtNYXhBcmdzID0gNTsKK2NvbnN0IGludDMyX3Qga0NhbVR5cGVbXSA9IHtoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkNBTUVSQV9UWVBFX0JBQ0tXQVJEX0NPTVBBVElCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpDQU1FUkFfVFlQRV9BTEx9OworY29uc3QgaW50IGtDYW1lcmFBcGlWZXJzaW9uW10gPSB7YW5kcm9pZDo6Q2FtZXJhU2VydmljZTo6QVBJX1ZFUlNJT05fMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OkNhbWVyYVNlcnZpY2U6OkFQSV9WRVJTSU9OXzJ9OworY29uc3QgaW50IGtMYXllck1ldGFkYXRhW10gPSB7CisgICAgMHgwMDEwMDAwMCAvKkdSQUxMT0NfVVNBR0VfUkVOREVSU0NSSVBUKi8sIDB4MDAwMDAwMDMgLypHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4qLywKKyAgICAweDAwMDAwMTAwIC8qR1JBTExPQ19VU0FHRV9IV19URVhUVVJFKi8sICAgMHgwMDAwMDgwMCAvKkdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIqLywKKyAgICAweDAwMDAwMjAwIC8qR1JBTExPQ19VU0FHRV9IV19SRU5ERVIqLywgICAgMHgwMDAxMDAwMCAvKkdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiovfTsKK2NvbnN0IGludCBrQ2FtZXJhTXNnW10gPSB7MHgwMDEgLypDQU1FUkFfTVNHX0VSUk9SKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyIC8qQ0FNRVJBX01TR19TSFVUVEVSKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0IC8qQ0FNRVJBX01TR19GT0NVUyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwOCAvKkNBTUVSQV9NU0dfWk9PTSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMCAvKkNBTUVSQV9NU0dfUFJFVklFV19GUkFNRSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMCAvKkNBTUVSQV9NU0dfVklERU9fRlJBTUUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwIC8qQ0FNRVJBX01TR19QT1NUVklFV19GUkFNRSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MCAvKkNBTUVSQV9NU0dfUkFXX0lNQUdFICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMCAvKkNBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMCAvKkNBTUVSQV9NU0dfUkFXX0lNQUdFX05PVElGWSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMCAvKkNBTUVSQV9NU0dfUFJFVklFV19NRVRBREFUQSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMCAvKkNBTUVSQV9NU0dfRk9DVVNfTU9WRSovfTsKK2NvbnN0IGludDMyX3Qga0V2ZW50SWRbXSA9IHtJQ2FtZXJhU2VydmljZTo6RVZFTlRfVVNFUl9TV0lUQ0hFRCwgSUNhbWVyYVNlcnZpY2U6OkVWRU5UX05PTkV9OworY29uc3QgYW5kcm9pZDo6Q2FtZXJhU2VydmljZTo6c291bmRfa2luZCBrU291bmRLaW5kW10gPSB7CisgICAgYW5kcm9pZDo6Q2FtZXJhU2VydmljZTo6U09VTkRfU0hVVFRFUiwgYW5kcm9pZDo6Q2FtZXJhU2VydmljZTo6U09VTkRfUkVDT1JESU5HX1NUQVJULAorICAgIGFuZHJvaWQ6OkNhbWVyYVNlcnZpY2U6OlNPVU5EX1JFQ09SRElOR19TVE9QfTsKK2NvbnN0IFN0cmluZzE2IGtTaGVsbENtZFtdID0ge1N0cmluZzE2KCJzZXQtdWlkLXN0YXRlIiksICAgICAgIFN0cmluZzE2KCJyZXNldC11aWQtc3RhdGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KCJnZXQtdWlkLXN0YXRlIiksICAgICAgIFN0cmluZzE2KCJzZXQtcm90YXRlLWFuZC1jcm9wIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigiZ2V0LXJvdGF0ZS1hbmQtY3JvcCIpLCBTdHJpbmcxNigiaGVscCIpfTsKK2NvbnN0IHNpemVfdCBrTnVtTGF5ZXJNZXRhRGF0YSA9IHNpemUoa0xheWVyTWV0YWRhdGEpOworY29uc3Qgc2l6ZV90IGtOdW1DYW1lcmFNc2cgPSBzaXplKGtDYW1lcmFNc2cpOworY29uc3Qgc2l6ZV90IGtOdW1Tb3VuZEtpbmQgPSBzaXplKGtTb3VuZEtpbmQpOworY29uc3Qgc2l6ZV90IGtOdW1TaGVsbENtZCA9IHNpemUoa1NoZWxsQ21kKTsKKworY2xhc3MgQ2FtZXJhRnV6emVyIDogcHVibGljIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkJuQ2FtZXJhQ2xpZW50IHsKKyAgIHB1YmxpYzoKKyAgICBDYW1lcmFGdXp6ZXIoKSA9IGRlZmF1bHQ7CisgICAgfkNhbWVyYUZ1enplcigpIHsgZGVJbml0KCk7IH0KKyAgICBib29sIGluaXQoKTsKKyAgICB2b2lkIHByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgZGVJbml0KCk7CisKKyAgIHByaXZhdGU6CisgICAgRnV6emVkRGF0YVByb3ZpZGVyICptRnV6emVkRGF0YVByb3ZpZGVyID0gbnVsbHB0cjsKKyAgICBzcDxDYW1lcmFTZXJ2aWNlPiBtQ2FtZXJhU2VydmljZSA9IG51bGxwdHI7CisgICAgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBtQ29tcG9zZXJDbGllbnQgPSBudWxscHRyOworICAgIGludDMyX3QgbU51bUNhbWVyYXMgPSAwOworICAgIHNpemVfdCBtUHJldmlld0J1ZmZlckNvdW50ID0gMDsKKyAgICBib29sIG1BdXRvRm9jdXNNZXNzYWdlID0gZmFsc2U7CisgICAgYm9vbCBtU25hcHNob3ROb3RpZmljYXRpb24gPSBmYWxzZTsKKyAgICBtdXRhYmxlIE11dGV4IG1QcmV2aWV3TG9jazsKKyAgICBtdXRhYmxlIENvbmRpdGlvbiBtUHJldmlld0NvbmRpdGlvbjsKKyAgICBtdXRhYmxlIE11dGV4IG1BdXRvRm9jdXNMb2NrOworICAgIG11dGFibGUgQ29uZGl0aW9uIG1BdXRvRm9jdXNDb25kaXRpb247CisgICAgbXV0YWJsZSBNdXRleCBtU25hcHNob3RMb2NrOworICAgIG11dGFibGUgQ29uZGl0aW9uIG1TbmFwc2hvdENvbmRpdGlvbjsKKworICAgIHZvaWQgZ2V0TnVtQ2FtZXJhcygpOworICAgIHZvaWQgZ2V0Q2FtZXJhSW5mb3JtYXRpb24oaW50MzJfdCBjYW1lcmFJZCk7CisgICAgdm9pZCBpbnZva2VDYW1lcmFBUElzKCk7CisgICAgdm9pZCBpbnZva2VDYW1lcmFTb3VuZCgpOworICAgIHZvaWQgaW52b2tlRHVtcCgpOworICAgIHZvaWQgaW52b2tlU2hlbGxDb21tYW5kKCk7CisgICAgdm9pZCBpbnZva2VOb3RpZnlDYWxscygpOworCisgICAgLy8gQ2FtZXJhQ2xpZW50IGludGVyZmFjZQorICAgIHZvaWQgbm90aWZ5Q2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBpbnQzMl90LCBpbnQzMl90KSBvdmVycmlkZTsKKyAgICB2b2lkIGRhdGFDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICYsIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICopIG92ZXJyaWRlOworICAgIHZvaWQgZGF0YUNhbGxiYWNrVGltZXN0YW1wKG5zZWNzX3QsIGludDMyX3QsIGNvbnN0IHNwPElNZW1vcnk+ICYpIG92ZXJyaWRle307CisgICAgdm9pZCByZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wKG5zZWNzX3QsIG5hdGl2ZV9oYW5kbGVfdCAqKSBvdmVycmlkZXt9OworICAgIHZvaWQgcmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcEJhdGNoKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxuc2Vjc190PiAmLCBjb25zdCBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QgKj4gJikgb3ZlcnJpZGV7fTsKKyAgICBzdGF0dXNfdCB3YWl0Rm9yUHJldmlld1N0YXJ0KCk7CisgICAgc3RhdHVzX3Qgd2FpdEZvckV2ZW50KE11dGV4ICZtdXRleCwgQ29uZGl0aW9uICZjb25kaXRpb24sIGJvb2wgJmZsYWcpOworfTsKKwordm9pZCBDYW1lcmFGdXp6ZXI6Om5vdGlmeUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgaW50MzJfdCwgaW50MzJfdCkgeworICAgIGlmIChDQU1FUkFfTVNHX0ZPQ1VTID09IG1zZ1R5cGUpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUF1dG9Gb2N1c0xvY2spOworICAgICAgICBtQXV0b0ZvY3VzTWVzc2FnZSA9IHRydWU7CisgICAgICAgIG1BdXRvRm9jdXNDb25kaXRpb24uYnJvYWRjYXN0KCk7CisgICAgfQorfTsKKwordm9pZCBDYW1lcmFGdXp6ZXI6OmRhdGFDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICYgLypkYXRhKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICopIHsKKyAgICBzd2l0Y2ggKG1zZ1R5cGUpIHsKKyAgICAgICAgY2FzZSBDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUU6IHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1QcmV2aWV3TG9jayk7CisgICAgICAgICAgICArK21QcmV2aWV3QnVmZmVyQ291bnQ7CisgICAgICAgICAgICBtUHJldmlld0NvbmRpdGlvbi5icm9hZGNhc3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQ0FNRVJBX01TR19DT01QUkVTU0VEX0lNQUdFOiB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtU25hcHNob3RMb2NrKTsKKyAgICAgICAgICAgIG1TbmFwc2hvdE5vdGlmaWNhdGlvbiA9IHRydWU7CisgICAgICAgICAgICBtU25hcHNob3RDb25kaXRpb24uYnJvYWRjYXN0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfTsKKworc3RhdHVzX3QgQ2FtZXJhRnV6emVyOjp3YWl0Rm9yUHJldmlld1N0YXJ0KCkgeworICAgIHN0YXR1c190IHJjID0gTk9fRVJST1I7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVByZXZpZXdMb2NrKTsKKyAgICBtUHJldmlld0J1ZmZlckNvdW50ID0gMDsKKworICAgIHdoaWxlIChtUHJldmlld0J1ZmZlckNvdW50IDwga1ByZXZpZXdUaHJlc2hvbGQpIHsKKyAgICAgICAgcmMgPSBtUHJldmlld0NvbmRpdGlvbi53YWl0UmVsYXRpdmUobVByZXZpZXdMb2NrLCBrUHJldmlld1RpbWVvdXQpOworICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0dXNfdCBDYW1lcmFGdXp6ZXI6OndhaXRGb3JFdmVudChNdXRleCAmbXV0ZXgsIENvbmRpdGlvbiAmY29uZGl0aW9uLCBib29sICZmbGFnKSB7CisgICAgc3RhdHVzX3QgcmMgPSBOT19FUlJPUjsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtdXRleCk7CisgICAgZmxhZyA9IGZhbHNlOworCisgICAgd2hpbGUgKCFmbGFnKSB7CisgICAgICAgIHJjID0gY29uZGl0aW9uLndhaXRSZWxhdGl2ZShtdXRleCwga0V2ZW50VGltZW91dCk7CisgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK2Jvb2wgQ2FtZXJhRnV6emVyOjppbml0KCkgeworICAgIHNldHVpZChBSURfTUVESUEpOworICAgIG1DYW1lcmFTZXJ2aWNlID0gbmV3IENhbWVyYVNlcnZpY2UoKTsKKyAgICBpZiAobUNhbWVyYVNlcnZpY2UpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBDYW1lcmFGdXp6ZXI6OmRlSW5pdCgpIHsKKyAgICBpZiAobUNhbWVyYVNlcnZpY2UpIHsKKyAgICAgICAgbUNhbWVyYVNlcnZpY2UgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobUNvbXBvc2VyQ2xpZW50KSB7CisgICAgICAgIG1Db21wb3NlckNsaWVudC0+ZGlzcG9zZSgpOworICAgIH0KK30KKwordm9pZCBDYW1lcmFGdXp6ZXI6OmdldE51bUNhbWVyYXMoKSB7CisgICAgYm9vbCBzaG91bGRQYXNzSW52YWxpZENhbVR5cGUgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpOworICAgIGludDMyX3QgY2FtVHlwZTsKKyAgICBpZiAoc2hvdWxkUGFzc0ludmFsaWRDYW1UeXBlKSB7CisgICAgICAgIGNhbVR5cGUgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjYW1UeXBlID0ga0NhbVR5cGVbbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUJvb2woKV07CisgICAgfQorICAgIG1DYW1lcmFTZXJ2aWNlLT5nZXROdW1iZXJPZkNhbWVyYXMoY2FtVHlwZSwgJm1OdW1DYW1lcmFzKTsKK30KKwordm9pZCBDYW1lcmFGdXp6ZXI6OmdldENhbWVyYUluZm9ybWF0aW9uKGludDMyX3QgY2FtZXJhSWQpIHsKKyAgICBTdHJpbmcxNiBjYW1lcmFJZFN0ciA9IFN0cmluZzE2KFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCkpOworICAgIGJvb2wgaXNTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICBtQ2FtZXJhU2VydmljZS0+c3VwcG9ydHNDYW1lcmFBcGkoCisgICAgICAgIGNhbWVyYUlkU3RyLCBrQ2FtZXJhQXBpVmVyc2lvblttRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpXSwgJmlzU3VwcG9ydGVkKTsKKyAgICBtQ2FtZXJhU2VydmljZS0+aXNIaWRkZW5QaHlzaWNhbENhbWVyYShjYW1lcmFJZFN0ciwgJmlzU3VwcG9ydGVkKTsKKworICAgIFN0cmluZzE2IHBhcmFtZXRlcnM7CisgICAgbUNhbWVyYVNlcnZpY2UtPmdldExlZ2FjeVBhcmFtZXRlcnMoY2FtZXJhSWQsICZwYXJhbWV0ZXJzKTsKKworICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6Q29uY3VycmVudENhbWVyYUlkQ29tYmluYXRpb24+IGNvbmN1cnJlbnRDYW1lcmFJZHM7CisgICAgbUNhbWVyYVNlcnZpY2UtPmdldENvbmN1cnJlbnRDYW1lcmFJZHMoJmNvbmN1cnJlbnRDYW1lcmFJZHMpOworCisgICAgaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlIGNhY2hlOworICAgIG1DYW1lcmFTZXJ2aWNlLT5nZXRDYW1lcmFWZW5kb3JUYWdDYWNoZSgmY2FjaGUpOworCisgICAgQ2FtZXJhSW5mbyBjYW1lcmFJbmZvOworICAgIG1DYW1lcmFTZXJ2aWNlLT5nZXRDYW1lcmFJbmZvKGNhbWVyYUlkLCAmY2FtZXJhSW5mbyk7CisKKyAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICBtQ2FtZXJhU2VydmljZS0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkU3RyLCAmbWV0YWRhdGEpOworfQorCit2b2lkIENhbWVyYUZ1enplcjo6aW52b2tlQ2FtZXJhU291bmQoKSB7CisgICAgbUNhbWVyYVNlcnZpY2UtPmluY3JlYXNlU291bmRSZWYoKTsKKyAgICBtQ2FtZXJhU2VydmljZS0+ZGVjcmVhc2VTb3VuZFJlZigpOworICAgIGJvb2wgc2hvdWxkUGFzc0ludmFsaWRQbGF5U291bmQgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpOworICAgIGJvb2wgc2hvdWxkUGFzc0ludmFsaWRMb2NrU291bmQgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpOworICAgIGFuZHJvaWQ6OkNhbWVyYVNlcnZpY2U6OnNvdW5kX2tpbmQgcGxheVNvdW5kLCBsb2NrU291bmQ7CisgICAgaWYgKHNob3VsZFBhc3NJbnZhbGlkUGxheVNvdW5kKSB7CisgICAgICAgIHBsYXlTb3VuZCA9IHN0YXRpY19jYXN0PGFuZHJvaWQ6OkNhbWVyYVNlcnZpY2U6OnNvdW5kX2tpbmQ+KAorICAgICAgICAgICAgbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPHNpemVfdD4oKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGxheVNvdW5kID0KKyAgICAgICAgICAgIGtTb3VuZEtpbmRbbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIGtOdW1Tb3VuZEtpbmQgLSAxKV07CisgICAgfQorCisgICAgaWYgKHNob3VsZFBhc3NJbnZhbGlkTG9ja1NvdW5kKSB7CisgICAgICAgIGxvY2tTb3VuZCA9IHN0YXRpY19jYXN0PGFuZHJvaWQ6OkNhbWVyYVNlcnZpY2U6OnNvdW5kX2tpbmQ+KAorICAgICAgICAgICAgbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPHNpemVfdD4oKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbG9ja1NvdW5kID0KKyAgICAgICAgICAgIGtTb3VuZEtpbmRbbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIGtOdW1Tb3VuZEtpbmQgLSAxKV07CisgICAgfQorICAgIG1DYW1lcmFTZXJ2aWNlLT5wbGF5U291bmQocGxheVNvdW5kKTsKKyAgICBtQ2FtZXJhU2VydmljZS0+bG9hZFNvdW5kTG9ja2VkKGxvY2tTb3VuZCk7Cit9CisKK3ZvaWQgQ2FtZXJhRnV6emVyOjppbnZva2VEdW1wKCkgeworICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKKyAgICBzaXplX3QgbnVtYmVyT2ZMaW5lcyA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBrTWF4TnVtTGluZXMpOworICAgIGZvciAoc2l6ZV90IGxpbmVJZHggPSAwOyBsaW5lSWR4IDwgbnVtYmVyT2ZMaW5lczsgKytsaW5lSWR4KSB7CisgICAgICAgIGFyZ3MuYWRkKHN0YXRpY19jYXN0PFN0cmluZzE2PihtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSkpOworICAgIH0KKyAgICBjb25zdCBjaGFyICpmaWxlTmFtZSA9ICJsb2dEdW1wRmlsZSI7CisgICAgaW50IGZkID0gbWVtZmRfY3JlYXRlKGZpbGVOYW1lLCBNRkRfQUxMT1dfU0VBTElORyk7CisgICAgbUNhbWVyYVNlcnZpY2UtPmR1bXAoZmQsIGFyZ3MpOworICAgIGNsb3NlKGZkKTsKK30KKwordm9pZCBDYW1lcmFGdXp6ZXI6Omludm9rZVNoZWxsQ29tbWFuZCgpIHsKKyAgICBpbnQgaW4gPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8aW50PigpOworICAgIGludCBvdXQgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8aW50PigpOworICAgIGludCBlcnIgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8aW50PigpOworICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKKyAgICBzaXplX3QgbnVtQXJncyA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PihrTWluQXJncywga01heEFyZ3MpOworICAgIGZvciAoc2l6ZV90IGFyZ3NJZHggPSAwOyBhcmdzSWR4IDwgbnVtQXJnczsgKythcmdzSWR4KSB7CisgICAgICAgIGJvb2wgc2hvdWxkUGFzc0ludmFsaWRDb21tYW5kID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUJvb2woKTsKKyAgICAgICAgaWYgKHNob3VsZFBhc3NJbnZhbGlkQ29tbWFuZCkgeworICAgICAgICAgICAgYXJncy5hZGQoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U3RyaW5nMTY+KG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhcmdzLmFkZChrU2hlbGxDbWRbbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KAorICAgICAgICAgICAgICAgIDAsIGtOdW1TaGVsbENtZCAtIDEpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUNhbWVyYVNlcnZpY2UtPnNoZWxsQ29tbWFuZChpbiwgb3V0LCBlcnIsIGFyZ3MpOworfQorCit2b2lkIENhbWVyYUZ1enplcjo6aW52b2tlTm90aWZ5Q2FsbHMoKSB7CisgICAgbUNhbWVyYVNlcnZpY2UtPm5vdGlmeU1vbml0b3JlZFVpZHMoKTsKKyAgICBpbnQ2NF90IG5ld1N0YXRlID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPGludDY0X3Q+KCk7CisgICAgbUNhbWVyYVNlcnZpY2UtPm5vdGlmeURldmljZVN0YXRlQ2hhbmdlKG5ld1N0YXRlKTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBhcmdzOworICAgIHNpemVfdCBudW1BcmdzID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KGtNaW5BcmdzLCBrTWF4QXJncyk7CisgICAgZm9yIChzaXplX3QgYXJnc0lkeCA9IDA7IGFyZ3NJZHggPCBudW1BcmdzOyArK2FyZ3NJZHgpIHsKKyAgICAgICAgYXJncy5wdXNoX2JhY2sobUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgIH0KKyAgICBib29sIHNob3VsZFBhc3NJbnZhbGlkRXZlbnQgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpOworICAgIGludDMyX3QgZXZlbnRJZDsKKyAgICBpZiAoc2hvdWxkUGFzc0ludmFsaWRFdmVudCkgeworICAgICAgICBldmVudElkID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXZlbnRJZCA9IGtFdmVudElkW21GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVCb29sKCldOworICAgIH0KKyAgICBtQ2FtZXJhU2VydmljZS0+bm90aWZ5U3lzdGVtRXZlbnQoZXZlbnRJZCwgYXJncyk7Cit9CisKK3ZvaWQgQ2FtZXJhRnV6emVyOjppbnZva2VDYW1lcmFBUElzKCkgeworICAgIGZvciAoaW50MzJfdCBjYW1lcmFJZCA9IDA7IGNhbWVyYUlkIDwgbU51bUNhbWVyYXM7ICsrY2FtZXJhSWQpIHsKKyAgICAgICAgZ2V0Q2FtZXJhSW5mb3JtYXRpb24oY2FtZXJhSWQpOworCisgICAgICAgIGNvbnN0IFN0cmluZzE2IG9wUGFja2FnZU5hbWUoImNvbS5mdXp6ZXIucG9jIik7CisgICAgICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgcmM7CisgICAgICAgIHNwPElDYW1lcmE+IGNhbWVyYURldmljZTsKKworICAgICAgICByYyA9IG1DYW1lcmFTZXJ2aWNlLT5jb25uZWN0KHRoaXMsIGNhbWVyYUlkLCBvcFBhY2thZ2VOYW1lLCBBSURfTUVESUEsIEFJRF9ST09ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW1lcmFEZXZpY2UpOworICAgICAgICBpZiAoIXJjLmlzT2soKSkgeworICAgICAgICAgICAgLy8gY2FtZXJhIG5vdCBjb25uZWN0ZWQKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FtZXJhRGV2aWNlKSB7CisgICAgICAgICAgICBzcDxTdXJmYWNlPiBwcmV2aWV3U3VyZmFjZTsKKyAgICAgICAgICAgIHNwPFN1cmZhY2VDb250cm9sPiBzdXJmYWNlQ29udHJvbDsKKyAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKGNhbWVyYURldmljZS0+Z2V0UGFyYW1ldGVycygpKTsKKyAgICAgICAgICAgIFN0cmluZzggZm9jdXNNb2RlcyhwYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfRk9DVVNfTU9ERVMpKTsKKyAgICAgICAgICAgIGJvb2wgaXNBRlN1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgY29uc3QgY2hhciAqZm9jdXNNb2RlID0gbnVsbHB0cjsKKworICAgICAgICAgICAgaWYgKGZvY3VzTW9kZXMuY29udGFpbnMoQ2FtZXJhUGFyYW1ldGVyczo6Rk9DVVNfTU9ERV9BVVRPKSkgeworICAgICAgICAgICAgICAgIGlzQUZTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChmb2N1c01vZGVzLmNvbnRhaW5zKENhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX01PREVfQ09OVElOVU9VU19QSUNUVVJFKSkgeworICAgICAgICAgICAgICAgIGlzQUZTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvY3VzTW9kZSA9IENhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX01PREVfQ09OVElOVU9VU19QSUNUVVJFOworICAgICAgICAgICAgfSBlbHNlIGlmIChmb2N1c01vZGVzLmNvbnRhaW5zKENhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX01PREVfQ09OVElOVU9VU19WSURFTykpIHsKKyAgICAgICAgICAgICAgICBpc0FGU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb2N1c01vZGUgPSBDYW1lcmFQYXJhbWV0ZXJzOjpGT0NVU19NT0RFX0NPTlRJTlVPVVNfVklERU87CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZvY3VzTW9kZXMuY29udGFpbnMoQ2FtZXJhUGFyYW1ldGVyczo6Rk9DVVNfTU9ERV9NQUNSTykpIHsKKyAgICAgICAgICAgICAgICBpc0FGU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb2N1c01vZGUgPSBDYW1lcmFQYXJhbWV0ZXJzOjpGT0NVU19NT0RFX01BQ1JPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bGxwdHIgIT0gZm9jdXNNb2RlKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRk9DVVNfTU9ERSwgZm9jdXNNb2RlKTsKKyAgICAgICAgICAgICAgICBjYW1lcmFEZXZpY2UtPnNldFBhcmFtZXRlcnMocGFyYW1zLmZsYXR0ZW4oKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgcHJldmlld1dpZHRoLCBwcmV2aWV3SGVpZ2h0OworICAgICAgICAgICAgcGFyYW1zLmdldFByZXZpZXdTaXplKCZwcmV2aWV3V2lkdGgsICZwcmV2aWV3SGVpZ2h0KTsKKworICAgICAgICAgICAgbUNvbXBvc2VyQ2xpZW50ID0gbmV3IFN1cmZhY2VDb21wb3NlckNsaWVudDsKKyAgICAgICAgICAgIG1Db21wb3NlckNsaWVudC0+aW5pdENoZWNrKCk7CisKKyAgICAgICAgICAgIGJvb2wgc2hvdWxkUGFzc0ludmFsaWRMYXllck1ldGFEYXRhID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUJvb2woKTsKKyAgICAgICAgICAgIGludCBsYXllck1ldGFEYXRhOworICAgICAgICAgICAgaWYgKHNob3VsZFBhc3NJbnZhbGlkTGF5ZXJNZXRhRGF0YSkgeworICAgICAgICAgICAgICAgIGxheWVyTWV0YURhdGEgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8aW50PigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsYXllck1ldGFEYXRhID0ga0xheWVyTWV0YWRhdGFbbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KAorICAgICAgICAgICAgICAgICAgICAwLCBrTnVtTGF5ZXJNZXRhRGF0YSAtIDEpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1cmZhY2VDb250cm9sID0gbUNvbXBvc2VyQ2xpZW50LT5jcmVhdGVTdXJmYWNlKAorICAgICAgICAgICAgICAgIFN0cmluZzgoIlRlc3QgU3VyZmFjZSIpLCBwcmV2aWV3V2lkdGgsIHByZXZpZXdIZWlnaHQsCisgICAgICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6cHJldmlld0Zvcm1hdFRvRW51bShwYXJhbXMuZ2V0UHJldmlld0Zvcm1hdCgpKSwgbGF5ZXJNZXRhRGF0YSk7CisKKyAgICAgICAgICAgIGlmIChzdXJmYWNlQ29udHJvbC5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpUcmFuc2FjdGlvbnt9CisgICAgICAgICAgICAgICAgICAgIC5zZXRMYXllcihzdXJmYWNlQ29udHJvbCwgMHg3ZmZmZmZmZikKKyAgICAgICAgICAgICAgICAgICAgLnNob3coc3VyZmFjZUNvbnRyb2wpCisgICAgICAgICAgICAgICAgICAgIC5hcHBseSgpOworCisgICAgICAgICAgICAgICAgcHJldmlld1N1cmZhY2UgPSBzdXJmYWNlQ29udHJvbC0+Z2V0U3VyZmFjZSgpOworICAgICAgICAgICAgICAgIGNhbWVyYURldmljZS0+c2V0UHJldmlld1RhcmdldChwcmV2aWV3U3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhbWVyYURldmljZS0+c2V0UHJldmlld0NhbGxiYWNrRmxhZyhDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19DQU1DT1JERVIpOworCisgICAgICAgICAgICBWZWN0b3I8U2l6ZT4gcGljdHVyZVNpemVzOworICAgICAgICAgICAgcGFyYW1zLmdldFN1cHBvcnRlZFBpY3R1cmVTaXplcyhwaWN0dXJlU2l6ZXMpOworCisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBpY3R1cmVTaXplcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIHBhcmFtcy5zZXRQaWN0dXJlU2l6ZShwaWN0dXJlU2l6ZXNbaV0ud2lkdGgsIHBpY3R1cmVTaXplc1tpXS5oZWlnaHQpOworICAgICAgICAgICAgICAgIGNhbWVyYURldmljZS0+c2V0UGFyYW1ldGVycyhwYXJhbXMuZmxhdHRlbigpKTsKKyAgICAgICAgICAgICAgICBjYW1lcmFEZXZpY2UtPnN0YXJ0UHJldmlldygpOworICAgICAgICAgICAgICAgIHdhaXRGb3JQcmV2aWV3U3RhcnQoKTsKKyAgICAgICAgICAgICAgICBjYW1lcmFEZXZpY2UtPmF1dG9Gb2N1cygpOworICAgICAgICAgICAgICAgIHdhaXRGb3JFdmVudChtQXV0b0ZvY3VzTG9jaywgbUF1dG9Gb2N1c0NvbmRpdGlvbiwgbUF1dG9Gb2N1c01lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJvb2wgc2hvdWxkUGFzc0ludmFsaWRDYW1lcmFNc2cgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpOworICAgICAgICAgICAgICAgIGludCBtc2dUeXBlOworICAgICAgICAgICAgICAgIGlmIChzaG91bGRQYXNzSW52YWxpZENhbWVyYU1zZykgeworICAgICAgICAgICAgICAgICAgICBtc2dUeXBlID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPGludD4oKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtc2dUeXBlID0ga0NhbWVyYU1zZ1ttRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICAwLCBrTnVtQ2FtZXJhTXNnIC0gMSldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYW1lcmFEZXZpY2UtPnRha2VQaWN0dXJlKG1zZ1R5cGUpOworCisgICAgICAgICAgICAgICAgd2FpdEZvckV2ZW50KG1TbmFwc2hvdExvY2ssIG1TbmFwc2hvdENvbmRpdGlvbiwgbVNuYXBzaG90Tm90aWZpY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVmVjdG9yPFNpemU+IHZpZGVvU2l6ZXM7CisgICAgICAgICAgICBwYXJhbXMuZ2V0U3VwcG9ydGVkVmlkZW9TaXplcyh2aWRlb1NpemVzKTsKKworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2aWRlb1NpemVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLnNldFZpZGVvU2l6ZSh2aWRlb1NpemVzW2ldLndpZHRoLCB2aWRlb1NpemVzW2ldLmhlaWdodCk7CisKKyAgICAgICAgICAgICAgICBjYW1lcmFEZXZpY2UtPnNldFBhcmFtZXRlcnMocGFyYW1zLmZsYXR0ZW4oKSk7CisgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlLT5zdGFydFByZXZpZXcoKTsKKyAgICAgICAgICAgICAgICB3YWl0Rm9yUHJldmlld1N0YXJ0KCk7CisgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlLT5zZXRWaWRlb0J1ZmZlck1vZGUoCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpCbkNhbWVyYTo6VklERU9fQlVGRkVSX01PREVfQlVGRkVSX1FVRVVFKTsKKyAgICAgICAgICAgICAgICBjYW1lcmFEZXZpY2UtPnNldFZpZGVvVGFyZ2V0KHByZXZpZXdTdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkpOworICAgICAgICAgICAgICAgIGNhbWVyYURldmljZS0+c3RhcnRSZWNvcmRpbmcoKTsKKyAgICAgICAgICAgICAgICBjYW1lcmFEZXZpY2UtPnN0b3BSZWNvcmRpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhbWVyYURldmljZS0+c3RvcFByZXZpZXcoKTsKKyAgICAgICAgICAgIGNhbWVyYURldmljZS0+ZGlzY29ubmVjdCgpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENhbWVyYUZ1enplcjo6cHJvY2Vzcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIG1GdXp6ZWREYXRhUHJvdmlkZXIgPSBuZXcgRnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOworICAgIGdldE51bUNhbWVyYXMoKTsKKyAgICBpbnZva2VDYW1lcmFTb3VuZCgpOworICAgIGlmIChtTnVtQ2FtZXJhcyA+IDApIHsKKyAgICAgICAgaW52b2tlQ2FtZXJhQVBJcygpOworICAgIH0KKyAgICBpbnZva2VEdW1wKCk7CisgICAgaW52b2tlU2hlbGxDb21tYW5kKCk7CisgICAgaW52b2tlTm90aWZ5Q2FsbHMoKTsKKyAgICBkZWxldGUgbUZ1enplZERhdGFQcm92aWRlcjsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplIDwgMSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc3A8Q2FtZXJhRnV6emVyPiBjYW1lcmFmdXp6ZXIgPSBuZXcgQ2FtZXJhRnV6emVyKCk7CisgICAgaWYgKCFjYW1lcmFmdXp6ZXIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChjYW1lcmFmdXp6ZXItPmluaXQoKSkgeworICAgICAgICBjYW1lcmFmdXp6ZXItPnByb2Nlc3MoZGF0YSwgc2l6ZSk7CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggM2VhZDcxNS4uYjUzMDM0MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rCkBAIC01MSw2ICs1MSw5IEBACiBMT0NBTF9TQU5JVElaRSA6PSBhZGRyZXNzCiAKIExPQ0FMX01PRFVMRTo9IGNhbWVyYXNlcnZpY2VfdGVzdAorTE9DQUxfTElDRU5TRV9LSU5EUzo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKK0xPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUzo9IG5vdGljZQorTE9DQUxfTk9USUNFX0ZJTEU6PSAkKExPQ0FMX1BBVEgpLy4uL05PVElDRQogTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBkZXZpY2UtdGVzdHMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5icAppbmRleCBjNGVmYmFhLi42Nzg4YWZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMjAgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X3NlcnZpY2VzX21lZGlhY29kZWNfbGljZW5zZSJdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9zZXJ2aWNlc19tZWRpYWNvZGVjX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2JpbmFyeSB7CiAgICAgbmFtZTogIm1lZGlhc3djb2RlYyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKQEAgLTE1LDE4ICszMiw2IEBACiAgICAgICAgICJsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50IiwKICAgICBdLAogCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIGFuZHJvaWQ6IHsKLSAgICAgICAgICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7Ci0gICAgICAgICAgICAgICAgbWFsbG9jX25vdF9zdmVsdGU6IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2N1ZG8gaW5jcmVhc2VzIG1lbW9yeSBmb290cHJpbnQsIHNvIG9ubHkgZW5hYmxlIG9uCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vbi1zdmVsdGUgZGV2aWNlcy4KLSAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsibGliY19zY3VkbyJdLAotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICB9LAotICAgICAgICB9LAotICAgIH0sCi0KICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0FuZHJvaWQuYnAKaW5kZXggMDQ0MWNmYS4uNjk2Yjk2NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfc2VydmljZXNfbWVkaWFjb2RlY19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9zZXJ2aWNlc19tZWRpYWNvZGVjX2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50IiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLApAQCAtNTUsNCArNjQsMyBAQAogICAgICAgICAibGliY29kZWMyX3NvZnRfZ3NtZGVjIiwKICAgICBdLAogfQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMteDg2LnBvbGljeSBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5CmluZGV4IGE5ZDMyZDYuLjRiY2MwNzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5CisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5CkBAIC0yNyw2ICsyNyw3IEBACiBtbWFwOiAxCiBmc3RhdDY0OiAxCiBmc3RhdDogMQorc3RhdDogMQogc3RhdDY0OiAxCiBzdGF0ZnM2NDogMQogbWFkdmlzZTogMQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Nl82NC5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMteDg2XzY0LnBvbGljeQppbmRleCBhOWQzMmQ2Li40YmNjMDc3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMteDg2XzY0LnBvbGljeQorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMteDg2XzY0LnBvbGljeQpAQCAtMjcsNiArMjcsNyBAQAogbW1hcDogMQogZnN0YXQ2NDogMQogZnN0YXQ6IDEKK3N0YXQ6IDEKIHN0YXQ2NDogMQogc3RhdGZzNjQ6IDEKIG1hZHZpc2U6IDEKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLXg4Ni5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy14ODYucG9saWN5CmluZGV4IGViNzFlMjguLjliYWZlN2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLXg4Ni5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2LnBvbGljeQpAQCAtMjcsNiArMjcsNyBAQAogbW1hcDogMQogZnN0YXQ2NDogMQogZnN0YXQ6IDEKK3N0YXQ6IDEKIHN0YXQ2NDogMQogc3RhdGZzNjQ6IDEKIG1hZHZpc2U6IDEKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLXg4Nl82NC5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy14ODZfNjQucG9saWN5CmluZGV4IGU3MmQ0ZGIuLmIwZWQwNDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLXg4Nl82NC5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2XzY0LnBvbGljeQpAQCAtMjcsNiArMjcsNyBAQAogbW1hcDogMQogZnN0YXQ2NDogMQogZnN0YXQ6IDEKK3N0YXQ6IDEKIHN0YXQ2NDogMQogc3RhdGZzNjQ6IDEKIG1hZHZpc2U6IDEKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwCmluZGV4IDBiMjVkNjIuLjg1Y2UxMTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5icApAQCAtMSw0ICsxLDIzIEBACiAvLyBzZXJ2aWNlIGxpYnJhcnkKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9zZXJ2aWNlc19tZWRpYWV4dHJhY3Rvcl9saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9zZXJ2aWNlc19tZWRpYWV4dHJhY3Rvcl9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYm1lZGlhZXh0cmFjdG9yc2VydmljZSIsCiAgICAgY2ZsYWdzOiBbCkBAIC0zNSwyMCArNTQsNiBAQAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYmF2c2VydmljZXNfbWluaWphaWwiLAogICAgIF0sCi0gICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImJpb25pY19saWJjX3BsYXRmb3JtX2hlYWRlcnMiLAotICAgIF0sCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIGFuZHJvaWQ6IHsKLSAgICAgICAgICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7Ci0gICAgICAgICAgICAgICAgbWFsbG9jX25vdF9zdmVsdGU6IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2N1ZG8gaW5jcmVhc2VzIG1lbW9yeSBmb290cHJpbnQsIHNvIG9ubHkgZW5hYmxlIG9uCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vbi1zdmVsdGUgZGV2aWNlcy4KLSAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsibGliY19zY3VkbyJdLAotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICB9LAotICAgICAgICB9LAotICAgIH0sCiAgICAgaW5pdF9yYzogWyJtZWRpYWV4dHJhY3Rvci5yYyJdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC04MSw0ICs4NiwzIEBACiAgICAgICAgICJjb2RlX2NvdmVyYWdlLnBvbGljeSIsCiAgICAgXSwKIH0KLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKaW5kZXggOTk5MmQxYy4uNzFhNWJmZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCkBAIC0zOSwyMyArMzksMjMgQEAKIAogOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Om1ha2VFeHRyYWN0b3IoCiAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJRGF0YVNvdXJjZT4mIHJlbW90ZVNvdXJjZSwKLSAgICAgICAgY29uc3QgOjpzdGQ6OnVuaXF1ZV9wdHI8IDo6c3RkOjpzdHJpbmc+ICZtaW1lLAorICAgICAgICBjb25zdCA6OnN0ZDo6b3B0aW9uYWw8IDo6c3RkOjpzdHJpbmc+ICZtaW1lLAogICAgICAgICA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SU1lZGlhRXh0cmFjdG9yPiogX2FpZGxfcmV0dXJuKSB7Ci0gICAgQUxPR1YoIkBAQCBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Om1ha2VFeHRyYWN0b3IgZm9yICVzIiwgbWltZS5nZXQoKS0+Y19zdHIoKSk7CisgICAgQUxPR1YoIkBAQCBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Om1ha2VFeHRyYWN0b3IgZm9yICVzIiwgbWltZSA/IG1pbWUtPmNfc3RyKCkgOiBudWxscHRyKTsKIAogICAgIHNwPERhdGFTb3VyY2U+IGxvY2FsU291cmNlID0gQ3JlYXRlRGF0YVNvdXJjZUZyb21JRGF0YVNvdXJjZShyZW1vdGVTb3VyY2UpOwogCiAgICAgTWVkaWFCdWZmZXI6OnVzZVNoYXJlZE1lbW9yeSgpOwogICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGVGcm9tU2VydmljZSgKICAgICAgICAgICAgIGxvY2FsU291cmNlLAotICAgICAgICAgICAgbWltZS5nZXQoKSA/IG1pbWUuZ2V0KCktPmNfc3RyKCkgOiBudWxscHRyKTsKKyAgICAgICAgICAgIG1pbWUgPyBtaW1lLT5jX3N0cigpIDogbnVsbHB0cik7CiAKICAgICBBTE9HVigiZXh0cmFjdG9yIHNlcnZpY2UgY3JlYXRlZCAlcCAoJXMpIiwKICAgICAgICAgICAgIGV4dHJhY3Rvci5nZXQoKSwKICAgICAgICAgICAgIGV4dHJhY3RvciA9PSBudWxscHRyID8gIiIgOiBleHRyYWN0b3ItPm5hbWUoKSk7CiAKICAgICBpZiAoZXh0cmFjdG9yICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmVnaXN0ZXJNZWRpYUV4dHJhY3RvcihleHRyYWN0b3IsIGxvY2FsU291cmNlLCBtaW1lLmdldCgpID8gbWltZS5nZXQoKS0+Y19zdHIoKSA6IG51bGxwdHIpOworICAgICAgICByZWdpc3Rlck1lZGlhRXh0cmFjdG9yKGV4dHJhY3RvciwgbG9jYWxTb3VyY2UsIG1pbWUgPyBtaW1lLT5jX3N0cigpIDogbnVsbHB0cik7CiAgICAgfQogICAgICpfYWlkbF9yZXR1cm4gPSBleHRyYWN0b3I7CiAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaAppbmRleCAxYjQwYmY5Li4wMDgxZTdlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaApAQCAtMzMsNyArMzMsNyBAQAogCiAgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIG1ha2VFeHRyYWN0b3IoCiAgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SURhdGFTb3VyY2U+JiBzb3VyY2UsCi0gICAgICAgICAgICBjb25zdCA6OnN0ZDo6dW5pcXVlX3B0cjwgOjpzdGQ6OnN0cmluZz4gJm1pbWUsCisgICAgICAgICAgICBjb25zdCA6OnN0ZDo6b3B0aW9uYWw8IDo6c3RkOjpzdHJpbmc+ICZtaW1lLAogICAgICAgICAgICAgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklNZWRpYUV4dHJhY3Rvcj4qIF9haWRsX3JldHVybik7CiAKICAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgbWFrZUlEYXRhU291cmNlKApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21haW5fZXh0cmFjdG9yc2VydmljZS5jcHAKaW5kZXggZjIxNTc0Zi4uMTBiODEzNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tYWluX2V4dHJhY3RvcnNlcnZpY2UuY3BwCkBAIC0xNSw2ICsxNSw5IEBACiAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAibWFpbl9leHRyYWN0b3JzZXJ2aWNlIgorCiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgpAQCAtMjYsMTAgKzI5LDkgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9taXNjLmg+CiAKLSNpbmNsdWRlIDxiaW9uaWMvcmVzZXJ2ZWRfc2lnbmFscy5oPgotCiAvLyBmcm9tIExPQ0FMX0NfSU5DTFVERVMKICNpbmNsdWRlICJNZWRpYUV4dHJhY3RvclNlcnZpY2UuaCIKICNpbmNsdWRlICJtaW5pamFpbC5oIgpAQCAtNDMsMTcgKzQ1LDE5IEBACiAKIGludCBtYWluKGludCBhcmdjIF9fdW51c2VkLCBjaGFyKiogYXJndikKIHsKKworI2lmIF9faGFzX2ZlYXR1cmUoaHdhZGRyZXNzX3Nhbml0aXplcikKKyAgICBBTE9HSSgiZGlzYWJsZSBtZWRpYS5leHRyYWN0b3IgbWVtb3J5IGxpbWl0cyAoaHdhc2FuIGVuYWJsZWQpIik7CisjZWxzZQorICAgIEFMT0dJKCJlbmFibGUgbWVkaWEuZXh0cmFjdG9yIG1lbW9yeSBsaW1pdHMiKTsKICAgICBsaW1pdFByb2Nlc3NNZW1vcnkoCiAgICAgICAgICJyby5tZWRpYS5tYXhtZW0iLCAvKiBwcm9wZXJ0eSB0aGF0IGRlZmluZXMgbGltaXQgKi8KICAgICAgICAgU0laRV9NQVgsIC8qIHVwcGVyIGxpbWl0IGluIGJ5dGVzICovCiAgICAgICAgIDIwIC8qIHVwcGVyIGxpbWl0IGFzIHBlcmNlbnRhZ2Ugb2YgcGh5c2ljYWwgUkFNICovKTsKKyNlbmRpZgogCiAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwogCi0gICAgLy8gRG8gbm90IGFzc2lzdCBwbGF0Zm9ybSBwcm9maWxlcnMgKHJlbGV2YW50IG9ubHkgb24gZGVidWcgYnVpbGRzKS4KLSAgICAvLyBPdGhlcndpc2UsIHRoZSBzaWduYWwgaGFuZGxlciBjYW4gdmlvbGF0ZSB0aGUgc2VjY29tcCBwb2xpY3kuCi0gICAgc2lnbmFsKEJJT05JQ19TSUdOQUxfUFJPRklMRVIsIFNJR19JR04pOwotCiAgICAgLy9iLzYyMjU1OTU5OiB0aGlzIGZvcmNlcyBsaWJ1dGlzLnNvIHRvIGRsb3BlbiB2ZW5kb3IgdmVyc2lvbiBvZiBsaWJ1dGlscy5zbwogICAgIC8vYmVmb3JlIG1pbmlqYWlsIGlzIG9uLiBUaGlzIGlzIGRpcnR5IGJ1dCByZXF1aXJlZCBzaW5jZSBzb21lIHN5c2NhbGxzIHN1Y2gKICAgICAvL2FzIHByZWFkNjQgYXJlIHVzZWQgYnkgbGlua2VyIGJ1dCBhcmVuJ3QgYWxsb3dlZCBpbiB0aGUgbWluaWphaWwuIEJ5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icAppbmRleCA3NGI2M2Q1Li5jZmM0YzQwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAKQEAgLTEsNCArMSwxMyBAQAotY2NfbGlicmFyeV9zaGFyZWQgeworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWFsb2dzZXJ2aWNlIiwKIAogICAgIHNyY3M6IFsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL2Z1enplci9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFsb2cvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZmMGNlNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL2Z1enplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIm1lZGlhX2xvZ19mdXp6ZXIiLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYWxvZ3NlcnZpY2UiLAorICAgIF0sCisgICAgc3JjczogWworICAgICAgICAibWVkaWFfbG9nX2Z1enplci5jcHAiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYm5ibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYWxvZyIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvZnV6emVyL1JFQURNRS5tZCBiL3NlcnZpY2VzL21lZGlhbG9nL2Z1enplci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc5ZTVjOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw1MCBAQAorIyBGdXp6ZXIgZm9yIGxpYm1lZGlhbG9nc2VydmljZQorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgbGlibWVkaWFsb2dzZXJ2aWNlIGlzIGRlc2lnbmVkIGJhc2VkIG9uIHRoZSB1bmRlcnN0YW5kaW5nIG9mIHRoZQorc2VydmljZSBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSBub3QgaGFyZGNvZGVkLCBidXQgaW5zdGVhZCBzZWxlY3RlZCBiYXNlZCBvbgoraW5jb21pbmcgZGF0YS4gVGhpcyBlbnN1cmVzIG1vcmUgY29kZSBwYXRocyBhcmUgcmVhY2hlZCBieSB0aGUgZnV6emVyLgorCittZWRpYWxvZ3NlcnZpY2Ugc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorMS4gV3JpdGVyIG5hbWUgKHBhcmFtZXRlciBuYW1lOiBgd3JpdGVyTmFtZUlkeGApCisyLiBMb2cgc2l6ZSAocGFyYW1ldGVyIG5hbWU6IGBsb2dTaXplYCkKKzMuIEVuYWJsZSBkdW1wIGJlZm9yZSB1bnJnaXN0ZXIgQVBJIChwYXJhbWV0ZXIgbmFtZTogYHNob3VsZER1bXBCZWZvcmVVbnJlZ2lzdGVyYCkKKzUuIHNpemUgb2Ygc3RyaW5nIGZvciBsb2cgZHVtcCAocGFyYW1ldGVyIG5hbWU6IGBudW1iZXJPZkxpbmVzYCkKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGB3cml0ZXJOYW1lSWR4YCB8IDAuIGAwYCAxLiBgMWAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBsb2dTaXplYCB8IEluIHRoZSByYW5nZSBgMjU2IHRvIDY1NTM2YCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYHNob3VsZER1bXBCZWZvcmVVbnJlZ2lzdGVyYCB8IDAuIGAwYCAxLiBgMWAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBudW1iZXJPZkxpbmVzYCB8IEluIHRoZSByYW5nZSBgMCB0byA2NTUzNWAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8CisKK1RoaXMgYWxzbyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiBpcyBhbHdheXMgZGV0ZXJtaW5pc3RpYyBmb3IgYW55IGdpdmVuIGlucHV0LgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBtZWRpYV9sb2dfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBtZWRpYV9sb2dfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgZmlsZXMgdG8gdGhhdCBmb2xkZXIKK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbWVkaWFfbG9nX2Z1enplci9tZWRpYV9sb2dfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIyBSZWZlcmVuY2VzOgorICogaHR0cDovL2xsdm0ub3JnL2RvY3MvTGliRnV6emVyLmh0bWwKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvb3NzLWZ1enoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL2Z1enplci9tZWRpYV9sb2dfZnV6emVyLmNwcCBiL3NlcnZpY2VzL21lZGlhbG9nL2Z1enplci9tZWRpYV9sb2dfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDUwZDBmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvZnV6emVyL21lZGlhX2xvZ19mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNzYgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKyNpbmNsdWRlICJNZWRpYUxvZ1NlcnZpY2UuaCIKKyNpbmNsdWRlICJmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmgiCisKK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBrV3JpdGVyTmFtZXNbMl0gPSB7IkZhc3RNaXhlciIsICJGYXN0Q2FwdHVyZSJ9OworY29uc3RleHByIHNpemVfdCBrTWluU2l6ZSA9IDB4MTAwOworY29uc3RleHByIHNpemVfdCBrTWF4U2l6ZSA9IDB4MTAwMDA7Citjb25zdGV4cHIgc2l6ZV90IGtMb2dNZW1vcnlTaXplID0gNDAwICogMTAyNDsKK2NvbnN0ZXhwciBzaXplX3Qga01heE51bUxpbmVzID0gVVNIUlRfTUFYOworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgTWVkaWFMb2dGdXp6ZXIgeworICAgcHVibGljOgorICAgIHZvaWQgaW5pdCgpOworICAgIHZvaWQgcHJvY2Vzcyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgIHByaXZhdGU6CisgICAgc3A8TWVtb3J5RGVhbGVyPiBtTWVtb3J5RGVhbGVyID0gbnVsbHB0cjsKKyAgICBzcDxNZWRpYUxvZ1NlcnZpY2U+IG1TZXJ2aWNlID0gbnVsbHB0cjsKK307CisKK3ZvaWQgTWVkaWFMb2dGdXp6ZXI6OmluaXQoKSB7CisgICAgc2V0dWlkKEFJRF9NRURJQSk7CisgICAgbVNlcnZpY2UgPSBuZXcgTWVkaWFMb2dTZXJ2aWNlKCk7CisgICAgbU1lbW9yeURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIoa0xvZ01lbW9yeVNpemUsICJNZWRpYUxvZ0Z1enplciIsIE1lbW9yeUhlYXBCYXNlOjpSRUFEX09OTFkpOworfQorCit2b2lkIE1lZGlhTG9nRnV6emVyOjpwcm9jZXNzKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKyAgICBzaXplX3Qgd3JpdGVyTmFtZUlkeCA9CisgICAgICAgIGZ1enplZERhdGFQcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgc3RkOjpzaXplKGtXcml0ZXJOYW1lcykgLSAxKTsKKyAgICBib29sIHNob3VsZER1bXBCZWZvcmVVbnJlZ2lzdGVyID0gZnV6emVkRGF0YVByb3ZpZGVyLkNvbnN1bWVCb29sKCk7CisgICAgc2l6ZV90IGxvZ1NpemUgPSBmdXp6ZWREYXRhUHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KGtNaW5TaXplLCBrTWF4U2l6ZSk7CisgICAgc3A8SU1lbW9yeT4gbG9nQnVmZmVyID0gbU1lbW9yeURlYWxlci0+YWxsb2NhdGUoTkJMb2c6OlRpbWVsaW5lOjpzaGFyZWRTaXplKGxvZ1NpemUpKTsKKyAgICBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7CisgICAgc2l6ZV90IG51bWJlck9mTGluZXMgPSBmdXp6ZWREYXRhUHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIGtNYXhOdW1MaW5lcyk7CisgICAgZm9yIChzaXplX3QgbGluZUlkeCA9IDA7IGxpbmVJZHggPCBudW1iZXJPZkxpbmVzOyArK2xpbmVJZHgpIHsKKyAgICAgICAgYXJncy5hZGQoc3RhdGljX2Nhc3Q8U3RyaW5nMTY+KGZ1enplZERhdGFQcm92aWRlci5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSkpOworICAgIH0KKyAgICBjb25zdCBjaGFyKiBmaWxlTmFtZSA9ICJsb2dEdW1wRmlsZSI7CisgICAgaW50IGZkID0gbWVtZmRfY3JlYXRlKGZpbGVOYW1lLCBNRkRfQUxMT1dfU0VBTElORyk7CisgICAgZnV6emVkRGF0YVByb3ZpZGVyLkNvbnN1bWVEYXRhKGxvZ0J1ZmZlci0+dW5zZWN1cmVQb2ludGVyKCksIGxvZ0J1ZmZlci0+c2l6ZSgpKTsKKyAgICBtU2VydmljZS0+cmVnaXN0ZXJXcml0ZXIobG9nQnVmZmVyLCBsb2dTaXplLCBrV3JpdGVyTmFtZXNbd3JpdGVyTmFtZUlkeF0pOworICAgIGlmIChzaG91bGREdW1wQmVmb3JlVW5yZWdpc3RlcikgeworICAgICAgICBtU2VydmljZS0+ZHVtcChmZCwgYXJncyk7CisgICAgICAgIG1TZXJ2aWNlLT51bnJlZ2lzdGVyV3JpdGVyKGxvZ0J1ZmZlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlcnZpY2UtPnVucmVnaXN0ZXJXcml0ZXIobG9nQnVmZmVyKTsKKyAgICAgICAgbVNlcnZpY2UtPmR1bXAoZmQsIGFyZ3MpOworICAgIH0KK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIE1lZGlhTG9nRnV6emVyIG1lZGlhTG9nRnV6emVyID0gTWVkaWFMb2dGdXp6ZXIoKTsKKyAgICBtZWRpYUxvZ0Z1enplci5pbml0KCk7CisgICAgbWVkaWFMb2dGdXp6ZXIucHJvY2VzcyhkYXRhLCBzaXplKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAKaW5kZXggOTE1OTBlMS4uZjEzY2E3NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAKQEAgLTEsNiArMSwxNSBAQAogLy8gTWVkaWEgU3RhdGlzdGljcyBzZXJ2aWNlCiAvLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIHRpZHlfZXJyb3JzID0gWwogICAgIC8vIGh0dHBzOi8vY2xhbmcubGx2bS5vcmcvZXh0cmEvY2xhbmctdGlkeS9jaGVja3MvbGlzdC5odG1sCiAgICAgLy8gRm9yIG1hbnkgY2F0ZWdvcmllcywgdGhlIGNoZWNrcyBhcmUgdG9vIG1hbnkgdG8gc3BlY2lmeSBpbmRpdmlkdWFsbHkuCkBAIC0yMSw3ICszMCw3IEBACiAgICAgIm1vZGVybml6ZS1sb29wLWNvbnZlcnQiLAogICAgICJtb2Rlcm5pemUtbWFrZS1zaGFyZWQiLAogICAgICJtb2Rlcm5pemUtbWFrZS11bmlxdWUiLAotICAgICJtb2Rlcm5pemUtcGFzcy1ieS12YWx1ZSIsCisgICAgLy8gIm1vZGVybml6ZS1wYXNzLWJ5LXZhbHVlIiwgLy8gZm91bmQgaW4gVGltZU1hY2hpbmUuaAogICAgICJtb2Rlcm5pemUtcmF3LXN0cmluZy1saXRlcmFsIiwKICAgICAibW9kZXJuaXplLXJlZHVuZGFudC12b2lkLWFyZyIsCiAgICAgIm1vZGVybml6ZS1yZXBsYWNlLWF1dG8tcHRyIiwKQEAgLTI5LDEzICszOCwxMyBAQAogICAgICJtb2Rlcm5pemUtcmV0dXJuLWJyYWNlZC1pbml0LWxpc3QiLAogICAgICJtb2Rlcm5pemUtc2hyaW5rLXRvLWZpdCIsCiAgICAgIm1vZGVybml6ZS11bmFyeS1zdGF0aWMtYXNzZXJ0IiwKLSAgICAibW9kZXJuaXplLXVzZS1hdXRvIiwgIC8vIGRlYmF0YWJsZSAtIGF1dG8gY2FuIG9ic2N1cmUgdHlwZQorICAgIC8vICJtb2Rlcm5pemUtdXNlLWF1dG8iLCAgLy8gZm91bmQgaW4gTWVkaWFNZXRyaWNzU2VydmljZS5oLCBkZWJhdGFibGUgLSBhdXRvIGNhbiBvYnNjdXJlIHR5cGUKICAgICAibW9kZXJuaXplLXVzZS1ib29sLWxpdGVyYWxzIiwKICAgICAibW9kZXJuaXplLXVzZS1kZWZhdWx0LW1lbWJlci1pbml0IiwKICAgICAibW9kZXJuaXplLXVzZS1lbXBsYWNlIiwKICAgICAibW9kZXJuaXplLXVzZS1lcXVhbHMtZGVmYXVsdCIsCiAgICAgIm1vZGVybml6ZS11c2UtZXF1YWxzLWRlbGV0ZSIsCi0gICAgIm1vZGVybml6ZS11c2Utbm9kaXNjYXJkIiwKKyAgICAvLyAibW9kZXJuaXplLXVzZS1ub2Rpc2NhcmQiLCAvLyBmb3VuZCBpbiBUaW1lTWFjaGluZS5oCiAgICAgIm1vZGVybml6ZS11c2Utbm9leGNlcHQiLAogICAgICJtb2Rlcm5pemUtdXNlLW51bGxwdHIiLAogICAgICJtb2Rlcm5pemUtdXNlLW92ZXJyaWRlIiwKQEAgLTQ4LDYgKzU3LDExIEBACiAgICAgLy8gUmVtb3ZlIHNvbWUgcGVkYW50aWMgc3R5bGlzdGljIHJlcXVpcmVtZW50cy4KICAgICAiLWdvb2dsZS1yZWFkYWJpbGl0eS1jYXN0aW5nIiwgLy8gQysrIGNhc3RzIG5vdCBhbHdheXMgbmVjZXNzYXJ5IGFuZCBtYXkgYmUgdmVyYm9zZQogICAgICItZ29vZ2xlLXJlYWRhYmlsaXR5LXRvZG8iLCAgICAvLyBkbyBub3QgcmVxdWlyZSBUT0RPKGluZm8pCisKKyAgICAiLWJ1Z3Byb25lLXVuaGFuZGxlZC1zZWxmLWFzc2lnbm1lbnQiLCAvLyBmb3VuZCBpbiBUaW1lTWFjaGluZS5oCisgICAgIi1idWdwcm9uZS1zdXNwaWNpb3VzLXN0cmluZy1jb21wYXJlIiwgLy8gZm91bmQgaW4gVGltZU1hY2hpbmUuaAorICAgICItY2VydC1vb3A1NC1jcHAiLCAvLyBmb3VuZCBpbiBUcmFuc2FjdGlvbkxvZy5oCisgICAgIi1idWdwcm9uZS1uYXJyb3dpbmctY29udmVyc2lvbnMiLCAvLyBiLzE4MjQxMDg0NQogXQogCiBjY19kZWZhdWx0cyB7CkBAIC03OSw4ICs5Myw3IEBACiAgICAgdGlkeV9jaGVja3M6IHRpZHlfZXJyb3JzLAogICAgIHRpZHlfY2hlY2tzX2FzX2Vycm9yczogdGlkeV9lcnJvcnMsCiAgICAgdGlkeV9mbGFnczogWwotICAgICAgIi1mb3JtYXQtc3R5bGU9J2ZpbGUnIiwKLSAgICAgICItLWhlYWRlci1maWx0ZXI9J2ZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFtZXRyaWNzLyciLAorICAgICAgIi1mb3JtYXQtc3R5bGU9ZmlsZSIsCiAgICAgXSwKIH0KIApAQCAtMTExLDcgKzEyNCw3IEBACiAgICAgXSwKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm1lZGlhbWV0cmljc3NlcnZpY2UiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJtZWRpYW1ldHJpY3NfZmxhZ3NfZGVmYXVsdHMiLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvQW5hbHl0aWNzLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb0FuYWx5dGljcy5jcHAKaW5kZXggZDc4ZDFlMy4uMmE1MjU5OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvQW5hbHl0aWNzLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9BbmFseXRpY3MuY3BwCkBAIC0zNDgsNyArMzQ4LDcgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc3MgPDwgIlN0YXRzZCBhdG9tczpcbiIgPDwgc3RhdHNkOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbGwgLT0gbjsKKyAgICAgICAgICAgIGxsIC09IChpbnQzMl90KW47CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTczNyw3ICs3MzcsNyBAQAogICAgICAgICBtQTJkcENvbm5lY3Rpb25TZXJ2aWNlTnMgPSAwOwogICAgICAgICArK21BMmRwQ29ubmVjdGlvblN1Y2Nlc3NlczsKIAotICAgICAgICBjb25zdCBhdXRvIGNvbm5lY3Rpb25UaW1lTXMgPSBmbG9hdCh0aW1lRGlmZk5zICogMWUtNik7CisgICAgICAgIGNvbnN0IGF1dG8gY29ubmVjdGlvblRpbWVNcyA9IGZsb2F0KChkb3VibGUpdGltZURpZmZOcyAqIDFlLTYpOwogCiAgICAgICAgIGNvbnN0IGF1dG8gb3V0cHV0RGV2aWNlQml0cyA9IHR5cGVzOjpsb29rdXA8dHlwZXM6Ok9VVFBVVF9ERVZJQ0UsIGxvbmdfZW51bV90eXBlX3Q+KAogICAgICAgICAgICAgICAgICJBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQIik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9Qb3dlclVzYWdlLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1Bvd2VyVXNhZ2UuY3BwCmluZGV4IDMzZGZhOGZhLi5lNTg0ZjEyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9Qb3dlclVzYWdlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9Qb3dlclVzYWdlLmNwcApAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8c3RhdHNsb2cuaD4KICNpbmNsdWRlIDxzeXMvdGltZXJmZC5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby1iYXNlLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKIC8vIHByb3BlcnR5IHRvIGRpc2FibGUgYXVkaW8gcG93ZXIgdXNlIG1ldHJpY3MgZmVhdHVyZSwgZGVmYXVsdCBpcyBlbmFibGVkCiAjZGVmaW5lIFBST1BfQVVESU9fTUVUUklDU19ESVNBQkxFRCAicGVyc2lzdC5tZWRpYS5hdWRpb19tZXRyaWNzLnBvd2VyX3VzYWdlX2Rpc2FibGVkIgpAQCAtMTc0LDggKzE3NCw4IEBACiAgICAgICAgIGlmIChpdGVtX2RldmljZSA9PSBkZXZpY2UgJiYgaXRlbV90eXBlID09IHR5cGUpIHsKICAgICAgICAgICAgIGludDY0X3QgZmluYWxfZHVyYXRpb25fbnMgPSBpdGVtX2R1cmF0aW9uX25zICsgZHVyYXRpb25fbnM7CiAgICAgICAgICAgICBkb3VibGUgZmluYWxfdm9sdW1lID0gKGRldmljZSAmIElOUFVUX0RFVklDRV9CSVQpID8gMS4wOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaXRlbV92b2x1bWUgKiBpdGVtX2R1cmF0aW9uX25zICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlX3ZvbCAqIGR1cmF0aW9uX25zKSAvIGZpbmFsX2R1cmF0aW9uX25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGl0ZW1fdm9sdW1lICogKGRvdWJsZSlpdGVtX2R1cmF0aW9uX25zICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlX3ZvbCAqIChkb3VibGUpZHVyYXRpb25fbnMpIC8gKGRvdWJsZSlmaW5hbF9kdXJhdGlvbl9ucyk7CiAKICAgICAgICAgICAgIGl0ZW0tPnNldEludDY0KEFVRElPX1BPV0VSX1VTQUdFX1BST1BfRFVSQVRJT05fTlMsIGZpbmFsX2R1cmF0aW9uX25zKTsKICAgICAgICAgICAgIGl0ZW0tPnNldERvdWJsZShBVURJT19QT1dFUl9VU0FHRV9QUk9QX1ZPTFVNRSwgZmluYWxfdm9sdW1lKTsKQEAgLTI4OSw3ICsyODksNyBAQAogICAgICAgICBjb25zdCBpbnQ2NF90IGR1cmF0aW9uTnMgPSBlbmRDYWxsTnMgLSBtRGV2aWNlVGltZU5zOwogICAgICAgICBpZiAoZHVyYXRpb25OcyA+IDApIHsKICAgICAgICAgICAgIG1EZXZpY2VWb2x1bWUgPSAobURldmljZVZvbHVtZSAqIGRvdWJsZShtVm9sdW1lVGltZU5zIC0gbURldmljZVRpbWVOcykgKwotICAgICAgICAgICAgICAgICAgICBtVm9pY2VWb2x1bWUgKiBkb3VibGUoZW5kQ2FsbE5zIC0gbVZvbHVtZVRpbWVOcykpIC8gZHVyYXRpb25OczsKKyAgICAgICAgICAgICAgICAgICAgbVZvaWNlVm9sdW1lICogZG91YmxlKGVuZENhbGxOcyAtIG1Wb2x1bWVUaW1lTnMpKSAvIChkb3VibGUpZHVyYXRpb25OczsKICAgICAgICAgICAgIHNhdmVBc0l0ZW1zX2wobVByaW1hcnlEZXZpY2UsIGR1cmF0aW9uTnMsIFZPSUNFX0NBTExfVFlQRSwgbURldmljZVZvbHVtZSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gIkFVRElPX01PREVfSU5fQ0FMTCIpIHsgLy8gZW50ZXJpbmcgY2FsbCBtb2RlCkBAIC0zMTcsNyArMzE3LDcgQEAKICAgICAgICAgY29uc3QgaW50NjRfdCBkdXJhdGlvbk5zID0gdGltZU5zIC0gbURldmljZVRpbWVOczsKICAgICAgICAgaWYgKGR1cmF0aW9uTnMgPiAwKSB7CiAgICAgICAgICAgICBtRGV2aWNlVm9sdW1lID0gKG1EZXZpY2VWb2x1bWUgKiBkb3VibGUobVZvbHVtZVRpbWVOcyAtIG1EZXZpY2VUaW1lTnMpICsKLSAgICAgICAgICAgICAgICAgICAgbVZvaWNlVm9sdW1lICogZG91YmxlKHRpbWVOcyAtIG1Wb2x1bWVUaW1lTnMpKSAvIGR1cmF0aW9uTnM7CisgICAgICAgICAgICAgICAgICAgIG1Wb2ljZVZvbHVtZSAqIGRvdWJsZSh0aW1lTnMgLSBtVm9sdW1lVGltZU5zKSkgLyAoZG91YmxlKWR1cmF0aW9uTnM7CiAgICAgICAgICAgICBtVm9sdW1lVGltZU5zID0gdGltZU5zOwogICAgICAgICB9CiAgICAgfQpAQCAtMzQ4LDcgKzM0OCw3IEBACiAgICAgICAgIGNvbnN0IGludDY0X3QgZHVyYXRpb25OcyA9IGVuZERldmljZU5zIC0gbURldmljZVRpbWVOczsKICAgICAgICAgaWYgKGR1cmF0aW9uTnMgPiAwKSB7CiAgICAgICAgICAgICBtRGV2aWNlVm9sdW1lID0gKG1EZXZpY2VWb2x1bWUgKiBkb3VibGUobVZvbHVtZVRpbWVOcyAtIG1EZXZpY2VUaW1lTnMpICsKLSAgICAgICAgICAgICAgICAgICAgbVZvaWNlVm9sdW1lICogZG91YmxlKGVuZERldmljZU5zIC0gbVZvbHVtZVRpbWVOcykpIC8gZHVyYXRpb25OczsKKyAgICAgICAgICAgICAgICAgICAgbVZvaWNlVm9sdW1lICogZG91YmxlKGVuZERldmljZU5zIC0gbVZvbHVtZVRpbWVOcykpIC8gKGRvdWJsZSlkdXJhdGlvbk5zOwogICAgICAgICAgICAgc2F2ZUFzSXRlbXNfbChtUHJpbWFyeURldmljZSwgZHVyYXRpb25OcywgVk9JQ0VfQ0FMTF9UWVBFLCBtRGV2aWNlVm9sdW1lKTsKICAgICAgICAgfQogICAgICAgICAvLyByZXNldCBzdGF0aXN0aWNzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzU2VydmljZS5jcHAKaW5kZXggYmY2ZTQyOC4uMGU4OTA1NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL01lZGlhTWV0cmljc1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3NTZXJ2aWNlLmNwcApAQCAtMTA3LDcgKzEwNyw3IEBACiB7CiAgICAgQUxPR0QoIiVzIiwgX19mdW5jX18pOwogICAgIC8vIHRoZSBjbGFzcyBkZXN0cnVjdG9yIGNsZWFycyBhbnlob3csIGJ1dCB3ZSBlbmZvcmNlIGNsZWFyaW5nIGl0ZW1zIGZpcnN0LgotICAgIG1JdGVtc0Rpc2NhcmRlZCArPSBtSXRlbXMuc2l6ZSgpOworICAgIG1JdGVtc0Rpc2NhcmRlZCArPSAoaW50NjRfdCltSXRlbXMuc2l6ZSgpOwogICAgIG1JdGVtcy5jbGVhcigpOwogfQogCkBAIC0yODcsNyArMjg3LDcgQEAKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIF9sKG1Mb2NrKTsKIAogICAgICAgICBpZiAoY2xlYXIpIHsKLSAgICAgICAgICAgIG1JdGVtc0Rpc2NhcmRlZCArPSBtSXRlbXMuc2l6ZSgpOworICAgICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkICs9IChpbnQ2NF90KW1JdGVtcy5zaXplKCk7CiAgICAgICAgICAgICBtSXRlbXMuY2xlYXIoKTsKICAgICAgICAgICAgIG1BdWRpb0FuYWx5dGljcy5jbGVhcigpOwogICAgICAgICB9IGVsc2UgewpAQCAtNDE2LDEwICs0MTYsMTAgQEAKIAogICAgIGlmIChjb25zdCBzaXplX3QgdG9FcmFzZSA9IG92ZXJsaW1pdCArIGV4cGlyZWQ7CiAgICAgICAgICAgICB0b0VyYXNlID4gMCkgewotICAgICAgICBtSXRlbXNEaXNjYXJkZWRDb3VudCArPSBvdmVybGltaXQ7Ci0gICAgICAgIG1JdGVtc0Rpc2NhcmRlZEV4cGlyZSArPSBleHBpcmVkOwotICAgICAgICBtSXRlbXNEaXNjYXJkZWQgKz0gdG9FcmFzZTsKLSAgICAgICAgbUl0ZW1zLmVyYXNlKG1JdGVtcy5iZWdpbigpLCBtSXRlbXMuYmVnaW4oKSArIHRvRXJhc2UpOyAvLyBlcmFzZSBmcm9tIGZyb250CisgICAgICAgIG1JdGVtc0Rpc2NhcmRlZENvdW50ICs9IChpbnQ2NF90KW92ZXJsaW1pdDsKKyAgICAgICAgbUl0ZW1zRGlzY2FyZGVkRXhwaXJlICs9IChpbnQ2NF90KWV4cGlyZWQ7CisgICAgICAgIG1JdGVtc0Rpc2NhcmRlZCArPSAoaW50NjRfdCl0b0VyYXNlOworICAgICAgICBtSXRlbXMuZXJhc2UobUl0ZW1zLmJlZ2luKCksIG1JdGVtcy5iZWdpbigpICsgKHB0cmRpZmZfdCl0b0VyYXNlKTsgLy8gZXJhc2UgZnJvbSBmcm9udAogICAgIH0KICAgICByZXR1cm4gbW9yZTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9iZW5jaG1hcmtzL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvYmVuY2htYXJrcy9BbmRyb2lkLmJwCmluZGV4IGI2MWY0NGYuLjY4ZDQxNDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9iZW5jaG1hcmtzL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2JlbmNobWFya3MvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJtZWRpYW1ldHJpY3NfYmVuY2htYXJrcyIsCiAgICAgc3JjczogWyJtZWRpYW1ldHJpY3NfYmVuY2htYXJrcy5jcHAiXSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9mdXp6ZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9mdXp6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDUzNjY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtZWRpYW1ldHJpY3Nfc2VydmljZV9mdXp6ZXIiLAorCisgICAgc3JjczogWworICAgICAgICAibWVkaWFtZXRyaWNzX3NlcnZpY2VfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgICAibGlibWVkaWFtZXRyaWNzc2VydmljZSIsCisgICAgICAgICJsaWJwbGF0Zm9ybXByb3RvcyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnN0YXRzbG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL21lZGlhbWV0cmljcyIsCisgICAgICAgICJzeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHMvaW5jbHVkZSIsCisgICAgXSwKKworICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9mdXp6ZXIvUkVBRE1FLm1kIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzODMwZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTQgQEAKKyMgRnV6emVyIGZvciBsaWJtZWRpYW1ldHJpY3NzZXJ2aWNlCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBsaWJtZWRpYW1ldHJpY3NzZXJ2aWNlIGlzIGRlc2lnbmVkIGJhc2VkIG9uIHRoZQordW5kZXJzdGFuZGluZyBvZiB0aGUgc2VydmljZSBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSBub3QgaGFyZGNvZGVkLCBidXQgaW5zdGVhZCBzZWxlY3RlZCBiYXNlZCBvbgoraW5jb21pbmcgZGF0YS4gVGhpcyBlbnN1cmVzIG1vcmUgY29kZSBwYXRocyBhcmUgcmVhY2hlZCBieSB0aGUgZnV6emVyLgorCitNZWRpYSBNZXRyaWNzIFNlcnZpY2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyBtb2R1bGVzOgorMS4gTWVkaWEgTWV0cmljcyBJdGVtIE1hbmlwdWxhdGlvbiAobW9kdWxlIG5hbWU6IGBJdGVtYCkKKzIuIE1lZGlhIE1ldHJpY3MgVGltZSBNYWNoaW5lIFN0b3JhZ2UgKG1vZHVsZSBuYW1lOiBgVGltZU1hY2hpbmVTdG9yYWdlYCkKKzMuIE1lZGlhIE1ldHJpY3MgVHJhbnNhY3Rpb24gTG9nIChtb2R1bGUgbmFtZTogYFRyYW5zYWN0aW9uTG9nYCkKKzQuIE1lZGlhIE1ldHJpY3MgQW5hbHl0aWNzIEFjdGlvbiAobW9kdWxlIG5hbWU6IGBBbmFseXRpY3NBY3Rpb25gKQorNS4gTWVkaWEgTWV0cmljcyBBdWRpbyBBbmFseXRpY3MgKG1vZHVsZSBuYW1lOiBgQXVkaW9BbmFseXRpY3NgKQorNi4gTWVkaWEgTWV0cmljcyBUaW1lZCBBY3Rpb24gKG1vZHVsZSBuYW1lOiBgVGltZWRBY3Rpb25gKQorCit8IE1vZHVsZXwgVmFsaWQgSW5wdXQgVmFsdWVzfCBDb25maWd1cmVkIFZhbHVlfAorfC0tLS0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS18IC0tLS0tIHwKK3wgYEl0ZW1gIHwgS2V5OiBgc3RkOjpzdHJpbmdgLiBWYWx1ZXM6IGBJTlQzMl9NSU5gIHRvIGBJTlQzMl9NQVhgLCBgSU5UNjRfTUlOYCB0byBgSU5UNjRfTUFYYCwgYHN0ZDo6c3RyaW5nYCwgYGRvdWJsZWAsIGBwYWlyPElOVDMyX01JTiB0byBJTlQzMl9NQVgsIElOVDMyX01JTiB0byBJTlQzMl9NQVg+YCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYFRpbWVNYWNoaW5lU3RvcmFnZWAgICB8IEtleTogYHN0ZDo6c3RyaW5nYC4gVmFsdWVzOiBgSU5UMzJfTUlOYCB0byBgSU5UMzJfTUFYYCwgYElOVDY0X01JTmAgdG8gYElOVDY0X01BWGAsIGBzdGQ6OnN0cmluZ2AsIGBkb3VibGVgLCBgcGFpcjxJTlQzMl9NSU4gdG8gSU5UMzJfTUFYLCBJTlQzMl9NSU4gdG8gSU5UMzJfTUFYPmAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBUcmFuc2NhdGlvbkxvZ2AgICB8IGBtZWRpYW1ldHJpY3M6Okl0ZW1gIHwgYG1lZGlhbWV0cmljczo6SXRlbWAgY3JlYXRlZCBieSBvYnRhaW5pbmcgdmFsdWVzIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfCBgQW5hbHl0aWNzQWN0aW9uYCAgIHwgVVJMOiBgc3RkOjpzdHJpbmdgIGVuZGluZyB3aXRoIC5ldmVudCwgVmFsdWU6IGBzdGQ6OnN0cmluZ2AsIGFjdGlvbjogQSBmdW5jdGlvbiB8IFVSTCBhbmQgVmFsdWVzIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyLCBhIHBsYWNlaG9sZGVyIGZ1bmN0aW9uIHdhcyBwYXNzZWQgYXMgYWN0aW9ufAorfCBgQXVkaW9BbmFseXRpY3NgICAgfCBgbWVkaWFtZXRyaWNzOjpJdGVtYCB8IGBtZWRpYW1ldHJpY3M6Okl0ZW1gIGNyZWF0ZWQgYnkgb2J0YWluaW5nIHZhbHVlcyBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3wgYFRpbWVkQWN0aW9uYCAgIHwgdGltZTogYHN0ZDo6Y2hyb25vOjpzZWNvbmRzYCwgZnVuY3Rpb246IGBzdGQ6OmZ1bmN0aW9uYCB8IGBzdGQ6OmNocm9ubzo6c2Vjb25kc2AgOiB2YWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciwgYHN0ZDo6ZnVuY3Rpb25gOiBhIHBsYWNlaG9sZGVyIGZ1bmN0aW9uIHdhcyB1c2VkLiB8CisKK1RoaXMgYWxzbyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiBpcyBhbHdheXMgZGV0ZXJtaW5pc3RpYyBmb3IgYW55IGdpdmVuIGlucHV0LgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBtZWRpYW1ldHJpY3Nfc2VydmljZV9mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIG1lZGlhbWV0cmljc19zZXJ2aWNlX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIGZpbGVzIHRvIHRoYXQgZm9sZGVyCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L21lZGlhbWV0cmljc19zZXJ2aWNlX2Z1enplci9tZWRpYW1ldHJpY3Nfc2VydmljZV9mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9tZWRpYW1ldHJpY3Nfc2VydmljZV9mdXp6ZXIuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9tZWRpYW1ldHJpY3Nfc2VydmljZV9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYjI1OTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvZnV6emVyL21lZGlhbWV0cmljc19zZXJ2aWNlX2Z1enplci5jcHAKQEAgLTAsMCArMSwzNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldHJpY3NJdGVtLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJBdWRpb1R5cGVzLmgiCisjaW5jbHVkZSAiTWVkaWFNZXRyaWNzU2VydmljZS5oIgorI2luY2x1ZGUgIlN0cmluZ1V0aWxzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyBsb3cgd2F0ZXIgbWFyaworY29uc3RleHByIHNpemVfdCBrTG9nSXRlbXNMb3dXYXRlciA9IDE7CisvLyBoaWdoIHdhdGVyIG1hcmsKK2NvbnN0ZXhwciBzaXplX3Qga0xvZ0l0ZW1zSGlnaFdhdGVyID0gMjsKKworY2xhc3MgTWVkaWFNZXRyaWNzU2VydmljZUZ1enplciB7CisgICBwdWJsaWM6CisgICAgdm9pZCBpbnZva2VTdGFydHNXaXRoKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkIGludm9rZUluc3RhbnRpYXRlKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkIGludm9rZVBhY2thZ2VJbnN0YWxsZXJDaGVjayhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgdm9pZCBpbnZva2VJdGVtTWFuaXB1bGF0aW9uKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkIGludm9rZUl0ZW1FeHBhbnNpb24oY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgaW52b2tlVGltZU1hY2hpbmVTdG9yYWdlKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkIGludm9rZVRyYW5zYWN0aW9uTG9nKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkIGludm9rZUFuYWx5dGljc0FjdGlvbihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgdm9pZCBpbnZva2VBdWRpb0FuYWx5dGljcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgdm9pZCBpbnZva2VUaW1lZEFjdGlvbihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgdm9pZCBwcm9jZXNzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKK307CisKK3ZvaWQgTWVkaWFNZXRyaWNzU2VydmljZUZ1enplcjo6aW52b2tlU3RhcnRzV2l0aChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBmZHAgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisgICAgd2hpbGUgKGZkcC5yZW1haW5pbmdfYnl0ZXMoKSkgeworICAgICAgICBhbmRyb2lkOjptZWRpYW1ldHJpY3M6OnN0YXJ0c1dpdGgoZmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkpOworICAgIH0KK30KKwordm9pZCBNZWRpYU1ldHJpY3NTZXJ2aWNlRnV6emVyOjppbnZva2VJbnN0YW50aWF0ZShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBmZHAgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisgICAgc3AgbWVkaWFNZXRyaWNzU2VydmljZSA9IG5ldyBNZWRpYU1ldHJpY3NTZXJ2aWNlKCk7CisKKyAgICB3aGlsZSAoZmRwLnJlbWFpbmluZ19ieXRlcygpKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxtZWRpYW1ldHJpY3M6Okl0ZW0+IHJhbmRvbV9rZXkoCisgICAgICAgICAgICBtZWRpYW1ldHJpY3M6Okl0ZW06OmNyZWF0ZShmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpKSk7CisgICAgICAgIG1lZGlhTWV0cmljc1NlcnZpY2UtPnN1Ym1pdChyYW5kb21fa2V5LmdldCgpKTsKKyAgICAgICAgcmFuZG9tX2tleS0+c2V0SW50MzIoZmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgICAgICBtZWRpYU1ldHJpY3NTZXJ2aWNlLT5zdWJtaXQocmFuZG9tX2tleS5nZXQoKSk7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPG1lZGlhbWV0cmljczo6SXRlbT4gYXVkaW90cmFja19rZXkoCisgICAgICAgICAgICBtZWRpYW1ldHJpY3M6Okl0ZW06OmNyZWF0ZSgiYXVkaW90cmFjayIpKTsKKyAgICAgICAgbWVkaWFNZXRyaWNzU2VydmljZS0+c3VibWl0KGF1ZGlvdHJhY2tfa2V5LmdldCgpKTsKKyAgICAgICAgYXVkaW90cmFja19rZXktPmFkZEludDMyKGZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgICAgIG1lZGlhTWV0cmljc1NlcnZpY2UtPnN1Ym1pdChhdWRpb3RyYWNrX2tleS5nZXQoKSk7CisgICAgfQorfQorCit2b2lkIE1lZGlhTWV0cmljc1NlcnZpY2VGdXp6ZXI6Omludm9rZVBhY2thZ2VJbnN0YWxsZXJDaGVjayhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBmZHAgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisgICAgd2hpbGUgKGZkcC5yZW1haW5pbmdfYnl0ZXMoKSkgeworICAgICAgICBNZWRpYU1ldHJpY3NTZXJ2aWNlOjp1c2VVaWRGb3JQYWNrYWdlKGZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpOworICAgIH0KK30KKwordm9pZCBNZWRpYU1ldHJpY3NTZXJ2aWNlRnV6emVyOjppbnZva2VJdGVtTWFuaXB1bGF0aW9uKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcCA9IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKworICAgIG1lZGlhbWV0cmljczo6SXRlbSBpdGVtKGZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSk7CisgICAgd2hpbGUgKGZkcC5yZW1haW5pbmdfYnl0ZXMoKSkgeworICAgICAgICBjb25zdCB1aW50OF90IGFjdGlvbiA9IGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIDE2KTsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcga2V5ID0gZmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKTsKKyAgICAgICAgaWYgKGZkcC5yZW1haW5pbmdfYnl0ZXMoKSA8IDEgfHwga2V5Lmxlbmd0aCgpIDwgMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKKyAgICAgICAgICAgIGNhc2UgMDogeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0SW50MzIoa2V5LmNfc3RyKCksIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDE6IHsKKyAgICAgICAgICAgICAgICBpdGVtLmFkZEludDMyKGtleS5jX3N0cigpLCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAyOiB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBpMzIgPSAwOworICAgICAgICAgICAgICAgIGl0ZW0uZ2V0SW50MzIoa2V5LmNfc3RyKCksICZpMzIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAzOiB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRJbnQ2NChrZXkuY19zdHIoKSwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgNDogeworICAgICAgICAgICAgICAgIGl0ZW0uYWRkSW50NjQoa2V5LmNfc3RyKCksIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDU6IHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGk2NCA9IDA7CisgICAgICAgICAgICAgICAgaXRlbS5nZXRJbnQ2NChrZXkuY19zdHIoKSwgJmk2NCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDY6IHsKKyAgICAgICAgICAgICAgICBpdGVtLnNldERvdWJsZShrZXkuY19zdHIoKSwgZmRwLkNvbnN1bWVGbG9hdGluZ1BvaW50PGRvdWJsZT4oKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDc6IHsKKyAgICAgICAgICAgICAgICBpdGVtLmFkZERvdWJsZShrZXkuY19zdHIoKSwgZmRwLkNvbnN1bWVGbG9hdGluZ1BvaW50PGRvdWJsZT4oKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDg6IHsKKyAgICAgICAgICAgICAgICBkb3VibGUgZCA9IDA7CisgICAgICAgICAgICAgICAgaXRlbS5nZXREb3VibGUoa2V5LmNfc3RyKCksICZkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgOTogeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0Q1N0cmluZyhrZXkuY19zdHIoKSwgZmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgMTA6IHsKKyAgICAgICAgICAgICAgICBjaGFyICpzID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBpdGVtLmdldENTdHJpbmcoa2V5LmNfc3RyKCksICZzKTsKKyAgICAgICAgICAgICAgICBpZiAocykgZnJlZShzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgMTE6IHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzOworICAgICAgICAgICAgICAgIGl0ZW0uZ2V0U3RyaW5nKGtleS5jX3N0cigpLCAmcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDEyOiB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRSYXRlKGtleS5jX3N0cigpLCBmZHAuQ29uc3VtZUludGVncmFsPGludDY0X3Q+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDEzOiB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBiID0gMCwgaCA9IDA7CisgICAgICAgICAgICAgICAgZG91YmxlIGQgPSAwOworICAgICAgICAgICAgICAgIGl0ZW0uZ2V0UmF0ZShrZXkuY19zdHIoKSwgJmIsICZoLCAmZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDE0OiB7CisgICAgICAgICAgICAgICAgKHZvaWQpaXRlbS5maWx0ZXIoa2V5LmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAxNTogeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFyclsxXSA9IHsiIn07CisgICAgICAgICAgICAgICAgYXJyWzBdID0gY29uc3RfY2FzdDxjaGFyICo+KGtleS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAodm9pZClpdGVtLmZpbHRlck5vdCgxLCBhcnIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAxNjogeworICAgICAgICAgICAgICAgICh2b2lkKWl0ZW0udG9TdHJpbmcoKS5jX3N0cigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgUGFyY2VsIHA7CisgICAgbWVkaWFtZXRyaWNzOjpJdGVtIGl0ZW0yOworCisgICAgKHZvaWQpaXRlbS53cml0ZVRvUGFyY2VsKCZwKTsKKyAgICBwLnNldERhdGFQb3NpdGlvbigwKTsgIC8vIHJld2luZCBmb3IgcmVhZGluZworICAgICh2b2lkKWl0ZW0yLnJlYWRGcm9tUGFyY2VsKHApOworCisgICAgY2hhciAqYnl0ZURhdGEgPSBudWxscHRyOworICAgIHNpemVfdCBsZW5ndGggPSAwOworICAgICh2b2lkKWl0ZW0ud3JpdGVUb0J5dGVTdHJpbmcoJmJ5dGVEYXRhLCAmbGVuZ3RoKTsKKyAgICAodm9pZClpdGVtMi5yZWFkRnJvbUJ5dGVTdHJpbmcoYnl0ZURhdGEsIGxlbmd0aCk7CisgICAgaWYgKGJ5dGVEYXRhKSB7CisgICAgICAgIGZyZWUoYnl0ZURhdGEpOworICAgIH0KKworICAgIHNwIG1lZGlhTWV0cmljc1NlcnZpY2UgPSBuZXcgTWVkaWFNZXRyaWNzU2VydmljZSgpOworICAgIG1lZGlhTWV0cmljc1NlcnZpY2UtPnN1Ym1pdCgmaXRlbTIpOworfQorCit2b2lkIE1lZGlhTWV0cmljc1NlcnZpY2VGdXp6ZXI6Omludm9rZUl0ZW1FeHBhbnNpb24oY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgZmRwID0gRnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOworCisgICAgbWVkaWFtZXRyaWNzOjpMb2dJdGVtPDE+IGl0ZW0oIkZ1enpJdGVtIik7CisgICAgaXRlbS5zZXRQaWQoZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQxNl90PigpKS5zZXRVaWQoZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQxNl90PigpKTsKKworICAgIHdoaWxlIChmZHAucmVtYWluaW5nX2J5dGVzKCkpIHsKKyAgICAgICAgaW50MzJfdCBpID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgICAgICBpdGVtLnNldChzdGQ6OnRvX3N0cmluZyhpKS5jX3N0cigpLCAoaW50MzJfdClpKTsKKyAgICB9CisgICAgaXRlbS51cGRhdGVIZWFkZXIoKTsKKworICAgIG1lZGlhbWV0cmljczo6SXRlbSBpdGVtMjsKKyAgICAodm9pZClpdGVtMi5yZWFkRnJvbUJ5dGVTdHJpbmcoaXRlbS5nZXRCdWZmZXIoKSwgaXRlbS5nZXRMZW5ndGgoKSk7CisKKyAgICBzcCBtZWRpYU1ldHJpY3NTZXJ2aWNlID0gbmV3IE1lZGlhTWV0cmljc1NlcnZpY2UoKTsKKyAgICBtZWRpYU1ldHJpY3NTZXJ2aWNlLT5zdWJtaXQoJml0ZW0yKTsKK30KKwordm9pZCBNZWRpYU1ldHJpY3NTZXJ2aWNlRnV6emVyOjppbnZva2VUaW1lTWFjaGluZVN0b3JhZ2UoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgZmRwID0gRnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOworCisgICAgYXV0byBpdGVtID0gc3RkOjptYWtlX3NoYXJlZDxtZWRpYW1ldHJpY3M6Okl0ZW0+KCJGdXp6S2V5Iik7CisgICAgaW50MzJfdCBpMzIgPSBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgaW50NjRfdCBpNjQgPSBmZHAuQ29uc3VtZUludGVncmFsPGludDY0X3Q+KCk7CisgICAgZG91YmxlIGQgPSBmZHAuQ29uc3VtZUZsb2F0aW5nUG9pbnQ8ZG91YmxlPigpOworICAgIHN0ZDo6c3RyaW5nIHN0ciA9IGZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCk7CisgICAgc3RkOjpwYWlyPGludDY0X3QsIGludDY0X3Q+IHBhaXIoZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKSk7CisgICAgKCppdGVtKS5zZXQoImkzMiIsIGkzMikuc2V0KCJpNjQiLCBpNjQpLnNldCgiZG91YmxlIiwgZCkuc2V0KCJzdHJpbmciLCBzdHIpLnNldCgicmF0ZSIsIHBhaXIpOworCisgICAgYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpUaW1lTWFjaGluZSB0aW1lTWFjaGluZTsKKyAgICB0aW1lTWFjaGluZS5wdXQoaXRlbSwgdHJ1ZSk7CisKKyAgICB0aW1lTWFjaGluZS5nZXQoIktleSIsICJpMzIiLCAmaTMyLCAtMSk7CisKKyAgICB0aW1lTWFjaGluZS5nZXQoIktleSIsICJpNjQiLCAmaTY0LCAtMSk7CisKKyAgICB0aW1lTWFjaGluZS5nZXQoIktleSIsICJkb3VibGUiLCAmZCwgLTEpOworCisgICAgdGltZU1hY2hpbmUuZ2V0KCJLZXkiLCAic3RyaW5nIiwgJnN0ciwgLTEpOworCisgICAgdGltZU1hY2hpbmUuZ2V0KCJLZXkuaTMyIiwgJmkzMiwgLTEpOworCisgICAgdGltZU1hY2hpbmUuZ2V0KCJLZXkuaTY0IiwgJmk2NCwgLTEpOworCisgICAgdGltZU1hY2hpbmUuZ2V0KCJLZXkuZG91YmxlIiwgJmQsIC0xKTsKKworICAgIHN0ci5jbGVhcigpOworICAgIHRpbWVNYWNoaW5lLmdldCgiS2V5LnN0cmluZyIsICZzdHIsIC0xKTsKK30KKwordm9pZCBNZWRpYU1ldHJpY3NTZXJ2aWNlRnV6emVyOjppbnZva2VUcmFuc2FjdGlvbkxvZyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBmZHAgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisKKyAgICBhdXRvIGl0ZW0gPSBzdGQ6Om1ha2Vfc2hhcmVkPG1lZGlhbWV0cmljczo6SXRlbT4oIktleTEiKTsKKyAgICAoKml0ZW0pCisgICAgICAgIC5zZXQoIm9uZSIsIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSkKKyAgICAgICAgLnNldCgidHdvIiwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKQorICAgICAgICAuc2V0VGltZXN0YW1wKGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisKKyAgICBhbmRyb2lkOjptZWRpYW1ldHJpY3M6OlRyYW5zYWN0aW9uTG9nIHRyYW5zYWN0aW9uTG9nKAorICAgICAgICBrTG9nSXRlbXNMb3dXYXRlciwga0xvZ0l0ZW1zSGlnaFdhdGVyKTsgIC8vIGtlZXAgYXQgbW9zdCAyIGl0ZW1zCisgICAgdHJhbnNhY3Rpb25Mb2cuc2l6ZSgpOworCisgICAgdHJhbnNhY3Rpb25Mb2cucHV0KGl0ZW0pOworICAgIHRyYW5zYWN0aW9uTG9nLnNpemUoKTsKKworICAgIGF1dG8gaXRlbTIgPSBzdGQ6Om1ha2Vfc2hhcmVkPG1lZGlhbWV0cmljczo6SXRlbT4oIktleTIiKTsKKyAgICAoKml0ZW0yKQorICAgICAgICAuc2V0KCJ0aHJlZSIsIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSkKKyAgICAgICAgLnNldCgiW0tleTFddGhyZWUiLCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpCisgICAgICAgIC5zZXRUaW1lc3RhbXAoZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKworICAgIHRyYW5zYWN0aW9uTG9nLnB1dChpdGVtMik7CisgICAgdHJhbnNhY3Rpb25Mb2cuc2l6ZSgpOworCisgICAgYXV0byBpdGVtMyA9IHN0ZDo6bWFrZV9zaGFyZWQ8bWVkaWFtZXRyaWNzOjpJdGVtPigiS2V5MyIpOworICAgICgqaXRlbTMpCisgICAgICAgIC5zZXQoInNpeCIsIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSkKKyAgICAgICAgLnNldCgiW0tleTFdZm91ciIsIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSkgIC8vIGFmZmVjdHMgS2V5MQorICAgICAgICAuc2V0KCJbS2V5MV1maXZlIiwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKSAgLy8gYWZmZWN0cyBrZXkxCisgICAgICAgIC5zZXRUaW1lc3RhbXAoZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKworICAgIHRyYW5zYWN0aW9uTG9nLnB1dChpdGVtMyk7CisgICAgdHJhbnNhY3Rpb25Mb2cuc2l6ZSgpOworfQorCit2b2lkIE1lZGlhTWV0cmljc1NlcnZpY2VGdXp6ZXI6Omludm9rZUFuYWx5dGljc0FjdGlvbihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBmZHAgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisKKyAgICBtZWRpYW1ldHJpY3M6OkFuYWx5dGljc0FjdGlvbnMgYW5hbHl0aWNzQWN0aW9uczsKKyAgICBib29sIGFjdGlvbiA9IGZhbHNlOworCisgICAgd2hpbGUgKGZkcC5yZW1haW5pbmdfYnl0ZXMoKSkgeworICAgICAgICBhbmFseXRpY3NBY3Rpb25zLmFkZEFjdGlvbigKKyAgICAgICAgICAgIChmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpICsgc3RkOjpzdHJpbmcoIi5ldmVudCIpKS5jX3N0cigpLAorICAgICAgICAgICAgZmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8bWVkaWFtZXRyaWNzOjpBbmFseXRpY3NBY3Rpb25zOjpGdW5jdGlvbj4oCisgICAgICAgICAgICAgICAgWyZdKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBhbmRyb2lkOjptZWRpYW1ldHJpY3M6Okl0ZW0+ICYpIHsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9KSk7CisgICAgfQorCisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcDIgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisKKyAgICB3aGlsZSAoZmRwMi5yZW1haW5pbmdfYnl0ZXMoKSkgeworICAgICAgICAvLyBtYWtlIGEgdGVzdCBpdGVtCisgICAgICAgIGF1dG8gaXRlbSA9IHN0ZDo6bWFrZV9zaGFyZWQ8bWVkaWFtZXRyaWNzOjpJdGVtPihmZHAyLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgKCppdGVtKS5zZXQoImV2ZW50IiwgZmRwMi5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICAgICAgLy8gZ2V0IHRoZSBhY3Rpb25zIGFuZCBleGVjdXRlIHRoZW0KKyAgICAgICAgYXV0byBhY3Rpb25zID0gYW5hbHl0aWNzQWN0aW9ucy5nZXRBY3Rpb25zRm9ySXRlbShpdGVtKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZhY3Rpb24gOiBhY3Rpb25zKSB7CisgICAgICAgICAgICBhY3Rpb24tPm9wZXJhdG9yKCkoaXRlbSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFNZXRyaWNzU2VydmljZUZ1enplcjo6aW52b2tlQXVkaW9BbmFseXRpY3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgZmRwID0gRnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOworICAgIGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6QXVkaW9BbmFseXRpY3MgYXVkaW9BbmFseXRpY3M7CisKKyAgICB3aGlsZSAoZmRwLnJlbWFpbmluZ19ieXRlcygpKSB7CisgICAgICAgIGF1dG8gaXRlbSA9IHN0ZDo6bWFrZV9zaGFyZWQ8bWVkaWFtZXRyaWNzOjpJdGVtPihmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpOworICAgICAgICBpbnQzMl90IHRyYW5zYWN0aW9uVWlkID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOyAgLy8gYXJiaXRyYXJ5CisgICAgICAgICgqaXRlbSkKKyAgICAgICAgICAgIC5zZXQoZmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpLCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpCisgICAgICAgICAgICAuc2V0KGZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKQorICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfQUxMT1dVSUQsIHRyYW5zYWN0aW9uVWlkKQorICAgICAgICAgICAgLnNldFVpZCh0cmFuc2FjdGlvblVpZCkKKyAgICAgICAgICAgIC5zZXRUaW1lc3RhbXAoZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICAgICAgYXVkaW9BbmFseXRpY3Muc3VibWl0KGl0ZW0sIGZkcC5Db25zdW1lQm9vbCgpKTsKKyAgICB9CisKKyAgICBhdWRpb0FuYWx5dGljcy5kdW1wKDEwMDApOworfQorCit2b2lkIE1lZGlhTWV0cmljc1NlcnZpY2VGdXp6ZXI6Omludm9rZVRpbWVkQWN0aW9uKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcCA9IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKyAgICBhbmRyb2lkOjptZWRpYW1ldHJpY3M6OlRpbWVkQWN0aW9uIHRpbWVkQWN0aW9uOworICAgIHN0ZDo6YXRvbWljX2ludCB2YWx1ZSA9IDA7CisKKyAgICB3aGlsZSAoZmRwLnJlbWFpbmluZ19ieXRlcygpKSB7CisgICAgICAgIHRpbWVkQWN0aW9uLnBvc3RJbihzdGQ6OmNocm9ubzo6c2Vjb25kcyhmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZ2YWx1ZV0geyArK3ZhbHVlOyB9KTsKKyAgICAgICAgdGltZWRBY3Rpb24uc2l6ZSgpOworICAgIH0KK30KKwordm9pZCBNZWRpYU1ldHJpY3NTZXJ2aWNlRnV6emVyOjpwcm9jZXNzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaW52b2tlU3RhcnRzV2l0aChkYXRhLCBzaXplKTsKKyAgICBpbnZva2VJbnN0YW50aWF0ZShkYXRhLCBzaXplKTsKKyAgICBpbnZva2VQYWNrYWdlSW5zdGFsbGVyQ2hlY2soZGF0YSwgc2l6ZSk7CisgICAgaW52b2tlSXRlbU1hbmlwdWxhdGlvbihkYXRhLCBzaXplKTsKKyAgICBpbnZva2VJdGVtRXhwYW5zaW9uKGRhdGEsIHNpemUpOworICAgIGludm9rZVRpbWVNYWNoaW5lU3RvcmFnZShkYXRhLCBzaXplKTsKKyAgICBpbnZva2VUcmFuc2FjdGlvbkxvZyhkYXRhLCBzaXplKTsKKyAgICBpbnZva2VBbmFseXRpY3NBY3Rpb24oZGF0YSwgc2l6ZSk7CisgICAgaW52b2tlQXVkaW9BbmFseXRpY3MoZGF0YSwgc2l6ZSk7CisgICAgaW52b2tlVGltZWRBY3Rpb24oZGF0YSwgc2l6ZSk7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8IDEpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIE1lZGlhTWV0cmljc1NlcnZpY2VGdXp6ZXIgbWVkaWFNZXRyaWNzU2VydmljZUZ1enplcjsKKyAgICBtZWRpYU1ldHJpY3NTZXJ2aWNlRnV6emVyLnByb2Nlc3MoZGF0YSwgc2l6ZSk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2F1ZGlvcG9saWN5LmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfYXVkaW9wb2xpY3kuY3BwCmluZGV4IDM5M2M2YWUuLjZlZjJmMmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfYXVkaW9wb2xpY3kuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfYXVkaW9wb2xpY3kuY3BwCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8c3RhdHNsb2cuaD4KIAogI2luY2x1ZGUgIk1lZGlhTWV0cmljc1NlcnZpY2UuaCIKLSNpbmNsdWRlICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9wcm90by9hbmRyb2lkL3N0YXRzL21lZGlhbWV0cmljcy9tZWRpYW1ldHJpY3MucGIuaCIKKyNpbmNsdWRlICJmcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmcvc3RhdHMvZW51bXMvc3RhdHMvbWVkaWFtZXRyaWNzL21lZGlhbWV0cmljcy5wYi5oIgogI2luY2x1ZGUgImlmYWNlX3N0YXRzZC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2F1ZGlvcmVjb3JkLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfYXVkaW9yZWNvcmQuY3BwCmluZGV4IDQzZmVkYTEuLjc2ZjRiNTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfYXVkaW9yZWNvcmQuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfYXVkaW9yZWNvcmQuY3BwCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8c3RhdHNsb2cuaD4KIAogI2luY2x1ZGUgIk1lZGlhTWV0cmljc1NlcnZpY2UuaCIKLSNpbmNsdWRlICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9wcm90by9hbmRyb2lkL3N0YXRzL21lZGlhbWV0cmljcy9tZWRpYW1ldHJpY3MucGIuaCIKKyNpbmNsdWRlICJmcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmcvc3RhdHMvZW51bXMvc3RhdHMvbWVkaWFtZXRyaWNzL21lZGlhbWV0cmljcy5wYi5oIgogI2luY2x1ZGUgImlmYWNlX3N0YXRzZC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2F1ZGlvdGhyZWFkLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfYXVkaW90aHJlYWQuY3BwCmluZGV4IGU4NjdmNWIuLjJhZDI1NjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfYXVkaW90aHJlYWQuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfYXVkaW90aHJlYWQuY3BwCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8c3RhdHNsb2cuaD4KIAogI2luY2x1ZGUgIk1lZGlhTWV0cmljc1NlcnZpY2UuaCIKLSNpbmNsdWRlICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9wcm90by9hbmRyb2lkL3N0YXRzL21lZGlhbWV0cmljcy9tZWRpYW1ldHJpY3MucGIuaCIKKyNpbmNsdWRlICJmcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmcvc3RhdHMvZW51bXMvc3RhdHMvbWVkaWFtZXRyaWNzL21lZGlhbWV0cmljcy5wYi5oIgogI2luY2x1ZGUgImlmYWNlX3N0YXRzZC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2F1ZGlvdHJhY2suY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9hdWRpb3RyYWNrLmNwcAppbmRleCBlZTViOWIyLi42YjA4YTc4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2F1ZGlvdHJhY2suY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfYXVkaW90cmFjay5jcHAKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlIDxzdGF0c2xvZy5oPgogCiAjaW5jbHVkZSAiTWVkaWFNZXRyaWNzU2VydmljZS5oIgotI2luY2x1ZGUgImZyYW1ld29ya3MvYmFzZS9jb3JlL3Byb3RvL2FuZHJvaWQvc3RhdHMvbWVkaWFtZXRyaWNzL21lZGlhbWV0cmljcy5wYi5oIgorI2luY2x1ZGUgImZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9lbnVtcy9zdGF0cy9tZWRpYW1ldHJpY3MvbWVkaWFtZXRyaWNzLnBiLmgiCiAjaW5jbHVkZSAiaWZhY2Vfc3RhdHNkLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfY29kZWMuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9jb2RlYy5jcHAKaW5kZXggZWM5MzU0Zi4uZDUwMmIzMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9jb2RlYy5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9jb2RlYy5jcHAKQEAgLTMzLDcgKzMzLDcgQEAKIAogI2luY2x1ZGUgImNsZWFuZXIuaCIKICNpbmNsdWRlICJNZWRpYU1ldHJpY3NTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiZnJhbWV3b3Jrcy9iYXNlL2NvcmUvcHJvdG8vYW5kcm9pZC9zdGF0cy9tZWRpYW1ldHJpY3MvbWVkaWFtZXRyaWNzLnBiLmgiCisjaW5jbHVkZSAiZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL2VudW1zL3N0YXRzL21lZGlhbWV0cmljcy9tZWRpYW1ldHJpY3MucGIuaCIKICNpbmNsdWRlICJpZmFjZV9zdGF0c2QuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9leHRyYWN0b3IuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9leHRyYWN0b3IuY3BwCmluZGV4IGZiMDkyNGMuLjQxODBlMGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfZXh0cmFjdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2V4dHJhY3Rvci5jcHAKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlIDxzdGF0c2xvZy5oPgogCiAjaW5jbHVkZSAiTWVkaWFNZXRyaWNzU2VydmljZS5oIgotI2luY2x1ZGUgImZyYW1ld29ya3MvYmFzZS9jb3JlL3Byb3RvL2FuZHJvaWQvc3RhdHMvbWVkaWFtZXRyaWNzL21lZGlhbWV0cmljcy5wYi5oIgorI2luY2x1ZGUgImZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9lbnVtcy9zdGF0cy9tZWRpYW1ldHJpY3MvbWVkaWFtZXRyaWNzLnBiLmgiCiAjaW5jbHVkZSAiaWZhY2Vfc3RhdHNkLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfbWVkaWFwYXJzZXIuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9tZWRpYXBhcnNlci5jcHAKaW5kZXggMzI1OGViZi4uMjYyYjJhZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9tZWRpYXBhcnNlci5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9tZWRpYXBhcnNlci5jcHAKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxzdGF0c2xvZy5oPgogCiAjaW5jbHVkZSAiTWVkaWFNZXRyaWNzU2VydmljZS5oIgotI2luY2x1ZGUgImZyYW1ld29ya3MvYmFzZS9jb3JlL3Byb3RvL2FuZHJvaWQvc3RhdHMvbWVkaWFtZXRyaWNzL21lZGlhbWV0cmljcy5wYi5oIgorI2luY2x1ZGUgImZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9lbnVtcy9zdGF0cy9tZWRpYW1ldHJpY3MvbWVkaWFtZXRyaWNzLnBiLmgiCiAjaW5jbHVkZSAiaWZhY2Vfc3RhdHNkLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfbnVwbGF5ZXIuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9udXBsYXllci5jcHAKaW5kZXggNDg4YmRjYi4uYThkMGY1NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9udXBsYXllci5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9udXBsYXllci5jcHAKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlIDxzdGF0c2xvZy5oPgogCiAjaW5jbHVkZSAiTWVkaWFNZXRyaWNzU2VydmljZS5oIgotI2luY2x1ZGUgImZyYW1ld29ya3MvYmFzZS9jb3JlL3Byb3RvL2FuZHJvaWQvc3RhdHMvbWVkaWFtZXRyaWNzL21lZGlhbWV0cmljcy5wYi5oIgorI2luY2x1ZGUgImZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9lbnVtcy9zdGF0cy9tZWRpYW1ldHJpY3MvbWVkaWFtZXRyaWNzLnBiLmgiCiAjaW5jbHVkZSAiaWZhY2Vfc3RhdHNkLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfcmVjb3JkZXIuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9yZWNvcmRlci5jcHAKaW5kZXggNmQ1ZmNhMC4uMmU1YWRhNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9yZWNvcmRlci5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9yZWNvcmRlci5jcHAKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlIDxzdGF0c2xvZy5oPgogCiAjaW5jbHVkZSAiTWVkaWFNZXRyaWNzU2VydmljZS5oIgotI2luY2x1ZGUgImZyYW1ld29ya3MvYmFzZS9jb3JlL3Byb3RvL2FuZHJvaWQvc3RhdHMvbWVkaWFtZXRyaWNzL21lZGlhbWV0cmljcy5wYi5oIgorI2luY2x1ZGUgImZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9lbnVtcy9zdGF0cy9tZWRpYW1ldHJpY3MvbWVkaWFtZXRyaWNzLnBiLmgiCiAjaW5jbHVkZSAiaWZhY2Vfc3RhdHNkLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy90ZXN0cy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggYzJlMDc1OS4uM2FlZTIwOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAibWVkaWFtZXRyaWNzX3Rlc3RzIiwKICAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLmJwCmluZGV4IGEzNTE5ZDUuLmU2NzcyMGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5icApAQCAtMSwxMSArMSwyMSBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQogCi0KLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIiwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIlJlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwIiwKICAgICAgICAgIlNlcnZpY2VMb2cuY3BwIiwKKworICAgICAgICAvLyBUT0RPOiBjb252ZXJ0IHRvIEFJREw/CisgICAgICAgICJJTWVkaWFSZXNvdXJjZU1vbml0b3IuY3BwIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKQEAgLTI1LDUgKzM1LDQgQEAKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCi0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0lNZWRpYVJlc291cmNlTW9uaXRvci5jcHAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9JTWVkaWFSZXNvdXJjZU1vbml0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZDdmZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9JTWVkaWFSZXNvdXJjZU1vbml0b3IuY3BwCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJJTWVkaWFSZXNvdXJjZU1vbml0b3IuaCIKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCcE1lZGlhUmVzb3VyY2VNb25pdG9yIDogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYVJlc291cmNlTW9uaXRvcj4geworcHVibGljOgorICAgIGV4cGxpY2l0IEJwTWVkaWFSZXNvdXJjZU1vbml0b3IoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCisgICAgICAgIDogQnBJbnRlcmZhY2U8SU1lZGlhUmVzb3VyY2VNb25pdG9yPihpbXBsKSB7fQorCisgICAgdmlydHVhbCB2b2lkIG5vdGlmeVJlc291cmNlR3JhbnRlZCgvKmluKi8gaW50MzJfdCBwaWQsIC8qaW4qLyBjb25zdCBpbnQzMl90IHR5cGUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZXNvdXJjZU1vbml0b3I6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwaWQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIodHlwZSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChOT1RJRllfUkVTT1VSQ0VfR1JBTlRFRCwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CisgICAgfQorfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE1lZGlhUmVzb3VyY2VNb25pdG9yLCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFSZXNvdXJjZU1vbml0b3IiKQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE5PTElOVE5FWFRMSU5FKGdvb2dsZS1kZWZhdWx0LWFyZ3VtZW50cykKK3N0YXR1c190IEJuTWVkaWFSZXNvdXJjZU1vbml0b3I6Om9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwKKyAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBzd2l0Y2goY29kZSkgeworICAgICAgICBjYXNlIE5PVElGWV9SRVNPVVJDRV9HUkFOVEVEOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUmVzb3VyY2VNb25pdG9yLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBpbnQzMl90IHBpZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHR5cGUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgbm90aWZ5UmVzb3VyY2VHcmFudGVkKC8qaW4qLyBwaWQsIC8qaW4qLyB0eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0lNZWRpYVJlc291cmNlTW9uaXRvci5oIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvSU1lZGlhUmVzb3VyY2VNb25pdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyZDU1NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0lNZWRpYVJlc291cmNlTW9uaXRvci5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWZuZGVmIF9fQU5EUk9JRF9WTkRLX18KKworI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBJTWVkaWFSZXNvdXJjZU1vbml0b3IgOiBwdWJsaWMgSUludGVyZmFjZSB7CitwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShNZWRpYVJlc291cmNlTW9uaXRvcikKKworICAgIC8vIFZhbHVlcyBzaG91bGQgYmUgaW4gc3luYyB3aXRoIEludGVudC5FWFRSQV9NRURJQV9SRVNPVVJDRV9UWVBFX1hYWC4KKyAgICBlbnVtIHsKKyAgICAgICAgVFlQRV9WSURFT19DT0RFQyA9IDAsCisgICAgICAgIFRZUEVfQVVESU9fQ09ERUMgPSAxLAorICAgIH07CisKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5UmVzb3VyY2VHcmFudGVkKC8qaW4qLyBpbnQzMl90IHBpZCwgLyppbiovIGNvbnN0IGludDMyX3QgdHlwZSkgPSAwOworCisgICAgZW51bSB7CisgICAgICAgIE5PVElGWV9SRVNPVVJDRV9HUkFOVEVEID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICB9OworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCbk1lZGlhUmVzb3VyY2VNb25pdG9yIDogcHVibGljIEJuSW50ZXJmYWNlPElNZWRpYVJlc291cmNlTW9uaXRvcj4geworcHVibGljOgorICAgIC8vIE5PTElOVE5FWFRMSU5FKGdvb2dsZS1kZWZhdWx0LWFyZ3VtZW50cykKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZWxzZSAvLyBfX0FORFJPSURfVk5ES19fCisjZXJyb3IgIlRoaXMgaGVhZGVyIGlzIG5vdCB2aXNpYmxlIHRvIHZlbmRvcnMiCisjZW5kaWYgLy8gX19BTkRST0lEX1ZOREtfXwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcAppbmRleCBkYjA2YTM2Li4xNjk1MjI4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcApAQCAtMjEsNyArMjEsNyBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3Byb2Nlc3MuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lZGlhUmVzb3VyY2VNb25pdG9yLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGN1dGlscy9zY2hlZF9wb2xpY3kuaD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCisjaW5jbHVkZSAiSU1lZGlhUmVzb3VyY2VNb25pdG9yLmgiCiAjaW5jbHVkZSAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oIgogI2luY2x1ZGUgIlNlcnZpY2VMb2cuaCIKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oCmluZGV4IDM5NzJkMjMuLjdmMThlZDMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgKQEAgLTQzLDcgKzQzLDcgQEAKIHVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6Ok1lZGlhUmVzb3VyY2VQb2xpY3lQYXJjZWw7CiAKIHR5cGVkZWYgc3RkOjptYXA8c3RkOjp0dXBsZTwKLSAgICAgICAgTWVkaWFSZXNvdXJjZTo6VHlwZSwgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZSwgc3RkOjp2ZWN0b3I8aW50OF90Pj4sCisgICAgICAgIE1lZGlhUmVzb3VyY2U6OlR5cGUsIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiwKICAgICAgICAgTWVkaWFSZXNvdXJjZVBhcmNlbD4gUmVzb3VyY2VMaXN0OwogCiBzdHJ1Y3QgUmVzb3VyY2VJbmZvIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2Z1enplci9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjODVlNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2Z1enplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtZWRpYXJlc291cmNlbWFuYWdlcl9mdXp6ZXIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIm1lZGlhcmVzb3VyY2VtYW5hZ2VyX2Z1enplci5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliYmluZGVyX25kayIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9mdXp6ZXIvUkVBRE1FLm1kIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjAwYmU0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvZnV6emVyL1JFQURNRS5tZApAQCAtMCwwICsxLDQ2IEBACisjIEZ1enplciBmb3IgbGlicmVzb3VyY2VtYW5hZ2Vyc2VydmljZQorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgbGlicmVzb3VyY2VtYW5hZ2Vyc2VydmljZSBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUKK3VuZGVyc3RhbmRpbmcgb2YgdGhlIHNlcnZpY2UgYW5kIHRyaWVzIHRvIGFjaGlldmUgdGhlIGZvbGxvd2luZzoKKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgbm90IGhhcmRjb2RlZCwgYnV0IGluc3RlYWQgc2VsZWN0ZWQgYmFzZWQgb24KK2luY29taW5nIGRhdGEuIFRoaXMgZW5zdXJlcyBtb3JlIGNvZGUgcGF0aHMgYXJlIHJlYWNoZWQgYnkgdGhlIGZ1enplci4KKworTWVkaWEgUmVzb3VyY2UgTWFuYWdlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisxLiBNZWRpYSBSZXNvdXJjZSBUeXBlIChwYXJhbWV0ZXIgbmFtZTogYG1lZGlhUmVzb3VyY2VUeXBlYCkKKzIuIE1lZGlhIFJlc291cmNlIFN1YlR5cGUgKHBhcmFtZXRlciBuYW1lOiBgbWVkaWFSZXNvdXJjZVN1YlR5cGVgKQorCit8IFBhcmFtZXRlcnwgVmFsaWQgVmFsdWVzfCBDb25maWd1cmVkIFZhbHVlfAorfC0tLS0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS18IC0tLS0tIHwKK3wgYG1lZGlhUmVzb3VyY2VUeXBlYCB8IDAuYE1lZGlhUmVzb3VyY2U6OmtTZWN1cmVDb2RlY2AgMS5gTWVkaWFSZXNvdXJjZTo6a05vblNlY3VyZUNvZGVjQ2AgMi5gTWVkaWFSZXNvdXJjZTo6a0dyYXBoaWNNZW1vcnlgIDMuYE1lZGlhUmVzb3VyY2U6OmtDcHVCb29zdGAgIDQuYE1lZGlhUmVzb3VyY2U6OmtCYXR0ZXJ5YCA1LmBNZWRpYVJlc291cmNlOjprRHJtU2Vzc2lvbmB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYG1lZGlhUmVzb3VyY2VTdWJUeXBlYCAgIHwgMC5gTWVkaWFSZXNvdXJjZTo6a0F1ZGlvQ29kZWNgIDEuYE1lZGlhUmVzb3VyY2U6OmtWaWRlb0NvZGVjYCAyLmBNZWRpYVJlc291cmNlOjprVW5zcGVjaWZpZWRTdWJUeXBlYCAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8CisKK1RoaXMgYWxzbyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiBpcyBhbHdheXMgZGV0ZXJtaW5pc3RpYyBmb3IgYW55IGdpdmVuIGlucHV0LgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBtZWRpYXJlc291cmNlbWFuYWdlcl9mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIG1lZGlhcmVzb3VyY2VtYW5hZ2VyX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIGZpbGVzIHRvIHRoYXQgZm9sZGVyCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L21lZGlhcmVzb3VyY2VtYW5hZ2VyX2Z1enplci9tZWRpYXJlc291cmNlbWFuYWdlcl9mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvZnV6emVyL21lZGlhcmVzb3VyY2VtYW5hZ2VyX2Z1enplci5jcHAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9mdXp6ZXIvbWVkaWFyZXNvdXJjZW1hbmFnZXJfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjkwYjE2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvZnV6emVyL21lZGlhcmVzb3VyY2VtYW5hZ2VyX2Z1enplci5jcHAKQEAgLTAsMCArMSwyOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSA8U2VydmljZUxvZy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9CblJlc291cmNlTWFuYWdlckNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhUmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVJlc291cmNlUG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm9JbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgIlJlc291cmNlTWFuYWdlclNlcnZpY2UuaCIKKyNpbmNsdWRlICJmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIFN0YXR1cyA9IDo6bmRrOjpTY29wZWRBU3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6Qm5SZXNvdXJjZU1hbmFnZXJDbGllbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6SVJlc291cmNlTWFuYWdlclNlcnZpY2U7Cit1c2luZyBNZWRSZXNUeXBlID0gYWlkbDo6YW5kcm9pZDo6bWVkaWE6Ok1lZGlhUmVzb3VyY2VUeXBlOwordXNpbmcgTWVkUmVzU3ViVHlwZSA9IGFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpNZWRpYVJlc291cmNlU3ViVHlwZTsKKworY29uc3Qgc2l6ZV90IGtNYXhTdHJpbmdMZW5ndGggPSAxMDA7Citjb25zdCBpbnQzMl90IGtNYXhTZXJ2aWNlTG9nID0gMTAwOworY29uc3QgaW50MzJfdCBrTWluU2VydmljZUxvZyA9IDE7Citjb25zdCBpbnQzMl90IGtNaW5SZXNvdXJjZVR5cGUgPSAwOworY29uc3QgaW50MzJfdCBrTWF4UmVzb3VyY2VUeXBlID0gMTA7Citjb25zdCBpbnQzMl90IGtNaW5UaHJlYWRQYWlycyA9IDE7Citjb25zdCBpbnQzMl90IGtNYXhUaHJlYWRQYWlycyA9IDM7CisKK2NvbnN0IHN0cmluZyBrUG9saWN5VHlwZVtdID0ge0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjprUG9saWN5U3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjprUG9saWN5U3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWN9OworCitzdHJ1Y3QgcmVzb3VyY2VUaHJlYWRBcmdzIHsKKyAgICBpbnQzMl90IHBpZDsKKyAgICBpbnQzMl90IHVpZDsKKyAgICBpbnQ2NF90IHRlc3RDbGllbnRJZDsKKyAgICBzaGFyZWRfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+IHNlcnZpY2U7CisgICAgc2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiB0ZXN0Q2xpZW50OworICAgIHZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiBtZWRpYVJlc291cmNlOworfTsKKworc3RhdGljIGludDY0X3QgZ2V0SWQoY29uc3Qgc2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiYgY2xpZW50KSB7CisgICAgcmV0dXJuIChpbnQ2NF90KWNsaWVudC5nZXQoKTsKK30KKworc3RydWN0IFRlc3RQcm9jZXNzSW5mbyA6IHB1YmxpYyBQcm9jZXNzSW5mb0ludGVyZmFjZSB7CisgICAgVGVzdFByb2Nlc3NJbmZvKCkge30KKyAgICB2aXJ0dWFsIH5UZXN0UHJvY2Vzc0luZm8oKSB7fQorCisgICAgdmlydHVhbCBib29sIGdldFByaW9yaXR5KGludCBwaWQsIGludCogcHJpb3JpdHkpIHsKKyAgICAgICAgLy8gRm9yIHRlc3RpbmcsIHVzZSBwaWQgYXMgcHJpb3JpdHkuCisgICAgICAgIC8vIExvd2VyIHRoZSB2YWx1ZSBoaWdoZXIgdGhlIHByaW9yaXR5LgorICAgICAgICAqcHJpb3JpdHkgPSBwaWQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBpc1ZhbGlkUGlkKGludCAvKiBwaWQgKi8pIHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIGJvb2wgb3ZlcnJpZGVQcm9jZXNzSW5mbyhpbnQgLyogcGlkICovLCBpbnQgLypwcm9jU3RhdGUqLywgaW50IC8qb29tU2NvcmUqLykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIHJlbW92ZVByb2Nlc3NJbmZvT3ZlcnJpZGUoaW50IC8qIHBpZCAqLykgeyByZXR1cm47IH0KKworICAgcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUZXN0UHJvY2Vzc0luZm8pOworfTsKKworc3RydWN0IFRlc3RTeXN0ZW1DYWxsYmFjayA6IHB1YmxpYyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpTeXN0ZW1DYWxsYmFja0ludGVyZmFjZSB7CisgICAgVGVzdFN5c3RlbUNhbGxiYWNrKCkgOiBtTGFzdEV2ZW50KHtFdmVudFR5cGU6OklOVkFMSUQsIDB9KSwgbUV2ZW50Q291bnQoMCkge30KKworICAgIGVudW0gRXZlbnRUeXBlIHsKKyAgICAgICAgSU5WQUxJRCA9IC0xLAorICAgICAgICBWSURFT19PTiA9IDAsCisgICAgICAgIFZJREVPX09GRiA9IDEsCisgICAgICAgIFZJREVPX1JFU0VUID0gMiwKKyAgICAgICAgQ1BVU0VUX0VOQUJMRSA9IDMsCisgICAgICAgIENQVVNFVF9ESVNBQkxFID0gNCwKKyAgICB9OworCisgICAgc3RydWN0IEV2ZW50RW50cnkgeworICAgICAgICBFdmVudFR5cGUgdHlwZTsKKyAgICAgICAgaW50IGFyZzsKKyAgICB9OworCisgICAgdmlydHVhbCB2b2lkIG5vdGVTdGFydFZpZGVvKGludCB1aWQpIG92ZXJyaWRlIHsKKyAgICAgICAgbUxhc3RFdmVudCA9IHtFdmVudFR5cGU6OlZJREVPX09OLCB1aWR9OworICAgICAgICArK21FdmVudENvdW50OworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBub3RlU3RvcFZpZGVvKGludCB1aWQpIG92ZXJyaWRlIHsKKyAgICAgICAgbUxhc3RFdmVudCA9IHtFdmVudFR5cGU6OlZJREVPX09GRiwgdWlkfTsKKyAgICAgICAgKyttRXZlbnRDb3VudDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgbm90ZVJlc2V0VmlkZW8oKSBvdmVycmlkZSB7CisgICAgICAgIG1MYXN0RXZlbnQgPSB7RXZlbnRUeXBlOjpWSURFT19SRVNFVCwgMH07CisgICAgICAgICsrbUV2ZW50Q291bnQ7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHJlcXVlc3RDcHVzZXRCb29zdChib29sIGVuYWJsZSkgb3ZlcnJpZGUgeworICAgICAgICBtTGFzdEV2ZW50ID0ge2VuYWJsZSA/IEV2ZW50VHlwZTo6Q1BVU0VUX0VOQUJMRSA6IEV2ZW50VHlwZTo6Q1BVU0VUX0RJU0FCTEUsIDB9OworICAgICAgICArK21FdmVudENvdW50OworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBzaXplX3QgZXZlbnRDb3VudCgpIHsgcmV0dXJuIG1FdmVudENvdW50OyB9CisgICAgRXZlbnRUeXBlIGxhc3RFdmVudFR5cGUoKSB7IHJldHVybiBtTGFzdEV2ZW50LnR5cGU7IH0KKyAgICBFdmVudEVudHJ5IGxhc3RFdmVudCgpIHsgcmV0dXJuIG1MYXN0RXZlbnQ7IH0KKworICAgcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflRlc3RTeXN0ZW1DYWxsYmFjaygpIHt9CisKKyAgIHByaXZhdGU6CisgICAgRXZlbnRFbnRyeSBtTGFzdEV2ZW50OworICAgIHNpemVfdCBtRXZlbnRDb3VudDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRlc3RTeXN0ZW1DYWxsYmFjayk7Cit9OworCitzdHJ1Y3QgVGVzdENsaWVudCA6IHB1YmxpYyBCblJlc291cmNlTWFuYWdlckNsaWVudCB7CisgICAgVGVzdENsaWVudChpbnQgcGlkLCBjb25zdCBzaGFyZWRfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+JiBzZXJ2aWNlKQorICAgICAgICA6IG1SZWNsYWltZWQoZmFsc2UpLCBtUGlkKHBpZCksIG1TZXJ2aWNlKHNlcnZpY2UpIHt9CisKKyAgICBTdGF0dXMgcmVjbGFpbVJlc291cmNlKGJvb2wqIGFpZGxSZXR1cm4pIG92ZXJyaWRlIHsKKyAgICAgICAgbVNlcnZpY2UtPnJlbW92ZUNsaWVudChtUGlkLCBnZXRJZChyZWY8VGVzdENsaWVudD4oKSkpOworICAgICAgICBtUmVjbGFpbWVkID0gdHJ1ZTsKKyAgICAgICAgKmFpZGxSZXR1cm4gPSB0cnVlOworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIFN0YXR1cyBnZXROYW1lKHN0cmluZyogYWlkbFJldHVybikgb3ZlcnJpZGUgeworICAgICAgICAqYWlkbFJldHVybiA9ICJ0ZXN0X2NsaWVudCI7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgdmlydHVhbCB+VGVzdENsaWVudCgpIHt9CisKKyAgIHByaXZhdGU6CisgICAgYm9vbCBtUmVjbGFpbWVkOworICAgIGludCBtUGlkOworICAgIHNoYXJlZF9wdHI8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gbVNlcnZpY2U7CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGVzdENsaWVudCk7Cit9OworCitjbGFzcyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlRnV6emVyIHsKKyAgIHB1YmxpYzoKKyAgICBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlRnV6emVyKCkgPSBkZWZhdWx0OworICAgIH5SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlRnV6emVyKCkgeworICAgICAgICBtU2VydmljZSA9IG51bGxwdHI7CisgICAgICAgIGRlbGV0ZSBtRnV6emVkRGF0YVByb3ZpZGVyOworICAgIH0KKyAgICB2b2lkIHByb2Nlc3MoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpOworCisgICBwcml2YXRlOgorICAgIHZvaWQgc2V0Q29uZmlnKCk7CisgICAgdm9pZCBzZXRSZXNvdXJjZXMoKTsKKyAgICB2b2lkIHNldFNlcnZpY2VMb2coKTsKKworICAgIHN0YXRpYyB2b2lkKiBhZGRSZXNvdXJjZSh2b2lkKiBhcmcpIHsKKyAgICAgICAgcmVzb3VyY2VUaHJlYWRBcmdzKiB0QXJncyA9IChyZXNvdXJjZVRocmVhZEFyZ3MqKWFyZzsKKyAgICAgICAgaWYgKHRBcmdzKSB7CisgICAgICAgICAgICAodEFyZ3MtPnNlcnZpY2UpCisgICAgICAgICAgICAgICAgLT5hZGRSZXNvdXJjZSh0QXJncy0+cGlkLCB0QXJncy0+dWlkLCB0QXJncy0+dGVzdENsaWVudElkLCB0QXJncy0+dGVzdENsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBcmdzLT5tZWRpYVJlc291cmNlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCogcmVtb3ZlUmVzb3VyY2Uodm9pZCogYXJnKSB7CisgICAgICAgIHJlc291cmNlVGhyZWFkQXJncyogdEFyZ3MgPSAocmVzb3VyY2VUaHJlYWRBcmdzKilhcmc7CisgICAgICAgIGlmICh0QXJncykgeworICAgICAgICAgICAgYm9vbCByZXN1bHQ7CisgICAgICAgICAgICAodEFyZ3MtPnNlcnZpY2UpLT5tYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwodEFyZ3MtPnBpZCwgdEFyZ3MtPnRlc3RDbGllbnRJZCk7CisgICAgICAgICAgICAodEFyZ3MtPnNlcnZpY2UpLT5yZW1vdmVSZXNvdXJjZSh0QXJncy0+cGlkLCB0QXJncy0+dGVzdENsaWVudElkLCB0QXJncy0+bWVkaWFSZXNvdXJjZSk7CisgICAgICAgICAgICAodEFyZ3MtPnNlcnZpY2UpLT5yZWNsYWltUmVzb3VyY2UodEFyZ3MtPnBpZCwgdEFyZ3MtPm1lZGlhUmVzb3VyY2UsICZyZXN1bHQpOworICAgICAgICAgICAgKHRBcmdzLT5zZXJ2aWNlKS0+cmVtb3ZlQ2xpZW50KHRBcmdzLT5waWQsIHRBcmdzLT50ZXN0Q2xpZW50SWQpOworICAgICAgICAgICAgKHRBcmdzLT5zZXJ2aWNlKS0+b3ZlcnJpZGVQaWQodEFyZ3MtPnBpZCwgdEFyZ3MtPnBpZCAtIDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHNoYXJlZF9wdHI8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gbVNlcnZpY2UgPQorICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPihuZXcgVGVzdFByb2Nlc3NJbmZvKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUZXN0U3lzdGVtQ2FsbGJhY2soKSk7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyKiBtRnV6emVkRGF0YVByb3ZpZGVyID0gbnVsbHB0cjsKK307CisKK3ZvaWQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZUZ1enplcjo6cHJvY2Vzcyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIG1GdXp6ZWREYXRhUHJvdmlkZXIgPSBuZXcgRnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOworICAgIHNldENvbmZpZygpOworICAgIHNldFJlc291cmNlcygpOworICAgIHNldFNlcnZpY2VMb2coKTsKK30KKwordm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlRnV6emVyOjpzZXRDb25maWcoKSB7CisgICAgYm9vbCBwb2xpY3lUeXBlSW5kZXggPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpOworICAgIHN0cmluZyBwb2xpY3lWYWx1ZSA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heFN0cmluZ0xlbmd0aCk7CisgICAgaWYgKG1TZXJ2aWNlKSB7CisgICAgICAgIHZlY3RvcjxNZWRpYVJlc291cmNlUG9saWN5UGFyY2VsPiBwb2xpY2llczsKKyAgICAgICAgcG9saWNpZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2VQb2xpY3koa1BvbGljeVR5cGVbcG9saWN5VHlwZUluZGV4XSwgcG9saWN5VmFsdWUpKTsKKyAgICAgICAgbVNlcnZpY2UtPmNvbmZpZyhwb2xpY2llcyk7CisgICAgfQorfQorCit2b2lkIFJlc291cmNlTWFuYWdlclNlcnZpY2VGdXp6ZXI6OnNldFJlc291cmNlcygpIHsKKyAgICBpZiAoIW1TZXJ2aWNlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2l6ZV90IG51bVRocmVhZFBhaXJzID0KKyAgICAgICAgbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KGtNaW5UaHJlYWRQYWlycywga01heFRocmVhZFBhaXJzKTsKKyAgICAvLyBNYWtlIGV2ZW4gbnVtYmVyIG9mIHRocmVhZHMKKyAgICBzaXplX3QgbnVtVGhyZWFkcyA9IG51bVRocmVhZFBhaXJzICogMjsKKyAgICByZXNvdXJjZVRocmVhZEFyZ3MgdGhyZWFkQXJnczsKKyAgICB2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gbWVkaWFSZXNvdXJjZTsKKyAgICBwdGhyZWFkX3QgcHRbbnVtVGhyZWFkc107CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG51bVRocmVhZHMgLSAxOyBpICs9IDIpIHsKKyAgICAgICAgdGhyZWFkQXJncy5waWQgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICAgICAgdGhyZWFkQXJncy51aWQgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICAgICAgaW50MzJfdCBtZWRpYVJlc291cmNlVHlwZSA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50MzJfdD4oCisgICAgICAgICAgICBrTWluUmVzb3VyY2VUeXBlLCBrTWF4UmVzb3VyY2VUeXBlKTsKKyAgICAgICAgaW50MzJfdCBtZWRpYVJlc291cmNlU3ViVHlwZSA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50MzJfdD4oCisgICAgICAgICAgICBrTWluUmVzb3VyY2VUeXBlLCBrTWF4UmVzb3VyY2VUeXBlKTsKKyAgICAgICAgdWludDY0X3QgbWVkaWFSZXNvdXJjZVZhbHVlID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPHVpbnQ2NF90PigpOworICAgICAgICB0aHJlYWRBcmdzLnNlcnZpY2UgPSBtU2VydmljZTsKKyAgICAgICAgc2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiB0ZXN0Q2xpZW50ID0KKyAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnQ+KHRocmVhZEFyZ3MucGlkLCBtU2VydmljZSk7CisgICAgICAgIHRocmVhZEFyZ3MudGVzdENsaWVudCA9IHRlc3RDbGllbnQ7CisgICAgICAgIHRocmVhZEFyZ3MudGVzdENsaWVudElkID0gZ2V0SWQodGVzdENsaWVudCk7CisgICAgICAgIG1lZGlhUmVzb3VyY2UucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2Uoc3RhdGljX2Nhc3Q8TWVkUmVzVHlwZT4obWVkaWFSZXNvdXJjZVR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE1lZFJlc1N1YlR5cGU+KG1lZGlhUmVzb3VyY2VTdWJUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVJlc291cmNlVmFsdWUpKTsKKyAgICAgICAgdGhyZWFkQXJncy5tZWRpYVJlc291cmNlID0gbWVkaWFSZXNvdXJjZTsKKyAgICAgICAgcHRocmVhZF9jcmVhdGUoJnB0W2ldLCBudWxscHRyLCBhZGRSZXNvdXJjZSwgJnRocmVhZEFyZ3MpOworICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmcHRbaSArIDFdLCBudWxscHRyLCByZW1vdmVSZXNvdXJjZSwgJnRocmVhZEFyZ3MpOworICAgICAgICBtZWRpYVJlc291cmNlLmNsZWFyKCk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG51bVRocmVhZHM7ICsraSkgeworICAgICAgICBwdGhyZWFkX2pvaW4ocHRbaV0sIG51bGxwdHIpOworICAgIH0KKworICAgIC8vIE5vIHJlc291cmNlIHdhcyBhZGRlZCB3aXRoIHBpZCA9IDAKKyAgICBpbnQzMl90IHBpZFplcm8gPSAwOworICAgIHNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gdGVzdENsaWVudCA9CisgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnQ+KHBpZFplcm8sIG1TZXJ2aWNlKTsKKyAgICBpbnQzMl90IG1lZGlhUmVzb3VyY2VUeXBlID0KKyAgICAgICAgbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PihrTWluUmVzb3VyY2VUeXBlLCBrTWF4UmVzb3VyY2VUeXBlKTsKKyAgICBpbnQzMl90IG1lZGlhUmVzb3VyY2VTdWJUeXBlID0KKyAgICAgICAgbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PihrTWluUmVzb3VyY2VUeXBlLCBrTWF4UmVzb3VyY2VUeXBlKTsKKyAgICB1aW50NjRfdCBtZWRpYVJlc291cmNlVmFsdWUgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8dWludDY0X3Q+KCk7CisgICAgbWVkaWFSZXNvdXJjZS5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShzdGF0aWNfY2FzdDxNZWRSZXNUeXBlPihtZWRpYVJlc291cmNlVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxNZWRSZXNTdWJUeXBlPihtZWRpYVJlc291cmNlU3ViVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVJlc291cmNlVmFsdWUpKTsKKyAgICBib29sIHJlc3VsdDsKKyAgICBtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKHBpZFplcm8sIG1lZGlhUmVzb3VyY2UsICZyZXN1bHQpOworICAgIG1TZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShwaWRaZXJvLCBnZXRJZCh0ZXN0Q2xpZW50KSwgbWVkaWFSZXNvdXJjZSk7CisgICAgbVNlcnZpY2UtPnJlbW92ZUNsaWVudChwaWRaZXJvLCBnZXRJZCh0ZXN0Q2xpZW50KSk7CisgICAgbWVkaWFSZXNvdXJjZS5jbGVhcigpOworfQorCit2b2lkIFJlc291cmNlTWFuYWdlclNlcnZpY2VGdXp6ZXI6OnNldFNlcnZpY2VMb2coKSB7CisgICAgc2l6ZV90IG1heE51bSA9CisgICAgICAgIG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50MzJfdD4oa01pblNlcnZpY2VMb2csIGtNYXhTZXJ2aWNlTG9nKTsKKyAgICBzcDxTZXJ2aWNlTG9nPiBzZXJ2aWNlTG9nID0gbmV3IFNlcnZpY2VMb2cobWF4TnVtKTsKKyAgICBpZiAoc2VydmljZUxvZykgeworICAgICAgICBzZXJ2aWNlTG9nLT5hZGQoU3RyaW5nOCgibG9nIikpOworICAgICAgICBzZXJ2aWNlTG9nLT50b1N0cmluZygpOworICAgIH0KK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplIDwgMSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgUmVzb3VyY2VNYW5hZ2VyU2VydmljZUZ1enplciogcm1GdXp6ZXIgPSBuZXcgUmVzb3VyY2VNYW5hZ2VyU2VydmljZUZ1enplcigpOworICAgIGlmICghcm1GdXp6ZXIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJtRnV6emVyLT5wcm9jZXNzKGRhdGEsIHNpemUpOworICAgIGRlbGV0ZSBybUZ1enplcjsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvQW5kcm9pZC5icAppbmRleCBiNmM1NDhjLi4wYzViOGEyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9BbmRyb2lkLmJwCkBAIC0xLDE0ICsxLDIzIEBACiAvLyBCdWlsZCB0aGUgdW5pdCB0ZXN0cy4KK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogIlJlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdCIsCiAgICAgc3JjczogWyJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QuY3BwIl0sCiAgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisgICAgc3RhdGljX2xpYnM6IFsibGlicmVzb3VyY2VtYW5hZ2Vyc2VydmljZSJdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliYmluZGVyX25kayIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWEiLAotICAgICAgICAibGlicmVzb3VyY2VtYW5hZ2Vyc2VydmljZSIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKICAgICBpbmNsdWRlX2RpcnM6IFsKQEAgLTE5LDE3ICsyOCwxNiBAQAogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV2FsbCIsCiAgICAgXSwKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQogCiBjY190ZXN0IHsKICAgICBuYW1lOiAiU2VydmljZUxvZ190ZXN0IiwKICAgICBzcmNzOiBbIlNlcnZpY2VMb2dfdGVzdC5jcHAiXSwKICAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKKyAgICBzdGF0aWNfbGliczogWyJsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYSIsCi0gICAgICAgICJsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogICAgIGluY2x1ZGVfZGlyczogWwpAQCAtNDAsNSArNDgsNCBAQAogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV2FsbCIsCiAgICAgXSwKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QuY3BwIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QuY3BwCmluZGV4IGE2ZWNjMDkuLjNhNDVkY2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0LmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdC5jcHAKQEAgLTI3LDE0ICsyNyw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mb0ludGVyZmFjZS5oPgogCi1uYW1lc3BhY2UgYWlkbCB7Ci1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbWVkaWEgewotYm9vbCBvcGVyYXRvcj09IChjb25zdCBNZWRpYVJlc291cmNlUGFyY2VsJiBsaHMsIGNvbnN0IE1lZGlhUmVzb3VyY2VQYXJjZWwmIHJocykgewotICAgIHJldHVybiBsaHMudHlwZSA9PSByaHMudHlwZSAmJiBsaHMuc3ViVHlwZSA9PSByaHMuc3ViVHlwZSAmJgotICAgICAgICAgICAgbGhzLmlkID09IHJocy5pZCAmJiBsaHMudmFsdWUgPT0gcmhzLnZhbHVlOwotfX19fQotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHVzaW5nIFN0YXR1cyA9IDo6bmRrOjpTY29wZWRBU3RhdHVzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwCmluZGV4IDE3MzQ3YTkuLmE4OTUwNzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL0FuZHJvaWQuYnAKQEAgLTEsNCArMSwyMyBAQAogLy8gc2VydmljZSBsaWJyYXJ5CitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfc2VydmljZXNfbWVkaWF0cmFuc2NvZGluZ19saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9zZXJ2aWNlc19tZWRpYXRyYW5zY29kaW5nX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlibWVkaWF0cmFuc2NvZGluZ3NlcnZpY2UiLAogCkBAIC00NCwxOCArNjMsNiBAQAogICAgICAgICAibWVkaWF0cmFuc2NvZGluZ19haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAogICAgIF0sCiAKLSAgICB0YXJnZXQ6IHsKLSAgICAgICAgYW5kcm9pZDogewotICAgICAgICAgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKLSAgICAgICAgICAgICAgICBtYWxsb2Nfbm90X3N2ZWx0ZTogewotICAgICAgICAgICAgICAgICAgICAvLyBTY3VkbyBpbmNyZWFzZXMgbWVtb3J5IGZvb3RwcmludCwgc28gb25seSBlbmFibGUgb24KLSAgICAgICAgICAgICAgICAgICAgLy8gbm9uLXN2ZWx0ZSBkZXZpY2VzLgotICAgICAgICAgICAgICAgICAgICBzaGFyZWRfbGliczogWyJsaWJjX3NjdWRvIl0sCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIH0sCi0gICAgICAgIH0sCi0gICAgfSwKLQogICAgIGluaXRfcmM6IFsibWVkaWF0cmFuc2NvZGluZy5yYyJdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggZTBlMDQwYy4uYTg1NmMwNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDE2IEBACiAvLyBCdWlsZCB0aGUgdW5pdCB0ZXN0cyBmb3IgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UKIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfc2VydmljZXNfbWVkaWF0cmFuc2NvZGluZ19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfc2VydmljZXNfbWVkaWF0cmFuc2NvZGluZ19saWNlbnNlIiwKKyAgICBdLAorfQorCiBjY19kZWZhdWx0cyB7CiAgICAgbmFtZTogIm1lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3Rlc3RfZGVmYXVsdHMiLAogCkBAIC0xNCw2ICsyNSw3IEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhY3Rpdml0eW1hbmFnZXJfYWlkbCIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliYmluZGVyX25kayIsCiAgICAgICAgICJsaWJsb2ciLApAQCAtMzIsNCArNDQsNCBAQAogICAgIGRlZmF1bHRzOiBbIm1lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3Rlc3RfZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsibWVkaWF0cmFuc2NvZGluZ3NlcnZpY2VfdGVzdHMuY3BwIl0sCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWluaWphaWwvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21pbmlqYWlsL0FuZHJvaWQuYnAKaW5kZXggYjA1Nzk2OC4uM2E4OWUxMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWluaWphaWwvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9taW5pamFpbC9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogbWluaWphaWxfY29tbW9uX2NmbGFncyA9IFsKICAgICAiLVdhbGwiLAogICAgICItV2Vycm9yIiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwCmluZGV4IGNlZWZlOTMuLmIxMzliZTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcApAQCAtMTgyLDExICsxODIsMTIgQEAKICAgICAgICAgICAgIDogQVVESU9fU09VUkNFX0RFRkFVTFQ7CiAgICAgYXVkaW9fZmxhZ3NfbWFza190IGZsYWdzOwogICAgIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpIHsKLSAgICAgICAgZmxhZ3MgPSBBVURJT19GTEFHX0xPV19MQVRFTkNZCi0gICAgICAgICAgICB8IEFBdWRpb0NvbnZlcnRfYWxsb3dDYXB0dXJlUG9saWN5VG9BdWRpb0ZsYWdzTWFzayhwYXJhbXMtPmdldEFsbG93ZWRDYXB0dXJlUG9saWN5KCkpOworICAgICAgICBmbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX2ZsYWdzX21hc2tfdD4oQVVESU9fRkxBR19MT1dfTEFURU5DWQorICAgICAgICAgICAgICAgIHwgQUF1ZGlvQ29udmVydF9hbGxvd0NhcHR1cmVQb2xpY3lUb0F1ZGlvRmxhZ3NNYXNrKAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZmxhZ3MgPSBBVURJT19GTEFHX0xPV19MQVRFTkNZCi0gICAgICAgICAgICB8IEFBdWRpb0NvbnZlcnRfcHJpdmFjeVNlbnNpdGl2ZVRvQXVkaW9GbGFnc01hc2socGFyYW1zLT5pc1ByaXZhY3lTZW5zaXRpdmUoKSk7CisgICAgICAgIGZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PihBVURJT19GTEFHX0xPV19MQVRFTkNZCisgICAgICAgICAgICAgICAgfCBBQXVkaW9Db252ZXJ0X3ByaXZhY3lTZW5zaXRpdmVUb0F1ZGlvRmxhZ3NNYXNrKHBhcmFtcy0+aXNQcml2YWN5U2Vuc2l0aXZlKCkpKTsKICAgICB9CiAgICAgcmV0dXJuIHsKICAgICAgICAgICAgIC5jb250ZW50X3R5cGUgPSBjb250ZW50VHlwZSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAKaW5kZXggMDFiMWMyZS4uZjJjZjAxNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgIH0KICAgICBpbnQzMl90IGNhcGFjaXR5SW5GcmFtZXMgPSBudW1CdXJzdHMgKiBmcmFtZXNQZXJCdXJzdDsKIAotICAgIC8vIEZpbmFsIHNhbml0eSBjaGVjay4KKyAgICAvLyBGaW5hbCByYW5nZSBjaGVjay4KICAgICBpZiAoY2FwYWNpdHlJbkZyYW1lcyA+IE1BWF9GUkFNRVNfUEVSX0JVRkZFUikgewogICAgICAgICBBTE9HRSgiY2FsY3VsYXRlQnVmZmVyQ2FwYWNpdHkoKSBjYWxjIGNhcGFjaXR5ICVkID4gbWF4ICVkIiwKICAgICAgICAgICAgICAgY2FwYWNpdHlJbkZyYW1lcywgTUFYX0ZSQU1FU19QRVJfQlVGRkVSKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLmJwCmluZGV4IDhiMWUyYzAuLmM0MGE3OWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5icApAQCAtMTIsNyArMTIsMTYgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2xpYnJhcnkgewogCiAgICAgbmFtZTogImxpYmFhdWRpb3NlcnZpY2UiLAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRNZW1vcnlQcm94eS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRNZW1vcnlQcm94eS5jcHAKaW5kZXggYzQzZWQyMi4uNzhkNDg4NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkTWVtb3J5UHJveHkuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZE1lbW9yeVByb3h5LmNwcApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KICNpbmNsdWRlICJTaGFyZWRNZW1vcnlQcm94eS5oIgo=